home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / elmark / cupl / manual / sb1-a.txt < prev    next >
Text File  |  1992-01-20  |  82KB  |  2,220 lines

  1. o    .C3.FEEDBACK EXTENSIONS USAGE
  2.  
  3.     Certain devices can program the feedback path.  For example, the
  4.     EP300 contains a multiplexer for each output that allows the
  5.     feedback path to be selected as internal, registered, or pin
  6.     feedback.
  7.  
  8.     Figure 1-7 shows the EP300 programmable feedback capability.
  9.  
  10.                     [Picture]
  11.      Figure 1-7.  Programmable Feedback
  12.  
  13.     CUPL automatically chooses a default feedback path according to the
  14.     usage of the output. For example, if the output is used as a
  15.     registered output, then the default feedback path will be
  16.     registered, as in Figure 1-6.  This default can be overridden by
  17.     adding an extension to the feedback variables.  For example, by
  18.     adding the .IO extension to the feedback variables of a registered
  19.     output, CUPL will select the pin feedback path.
  20.  
  21.     Figure 1-8 shows a registered output with
  22.     pin feedback.
  23.  
  24.                     [Picture]
  25.      Figure 1-8. Programmable Pin (I/O) Feedback
  26.  
  27.     Figure 1-9 shows a combinatorial output with
  28.     registered feedback.
  29.  
  30.                     [Picture]
  31.      Figure 1-9. Programmable Registered Feedback
  32.  
  33.     Figure 1-10 shows a combinatorial output with internal feedback.
  34.  
  35.                     [Picture]
  36.      Figure 1-10. Programmable Internal Feedback
  37.  
  38.  
  39. o   .C3.MULTIPLEXER EXTENSION USAGE
  40.  
  41.     Certain devices allow selection between programmable and common
  42.     control functions.  For example, for each output, the P29MA16
  43.     contains multiplexers for selecting between common and product term
  44.     clocks and output enables.
  45.  
  46.     Figure 1-11 shows the P29MA16 programmable clock and output enable
  47.     capability.
  48.  
  49.         [Picture]
  50.      Figure 1-11. Output with Output Enable and Clock Multiplexers
  51.  
  52.  
  53.     If expressions are written for the .OE and .CK extensions, the
  54.     multiplexer outputs are selected as product term output enable and
  55.     clock, respectively. Otherwise, if expressions are written for the
  56.     .OEMUX and .CKMUX extensions, the multiplexer outputs are selected
  57.     as common output enable and clock, respectively.
  58.  
  59.     Expressions written for the .OEMUX and .CKMUX extensions can have
  60.     only one variable and be operated on only by the negation operator,
  61.     !. This is because their inputs are not from the fuse array, but
  62.     from a common source, such as a clock pin.  This is in contrast with
  63.     expressions written for the .OE and .CK extensions, which take their
  64.     inputs from the fuse array.
  65.  
  66.     Figure 1-12 shows a registered output with the output enable
  67.     multiplexer output selected as Vcc, output enable always enabled,
  68.     and the clock multiplexer output selected as the common clock pin
  69.     inverted, negative-edge clock.
  70.  
  71.                     [Picture]
  72.      Figure 1-12. Output with Output Enable and Clock Multiplexers
  73.      Selected
  74.  
  75.     Expressions for the .OE and .OEMUX extensions are mutually
  76.     exclusive; that is, only one may be written for each output.
  77.     Likewise, expressions for the .CK and .CKMUX extensions are mutually
  78.     exclusive.
  79.  
  80. O   .C3.EXTENSION USAGE
  81.     This section contains diagrams and explanations for all the variable
  82.     extensions.
  83.  
  84.                     [Picture]
  85.      Figure 1-13. .AP Extension
  86.  
  87.     The .AP extension is used to set the Asynchronous Preset of a
  88.     register to an expression. For example, the equation "Y.AP = A & B;"
  89.     causes the register to be asynchronously preset when A and B are
  90.     logically true.
  91.  
  92.         [Picture]
  93.      Figure 1-14. .APMUX Extension
  94.  
  95.     Some devices have a multiplexer that enables the Asynchronous Preset
  96.     to be connected to one of a set of pins. The .APMUX extension is
  97.     used to connect the Asynchronous Preset directly to one of the pins.
  98.  
  99.                     [Picture]
  100.      Figure 1-15. .AR Extension
  101.  
  102.     The .AR extension is used to define the expression for Asynchronous
  103.     Reset for a register.  This is used in devices that have one or more
  104.     product terms connected to the Asynchronous Reset of the register.
  105.  
  106.                     [Picture]
  107.      Figure 1-16. .ARMUX Extension
  108.  
  109.     In devices that have a multiplexer for connecting the Asynchronous
  110.     Reset of a register directly to one or more pins, the .ARMUX
  111.     extension is used to make the connection.  It is possible that a
  112.     device may have the capability to have Asynchronous Reset connected
  113.     either to a pin or to a product term. In this case, the .AR
  114.     extension is used to select the product term connection, whereas,
  115.     the .ARMUX extension is used to connect the pin.
  116.  
  117.                     [Picture]
  118.      Figure 1-17. .CA Extension
  119.  
  120.     The .CA extension is used in a few special cases where devices have
  121.     complementa array nodes.  Devices that have this capability are the
  122.     F501 and F502.(See Appendix B)
  123.  
  124.                     [Picture]
  125.      Figure 1-18. .CE Extension
  126.  
  127.     The .CE extension is used for D-CE registers.  It serves to specify 
  128.     the input to the CE of the register. In devices that have D-CE 
  129.     registers, and the CE terms are not used, they must be set to binary 
  130.     1 so that the registers behave the same as D registers.  Failure to 
  131.     enable the CE terms will result in D registers that never change 
  132.     state.
  133.  
  134.                     [Picture]
  135.      Figure 1-19. .CK Extension.i.Extensions:CK ;
  136.  
  137.     The .CK extension is used to select a product term driven clock.
  138.     Some devices have the capability to connect the clock for a register
  139.     to one or more pins or to a product term.  The .CK extension will
  140.     select the product term. To connect the clock to a pin directly, use
  141.     the .CKMUX extension.
  142.  
  143.                     [Picture]
  144.      Figure 1-20. .CKMUX Extension.i.Extensions:CK MUX;
  145.  
  146.     The .CKMUX extension is used to connect the clock input of a
  147.     register to one of a set of pins. This is needed because some
  148.     devices have a multiplexer for connecting the clock to one of a set
  149.     of pins.  This does not mean that the clock may be connected to any
  150.     pin. Typically, the multiplexer will allow the clock to be connected
  151.     to one of two pins. Some devices have a multiplexer for connecting
  152.     to one of four pins.
  153.  
  154.                     [Picture]
  155.      Figure 1-21. .D Extension
  156.  
  157.  
  158.     The .D extension is used to specify the D input to a D register. The
  159.     use of the .D register actually causes the compiler to configure
  160.     programmable macrocells as D registers.  For outputs that have only
  161.     D registered output, the .D extension must be used. If the .D
  162.     extension is used for an output that does not have true D registers,
  163.     the compiler will generate an error.
  164.  
  165.                     [Picture]
  166.      Figure 1-22. .DFB Extension.i.Extensions:DF B;
  167.  
  168.     The .DFB extension is used in special cases where a programmable
  169.     output macrocell is configured as combinatorial but the D register
  170.     still remains connected to the output.  The .DFB extension provides
  171.     a means to use the feedback from the register.  Under normal
  172.     conditions, when an output is configured as registered, the feedback
  173.     from the register is selected by not specifying an extension.
  174.  
  175.                     [Picture]
  176.      Figure 1-23. .DQ Extension.i.Extensions:DQ ;
  177.  
  178.     The .DQ extension is used to specify an input D register. Use of the
  179.     .DQ extension actually configures the input as registered.  The .DQ
  180.     extension is not used to specify Q output from an output D register.
  181.  
  182.                     [Picture]
  183.      Figure 1-24. .IMUX Extension.i.Extensions:IM UX;
  184.  
  185.     The .IMUX extension is an advanced extension which is used to select
  186.     a feedback path.  This is used in devices that have pin feedback
  187.     from two I/O pins connected to a multiplexer. Only one of the pins
  188.     may use the feedback path.
  189.  
  190.                     [Picture]
  191.      Figure 1-25. .INT Extension.i.Extensions:IN T;
  192.  
  193.     The .INT extension is used for selecting an internal feedback path.
  194.     This could be used for combinatorial or registered output.  The .INT
  195.     extension provides combinatorial feedback.
  196.  
  197.                     [Picture]
  198.      Figure 1-26.  .IO Extension.i.Extensions:IO ;
  199.  
  200.     The .IO extension is used to select pin feedback when the macrocell
  201.     is configured as registered.
  202.  
  203.                     [Picture]
  204.      Figure 1-27.  .IOAP Extension.i.Extensions:IO AP;
  205.  
  206.     The .IOAP extension is used to specify the expression for
  207.     Asynchronous Preset in cases where there is registered pin feedback
  208.     from an output macrocell.
  209.  
  210.                     [Picture]
  211.      Figure 1-28. .IOAR Extension
  212.  
  213.     The .IOAR extension is used to specify the expression for 
  214.     Asynchronous Reset.in cases where there is registered pin feedback 
  215.     from an output macrocell.
  216.  
  217.                     [Picture]
  218.      Figure 1-29. .IOCK Extension
  219.  
  220.     The .IOCK extension is used to specify a clock expression for a 
  221.     registered pin feedback that is connected to an output macrocell.
  222.  
  223.                     [Picture]
  224.      Figure 1-30. .IOD Extension.i.Extensions:IO D;
  225.  
  226.     The .IOD extension is used to specify feedback from a register that 
  227.     is connected to an output macrocell by the pin feedback path.
  228.  
  229.                     [Picture]
  230.      Figure 1-31.  .IOL Extension.i.Extensions:IO L;
  231.  
  232.     The .IOL extension is used to specify feedback from a buried latch 
  233.     that is connected to an output macrocell by the pin feedback path.
  234.  
  235.                     [Picture]
  236.      Figure 1-32. .IOSP Extension.i.Extensions:IO SP;
  237.  
  238.     The .IOSP extension is used to specify the expression for 
  239.     Synchronous Preset in cases where there is registered pin feedback 
  240.     from an output macrocell.
  241.  
  242.                     [Picture]
  243.      Figure 1-33.  .IOSR Extension.i.Extensions:IO SR;
  244.  
  245.     The .IOSR extension is used to specify the expression for 
  246.     Synchronous Reset in cases where there is registered pin feedback 
  247.     from an output macrocell.
  248.  
  249.                     [Picture]
  250.      Figure 1-34. .J and .K Extension
  251.  
  252.     The .J and .K extensions are used to specify J and K input to a JK 
  253.     register.  The use of the .J and the .K extensions actually cause 
  254.     the compiler to configure the output as JK, if the macrocell is 
  255.     programmable.  Equations for both J and K must be specified. If one 
  256.     of the inputs is not used, it must be set to binary 0 to disable it.
  257.  
  258.                     [Picture]
  259.      Figure 1-35. .L Extension
  260.  
  261.  
  262.     The .L extension is used to specify input into a Latch. In devices 
  263.     with programmable macrocells, the use of the .L extension causes the 
  264.     compiler to configure the macrocell as a latched output.
  265.  
  266.                     [Picture]
  267.      Figure 1-36.  .LE Extension.i.Extensions:LE ;
  268.  
  269.     The .LE extension is used to specify the latch enable equation for a 
  270.     latch. The .LE extension causes a product term to be connected to 
  271.     the latch enable.
  272.  
  273.                     [Picture]
  274.      Figure 1-37.  .LEMUX Extension.i.Extensions:LE MUX;
  275.  
  276.     The .LEMUX extension is used to specify a pin connection for the 
  277.     latch enable.
  278.  
  279.                     [Picture]
  280.      Figure 1-38.  .LFB Extension.i.Extensions:LF B;
  281.  
  282.     The .LFB extension is used in special cases where a programmable 
  283.     output macrocell is configured as combinatorial but the latch still 
  284.     remains connected to the output.  The .LFB extension provides a 
  285.     means to use the feedback from the latch.  Under normal conditions, 
  286.     when an output is configured as latched, the feedback from the latch 
  287.     is selected by using no extension.
  288.  
  289.                     [Picture]
  290.      Figure 1-39.  .LQ Extension.i.Extensions:LQ ;
  291.  
  292.     The .LQ extension is used to specify an input latch. Use of the .LQ 
  293.     extension actually configures the input as latched.  The .LQ 
  294.     extension is not used to specify Q output from an output latch.
  295.  
  296.                     [Picture]
  297.      Figure 1-40. .OE Extension.i.Extensions:OE ;
  298.  
  299.     The .OE extension is used to specify a product term driven output 
  300.     enable signal.
  301.  
  302.                     [Picture]
  303.      Figure 1-41. .OEMUX Extension.i.Extensions:OE MUX;
  304.  
  305.     The .OEMUX extension is used to connect the output enable to one of 
  306.     a set of pins.  This is needed because some devices have a 
  307.     multiplexer for connecting the output enable to one of a set of 
  308.     pins. This does not mean that the output enable may be connected to 
  309.     any pin.  Typically, the multiplexer will allow the output enable to 
  310.     be connected to one of two pins. Some devices have a multiplexer for 
  311.     connecting to one of four pins.
  312.  
  313.                     [Picture]
  314.      Figure 1-42. .S and .R Extension
  315.  
  316.     The .S and .R extensions are used to specify S and R input to a SR 
  317.     register.  The use of the .S and the .R extensions actually cause 
  318.     the compiler to configure the output as SR, if the macrocell is 
  319.     programmable.  Equations for both S and R must be specified. If one 
  320.     of the inputs is not used, it must be set to binary 0 to disable it.
  321.  
  322.                     [Picture]
  323.      Figure 1-43. .SP Extension
  324.  
  325.     The .SP extension is used to set the Synchronous Preset of a 
  326.     register to an expression. For example, the equation "Y.SP = A & B;" 
  327.     causes the register to be synchronously preset when A and B are 
  328.     logically true.  
  329.     
  330.     [Picture] 
  331.     Figure 1-44. .SR Extension
  332.  
  333.     The .SR extension is used to define the expression for Synchronous 
  334.     Reset for a register. This is used in devices that have one or more 
  335.     product terms connected to the Synchronous Reset of the register.
  336.  
  337.                     [Picture]
  338.      Figure 1-45. .T Extension
  339.  
  340.     The .T extension specifies the T input for a T register. The use of 
  341.     the T extension itself causes the compiler to configure the 
  342.     macrocell as a T register. Special consideration should be given to 
  343.     devices with T registers and programmable polarity before the 
  344.     register.  Since T registers toggle when the incoming signal is 
  345.     true, the behavior will be changed when the polarity is changed 
  346.     since the incoming signal is now inverted before reaching the 
  347.     register. It is best to declare pins that will use T registers as 
  348.     active high always.
  349.  
  350.                     [Picture]
  351.      Figure 1-46. .TFB Extension
  352.  
  353.     The .TFB extension is used in special cases where a programmable 
  354.     output macrocell is configured as combinatorial but the T register 
  355.     still remains connected to the output.  The .TFB extension provides 
  356.     a means to use the feedback from the register.  Under normal 
  357.     conditions, when an output is configured as registered, the feedback 
  358.     from the register is selected by using no extension.
  359.  
  360. o    .c3.Boolean Logic Review
  361.     Table 1-12 lists the rules that the CUPL compiler uses for 
  362.     evaluating logic expressions. These basic rules are listed for 
  363.     reference purposes only.
  364.  
  365.     Table    1-12.     Logic      Evaluation Rules
  366.     --------------------------------------------------
  367.      Commutative Property:
  368.      A & B = B & A
  369.      A # B = B # A
  370.      Associative Property:
  371.      A & (B & C) = (A & B) & C
  372.      A # (B # C) = (A # B) # C
  373.      Distributive Property:
  374.      A & (B # C) = (A & B) # (A & C)
  375.      A # (B & C) = (A # B) & (A # C)
  376.      Absorptive Property:
  377.      A & (A # B) = A
  378.      A # (A & B) = A
  379.      DeMorgan's Theorem:
  380.      !(A & B & C) = !A # !B # !C
  381.      !(A # B # C) = !A & !B & !C
  382.      XOR Identity:
  383.      A $ B = (!A & B) # (A &  !B)
  384.      !(A $ B) = A $ !B = !A $  B = (!A & !B) # (A& B)
  385.      Theorems:
  386.      A & 0 = 0 A & 1 = A
  387.      A # 0 = A A # 1 = 1
  388.      A & A = A A & !A = 0
  389.      A # A = A A # !A = 1
  390.      --------------------------------------------------
  391.  
  392. O    .C3.EXPRESSIONS
  393.  
  394.     Expressions are combinations of variables and operators that produce 
  395.     a single result when evaluated. An expression may be composed of any 
  396.     number of sub-expressions.
  397.  
  398.     Expressions are evaluated according to the precedence of the 
  399.     particular operators involved. When operators with the same 
  400.     precedence appear in an expression, evaluation order is taken from 
  401.     left to right.  Parentheses may be used to change the order of 
  402.     evaluation; the expression within the innermost set of parentheses 
  403.     is evaluated first.
  404.  
  405.     In Table 1-13, note how
  406.     the order of evaluation
  407.     and use of parentheses
  408.     affect the value of the
  409.     expression.
  410.  
  411.     Table 1-13. Sample Expressions
  412.   -----------------------------------------------------------------                  
  413.   Expression    Result                  Comments
  414.   A # B & C       A # B & C
  415.  
  416.   (A # B) & C       A & C              Parentheses change order 
  417.                    # B & C
  418.  
  419.   !A & B           !A & B
  420.  
  421.   !(A & B)         !A # !B              DeMorgan's Theorem
  422.  
  423.   A # B & C # D     A # D # B & C
  424.   A # B & (C # D)   A # B & C # B & D   Parentheses change order 
  425.   -----------------------------------------------------------------                  
  426.  
  427. O    .C3.LOGIC    EQUATIONS
  428.  
  429.     Logic equations are the building blocks of the CUPL language. The 
  430.     form for logic equations is as follows:
  431.  
  432.         [!] var [.ext] = exp ;
  433.  
  434.     where
  435.  
  436.         var is a single variable or a list of indexed or non-indexed 
  437.         variables defined according to the rules for the list notation 
  438.         (see the subtopic, List Notation in this chapter). When a 
  439.         variable list is used, the expression is assigned to each 
  440.         variable in the list.
  441.  
  442.         .ext is an optional extension to assign a function to the major 
  443.         nodes inside a programmable device (see Table 1-11).
  444.  
  445.         exp is an expression; that is, a combination of variables and 
  446.         operators (see "Expressions" in this chapter).
  447.  
  448.         = is the assignment operator; it assigns the value of an 
  449.         expression to a variable or set of variables.
  450.  
  451.         ! is the complement operator.
  452.  
  453.     The complement operator can be used to express the logic equation in 
  454.     negative true logic.  The operator directly precedes the variable 
  455.     name (no spaces) and denotes that the expression on the right side 
  456.     is to be complemented before it is assigned to the variable name.  
  457.     Use of the complement operator on the left side is provided solely 
  458.     as a convenience.  The equation may just as easily be written by 
  459.     complementing the entire expression on the right side.
  460.  
  461.     Older logic design software that did not provide the automatic 
  462.     DeMorgan capability (output polarity assigned according to the pin 
  463.     variable declaration) required the use of the complement operator 
  464.     when using devices with inverting buffers.  Place logic equations in 
  465.     the "Logic Equation" section of the source file provided by the 
  466.     template file.
  467.  
  468.     Logic equations are not limited solely to pin (or node) variables, 
  469.     but may be written for any arbitrary variable name. A variable 
  470.     defined in this manner is an intermediate variable. An intermediate 
  471.     variable name can be used in other expressions to generate logic 
  472.     equations or additional intermediate variables. Writing logic 
  473.     equations in this "top down" manner yields a logic description file 
  474.     that is generally easier to read and comprehend.  Place intermediate 
  475.     variables in the "Declarations and Intermediate Variable 
  476.     Definitions" section of the source file.  The following are some 
  477.     examples of logic equations:
  478.  
  479.     SEL_0 = A15 & !A14;   /* A simple, decoded output pin */
  480.  
  481.     Q0.D = Q1 & Q2 & Q3;  /* Output pin w/ D  flip-flop    */
  482.     Q1.J = Q2 # Q3;       /* Output pin w/ JK flip-flop    */
  483.     Q1.K = Q2 & !Q3;
  484.     MREQ = READ # WRITE;  /* Intermediate Variable         */
  485.     SEL_1=MREQ & A15;     /* Output intermediate var       */
  486.     [D0..3]      =       'h'FF;    /* Data bits assigned to constant*/
  487.     [D0..3].oe     =      read;    /* Data bits assigned to variable*/
  488.  
  489.    .C4.APPEND STATEMENTS
  490.  
  491.     In standard logic equations, normally only one expression is 
  492.     assigned to a variable.  The APPEND statement enables multiple 
  493.     expressions to be assigned to a single variable. The format is as 
  494.     follows:
  495.  
  496.         APPEND [!]var[.ext] = expr ;
  497.  
  498.     where
  499.  
  500.         ! is the complement operator to optionally define the polarity 
  501.         of the variable.
  502.  
  503.         var is a single variable or a list of indexed or non-indexed 
  504.         variables in standard list format.
  505.  
  506.         .ext is an optional extension that defines the function of the 
  507.         variable.
  508.  
  509.         = is the assignment operator.  expr is a valid expression.
  510.  
  511.         ; is a semicolon to mark the end of the statement.
  512.  
  513.     The expression that results from multiple APPEND statements is the 
  514.     logical OR of all the APPEND statements. If an expression has not 
  515.     already been assigned to the variable, the first APPEND statement is 
  516.     treated as the first assignment.
  517.  
  518.     The following example shows several APPEND statements.
  519.  
  520.         APPEND Y = A0 & A1 ;
  521.         APPEND Y = B0 & B1 ;
  522.         APPEND Y = C0 & C1 ;
  523.  
  524.     The three statements above are equivalent to the following equation.
  525.  
  526.         Y = (A0 & A1) # (B0 & B1) # (C0 & C1) ;
  527.  
  528.     The APPEND statement is useful in adding additional terms (such as 
  529.     reset) to state-machine variables or constructing user-defined 
  530.     functions (see the subtopics, State Machine Syntax and User-Defined 
  531.     Functions in this chapter).
  532.  
  533. o    .c3.Set    Operations
  534.  
  535.     All operations that are performed on a single bit of information, 
  536.     for example, an input pin, a register, or an output pin, may be 
  537.     applied to multiple bits of information grouped into sets. Set 
  538.     operations can be performed between a set and a variable or 
  539.     expression, or between two sets.
  540.  
  541.     The result of an operation between a set and a single variable (or 
  542.     expression) is a new set in which the operation is performed between 
  543.     each element of the set and the variable (or expression). For 
  544.     example
  545.  
  546.         [D0, D1, D2, D3] & read
  547.  
  548.     evaluates to:
  549.  
  550.         [D0 & read, D1 & read, D2 & read, D3 & read]
  551.  
  552.     When an operation is performed on two sets, the sets must be the 
  553.     same size (that is, contain the same number of elements). The result 
  554.     of an operation between two sets is a new set in which the operation 
  555.     is performed between elements of each set.  For example
  556.  
  557.         [A0, A1, A2, A3] &
  558.         [B0, B1, B2, B3]
  559.  
  560.     evaluates to:
  561.  
  562.         [A0 & B0, A1 & B1, A2 & B2, A3 & B3]
  563.  
  564.     Bit field statements (see the subtopic, Bit Field Declaration 
  565.     Statements in this chapter) may be used to group variables into a 
  566.     set that can be referenced by a single variable name.  For example, 
  567.     group the two sets of variables in the above operation as follows:
  568.  
  569.         FIELD a_inputs = [A0, A1, A2 A3] ;
  570.         FIELD b_inputs = [B0, B1, B2, B3] ;
  571.  
  572.     Then perform a set operation between the two sets, for example, an 
  573.     AND operation, as follows:
  574.  
  575.         a_inputs & b_inputs
  576.  
  577.     When numbers are used in set operations, they are treated as sets of 
  578.     binary digits. A single octal number represents a set of three 
  579.     binary digits, and a single decimal or hexadecimal number represents 
  580.     a set of four binary digits. Table 1-14 lists the representation of 
  581.     numbers as sets.
  582.  
  583.         Table 1-14. Equivalent Binary Sets
  584.     ------------------------------------------------------------
  585.         Number        Binary Set
  586.         'O'X          [X, X, X]
  587.         'H'X          [X,X,X,X]
  588.         'O'0          [0, 0, 0]
  589.         'H'0          [0,0,0,0]
  590.         'O'1          [0, 0, 1]
  591.         'H'1          [0,0,0,1]
  592.         'O'2          [0, 1, 0]
  593.         'H'2          [0,0,1,0]
  594.         'O'3          [0, 1, 1]
  595.         'H'3          [0,0,1,1]
  596.         'O'4          [1, 0, 0]
  597.         'H'4          [0,1,0,0]
  598.         'O'5          [1, 0, 1]
  599.         'H'5          [0,1,0,1]
  600.         'O'6          [1, 1, 0]
  601.         'H'6          [0,1,1,0]
  602.         'O'7          [1, 1, 1]
  603.         'H'7          [0,1,1,1]
  604.         'D'0          [0,0,0,0]
  605.         'H'8          [1,0,0,0]
  606.         'D'1          [0,0,0,1]
  607.         'H'9          [1,0,0,1]
  608.         'D'2          [0,0,1,0]
  609.         'H'A          [1,0,1,0]
  610.         'D'3          [0,0,1,1]
  611.         'H'B          [1,0,1,1]
  612.         'D'4          [0,1,0,0]
  613.         'H'C          [1,1,0,0]
  614.         'D'5          [0,1,0,1]
  615.         'H'D          [1,1,0,1]
  616.         'D'6          [0,1,1,0]
  617.         'H'E          [1,1,1,0]
  618.         'D'7          [0,1,1,1]
  619.         'H'F          [1,1,1,1]
  620.         'D'8          [1,0,0,0]
  621.         'D'9          [1,0,0,1]
  622.     ------------------------------------------------------------
  623.  
  624.     Numbers may be effectively used as "bit masks" in logic equations 
  625.     using sets. An example of this application is the following 4-bit 
  626.     counter.
  627.  
  628.         field count = [Q3,        Q2, Q1, Q0];
  629.         count.d = 'b' 0001 & (!Q0)
  630.                 # 'b' 0010 & (Q1 $ Q0)
  631.                 # 'b' 0100 & (Q2 $ Q1 & Q0)
  632.                 # 'b' 1000 & (Q3 $ Q2 & Q1 & Q0);
  633.  
  634.     The equivalent logic equations written without set notation are as 
  635.     follows:
  636.  
  637.         Q0.d = !Q0;
  638.         Q1.d = Q1 $ Q0;
  639.         Q2.d = Q2 $ Q1 & Q0;
  640.         Q3.d = Q3 $ Q2 & Q1 & Q0;
  641.  
  642.    .c4.Equality Operations
  643.  
  644.     Unlike other set operations, the equality operation evaluates to a 
  645.     single Boolean expression.  It checks for bit equality between a set 
  646.     of variables and a constant.  The format for the equality operation 
  647.     is as follows:
  648.  
  649.     Format 1.    [var, var, ... var]:constant ;
  650.     Format 2.    bit_field_var:constant ;
  651.  
  652.     where
  653.  
  654.         [var, var, ... var] is a list of variables in shorthand 
  655.         notation.
  656.  
  657.         constant is a number (hexadecimal by default).
  658.  
  659.         bit_field_var is a variable defined using a bit field statement.
  660.  
  661.         : is the equality operator.
  662.  
  663.         ; is a semicolon used to mark the statement end.
  664.  
  665.    -------------------------------------------------------------
  666.    Note
  667.      Square brackets do not indicate optional items, but delimit 
  668.      variables in a list.  
  669.    --------------------------------------------------------------
  670.  
  671.     Format 1 is used between a list of variables and a constant value. 
  672.     Format 2 is used between a bit field variable and a constant value.
  673.  
  674.     The bit positions of the constant number are checked against the 
  675.     corresponding positions in the set. Where the bit position is a 
  676.     binary 1, the set element is unchanged. Where the bit position is a 
  677.     binary 0, the set element is negated. Where the bit position is a 
  678.     binary X, the set element is removed.  The resulting elements are 
  679.     then ANDed together to create a single expression. In the following 
  680.     example, hexadecimal D (binary 1101) is checked against A3, A2, A1, 
  681.     and A0.  
  682.  
  683.     select = [A3..0]:'h'D ;
  684.  
  685.     The set elements A3, A2, and A0 remain unchanged because the 
  686.     corresponding bit position is one or true. Set element A1 is negated 
  687.     because its corresponding bit position is zero or false.  Therefore, 
  688.     the above expression is equivalent to the following expression:
  689.  
  690.         select = A3 & A2 & !A1 & A0 ;
  691.  
  692.     In the following example,
  693.     binary 1X0X is checked
  694.     against A3, A2, A1, A0.
  695.  
  696.         select =        [A3..0]:'b'1X0X ;
  697.  
  698.     The set element A3 remains unchanged because the corresponding bit 
  699.     position is one or true.  Set element A1 is negated because its 
  700.     corresponding bit position is zero or false. Set elements A2 and A0 
  701.     are removed from the expression because the corresponding bit 
  702.     positions are "don't-cared." Therefore, the above expression is 
  703.     equivalent to the following equation:
  704.  
  705.         select = A3 & !A1 ;
  706.  
  707.     In addition to address decoding, the equality operator can be used 
  708.     to specify a counter or state machine.  For example, a 4-bit counter 
  709.     can be specified using the following notation:
  710.  
  711.         FIELD count = [Q0..3];
  712.         Q0.J = count:0 
  713.              # count:2 
  714.              # count:4 
  715.              # count:6
  716.              # count:8 
  717.              # count:A 
  718.              # count:C 
  719.              # count:E ;
  720.  
  721.         Q0.K = count:1 
  722.              # count:3
  723.              # count:5
  724.              # count:7
  725.              # count:9
  726.              # count:B
  727.              # count:D
  728.              # count:F ;
  729.  
  730.         Q1.J = count:1
  731.              # count:5
  732.              # count:9
  733.              # count:D ;
  734.  
  735.         Q1.K = count:3
  736.              # count:7
  737.              # count:B
  738.              # count:F ;
  739.  
  740.         Q2.J = count:3
  741.              # count:B ;
  742.  
  743.         Q2.K = count:7
  744.              # count:F ;
  745.  
  746.         Q3.J = count:7 ;
  747.  
  748.         Q3.K = count:F ;
  749.  
  750.     The equality operator can also be used with a set of variables that 
  751.     are to be operated upon identically.  The following syntax can be 
  752.     used as a time-saving convenience:
  753.  
  754.         [var, var, ... , var]:op
  755.  
  756.     which is equivalent to:
  757.  
  758.         var op var op ... var
  759.  
  760.     where
  761.  
  762.         op is the &, # or $ operator (or its equivalent if an alternate 
  763.         set of operators has been defined).
  764.  
  765.         var is any variable
  766.         name.
  767.  
  768.     For example, the following three expressions
  769.  
  770.         [A3,A2,A1,A0]:&
  771.         [B3,B2,B1,B0]:#
  772.         [C3,C2,C1,C0]:$
  773.  
  774.     are equivalent respectively to:
  775.  
  776.         A3 & A2 & A1 & A0
  777.         B3 # B2 # B1 # B0
  778.         C3 $ C2 $ C1 $ C0
  779.  
  780.     The equality operation can be used with an equivalent binary set to 
  781.     create a function table description of the output values.  For 
  782.     example, in the following Binary-to-BCD code converter, output 
  783.     values are assigned by using the equality operation to define the 
  784.     inputs, and equivalent binary sets to group the output.
  785.  
  786.         FIELD input = [in3..0] ;
  787.  
  788.         FIELD output = [out4..0] ; /*  in3..0 ->out4..0*/
  789.  
  790.     $DEFINE L 'b'0
  791.     $DEFINE H 'b'1
  792.     output =
  793.       input:0 & [L,L,L,L,L]
  794.     # input:1 & [L,L,L,L,H]
  795.     # input:2 & [L,L,L,H,L]
  796.     # input:3 & [L,L,L,H,H]
  797.     # input:4 & [L,L,H,L,L]
  798.     # input:5 & [L,L,H,L,H]
  799.     # input:6 & [L,L,H,H,L]
  800.     # input:7 & [L,L,H,H,H]
  801.     # input:8 & [L,H,L,L,L]
  802.     # input:9 & [L,H,L,L,H]
  803.     # input:A & [H,L,L,L,L]
  804.     # input:B & [H,L,L,L,H]
  805.     # input:C & [H,L,L,H,L]
  806.     # input:D & [H,L,L,H,H]
  807.     # input:E & [H,L,H,L,L]
  808.     # input:F & [H,L,H,L,H];
  809.     $UNDEF L
  810.     $UNDEF H
  811.  
  812.     Indexed Variables Bit Fields and Equality.  Indexed variables, field
  813.     statements and the range function operate with each other in tight 
  814.     union. This section will attempt to illustrate this relationship.
  815.  
  816.     As discussed earlier in this chapter, indexed variables can be used 
  817.     as an easy way to declare multiple variables with few actual lines 
  818.     of code.  For example
  819.  
  820.     Pin [2..4] = [AD0..2];
  821.  
  822.     expands to:
  823.  
  824.     Pin 2 = AD0;
  825.     Pin 3 = AD1;
  826.     Pin 4 = AD2;
  827.  
  828.     The FIELD statement is
  829.     used to group a set of
  830.     related signals into one
  831.     element.  It works by
  832.     using a 32 bit field
  833.     where each bit in the
  834.     field represents one of
  835.     the members of the field.
  836.     If there are less than 32
  837.     members then the extra
  838.     bits are ignored.  For
  839.     example:
  840.  
  841.     Pin 2 = VAR_A;
  842.     Pin 3 = VAR_B;
  843.     Pin 4 = VAR_C;
  844.     Pin 15 = ROM_SEL;
  845.     FIELD ADDR = [VAR_A,VAR_B,VAR_C];
  846.  
  847.     The following figure shows how the variables VAR_A, VAR_B and VAR_C 
  848.     map into the bit field.
  849.  
  850.                     [Picture]
  851.      Figure 1-47.Bit field mapping of member variables
  852.  
  853.     Now suppose that we had an output as follows:
  854.  
  855.         ROM_SEL = ADDR:3;
  856.  
  857.     The contents of the bit field for this equation
  858.     would be as follows:  
  859.  
  860.     "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX011"
  861.  
  862.     This would result in the following equations:
  863.  
  864.         ROM_SEL = !VAR_A & VAR_B & VAR_C;
  865.  
  866.     When using indexed variables, the internal representation changes 
  867.     slightly.  The index number of the variable determines its position 
  868.     in the bit field.  Therefore, VAR0 always resides in bit position 0 
  869.     regardless of the declaration of the field.  The two following 
  870.     declarations both have the identical internal representation.
  871.  
  872.       field ADDR = [VAR0, VAR1, VAR2];
  873.       field ADDR = [VAR2, VAR1, VAR0];
  874.  
  875.                     [Picture]
  876.      Figure 1-48. Bit field representation with indexed variables
  877.  
  878.     Now suppose that we had an output as follows:
  879.  
  880.         ROM_SEL = ADDR:3;
  881.  
  882.     The contents of the bit field for this equation would be as follows:
  883.  
  884.         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX011"
  885.  
  886.     This would result in the
  887.     following equations:
  888.  
  889.     ROM_SEL = !VAR2 & VAR1 & VAR0;
  890.  
  891.     If we take a set of variables that use a higher index we can see 
  892.     that the way indexed variables are handled may affect the output 
  893.     differently than we expect. If the variables used are VAR17, VAR18 
  894.     and VAR19 then the bit map changes accordingly. The equivalence with 
  895.     3 now does not work because 3 only maps into bits 0, 1 and 2. What 
  896.     needs to be done is to add zeroes to move the desired equivalence up 
  897.     to the desired range.
  898.  
  899.     Now suppose that we had an output as follows:
  900.  
  901.     FIELD ADDR = [VAR18, VAR17, VAR16];
  902.     ROM_SEL = ADDR:3;
  903.  
  904.     The variables would map into the bit field ADDR as follows:
  905.  
  906.                     [Picture]
  907.      Figure 1-49. Bit field representation with indexed variables not 
  908.      starting at 0
  909.  
  910.     If we attempt to apply an equivalence of three to this bit field, 
  911.     the bits will not match correctly.
  912.  
  913.     The following line shows how the constant three maps onto the bit 
  914.     field.
  915.  
  916.         "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX011"
  917.  
  918.     Notice that the significant bits in the above equivalence does not 
  919.     map over the bits representing the variables. What needs to be done 
  920.     to make this correct is to append enough zeroes to the end of the 
  921.     constant so that it represents what we truly want.
  922.  
  923.     ROM_SEL = ADDR:30000;
  924.  
  925.     This will now produce the correct results since the bit map from 
  926.     this constant is as follows:
  927.  
  928.     "XXXXXXXXXXXXX0110000000000000000"
  929.  
  930.     ROM_SEL = !VAR18 & VAR17 & VAR16;
  931.  
  932.    .c4.Range Operations
  933.     The range operation is similar to the equality operation except that 
  934.     the constant field is a range of values instead of a single value. 
  935.     The check for bit equality is made for each constant value in the 
  936.     range. The format for the range operation is as follows:
  937.  
  938.     1.    [var, var, ... var]:[constant_lo..constant_hi] ;
  939.  
  940.     2.    bit_field_var:[constant_lo..constant_hi] ;
  941.  
  942.     where:
  943.  
  944.         [var, var, ... var] is a list of variables in shorthand 
  945.         notation.
  946.  
  947.         bit_field_var is a variable that has been defined using a bit 
  948.         field statement.
  949.  
  950.         : is the equality operator.
  951.  
  952.         ; is a semicolon used to end the statement.
  953.  
  954.         [constant_lo constant_hi] are numbers (hexadecimal by default) 
  955.         that define the range operation.
  956.  
  957.    ------------------------------------------------------------
  958.    Note
  959.      Square brackets do not indicate optional items, but delimit items 
  960.      in a list
  961.    ------------------------------------------------------------
  962.  
  963.     Format 1 specifies the range operation between a list of variables 
  964.     and a range of constant values.  Format 2 specifies a range 
  965.     operation between a bit field variable and a range of constant 
  966.     values.  All numbers greater than or equal to constant_lo and less 
  967.     than or equal to constant_hi are used to create ANDed expressions as 
  968.     in the equality operation.  The sub-expressions are then ORed 
  969.     together to create the final evaluated expression. For example, the 
  970.     RANGE notation can be used to look for a decoded hex value between 
  971.     1100 and 1111 on an address bus containing A3, A2, A1, and A0.  
  972.     First, define the address bus, as follows:
  973.  
  974.         FIELD address = [A3..A0]
  975.  
  976.     Then  write  the   RANGE equation:
  977.  
  978.         select = address:[C..F] ;
  979.  
  980.     This is equivalent to the following equation:
  981.  
  982.         select = address:C # address:D # address:E # address:F ;
  983.  
  984.     This equation expands to:
  985.  
  986.     select   = A3      &    A2       & !A1     &    !A0
  987.              # A3      &    A2       & !A1     &     A0
  988.              # A3      &    A2       &  A1     &    !A0
  989.              # A3      &    A2       &  A1     &     A0 ;
  990.  
  991.     The logic minimization capabilities within CUPL reduce the previous 
  992.     equation into a single product term equivalent.  The range 
  993.     minimization works as follows. First, lines one and two are combined 
  994.     and lines three and four are combined to produce the following 
  995.     equation:  
  996.  
  997.         select = A3 & A2 & !A1 & (!A0 # A0)
  998.                # A3 & A2 & A1 & (!A0 # A0) ;
  999.  
  1000.     Since the expression (!A0 # A0) is always true, it can be removed 
  1001.     from the equation, and the equation reduces to:
  1002.  
  1003.         select = A3 & A2 & !A1
  1004.                # A3 & A2 & A1 ;
  1005.  
  1006.     By the same process, the equation reduces to  the following:
  1007.  
  1008.         select = A3 & A2 & (!A1 # A1) ;
  1009.  
  1010.     Since the expression (!A1 # A1) is always true, removing it reduces 
  1011.     the equation to the single product term:
  1012.  
  1013.         select = A3 & A2 ;
  1014.  
  1015.     When either the equality or range operations are
  1016.     used with indexed variables, the CONSTANT field must contain the 
  1017.     same number of significant bit locations as the highest index number 
  1018.     in the variable list. Index positions not in the pin list or field 
  1019.     declaration are DON'T CAREd in the operation.  In the following 
  1020.     example, pin assignments are made, an address bus is declared, and a 
  1021.     decoded output is asserted over the hexadecimal memory address 
  1022.     .range 8000 through BFFF.
  1023.  
  1024.         PIN   [1..4] = [A15..12] ;
  1025.         FIELD address = [A15..12] ;
  1026.         chip_select = address:[8000..BFFF] ;
  1027.  
  1028.     Although the variables A15, A14, A13, and A12 are the only address 
  1029.     inputs to the device, a full 16-bit address is used in the range 
  1030.     expression.  The most significant bit, A15, determines that the 
  1031.     field is a 16-bit field.  The lower order address bits (A0 through 
  1032.     A11) are effectively DON'T CAREd in the equation, because the 
  1033.     variable index numbers are used to determine bit position.  Even 
  1034.     though the lower order bits are not present in the device, the 
  1035.     constant value is written as though they did exist, generating a 
  1036.     more meaningful expression in terms of documentation.  Consider, for 
  1037.     example, the following application that decodes a microprocessor 
  1038.     address for an I/O port:
  1039.  
  1040.         PIN [3..6] = [A7..10] ;
  1041.         FIELD ioaddr = [A7..10];
  1042.         /* order of field declaration is not important when using
  1043.            indexed variables */
  1044.         io_port = ioaddr:[400..6FF] ;
  1045.  
  1046.     Since the most significant bit is A10, an 11-bit constant field is 
  1047.     required (although three hex digits form a 12-bit address, the bit 
  1048.     position for A11 is ignored).
  1049.  
  1050.     Address bits A0 through A6 are DON'T CAREd in the expression. 
  1051.     Without the bit position justification, the range equation would be 
  1052.     written as
  1053.  
  1054.         io_port = ioaddr:[8..D] ;
  1055.  
  1056.     This expression doesn't clearly document the actual I/O address 
  1057.     range that is desired.  The original equation without the range 
  1058.     operation could be written as follows:
  1059.  
  1060.         io_port = A10 & !A9 & !A8 & !A7
  1061.                 # A10 & !A9 & !A8 & A7
  1062.                 # A10 & !A9 & A8 & !A7
  1063.                 # A10 & !A9 & A8 & A7
  1064.                 # A10 & A9 & !A8 & !A7
  1065.                 # A10 & A9 & !A8 & A7 ;
  1066.  
  1067.     CUPL reduces this equation to the
  1068.     following:
  1069.  
  1070.         io_port = A10 & !A9
  1071.                 # A10 & A9 & !A8 ;
  1072.  
  1073.    --------------------------------------------------
  1074.    Note
  1075.      Careless use of the range feature may result in
  1076.      the generation of huge numbers of product terms,
  1077.      particularly when fields are composed of variables
  1078.      with large index numbers.  The algorithm for the
  1079.      range does a bit-by-bit comparison of the two
  1080.      constant values given in the range operation,
  1081.      starting with index variable 0 (whether it exists
  1082.      in the field or not). If the value of the bit
  1083.      position for constant_lo is less than that for
  1084.      constant_hi, the variable for that bit position
  1085.      is not used in the generation of the ANDed
  1086.      expressions. When the value of the bit position
  1087.      for constant_lo is equal to or greater than
  1088.      that for constant_hi, an ANDed expression is
  1089.      created for all constant values between this
  1090.      new value and the original constant_hi value.
  1091.    --------------------------------------------------
  1092.  
  1093.     For example, consider the
  1094.     following logic equation
  1095.     that  uses   the   range
  1096.     function  on  a   16-bit
  1097.     address field.
  1098.  
  1099.         field address = [A15..12] ;
  1100.         board_select = address:[A000..DFFF] ;
  1101.  
  1102.     Figure 1-50 shows how the CUPL algorithm treats this equation.
  1103.  
  1104.                     [Picture]
  1105.      Figure 1-50.  Range Function Algorithm
  1106.  
  1107.     The algorithm ignores all bit positions lower than position 13, 
  1108.     because for these positions constant_lo is less than constant_hi. 
  1109.     Figure 1-51 shows the result.
  1110.  
  1111.                     [Picture]
  1112.      Figure 1-51. Range Function Results
  1113.  
  1114.     The following two product terms are generated as a result of the 
  1115.     range function in Figure 1-51.
  1116.  
  1117.         A15 & A14 & !A13
  1118.         A15 & !A14 & A13
  1119.  
  1120.     The following equation is another example using the range function.
  1121.  
  1122.     board_select = address:[A000..D000] ;
  1123.  
  1124.     Because the values of constant_lo and constant_hi match for the 
  1125.     least significant bits, the algorithm generates product terms as 
  1126.     follows:
  1127.  
  1128.         1010 0000 0000 0000
  1129.         1010 0000 0000 0001
  1130.         1010 0000 0000 0010
  1131.         1010 0000 0000 0011
  1132.  
  1133.         .
  1134.         1100 1111 1111 1111
  1135.         1101 0000 0000 0000
  1136.  
  1137.     The  number  of  product terms generated is  over twelve thousand 
  1138.     (4096 x 3 +  1).  This  number  of product   terms    would probably 
  1139.     produce an "out of memory" error message because CUPL cannot hold 
  1140.     this many product  terms in memory at one time.
  1141.  
  1142. o   .c3.Truth Tables
  1143.     Sometimes the clearest way to express logic descriptions is in 
  1144.     tables of information.  CUPL provides the TABLE keyword to create 
  1145.     tables of information.  The format for using TABLE is as follows:
  1146.  
  1147.     TABLE   var_list_1    =>    var_list_2 {
  1148.         input_n => output_n ;
  1149.         .
  1150.         .
  1151.         input_n => output_n;
  1152.         }
  1153.  
  1154.     where
  1155.  
  1156.         var_list_1 defines the input variables.
  1157.  
  1158.         var_list_2 defines the output variables.
  1159.  
  1160.         input_n is a decoded value (hex by default) or a list of decoded 
  1161.         values of var_list_1.
  1162.  
  1163.         output_n is a decoded value (hex by default) of var_list_2.
  1164.  
  1165.         { } are braces to begin and end the assignment block.
  1166.  
  1167.         => specifies a one-to-one assignment between variable lists, and 
  1168.         between input and output numbers.
  1169.  
  1170.     First, define relevant input and output variable lists, and then 
  1171.     specify one-to-one assignments between decoded values of the input 
  1172.     and output variable lists.  Don't-care values are supported for the 
  1173.     input decode value, but not for the output decode value.  A list of 
  1174.     input values can be specified to make multiple assignments in a 
  1175.     single statement.  The following block describes a simple hex-to-BCD 
  1176.     code converter:
  1177.  
  1178.         FIELD input = [in3..0] ;
  1179.         FIELD output = [out4..0] ;
  1180.         TABLE input => output {
  1181.         0=>00;
  1182.         1=>01;
  1183.         2=>02;
  1184.         3=>03;
  1185.         4=>04;
  1186.         5=>05;
  1187.         6=>06;
  1188.         7=>07;
  1189.         8=>08;
  1190.         9=>09;
  1191.         A=>10;
  1192.         B=>11;
  1193.         C=>12;
  1194.         D=>13;
  1195.         E=>14;
  1196.         F=>15;
  1197.         }
  1198.  
  1199.     The following example illustrates the use of a list of input numbers 
  1200.     to do address decoding for various-sized RAM, ROM, and I/O devices.  
  1201.     The address range is decoded according to the rules (in terms of 
  1202.     indexed variable usage) for the range operation (see the subtopic, 
  1203.     Range Operations in this chapter).
  1204.  
  1205.      PIN [1..4] = [a12..15];   /* Upper 4 address*/
  1206.      PIN 12 = !RAM_sel ;       /* 8K x 8 RAM      */
  1207.      PIN 13 = !ROM_sel ;       /* 32K x 8 ROM     */
  1208.      PIN 14 = !timer_sel;      /* 8253 Timer     */
  1209.      FIELD address = [a15..12] ;
  1210.      FIELD decodes = [RAM_sel,ROM_sel,timer_sel] ;
  1211.      TABLE address => decodes {
  1212.      [1000..2FFF] => 'b'100;      /* select RAM      */
  1213.      [5000..CFFF] => 'b'010;      /* select ROM      */
  1214.      F000 => 'b'001;              /* select timer      */
  1215.      }
  1216.  
  1217. o   .c3.State-Machine Syntax
  1218.     This section describes the CUPL state 
  1219.     machine syntax, providing a brief overview of its use, a definition 
  1220.     of a state machine, and explaining in detail the CUPL state machine 
  1221.     syntax.
  1222.  
  1223.     The state-machine approach used with the CUPL compiler-based PLD 
  1224.     language permits bypassing the gate and equation level stage in 
  1225.     logic design and to move directly from a system-level description to 
  1226.     a PLD implementation.  Additionally, unlike assembler-based 
  1227.     approaches, the state-machine approach allows clear documentation of 
  1228.     design, for future users.
  1229.  
  1230. o
  1231.    .c3.State-Machine Model
  1232.     A synchronous state machine is a logic circuit with flip-flops.  
  1233.     Because its output can be fed back to its own or some other 
  1234.     flip-flop's input, a flip-flop's input value may depend on both its 
  1235.     own output and that of other flip-flops; consequently, its final 
  1236.     output value depends on its own previous values, as well as those of 
  1237.     other flip-flops.
  1238.  
  1239.     The CUPL state-machine model, as shown in Figure 1-52, uses six 
  1240.     components:  inputs, combinatorial logic, storage registers, state 
  1241.     bits, registered outputs, and non-registered outputs.
  1242.  
  1243.                     [Picture]
  1244.      Figure 1-52. State Machine Model
  1245.  
  1246.     The following definitions refer to the timing diagram in Figure 
  1247.     1-52.
  1248.  
  1249.     .c4.Inputs
  1250.     Inputs are signals entering the device that originate in some other 
  1251.     device.
  1252.  
  1253.  
  1254.     .c4.Combinatorial Logic
  1255.  
  1256.     Combinatorial Logic is any combination of logic gates (usually 
  1257.     AND-OR) that produces an output signal that is valid Tpd 
  1258.     (propagation delay time) nsec after any of the signals that drive 
  1259.     these gates changes. Tpd is the delay between the initiation of an 
  1260.     input or feedback event and the occurrence of a non-registered 
  1261.     output.
  1262.  
  1263.     .c4.State Bits
  1264.     State Bits are storage register outputs that are fed back to drive 
  1265.     the combinatorial logic. They contain the present-state information.
  1266.  
  1267.     .c4.Storage Registers
  1268.     Storage Registers are any flip-flop elements that receive their 
  1269.     inputs from the state machine's combinatorial logic. Some registers 
  1270.     are used for state bits:  others are used for registered outputs. 
  1271.     The registered output is valid Tco (clock to out time) nsec after 
  1272.     the clock pulse occurs. Tco is the time delay between the initiation 
  1273.     of a clock signal and the occurrence of a valid flip-flop output.
  1274.  
  1275.     Figure 1-53 shows the timing relationships between the state machine 
  1276.     components.
  1277.  
  1278.                     [Picture]
  1279.      Figure 1-53. State Machine Timing Diagram
  1280.  
  1281.  
  1282.     .c4.Inputs
  1283.  
  1284.     For the system to operate properly, the PLD's requirements for setup 
  1285.     and hold times must be met. For most PLDs, the setup time (Tsu) 
  1286.     usually includes both the propagation delay of the combinatorial 
  1287.     logic and the actual setup time of the flip-flops.  Tsu is the time 
  1288.     it takes for the result of either feedback or an input event to 
  1289.     appear at the input to a flip-flop. A subsequent clock input cannot 
  1290.     be applied until this result becomes valid at the flip-flop's input.  
  1291.     The flip-flops can be either D, D-CE, J- K, S-R, or T types.
  1292.  
  1293.     .c4.Nonregistered Outputs
  1294.     Non-registered Outputs - are outputs that come directly from the 
  1295.     combinatorial logic gates.  They may be functions of the state bits 
  1296.     and the input signals (and have asynchronous timing), or they may be 
  1297.     purely dependent on the current state-bit values, in which case they 
  1298.     become valid Tco + Tpd nsec after an active clock edge occurs.
  1299.  
  1300.     .c4.Registered Outputs
  1301.     Registered Outputs are outputs that come from the storage registers 
  1302.     but are not included in the actual state-bit field (that is, a bit 
  1303.     field composed of all the state bits).  State- machine theory 
  1304.     requires that the setting or resetting of these registered outputs 
  1305.     depends on the transition from a present state to a next state. This 
  1306.     allows a registered output to be either set or reset in a given 
  1307.     state depending upon how the machine came to be in that state.  
  1308.     Thus, a registered output can assume a hold operation mode.  In the
  1309.  
  1310.     hold mode, the registered
  1311.     output will remain at its
  1312.     last value as long as the
  1313.     current state transition
  1314.     does  not   specify   an
  1315.     operation    on     that
  1316.     registered output.
  1317.  
  1318.    =================================================================
  1319.    Note
  1320.      This hold mode of operation is available only for devices which use 
  1321.      D-CE, J-K, or S-R type flip-flops.
  1322.    =================================================================
  1323.  
  1324. o
  1325.    .c3.Syntax
  1326.     To implement
  1327.     the state machine model,
  1328.     CUPL supplies a syntax
  1329.     that allows the
  1330.     describing of any
  1331.     function in the state
  1332.     machine.
  1333.     .i.
  1334.     Keywords:SEQUENCE;.i.Keywo
  1335.     rds:PRESENT;The SEQUENCE
  1336.     keyword identifies the
  1337.     outputs of a state
  1338.     machine and is followed
  1339.     by statements that define
  1340.     the function of the state
  1341.     machine. The format for
  1342.     the SEQUENCE syntax is as
  1343.     follows:
  1344.  
  1345.         SEQUENCE        state_var_list {
  1346.         PRESENT state_n0
  1347.         statements ;
  1348.                 .
  1349.                 .
  1350.                 .
  1351.         PRESENT state_nn
  1352.         statements ;
  1353.         }
  1354.  
  1355.     where
  1356.  
  1357.     state_var_list is a list of the state bit variables used in the 
  1358.     state machine block. The variable list can be represented by a field 
  1359.     variable.
  1360.  
  1361.     state_n is the state number and is a decoded value of the 
  1362.     state_variable_list and must be unique for each PRESENT statement.
  1363.  
  1364.     statements are any of the conditional, next, or output statements 
  1365.     described in the following subsections of this section.
  1366.  
  1367.     ; is a semicolon used to mark the end of a statement.
  1368.  
  1369.     { } are braces to mark the beginning and end of the state machine 
  1370.     description.
  1371.  
  1372.     Symbolic  names  defined with the $DEFINE command may be used to 
  1373.     represent state_numbers.
  1374.  
  1375.     The SEQUENCE keyword causes the storage registers and registered 
  1376.     output types generated to be the default type for the target device.  
  1377.     For example, by using the SEQUENCE keyword in a design with a P16R8 
  1378.     target device, the state storage registers and registered outputs 
  1379.     will be generated as D-type flip-flops.
  1380.  
  1381.     The storage registers for certain devices can be programmed as more 
  1382.     than one type. In the case of the F159 (Signetics PLS159), they can 
  1383.     be either D or J-K type flip-flops. By default, using the SEQUENCE 
  1384.     statement with a design for the F159 will cause the state storage 
  1385.     registers and registered outputs to be generated as J-K type 
  1386.     flip-flops.  To override this default, the SEQUENCED keyword would 
  1387.     be used in place of the SEQUENCE keyword.  This would cause the 
  1388.     state registers and registered outputs to be generated as D-type 
  1389.     flip-flops.
  1390.  
  1391.     Along with the SEQUENCE and SEQUENCED keywords are the SEQUENCEJK, 
  1392.     SEQUENCERS, and SEQUENCET keywords.  Respectively, they cause the 
  1393.     state registers and registered outputs to be generated as J-K, S-R, 
  1394.     and T-type flip-flops.  The subsections that follow describe the 
  1395.     types of statements that can be written in the state-machine syntax.
  1396.     Statements use the IF, NEXT, OUT and DEFAULT keywords.
  1397.  
  1398.    .c4.Unconditional NEXT Statement
  1399.     This statement describes the transition from the present state to a 
  1400.     specified next state. The format is:
  1401.  
  1402.         PRESENT state_n
  1403.         NEXT state_n ;
  1404.  
  1405.     where
  1406.  
  1407.     state_n is a decoded value of the state bit variables that are the 
  1408.     output of the state machine.
  1409.  
  1410.     A symbolic name can be assigned with the $DEFINE command to 
  1411.     represent state_n.
  1412.  
  1413.     Because the statement is unconditional (that is, it describes the 
  1414.     transition to a specific next state), there can be only one NEXT 
  1415.     statement for each PRESENT statement.
  1416.  
  1417.     The following example specifies the transition from binary state 01 
  1418.     to binary state 10.
  1419.  
  1420.         PRESENT 'b'01
  1421.         NEXT 'b'10 ;
  1422.  
  1423.     Figure 1-54 shows the transition described in the example above.
  1424.  
  1425.                     [Picture]
  1426.      Figure 1-54.  Unconditional NEXT Statement Diagram
  1427.  
  1428.     For the transition described in the example and figure above, CUPL 
  1429.     generates the following equations, depending on the type of 
  1430.     flip-flop that is specified:
  1431.  
  1432.     D-Type Flip-Flop
  1433.          APPEND Q1.D = !Q1 & Q0;
  1434.          APPEND Q0.D = 'b'0; /* implicitly resets */
  1435.     J-K-Type Flip-Flop
  1436.         APPEND Q1.J = !Q1 & Q0;
  1437.         APPEND Q1.K = 'b'0;
  1438.         APPEND Q0.J = 'b'0;
  1439.         APPEND Q0.K = !Q1 & Q0;
  1440.     S-R-Type Flip-Flop
  1441.         APPEND Q1.S = !Q1 & Q0;
  1442.         APPEND Q1.R = 'b'0;
  1443.         APPEND Q0.S = 'b'0;
  1444.         APPEND Q0.R = !Q1 & Q0;
  1445.     D-CE-Type Flip-Flop
  1446.         APPEND Q1.D = !Q1 & Q0;
  1447.         APPEND Q1.CE = !Q1 & Q0;
  1448.         APPEND Q0.D = 'b'0;
  1449.         APPEND Q0.CE = !Q1 & Q0;
  1450.     T-Type Flip-Flop
  1451.         APPEND Q1.T = !Q1 & Q0;
  1452.         APPEND Q0.T = !Q1 & Q0;
  1453.  
  1454.     See the subtopic, APPEND Statements in this chapter for a 
  1455.     description of the APPEND command.
  1456.  
  1457. .c4.Conditional NEXT Statement
  1458.     This statement describes the transition from the present state to a 
  1459.     next state if the conditions in a specified input expression are 
  1460.     met.  The format is as follows.
  1461.  
  1462.         PRESENT state_n
  1463.         IF expr NEXT state_n;
  1464.                 .
  1465.                 .
  1466.                 .
  1467.         IF expr NEXT
  1468.         state_n;
  1469.         [DEFAULT NEXT state_n;]
  1470.  
  1471.     where
  1472.  
  1473.     state_n is a decoded value of the state bit variables that are the 
  1474.     output of the state machine.
  1475.  
  1476.     expr is any valid expression (see the subtopic, Expressions in this 
  1477.     chapter).
  1478.  
  1479.     ; is a semicolon used to mark the end of a statement.
  1480.  
  1481.    ========================================
  1482.    Note
  1483.      The square  brackets
  1484.      indicate optional items.
  1485.    ========================================
  1486.  
  1487.     The value for each state number must be unique.  More than one 
  1488.     conditional statement can be specified for each PRESENT statement.
  1489.  
  1490.     The DEFAULT statement is optional. It
  1491.     describes the transition from the present state to a next state if 
  1492.     none of the conditions in the specified conditional statements are 
  1493.     met.  In other words, it describes the condition that is the 
  1494.     complement of the sum of all the conditional statements.
  1495.  
  1496.    =================================================================
  1497.    Note
  1498.      Be careful when using the DEFAULT statement. Because it is the 
  1499.      complement of all the conditional statements, the DEFAULT statement 
  1500.      can generate an expression complex enough to greatly slow CUPL 
  1501.      operation. In most applications, one or two conditional statements 
  1502.      can be specified instead of the DEFAULT statement.
  1503.    =================================================================
  1504.  
  1505.     The following is an example of two conditional NEXT statements 
  1506.     without a DEFAULT statement.
  1507.  
  1508.         PRESENT 'b'01
  1509.         IF INA NEXT 'b'10;
  1510.         IF !INA NEXT 'b'11;
  1511.  
  1512.     Figure 1-55 shows the transitions described by the above example.
  1513.  
  1514.                     [Picture]
  1515.      Figure 1-55.  Conditional NEXT Statement Diagram
  1516.  
  1517.     For the transitions described in the above example and figure, CUPL 
  1518.     generates the following equations, depending on the type of 
  1519.     flip-flop that is specified:
  1520.  
  1521.     D-Type Flip-Flop
  1522.          APPEND Q1.D = !Q1 & Q0;
  1523.          APPEND Q0.D = !Q1 & Q0 & !INA;
  1524.  
  1525.     D-CE-Type Flip-Flop
  1526.         APPEND Q1.D = !Q1 & Q0;
  1527.         APPEND Q1.CE = !Q1 & Q0;
  1528.         APPEND Q0.D = !Q1 & Q0 & !INA;
  1529.         APPEND Q0.CE = !Q1 & Q0 & INA;
  1530.  
  1531.     J-K-Type Flip-Flop
  1532.         APPEND Q1.J = !Q1 & Q0;
  1533.         APPEND Q1.K = 'b'0;
  1534.         APPEND Q0.J = 'b'0;
  1535.         APPEND Q0.K = !Q1 & Q0 & INA;
  1536.  
  1537.     S-R-Type Flip-Flop
  1538.         APPEND Q1.S = !Q1 & Q0;
  1539.         APPEND Q1.R = 'b'0;
  1540.         APPEND Q0.S = 'b'0;
  1541.         APPEND Q0.R = !Q1 & Q0 & INA;
  1542.  
  1543.     T-Type Flip-Flop
  1544.         APPEND Q1.T = !Q1 & Q0;
  1545.         APPEND Q0.T = !Q1 & Q0 & INA;
  1546.  
  1547.     The following is an example of two conditional statements with a 
  1548.     DEFAULT statement.
  1549.  
  1550.         PRESENT 'b'01
  1551.         IF INA & INB NEXT  'b'10';
  1552.         IF INA & !INB NEXT 'b'11;
  1553.         DEFAULT NEXT 'b'00;
  1554.  
  1555.     Figure 1-56 shows the transitions described by the above example.  
  1556.     Note the equation generated by the DEFAULT statement.
  1557.  
  1558.                     [Picture]
  1559.      Figure 1-56.  Conditional NEXT Statement with Default Diagram
  1560.  
  1561.     For the transitions described in the above example and figure, CUPL 
  1562.     generates the following equations, depending on the type of 
  1563.     flip-flop that is specified.
  1564.  
  1565.     D-Type Flip-Flop
  1566.         APPEND Q1.D = !Q1
  1567.         & Q0 & INA;
  1568.         APPEND Q0.D = !Q1
  1569.         & Q0 & INA &
  1570.         !INB;
  1571.  
  1572.     D-CE-Type Flip-Flop
  1573.         APPEND Q1.D  = !Q1 & Q0 & INA;
  1574.         APPEND Q1.CE = !Q1 & Q0 & INA;
  1575.         APPEND Q0.D  = 'b'0;
  1576.         APPEND Q0.CE = !Q1 & Q0 & !INA
  1577.                      # !Q1 & Q0 & INA & INB;
  1578.  
  1579.     J-K-Type Flip-Flop
  1580.         APPEND Q1.J = !Q1 & Q0 & INA;
  1581.         APPEND Q1.K = 'b'0;
  1582.         APPEND Q0.J = 'b'0;
  1583.         APPEND Q0.K = !Q1 & Q0 & INA & INB
  1584.                     # !Q1 & Q0 & !INA;
  1585.  
  1586.     S-R-Type Flip-Flop
  1587.         APPEND Q1.S = !Q1 & Q0 & INA;
  1588.         APPEND Q1.R = 'b'0;
  1589.         APPEND Q0.S = 'b'0;
  1590.         APPEND Q0.R = !Q1 & Q0 & INA & INB
  1591.                     # !Q1 & Q0 & !INA;
  1592.  
  1593.     T-Type Flip-Flop
  1594.         APPEND Q1.T  = !Q1 & Q0 & INA;
  1595.         APPEND Q0.T  = !Q1 & Q0 & !INA
  1596.                      # !Q1 & Q0 & INA & INB;
  1597.  
  1598. .c4.Unconditional Synchronous Output Statement
  1599.     This statement describes a transition from the present state to a 
  1600.     next state, specifies a variable for the registered (synchronous) 
  1601.     outputs associated with the transition, and defines whether the 
  1602.     variable is logically asserted. The format is as follows:
  1603.  
  1604.         PRESENT state_n
  1605.             NEXT state_n OUT [!]var... OUT [!]var;
  1606.  
  1607.     where
  1608.  
  1609.         state_n is a decoded value (default hex) of the state bit 
  1610.         variables that are the output of the state machine.
  1611.  
  1612.         var is a variable name declared in the pin declarations. It is 
  1613.         not a variable from the SEQUENCE state_var_list.
  1614.  
  1615.         ! is the complement operator; use it to logically negate the 
  1616.         variable, or omit it to logically assert the variable.
  1617.  
  1618.         ; is a semicolon used to mark the end of a statement.
  1619.  
  1620.    ========================================
  1621.    Note
  1622.      The square  brackets
  1623.      indicate optional items.
  1624.    ========================================
  1625.  
  1626.     The PIN declaration statement (see the subtopic, Pin Declaration 
  1627.     Statements in this chapter) determines whether the variable, when 
  1628.     asserted, is active-HI or active-LO.  For example, if the variable 
  1629.     has the negation symbol (!var) in the pin declaration, when it is 
  1630.     asserted in the OUT statement, its value is active-LO.
  1631.  
  1632.    =================================================================
  1633.    Note
  1634.      Use the negation mode only for D-CE, J-K, T or S-R type flip-flops; 
  1635.      D-type flip-flops implicitly reset when assertion is not specified.
  1636.    =================================================================
  1637.  
  1638.     The following is an example of an unconditional synchronous output 
  1639.     statement.
  1640.  
  1641.         PRESENT 'b'01
  1642.         NEXT 'b'10 OUT Y OUT !Z ;
  1643.  
  1644.     Figure 1-57 shows the transition and output variable definition 
  1645.     described in the example above.
  1646.  
  1647.                     [Picture]
  1648.      Figure 1-57.  Unconditional Synchronous Output Diagram
  1649.  
  1650.     For the synchronous output definitions in the example and figure 
  1651.     above, CUPL generates the following equations, depending on the type 
  1652.     of flip-flop that is specified.
  1653.  
  1654.     D-Type Flip-Flop
  1655.         APPEND Y.D = !Q1 & Q0; (not defined for Z output)
  1656.  
  1657.     D-CE Type Flip-Flop
  1658.         APPEND Y.D = !Q1 & Q0;
  1659.         APPEND Y.CE = !Q1 & Q0;
  1660.         APPEND Z.D = 'b'0;
  1661.         APPEND Z.CE = !Q1 & Q0;
  1662.  
  1663.     J-K-Type Flip-Flop
  1664.         APPEND Y.J = !Q1 & Q0;
  1665.         APPEND Y.K = 'b'0;
  1666.         APPEND Z.J = 'b'0;
  1667.         APPEND Z.K = !Q1 & Q0;
  1668.  
  1669.     S-R-Type Flip-Flop
  1670.         APPEND Y.S = !Q1 & Q0;
  1671.         APPEND Y.R = 'b'0;
  1672.         APPEND Z.S = 'b'0;
  1673.         APPEND Z.R = !Q1 & Q0;
  1674.  
  1675.     T-Type Flip-Flop
  1676.         APPEND Y.T = !Q1 & Q0;
  1677.         APPEND Z.T = !Q1 & Q0;
  1678.  
  1679. .c4.Conditional Synchronous Output Statement
  1680.     This statement describes a transition from the present state to a 
  1681.     next state, specifies a variable for the registered (synchronous) 
  1682.     outputs associated with the transition, and defines whether the 
  1683.     variable is logically asserted if the conditions specified in an 
  1684.     input expression are met. The format is as follows:
  1685.  
  1686.         PRESENT state_n
  1687.  
  1688.         IF expr NEXT state_n OUT [!]var...OUT [!] var;
  1689.                .
  1690.                .
  1691.         IF expr NEXT state_n OUT [!]var...OUT [!]var;
  1692.         [ [DEFAULT] NEXT state_n OUT [!]var;]
  1693.  
  1694.     where
  1695.  
  1696.         state_n is a decoded value (default hex) of the state bit 
  1697.         variables that are the output of the state machine.
  1698.  
  1699.         var is a variable name declared in the pin declarations. It is 
  1700.         not a variable from the SEQUENCE state_variable_list.
  1701.  
  1702.         ! is the complement operator; use it to logically negate the 
  1703.         variable, or omit it to logically assert the variable.
  1704.  
  1705.         ; is a semicolon used to mark the end of a statement.
  1706.  
  1707.         expr is any valid expression.
  1708.  
  1709.    ==================================================
  1710.    Note
  1711.      The square  brackets
  1712.      indicate optional items.
  1713.    ==================================================
  1714.  
  1715.     The PIN declaration statement (see the subtopic, Pin Declaration 
  1716.     Statements in this chapter) determines whether the variable, when 
  1717.     asserted, is active-HI or active-LO.  For example, if the variable 
  1718.     has the negation symbol (!var) in the pin declaration, when it is 
  1719.     asserted in the OUT statement, its value is active-LO.
  1720.  
  1721.    ========================================================
  1722.    Note
  1723.      Use the negation mode only for J-K or S-R-type flip-flops. D-type 
  1724.      flip-flops implicitly reset when assertion is not specified.
  1725.    ========================================================
  1726.  
  1727.     The DEFAULT statement is optional. It describes the transition from 
  1728.     the present state to a next state, and defines the output variable, 
  1729.     if none of the conditions in the specified conditional statements 
  1730.     are met.  In other words, it describes the condition that is the 
  1731.     complement of the sum of all the conditional statements.
  1732.  
  1733.    Note
  1734.      Be careful when using the DEFAULT statement. Because it is the
  1735.      complement of all the conditional statements, the DEFAULT statement
  1736.      can generate an expression complex enough to greatly slow CUPL
  1737.      operation. In most applications, one or two conditional statements
  1738.      can be specified instead of the DEFAULT statement.
  1739.  
  1740.     The following is an example of conditional synchronous output 
  1741.     statements without a DEFAULT statement.
  1742.  
  1743.         PRESENT 'b'01
  1744.         IF INA NEXT 'b'10 OUT Y;
  1745.  
  1746.         IF !INA NEXT 'b'11 OUT Z;
  1747.  
  1748.     Figure 1-58 shows the transitions and outputs defined by the 
  1749.     statements in the example above.
  1750.  
  1751.                     [Picture]
  1752.      Figure 1-58.  Synchronous Conditional Output Diagram
  1753.  
  1754.     For the synchronous output definitions in the example and figure 
  1755.     above, CUPL generates the following equations, depending on the type 
  1756.     of flip-flop specified:
  1757.  
  1758.     D-Type Flip-Flop
  1759.         APPEND Y.D = !Q1 & Q0 & INA;
  1760.         APPEND Z.D = !Q1 & Q0 & !INA;
  1761.  
  1762.     D-CE-Type Flip-Flop
  1763.         APPEND Y.D = !Q1 & Q0 & INA;
  1764.         APPEND Y.CE = !Q1 & Q0 & INA;
  1765.         APPEND Z.D = !Q1 & Q0 & !INA;
  1766.         APPEND Z.CE = !Q1 & Q0 & !INA;
  1767.  
  1768.     J-K-Type Flip-Flop
  1769.         APPEND Y.J = !Q1 & Q0 & INA;
  1770.         APPEND Y.K = 'b'0;
  1771.         APPEND Z.J = !Q1 & Q0 & !INA;
  1772.         APPEND Z.K = 'b'0;
  1773.  
  1774.     S-R-Type Flip Flop
  1775.         APPEND Y.S = !Q1 & Q0 & INA;
  1776.         APPEND Y.R = 'b'0;
  1777.         APPEND Z.S = !Q1 & Q0 & !INA;
  1778.         APPEND Z.R = 'b'0;
  1779.  
  1780.     T-Type Flip-Flop
  1781.         APPEND Y.T = !Q1 & Q0 & INA;
  1782.         APPEND Z.T = !Q1 & Q0 & !INA;
  1783.  
  1784.     The
  1785.     following is an example
  1786.     of conditional output
  1787.     statements with a DEFAULT
  1788.     statement.
  1789.  
  1790.         PRESENT 'b'01
  1791.         IF INA & INB NEXT        'b'10;
  1792.  
  1793.         IF INA & !INB NEXT        'b'11;
  1794.  
  1795.            DEFAULT NEXT        'b'00 OUT Y OUT !Z;
  1796.  
  1797.     Figure 1-59 shows the transitions described by the above example.  
  1798.     Note the equation generated by the DEFAULT statement.
  1799.  
  1800.                     [Picture]
  1801.      Figure 1-59.  Synchronous Conditional Output with Default Diagram
  1802.  
  1803.     For the transitions described in the above example and figure, CUPL 
  1804.     generates the following equations, depending on the type of 
  1805.     flip-flop that is specified.
  1806.  
  1807.     D-Type Flip-Flop
  1808.         APPEND Y.D = !Q1 & Q0 & !INA;(not defined for Z output)
  1809.  
  1810.     D-CE-Type Flip-Flop
  1811.         APPEND Y.D = !Q1 & Q0 & !INA;
  1812.         APPEND Y.CE = !Q1 & Q0 & !INA;
  1813.         APPEND Z.D = 'b'0;
  1814.         APPEND Z.CE = !Q1 & Q0 & INA;
  1815.  
  1816.     J-K-Type Flip-Flop
  1817.         APPEND Y.J = !Q1 & Q0 & !INA;
  1818.  
  1819.         APPEND Y.K = 'b'0;
  1820.  
  1821.         APPEND Z.J = 'b'0;
  1822.  
  1823.         APPEND Z.K = !Q1 & Q0 & !INA;
  1824.  
  1825.     S-R-Type Flip-Flop
  1826.         APPEND Y.S = !Q1 & Q0 & !INA;
  1827.         APPEND Y.R = 'b'0;
  1828.         APPEND Z.S = 'b'0;
  1829.         APPEND Z.R = !Q1 & Q0 & !INA;
  1830.  
  1831.     T-Type Flip-Flop
  1832.         APPEND Y.T = !Q1 & Q0 & !INA
  1833.         APPEND Z.T = !Q1 & Q0 & INA;
  1834.  
  1835. .c4.Unconditional   Asynchronous   Output Statement
  1836.     This statement specifies variables for the non-registered 
  1837.     (asynchronous) outputs associated with a given present state, and 
  1838.     defines when the variable is logically asserted.  The format is as 
  1839.     follows:
  1840.  
  1841.         PRESENT state_n
  1842.  
  1843.         OUT var ... OUT var ;
  1844.  
  1845.     where:
  1846.  
  1847.         state_n is a decoded value (default hex) of the state bit 
  1848.         variables that are the output of the state machine.
  1849.  
  1850.         var is a variable name declared in the pin declarations. It is 
  1851.         not a variable from the SEQUENCE state_var_list.
  1852.  
  1853.         ; is a semicolon used to mark the end of a statement.
  1854.  
  1855.     The PIN declaration statement (see the subtopic, Pin Declaration 
  1856.     Statements in this chapter) determines whether the variable, when 
  1857.     asserted, is active-HI or active-LO.  For example, if the variable 
  1858.     has the negation symbol (!var) in the pin declaration, when it is 
  1859.     asserted in the OUT statement, its value is active-LO.  Negating the 
  1860.     variable (with the complement operator) is not a valid format for 
  1861.     this statement.
  1862.  
  1863.     Only one output statement can be written for each present state.  
  1864.     However, multiple variables can be defined using more than one OUT 
  1865.     keyword.  The following is an example of an unconditional 
  1866.     asynchronous output statement.
  1867.  
  1868.         PRESENT 'b'01
  1869.  
  1870.         OUT Y OUT Z;
  1871.  
  1872.     Figure 1-60 shows the outputs defined by the statements in the 
  1873.     example above.
  1874.  
  1875.                     [Picture]
  1876.      Figure 1-60.  Unconditional Asynchronous Output Diagram
  1877.  
  1878.     For the asynchronous output definitions in the example and figure 
  1879.     above, CUPL generates the following equations:
  1880.  
  1881.         APPEND Y = !Q1 & Q0;
  1882.         APPEND Z = !Q1 & Q0;
  1883.  
  1884. .c4.Conditional   Asynchronous   Output Statement
  1885.     This statement specifies variables for the non-registered 
  1886.     (asynchronous) outputs associated with a given present state, and 
  1887.     defines when the variables are logically asserted, if the conditions 
  1888.     in an input expression are met.  The format is as follows:
  1889.  
  1890.         PRESENT state_n
  1891.  
  1892.         IF expr OUT var  ... OUT var;
  1893.                    .
  1894.                    .
  1895.         IF expr OUT var  ... OUT var;
  1896.         [DEFAULT  OUT var ... OUT var;]
  1897.  
  1898.     where
  1899.  
  1900.         state_n is a decoded value (default hex) of the state bit 
  1901.         variables that are the output of the state machine.
  1902.  
  1903.         var is a variable name declared in the pin declarations. It is 
  1904.         not a variable from the SEQUENCE statement.
  1905.  
  1906.         expr is any valid expression.
  1907.  
  1908.         ; is a semicolon used to mark the end of a statement.
  1909.  
  1910.     ==================================================
  1911.    Note
  1912.      The square  brackets
  1913.      indicate optional items.
  1914.     ==================================================
  1915.  
  1916.     The PIN declarati on statement determines whether the variable, when 
  1917.     asserted, is active-HI or active-LO.  For example, if the variable 
  1918.     has the negation symbol (!var) in the pin declaration, when it is 
  1919.     asserted in the OUT statement, its value is active-LO.
  1920.  
  1921.     Negating the variable (with the complement operator) is not a valid 
  1922.     format for this statement.  Multiple output statements can be 
  1923.     written for each present state, and define multiple variables using 
  1924.     the OUT keyword.  .i.Keywords:DEF AULT;The DEFAULT statement is 
  1925.     optional. It defines the output variable if none of the conditions 
  1926.     in the specified conditional statements are met.  In other words, it 
  1927.     describes the condition that is the complement of the sum of all the 
  1928.     conditional statements.
  1929.  
  1930.    ===================================================================
  1931.    Note
  1932.      Be careful when using the DEFAULT statement. Because it is the 
  1933.      complement of all the conditional statements, the DEFAULT statement 
  1934.      can generate an expression complex enough to greatly slow CUPL 
  1935.      operation. In most applications, one or two conditional statements 
  1936.      can be specified instead of the DEFAULT statement.
  1937.  
  1938.     The following is an example of conditional asynchronous output 
  1939.     statements without a default statement.
  1940.    ===================================================================
  1941.  
  1942.         PRESENT 'b'01
  1943.         IF INA OUT Y;
  1944.         IF !INA OUT Z;
  1945.  
  1946.     Figure 1-61 shows the outputs defined by the statements in the above 
  1947.     example.
  1948.  
  1949.                     [Picture]
  1950.      Figure 1-61.  Conditional Asynchronous Output Diagram
  1951.  
  1952.     For the asynchronous output definitions in the example and figure 
  1953.     above, CUPL generates the following equations:
  1954.  
  1955.         APPEND Y = !Q1 & Q0 & INA;
  1956.         APPEND Z = !Q1 & Q0 & !INA;
  1957.  
  1958.     The following is an example of conditional asynchronous output 
  1959.     statements with a DEFAULT statement.
  1960.  
  1961.         PRESENT 'b'01
  1962.         IF INA & INB OUT X;
  1963.         IF INA & !INB OUT Y;
  1964.         DEFAULT OUT Z;
  1965.  
  1966.     Figure  1-62  shows  the transitions described by the above example.  
  1967.     Note the equation generated by the DEFAULT statement.
  1968.  
  1969.                     [Picture]
  1970.      Figure 1-62.  Conditional Asynchronous Output with Default Diagram
  1971.  
  1972.     For the transitions described in the above example and figure, CUPL 
  1973.     generates the following equations, depending on the type of 
  1974.     flip-flop that is specified.
  1975.  
  1976.         APPEND X = !Q1 & Q0 & INA & !INB;
  1977.         APPEND Y = !Q1 & Q0 & INA & INB;
  1978.         APPEND Z = !Q1 & Q0 & !INA;
  1979.  
  1980. .c4.Sample State-Machine Syntax File
  1981.     This section provides an example of a simple two-bit counter 
  1982.     implemented with state-machine syntax.  Figure 1-63 shows a diagram 
  1983.     of the counter operation.
  1984.  
  1985.                     [Picture]
  1986.      Figure 1-63. Simple 2-Bit Counter Diagram
  1987.  
  1988.     The $DEFINE command assigns symbolic names to the states of the 
  1989.     counter, and the SEQUENCE statement defines the transitions between 
  1990.     states.
  1991.  
  1992.         $DEFINE S0 0        /* assign symbolic names */
  1993.         $DEFINE S1 1        /* to states  */
  1994.         $DEFINE S2 2
  1995.         $DEFINE S3 3
  1996.         FIELD count = [Q1,Q0];
  1997.         /* assign field variable to statebits        */
  1998.         SEQUENCE count {
  1999.  
  2000.         PRESENT S0        NEXT S1 ;
  2001.  
  2002.         PRESENT S1        NEXT S2 ;
  2003.  
  2004.         PRESENT S2        NEXT S3 ;
  2005.  
  2006.         PRESENT S3        NEXT S0 ;
  2007.         }
  2008.  
  2009.     See the example, Decade Up/Down Counter, in Chapter U5 for another 
  2010.     illustration of a state machine implementation.
  2011.  
  2012. o   .c3.Condition Syntax
  2013.     The CONDITION syntax provides a higher-level approach to specifying 
  2014.     logic functions than does writing standard Boolean logic equations 
  2015.     for combinatorial logic. The format is as follows:
  2016.  
  2017.         CONDITION {
  2018.  
  2019.          IF expr0 OUT var ;
  2020.  
  2021.            .
  2022.  
  2023.            .
  2024.  
  2025.          IF        exprn OUT var ;
  2026.          DEFAULT OUT var ;
  2027.  
  2028.         }
  2029.  
  2030.     where
  2031.  
  2032.         expr is any valid expression.
  2033.  
  2034.         var is a variable name declared in the pin declaration. It can 
  2035.         also be a list of indexed or non-indexed variables in list 
  2036.         notation.
  2037.  
  2038.         ; is a semicolon used to mark the end of a statement.
  2039.  
  2040.     The CONDITION syntax is equivalent to the asynchronous conditional 
  2041.     output statements of the state machine syntax, except that there is 
  2042.     no reference to any particular state.  The variable is logically 
  2043.     asserted whenever the expression or DEFAULT condition is met.  The 
  2044.     variable cannot be logically negated in this format.
  2045.  
  2046.    ========================================================
  2047.    Note
  2048.      Be careful when using the DEFAULT statement. Because it is the 
  2049.      complement of all the conditional statements, the DEFAULT statement 
  2050.      can generate an expression complex enough to greatly slow CUPL 
  2051.      operation. In most applications, one or two conditional statements 
  2052.      may be specified instead of the DEFAULT statement.
  2053.    ========================================================
  2054.  
  2055.     The following is an example of a 2 to 4 line decoder for the 
  2056.     CONDITION syntax.  The two data inputs, A and B, select one of four 
  2057.     decoded outputs, Y0 through Y3, whenever the ENABLE signal is 
  2058.     asserted.  The NO_MATCH output is asserted if none of the other four 
  2059.     outputs are true.
  2060.  
  2061.         PIN [1,2] = [A,B] ;        /* Data Inputs */
  2062.         PIN 3 = !enable ;        /* Enable Input */
  2063.         PIN [12..15] =        [Y0..3] ; /* Decoded Outputs */
  2064.         PIN 14 = no_match ;        /* Match Output */
  2065.         CONDITION {
  2066.  
  2067.         IF enable & !B & !A        out Y0 ;
  2068.  
  2069.         IF enable & !B & A        out Y1 ;
  2070.  
  2071.         IF enable & B & !A        out Y2 ;
  2072.  
  2073.         IF enable & B & A        out Y3 ;
  2074.  
  2075.         }
  2076.  
  2077.     The DEFAULT expression of the above example is
  2078.     equivalent to the following logic equation
  2079.  
  2080.         no_match = !( enable & !B & !A)
  2081.                  # enable & !B & A
  2082.                  # enable & B & !A
  2083.                  # enable & B & A ;
  2084.  
  2085.     which reduces to the following:
  2086.  
  2087.         no_match = !enable ;
  2088.  
  2089.  
  2090. o   .c3.User-Defined Functions
  2091.  
  2092.     The FUNCTION keyword permits the creating of personal keywords by 
  2093.     encapsulating some logic as a function and giving it a name.  This 
  2094.     name can then be used in a logic equation to represent the function. 
  2095.     The format for user-defined functions is as follows:
  2096.  
  2097.         FUNCTION name([parameter0,....,parametern])
  2098.         { 
  2099.                 body
  2100.         }
  2101.  
  2102.     where
  2103.  
  2104.         name is any group of valid symbols used to reference the 
  2105.         function. Do not use any of the CUPL reserved keywords.
  2106.  
  2107.         parameter is an optional variable used to reference variables 
  2108.         when the function is used in a logic equation. It cannot be an 
  2109.         expression.
  2110.  
  2111.         body is any combination of logic equations, truth tables, 
  2112.         state-machine syntax, condition syntax, or user function.
  2113.  
  2114.         ( ) are parentheses used
  2115.         to enclose the parameter list.
  2116.  
  2117.         { } are braces used to enclose the body
  2118.         of the function.
  2119.  
  2120.    ========================================
  2121.    Note
  2122.      The square brackets
  2123.      indicate optional items.
  2124.    ========================================
  2125.  
  2126.     The statements in the body may assign an expression to the function, 
  2127.     or may be unrelated equations.  When using optional parameters, the 
  2128.     number of parameters in the function definition and in the reference 
  2129.     must be identical. The parameters defined in the body of the 
  2130.     function are substituted for the parameters referenced in the logic 
  2131.     equation.  For example, the following defines an exclusive OR 
  2132.     function:
  2133.  
  2134.         FUNCTION xor(in1, in2) {        /* in1 and in2 are parameters */
  2135.         xor = in1 & in2 # !in1 & in2 ;
  2136.         }
  2137.  
  2138.     An xor can be used in an equation with the inputs A and B passed as 
  2139.     parameters, as follows:
  2140.  
  2141.         Y = xor(A,B) ;
  2142.  
  2143.     The result is the following logic equation assignment for the output 
  2144.     variable Y:
  2145.  
  2146.         Y = A & !B # !A
  2147.         & B ;
  2148.  
  2149.     When a function variable is referenced in an expression, the 
  2150.     compiler takes the following action:
  2151.  
  2152.     1.     A special function invocation variable is assigned for the 
  2153.            function name and its arguments. This variable name is not 
  2154.            user accessible.
  2155.  
  2156.     2.     The rest of the expression is evaluated.
  2157.  
  2158.     3.     The function body, with the invocation parameters 
  2159.            substituted, is evaluated.
  2160.  
  2161.     4.     The function invocation variable is assigned an expression 
  2162.            according to the body of the function. If no assignment is 
  2163.            made in the body statements, the function invocation variable 
  2164.            is assigned the value of 'h'o.
  2165.  
  2166.    ============================================================
  2167.    Note
  2168.      Functions must be defined before they may be referenced.  Functions 
  2169.      are not recursive. That is, a function body may not include a 
  2170.      reference of the function being defined.
  2171.    ============================================================
  2172.  
  2173.     The following example shows a user-defined function 
  2174.     .i.Functions:User defined;to construct state-machine-type
  2175.     transitions for non-registered devices without internal feedback 
  2176.     (such as PROMs).
  2177.  
  2178.         FUNCTION  TRANSITION(present_state,next_state,input_conditions)
  2179.         {
  2180.               APPEND state_out = state_in:present_state
  2181.                         & input_condition & next_state;
  2182.         }
  2183.  
  2184.     The function defined in the example above is used in the following 
  2185.     example to implement a simple up/down counter as a series of 
  2186.     TRANSITION function references:
  2187.  
  2188.      PIN [10,11] = [Qin0..1];   /* Registered PROM  */
  2189.                                 /* output feed      */
  2190.                                 /* back externally  */
  2191.                                 /* on input pins    */
  2192.      PIN [12,13] =   [count0..1] ;  /*Count   Control       */
  2193.      PIN   [1,2] =   [Q0..1] ;      /* PROM Outputs    */
  2194.      FIELD state_in = [Qin0..1] ;
  2195.      FIELD state_out = [Q0..1] ;
  2196.      count_up = !count1 & !count0 ; /* count up */
  2197.      count_dn = !count1 & count0 ;  /* count down */
  2198.      hold_cnt = count1;             /* hold count */
  2199.  
  2200.      $DEFINE      STATE0 'b'00
  2201.      $DEFINE      STATE1 'b'01
  2202.      $DEFINE      STATE2 'b'10
  2203.      $DEFINE      STATE3 'b'11
  2204.  
  2205.      /*      (transition function      definition made here)      */
  2206.      TRANSITION(STATE0,STATE1,count_up);
  2207.      TRANSITION(STATE1,STATE2,count_up);
  2208.      TRANSITION(STATE2,STATE3,count_up);
  2209.      TRANSITION(STATE3,STATE0,count_up);
  2210.      TRANSITION(STATE0,STATE3,count_dn);
  2211.      TRANSITION(STATE1,STATE0,count_dn);
  2212.      TRANSITION(STATE2,STATE1,count_dn);
  2213.      TRANSITION(STATE3,STATE2,count_dn);
  2214.      TRANSITION(STATE0,STATE0,hold_cnt);
  2215.      TRANSITION(STATE1,STATE1,hold_cnt);
  2216.      TRANSITION(STATE2,STATE2,hold_cnt);
  2217.      TRANSITION(STATE3,STATE3,hold_cnt);
  2218.  
  2219.  
  2220.