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

  1. .C1. CUPL LANGUAGE              1
  2.  
  3.     This chapter explains CUPL language elements and CUPL language 
  4.     syntax.
  5.  
  6.  
  7. o   .C2.LANGUAGE ELEMENTS
  8.  
  9.     This section describes the elements that comprise the CUPL logic 
  10.     description language.
  11.  
  12.  
  13. o   .C3.VARIABLES
  14.  
  15.     Variables are strings of alphanumeric characters that specify device 
  16.     pins, internal nodes, constants, input signals, output signals, 
  17.     intermediate signals, or sets of signals.  This section explains the 
  18.     rules for creating variables.
  19.  
  20.     Variables can start with a numeric digit, alphabet character, or 
  21.     underscore, but must contain at least one alphabet character.  
  22.     Variables are case sensitive; that is, they distinguish between 
  23.     uppercase and lowercase letters.
  24.  
  25.     Do not use spaces within a variable name. Use the underscore 
  26.     character to separate words.
  27.  
  28.     Variables can contain up to 31 characters. Longer variables are 
  29.     truncated to 31 characters.
  30.  
  31.     Variables cannot contain any of the CUPL reserved symbols (see Table 
  32.     1-2).  Variables cannot be the same as a CUPL reserved keyword (see 
  33.     Table 1-1).
  34.  
  35.     Examples of  some  VALID  variable names are:
  36.  
  37.      a0
  38.      A0
  39.      8250_ENABLE
  40.      Real_time_clock_interrupt
  41.      _address
  42.  
  43.     Note how the use of the underscore in the above examples makes the 
  44.     variable names easier to read.  Also, note the difference between 
  45.     uppercase and lowercase variable names.  The variable A0 is not the 
  46.     same as a0.
  47.  
  48.     Examples of some INVALID variable names are:
  49.  
  50.     99                 does not contain an alpha character
  51.  
  52.     I/O                enable contains a special character (/)
  53.  
  54.     out 6a             contains a space; the system reads it as two 
  55.                        separate variables
  56.  
  57.     tbl-2              contains a dash; the system reads it as two
  58.                        variables.
  59.  
  60.  
  61. o   .C3.INDEXED VARIABLES
  62.  
  63.     Variable names can be used to represent a group of address lines, 
  64.     data lines, or other sequentially numbered items. For example, the 
  65.     following variable names could be assigned to the eight LO-order 
  66.     address lines of a microprocessor:  A0 A1 A2 A3 A4 A5 A6 A7
  67.  
  68.     Variable names that  end in a  number,  as  shown above, are 
  69.     referred to as indexed variables.
  70.  
  71.    ==================================================
  72.    Note
  73.      It is best to start indexed variables from zero 
  74.      (0).e.g. Use X0...4 instead of X1...5.
  75.    ==================================================
  76.  
  77.     The index numbers are always decimal numbers between 0 and 31.  When 
  78.     used in bit field operations (see the subtopic, Bit Field 
  79.     Declaration Statements in this chapter) the variable with index 
  80.     number 0 is always the lowest order bit.
  81.  
  82.    ==================================================
  83.    Note
  84.      Variables ending in numbers greater than 31 are 
  85.      not indexed variables
  86.    ==================================================
  87.  
  88.     Examples of some valid indexed variable names are as follows:
  89.  
  90.      a23
  91.      D07
  92.      D7
  93.      counter_bit_3
  94.  
  95.     Note the difference between index variables with leading zeroes; the 
  96.     variable D07 is not the same as D7.
  97.  
  98.     Examples of some invalid indexed variable names are as follows:
  99.  
  100.      D0F              index number is not decimal
  101.      a36              index number out of range
  102.  
  103.     These are valid variable names, but they  are not
  104.     considered indexed.
  105.  
  106.  
  107. o   .C3.RESERVED WORDS AND SYMBOLS
  108.  
  109.     CUPL uses certain character strings with predefined meanings called 
  110.     keywords.  These keywords cannot be used as names in CUPL. Table 1-1 
  111.     lists these keywords.
  112.  
  113.    Table 1-1. CUPL Reserved Keywords
  114.     --------------------------------------------------
  115.     APPEND      ASSEMBLY        ASSY
  116.     COMPANY     CONDITION       DATE
  117.     DEFAULT     DESIGNER        DEVICE
  118.     ELSE        FIELD           FLD
  119.     FORMAT      FUNCTION        FUSE
  120.     GROUP       IF              JUMP
  121.     LOC         LOCATION        MACRO
  122.     MIN         NAME            NODE
  123.     OUT         PARTNO          PIN
  124.     PINNNODE    PRESENT         REV
  125.     REVISION    SEQUENCE        SEQUENCED
  126.     SEQUENCEJK  SEQUENCERS      SEQUENCET
  127.     TABLE 
  128.     --------------------------------------------------
  129.  
  130.     CUPL also reserves certain symbols for its use that cannot be used 
  131.     in variable names. Table 1-2 lists these reserved symbols.
  132.  
  133.    Table 1-2. CUPL Reserved Symbols
  134.         ----------------------------
  135.         &       #       (       ) 
  136.         -       *       +       [
  137.         ]       /       :       .          
  138.        ..       /*      */      ;
  139.         ,      !        '       =  
  140.         @      $        ^
  141.         ----------------------------
  142.  
  143.  
  144. o   .C3.NUMBERS
  145.  
  146.     All operations involving numbers in the CUPL compiler are done with 
  147.     32-bit accuracy.  Therefore, the numbers may have a value from 0 to 
  148.     232 -1. Numbers may be represented in any one of the four common 
  149.     bases:  binary, octal, decimal, or hexadecimal.  The default base 
  150.     for all numbers used in the source file is hexadecimal, except for 
  151.     device pin numbers and indexed variables, which are always decimal.  
  152.     Numbers for a different base may be used by preceding them with a 
  153.     prefix listed in Table 1-3. Once a base change has occurred, that 
  154.     new base is the default base.
  155.     
  156.  
  157.         Table 1-3. Number Base Prefixes Base 
  158.     Name        Base             Prefix 
  159.     Binary       2                'b' 
  160.     Octal        8                'o' 
  161.     Decimal      10               'd' 
  162.     Hexadecimal  16               'h'
  163.  
  164.     The base letter is enclosed in single quotes and can be either 
  165.     uppercase or lowercase. Some examples of valid number specifications 
  166.     are listed in Table 1-4.  
  167.  
  168.         Table 1-4   Sample Base Conversions
  169.     --------------------------------------------------
  170.     Number       Base                 Decimal Value
  171.     'b'0         Binary               0
  172.     'B'1101      Binary               13
  173.     'O'663       Octal                435
  174.     'D'92        Decimal              92
  175.     'h'BA        Hexadecimal          186
  176.     'O'[300..477] Octal               (range) 192..314
  177.     --------------------------------------------------
  178.  
  179.     Binary, octal, and hexadecimal numbers can have don't-care values 
  180.     ("X") and numerical values. Some examples of valid number 
  181.     specifications with don't-care values are listed in Table 1-5.
  182.  
  183.    Table 1-5. Sample Don't-Care Numbers
  184.     ---------------------------------------
  185.     Number             Base
  186.     'b'1X11            Binary
  187.     'O'0X6             Octal
  188.     'H'[3FXX..7FFF]    Hexadecimal (range)
  189.     ---------------------------------------
  190.  
  191.  
  192. o   .C3.COMMENTS
  193.  
  194.     Comments are an important part of the logic description file. They 
  195.     improve the readability of the code and document the intentions, but 
  196.     do not significantly affect the compile time, as they are removed by 
  197.     the preprocessor before any syntax checking is done. Use the symbols 
  198.     /* and */ to enclose comments; the program ignores everything 
  199.     between these symbols.
  200.  
  201.     Comments may span multiple lines and are not terminated by the end 
  202.     of a line.  Comments cannot be nested.  Some examples of valid 
  203.     comments are shown in Figure 1-1.
  204.  
  205.     -----------------------------------------------------------------
  206.        /*******************************************/ 
  207.        /* This is one way to create a title or    */ 
  208.        /*        an information block             */ 
  209.        /*******************************************/ 
  210.        /* 
  211.        This is another way to create an 
  212.        information block 
  213.        */ 
  214.         
  215.        out1=in1 # in2;      /* A Simple OR Function */ 
  216.        out2=in1 & in2;      /* A Simple AND Function */ 
  217.        out3=in1 $ in2;      /* A Simple XOR Function */
  218.     -----------------------------------------------------------------
  219.         Figure 1-1. Sample Comments.i.comments:sample;
  220.  
  221.  
  222. o   .C3.LIST NOTATION
  223.  
  224.     Shorthand notations are an important feature of the CUPL language. 
  225.     The most frequently used shorthand notation is the list. It is 
  226.     commonly used in pin and node declarations, bit field declarations, 
  227.     logic equations, and set operations.  The list format is as follows:
  228.  
  229.         [variable, variable, ... variable]
  230.  
  231.     where
  232.  
  233.         [ ] are brackets used to delimit items in the list as a set of 
  234.         variables.
  235.  
  236.     Two examples of the list notation are as follows:
  237.  
  238.         [UP, DOWN, LEFT, RIGHT]
  239.  
  240.         [A0, A1, A2, A3, A4, A5, A6, A7]
  241.  
  242.     When  all  the  variable  names  are  sequentially numbered,  either   
  243.     from   lowest to highest or vice versa,   the   following   format 
  244.     may be used:
  245.  
  246.         [variablem..n]
  247.  
  248.     where
  249.  
  250.         m is the first index number in the list of variables.
  251.  
  252.         n is the last number in the list of variables; n can be written 
  253.         without the variable name.
  254.  
  255.     For example, the second line from the example above could be written 
  256.     as follows:
  257.  
  258.         [A0..7]
  259.  
  260.     Index numbers are assumed to be decimal and contiguous.  Any leading 
  261.     zeros in the variable index are removed from the variable name that 
  262.     is created. For example:
  263.  
  264.         [A00..07]
  265.  
  266.     is shorthand for:
  267.         [A0, A1, A2, A3, A4, A5, A6, A7]
  268.  
  269.     not for:
  270.  
  271.         [A00, A01, A02, A03, A04, A05, A06, A07]
  272.  
  273.     The two forms for the list notation may be mixed in any combination. 
  274.     For example, the following two list notations are equivalent:
  275.  
  276.         [A0..2, A3, A4, A5..7]
  277.         [A0, A1, A2, A3, A4, A5, A6, A7]
  278.  
  279.  
  280. o    .C3.TEMPLATE FILE
  281.  
  282.     When a logic description source file is created using the CUPL 
  283.     language, certain information must be entered, such as header 
  284.     information, pin declarations, and logic equations.  For assistance, 
  285.     CUPL provides a template file that contains the proper structure for 
  286.     the source file.
  287.  
  288.     Figure 1-2 shows the contents of the template file.
  289.  
  290.     -----------------------------------------------------------------
  291.         Name            XXXXX;
  292.         Partno          XXXXX;
  293.         Date            XX/XX/XX;
  294.         Revision        XX;
  295.         Designer        XXXXX;
  296.         Company         XXXXX;
  297.         Assembly        XXXXX;
  298.         Location        XXXXX;
  299.        /*************************************************************/
  300.        /* place description of design here                          */
  301.        /*************************************************************/
  302.        /* Allowable Target Device Types:                            */
  303.        /*************************************************************/
  304.        /** Inputs  **/
  305.        Pin         =          ;     /*                     */
  306.        Pin         =          ;     /*                     */
  307.        Pin         =          ;     /*                     */
  308.        Pin         =          ;     /*                     */
  309.  
  310.        /** Outputs **/
  311.        Pin         =            ;     /*                   */
  312.        Pin         =            ;     /*                   */
  313.        Pin         =            ;     /*                   */
  314.        Pin         =            ;     /*                   */
  315.  
  316.        /** Declarations and Intermediate Variable Definitions **/
  317.  
  318.        /** Logic Equations **/
  319.      -----------------------------------------------------------------
  320.      Figure 1-2. Template File
  321.  
  322.     The template file provides the following sections:  
  323.  
  324.     Header Information - Keywords followed by XXXs that are replaced 
  325.     with text to identify the file for archival and revision purposes.
  326.  
  327.     Title Block - Comment symbols that enclose space for describing the 
  328.     function of the design and allowable target devices.  
  329.  
  330.     Pin Declaration - Keywords and operators in the proper format for 
  331.     input and output pin declarations and comment space to describe the 
  332.     pin assignments.  After pin declarations are made, remove any extra 
  333.     "pin = ;" lines.  Otherwise, a syntax error will occur during 
  334.     compilation.  The /* Inputs */ and /* Outputs */ are comments that 
  335.     provide groupings for readability only. Assign any pin type in any 
  336.     order, no matter how it is used in the logic description file.
  337.  
  338.     Declaration and Intermediate Variable - Space for making 
  339.     declarations, such as bit field declarations (see the subtopics, Bit 
  340.     Field Declaration Statements and Node Declaration Statements in this 
  341.     chapter) and for writing intermediate equations (see the subtopic, 
  342.     Logic Equations in this chapter).
  343.  
  344.     Logic Equation - Space for writing logic equations describing the 
  345.     function of the device (see the subtopic, Logic Equations in this 
  346.     chapter).
  347.  
  348.  
  349. .C4.HEADER INFORMATION
  350.  
  351.     The header information section of the source file identifies the 
  352.     file for revision and archival purposes. Normally place it at the 
  353.     beginning of the file. CUPL provides 10 keywords to use in header 
  354.     information statements.  Begin each statement with a keyword which 
  355.     can be followed by any valid ASCII characters, including spaces and 
  356.     special characters.  End each statement with a semicolon.  Table 1-6 
  357.     lists the CUPL header keywords and the information to provide with 
  358.     each keyword.
  359.  
  360.     Table 1-6. Header Information Keywords
  361.     Keyword            Information
  362.  
  363.     NAME               Normally use the source logic description 
  364.                        filename. Use only character strings that are 
  365.                        valid for the operating system. The name 
  366.                        specified here determines the name for any JEDEC, 
  367.                        ASCII - hex, or HL download files. The NAME field 
  368.                        accommodate s filenames up to 32 characters long. 
  369.                        When using systems such as DOS which allow 
  370.                        filenames of only eight characters, the filename 
  371.                        will be truncated.
  372.  
  373.     PARTNO             Specify a company's proprietary part number 
  374.                        (usually issued by manufacturi ng) for a 
  375.                        particular PLD design.  The part number is not 
  376.                        the type of target PLD.
  377.  
  378.                        For GAL devices, the first eight characters are
  379.                        encoded using seven-bit ASCII in the User  
  380.                        Signature Fuses of  the devices' fuse map.
  381.  
  382.      REVISION          Begin with 01  when  first creating a file and  
  383.                        increment each time a file is altered. REV can be 
  384.                        used for  an abbreviatio n.
  385.  
  386.      DATE              Change to the current date each time a source
  387.                        file is altered.
  388.  
  389.      DESIGNER          Specify the designer's name.
  390.  
  391.      COMPANY           Specify the company's name for proper 
  392.                        documentation practice and because specifications 
  393.                        may be sent to semiconduct or manufacturers for    
  394.                        high volume PLD orders.
  395.  
  396.      ASSEMBLY          Give the  assembly name  or   number of the   PC    
  397.                        board on which the PLD will be used.  The 
  398.                        abbreviatio n ASSY can be used.
  399.  
  400.      LOCATION          Indicate the   PC   board reference or coordinate
  401.                        where the PLD   is   located. The abbreviatio n 
  402.                        LOC can be used.
  403.  
  404.      DEVICE            Set the default device type for the 
  405.                        compilation. A device type specified on the  
  406.                        command line overrides all device types set in   
  407.                        the source file. For multi-device source 
  408.                        files, DEVICE must be used with each section 
  409.                        if the device types are different.
  410.  
  411.      FORMAT            Set a download output format override for the
  412.                        current logic description section.  The valid 
  413.                        values to use for the output format are:  h
  414.                        produce ASCII-hex output i produce Signetics HL 
  415.                        output j produce JEDEC output
  416.  
  417.                        FORMAT overrides any option flag  on  the command
  418.                        line. It  is useful in multi-devic e source  
  419.                        files where different parts have incompatibl e 
  420.                        output  formats.  More than one format value at a 
  421.                        time may be specified to produce more than one 
  422.                        type  of output.  The format value must be     a      
  423.                        lowercase letter.
  424.  
  425.     The template file provides all the header keywords except DEVICE and 
  426.     FORMAT. An example of proper CUPL header information is as follows:
  427.  
  428.      Name                  WAITGEN;
  429.      Partno                P9000183; 
  430.      Revision              02;
  431.      Date                  1/11/89;
  432.      Designer              Osann; 
  433.      Company               Logical Devices, Inc. ;
  434.      Assembly              PC Memory Board ;
  435.      Location              U106 ;
  436.      Device                F155;
  437.      Format                ij ;
  438.  
  439.     If any header information is omitted, CUPL issues a
  440.     warning message, but continues with compilation.
  441.  
  442.  
  443. .c4.Pin Declaration Statements
  444.  
  445.     Pin declaration statements declare the pin numbers and assign them 
  446.     symbolic variable names.  The format for a pin declaration is as 
  447.     follows:
  448.  
  449.               PIN pin_n=[!]var ;
  450.  
  451.     where
  452.  
  453.     PIN is a keyword to declare the pin numbers and assign them variable 
  454.     names.
  455.  
  456.     pin_n is a decimal pin number or a list of pin numbers grouped using 
  457.     the list notation; that is,
  458.  
  459.               [pin_n  1, pin_n 2 ... pin_nn]
  460.  
  461.     !  is an optional exclamation point to define the polarity of the 
  462.     input or output signal.
  463.  
  464.     = is the assignment operator.
  465.  
  466.     var is a single variable name or a list of variables grouped using 
  467.     the list notation; that is,
  468.  
  469.               [var, var ... var]
  470.  
  471.     ; is a semicolon to mark the end of the pin declaration statement.
  472.  
  473.     The template file provides a section for entering the pin variables 
  474.     individually or in groups using the list notation.
  475.  
  476.     The concept of polarity can often be a confusing one. In any PLD 
  477.     design, the designer is primarily concerned with whether a signal is 
  478.     true or false.  The designer should not have to care whether this 
  479.     means that the signal is high or low.  For a variety of reasons a 
  480.     board design may require a signal to be considered true when it is 
  481.     logic level 0(low) and false when it is logic 1(high).  This signal 
  482.     is considered active-low since it is activated when it is low. This 
  483.     might also be called low-true. If a signal is changed from 
  484.     active-high to active low then the polarity has been changed.
  485.  
  486.     For this reason, CUPL allows you to declare signal polarity in the 
  487.     pin definition and then you do not have to be concerned with it 
  488.     again.  When writing equations in CUPL syntax, the designer should 
  489.     not be concerned with the polarity of the signal.  The pin 
  490.     declarations declare a translation that will handle the signal 
  491.     polarity.
  492.  
  493.     Suppose that we wanted the following function.
  494.  
  495.               Y = A & B;
  496.  
  497.     What this statement means is that Y will be true when A is true and 
  498.     B is true. We can implement this in a P22V10 device very easily.
  499.  
  500.               Pin 2 = A;
  501.               Pin 3 = B;
  502.               Pin 16 = Y;
  503.               Y = A & B;
  504.  
  505.     When   the   device   is   plugged into a  circuit, if a logic 1 is 
  506.     asserted at pins 2 and 3 then the signal at pin 16 will be high.
  507.  
  508.     Let us  assume that  for  some reason we wanted the inputs to read 
  509.     logic 0 as true. We could modify the design  to  behave  this  way.
  510.  
  511.               Pin 2 = !A;
  512.               Pin 3 = !B;
  513.               Pin 16 = Y;
  514.               Y = A & B;
  515.  
  516.     Now even though the ! symbol was placed in the pin declaration to 
  517.     indicate the inverted polarity, the equation still reads as "Y is 
  518.     true when A is true and B is true". All that has been changed is the 
  519.     translation of true=0 and false=1. So at the design level nothing 
  520.     has changed but in the pin declarations we now map 0 to true and 1 
  521.     to false.  This promotes the designer to separate the design into 
  522.     layers so as to minimize confusion related to polarity.  It is 
  523.     important also that CUPL will modify the feedback signal so that the 
  524.     true/false layer is maintained.
  525.  
  526.                     [Picture]
  527.  
  528.      Figure 1-3. Relationship Between Pin Declaration and Signal 
  529.                  Polarity
  530.  
  531.     Use the exclamation point (!) to define the polarity of an input or 
  532.     output signal.  If an input signal is active-level LO (that is, the 
  533.     asserted TTL signal voltage level is 0 volts), put an exclamation 
  534.     point before the variable name in the pin declaration.  The 
  535.     exclamation point informs the compiler to choose the inverted sense 
  536.     of the signal when it is listed as active in the logic equations.  
  537.     The virtual device is an exception to this rule, however. When using 
  538.     the virtual device, CUPL ignores the polarity in the pin 
  539.     declaration.  In this case, the equation itself must be negated.  
  540.     Similarly, if an output signal is active-level LO, define the 
  541.     variable with an exclamation point in the pin declaration and write 
  542.     the logic equation in a logically true form.  Use of the exclamation 
  543.     point permits declaring pins without regard to the limitations of 
  544.     the type of target device.  With the virtual device, the equation 
  545.     itself must be inverted, since the compiler ignores the polarity in 
  546.     the pin declaration.
  547.  
  548.     If a pin declaration specifying an active-level HI output is 
  549.     compiled for a target device (such as a PAL16L8) that has only 
  550.     inverting outputs, CUPL automatically performs DeMorgan's Theorem on 
  551.     the logic equation to fit the function into the device.  Consider 
  552.     the following example.  The logic description file is written for a 
  553.     PAL16L8 device. All output pins are declared as active-HI. The 
  554.     following equation has been written to specify an OR function:
  555.  
  556.               c = a # b ;
  557.  
  558.     However, because the PAL16L8 contains a fixed inverting buffer on 
  559.     the output pins, CUPL must perform DeMorganization to fit the logic 
  560.     to the device.  CUPL generates the following product term in the 
  561.     documentation file (see Documentation File Formats in Appendix C):
  562.  
  563.               c => ! a & ! b
  564.  
  565.     Figure 1-4 shows the process described above.
  566.  
  567.                     [Picture]
  568.      Figure 1-4. Active-HI Pin Declaration for Inverting Buffer
  569.  
  570.     If a design has excessive product terms, CUPL displays an error 
  571.     message and the compilation stops. The documentation file 
  572.     (filename.DOC) lists the number of product terms required to 
  573.     implement the logic function and the number of product terms the 
  574.     device physically has for the particular output pin.  Some examples 
  575.     of valid pin declarations are:
  576.  
  577.      pin 1   =   clock;           /*  Register Clock  */
  578.      pin 2   =   !enable;         /* Enable I/O Port */
  579.      pin [3,4]    = ![stop,go];   /* Control Signals */
  580.      pin [5..7] = [a0..2];        /* Address Bits 0-2 */
  581.  
  582.     The last two lines in the example above are shorthand notations for 
  583.     the following:
  584.  
  585.        pin 3 = !stop;  /* Control Signal */
  586.        pin 4 = !go;    /* Control Signal */
  587.        pin 5 = a0;     /* Address Bit 0  */
  588.        pin 6 = a1;     /* Address Bit 1  */
  589.        pin 7 = a2;     /* Address Bit 2  */
  590.  
  591.     For the virtual device, the pin numbers may be left out.  This
  592.     provides a way to do a design without regard for any device related 
  593.     restrictions.  The designer can then examine the results and thereby
  594.     determine the requirements for implementation.  The target device 
  595.     can then be chosen. The following are valid pin declarations when 
  596.     using the virtual device.
  597.  
  598.         pin  = !stop; /* Control Signal */
  599.         pin  = !go;   /* Control Signal */
  600.         pin  = a0;    /* Address Bit 0  */
  601.         pin  = a1;    /* Address Bit 1  */
  602.         pin  = a2;    /* Address Bit 2  */
  603.  
  604.     The input, output, or bi-directional nature of a device pin is not 
  605.     specified in the pin declaration. The compiler infers the nature of 
  606.     a pin from the way the pin variable name is used in the logic 
  607.     specification. If the logic specification and the physical 
  608.     characteristics of the target device are incompatible, CUPL displays 
  609.     an error message denoting the improper use of the pin.
  610.  
  611.  
  612. .c4.Node Declaration Statements
  613.  
  614.     Some devices contain functions that are not available on external 
  615.     pins, but logic equations must be written for these capabilities.  
  616.     For example, the 82S105 contains both buried state registers 
  617.     (flip-flops) and a mechanism for inverting any transition term 
  618.     through a complement array.  Before writing equations for these 
  619.     flip-flops (or complement arrays), they must be assigned variable 
  620.     names.  Since there are no pins associated with these functions, the 
  621.     PIN keyword cannot be used.  Use the NODE keyword to declare 
  622.     variable names for buried functions. The format for node 
  623.     declarations is as follows:
  624.  
  625.         NODE [!] var ;
  626.  
  627.         NODE is a keyword to declare a variable name for a buried 
  628.         function.
  629.  
  630.         ! is an optional exclamation point to define the polarity of the 
  631.         internal signal.
  632.  
  633.         var is a single variable name or list of variables grouped using 
  634.         the list notation.
  635.  
  636.         ; is a semicolon to mark the end of the statement.
  637.  
  638.     Place node declarations in the "Declarations and Intermediate 
  639.     Variables Definitions" section of the source file provided by the 
  640.     template file.  Most internal nodes are active-level HI, therefore, 
  641.     the exclamation point should not be used to define the polarity of 
  642.     an internal signal as active-level LO. Using the exclamation point 
  643.     almost always causes the compiler to generate a significantly 
  644.     greater number of product terms. An exception is the complement 
  645.     array node, which, by definition, is an active-level LO signal.  
  646.     Although no pin numbers are given in the declaration statement, CUPL 
  647.     assigns the variable name to an internal pseudo-pin number. These 
  648.     numbers begin with lowest possible number and are sequentially 
  649.     defined even if a node was assigned with the PINNODE statement. The 
  650.     assignment is automatic and determined by usage (flip-flop, 
  651.     complement array, and so on), so variable order is not a concern. 
  652.     However, once a node variable is declared, a logic equation must be 
  653.     created for the variable, or a compilation error results.
  654.  
  655.     CUPL uses the node declaration to distinguish between a logic 
  656.     equation for a buried function and an intermediate expression.
  657.  
  658.         Examples of the use 
  659.         of the NODE keyword 
  660.         are:
  661.         NODE [State0..5];     /* Internal State Bit           */
  662.         NODE !Invert;         /* For Complement Array         */
  663.  
  664.     An alternative for assigning buried functions instead of allowing 
  665.     CUPL to automatically assign them via the NODE keyword, is to use 
  666.     the PINNODE keyword.  The PINNODE keyword is used for explicitly 
  667.     defining buried nodes by assigning a node number to a symbolic 
  668.     variable name.  This is similar to the way the pin declaration 
  669.     statements work.  The format for a pinnode declaration is as 
  670.     follows:
  671.  
  672.         PINNODE node_n =         [!]var;
  673.  
  674.     where
  675.  
  676.         PINNODE is a keyword to declare the node numbers and assign them 
  677.         variable names.  node_n is a decimal node number or a list of 
  678.         node numbers grouped using the list notation; that is,
  679.  
  680.         [node_n1,node_n2 ... node_nn]
  681.  
  682.         ! is an optional exclamation point to define the polarity of the 
  683.         internal signal.
  684.  
  685.         = is the assignment operator. 
  686.  
  687.         var is a single variable name or list of variables grouped using 
  688.         the list notation; that is,
  689.  
  690.         [var,var ... var]
  691.         
  692.         ; is a semicolon used to mark the end of the statement.
  693.  
  694.     Place pinnode declarations in the "Declarations and Intermediate 
  695.     Variables Definitions" section of the source file provided by the 
  696.     template file.  As with node declarations, most internal nodes are 
  697.     active-level HI; therefore, the exclamation point should not be used 
  698.     to define the polarity of an internal signal as active level LO. 
  699.     Using the exclamation point almost always causes the compiler to 
  700.     generate a significantly greater number of product terms. An 
  701.     exception is the complement array node, which by definition is an 
  702.     active-level LO signal.  A list of node numbers for all devices 
  703.     containing internal nodes is included in Appendix D. Please 
  704.     reference these node numbers for pinnode declarations.  
  705.     Examples of the use of the PINNODE keyword are:
  706.  
  707.   PINNODE [29..34] =   [State0..5]; /* Internal   State Bits */
  708.   PINNODE 35 = !Invert; /* For   Complement Array  */
  709.   PINNODE 25 = Buried; /* For    Buried register part */
  710.                        /* of     an I/O macrocell with */
  711.                        /*        multiple feedback paths */
  712.  
  713.  
  714. .c4.Bit Field Declaration Statements
  715.  
  716.     A bit field declaration assigns a single variable name to a group of 
  717.     bits. The format is as follows:
  718.  
  719.         FIELD var = [var, var, ... var] ;
  720.  
  721.         where
  722.  
  723.         FIELD is a keyword.  var is any valid variable name.
  724.  
  725.         [var, var, ... var] is a list of variable
  726.         names in list notation.
  727.  
  728.         = is the assignment operator.
  729.  
  730.         ; is a semicolon used to mark the end of
  731.         the statement.
  732.  
  733.    Note
  734.     ==================================================
  735.      The square brackets do not indicate optional 
  736.      items.  They are used to delimit items in a list.
  737.     ==================================================
  738.  
  739.     Place bit field declarations in the "Declarations and Intermediate 
  740.     Variable Definitions" section of the source file provided by the 
  741.     template file.  After assigning a variable name to a group of bits, 
  742.     the name can be used in an expression; the operation specified in 
  743.     the expression is applied to each bit in the group.  See the 
  744.     subtopic, Set Operations in this chapter for a description of the 
  745.     operations allowed for FIELD statements.  The example below shows 
  746.     two ways to reference the eight address input bits (A0 through A7) 
  747.     of an I/O decoder as the single variable named ADDRESS.
  748.  
  749.         FIELD ADDRESS = [A7,A6,A5,A4,A3,A2,A1,A0] ;
  750.  
  751.     or
  752.  
  753.         FIELD ADDRESS =         [A7..0] ;
  754.  
  755.     When a FIELD statement is used, the compiler generates a single 
  756.     32-bit field internally. This is used to represent the variables in 
  757.     the bit field.  Each bit represents one member of the bit field. The 
  758.     bit number which represents a member of a bit field is the same as 
  759.     the index number if indexed variables are used. This means that A0 
  760.     will always occupy bit 0 in the bitfield. This also means that the 
  761.     order of appearance of indexed variables in a bit field has no 
  762.     significance.  A bit field declared as [A0..7] is exactly the same 
  763.     as a bit field declared as [A7..0].  Because of this mechanism, 
  764.     different indexed variables should not be included in the same bit 
  765.     field.  A bit field containing A2 and B2 will assign both of these 
  766.     variables to the same bit position.  This will result in the 
  767.     generation of erroneous equations.  Also, bit fields should never 
  768.     contain both indexed and non-indexed variables.  This will almost 
  769.     certainly result in erroneous generation of equations.
  770.  
  771.    Note
  772.      ==================================================
  773.      Do not mix indexed and non-indexed variables in a 
  774.      field statement. The compiler may produce 
  775.      unexpected results.
  776.      ==================================================
  777.  
  778.  
  779. .c4.MIN Declaration Statements
  780.  
  781.     The MIN declaration statement overrides, for specified variables, 
  782.     the minimization level specified on the command line when running 
  783.     CUPL.  The format is as follows:
  784.  
  785.         MIN var [.ext] = level ;
  786.  
  787.         where
  788.  
  789.         MIN is a keyword to override the command line minimization 
  790.         level.
  791.  
  792.         var is a single variable declared in the file or a list of 
  793.         variables grouped using the list notation; that is,
  794.  
  795.         [var, var, ... var]
  796.  
  797.         .ext is an optional extension that identifies the function of 
  798.         the variable.
  799.  
  800.         level is an integer between 0 and 4.
  801.  
  802.         ; is a semicolon to mark the end of the statement.
  803.  
  804.     The levels 0 to 4 correspond to the option flags on the command 
  805.     line, -m0 through -m4.  The MIN declaration permits specifying 
  806.     different levels for different outputs in the same design, such as 
  807.     no reduction for outputs requiring redundant or contained product 
  808.     terms (to avoid asynchronous hazard conditions), and maximum 
  809.     reduction for a state machine application.  The following are 
  810.     examples of valid MIN declarations.
  811.  
  812.      MIN async_out    = 0;      /* no reduction  */
  813.      MIN [outa, outb] = 2;      /* level 2 reduction      */
  814.      MIN count.d      = 4;      /* level 4 reduction      */
  815.  
  816.     Note that the last declaration in the example above uses the .d 
  817.     extension to specify that the registered output variable is the one 
  818.     to be reduced.
  819.  
  820.  
  821. .c4.FUSE Statement
  822.  
  823.     The FUSE statement provides for special cases where it is necessary 
  824.     to blow TURBO or MISER bits.  This statement should be used with 
  825.     utmost care, as it can lead to unpredictable results if used 
  826.     incorrectly.
  827.  
  828.               FUSE (fusenumber, x)
  829.  
  830.         where 
  831.  
  832.     fusenumber is the fuse number corresponding to the MISER Bit or 
  833.     TURBO Bit that must be blown, and x is either 0 or 1. Specify 0 if 
  834.     the bit must not be blown. Specify 1 to blow the bit.  Use this 
  835.     statement with extreme caution.  In this example, fuse 101 is a 
  836.     MISER Bit or TURBO Bit.  This blows fuse number 101.  example:
  837.  
  838.               FUSE(101,1)
  839.  
  840.     DO NOT  ATTEMPT  TO  USE  THIS STATEMENT  TO  BLOW ARBITRARY FUSES!
  841.  
  842.     The fuse statement was designed to blow MISER bits and TURBO Bits 
  843.     only. The exact fuse number for the TURBO or MISER Bit must be 
  844.     specified. Every time this statement is used, CUPL will generate a 
  845.     warning.  This is a reminder to double check that the fuse number 
  846.     specified is correct. If a wrong fuse number is specified, 
  847.     disastrous results can occur.  Be very careful using this statement. 
  848.     If the FUSE statement is used in a design and strange results occur, 
  849.     check the fuse number specified and make sure that it is a MISER or 
  850.     TURBO Bit.
  851.  
  852.  
  853. o   .c3.Preprocessor Commands
  854.  
  855.     The preprocessor portion of CUPL operates on the source file before 
  856.     it is passed to the parser and other sections of the compiler.  The 
  857.     preprocessor commands add file inclusion, conditional compilation, 
  858.     and string substitution capabilities to the source processing 
  859.     features of CUPL.  Table 1-7 lists the available preprocessor 
  860.     commands.  Each command is described in detail in this section.
  861.  
  862.    Table 1-7.    Preprocessor Commands
  863.    -----------------
  864.         $DEFINE               
  865.         $IFDEF
  866.         $UNDEF
  867.         $ELSE      
  868.         $IFNDEF      
  869.         $REPEAT
  870.         $ENDIF 
  871.         $INCLUDE         
  872.         $REPEND
  873.         $MACRO 
  874.         $MEND
  875.    -----------------
  876.  
  877.     The dollar sign ($) is the first character in all preprocessor 
  878.     commands and must be used in column one of the line. Any combination 
  879.     of uppercase or lowercase letters may be used to type these 
  880.     commands.
  881.  
  882.  
  883. .c4.$DEFINE
  884.  
  885.     This command replaces a character string by another specified 
  886.     operator, number, or symbol.  The format is as follows:
  887.  
  888.         $DEFINE argument1 argument2
  889.  
  890.     where
  891.  
  892.         argument1 is a variable name or special ASCII character.
  893.  
  894.         argument2 is a valid operator, a number, or a variable name.
  895.  
  896.     "Argument1" is replaced by "argument2" at all locations in the 
  897.     source specification after the $DEFINE command is given (or until 
  898.     the preprocessor encounters an $UNDEF command).  The replacement is 
  899.     a literal string substitution made on the input file before being 
  900.     processed by the CUPL compiler. Note that no semicolon or equal sign 
  901.     is used for this command.  The $DEFINE command allows numbers or 
  902.     constants to be replaced with symbolic names, for example:
  903.  
  904.               $DEFINE   ON      'b'1
  905.               $DEFINE   OFF     'b'0
  906.               $DEFINE   PORTC   'h'3F0
  907.  
  908.     The $DEFINE command also allows creation of a personal set of 
  909.     logical operators.  For example, the following define an alternate 
  910.     set of operators for logic specification:
  911.  
  912.      $DEFINE    {    /*         Alternate Start Comment
  913.      $DEFINE    }    */         Alternate End Comment
  914.      $DEFINE    /    !          Alternate Negation
  915.      $DEFINE    *    &          Alternate AND
  916.      $DEFINE    +    #          Alternate OR
  917.      $DEFINE    :+:  $          Alternate XOR
  918.  
  919.    Note
  920.      ==================================================
  921.      The above definitions are contained in  the   
  922.      PALASM.OPR   file included with the CUPL 
  923.      software package. This file may be included 
  924.      in the source  file  (see    $INCLUDE    
  925.      command) to allow logic  equations  using 
  926.      the PALASM  set  of  logical  operator 
  927.      symbols, as well  as  the standard    CUPL     
  928.      operator symbols.
  929.      ==================================================
  930.  
  931.  
  932. .c4.$UNDEF
  933.  
  934.     This command reverses a $DEFINE command. The format is as follows:  
  935.     $UNDEF argument
  936.  
  937.     where
  938.  
  939.         argument is an argument previously used in a $DEFINE command.
  940.  
  941.     Before redefining a character string or symbol defined with the 
  942.     $DEFINE command, use the $UNDEF command to undo the previous 
  943.     definition.
  944.  
  945.  
  946. .c4.$INCLUDE
  947.  
  948.     This command includes a specified file in the source to be processed 
  949.     by CUPL.  The format is as follows:
  950.  
  951.         $INCLUDE filename
  952.  
  953.     where
  954.  
  955.         filename is the name of a file in the current directory.
  956.  
  957.     File inclusion allows standardizing a portion of a commonly used 
  958.     specification. It is also useful for keeping a separate parameter 
  959.     file that defines constants that are commonly used in many source 
  960.     specifications. The files that are included may also contain 
  961.     $INCLUDE commands, allowing for "nested" include files. The named 
  962.     file is included at the location of the $INCLUDE command.  For 
  963.     example, the following command includes the PALASM.OPR file in a 
  964.     source file.
  965.  
  966.         $INCLUDE PALASM.OPR
  967.  
  968.     PALASM.OPR is included with the CUPL software and contains $DEFINE 
  969.     commands that specify the following alternate set of logical 
  970.     operators.
  971.  
  972.    $DEFINE / ! Alternate Negation
  973.    $DEFINE * & Alternate AND
  974.    $DEFINE + # Alternate OR
  975.    $DEFINE :+:  $ Alternate XOR
  976.    $DEFINE { /* Alternate Start Comment
  977.    $DEFINE } */ Alternate End Comment
  978.  
  979.  
  980. .c4.$IFDEF
  981.  
  982.     This command conditionally compiles sections of a source file. The 
  983.     format is as follows:
  984.  
  985.         $IFDEF argument
  986.  
  987.     where
  988.  
  989.         argument may or may not have previously been defined with a 
  990.         $DEFINE command.
  991.  
  992.     When the argument has previously been defined, the source statements 
  993.     following the $IFDEF command are compiled until the occurrence of an 
  994.     $ELSE or $ENDIF command.
  995.  
  996.     When the argument has not previously been defined, the source 
  997.     statements following the $IFDEF command are ignored.  No additional 
  998.     source statements are compiled until the occurrence of an $ELSE or 
  999.     $ENDIF command.
  1000.  
  1001.     One use of $IFDEF is to temporarily remove source equations 
  1002.     containing comments from the file.  It is not possible to "comment 
  1003.     out" the equations because comments do not nest. The following 
  1004.     example illustrates this technique. NEVER is an undefined argument.
  1005.  
  1006.         $IFDEF NEVER 
  1007.         out1=in1 & in2;         /* A Simple AND         Function */
  1008.         out2=in3 # in4;         /* A Simple OR         Function */
  1009.         $ENDIF
  1010.  
  1011.     Because NEVER is undefined, the equations are ignored during 
  1012.     compilation; that is, they function as comments.
  1013.  
  1014.  
  1015. .c4.$IFNDEF
  1016.  
  1017.     This command sets conditions for compiling sections of  the  source  
  1018.     file.
  1019.  
  1020.         $IFNDEF argument
  1021.  
  1022.     where
  1023.  
  1024.         argument may or may not have previously been defined with a 
  1025.         $DEFINE command.
  1026.  
  1027.     The $IFNDEF command works in the opposite manner of the $IFDEF 
  1028.     command. When the argument has not previously been defined, the 
  1029.     source statements following the $IFNDEF command are compiled until 
  1030.     the occurrence of an $ELSE or $ENDIF command.
  1031.  
  1032.     If the argument has previously been defined, the source statements 
  1033.     following the $IFNDEF command are ignored.  No additional source 
  1034.     statements are compiled until the occurrence of an $ELSE or $ENDIF 
  1035.     command.
  1036.  
  1037.     One use of $IFNDEF is to create a single source file containing two 
  1038.     mutually exclusive sets of equations.  Using an $IFNDEF and $ENDIF 
  1039.     command to set off one of the sets of equations, quick toggling is 
  1040.     possible between the two sets of equations by defining or not 
  1041.     defining the argument specified in the $IFNDEF command.
  1042.  
  1043.     For example, some devices contain common output enable pins that 
  1044.     directly control all the tri-state buffers, whereas other devices 
  1045.     contain single product terms to enable each tri-state buffer 
  1046.     individually.  In the following example, the argument, COMMON_OE has 
  1047.     not been defined, so the equations that follow are compiled. Any 
  1048.     equations following $ENDIF are not compiled.
  1049.  
  1050.     $IFNDEF   COMMON_OE
  1051.     pin 11                        = !enable;       /* input pin for OE*/
  1052.     [q3,q2,q1,q0].oe              = enable;        /* assign tri-state*/
  1053.                                
  1054.     /* equation for 4*/
  1055.                                
  1056.     /* outputs       */
  1057.     $ENDIF
  1058.  
  1059.     If the device has common output enables, no equations are required 
  1060.     to describe it.  Therefore, in the above example, for a device with 
  1061.     common output enables, define COMMON_OE so the compiler skips the 
  1062.     equations between $IFNDEF and $ENDIF.
  1063.  
  1064.  
  1065. .c4.$ENDIF
  1066.  
  1067.     This command ends a conditional compilation started with the $IFDEF 
  1068.     or $IFNDEF commands. The format is as follows:
  1069.  
  1070.         $ENDIF
  1071.  
  1072.     The statements following the $ENDIF command are compiled in the same 
  1073.     way as the statements preceding the $IFDEF or $IFNDEF commands. 
  1074.     Conditional compilation may be nested, and for each level of nesting 
  1075.     of the $IFDEF or $IFNDEF command, an associated $ENDIF must be used.  
  1076.     The following example illustrates the use of $ENDIF with multiple 
  1077.     levels of nesting.
  1078.  
  1079.         $IFDEF         prototype_1
  1080.           pin 1         = set;         /* Set on pin 1     */
  1081.           pin 2         = reset;       /* Reset on pin 2   */
  1082.         $IFDEF         prototype_2
  1083.           pin 3         = enable;      /* Enable on pin 3  */
  1084.           pin 4         = disable;     /* Disable on pin 4 */
  1085.         $ENDIF
  1086.           pin 5         = run;         /* Run on pin 5     */
  1087.           pin 6         = halt;        /* Halt on pin 6    */
  1088.         $ENDIF    
  1089.  
  1090.  
  1091. .c4.$ELSE
  1092.  
  1093.     This command reverses the state of conditional compilation as 
  1094.     defined with $IFDEF or $IFNDEF.  The format is as follows:
  1095.  
  1096.         $ELSE
  1097.  
  1098.     If the tested condition of the $IFDEF or $IFNDEF commands is true 
  1099.     (that is, the statements following the command are compiled), then 
  1100.     any source statements between an $ELSE and $ENDIF command are 
  1101.     ignored. 
  1102.  
  1103.     If the tested condition is false, then any source statements between 
  1104.     the $IFDEF or $IFNDEF and $ELSE command are ignored, and statements 
  1105.     following $ELSE are compiled.
  1106.  
  1107.     For example, many times the production printed circuit board uses a 
  1108.     different pinout than does the wire-wrap prototype.  In the 
  1109.     following example, since Prototype has been defined, the source 
  1110.     statements following $IFDEF are compiled and the statements 
  1111.     following $ELSE are ignored.
  1112.  
  1113.      $DEFINE Prototype X                  /* define Prototype*/
  1114.      $IFDEF Prototype
  1115.      pin 1               = memreq;        /* memory request on */
  1116.                                           /* pin 1 of prototype*/
  1117.      pin 2               = ioreq;         /* I/O request on */
  1118.                                           /* pin 2 of prototype*/
  1119.      $ELSE
  1120.      pin 1               = ioreq;         /* I/O request on*/
  1121.                                           /* pin 1 of PCB*/
  1122.      pin 2               = memreq;        /* memory request on */
  1123.                                           /* pin 2 of PCB*/
  1124.      $ENDIF
  1125.  
  1126.     To compile the statements following $ELSE, remove the definition of 
  1127.     Prototype.
  1128.  
  1129.  
  1130. .c4.$REPEAT
  1131.  
  1132.     This command is similar to the FOR statement in C language 
  1133.     and DO statements in FORTRAN language.  It allows the 
  1134.     user to duplicate repeat body by index. The format is as 
  1135.     follows:
  1136.  
  1137.         $REPEAT index=[number1,number2,...,numbern] 
  1138.           repeat body
  1139.         $REPEND
  1140.  
  1141.     where n can be any number in the range 0 to 1023 In preprocessing, 
  1142.     the repeat body will be duplicated from number1 to numbern.  The 
  1143.     index number can be written in short form as [number1..numbern] if 
  1144.     the number is consecutive.  The repeat body can be any CUPL 
  1145.     statement.  Arithmetic operations can be performed in the repeat 
  1146.     body.  The arithmetic expression must be enclosed by braces { }.
  1147.  
  1148.         For example, design a three to eight decoder.
  1149.  
  1150.         FIELD sel = [in2..0]
  1151.         $REPEAT i = [0..7] 
  1152.         !out{i} = sel:'h'{i} & enable;
  1153.         $REPEND
  1154.  
  1155.     Where index variable i goes from 0 to 7, so the statement 
  1156.     "out{i} = sel:'h'{i} &enable;" will be repeated during 
  1157.     preprocessing and create the following statements:
  1158.  
  1159.         FIELD sel = [in2..0]; 
  1160.         !out0 = sel:'h'0 & enable; 
  1161.         !out1 = sel:'h'1 & enable; 
  1162.         !out2 = sel:'h'2 & enable; 
  1163.         !out3 = sel:'h'3 & enable; 
  1164.         !out4 = sel:'h'4 & enable; 
  1165.         !out5 = sel:'h'5 & enable; 
  1166.         !out6 = sel:'h'6 & enable; 
  1167.         !out7 = sel:'h'7 & enable;
  1168.  
  1169.     The following example shows how the arithmetic operation addition 
  1170.     (+) and modulus (%) are used in the repeat body.
  1171.  
  1172.     /* Design a five bit counter with a control signal advance.If 
  1173.        advance is high, counter is increased by one.*/
  1174.  
  1175.         FIELD         count[out4..0].i.sequence;
  1176.         SEQUENCE count {
  1177.         $REPEAT i = [0..31] 
  1178.         PRESENT S{i} 
  1179.           IF advance & !reset NEXT S{(i+1)%(32)}; 
  1180.           IF reset NEXT S{0}; 
  1181.           DEFAULT NEXT S{i};
  1182.         $REPEND
  1183.         }
  1184.  
  1185.  
  1186. .c4.$REPEND
  1187.  
  1188.     This command ends a repeat body that was started with $REPEAT. The 
  1189.     format is as follows:  $REPEND
  1190.  
  1191.     The statements following the $REPEND command are compiled in the 
  1192.     same way as the statements preceding the $REPEAT command. For each 
  1193.     $REPEAT command, an associated $REPEND command must be used.
  1194.  
  1195.  
  1196. .c4.$MACRO
  1197.  
  1198.     This command creates user-defined macros. The format is as follows:
  1199.  
  1200.         $MACRO name argument1 argument2...argumentn 
  1201.         macro function body
  1202.         $MEND
  1203.  
  1204.     The macro function body will not be compiled until the macro name is 
  1205.     called. The function is called by stating function name and passing 
  1206.     the parameters to the function.
  1207.  
  1208.     Like the $REPEAT command, the arithmetic operation can be used 
  1209.     inside the macro function body and must be enclosed in braces.
  1210.  
  1211.     The following example illustrates how to use the $MACRO command.  
  1212.     Use the $MACRO command to define a decoder function with an 
  1213.     arbitrary number of bits.  This example places the macro definition 
  1214.     and call in the same file.
  1215.  
  1216.      $MACRO decoder bits MY_X MY_Y MY_enable; 
  1217.      FIELD select = [MY_Y{bits-1}..0]; 
  1218.      $REPEAT i = [0..{2**(bits-1)}] 
  1219.  
  1220.      !MY_X{i} = select:'h'{i} & MY_enable; 
  1221.      $REPEND
  1222.      $MEND
  1223.         /* Other statements */
  1224.      decoder(3, out, in, enable); /* macro invocation */
  1225.  
  1226.     Calling function decoder will create the following statements by 
  1227.     macro expansion.
  1228.  
  1229.         FIELD sel = [in2..0]; 
  1230.         !out0 = sel:'h'0 & enable; 
  1231.         !out1 = sel:'h'1 & enable; 
  1232.         !out2 = sel:'h'2 & enable; 
  1233.         !out3 = sel:'h'3 & enable; 
  1234.         !out4 = sel:'h'4 & enable; 
  1235.         !out5 = sel:'h'5 & enable; 
  1236.         !out6 = sel:'h'6 & enable; 
  1237.         !out7 = sel:'h'7 & enable;
  1238.  
  1239.     When macros are called, the keyword NC is used to represent no 
  1240.     connection. Because NC is a keyword, the letters NC should not be 
  1241.     used as a variable elsewhere in CUPL.
  1242.  
  1243.     A macro expansion file can be created by using the -e flad when 
  1244.     compiling the PLD file.  CUPL will create an expanded macro file 
  1245.     with the same name as the PLD file, with the extension ".mx".
  1246.  
  1247.     The macro definition can be stored in a separate file with a ".m" 
  1248.     extension.  Using the $INCLUDE command, specify the file. All the 
  1249.     macro functions in that file will then be accessible.  The following 
  1250.     example shows the macro definition and calling statement stored in 
  1251.     different files.  The macro definition of decoder is stored in the 
  1252.     file "macrolib.m"
  1253.  
  1254.      $INCLUDE macrolib.m 
  1255.         /*specify the macro library */
  1256.         /* other statements */
  1257.         decoder(4, out, in, enable);
  1258.         /* other statements */
  1259.  
  1260.     More examples can be found in the example files provided on 
  1261.     diskette.
  1262.  
  1263.  
  1264. .c4.$MEND
  1265.  
  1266.     This command ends a macro function body started with $MACRO. The 
  1267.     format is as follows:  $MEND
  1268.  
  1269.     The statements following the $MEND command are compiled in the same 
  1270.     way as the statements preceding the $MACRO command. For each $MACRO 
  1271.     command, an associated $MEND command.must be used.
  1272.  
  1273.  
  1274. o   .c2.LANGUAGE SYNTAX
  1275.  
  1276.     This section describes the CUPL language syntax. It explains how to 
  1277.     use logic equations, truth tables, state machine syntax, condition 
  1278.     syntax and user-defined functions to create a PLD design.
  1279.  
  1280.  
  1281. o  .c3.Logical Operators
  1282.  
  1283.     CUPL supports the four standard logical operators used for boolean 
  1284.     expressions. Table 1-8 lists these operators and their order of 
  1285.     precedence, from highest to lowest.
  1286.  
  1287.     Table 1-8. Precedence of Logical Operators
  1288.     Operator    Example     Description       Precedence
  1289.       !          !A            NOT                1                    
  1290.       &          A & B         AND                2    
  1291.       #          A # B         OR                 3
  1292.       $          A $ B         XOR                4
  1293.  
  1294.     The truth tables in Figure 1-5 list the Boolean Logic rules for each 
  1295.     operator.
  1296.  
  1297.     -----------------------------------------------------------------
  1298.         AND          OR         XOR      NOT
  1299.        ------     ------      ------    -----
  1300.        00 | 0     00 | 0      00 | 0    0 | 1
  1301.        01 | 0     01 | 1      01 | 1    1 | 0
  1302.        10 | 0     10 | 1      10 | 1
  1303.        11 | 1     11 | 1      11 | 0
  1304.  
  1305.     -----------------------------------------------------------------
  1306.         Figure 1-5. Truth Tables
  1307.  
  1308.  
  1309. o  .c3.Arithmetic Operators
  1310.  
  1311.     CUPL supports six standard arithmetic operators used for arithmetic 
  1312.     expressions. The arithmetic expressions can only be used in the 
  1313.     $REPEAT and $MACRO commands.  Arithmetic expressions must appear in 
  1314.     braces { }. Table 1-9 lists these operators and their order of 
  1315.     precedence, from highest to lowest.
  1316.  
  1317.              Table 1-9 Precedence of Arithmetic Operators
  1318.     -----------------------------------------------------------------
  1319.      Operator      Example      Description      Precedence
  1320.         **      2**3            Exponentiation          1         
  1321.         *       2*i             Multiplication          2         
  1322.         /       4/2             Division                2
  1323.         %       9%8             Modulus                 2         
  1324.         +       2+4             Addition                3
  1325.         -       4-i             Subtraction             3
  1326.     -----------------------------------------------------------------
  1327.  
  1328. o   .c3.Arithmetic Function
  1329.     CUPL supports one arithmetic function used for arithmetic 
  1330.     expressions.  The arithmetic expressions can only be used in the 
  1331.     $REPEAT and $MACRO commands.  Table 1-10 lists the function.
  1332.  
  1333.     Table  1-10   Arithmetic Function
  1334.         Function          Base
  1335.         LOG2            Binary
  1336.         LOG8            Octal
  1337.         LOG16           Hexadecimal
  1338.         LOG             Decimal
  1339.  
  1340.     The LOG function returns an integer value.  For example:
  1341.  
  1342.          LOG2(32) = 5 <==> 2**5 = 32
  1343.          LOG2(33) = ceil(5.0444) = 6 <==> 2**6 = 64 
  1344.  
  1345.         Ceil(x) returns the smallest integer not less than x.
  1346.  
  1347.  
  1348. o    .c3.Extensions
  1349.  
  1350.     Extensions can be added to variable names to indicate specific 
  1351.     functions associated with the major nodes inside a programmable 
  1352.     device, including such capabilities as flip-flop description and 
  1353.     programmable three-state enables. Table 1-11 lists the extensions 
  1354.     that are supported by CUPL and on which side of the equal sign (=) 
  1355.     they are used.  The compiler checks the usage of the extension to 
  1356.     determine whether it is valid for the specified device and whether 
  1357.     its usage conflicts with some other extension used.  
  1358.  
  1359.     Table 1-11 Extensions
  1360.  
  1361.     Extension    Side   Description
  1362.                  Used
  1363.  
  1364.     .AP          L      Asynchronous preset of flip-flop
  1365.  
  1366.     .AR          L      Asynchronous reset of flip-flop
  1367.  
  1368.     .APMUX       L      Asynchronous preset multiplexer selection
  1369.  
  1370.     .ARMUX       L      Asynchronous reset multiplexer selection
  1371.  
  1372.     .BYP         L      Programmable register bypass
  1373.  
  1374.     .CA          L      Complement array
  1375.  
  1376.     .CE          L      CE input of enabled D-CE type flip-flop
  1377.  
  1378.     .CK          L      Programmable clock of flip-flop
  1379.  
  1380.     .CKMUX       L      Clock multiplexer selection
  1381.  
  1382.     .D           L      D input of D-type flip-flop
  1383.  
  1384.     .DFB         R      D registered feedback path selection
  1385.  
  1386.     .DQ          R      Q output of D-type flip-flop
  1387.  
  1388.     .IMUX        L      Input multiplexer selection of two pins
  1389.  
  1390.     .INT         R      Internal feedback path for registered macrocell
  1391.  
  1392.     .IO          R      Pin feedback path selection
  1393.  
  1394.     .IOAR        L      Asynchronous reset for pin feedback register
  1395.  
  1396.     .IOAP        L      Asynchronous preset for pin feedback register
  1397.  
  1398.     .IOCK        L      Clock for pin feedback register
  1399.  
  1400.     .IOD         R      Pin feedback path through D register
  1401.  
  1402.     .IOL         R      Pin feedback path through latch
  1403.  
  1404.     .IOSP        L      Synchronous preset for pin feedback register
  1405.  
  1406.     .IOSR        L      Synchronous reset for pin feedback register
  1407.  
  1408.     .J           L      J input of JK-type output flip-flop
  1409.  
  1410.     .K           L      K input of JK-type output flip-flop
  1411.  
  1412.     .L           L      D input of transparent latch
  1413.  
  1414.     .LE          L      Programmable latch enable
  1415.  
  1416.     .LEMUX       L      Latch enable multiplexer selection
  1417.  
  1418.     .LFB         R      Latched feedback path selection
  1419.  
  1420.     .LQ          R      Q output of transparent input latch
  1421.  
  1422.     .OBS         L      Programmable observability of buried nodes
  1423.  
  1424.     .OE          L      Programmable output enable
  1425.  
  1426.     .OEMUX       L      Tri-state multiplexer selection
  1427.  
  1428.     .PR          L      Programmable preload
  1429.  
  1430.     .R           L      R input of SR-type output flip-flop
  1431.  
  1432.     .S           L      S input of SR-type output flip-flop
  1433.  
  1434.     .SP          L      Synchronous preset of flip-flop
  1435.  
  1436.     .SR          L      Synchronous reset of flip-flop
  1437.  
  1438.     .T           L      T input of toggle output flip-flop
  1439.  
  1440.     .TEC         L      Technology-dependent fuse selection
  1441.  
  1442.     .TFB         R      T registered feedback path selection
  1443.  
  1444.     .T1          L      T1 input of 2-T flip-flop
  1445.  
  1446.     .T2          L      T2 input of 2-T flip-flop
  1447.  
  1448.     Each extension provides access to a specific function. For example, 
  1449.     to specify an equation for output enable (on a device that has the 
  1450.     capability) use the .OE extension. The equation will look as 
  1451.     follows:
  1452.  
  1453.         PIN 2 = A;
  1454.         PIN 3 = B;
  1455.         PIN 4 = C;
  1456.         PIN 15 = VARNAME;
  1457.         VARNAME.OE = A & B;
  1458.  
  1459.     Note that the compiler supports only the flip-flop capabilities that 
  1460.     are physically implemented in the device. For example, the compiler 
  1461.     does not attempt to emulate a JK-type flip-flop in a device that 
  1462.     only has D-type registers. Any attempt to use capabilities not 
  1463.     present in a device will cause the compiler to report an error.
  1464.  
  1465.     For those devices containing bi-directional I/O pins with 
  1466.     programmable output enables, CUPL automatically generates the output 
  1467.     enable expression according to the usage of the pin. If the variable 
  1468.     name is used on the left side of an equation, the pin is assumed to 
  1469.     be an output and is assigned binary value 1; that is, the output 
  1470.     enable expression is defaulted to the following:
  1471.  
  1472.         PIN_NAME.OE = 'b'1;  /* Tri-state buffer always ON */
  1473.  
  1474.     Those pins that are used only as inputs (that is, the variable name 
  1475.     appears only on the right side of an equation) are assigned binary 
  1476.     value 0; the output enable expression is defaulted to the following:
  1477.  
  1478.         PIN_NAME.OE = 'b'0;  /* Tri-state buffer Always OFF  */
  1479.  
  1480.     When the I/O pin is to be used as both an input and output, any new 
  1481.     output enable expression that the user specifies overrides the 
  1482.     default to enable the tri-state buffer at the desired time.
  1483.  
  1484.     When using a JK or SR-type flip-flop, an equation must be written 
  1485.     for both the J and K (or S and R) inputs.  If the design does not 
  1486.     require an equation for one of the inputs, use the following 
  1487.     construct to turn off the input:
  1488.  
  1489.         COUNT0.J='b'0 ; /* J input not used */
  1490.  
  1491.     Control functions such as asynchronous resets and presets are 
  1492.     commonly connected to a group (or all) of the registers in a device. 
  1493.     When an equation is written for one of these control functions, it 
  1494.     is actually being written for all of the registers in the group.  
  1495.     For documentation purposes, CUPL checks for the presence of such an 
  1496.     equation for each register in the group and generates a warning 
  1497.     message for any member of the group that does not have an identical 
  1498.     equation.  If all the control functions for a given group are 
  1499.     defined with different equations, the compiler will generate an 
  1500.     error since it cannot decide which equation is the correct one. 
  1501.     Remember that this is a device specific issue and it is a good idea 
  1502.     to understand the capability of the device being used.
  1503.  
  1504.     Figure 1-6 shows the use of extensions.  Note that this figure does 
  1505.     not represent an actual circuit, but shows how to use extensions to 
  1506.     write equations for different functions in a circuit.
  1507.  
  1508.                     [Picture]
  1509.      Figure 1-6. Circuit Illustrating Extensions
  1510.  
  1511.     The figure shows an equation with a .D extension that has been 
  1512.     written for the output to specify it as a registered output. Note 
  1513.     that when feedback (OUT_VAR) is used in an equation, it does not 
  1514.     have an extension.
  1515.  
  1516.         Note
  1517.         ==================================================
  1518.         The .DQ extension is used for input pins only.
  1519.         ==================================================
  1520.  
  1521.     Additional equations can be written to specify other types of 
  1522.     controls and control points. For example, an equation for the output 
  1523.     enable can be written as follows:
  1524.  
  1525.         OUT_VAR.OE = IN_VAR1 # IN_VAR2
  1526.  
  1527.