vrq
/usr/src/RPM/BUILD/vrq-1.0.96/src/cnode_def.h
Go to the documentation of this file.
00001 
00002 
00003 
00004 /*****************************************************************************
00005  * Copyright (C) 1997-2009, Mark Hummel
00006  * This file is part of Vrq.
00007  *
00008  * Vrq is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2 of the License, or (at your option) any later version.
00012  *
00013  * Vrq is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
00021  * Boston, MA  02110-1301  USA
00022  *****************************************************************************
00023  */
00024 
00025 
00026 /*********************************************************
00027  *   Warning: This file is machine generate, do not edit
00028  ********************************************************/
00029 
00610 #ifdef DEFINE_ENUM
00611 
00614 enum NodeOp_t {
00618     /*
00619      * ERROR node
00620      * Description: error node
00621      * Number Of Arguments: 0
00622      */
00623     eERROR,
00627     /*
00628      * VCONSTANT node
00629      * Description: vector constant
00630      * Number Of Arguments: 1
00631      * arg0: CVector* Pointer to vector
00632      */
00633     eVCONSTANT,
00637     /*
00638      * RCONSTANT node
00639      * Description: real constant
00640      * Number Of Arguments: 1
00641      * arg0: char* Pointer to string
00642      */
00643     eRCONSTANT,
00647     /*
00648      * COMMENT node
00649      * Description: comment
00650      * Number Of Arguments: 1
00651      * arg0: const char* Pointer to string
00652      */
00653     eCOMMENT,
00657     /*
00658      * VRQ node
00659      * Description: vrq comment
00660      * Number Of Arguments: 1
00661      * arg0: const char* Pointer to string
00662      */
00663     eVRQ,
00667     /*
00668      * PRAGMA node
00669      * Description: program pragma
00670      * Number Of Arguments: 1
00671      * arg0: const char* Pointer to string
00672      */
00673     ePRAGMA,
00677     /*
00678      * ELIST node
00679      * Description: expression list
00680      * Number Of Arguments: 2
00681      * arg0: CNode* expression1
00682      * arg1: CNode* expression2
00683      */
00684     eELIST,
00688     /*
00689      * WIDTH node
00690      * Description: expression width change
00691      * Number Of Arguments: 2
00692      * arg0: CNode* width expression
00693      * arg1: CNode* expression
00694      */
00695     eWIDTH,
00699     /*
00700      * NOP node
00701      * Description: no operation
00702      * Number Of Arguments: 0
00703      */
00704     eNOP,
00708     /*
00709      * SUB node
00710      * Description: subtract
00711      * Number Of Arguments: 2
00712      * arg0: CNode* expression 1
00713      * arg1: CNode* expression 2
00714      */
00715     eSUB,
00719     /*
00720      * MUL node
00721      * Description: multiply
00722      * Number Of Arguments: 2
00723      * arg0: CNode* expression 1
00724      * arg1: CNode* expression 2
00725      */
00726     eMUL,
00730     /*
00731      * DIV node
00732      * Description: divide
00733      * Number Of Arguments: 2
00734      * arg0: CNode* expression 1
00735      * arg1: CNode* expression 2
00736      */
00737     eDIV,
00741     /*
00742      * POW node
00743      * Description: exponent
00744      * Number Of Arguments: 2
00745      * arg0: CNode* expression 1
00746      * arg1: CNode* expression 2
00747      */
00748     ePOW,
00752     /*
00753      * ADD node
00754      * Description: addition
00755      * Number Of Arguments: 2
00756      * arg0: CNode* expression 1
00757      * arg1: CNode* expression 2
00758      */
00759     eADD,
00763     /*
00764      * LSH node
00765      * Description: logical left shift
00766      * Number Of Arguments: 2
00767      * arg0: CNode* expression 1
00768      * arg1: CNode* expression 2
00769      */
00770     eLSH,
00774     /*
00775      * RSH node
00776      * Description: logical right shift
00777      * Number Of Arguments: 2
00778      * arg0: CNode* expression 1
00779      * arg1: CNode* expression 2
00780      */
00781     eRSH,
00785     /*
00786      * LSHA node
00787      * Description: arithmetic left shift
00788      * Number Of Arguments: 2
00789      * arg0: CNode* expression 1
00790      * arg1: CNode* expression 2
00791      */
00792     eLSHA,
00796     /*
00797      * RSHA node
00798      * Description: arithmetic right shift
00799      * Number Of Arguments: 2
00800      * arg0: CNode* expression 1
00801      * arg1: CNode* expression 2
00802      */
00803     eRSHA,
00807     /*
00808      * MOD node
00809      * Description: modulus
00810      * Number Of Arguments: 2
00811      * arg0: CNode* expression 1
00812      * arg1: CNode* expression 2
00813      */
00814     eMOD,
00818     /*
00819      * OR node
00820      * Description: bitwise or
00821      * Number Of Arguments: 2
00822      * arg0: CNode* expression 1
00823      * arg1: CNode* expression 2
00824      */
00825     eOR,
00829     /*
00830      * AND node
00831      * Description: bitwise and
00832      * Number Of Arguments: 2
00833      * arg0: CNode* expression 1
00834      * arg1: CNode* expression 2
00835      */
00836     eAND,
00840     /*
00841      * ANDANDAND node
00842      * Description: triple and
00843      * Number Of Arguments: 2
00844      * arg0: CNode* expression 1
00845      * arg1: CNode* expression 2
00846      */
00847     eANDANDAND,
00851     /*
00852      * XOR node
00853      * Description: bitwise xor
00854      * Number Of Arguments: 2
00855      * arg0: CNode* expression 1
00856      * arg1: CNode* expression 2
00857      */
00858     eXOR,
00862     /*
00863      * XNOR node
00864      * Description: bitwise xnor
00865      * Number Of Arguments: 2
00866      * arg0: CNode* expression 1
00867      * arg1: CNode* expression 2
00868      */
00869     eXNOR,
00873     /*
00874      * INSTANCE_REF node
00875      * Description: instance reference
00876      * Number Of Arguments: 1
00877      * arg0: CInstance* Pointer to a instance
00878      */
00879     eINSTANCE_REF,
00883     /*
00884      * GATE_REF node
00885      * Description: gate instance
00886      * Number Of Arguments: 1
00887      * arg0: CGate* Pointer to a gate
00888      */
00889     eGATE_REF,
00893     /*
00894      * TASK_ENABLE node
00895      * Description: call to a task
00896      * Number Of Arguments: 2
00897      * arg0: CSymbol* Pointer to symbol for task to call
00898      * arg1: CNode* Argument expression list
00899      */
00900     eTASK_ENABLE,
00904     /*
00905      * SYSTASK_CALL node
00906      * Description: call to enable a systask
00907      * Number Of Arguments: 2
00908      * arg0: CSymbol* Pointer to symbol for systask to call
00909      * arg1: CNode* Argument expression list
00910      */
00911     eSYSTASK_CALL,
00915     /*
00916      * TIMING_CALL node
00917      * Description: call to a timing task
00918      * Number Of Arguments: 2
00919      * arg0: CSymbol* Pointer to symbol of timing task
00920      * arg1: CNode* Argument expression list
00921      */
00922     eTIMING_CALL,
00926     /*
00927      * FUNCTION_CALL node
00928      * Description: call to a function
00929      * Number Of Arguments: 3
00930      * arg0: CSymbol* Pointer to symbol of the function
00931      * arg1: CNode* Argument expression list
00932      * arg2: CScope* Scope containing expression
00933      */
00934     eFUNCTION_CALL,
00938     /*
00939      * ARRAY node
00940      * Description: dimensioned reference (array/bit select)
00941      * Number Of Arguments: 2
00942      * arg0: CNode* Reference to variable
00943      * arg1: CNode* List of index expressions
00944      */
00945     eARRAY,
00949     /*
00950      * NET_REF node
00951      * Description: reference to net
00952      * Number Of Arguments: 1
00953      * arg0: CNet* Pointer to net
00954      */
00955     eNET_REF,
00959     /*
00960      * VAR_REF node
00961      * Description: reference to variable
00962      * Number Of Arguments: 1
00963      * arg0: CVar* Pointer to variable
00964      */
00965     eVAR_REF,
00969     /*
00970      * PARAM_REF node
00971      * Description: reference to parameter
00972      * Number Of Arguments: 1
00973      * arg0: CParam* Pointer to parameter
00974      */
00975     ePARAM_REF,
00979     /*
00980      * PORT_REF node
00981      * Description: reference to port
00982      * Number Of Arguments: 1
00983      * arg0: CPortDir* Pointer to port
00984      */
00985     ePORT_REF,
00989     /*
00990      * FWD_REF node
00991      * Description: reference to a forward declared variable
00992      * Number Of Arguments: 1
00993      * arg0: CFref* Pointer to forward declared variable
00994      */
00995     eFWD_REF,
00999     /*
01000      * GENVAR_REF node
01001      * Description: reference to a genvar
01002      * Number Of Arguments: 1
01003      * arg0: CGenvar* Pointer to a genvar
01004      */
01005     eGENVAR_REF,
01009     /*
01010      * ENUM_REF node
01011      * Description: reference to a enum
01012      * Number Of Arguments: 1
01013      * arg0: CEnum* Pointer to a enum
01014      */
01015     eENUM_REF,
01019     /*
01020      * TYPE_REF node
01021      * Description: reference to a type
01022      * Number Of Arguments: 1
01023      * arg0: CTypedef* Pointer to a typedef
01024      */
01025     eTYPE_REF,
01029     /*
01030      * NET_DECL node
01031      * Description: net declaration
01032      * Number Of Arguments: 2
01033      * arg0: CNet* Pointer to a net
01034      * arg1: CNode* continous assignment (optional)
01035      */
01036     eNET_DECL,
01040     /*
01041      * VAR_DECL node
01042      * Description: variable declaration
01043      * Number Of Arguments: 2
01044      * arg0: CVar* Pointer to a variable
01045      * arg1: CNode* procedural assignment (optional)
01046      */
01047     eVAR_DECL,
01051     /*
01052      * PARAM_DECL node
01053      * Description: parameter declaration
01054      * Number Of Arguments: 1
01055      * arg0: CParam* Pointer to a parameter
01056      */
01057     ePARAM_DECL,
01061     /*
01062      * SPECPARAM_DECL node
01063      * Description: specify parameter declaration
01064      * Number Of Arguments: 1
01065      * arg0: CParam* Pointer to a specify parameter
01066      */
01067     eSPECPARAM_DECL,
01071     /*
01072      * PORT_DECL node
01073      * Description: port declaration
01074      * Number Of Arguments: 1
01075      * arg0: CPortDir* Pointer to a port
01076      */
01077     ePORT_DECL,
01081     /*
01082      * GENVAR_DECL node
01083      * Description: genvar declaration
01084      * Number Of Arguments: 1
01085      * arg0: CGenvar* Pointer to a genvar
01086      */
01087     eGENVAR_DECL,
01091     /*
01092      * TYPEDEF_DECL node
01093      * Description: type declaration
01094      * Number Of Arguments: 1
01095      * arg0: CTypedef* Pointer to a typedef
01096      */
01097     eTYPEDEF_DECL,
01101     /*
01102      * LIST node
01103      * Description: list of nodes
01104      * Number Of Arguments: 2
01105      * arg0: CNode* node 1
01106      * arg1: CNode* node 2
01107      */
01108     eLIST,
01112     /*
01113      * RANGE node
01114      * Description: vector decl range specification
01115      * Number Of Arguments: 2
01116      * arg0: CNode* msb expression, if lsb is null range is msb-1:0
01117      * arg1: CNode* lsb expression, if NULL range is msb-1:0
01118      */
01119     eRANGE,
01123     /*
01124      * SLICE node
01125      * Description: vector subrange
01126      * Number Of Arguments: 2
01127      * arg0: CNode* msb expression
01128      * arg1: CNode* lsb expression
01129      */
01130     eSLICE,
01134     /*
01135      * PSLICE node
01136      * Description: vector subrange with ascending index select
01137      * Number Of Arguments: 2
01138      * arg0: CNode* index expression
01139      * arg1: CNode* width expression
01140      */
01141     ePSLICE,
01145     /*
01146      * MSLICE node
01147      * Description: vector subrange with descending index select
01148      * Number Of Arguments: 2
01149      * arg0: CNode* index expression
01150      * arg1: CNode* width expression
01151      */
01152     eMSLICE,
01156     /*
01157      * CVRI node
01158      * Description: convert real to integer
01159      * Number Of Arguments: 1
01160      * arg0: CNode* expression
01161      */
01162     eCVRI,
01166     /*
01167      * CVIR node
01168      * Description: convert integer to real
01169      * Number Of Arguments: 1
01170      * arg0: CNode* expression
01171      */
01172     eCVIR,
01176     /*
01177      * REP node
01178      * Description: replication operator
01179      * Number Of Arguments: 2
01180      * arg0: CNode* replication expression
01181      * arg1: CNode* expression to replicate
01182      */
01183     eREP,
01187     /*
01188      * CAT node
01189      * Description: concatenation operator
01190      * Number Of Arguments: 2
01191      * arg0: CNode* expression 1
01192      * arg1: CNode* expression 2
01193      */
01194     eCAT,
01198     /*
01199      * UCAT node
01200      * Description: unary concat
01201      * Number Of Arguments: 1
01202      * arg0: CNode* expression
01203      */
01204     eUCAT,
01208     /*
01209      * COM node
01210      * Description: bitwise complement
01211      * Number Of Arguments: 1
01212      * arg0: CNode* expression
01213      */
01214     eCOM,
01218     /*
01219      * NEG node
01220      * Description: negation
01221      * Number Of Arguments: 1
01222      * arg0: CNode* expression
01223      */
01224     eNEG,
01228     /*
01229      * PLUS node
01230      * Description: unary plus
01231      * Number Of Arguments: 1
01232      * arg0: CNode* expression
01233      */
01234     ePLUS,
01238     /*
01239      * NOT node
01240      * Description: logical complement
01241      * Number Of Arguments: 1
01242      * arg0: CNode* expression
01243      */
01244     eNOT,
01248     /*
01249      * GT node
01250      * Description: greater than
01251      * Number Of Arguments: 2
01252      * arg0: CNode* expression 1
01253      * arg1: CNode* expression 2
01254      */
01255     eGT,
01259     /*
01260      * GE node
01261      * Description: greater than or equal
01262      * Number Of Arguments: 2
01263      * arg0: CNode* expression 1
01264      * arg1: CNode* expression 2
01265      */
01266     eGE,
01270     /*
01271      * LT node
01272      * Description: less than
01273      * Number Of Arguments: 2
01274      * arg0: CNode* expression 1
01275      * arg1: CNode* expression 2
01276      */
01277     eLT,
01281     /*
01282      * LE node
01283      * Description: less than or equal
01284      * Number Of Arguments: 2
01285      * arg0: CNode* expression 1
01286      * arg1: CNode* expression 2
01287      */
01288     eLE,
01292     /*
01293      * LAND node
01294      * Description: logical and
01295      * Number Of Arguments: 2
01296      * arg0: CNode* expression 1
01297      * arg1: CNode* expression 2
01298      */
01299     eLAND,
01303     /*
01304      * LOR node
01305      * Description: logical or
01306      * Number Of Arguments: 2
01307      * arg0: CNode* expression 1
01308      * arg1: CNode* expression 2
01309      */
01310     eLOR,
01314     /*
01315      * CEQ node
01316      * Description: case equal
01317      * Number Of Arguments: 2
01318      * arg0: CNode* expression 1
01319      * arg1: CNode* expression 2
01320      */
01321     eCEQ,
01325     /*
01326      * CNE node
01327      * Description: case not equal
01328      * Number Of Arguments: 2
01329      * arg0: CNode* expression 1
01330      * arg1: CNode* expression 2
01331      */
01332     eCNE,
01336     /*
01337      * EQ node
01338      * Description: equal
01339      * Number Of Arguments: 2
01340      * arg0: CNode* expression 1
01341      * arg1: CNode* expression 2
01342      */
01343     eEQ,
01347     /*
01348      * NE node
01349      * Description: not equal
01350      * Number Of Arguments: 2
01351      * arg0: CNode* expression 1
01352      * arg1: CNode* expression 2
01353      */
01354     eNE,
01358     /*
01359      * RAND node
01360      * Description: reduction and
01361      * Number Of Arguments: 1
01362      * arg0: CNode* expression
01363      */
01364     eRAND,
01368     /*
01369      * RNAND node
01370      * Description: reduction nand
01371      * Number Of Arguments: 1
01372      * arg0: CNode* expression
01373      */
01374     eRNAND,
01378     /*
01379      * ROR node
01380      * Description: reduction or
01381      * Number Of Arguments: 1
01382      * arg0: CNode* expression
01383      */
01384     eROR,
01388     /*
01389      * RNOR node
01390      * Description: reduction nor
01391      * Number Of Arguments: 1
01392      * arg0: CNode* expression
01393      */
01394     eRNOR,
01398     /*
01399      * RXOR node
01400      * Description: reduction xor
01401      * Number Of Arguments: 1
01402      * arg0: CNode* expression
01403      */
01404     eRXOR,
01408     /*
01409      * RXNOR node
01410      * Description: reduction xnor
01411      * Number Of Arguments: 1
01412      * arg0: CNode* expression
01413      */
01414     eRXNOR,
01418     /*
01419      * HOOK node
01420      * Description: condition expression operator
01421      * Number Of Arguments: 3
01422      * arg0: CNode* condition expression
01423      * arg1: CNode* true expression
01424      * arg2: CNode* false expression
01425      */
01426     eHOOK,
01430     /*
01431      * INIT node
01432      * Description: initial block
01433      * Number Of Arguments: 1
01434      * arg0: CNode* 
01435      */
01436     eINIT,
01440     /*
01441      * ALWAYS node
01442      * Description: always block
01443      * Number Of Arguments: 1
01444      * arg0: CNode* 
01445      */
01446     eALWAYS,
01450     /*
01451      * ALWAYS_LATCH node
01452      * Description: always latch block
01453      * Number Of Arguments: 1
01454      * arg0: CNode* 
01455      */
01456     eALWAYS_LATCH,
01460     /*
01461      * ALWAYS_FF node
01462      * Description: always flip-flop block
01463      * Number Of Arguments: 1
01464      * arg0: CNode* 
01465      */
01466     eALWAYS_FF,
01470     /*
01471      * ALWAYS_COMB node
01472      * Description: always combinational logic block
01473      * Number Of Arguments: 1
01474      * arg0: CNode* 
01475      */
01476     eALWAYS_COMB,
01480     /*
01481      * EVENT node
01482      * Description: event statement
01483      * Number Of Arguments: 2
01484      * arg0: CNode* event expression (NULL for @*)
01485      * arg1: CNode* statement
01486      */
01487     eEVENT,
01491     /*
01492      * BLOCK_REF node
01493      * Description: statement block
01494      * Number Of Arguments: 2
01495      * arg0: CBlock* pointer to block
01496      * arg1: CNode* list of statements
01497      */
01498     eBLOCK_REF,
01502     /*
01503      * SPECIFY_REF node
01504      * Description: specify block
01505      * Number Of Arguments: 2
01506      * arg0: CSpecify* pointer to specify structure
01507      * arg1: CNode* list of statements
01508      */
01509     eSPECIFY_REF,
01513     /*
01514      * ASSIGN node
01515      * Description: procedural assignment
01516      * Number Of Arguments: 3
01517      * arg0: CNode* event expression
01518      * arg1: CNode* lval
01519      * arg2: CNode* rval
01520      */
01521     eASSIGN,
01525     /*
01526      * ADD_ASSIGN node
01527      * Description: procedural assignment with add
01528      * Number Of Arguments: 3
01529      * arg0: CNode* event expression
01530      * arg1: CNode* lval
01531      * arg2: CNode* rval
01532      */
01533     eADD_ASSIGN,
01537     /*
01538      * SUB_ASSIGN node
01539      * Description: procedural assignment with subtract
01540      * Number Of Arguments: 3
01541      * arg0: CNode* event expression
01542      * arg1: CNode* lval
01543      * arg2: CNode* rval
01544      */
01545     eSUB_ASSIGN,
01549     /*
01550      * MUL_ASSIGN node
01551      * Description: procedural assignment with mul
01552      * Number Of Arguments: 3
01553      * arg0: CNode* event expression
01554      * arg1: CNode* lval
01555      * arg2: CNode* rval
01556      */
01557     eMUL_ASSIGN,
01561     /*
01562      * DIV_ASSIGN node
01563      * Description: procedural assignment with div
01564      * Number Of Arguments: 3
01565      * arg0: CNode* event expression
01566      * arg1: CNode* lval
01567      * arg2: CNode* rval
01568      */
01569     eDIV_ASSIGN,
01573     /*
01574      * MOD_ASSIGN node
01575      * Description: procedural assignment with mod
01576      * Number Of Arguments: 3
01577      * arg0: CNode* event expression
01578      * arg1: CNode* lval
01579      * arg2: CNode* rval
01580      */
01581     eMOD_ASSIGN,
01585     /*
01586      * AND_ASSIGN node
01587      * Description: procedural assignment with bitwise and
01588      * Number Of Arguments: 3
01589      * arg0: CNode* event expression
01590      * arg1: CNode* lval
01591      * arg2: CNode* rval
01592      */
01593     eAND_ASSIGN,
01597     /*
01598      * OR_ASSIGN node
01599      * Description: procedural assignment with bitwise or
01600      * Number Of Arguments: 3
01601      * arg0: CNode* event expression
01602      * arg1: CNode* lval
01603      * arg2: CNode* rval
01604      */
01605     eOR_ASSIGN,
01609     /*
01610      * XOR_ASSIGN node
01611      * Description: procedural assignment with bitwise xor
01612      * Number Of Arguments: 3
01613      * arg0: CNode* event expression
01614      * arg1: CNode* lval
01615      * arg2: CNode* rval
01616      */
01617     eXOR_ASSIGN,
01621     /*
01622      * LSH_ASSIGN node
01623      * Description: procedural assignment with left shift
01624      * Number Of Arguments: 3
01625      * arg0: CNode* event expression
01626      * arg1: CNode* lval
01627      * arg2: CNode* rval
01628      */
01629     eLSH_ASSIGN,
01633     /*
01634      * RSH_ASSIGN node
01635      * Description: procedural assignment with right shift
01636      * Number Of Arguments: 3
01637      * arg0: CNode* event expression
01638      * arg1: CNode* lval
01639      * arg2: CNode* rval
01640      */
01641     eRSH_ASSIGN,
01645     /*
01646      * LSHA_ASSIGN node
01647      * Description: procedural assignment with left arithmetic shift
01648      * Number Of Arguments: 3
01649      * arg0: CNode* event expression
01650      * arg1: CNode* lval
01651      * arg2: CNode* rval
01652      */
01653     eLSHA_ASSIGN,
01657     /*
01658      * RSHA_ASSIGN node
01659      * Description: procedural assignment with right arithmetic shift
01660      * Number Of Arguments: 3
01661      * arg0: CNode* event expression
01662      * arg1: CNode* lval
01663      * arg2: CNode* rval
01664      */
01665     eRSHA_ASSIGN,
01669     /*
01670      * FORCE node
01671      * Description: force statement
01672      * Number Of Arguments: 2
01673      * arg0: CNode* lval
01674      * arg1: CNode* expression
01675      */
01676     eFORCE,
01680     /*
01681      * RELEASE node
01682      * Description: release statement
01683      * Number Of Arguments: 1
01684      * arg0: CNode* lval
01685      */
01686     eRELEASE,
01690     /*
01691      * NBASSIGN node
01692      * Description: nonblocking assignment
01693      * Number Of Arguments: 3
01694      * arg0: CNode* event expression
01695      * arg1: CNode* lval
01696      * arg2: CNode* rval
01697      */
01698     eNBASSIGN,
01702     /*
01703      * POSEDGE node
01704      * Description: positive event qualifier
01705      * Number Of Arguments: 1
01706      * arg0: CNode* expression
01707      */
01708     ePOSEDGE,
01712     /*
01713      * NEGEDGE node
01714      * Description: negative event qualifier
01715      * Number Of Arguments: 1
01716      * arg0: CNode* expression
01717      */
01718     eNEGEDGE,
01722     /*
01723      * EDGE node
01724      * Description: edge qualifier
01725      * Number Of Arguments: 2
01726      * arg0: CNode* 
01727      * arg1: Edge_t edge specification
01728      */
01729     eEDGE,
01733     /*
01734      * EVOR node
01735      * Description: event or
01736      * Number Of Arguments: 2
01737      * arg0: CNode* expression 1
01738      * arg1: CNode* expression 2
01739      */
01740     eEVOR,
01744     /*
01745      * DELAY node
01746      * Description: delay statement
01747      * Number Of Arguments: 2
01748      * arg0: CNode* delay expression
01749      * arg1: CNode* statements
01750      */
01751     eDELAY,
01755     /*
01756      * MTM node
01757      * Description: min/typ/max expression
01758      * Number Of Arguments: 3
01759      * arg0: CNode* minimum expression
01760      * arg1: CNode* typical expression
01761      * arg2: CNode* maximum expression
01762      */
01763     eMTM,
01767     /*
01768      * IF node
01769      * Description: if statement
01770      * Number Of Arguments: 3
01771      * arg0: CNode* condition
01772      * arg1: CNode* true statements
01773      * arg2: CNode* false statements
01774      */
01775     eIF,
01779     /*
01780      * FOREVER node
01781      * Description: forever statement
01782      * Number Of Arguments: 1
01783      * arg0: CNode* statements
01784      */
01785     eFOREVER,
01789     /*
01790      * REPEAT node
01791      * Description: repeat statement
01792      * Number Of Arguments: 2
01793      * arg0: CNode* condition
01794      * arg1: CNode* statements
01795      */
01796     eREPEAT,
01800     /*
01801      * WHILE node
01802      * Description: while statement
01803      * Number Of Arguments: 2
01804      * arg0: CNode* condition
01805      * arg1: CNode* statements
01806      */
01807     eWHILE,
01811     /*
01812      * WAIT node
01813      * Description: wait statement
01814      * Number Of Arguments: 2
01815      * arg0: CNode* condition
01816      * arg1: CNode* statements
01817      */
01818     eWAIT,
01822     /*
01823      * FOR node
01824      * Description: for statement
01825      * Number Of Arguments: 4
01826      * arg0: CNode* initial statement
01827      * arg1: CNode* condition
01828      * arg2: CNode* assignment statement
01829      * arg3: CNode* statements
01830      */
01831     eFOR,
01835     /*
01836      * CASE node
01837      * Description: case statement
01838      * Number Of Arguments: 2
01839      * arg0: CNode* condition
01840      * arg1: CNode* list of case items
01841      */
01842     eCASE,
01846     /*
01847      * CASEX node
01848      * Description: casex statement
01849      * Number Of Arguments: 2
01850      * arg0: CNode* condition
01851      * arg1: CNode* list of case items
01852      */
01853     eCASEX,
01857     /*
01858      * CASEZ node
01859      * Description: casez statement
01860      * Number Of Arguments: 2
01861      * arg0: CNode* condition
01862      * arg1: CNode* list of case items
01863      */
01864     eCASEZ,
01868     /*
01869      * CASEITEM node
01870      * Description: case item
01871      * Number Of Arguments: 2
01872      * arg0: CNode* list of expressions (NULL for default)
01873      * arg1: CNode* statement
01874      */
01875     eCASEITEM,
01879     /*
01880      * CASSIGN node
01881      * Description: continious assignment
01882      * Number Of Arguments: 4
01883      * arg0: StrengthPair_t* assignment strength
01884      * arg1: CNode* delay expression
01885      * arg2: CNode* lval
01886      * arg3: CNode* rval expression
01887      */
01888     eCASSIGN,
01892     /*
01893      * ARG node
01894      * Description: port connection
01895      * Number Of Arguments: 2
01896      * arg0: CSymbol* port name
01897      * arg1: CNode* port expression
01898      */
01899     eARG,
01903     /*
01904      * FUNCTION_DEF node
01905      * Description: function definition
01906      * Number Of Arguments: 1
01907      * arg0: CFunction* 
01908      */
01909     eFUNCTION_DEF,
01913     /*
01914      * MODULE_DEF node
01915      * Description: module definition
01916      * Number Of Arguments: 1
01917      * arg0: CModule* 
01918      */
01919     eMODULE_DEF,
01923     /*
01924      * REPEAT_CONTROL node
01925      * Description: repeat control
01926      * Number Of Arguments: 2
01927      * arg0: CNode* expression
01928      * arg1: CNode* event control
01929      */
01930     eREPEAT_CONTROL,
01934     /*
01935      * DELAY_CONTROL node
01936      * Description: delay control
01937      * Number Of Arguments: 1
01938      * arg0: CNode* expression
01939      */
01940     eDELAY_CONTROL,
01944     /*
01945      * EVENT_CONTROL node
01946      * Description: event control
01947      * Number Of Arguments: 1
01948      * arg0: CNode* event expression (NULL for @*)
01949      */
01950     eEVENT_CONTROL,
01954     /*
01955      * EXTERNAL_REF node
01956      * Description: external reference
01957      * Number Of Arguments: 1
01958      * arg0: CSymbol* pointer to symbol
01959      */
01960     eEXTERNAL_REF,
01964     /*
01965      * PORT_DEF node
01966      * Description: port definition
01967      * Number Of Arguments: 1
01968      * arg0: CPort* pointer to port
01969      */
01970     ePORT_DEF,
01974     /*
01975      * DEFPARAM node
01976      * Description: defparam statement
01977      * Number Of Arguments: 2
01978      * arg0: CNode* external reference
01979      * arg1: CNode* expression
01980      */
01981     eDEFPARAM,
01985     /*
01986      * PATH node
01987      * Description: path statement
01988      * Number Of Arguments: 7
01989      * arg0: int 
01990      * arg1: CNode* edge int[-1,0,1]
01991      * arg2: int Input list
01992      * arg3: int Left polarity int[-1,0,1]
01993      * arg4: CNode* Operation type int [0 = *>, 1 = =>]
01994      * arg5: int Output list
01995      * arg6: CNode* Right polarity int[-1,0,1]
01996      */
01997     ePATH,
02001     /*
02002      * PATH_ASSIGN node
02003      * Description: path assignment statement
02004      * Number Of Arguments: 3
02005      * arg0: CNode* condition
02006      * arg1: CNode* path
02007      * arg2: CNode* expression
02008      */
02009     ePATH_ASSIGN,
02013     /*
02014      * IFNONE_PATH_ASSIGN node
02015      * Description: ifnone path assignment statement
02016      * Number Of Arguments: 2
02017      * arg0: CNode* path
02018      * arg1: CNode* expression
02019      */
02020     eIFNONE_PATH_ASSIGN,
02024     /*
02025      * TRIGGER node
02026      * Description: event trigger
02027      * Number Of Arguments: 1
02028      * arg0: CNode* event reference
02029      */
02030     eTRIGGER,
02034     /*
02035      * PASSIGN node
02036      * Description: procedural assignment
02037      * Number Of Arguments: 2
02038      * arg0: CNode* lval
02039      * arg1: CNode* expression
02040      */
02041     ePASSIGN,
02045     /*
02046      * DEASSIGN node
02047      * Description: deassign statement
02048      * Number Of Arguments: 1
02049      * arg0: CNode* lval
02050      */
02051     eDEASSIGN,
02055     /*
02056      * DISABLE node
02057      * Description: disable statement
02058      * Number Of Arguments: 1
02059      * arg0: CSymbol* pointer to symbol
02060      */
02061     eDISABLE,
02065     /*
02066      * ATTRIBUTE node
02067      * Description: attribute specification
02068      * Number Of Arguments: 1
02069      * arg0: CAttr* pointer to attribute
02070      */
02071     eATTRIBUTE,
02075     /*
02076      * GIF node
02077      * Description: structural if statement
02078      * Number Of Arguments: 3
02079      * arg0: CNode* condition
02080      * arg1: CNode* true statement
02081      * arg2: CNode* false statement
02082      */
02083     eGIF,
02087     /*
02088      * GFOR node
02089      * Description: structural for statement
02090      * Number Of Arguments: 4
02091      * arg0: CNode* initial statement
02092      * arg1: CNode* condition
02093      * arg2: CNode* assignment statement
02094      * arg3: CNode* statement
02095      */
02096     eGFOR,
02100     /*
02101      * GCASE node
02102      * Description: structural case statement
02103      * Number Of Arguments: 2
02104      * arg0: CNode* condition
02105      * arg1: CNode* list of case items
02106      */
02107     eGCASE,
02111     /*
02112      * TABLE node
02113      * Description: udp table
02114      * Number Of Arguments: 1
02115      * arg0: CNode* list of table entries
02116      */
02117     eTABLE,
02121     /*
02122      * TABLE_ENTRY node
02123      * Description: udp table entry
02124      * Number Of Arguments: 1
02125      * arg0: CNode* list of table symbols
02126      */
02127     eTABLE_ENTRY,
02131     /*
02132      * TABLE_SYMBOL node
02133      * Description: udp table symbol
02134      * Number Of Arguments: 1
02135      * arg0: char* string of udp characters
02136      */
02137     eTABLE_SYMBOL,
02141     /*
02142      * PORTLIST_END node
02143      * Description: sentinal at end of port list
02144      * Number Of Arguments: 0
02145      */
02146     ePORTLIST_END,
02150     /*
02151      * MACRO_EXPR node
02152      * Description: expression represented by a macro
02153      * Number Of Arguments: 2
02154      * arg0: const char* alternate expression, may be NULL
02155      * arg1: CNode* 
02156      */
02157     eMACRO_EXPR,
02161     /*
02162      * ENUM_SPEC node
02163      * Description: enum specification
02164      * Number Of Arguments: 3
02165      * arg0: CSymbol* Pointer to enum base symbol
02166      * arg1: CNode* range expression
02167      * arg2: CNode* starting expression value
02168      */
02169     eENUM_SPEC,
02173     /*
02174      * MEMBER node
02175      * Description: member reference (structure, class or external
02176      * Number Of Arguments: 2
02177      * arg0: CNode* Reference to variable
02178      * arg1: CSymbol* member symbol
02179      */
02180     eMEMBER,
02184     /*
02185      * RETURN node
02186      * Description: return
02187      * Number Of Arguments: 1
02188      * arg0: CNode* 
02189      */
02190     eRETURN,
02194     /*
02195      * PREINC node
02196      * Description: preincrement
02197      * Number Of Arguments: 1
02198      * arg0: CNode* expression
02199      */
02200     ePREINC,
02204     /*
02205      * POSTINC node
02206      * Description: postincrement
02207      * Number Of Arguments: 1
02208      * arg0: CNode* expression
02209      */
02210     ePOSTINC,
02214     /*
02215      * PREDEC node
02216      * Description: predecrement
02217      * Number Of Arguments: 1
02218      * arg0: CNode* expression
02219      */
02220     ePREDEC,
02224     /*
02225      * POSTDEC node
02226      * Description: postdecrement
02227      * Number Of Arguments: 1
02228      * arg0: CNode* expression
02229      */
02230     ePOSTDEC,
02234     /*
02235      * CAST node
02236      * Description: data type change
02237      * Number Of Arguments: 2
02238      * arg0: CNode* type reference or width expression
02239      * arg1: CNode* expression
02240      */
02241     eCAST
02242 };
02243 extern const char* nodeOpName[];
02244 extern const char* nodeOpDescription[];
02245 #endif // DEFINE_ENUM
02246 #ifdef DEFINE_METHODS
02247 const char* nodeOpName[] = {
02248     "ERROR",
02249     "VCONSTANT",
02250     "RCONSTANT",
02251     "COMMENT",
02252     "VRQ",
02253     "PRAGMA",
02254     "ELIST",
02255     "WIDTH",
02256     "NOP",
02257     "SUB",
02258     "MUL",
02259     "DIV",
02260     "POW",
02261     "ADD",
02262     "LSH",
02263     "RSH",
02264     "LSHA",
02265     "RSHA",
02266     "MOD",
02267     "OR",
02268     "AND",
02269     "ANDANDAND",
02270     "XOR",
02271     "XNOR",
02272     "INSTANCE_REF",
02273     "GATE_REF",
02274     "TASK_ENABLE",
02275     "SYSTASK_CALL",
02276     "TIMING_CALL",
02277     "FUNCTION_CALL",
02278     "ARRAY",
02279     "NET_REF",
02280     "VAR_REF",
02281     "PARAM_REF",
02282     "PORT_REF",
02283     "FWD_REF",
02284     "GENVAR_REF",
02285     "ENUM_REF",
02286     "TYPE_REF",
02287     "NET_DECL",
02288     "VAR_DECL",
02289     "PARAM_DECL",
02290     "SPECPARAM_DECL",
02291     "PORT_DECL",
02292     "GENVAR_DECL",
02293     "TYPEDEF_DECL",
02294     "LIST",
02295     "RANGE",
02296     "SLICE",
02297     "PSLICE",
02298     "MSLICE",
02299     "CVRI",
02300     "CVIR",
02301     "REP",
02302     "CAT",
02303     "UCAT",
02304     "COM",
02305     "NEG",
02306     "PLUS",
02307     "NOT",
02308     "GT",
02309     "GE",
02310     "LT",
02311     "LE",
02312     "LAND",
02313     "LOR",
02314     "CEQ",
02315     "CNE",
02316     "EQ",
02317     "NE",
02318     "RAND",
02319     "RNAND",
02320     "ROR",
02321     "RNOR",
02322     "RXOR",
02323     "RXNOR",
02324     "HOOK",
02325     "INIT",
02326     "ALWAYS",
02327     "ALWAYS_LATCH",
02328     "ALWAYS_FF",
02329     "ALWAYS_COMB",
02330     "EVENT",
02331     "BLOCK_REF",
02332     "SPECIFY_REF",
02333     "ASSIGN",
02334     "ADD_ASSIGN",
02335     "SUB_ASSIGN",
02336     "MUL_ASSIGN",
02337     "DIV_ASSIGN",
02338     "MOD_ASSIGN",
02339     "AND_ASSIGN",
02340     "OR_ASSIGN",
02341     "XOR_ASSIGN",
02342     "LSH_ASSIGN",
02343     "RSH_ASSIGN",
02344     "LSHA_ASSIGN",
02345     "RSHA_ASSIGN",
02346     "FORCE",
02347     "RELEASE",
02348     "NBASSIGN",
02349     "POSEDGE",
02350     "NEGEDGE",
02351     "EDGE",
02352     "EVOR",
02353     "DELAY",
02354     "MTM",
02355     "IF",
02356     "FOREVER",
02357     "REPEAT",
02358     "WHILE",
02359     "WAIT",
02360     "FOR",
02361     "CASE",
02362     "CASEX",
02363     "CASEZ",
02364     "CASEITEM",
02365     "CASSIGN",
02366     "ARG",
02367     "FUNCTION_DEF",
02368     "MODULE_DEF",
02369     "REPEAT_CONTROL",
02370     "DELAY_CONTROL",
02371     "EVENT_CONTROL",
02372     "EXTERNAL_REF",
02373     "PORT_DEF",
02374     "DEFPARAM",
02375     "PATH",
02376     "PATH_ASSIGN",
02377     "IFNONE_PATH_ASSIGN",
02378     "TRIGGER",
02379     "PASSIGN",
02380     "DEASSIGN",
02381     "DISABLE",
02382     "ATTRIBUTE",
02383     "GIF",
02384     "GFOR",
02385     "GCASE",
02386     "TABLE",
02387     "TABLE_ENTRY",
02388     "TABLE_SYMBOL",
02389     "PORTLIST_END",
02390     "MACRO_EXPR",
02391     "ENUM_SPEC",
02392     "MEMBER",
02393     "RETURN",
02394     "PREINC",
02395     "POSTINC",
02396     "PREDEC",
02397     "POSTDEC",
02398     "CAST",
02399 NULL
02400 };
02401 const char* nodeOpDescription[] = {
02402     "error node",
02403     "vector constant",
02404     "real constant",
02405     "comment",
02406     "vrq comment",
02407     "program pragma",
02408     "expression list",
02409     "expression width change",
02410     "no operation",
02411     "subtract",
02412     "multiply",
02413     "divide",
02414     "exponent",
02415     "addition",
02416     "logical left shift",
02417     "logical right shift",
02418     "arithmetic left shift",
02419     "arithmetic right shift",
02420     "modulus",
02421     "bitwise or",
02422     "bitwise and",
02423     "triple and",
02424     "bitwise xor",
02425     "bitwise xnor",
02426     "instance reference",
02427     "gate instance",
02428     "call to a task",
02429     "call to enable a systask",
02430     "call to a timing task",
02431     "call to a function",
02432     "dimensioned reference (array/bit select)",
02433     "reference to net",
02434     "reference to variable",
02435     "reference to parameter",
02436     "reference to port",
02437     "reference to a forward declared variable",
02438     "reference to a genvar",
02439     "reference to a enum",
02440     "reference to a type",
02441     "net declaration",
02442     "variable declaration",
02443     "parameter declaration",
02444     "specify parameter declaration",
02445     "port declaration",
02446     "genvar declaration",
02447     "type declaration",
02448     "list of nodes",
02449     "vector decl range specification",
02450     "vector subrange",
02451     "vector subrange with ascending index select",
02452     "vector subrange with descending index select",
02453     "convert real to integer",
02454     "convert integer to real",
02455     "replication operator",
02456     "concatenation operator",
02457     "unary concat",
02458     "bitwise complement",
02459     "negation",
02460     "unary plus",
02461     "logical complement",
02462     "greater than",
02463     "greater than or equal",
02464     "less than",
02465     "less than or equal",
02466     "logical and",
02467     "logical or",
02468     "case equal",
02469     "case not equal",
02470     "equal",
02471     "not equal",
02472     "reduction and",
02473     "reduction nand",
02474     "reduction or",
02475     "reduction nor",
02476     "reduction xor",
02477     "reduction xnor",
02478     "condition expression operator",
02479     "initial block",
02480     "always block",
02481     "always latch block",
02482     "always flip-flop block",
02483     "always combinational logic block",
02484     "event statement",
02485     "statement block",
02486     "specify block",
02487     "procedural assignment",
02488     "procedural assignment with add",
02489     "procedural assignment with subtract",
02490     "procedural assignment with mul",
02491     "procedural assignment with div",
02492     "procedural assignment with mod",
02493     "procedural assignment with bitwise and",
02494     "procedural assignment with bitwise or",
02495     "procedural assignment with bitwise xor",
02496     "procedural assignment with left shift",
02497     "procedural assignment with right shift",
02498     "procedural assignment with left arithmetic shift",
02499     "procedural assignment with right arithmetic shift",
02500     "force statement",
02501     "release statement",
02502     "nonblocking assignment",
02503     "positive event qualifier",
02504     "negative event qualifier",
02505     "edge qualifier",
02506     "event or",
02507     "delay statement",
02508     "min/typ/max expression",
02509     "if statement",
02510     "forever statement",
02511     "repeat statement",
02512     "while statement",
02513     "wait statement",
02514     "for statement",
02515     "case statement",
02516     "casex statement",
02517     "casez statement",
02518     "case item",
02519     "continious assignment",
02520     "port connection",
02521     "function definition",
02522     "module definition",
02523     "repeat control",
02524     "delay control",
02525     "event control",
02526     "external reference",
02527     "port definition",
02528     "defparam statement",
02529     "path statement",
02530     "path assignment statement",
02531     "ifnone path assignment statement",
02532     "event trigger",
02533     "procedural assignment",
02534     "deassign statement",
02535     "disable statement",
02536     "attribute specification",
02537     "structural if statement",
02538     "structural for statement",
02539     "structural case statement",
02540     "udp table",
02541     "udp table entry",
02542     "udp table symbol",
02543     "sentinal at end of port list",
02544     "expression represented by a macro",
02545     "enum specification",
02546     "member reference (structure, class or external",
02547     "return",
02548     "preincrement",
02549     "postincrement",
02550     "predecrement",
02551     "postdecrement",
02552     "data type change",
02553 NULL
02554 };
02555 #endif // DEFINE_METHODS
02556 
02557 
02558 #ifdef DEFINE_CONSTRUCTOR
02559 
02567 inline CNode* cERROR( Coord_t* loc=NULL )
02568 {
02569     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eERROR );
02570     return n;
02571 }
02580 inline CNode* cERROR( CObstack* heap, Coord_t* loc=NULL )
02581 {
02582     CNode* n = new(heap) CNode( loc, eERROR );
02583     return n;
02584 }
02593 inline CNode* cVCONSTANT( CVector* a0, Coord_t* loc=NULL )
02594 {
02595     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVCONSTANT );
02596     n->Arg<CVector*>(0) = a0;
02597     return n;
02598 }
02608 inline CNode* cVCONSTANT( CObstack* heap, CVector* a0, Coord_t* loc=NULL )
02609 {
02610     CNode* n = new(heap) CNode( loc, eVCONSTANT );
02611     n->Arg<CVector*>(0) = a0;
02612     return n;
02613 }
02622 inline CNode* cRCONSTANT( char* a0, Coord_t* loc=NULL )
02623 {
02624     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRCONSTANT );
02625     n->Arg<char*>(0) = a0;
02626     return n;
02627 }
02637 inline CNode* cRCONSTANT( CObstack* heap, char* a0, Coord_t* loc=NULL )
02638 {
02639     CNode* n = new(heap) CNode( loc, eRCONSTANT );
02640     n->Arg<char*>(0) = a0;
02641     return n;
02642 }
02651 inline CNode* cCOMMENT( const char* a0, Coord_t* loc=NULL )
02652 {
02653     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCOMMENT );
02654     n->Arg<const char*>(0) = a0;
02655     return n;
02656 }
02666 inline CNode* cCOMMENT( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02667 {
02668     CNode* n = new(heap) CNode( loc, eCOMMENT );
02669     n->Arg<const char*>(0) = a0;
02670     return n;
02671 }
02680 inline CNode* cVRQ( const char* a0, Coord_t* loc=NULL )
02681 {
02682     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVRQ );
02683     n->Arg<const char*>(0) = a0;
02684     return n;
02685 }
02695 inline CNode* cVRQ( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02696 {
02697     CNode* n = new(heap) CNode( loc, eVRQ );
02698     n->Arg<const char*>(0) = a0;
02699     return n;
02700 }
02709 inline CNode* cPRAGMA( const char* a0, Coord_t* loc=NULL )
02710 {
02711     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePRAGMA );
02712     n->Arg<const char*>(0) = a0;
02713     return n;
02714 }
02724 inline CNode* cPRAGMA( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02725 {
02726     CNode* n = new(heap) CNode( loc, ePRAGMA );
02727     n->Arg<const char*>(0) = a0;
02728     return n;
02729 }
02739 inline CNode* cELIST( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02740 {
02741     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eELIST );
02742     n->Arg<CNode*>(0) = a0;
02743     n->Arg<CNode*>(1) = a1;
02744     return n;
02745 }
02756 inline CNode* cELIST( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02757 {
02758     CNode* n = new(heap) CNode( loc, eELIST );
02759     n->Arg<CNode*>(0) = a0;
02760     n->Arg<CNode*>(1) = a1;
02761     return n;
02762 }
02772 inline CNode* cWIDTH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02773 {
02774     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWIDTH );
02775     n->Arg<CNode*>(0) = a0;
02776     n->Arg<CNode*>(1) = a1;
02777     return n;
02778 }
02789 inline CNode* cWIDTH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02790 {
02791     CNode* n = new(heap) CNode( loc, eWIDTH );
02792     n->Arg<CNode*>(0) = a0;
02793     n->Arg<CNode*>(1) = a1;
02794     return n;
02795 }
02803 inline CNode* cNOP( Coord_t* loc=NULL )
02804 {
02805     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNOP );
02806     return n;
02807 }
02816 inline CNode* cNOP( CObstack* heap, Coord_t* loc=NULL )
02817 {
02818     CNode* n = new(heap) CNode( loc, eNOP );
02819     return n;
02820 }
02830 inline CNode* cSUB( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02831 {
02832     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSUB );
02833     n->Arg<CNode*>(0) = a0;
02834     n->Arg<CNode*>(1) = a1;
02835     return n;
02836 }
02847 inline CNode* cSUB( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02848 {
02849     CNode* n = new(heap) CNode( loc, eSUB );
02850     n->Arg<CNode*>(0) = a0;
02851     n->Arg<CNode*>(1) = a1;
02852     return n;
02853 }
02863 inline CNode* cMUL( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02864 {
02865     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMUL );
02866     n->Arg<CNode*>(0) = a0;
02867     n->Arg<CNode*>(1) = a1;
02868     return n;
02869 }
02880 inline CNode* cMUL( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02881 {
02882     CNode* n = new(heap) CNode( loc, eMUL );
02883     n->Arg<CNode*>(0) = a0;
02884     n->Arg<CNode*>(1) = a1;
02885     return n;
02886 }
02896 inline CNode* cDIV( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02897 {
02898     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDIV );
02899     n->Arg<CNode*>(0) = a0;
02900     n->Arg<CNode*>(1) = a1;
02901     return n;
02902 }
02913 inline CNode* cDIV( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02914 {
02915     CNode* n = new(heap) CNode( loc, eDIV );
02916     n->Arg<CNode*>(0) = a0;
02917     n->Arg<CNode*>(1) = a1;
02918     return n;
02919 }
02929 inline CNode* cPOW( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02930 {
02931     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOW );
02932     n->Arg<CNode*>(0) = a0;
02933     n->Arg<CNode*>(1) = a1;
02934     return n;
02935 }
02946 inline CNode* cPOW( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02947 {
02948     CNode* n = new(heap) CNode( loc, ePOW );
02949     n->Arg<CNode*>(0) = a0;
02950     n->Arg<CNode*>(1) = a1;
02951     return n;
02952 }
02962 inline CNode* cADD( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02963 {
02964     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eADD );
02965     n->Arg<CNode*>(0) = a0;
02966     n->Arg<CNode*>(1) = a1;
02967     return n;
02968 }
02979 inline CNode* cADD( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02980 {
02981     CNode* n = new(heap) CNode( loc, eADD );
02982     n->Arg<CNode*>(0) = a0;
02983     n->Arg<CNode*>(1) = a1;
02984     return n;
02985 }
02995 inline CNode* cLSH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02996 {
02997     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSH );
02998     n->Arg<CNode*>(0) = a0;
02999     n->Arg<CNode*>(1) = a1;
03000     return n;
03001 }
03012 inline CNode* cLSH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03013 {
03014     CNode* n = new(heap) CNode( loc, eLSH );
03015     n->Arg<CNode*>(0) = a0;
03016     n->Arg<CNode*>(1) = a1;
03017     return n;
03018 }
03028 inline CNode* cRSH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03029 {
03030     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSH );
03031     n->Arg<CNode*>(0) = a0;
03032     n->Arg<CNode*>(1) = a1;
03033     return n;
03034 }
03045 inline CNode* cRSH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03046 {
03047     CNode* n = new(heap) CNode( loc, eRSH );
03048     n->Arg<CNode*>(0) = a0;
03049     n->Arg<CNode*>(1) = a1;
03050     return n;
03051 }
03061 inline CNode* cLSHA( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03062 {
03063     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSHA );
03064     n->Arg<CNode*>(0) = a0;
03065     n->Arg<CNode*>(1) = a1;
03066     return n;
03067 }
03078 inline CNode* cLSHA( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03079 {
03080     CNode* n = new(heap) CNode( loc, eLSHA );
03081     n->Arg<CNode*>(0) = a0;
03082     n->Arg<CNode*>(1) = a1;
03083     return n;
03084 }
03094 inline CNode* cRSHA( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03095 {
03096     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSHA );
03097     n->Arg<CNode*>(0) = a0;
03098     n->Arg<CNode*>(1) = a1;
03099     return n;
03100 }
03111 inline CNode* cRSHA( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03112 {
03113     CNode* n = new(heap) CNode( loc, eRSHA );
03114     n->Arg<CNode*>(0) = a0;
03115     n->Arg<CNode*>(1) = a1;
03116     return n;
03117 }
03127 inline CNode* cMOD( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03128 {
03129     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMOD );
03130     n->Arg<CNode*>(0) = a0;
03131     n->Arg<CNode*>(1) = a1;
03132     return n;
03133 }
03144 inline CNode* cMOD( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03145 {
03146     CNode* n = new(heap) CNode( loc, eMOD );
03147     n->Arg<CNode*>(0) = a0;
03148     n->Arg<CNode*>(1) = a1;
03149     return n;
03150 }
03160 inline CNode* cOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03161 {
03162     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eOR );
03163     n->Arg<CNode*>(0) = a0;
03164     n->Arg<CNode*>(1) = a1;
03165     return n;
03166 }
03177 inline CNode* cOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03178 {
03179     CNode* n = new(heap) CNode( loc, eOR );
03180     n->Arg<CNode*>(0) = a0;
03181     n->Arg<CNode*>(1) = a1;
03182     return n;
03183 }
03193 inline CNode* cAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03194 {
03195     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eAND );
03196     n->Arg<CNode*>(0) = a0;
03197     n->Arg<CNode*>(1) = a1;
03198     return n;
03199 }
03210 inline CNode* cAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03211 {
03212     CNode* n = new(heap) CNode( loc, eAND );
03213     n->Arg<CNode*>(0) = a0;
03214     n->Arg<CNode*>(1) = a1;
03215     return n;
03216 }
03226 inline CNode* cANDANDAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03227 {
03228     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eANDANDAND );
03229     n->Arg<CNode*>(0) = a0;
03230     n->Arg<CNode*>(1) = a1;
03231     return n;
03232 }
03243 inline CNode* cANDANDAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03244 {
03245     CNode* n = new(heap) CNode( loc, eANDANDAND );
03246     n->Arg<CNode*>(0) = a0;
03247     n->Arg<CNode*>(1) = a1;
03248     return n;
03249 }
03259 inline CNode* cXOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03260 {
03261     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eXOR );
03262     n->Arg<CNode*>(0) = a0;
03263     n->Arg<CNode*>(1) = a1;
03264     return n;
03265 }
03276 inline CNode* cXOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03277 {
03278     CNode* n = new(heap) CNode( loc, eXOR );
03279     n->Arg<CNode*>(0) = a0;
03280     n->Arg<CNode*>(1) = a1;
03281     return n;
03282 }
03292 inline CNode* cXNOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03293 {
03294     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eXNOR );
03295     n->Arg<CNode*>(0) = a0;
03296     n->Arg<CNode*>(1) = a1;
03297     return n;
03298 }
03309 inline CNode* cXNOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03310 {
03311     CNode* n = new(heap) CNode( loc, eXNOR );
03312     n->Arg<CNode*>(0) = a0;
03313     n->Arg<CNode*>(1) = a1;
03314     return n;
03315 }
03324 inline CNode* cINSTANCE_REF( CInstance* a0, Coord_t* loc=NULL )
03325 {
03326     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eINSTANCE_REF );
03327     n->Arg<CInstance*>(0) = a0;
03328     return n;
03329 }
03339 inline CNode* cINSTANCE_REF( CObstack* heap, CInstance* a0, Coord_t* loc=NULL )
03340 {
03341     CNode* n = new(heap) CNode( loc, eINSTANCE_REF );
03342     n->Arg<CInstance*>(0) = a0;
03343     return n;
03344 }
03353 inline CNode* cGATE_REF( CGate* a0, Coord_t* loc=NULL )
03354 {
03355     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGATE_REF );
03356     n->Arg<CGate*>(0) = a0;
03357     return n;
03358 }
03368 inline CNode* cGATE_REF( CObstack* heap, CGate* a0, Coord_t* loc=NULL )
03369 {
03370     CNode* n = new(heap) CNode( loc, eGATE_REF );
03371     n->Arg<CGate*>(0) = a0;
03372     return n;
03373 }
03383 inline CNode* cTASK_ENABLE( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03384 {
03385     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTASK_ENABLE );
03386     n->Arg<CSymbol*>(0) = a0;
03387     n->Arg<CNode*>(1) = a1;
03388     return n;
03389 }
03400 inline CNode* cTASK_ENABLE( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03401 {
03402     CNode* n = new(heap) CNode( loc, eTASK_ENABLE );
03403     n->Arg<CSymbol*>(0) = a0;
03404     n->Arg<CNode*>(1) = a1;
03405     return n;
03406 }
03416 inline CNode* cSYSTASK_CALL( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03417 {
03418     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSYSTASK_CALL );
03419     n->Arg<CSymbol*>(0) = a0;
03420     n->Arg<CNode*>(1) = a1;
03421     return n;
03422 }
03433 inline CNode* cSYSTASK_CALL( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03434 {
03435     CNode* n = new(heap) CNode( loc, eSYSTASK_CALL );
03436     n->Arg<CSymbol*>(0) = a0;
03437     n->Arg<CNode*>(1) = a1;
03438     return n;
03439 }
03449 inline CNode* cTIMING_CALL( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03450 {
03451     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTIMING_CALL );
03452     n->Arg<CSymbol*>(0) = a0;
03453     n->Arg<CNode*>(1) = a1;
03454     return n;
03455 }
03466 inline CNode* cTIMING_CALL( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03467 {
03468     CNode* n = new(heap) CNode( loc, eTIMING_CALL );
03469     n->Arg<CSymbol*>(0) = a0;
03470     n->Arg<CNode*>(1) = a1;
03471     return n;
03472 }
03483 inline CNode* cFUNCTION_CALL( CSymbol* a0, CNode* a1, CScope* a2, Coord_t* loc=NULL )
03484 {
03485     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFUNCTION_CALL );
03486     n->Arg<CSymbol*>(0) = a0;
03487     n->Arg<CNode*>(1) = a1;
03488     n->Arg<CScope*>(2) = a2;
03489     return n;
03490 }
03502 inline CNode* cFUNCTION_CALL( CObstack* heap, CSymbol* a0, CNode* a1, CScope* a2, Coord_t* loc=NULL )
03503 {
03504     CNode* n = new(heap) CNode( loc, eFUNCTION_CALL );
03505     n->Arg<CSymbol*>(0) = a0;
03506     n->Arg<CNode*>(1) = a1;
03507     n->Arg<CScope*>(2) = a2;
03508     return n;
03509 }
03519 inline CNode* cARRAY( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03520 {
03521     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eARRAY );
03522     n->Arg<CNode*>(0) = a0;
03523     n->Arg<CNode*>(1) = a1;
03524     return n;
03525 }
03536 inline CNode* cARRAY( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03537 {
03538     CNode* n = new(heap) CNode( loc, eARRAY );
03539     n->Arg<CNode*>(0) = a0;
03540     n->Arg<CNode*>(1) = a1;
03541     return n;
03542 }
03551 inline CNode* cNET_REF( CNet* a0, Coord_t* loc=NULL )
03552 {
03553     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNET_REF );
03554     n->Arg<CNet*>(0) = a0;
03555     return n;
03556 }
03566 inline CNode* cNET_REF( CObstack* heap, CNet* a0, Coord_t* loc=NULL )
03567 {
03568     CNode* n = new(heap) CNode( loc, eNET_REF );
03569     n->Arg<CNet*>(0) = a0;
03570     return n;
03571 }
03580 inline CNode* cVAR_REF( CVar* a0, Coord_t* loc=NULL )
03581 {
03582     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVAR_REF );
03583     n->Arg<CVar*>(0) = a0;
03584     return n;
03585 }
03595 inline CNode* cVAR_REF( CObstack* heap, CVar* a0, Coord_t* loc=NULL )
03596 {
03597     CNode* n = new(heap) CNode( loc, eVAR_REF );
03598     n->Arg<CVar*>(0) = a0;
03599     return n;
03600 }
03609 inline CNode* cPARAM_REF( CParam* a0, Coord_t* loc=NULL )
03610 {
03611     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePARAM_REF );
03612     n->Arg<CParam*>(0) = a0;
03613     return n;
03614 }
03624 inline CNode* cPARAM_REF( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03625 {
03626     CNode* n = new(heap) CNode( loc, ePARAM_REF );
03627     n->Arg<CParam*>(0) = a0;
03628     return n;
03629 }
03638 inline CNode* cPORT_REF( CPortDir* a0, Coord_t* loc=NULL )
03639 {
03640     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_REF );
03641     n->Arg<CPortDir*>(0) = a0;
03642     return n;
03643 }
03653 inline CNode* cPORT_REF( CObstack* heap, CPortDir* a0, Coord_t* loc=NULL )
03654 {
03655     CNode* n = new(heap) CNode( loc, ePORT_REF );
03656     n->Arg<CPortDir*>(0) = a0;
03657     return n;
03658 }
03667 inline CNode* cFWD_REF( CFref* a0, Coord_t* loc=NULL )
03668 {
03669     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFWD_REF );
03670     n->Arg<CFref*>(0) = a0;
03671     return n;
03672 }
03682 inline CNode* cFWD_REF( CObstack* heap, CFref* a0, Coord_t* loc=NULL )
03683 {
03684     CNode* n = new(heap) CNode( loc, eFWD_REF );
03685     n->Arg<CFref*>(0) = a0;
03686     return n;
03687 }
03696 inline CNode* cGENVAR_REF( CGenvar* a0, Coord_t* loc=NULL )
03697 {
03698     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGENVAR_REF );
03699     n->Arg<CGenvar*>(0) = a0;
03700     return n;
03701 }
03711 inline CNode* cGENVAR_REF( CObstack* heap, CGenvar* a0, Coord_t* loc=NULL )
03712 {
03713     CNode* n = new(heap) CNode( loc, eGENVAR_REF );
03714     n->Arg<CGenvar*>(0) = a0;
03715     return n;
03716 }
03725 inline CNode* cENUM_REF( CEnum* a0, Coord_t* loc=NULL )
03726 {
03727     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eENUM_REF );
03728     n->Arg<CEnum*>(0) = a0;
03729     return n;
03730 }
03740 inline CNode* cENUM_REF( CObstack* heap, CEnum* a0, Coord_t* loc=NULL )
03741 {
03742     CNode* n = new(heap) CNode( loc, eENUM_REF );
03743     n->Arg<CEnum*>(0) = a0;
03744     return n;
03745 }
03754 inline CNode* cTYPE_REF( CTypedef* a0, Coord_t* loc=NULL )
03755 {
03756     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTYPE_REF );
03757     n->Arg<CTypedef*>(0) = a0;
03758     return n;
03759 }
03769 inline CNode* cTYPE_REF( CObstack* heap, CTypedef* a0, Coord_t* loc=NULL )
03770 {
03771     CNode* n = new(heap) CNode( loc, eTYPE_REF );
03772     n->Arg<CTypedef*>(0) = a0;
03773     return n;
03774 }
03784 inline CNode* cNET_DECL( CNet* a0, CNode* a1, Coord_t* loc=NULL )
03785 {
03786     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNET_DECL );
03787     n->Arg<CNet*>(0) = a0;
03788     n->Arg<CNode*>(1) = a1;
03789     return n;
03790 }
03801 inline CNode* cNET_DECL( CObstack* heap, CNet* a0, CNode* a1, Coord_t* loc=NULL )
03802 {
03803     CNode* n = new(heap) CNode( loc, eNET_DECL );
03804     n->Arg<CNet*>(0) = a0;
03805     n->Arg<CNode*>(1) = a1;
03806     return n;
03807 }
03817 inline CNode* cVAR_DECL( CVar* a0, CNode* a1, Coord_t* loc=NULL )
03818 {
03819     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVAR_DECL );
03820     n->Arg<CVar*>(0) = a0;
03821     n->Arg<CNode*>(1) = a1;
03822     return n;
03823 }
03834 inline CNode* cVAR_DECL( CObstack* heap, CVar* a0, CNode* a1, Coord_t* loc=NULL )
03835 {
03836     CNode* n = new(heap) CNode( loc, eVAR_DECL );
03837     n->Arg<CVar*>(0) = a0;
03838     n->Arg<CNode*>(1) = a1;
03839     return n;
03840 }
03849 inline CNode* cPARAM_DECL( CParam* a0, Coord_t* loc=NULL )
03850 {
03851     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePARAM_DECL );
03852     n->Arg<CParam*>(0) = a0;
03853     return n;
03854 }
03864 inline CNode* cPARAM_DECL( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03865 {
03866     CNode* n = new(heap) CNode( loc, ePARAM_DECL );
03867     n->Arg<CParam*>(0) = a0;
03868     return n;
03869 }
03878 inline CNode* cSPECPARAM_DECL( CParam* a0, Coord_t* loc=NULL )
03879 {
03880     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSPECPARAM_DECL );
03881     n->Arg<CParam*>(0) = a0;
03882     return n;
03883 }
03893 inline CNode* cSPECPARAM_DECL( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03894 {
03895     CNode* n = new(heap) CNode( loc, eSPECPARAM_DECL );
03896     n->Arg<CParam*>(0) = a0;
03897     return n;
03898 }
03907 inline CNode* cPORT_DECL( CPortDir* a0, Coord_t* loc=NULL )
03908 {
03909     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_DECL );
03910     n->Arg<CPortDir*>(0) = a0;
03911     return n;
03912 }
03922 inline CNode* cPORT_DECL( CObstack* heap, CPortDir* a0, Coord_t* loc=NULL )
03923 {
03924     CNode* n = new(heap) CNode( loc, ePORT_DECL );
03925     n->Arg<CPortDir*>(0) = a0;
03926     return n;
03927 }
03936 inline CNode* cGENVAR_DECL( CGenvar* a0, Coord_t* loc=NULL )
03937 {
03938     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGENVAR_DECL );
03939     n->Arg<CGenvar*>(0) = a0;
03940     return n;
03941 }
03951 inline CNode* cGENVAR_DECL( CObstack* heap, CGenvar* a0, Coord_t* loc=NULL )
03952 {
03953     CNode* n = new(heap) CNode( loc, eGENVAR_DECL );
03954     n->Arg<CGenvar*>(0) = a0;
03955     return n;
03956 }
03965 inline CNode* cTYPEDEF_DECL( CTypedef* a0, Coord_t* loc=NULL )
03966 {
03967     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTYPEDEF_DECL );
03968     n->Arg<CTypedef*>(0) = a0;
03969     return n;
03970 }
03980 inline CNode* cTYPEDEF_DECL( CObstack* heap, CTypedef* a0, Coord_t* loc=NULL )
03981 {
03982     CNode* n = new(heap) CNode( loc, eTYPEDEF_DECL );
03983     n->Arg<CTypedef*>(0) = a0;
03984     return n;
03985 }
03995 inline CNode* cLIST( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03996 {
03997     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLIST );
03998     n->Arg<CNode*>(0) = a0;
03999     n->Arg<CNode*>(1) = a1;
04000     return n;
04001 }
04012 inline CNode* cLIST( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04013 {
04014     CNode* n = new(heap) CNode( loc, eLIST );
04015     n->Arg<CNode*>(0) = a0;
04016     n->Arg<CNode*>(1) = a1;
04017     return n;
04018 }
04028 inline CNode* cRANGE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04029 {
04030     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRANGE );
04031     n->Arg<CNode*>(0) = a0;
04032     n->Arg<CNode*>(1) = a1;
04033     return n;
04034 }
04045 inline CNode* cRANGE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04046 {
04047     CNode* n = new(heap) CNode( loc, eRANGE );
04048     n->Arg<CNode*>(0) = a0;
04049     n->Arg<CNode*>(1) = a1;
04050     return n;
04051 }
04061 inline CNode* cSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04062 {
04063     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSLICE );
04064     n->Arg<CNode*>(0) = a0;
04065     n->Arg<CNode*>(1) = a1;
04066     return n;
04067 }
04078 inline CNode* cSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04079 {
04080     CNode* n = new(heap) CNode( loc, eSLICE );
04081     n->Arg<CNode*>(0) = a0;
04082     n->Arg<CNode*>(1) = a1;
04083     return n;
04084 }
04094 inline CNode* cPSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04095 {
04096     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePSLICE );
04097     n->Arg<CNode*>(0) = a0;
04098     n->Arg<CNode*>(1) = a1;
04099     return n;
04100 }
04111 inline CNode* cPSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04112 {
04113     CNode* n = new(heap) CNode( loc, ePSLICE );
04114     n->Arg<CNode*>(0) = a0;
04115     n->Arg<CNode*>(1) = a1;
04116     return n;
04117 }
04127 inline CNode* cMSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04128 {
04129     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMSLICE );
04130     n->Arg<CNode*>(0) = a0;
04131     n->Arg<CNode*>(1) = a1;
04132     return n;
04133 }
04144 inline CNode* cMSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04145 {
04146     CNode* n = new(heap) CNode( loc, eMSLICE );
04147     n->Arg<CNode*>(0) = a0;
04148     n->Arg<CNode*>(1) = a1;
04149     return n;
04150 }
04159 inline CNode* cCVRI( CNode* a0, Coord_t* loc=NULL )
04160 {
04161     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCVRI );
04162     n->Arg<CNode*>(0) = a0;
04163     return n;
04164 }
04174 inline CNode* cCVRI( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04175 {
04176     CNode* n = new(heap) CNode( loc, eCVRI );
04177     n->Arg<CNode*>(0) = a0;
04178     return n;
04179 }
04188 inline CNode* cCVIR( CNode* a0, Coord_t* loc=NULL )
04189 {
04190     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCVIR );
04191     n->Arg<CNode*>(0) = a0;
04192     return n;
04193 }
04203 inline CNode* cCVIR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04204 {
04205     CNode* n = new(heap) CNode( loc, eCVIR );
04206     n->Arg<CNode*>(0) = a0;
04207     return n;
04208 }
04218 inline CNode* cREP( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04219 {
04220     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREP );
04221     n->Arg<CNode*>(0) = a0;
04222     n->Arg<CNode*>(1) = a1;
04223     return n;
04224 }
04235 inline CNode* cREP( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04236 {
04237     CNode* n = new(heap) CNode( loc, eREP );
04238     n->Arg<CNode*>(0) = a0;
04239     n->Arg<CNode*>(1) = a1;
04240     return n;
04241 }
04251 inline CNode* cCAT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04252 {
04253     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCAT );
04254     n->Arg<CNode*>(0) = a0;
04255     n->Arg<CNode*>(1) = a1;
04256     return n;
04257 }
04268 inline CNode* cCAT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04269 {
04270     CNode* n = new(heap) CNode( loc, eCAT );
04271     n->Arg<CNode*>(0) = a0;
04272     n->Arg<CNode*>(1) = a1;
04273     return n;
04274 }
04283 inline CNode* cUCAT( CNode* a0, Coord_t* loc=NULL )
04284 {
04285     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eUCAT );
04286     n->Arg<CNode*>(0) = a0;
04287     return n;
04288 }
04298 inline CNode* cUCAT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04299 {
04300     CNode* n = new(heap) CNode( loc, eUCAT );
04301     n->Arg<CNode*>(0) = a0;
04302     return n;
04303 }
04312 inline CNode* cCOM( CNode* a0, Coord_t* loc=NULL )
04313 {
04314     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCOM );
04315     n->Arg<CNode*>(0) = a0;
04316     return n;
04317 }
04327 inline CNode* cCOM( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04328 {
04329     CNode* n = new(heap) CNode( loc, eCOM );
04330     n->Arg<CNode*>(0) = a0;
04331     return n;
04332 }
04341 inline CNode* cNEG( CNode* a0, Coord_t* loc=NULL )
04342 {
04343     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNEG );
04344     n->Arg<CNode*>(0) = a0;
04345     return n;
04346 }
04356 inline CNode* cNEG( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04357 {
04358     CNode* n = new(heap) CNode( loc, eNEG );
04359     n->Arg<CNode*>(0) = a0;
04360     return n;
04361 }
04370 inline CNode* cPLUS( CNode* a0, Coord_t* loc=NULL )
04371 {
04372     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePLUS );
04373     n->Arg<CNode*>(0) = a0;
04374     return n;
04375 }
04385 inline CNode* cPLUS( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04386 {
04387     CNode* n = new(heap) CNode( loc, ePLUS );
04388     n->Arg<CNode*>(0) = a0;
04389     return n;
04390 }
04399 inline CNode* cNOT( CNode* a0, Coord_t* loc=NULL )
04400 {
04401     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNOT );
04402     n->Arg<CNode*>(0) = a0;
04403     return n;
04404 }
04414 inline CNode* cNOT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04415 {
04416     CNode* n = new(heap) CNode( loc, eNOT );
04417     n->Arg<CNode*>(0) = a0;
04418     return n;
04419 }
04429 inline CNode* cGT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04430 {
04431     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGT );
04432     n->Arg<CNode*>(0) = a0;
04433     n->Arg<CNode*>(1) = a1;
04434     return n;
04435 }
04446 inline CNode* cGT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04447 {
04448     CNode* n = new(heap) CNode( loc, eGT );
04449     n->Arg<CNode*>(0) = a0;
04450     n->Arg<CNode*>(1) = a1;
04451     return n;
04452 }
04462 inline CNode* cGE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04463 {
04464     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGE );
04465     n->Arg<CNode*>(0) = a0;
04466     n->Arg<CNode*>(1) = a1;
04467     return n;
04468 }
04479 inline CNode* cGE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04480 {
04481     CNode* n = new(heap) CNode( loc, eGE );
04482     n->Arg<CNode*>(0) = a0;
04483     n->Arg<CNode*>(1) = a1;
04484     return n;
04485 }
04495 inline CNode* cLT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04496 {
04497     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLT );
04498     n->Arg<CNode*>(0) = a0;
04499     n->Arg<CNode*>(1) = a1;
04500     return n;
04501 }
04512 inline CNode* cLT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04513 {
04514     CNode* n = new(heap) CNode( loc, eLT );
04515     n->Arg<CNode*>(0) = a0;
04516     n->Arg<CNode*>(1) = a1;
04517     return n;
04518 }
04528 inline CNode* cLE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04529 {
04530     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLE );
04531     n->Arg<CNode*>(0) = a0;
04532     n->Arg<CNode*>(1) = a1;
04533     return n;
04534 }
04545 inline CNode* cLE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04546 {
04547     CNode* n = new(heap) CNode( loc, eLE );
04548     n->Arg<CNode*>(0) = a0;
04549     n->Arg<CNode*>(1) = a1;
04550     return n;
04551 }
04561 inline CNode* cLAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04562 {
04563     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLAND );
04564     n->Arg<CNode*>(0) = a0;
04565     n->Arg<CNode*>(1) = a1;
04566     return n;
04567 }
04578 inline CNode* cLAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04579 {
04580     CNode* n = new(heap) CNode( loc, eLAND );
04581     n->Arg<CNode*>(0) = a0;
04582     n->Arg<CNode*>(1) = a1;
04583     return n;
04584 }
04594 inline CNode* cLOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04595 {
04596     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLOR );
04597     n->Arg<CNode*>(0) = a0;
04598     n->Arg<CNode*>(1) = a1;
04599     return n;
04600 }
04611 inline CNode* cLOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04612 {
04613     CNode* n = new(heap) CNode( loc, eLOR );
04614     n->Arg<CNode*>(0) = a0;
04615     n->Arg<CNode*>(1) = a1;
04616     return n;
04617 }
04627 inline CNode* cCEQ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04628 {
04629     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCEQ );
04630     n->Arg<CNode*>(0) = a0;
04631     n->Arg<CNode*>(1) = a1;
04632     return n;
04633 }
04644 inline CNode* cCEQ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04645 {
04646     CNode* n = new(heap) CNode( loc, eCEQ );
04647     n->Arg<CNode*>(0) = a0;
04648     n->Arg<CNode*>(1) = a1;
04649     return n;
04650 }
04660 inline CNode* cCNE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04661 {
04662     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCNE );
04663     n->Arg<CNode*>(0) = a0;
04664     n->Arg<CNode*>(1) = a1;
04665     return n;
04666 }
04677 inline CNode* cCNE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04678 {
04679     CNode* n = new(heap) CNode( loc, eCNE );
04680     n->Arg<CNode*>(0) = a0;
04681     n->Arg<CNode*>(1) = a1;
04682     return n;
04683 }
04693 inline CNode* cEQ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04694 {
04695     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEQ );
04696     n->Arg<CNode*>(0) = a0;
04697     n->Arg<CNode*>(1) = a1;
04698     return n;
04699 }
04710 inline CNode* cEQ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04711 {
04712     CNode* n = new(heap) CNode( loc, eEQ );
04713     n->Arg<CNode*>(0) = a0;
04714     n->Arg<CNode*>(1) = a1;
04715     return n;
04716 }
04726 inline CNode* cNE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04727 {
04728     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNE );
04729     n->Arg<CNode*>(0) = a0;
04730     n->Arg<CNode*>(1) = a1;
04731     return n;
04732 }
04743 inline CNode* cNE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04744 {
04745     CNode* n = new(heap) CNode( loc, eNE );
04746     n->Arg<CNode*>(0) = a0;
04747     n->Arg<CNode*>(1) = a1;
04748     return n;
04749 }
04758 inline CNode* cRAND( CNode* a0, Coord_t* loc=NULL )
04759 {
04760     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRAND );
04761     n->Arg<CNode*>(0) = a0;
04762     return n;
04763 }
04773 inline CNode* cRAND( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04774 {
04775     CNode* n = new(heap) CNode( loc, eRAND );
04776     n->Arg<CNode*>(0) = a0;
04777     return n;
04778 }
04787 inline CNode* cRNAND( CNode* a0, Coord_t* loc=NULL )
04788 {
04789     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRNAND );
04790     n->Arg<CNode*>(0) = a0;
04791     return n;
04792 }
04802 inline CNode* cRNAND( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04803 {
04804     CNode* n = new(heap) CNode( loc, eRNAND );
04805     n->Arg<CNode*>(0) = a0;
04806     return n;
04807 }
04816 inline CNode* cROR( CNode* a0, Coord_t* loc=NULL )
04817 {
04818     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eROR );
04819     n->Arg<CNode*>(0) = a0;
04820     return n;
04821 }
04831 inline CNode* cROR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04832 {
04833     CNode* n = new(heap) CNode( loc, eROR );
04834     n->Arg<CNode*>(0) = a0;
04835     return n;
04836 }
04845 inline CNode* cRNOR( CNode* a0, Coord_t* loc=NULL )
04846 {
04847     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRNOR );
04848     n->Arg<CNode*>(0) = a0;
04849     return n;
04850 }
04860 inline CNode* cRNOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04861 {
04862     CNode* n = new(heap) CNode( loc, eRNOR );
04863     n->Arg<CNode*>(0) = a0;
04864     return n;
04865 }
04874 inline CNode* cRXOR( CNode* a0, Coord_t* loc=NULL )
04875 {
04876     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRXOR );
04877     n->Arg<CNode*>(0) = a0;
04878     return n;
04879 }
04889 inline CNode* cRXOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04890 {
04891     CNode* n = new(heap) CNode( loc, eRXOR );
04892     n->Arg<CNode*>(0) = a0;
04893     return n;
04894 }
04903 inline CNode* cRXNOR( CNode* a0, Coord_t* loc=NULL )
04904 {
04905     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRXNOR );
04906     n->Arg<CNode*>(0) = a0;
04907     return n;
04908 }
04918 inline CNode* cRXNOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04919 {
04920     CNode* n = new(heap) CNode( loc, eRXNOR );
04921     n->Arg<CNode*>(0) = a0;
04922     return n;
04923 }
04934 inline CNode* cHOOK( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04935 {
04936     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eHOOK );
04937     n->Arg<CNode*>(0) = a0;
04938     n->Arg<CNode*>(1) = a1;
04939     n->Arg<CNode*>(2) = a2;
04940     return n;
04941 }
04953 inline CNode* cHOOK( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04954 {
04955     CNode* n = new(heap) CNode( loc, eHOOK );
04956     n->Arg<CNode*>(0) = a0;
04957     n->Arg<CNode*>(1) = a1;
04958     n->Arg<CNode*>(2) = a2;
04959     return n;
04960 }
04969 inline CNode* cINIT( CNode* a0, Coord_t* loc=NULL )
04970 {
04971     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eINIT );
04972     n->Arg<CNode*>(0) = a0;
04973     return n;
04974 }
04984 inline CNode* cINIT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04985 {
04986     CNode* n = new(heap) CNode( loc, eINIT );
04987     n->Arg<CNode*>(0) = a0;
04988     return n;
04989 }
04998 inline CNode* cALWAYS( CNode* a0, Coord_t* loc=NULL )
04999 {
05000     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eALWAYS );
05001     n->Arg<CNode*>(0) = a0;
05002     return n;
05003 }
05013 inline CNode* cALWAYS( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05014 {
05015     CNode* n = new(heap) CNode( loc, eALWAYS );
05016     n->Arg<CNode*>(0) = a0;
05017     return n;
05018 }
05027 inline CNode* cALWAYS_LATCH( CNode* a0, Coord_t* loc=NULL )
05028 {
05029     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eALWAYS_LATCH );
05030     n->Arg<CNode*>(0) = a0;
05031     return n;
05032 }
05042 inline CNode* cALWAYS_LATCH( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05043 {
05044     CNode* n = new(heap) CNode( loc, eALWAYS_LATCH );
05045     n->Arg<CNode*>(0) = a0;
05046     return n;
05047 }
05056 inline CNode* cALWAYS_FF( CNode* a0, Coord_t* loc=NULL )
05057 {
05058     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eALWAYS_FF );
05059     n->Arg<CNode*>(0) = a0;
05060     return n;
05061 }
05071 inline CNode* cALWAYS_FF( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05072 {
05073     CNode* n = new(heap) CNode( loc, eALWAYS_FF );
05074     n->Arg<CNode*>(0) = a0;
05075     return n;
05076 }
05085 inline CNode* cALWAYS_COMB( CNode* a0, Coord_t* loc=NULL )
05086 {
05087     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eALWAYS_COMB );
05088     n->Arg<CNode*>(0) = a0;
05089     return n;
05090 }
05100 inline CNode* cALWAYS_COMB( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05101 {
05102     CNode* n = new(heap) CNode( loc, eALWAYS_COMB );
05103     n->Arg<CNode*>(0) = a0;
05104     return n;
05105 }
05115 inline CNode* cEVENT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05116 {
05117     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVENT );
05118     n->Arg<CNode*>(0) = a0;
05119     n->Arg<CNode*>(1) = a1;
05120     return n;
05121 }
05132 inline CNode* cEVENT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05133 {
05134     CNode* n = new(heap) CNode( loc, eEVENT );
05135     n->Arg<CNode*>(0) = a0;
05136     n->Arg<CNode*>(1) = a1;
05137     return n;
05138 }
05148 inline CNode* cBLOCK_REF( CBlock* a0, CNode* a1, Coord_t* loc=NULL )
05149 {
05150     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eBLOCK_REF );
05151     n->Arg<CBlock*>(0) = a0;
05152     n->Arg<CNode*>(1) = a1;
05153     return n;
05154 }
05165 inline CNode* cBLOCK_REF( CObstack* heap, CBlock* a0, CNode* a1, Coord_t* loc=NULL )
05166 {
05167     CNode* n = new(heap) CNode( loc, eBLOCK_REF );
05168     n->Arg<CBlock*>(0) = a0;
05169     n->Arg<CNode*>(1) = a1;
05170     return n;
05171 }
05181 inline CNode* cSPECIFY_REF( CSpecify* a0, CNode* a1, Coord_t* loc=NULL )
05182 {
05183     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSPECIFY_REF );
05184     n->Arg<CSpecify*>(0) = a0;
05185     n->Arg<CNode*>(1) = a1;
05186     return n;
05187 }
05198 inline CNode* cSPECIFY_REF( CObstack* heap, CSpecify* a0, CNode* a1, Coord_t* loc=NULL )
05199 {
05200     CNode* n = new(heap) CNode( loc, eSPECIFY_REF );
05201     n->Arg<CSpecify*>(0) = a0;
05202     n->Arg<CNode*>(1) = a1;
05203     return n;
05204 }
05215 inline CNode* cASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05216 {
05217     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eASSIGN );
05218     n->Arg<CNode*>(0) = a0;
05219     n->Arg<CNode*>(1) = a1;
05220     n->Arg<CNode*>(2) = a2;
05221     return n;
05222 }
05234 inline CNode* cASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05235 {
05236     CNode* n = new(heap) CNode( loc, eASSIGN );
05237     n->Arg<CNode*>(0) = a0;
05238     n->Arg<CNode*>(1) = a1;
05239     n->Arg<CNode*>(2) = a2;
05240     return n;
05241 }
05252 inline CNode* cADD_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05253 {
05254     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eADD_ASSIGN );
05255     n->Arg<CNode*>(0) = a0;
05256     n->Arg<CNode*>(1) = a1;
05257     n->Arg<CNode*>(2) = a2;
05258     return n;
05259 }
05271 inline CNode* cADD_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05272 {
05273     CNode* n = new(heap) CNode( loc, eADD_ASSIGN );
05274     n->Arg<CNode*>(0) = a0;
05275     n->Arg<CNode*>(1) = a1;
05276     n->Arg<CNode*>(2) = a2;
05277     return n;
05278 }
05289 inline CNode* cSUB_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05290 {
05291     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSUB_ASSIGN );
05292     n->Arg<CNode*>(0) = a0;
05293     n->Arg<CNode*>(1) = a1;
05294     n->Arg<CNode*>(2) = a2;
05295     return n;
05296 }
05308 inline CNode* cSUB_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05309 {
05310     CNode* n = new(heap) CNode( loc, eSUB_ASSIGN );
05311     n->Arg<CNode*>(0) = a0;
05312     n->Arg<CNode*>(1) = a1;
05313     n->Arg<CNode*>(2) = a2;
05314     return n;
05315 }
05326 inline CNode* cMUL_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05327 {
05328     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMUL_ASSIGN );
05329     n->Arg<CNode*>(0) = a0;
05330     n->Arg<CNode*>(1) = a1;
05331     n->Arg<CNode*>(2) = a2;
05332     return n;
05333 }
05345 inline CNode* cMUL_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05346 {
05347     CNode* n = new(heap) CNode( loc, eMUL_ASSIGN );
05348     n->Arg<CNode*>(0) = a0;
05349     n->Arg<CNode*>(1) = a1;
05350     n->Arg<CNode*>(2) = a2;
05351     return n;
05352 }
05363 inline CNode* cDIV_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05364 {
05365     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDIV_ASSIGN );
05366     n->Arg<CNode*>(0) = a0;
05367     n->Arg<CNode*>(1) = a1;
05368     n->Arg<CNode*>(2) = a2;
05369     return n;
05370 }
05382 inline CNode* cDIV_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05383 {
05384     CNode* n = new(heap) CNode( loc, eDIV_ASSIGN );
05385     n->Arg<CNode*>(0) = a0;
05386     n->Arg<CNode*>(1) = a1;
05387     n->Arg<CNode*>(2) = a2;
05388     return n;
05389 }
05400 inline CNode* cMOD_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05401 {
05402     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMOD_ASSIGN );
05403     n->Arg<CNode*>(0) = a0;
05404     n->Arg<CNode*>(1) = a1;
05405     n->Arg<CNode*>(2) = a2;
05406     return n;
05407 }
05419 inline CNode* cMOD_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05420 {
05421     CNode* n = new(heap) CNode( loc, eMOD_ASSIGN );
05422     n->Arg<CNode*>(0) = a0;
05423     n->Arg<CNode*>(1) = a1;
05424     n->Arg<CNode*>(2) = a2;
05425     return n;
05426 }
05437 inline CNode* cAND_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05438 {
05439     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eAND_ASSIGN );
05440     n->Arg<CNode*>(0) = a0;
05441     n->Arg<CNode*>(1) = a1;
05442     n->Arg<CNode*>(2) = a2;
05443     return n;
05444 }
05456 inline CNode* cAND_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05457 {
05458     CNode* n = new(heap) CNode( loc, eAND_ASSIGN );
05459     n->Arg<CNode*>(0) = a0;
05460     n->Arg<CNode*>(1) = a1;
05461     n->Arg<CNode*>(2) = a2;
05462     return n;
05463 }
05474 inline CNode* cOR_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05475 {
05476     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eOR_ASSIGN );
05477     n->Arg<CNode*>(0) = a0;
05478     n->Arg<CNode*>(1) = a1;
05479     n->Arg<CNode*>(2) = a2;
05480     return n;
05481 }
05493 inline CNode* cOR_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05494 {
05495     CNode* n = new(heap) CNode( loc, eOR_ASSIGN );
05496     n->Arg<CNode*>(0) = a0;
05497     n->Arg<CNode*>(1) = a1;
05498     n->Arg<CNode*>(2) = a2;
05499     return n;
05500 }
05511 inline CNode* cXOR_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05512 {
05513     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eXOR_ASSIGN );
05514     n->Arg<CNode*>(0) = a0;
05515     n->Arg<CNode*>(1) = a1;
05516     n->Arg<CNode*>(2) = a2;
05517     return n;
05518 }
05530 inline CNode* cXOR_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05531 {
05532     CNode* n = new(heap) CNode( loc, eXOR_ASSIGN );
05533     n->Arg<CNode*>(0) = a0;
05534     n->Arg<CNode*>(1) = a1;
05535     n->Arg<CNode*>(2) = a2;
05536     return n;
05537 }
05548 inline CNode* cLSH_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05549 {
05550     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSH_ASSIGN );
05551     n->Arg<CNode*>(0) = a0;
05552     n->Arg<CNode*>(1) = a1;
05553     n->Arg<CNode*>(2) = a2;
05554     return n;
05555 }
05567 inline CNode* cLSH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05568 {
05569     CNode* n = new(heap) CNode( loc, eLSH_ASSIGN );
05570     n->Arg<CNode*>(0) = a0;
05571     n->Arg<CNode*>(1) = a1;
05572     n->Arg<CNode*>(2) = a2;
05573     return n;
05574 }
05585 inline CNode* cRSH_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05586 {
05587     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSH_ASSIGN );
05588     n->Arg<CNode*>(0) = a0;
05589     n->Arg<CNode*>(1) = a1;
05590     n->Arg<CNode*>(2) = a2;
05591     return n;
05592 }
05604 inline CNode* cRSH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05605 {
05606     CNode* n = new(heap) CNode( loc, eRSH_ASSIGN );
05607     n->Arg<CNode*>(0) = a0;
05608     n->Arg<CNode*>(1) = a1;
05609     n->Arg<CNode*>(2) = a2;
05610     return n;
05611 }
05622 inline CNode* cLSHA_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05623 {
05624     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSHA_ASSIGN );
05625     n->Arg<CNode*>(0) = a0;
05626     n->Arg<CNode*>(1) = a1;
05627     n->Arg<CNode*>(2) = a2;
05628     return n;
05629 }
05641 inline CNode* cLSHA_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05642 {
05643     CNode* n = new(heap) CNode( loc, eLSHA_ASSIGN );
05644     n->Arg<CNode*>(0) = a0;
05645     n->Arg<CNode*>(1) = a1;
05646     n->Arg<CNode*>(2) = a2;
05647     return n;
05648 }
05659 inline CNode* cRSHA_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05660 {
05661     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSHA_ASSIGN );
05662     n->Arg<CNode*>(0) = a0;
05663     n->Arg<CNode*>(1) = a1;
05664     n->Arg<CNode*>(2) = a2;
05665     return n;
05666 }
05678 inline CNode* cRSHA_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05679 {
05680     CNode* n = new(heap) CNode( loc, eRSHA_ASSIGN );
05681     n->Arg<CNode*>(0) = a0;
05682     n->Arg<CNode*>(1) = a1;
05683     n->Arg<CNode*>(2) = a2;
05684     return n;
05685 }
05695 inline CNode* cFORCE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05696 {
05697     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFORCE );
05698     n->Arg<CNode*>(0) = a0;
05699     n->Arg<CNode*>(1) = a1;
05700     return n;
05701 }
05712 inline CNode* cFORCE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05713 {
05714     CNode* n = new(heap) CNode( loc, eFORCE );
05715     n->Arg<CNode*>(0) = a0;
05716     n->Arg<CNode*>(1) = a1;
05717     return n;
05718 }
05727 inline CNode* cRELEASE( CNode* a0, Coord_t* loc=NULL )
05728 {
05729     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRELEASE );
05730     n->Arg<CNode*>(0) = a0;
05731     return n;
05732 }
05742 inline CNode* cRELEASE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05743 {
05744     CNode* n = new(heap) CNode( loc, eRELEASE );
05745     n->Arg<CNode*>(0) = a0;
05746     return n;
05747 }
05758 inline CNode* cNBASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05759 {
05760     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNBASSIGN );
05761     n->Arg<CNode*>(0) = a0;
05762     n->Arg<CNode*>(1) = a1;
05763     n->Arg<CNode*>(2) = a2;
05764     return n;
05765 }
05777 inline CNode* cNBASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05778 {
05779     CNode* n = new(heap) CNode( loc, eNBASSIGN );
05780     n->Arg<CNode*>(0) = a0;
05781     n->Arg<CNode*>(1) = a1;
05782     n->Arg<CNode*>(2) = a2;
05783     return n;
05784 }
05793 inline CNode* cPOSEDGE( CNode* a0, Coord_t* loc=NULL )
05794 {
05795     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOSEDGE );
05796     n->Arg<CNode*>(0) = a0;
05797     return n;
05798 }
05808 inline CNode* cPOSEDGE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05809 {
05810     CNode* n = new(heap) CNode( loc, ePOSEDGE );
05811     n->Arg<CNode*>(0) = a0;
05812     return n;
05813 }
05822 inline CNode* cNEGEDGE( CNode* a0, Coord_t* loc=NULL )
05823 {
05824     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNEGEDGE );
05825     n->Arg<CNode*>(0) = a0;
05826     return n;
05827 }
05837 inline CNode* cNEGEDGE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05838 {
05839     CNode* n = new(heap) CNode( loc, eNEGEDGE );
05840     n->Arg<CNode*>(0) = a0;
05841     return n;
05842 }
05852 inline CNode* cEDGE( CNode* a0, Edge_t a1, Coord_t* loc=NULL )
05853 {
05854     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEDGE );
05855     n->Arg<CNode*>(0) = a0;
05856     n->Arg<Edge_t>(1) = a1;
05857     return n;
05858 }
05869 inline CNode* cEDGE( CObstack* heap, CNode* a0, Edge_t a1, Coord_t* loc=NULL )
05870 {
05871     CNode* n = new(heap) CNode( loc, eEDGE );
05872     n->Arg<CNode*>(0) = a0;
05873     n->Arg<Edge_t>(1) = a1;
05874     return n;
05875 }
05885 inline CNode* cEVOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05886 {
05887     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVOR );
05888     n->Arg<CNode*>(0) = a0;
05889     n->Arg<CNode*>(1) = a1;
05890     return n;
05891 }
05902 inline CNode* cEVOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05903 {
05904     CNode* n = new(heap) CNode( loc, eEVOR );
05905     n->Arg<CNode*>(0) = a0;
05906     n->Arg<CNode*>(1) = a1;
05907     return n;
05908 }
05918 inline CNode* cDELAY( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05919 {
05920     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDELAY );
05921     n->Arg<CNode*>(0) = a0;
05922     n->Arg<CNode*>(1) = a1;
05923     return n;
05924 }
05935 inline CNode* cDELAY( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05936 {
05937     CNode* n = new(heap) CNode( loc, eDELAY );
05938     n->Arg<CNode*>(0) = a0;
05939     n->Arg<CNode*>(1) = a1;
05940     return n;
05941 }
05952 inline CNode* cMTM( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05953 {
05954     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMTM );
05955     n->Arg<CNode*>(0) = a0;
05956     n->Arg<CNode*>(1) = a1;
05957     n->Arg<CNode*>(2) = a2;
05958     return n;
05959 }
05971 inline CNode* cMTM( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05972 {
05973     CNode* n = new(heap) CNode( loc, eMTM );
05974     n->Arg<CNode*>(0) = a0;
05975     n->Arg<CNode*>(1) = a1;
05976     n->Arg<CNode*>(2) = a2;
05977     return n;
05978 }
05989 inline CNode* cIF( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05990 {
05991     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eIF );
05992     n->Arg<CNode*>(0) = a0;
05993     n->Arg<CNode*>(1) = a1;
05994     n->Arg<CNode*>(2) = a2;
05995     return n;
05996 }
06008 inline CNode* cIF( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
06009 {
06010     CNode* n = new(heap) CNode( loc, eIF );
06011     n->Arg<CNode*>(0) = a0;
06012     n->Arg<CNode*>(1) = a1;
06013     n->Arg<CNode*>(2) = a2;
06014     return n;
06015 }
06024 inline CNode* cFOREVER( CNode* a0, Coord_t* loc=NULL )
06025 {
06026     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFOREVER );
06027     n->Arg<CNode*>(0) = a0;
06028     return n;
06029 }
06039 inline CNode* cFOREVER( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06040 {
06041     CNode* n = new(heap) CNode( loc, eFOREVER );
06042     n->Arg<CNode*>(0) = a0;
06043     return n;
06044 }
06054 inline CNode* cREPEAT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06055 {
06056     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREPEAT );
06057     n->Arg<CNode*>(0) = a0;
06058     n->Arg<CNode*>(1) = a1;
06059     return n;
06060 }
06071 inline CNode* cREPEAT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06072 {
06073     CNode* n = new(heap) CNode( loc, eREPEAT );
06074     n->Arg<CNode*>(0) = a0;
06075     n->Arg<CNode*>(1) = a1;
06076     return n;
06077 }
06087 inline CNode* cWHILE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06088 {
06089     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWHILE );
06090     n->Arg<CNode*>(0) = a0;
06091     n->Arg<CNode*>(1) = a1;
06092     return n;
06093 }
06104 inline CNode* cWHILE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06105 {
06106     CNode* n = new(heap) CNode( loc, eWHILE );
06107     n->Arg<CNode*>(0) = a0;
06108     n->Arg<CNode*>(1) = a1;
06109     return n;
06110 }
06120 inline CNode* cWAIT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06121 {
06122     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWAIT );
06123     n->Arg<CNode*>(0) = a0;
06124     n->Arg<CNode*>(1) = a1;
06125     return n;
06126 }
06137 inline CNode* cWAIT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06138 {
06139     CNode* n = new(heap) CNode( loc, eWAIT );
06140     n->Arg<CNode*>(0) = a0;
06141     n->Arg<CNode*>(1) = a1;
06142     return n;
06143 }
06155 inline CNode* cFOR( CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06156 {
06157     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFOR );
06158     n->Arg<CNode*>(0) = a0;
06159     n->Arg<CNode*>(1) = a1;
06160     n->Arg<CNode*>(2) = a2;
06161     n->Arg<CNode*>(3) = a3;
06162     return n;
06163 }
06176 inline CNode* cFOR( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06177 {
06178     CNode* n = new(heap) CNode( loc, eFOR );
06179     n->Arg<CNode*>(0) = a0;
06180     n->Arg<CNode*>(1) = a1;
06181     n->Arg<CNode*>(2) = a2;
06182     n->Arg<CNode*>(3) = a3;
06183     return n;
06184 }
06194 inline CNode* cCASE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06195 {
06196     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASE );
06197     n->Arg<CNode*>(0) = a0;
06198     n->Arg<CNode*>(1) = a1;
06199     return n;
06200 }
06211 inline CNode* cCASE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06212 {
06213     CNode* n = new(heap) CNode( loc, eCASE );
06214     n->Arg<CNode*>(0) = a0;
06215     n->Arg<CNode*>(1) = a1;
06216     return n;
06217 }
06227 inline CNode* cCASEX( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06228 {
06229     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEX );
06230     n->Arg<CNode*>(0) = a0;
06231     n->Arg<CNode*>(1) = a1;
06232     return n;
06233 }
06244 inline CNode* cCASEX( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06245 {
06246     CNode* n = new(heap) CNode( loc, eCASEX );
06247     n->Arg<CNode*>(0) = a0;
06248     n->Arg<CNode*>(1) = a1;
06249     return n;
06250 }
06260 inline CNode* cCASEZ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06261 {
06262     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEZ );
06263     n->Arg<CNode*>(0) = a0;
06264     n->Arg<CNode*>(1) = a1;
06265     return n;
06266 }
06277 inline CNode* cCASEZ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06278 {
06279     CNode* n = new(heap) CNode( loc, eCASEZ );
06280     n->Arg<CNode*>(0) = a0;
06281     n->Arg<CNode*>(1) = a1;
06282     return n;
06283 }
06293 inline CNode* cCASEITEM( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06294 {
06295     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEITEM );
06296     n->Arg<CNode*>(0) = a0;
06297     n->Arg<CNode*>(1) = a1;
06298     return n;
06299 }
06310 inline CNode* cCASEITEM( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06311 {
06312     CNode* n = new(heap) CNode( loc, eCASEITEM );
06313     n->Arg<CNode*>(0) = a0;
06314     n->Arg<CNode*>(1) = a1;
06315     return n;
06316 }
06328 inline CNode* cCASSIGN( StrengthPair_t* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06329 {
06330     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASSIGN );
06331     n->Arg<StrengthPair_t*>(0) = a0;
06332     n->Arg<CNode*>(1) = a1;
06333     n->Arg<CNode*>(2) = a2;
06334     n->Arg<CNode*>(3) = a3;
06335     return n;
06336 }
06349 inline CNode* cCASSIGN( CObstack* heap, StrengthPair_t* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06350 {
06351     CNode* n = new(heap) CNode( loc, eCASSIGN );
06352     n->Arg<StrengthPair_t*>(0) = a0;
06353     n->Arg<CNode*>(1) = a1;
06354     n->Arg<CNode*>(2) = a2;
06355     n->Arg<CNode*>(3) = a3;
06356     return n;
06357 }
06367 inline CNode* cARG( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
06368 {
06369     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eARG );
06370     n->Arg<CSymbol*>(0) = a0;
06371     n->Arg<CNode*>(1) = a1;
06372     return n;
06373 }
06384 inline CNode* cARG( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
06385 {
06386     CNode* n = new(heap) CNode( loc, eARG );
06387     n->Arg<CSymbol*>(0) = a0;
06388     n->Arg<CNode*>(1) = a1;
06389     return n;
06390 }
06399 inline CNode* cFUNCTION_DEF( CFunction* a0, Coord_t* loc=NULL )
06400 {
06401     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFUNCTION_DEF );
06402     n->Arg<CFunction*>(0) = a0;
06403     return n;
06404 }
06414 inline CNode* cFUNCTION_DEF( CObstack* heap, CFunction* a0, Coord_t* loc=NULL )
06415 {
06416     CNode* n = new(heap) CNode( loc, eFUNCTION_DEF );
06417     n->Arg<CFunction*>(0) = a0;
06418     return n;
06419 }
06428 inline CNode* cMODULE_DEF( CModule* a0, Coord_t* loc=NULL )
06429 {
06430     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMODULE_DEF );
06431     n->Arg<CModule*>(0) = a0;
06432     return n;
06433 }
06443 inline CNode* cMODULE_DEF( CObstack* heap, CModule* a0, Coord_t* loc=NULL )
06444 {
06445     CNode* n = new(heap) CNode( loc, eMODULE_DEF );
06446     n->Arg<CModule*>(0) = a0;
06447     return n;
06448 }
06458 inline CNode* cREPEAT_CONTROL( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06459 {
06460     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREPEAT_CONTROL );
06461     n->Arg<CNode*>(0) = a0;
06462     n->Arg<CNode*>(1) = a1;
06463     return n;
06464 }
06475 inline CNode* cREPEAT_CONTROL( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06476 {
06477     CNode* n = new(heap) CNode( loc, eREPEAT_CONTROL );
06478     n->Arg<CNode*>(0) = a0;
06479     n->Arg<CNode*>(1) = a1;
06480     return n;
06481 }
06490 inline CNode* cDELAY_CONTROL( CNode* a0, Coord_t* loc=NULL )
06491 {
06492     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDELAY_CONTROL );
06493     n->Arg<CNode*>(0) = a0;
06494     return n;
06495 }
06505 inline CNode* cDELAY_CONTROL( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06506 {
06507     CNode* n = new(heap) CNode( loc, eDELAY_CONTROL );
06508     n->Arg<CNode*>(0) = a0;
06509     return n;
06510 }
06519 inline CNode* cEVENT_CONTROL( CNode* a0, Coord_t* loc=NULL )
06520 {
06521     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVENT_CONTROL );
06522     n->Arg<CNode*>(0) = a0;
06523     return n;
06524 }
06534 inline CNode* cEVENT_CONTROL( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06535 {
06536     CNode* n = new(heap) CNode( loc, eEVENT_CONTROL );
06537     n->Arg<CNode*>(0) = a0;
06538     return n;
06539 }
06548 inline CNode* cEXTERNAL_REF( CSymbol* a0, Coord_t* loc=NULL )
06549 {
06550     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEXTERNAL_REF );
06551     n->Arg<CSymbol*>(0) = a0;
06552     return n;
06553 }
06563 inline CNode* cEXTERNAL_REF( CObstack* heap, CSymbol* a0, Coord_t* loc=NULL )
06564 {
06565     CNode* n = new(heap) CNode( loc, eEXTERNAL_REF );
06566     n->Arg<CSymbol*>(0) = a0;
06567     return n;
06568 }
06577 inline CNode* cPORT_DEF( CPort* a0, Coord_t* loc=NULL )
06578 {
06579     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_DEF );
06580     n->Arg<CPort*>(0) = a0;
06581     return n;
06582 }
06592 inline CNode* cPORT_DEF( CObstack* heap, CPort* a0, Coord_t* loc=NULL )
06593 {
06594     CNode* n = new(heap) CNode( loc, ePORT_DEF );
06595     n->Arg<CPort*>(0) = a0;
06596     return n;
06597 }
06607 inline CNode* cDEFPARAM( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06608 {
06609     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDEFPARAM );
06610     n->Arg<CNode*>(0) = a0;
06611     n->Arg<CNode*>(1) = a1;
06612     return n;
06613 }
06624 inline CNode* cDEFPARAM( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06625 {
06626     CNode* n = new(heap) CNode( loc, eDEFPARAM );
06627     n->Arg<CNode*>(0) = a0;
06628     n->Arg<CNode*>(1) = a1;
06629     return n;
06630 }
06645 inline CNode* cPATH( int a0, CNode* a1, int a2, int a3, CNode* a4, int a5, CNode* a6, Coord_t* loc=NULL )
06646 {
06647     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePATH );
06648     n->Arg<int>(0) = a0;
06649     n->Arg<CNode*>(1) = a1;
06650     n->Arg<int>(2) = a2;
06651     n->Arg<int>(3) = a3;
06652     n->Arg<CNode*>(4) = a4;
06653     n->Arg<int>(5) = a5;
06654     n->Arg<CNode*>(6) = a6;
06655     return n;
06656 }
06672 inline CNode* cPATH( CObstack* heap, int a0, CNode* a1, int a2, int a3, CNode* a4, int a5, CNode* a6, Coord_t* loc=NULL )
06673 {
06674     CNode* n = new(heap) CNode( loc, ePATH );
06675     n->Arg<int>(0) = a0;
06676     n->Arg<CNode*>(1) = a1;
06677     n->Arg<int>(2) = a2;
06678     n->Arg<int>(3) = a3;
06679     n->Arg<CNode*>(4) = a4;
06680     n->Arg<int>(5) = a5;
06681     n->Arg<CNode*>(6) = a6;
06682     return n;
06683 }
06694 inline CNode* cPATH_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
06695 {
06696     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePATH_ASSIGN );
06697     n->Arg<CNode*>(0) = a0;
06698     n->Arg<CNode*>(1) = a1;
06699     n->Arg<CNode*>(2) = a2;
06700     return n;
06701 }
06713 inline CNode* cPATH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
06714 {
06715     CNode* n = new(heap) CNode( loc, ePATH_ASSIGN );
06716     n->Arg<CNode*>(0) = a0;
06717     n->Arg<CNode*>(1) = a1;
06718     n->Arg<CNode*>(2) = a2;
06719     return n;
06720 }
06730 inline CNode* cIFNONE_PATH_ASSIGN( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06731 {
06732     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eIFNONE_PATH_ASSIGN );
06733     n->Arg<CNode*>(0) = a0;
06734     n->Arg<CNode*>(1) = a1;
06735     return n;
06736 }
06747 inline CNode* cIFNONE_PATH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06748 {
06749     CNode* n = new(heap) CNode( loc, eIFNONE_PATH_ASSIGN );
06750     n->Arg<CNode*>(0) = a0;
06751     n->Arg<CNode*>(1) = a1;
06752     return n;
06753 }
06762 inline CNode* cTRIGGER( CNode* a0, Coord_t* loc=NULL )
06763 {
06764     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTRIGGER );
06765     n->Arg<CNode*>(0) = a0;
06766     return n;
06767 }
06777 inline CNode* cTRIGGER( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06778 {
06779     CNode* n = new(heap) CNode( loc, eTRIGGER );
06780     n->Arg<CNode*>(0) = a0;
06781     return n;
06782 }
06792 inline CNode* cPASSIGN( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06793 {
06794     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePASSIGN );
06795     n->Arg<CNode*>(0) = a0;
06796     n->Arg<CNode*>(1) = a1;
06797     return n;
06798 }
06809 inline CNode* cPASSIGN( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
06810 {
06811     CNode* n = new(heap) CNode( loc, ePASSIGN );
06812     n->Arg<CNode*>(0) = a0;
06813     n->Arg<CNode*>(1) = a1;
06814     return n;
06815 }
06824 inline CNode* cDEASSIGN( CNode* a0, Coord_t* loc=NULL )
06825 {
06826     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDEASSIGN );
06827     n->Arg<CNode*>(0) = a0;
06828     return n;
06829 }
06839 inline CNode* cDEASSIGN( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06840 {
06841     CNode* n = new(heap) CNode( loc, eDEASSIGN );
06842     n->Arg<CNode*>(0) = a0;
06843     return n;
06844 }
06853 inline CNode* cDISABLE( CSymbol* a0, Coord_t* loc=NULL )
06854 {
06855     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDISABLE );
06856     n->Arg<CSymbol*>(0) = a0;
06857     return n;
06858 }
06868 inline CNode* cDISABLE( CObstack* heap, CSymbol* a0, Coord_t* loc=NULL )
06869 {
06870     CNode* n = new(heap) CNode( loc, eDISABLE );
06871     n->Arg<CSymbol*>(0) = a0;
06872     return n;
06873 }
06882 inline CNode* cATTRIBUTE( CAttr* a0, Coord_t* loc=NULL )
06883 {
06884     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eATTRIBUTE );
06885     n->Arg<CAttr*>(0) = a0;
06886     return n;
06887 }
06897 inline CNode* cATTRIBUTE( CObstack* heap, CAttr* a0, Coord_t* loc=NULL )
06898 {
06899     CNode* n = new(heap) CNode( loc, eATTRIBUTE );
06900     n->Arg<CAttr*>(0) = a0;
06901     return n;
06902 }
06913 inline CNode* cGIF( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
06914 {
06915     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGIF );
06916     n->Arg<CNode*>(0) = a0;
06917     n->Arg<CNode*>(1) = a1;
06918     n->Arg<CNode*>(2) = a2;
06919     return n;
06920 }
06932 inline CNode* cGIF( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
06933 {
06934     CNode* n = new(heap) CNode( loc, eGIF );
06935     n->Arg<CNode*>(0) = a0;
06936     n->Arg<CNode*>(1) = a1;
06937     n->Arg<CNode*>(2) = a2;
06938     return n;
06939 }
06951 inline CNode* cGFOR( CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06952 {
06953     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGFOR );
06954     n->Arg<CNode*>(0) = a0;
06955     n->Arg<CNode*>(1) = a1;
06956     n->Arg<CNode*>(2) = a2;
06957     n->Arg<CNode*>(3) = a3;
06958     return n;
06959 }
06972 inline CNode* cGFOR( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
06973 {
06974     CNode* n = new(heap) CNode( loc, eGFOR );
06975     n->Arg<CNode*>(0) = a0;
06976     n->Arg<CNode*>(1) = a1;
06977     n->Arg<CNode*>(2) = a2;
06978     n->Arg<CNode*>(3) = a3;
06979     return n;
06980 }
06990 inline CNode* cGCASE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
06991 {
06992     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGCASE );
06993     n->Arg<CNode*>(0) = a0;
06994     n->Arg<CNode*>(1) = a1;
06995     return n;
06996 }
07007 inline CNode* cGCASE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
07008 {
07009     CNode* n = new(heap) CNode( loc, eGCASE );
07010     n->Arg<CNode*>(0) = a0;
07011     n->Arg<CNode*>(1) = a1;
07012     return n;
07013 }
07022 inline CNode* cTABLE( CNode* a0, Coord_t* loc=NULL )
07023 {
07024     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE );
07025     n->Arg<CNode*>(0) = a0;
07026     return n;
07027 }
07037 inline CNode* cTABLE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07038 {
07039     CNode* n = new(heap) CNode( loc, eTABLE );
07040     n->Arg<CNode*>(0) = a0;
07041     return n;
07042 }
07051 inline CNode* cTABLE_ENTRY( CNode* a0, Coord_t* loc=NULL )
07052 {
07053     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE_ENTRY );
07054     n->Arg<CNode*>(0) = a0;
07055     return n;
07056 }
07066 inline CNode* cTABLE_ENTRY( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07067 {
07068     CNode* n = new(heap) CNode( loc, eTABLE_ENTRY );
07069     n->Arg<CNode*>(0) = a0;
07070     return n;
07071 }
07080 inline CNode* cTABLE_SYMBOL( char* a0, Coord_t* loc=NULL )
07081 {
07082     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE_SYMBOL );
07083     n->Arg<char*>(0) = a0;
07084     return n;
07085 }
07095 inline CNode* cTABLE_SYMBOL( CObstack* heap, char* a0, Coord_t* loc=NULL )
07096 {
07097     CNode* n = new(heap) CNode( loc, eTABLE_SYMBOL );
07098     n->Arg<char*>(0) = a0;
07099     return n;
07100 }
07108 inline CNode* cPORTLIST_END( Coord_t* loc=NULL )
07109 {
07110     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORTLIST_END );
07111     return n;
07112 }
07121 inline CNode* cPORTLIST_END( CObstack* heap, Coord_t* loc=NULL )
07122 {
07123     CNode* n = new(heap) CNode( loc, ePORTLIST_END );
07124     return n;
07125 }
07135 inline CNode* cMACRO_EXPR( const char* a0, CNode* a1, Coord_t* loc=NULL )
07136 {
07137     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMACRO_EXPR );
07138     n->Arg<const char*>(0) = a0;
07139     n->Arg<CNode*>(1) = a1;
07140     return n;
07141 }
07152 inline CNode* cMACRO_EXPR( CObstack* heap, const char* a0, CNode* a1, Coord_t* loc=NULL )
07153 {
07154     CNode* n = new(heap) CNode( loc, eMACRO_EXPR );
07155     n->Arg<const char*>(0) = a0;
07156     n->Arg<CNode*>(1) = a1;
07157     return n;
07158 }
07169 inline CNode* cENUM_SPEC( CSymbol* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
07170 {
07171     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eENUM_SPEC );
07172     n->Arg<CSymbol*>(0) = a0;
07173     n->Arg<CNode*>(1) = a1;
07174     n->Arg<CNode*>(2) = a2;
07175     return n;
07176 }
07188 inline CNode* cENUM_SPEC( CObstack* heap, CSymbol* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
07189 {
07190     CNode* n = new(heap) CNode( loc, eENUM_SPEC );
07191     n->Arg<CSymbol*>(0) = a0;
07192     n->Arg<CNode*>(1) = a1;
07193     n->Arg<CNode*>(2) = a2;
07194     return n;
07195 }
07205 inline CNode* cMEMBER( CNode* a0, CSymbol* a1, Coord_t* loc=NULL )
07206 {
07207     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMEMBER );
07208     n->Arg<CNode*>(0) = a0;
07209     n->Arg<CSymbol*>(1) = a1;
07210     return n;
07211 }
07222 inline CNode* cMEMBER( CObstack* heap, CNode* a0, CSymbol* a1, Coord_t* loc=NULL )
07223 {
07224     CNode* n = new(heap) CNode( loc, eMEMBER );
07225     n->Arg<CNode*>(0) = a0;
07226     n->Arg<CSymbol*>(1) = a1;
07227     return n;
07228 }
07237 inline CNode* cRETURN( CNode* a0, Coord_t* loc=NULL )
07238 {
07239     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRETURN );
07240     n->Arg<CNode*>(0) = a0;
07241     return n;
07242 }
07252 inline CNode* cRETURN( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07253 {
07254     CNode* n = new(heap) CNode( loc, eRETURN );
07255     n->Arg<CNode*>(0) = a0;
07256     return n;
07257 }
07266 inline CNode* cPREINC( CNode* a0, Coord_t* loc=NULL )
07267 {
07268     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePREINC );
07269     n->Arg<CNode*>(0) = a0;
07270     return n;
07271 }
07281 inline CNode* cPREINC( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07282 {
07283     CNode* n = new(heap) CNode( loc, ePREINC );
07284     n->Arg<CNode*>(0) = a0;
07285     return n;
07286 }
07295 inline CNode* cPOSTINC( CNode* a0, Coord_t* loc=NULL )
07296 {
07297     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOSTINC );
07298     n->Arg<CNode*>(0) = a0;
07299     return n;
07300 }
07310 inline CNode* cPOSTINC( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07311 {
07312     CNode* n = new(heap) CNode( loc, ePOSTINC );
07313     n->Arg<CNode*>(0) = a0;
07314     return n;
07315 }
07324 inline CNode* cPREDEC( CNode* a0, Coord_t* loc=NULL )
07325 {
07326     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePREDEC );
07327     n->Arg<CNode*>(0) = a0;
07328     return n;
07329 }
07339 inline CNode* cPREDEC( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07340 {
07341     CNode* n = new(heap) CNode( loc, ePREDEC );
07342     n->Arg<CNode*>(0) = a0;
07343     return n;
07344 }
07353 inline CNode* cPOSTDEC( CNode* a0, Coord_t* loc=NULL )
07354 {
07355     CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOSTDEC );
07356     n->Arg<CNode*>(0) = a0;
07357     return n;
07358 }
07368 inline CNode* cPOSTDEC( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
07369 {
07370     CNode* n = new(heap) CNode( loc, ePOSTDEC );
07371     n->Arg<CNode*>(0) = a0;
07372     return n;
07373 }
07383 inline CNode* cCAST( CNode* a0, CNode* a1, Coord_t* loc=NULL )
07384 {
07385     CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCAST );
07386     n->Arg<CNode*>(0) = a0;
07387     n->Arg<CNode*>(1) = a1;
07388     return n;
07389 }
07400 inline CNode* cCAST( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
07401 {
07402     CNode* n = new(heap) CNode( loc, eCAST );
07403     n->Arg<CNode*>(0) = a0;
07404     n->Arg<CNode*>(1) = a1;
07405     return n;
07406 }
07407 #endif // DEFINE_CONSTUCTOR
07408 
07409 
07410 /*********************************************************
07411  *   Warning: This file is machine generate, do not edit
07412  ********************************************************/
07413 
07414 
07415 
07416 
07417 #ifdef DEFINE_METHODS
07418 
07419 /************************************
07420  * ArgCount
07421  *    - return number of arguments for node
07422  ***********************************/
07423 int CNode::ArgCount()
07424 {
07425     switch( op ) {
07426     case eERROR:
07427         return 0;
07428     case eVCONSTANT:
07429         return 1;
07430     case eRCONSTANT:
07431         return 1;
07432     case eCOMMENT:
07433         return 1;
07434     case eVRQ:
07435         return 1;
07436     case ePRAGMA:
07437         return 1;
07438     case eELIST:
07439         return 2;
07440     case eWIDTH:
07441         return 2;
07442     case eNOP:
07443         return 0;
07444     case eSUB:
07445         return 2;
07446     case eMUL:
07447         return 2;
07448     case eDIV:
07449         return 2;
07450     case ePOW:
07451         return 2;
07452     case eADD:
07453         return 2;
07454     case eLSH:
07455         return 2;
07456     case eRSH:
07457         return 2;
07458     case eLSHA:
07459         return 2;
07460     case eRSHA:
07461         return 2;
07462     case eMOD:
07463         return 2;
07464     case eOR:
07465         return 2;
07466     case eAND:
07467         return 2;
07468     case eANDANDAND:
07469         return 2;
07470     case eXOR:
07471         return 2;
07472     case eXNOR:
07473         return 2;
07474     case eINSTANCE_REF:
07475         return 1;
07476     case eGATE_REF:
07477         return 1;
07478     case eTASK_ENABLE:
07479         return 2;
07480     case eSYSTASK_CALL:
07481         return 2;
07482     case eTIMING_CALL:
07483         return 2;
07484     case eFUNCTION_CALL:
07485         return 3;
07486     case eARRAY:
07487         return 2;
07488     case eNET_REF:
07489         return 1;
07490     case eVAR_REF:
07491         return 1;
07492     case ePARAM_REF:
07493         return 1;
07494     case ePORT_REF:
07495         return 1;
07496     case eFWD_REF:
07497         return 1;
07498     case eGENVAR_REF:
07499         return 1;
07500     case eENUM_REF:
07501         return 1;
07502     case eTYPE_REF:
07503         return 1;
07504     case eNET_DECL:
07505         return 2;
07506     case eVAR_DECL:
07507         return 2;
07508     case ePARAM_DECL:
07509         return 1;
07510     case eSPECPARAM_DECL:
07511         return 1;
07512     case ePORT_DECL:
07513         return 1;
07514     case eGENVAR_DECL:
07515         return 1;
07516     case eTYPEDEF_DECL:
07517         return 1;
07518     case eLIST:
07519         return 2;
07520     case eRANGE:
07521         return 2;
07522     case eSLICE:
07523         return 2;
07524     case ePSLICE:
07525         return 2;
07526     case eMSLICE:
07527         return 2;
07528     case eCVRI:
07529         return 1;
07530     case eCVIR:
07531         return 1;
07532     case eREP:
07533         return 2;
07534     case eCAT:
07535         return 2;
07536     case eUCAT:
07537         return 1;
07538     case eCOM:
07539         return 1;
07540     case eNEG:
07541         return 1;
07542     case ePLUS:
07543         return 1;
07544     case eNOT:
07545         return 1;
07546     case eGT:
07547         return 2;
07548     case eGE:
07549         return 2;
07550     case eLT:
07551         return 2;
07552     case eLE:
07553         return 2;
07554     case eLAND:
07555         return 2;
07556     case eLOR:
07557         return 2;
07558     case eCEQ:
07559         return 2;
07560     case eCNE:
07561         return 2;
07562     case eEQ:
07563         return 2;
07564     case eNE:
07565         return 2;
07566     case eRAND:
07567         return 1;
07568     case eRNAND:
07569         return 1;
07570     case eROR:
07571         return 1;
07572     case eRNOR:
07573         return 1;
07574     case eRXOR:
07575         return 1;
07576     case eRXNOR:
07577         return 1;
07578     case eHOOK:
07579         return 3;
07580     case eINIT:
07581         return 1;
07582     case eALWAYS:
07583         return 1;
07584     case eALWAYS_LATCH:
07585         return 1;
07586     case eALWAYS_FF:
07587         return 1;
07588     case eALWAYS_COMB:
07589         return 1;
07590     case eEVENT:
07591         return 2;
07592     case eBLOCK_REF:
07593         return 2;
07594     case eSPECIFY_REF:
07595         return 2;
07596     case eASSIGN:
07597         return 3;
07598     case eADD_ASSIGN:
07599         return 3;
07600     case eSUB_ASSIGN:
07601         return 3;
07602     case eMUL_ASSIGN:
07603         return 3;
07604     case eDIV_ASSIGN:
07605         return 3;
07606     case eMOD_ASSIGN:
07607         return 3;
07608     case eAND_ASSIGN:
07609         return 3;
07610     case eOR_ASSIGN:
07611         return 3;
07612     case eXOR_ASSIGN:
07613         return 3;
07614     case eLSH_ASSIGN:
07615         return 3;
07616     case eRSH_ASSIGN:
07617         return 3;
07618     case eLSHA_ASSIGN:
07619         return 3;
07620     case eRSHA_ASSIGN:
07621         return 3;
07622     case eFORCE:
07623         return 2;
07624     case eRELEASE:
07625         return 1;
07626     case eNBASSIGN:
07627         return 3;
07628     case ePOSEDGE:
07629         return 1;
07630     case eNEGEDGE:
07631         return 1;
07632     case eEDGE:
07633         return 2;
07634     case eEVOR:
07635         return 2;
07636     case eDELAY:
07637         return 2;
07638     case eMTM:
07639         return 3;
07640     case eIF:
07641         return 3;
07642     case eFOREVER:
07643         return 1;
07644     case eREPEAT:
07645         return 2;
07646     case eWHILE:
07647         return 2;
07648     case eWAIT:
07649         return 2;
07650     case eFOR:
07651         return 4;
07652     case eCASE:
07653         return 2;
07654     case eCASEX:
07655         return 2;
07656     case eCASEZ:
07657         return 2;
07658     case eCASEITEM:
07659         return 2;
07660     case eCASSIGN:
07661         return 4;
07662     case eARG:
07663         return 2;
07664     case eFUNCTION_DEF:
07665         return 1;
07666     case eMODULE_DEF:
07667         return 1;
07668     case eREPEAT_CONTROL:
07669         return 2;
07670     case eDELAY_CONTROL:
07671         return 1;
07672     case eEVENT_CONTROL:
07673         return 1;
07674     case eEXTERNAL_REF:
07675         return 1;
07676     case ePORT_DEF:
07677         return 1;
07678     case eDEFPARAM:
07679         return 2;
07680     case ePATH:
07681         return 7;
07682     case ePATH_ASSIGN:
07683         return 3;
07684     case eIFNONE_PATH_ASSIGN:
07685         return 2;
07686     case eTRIGGER:
07687         return 1;
07688     case ePASSIGN:
07689         return 2;
07690     case eDEASSIGN:
07691         return 1;
07692     case eDISABLE:
07693         return 1;
07694     case eATTRIBUTE:
07695         return 1;
07696     case eGIF:
07697         return 3;
07698     case eGFOR:
07699         return 4;
07700     case eGCASE:
07701         return 2;
07702     case eTABLE:
07703         return 1;
07704     case eTABLE_ENTRY:
07705         return 1;
07706     case eTABLE_SYMBOL:
07707         return 1;
07708     case ePORTLIST_END:
07709         return 0;
07710     case eMACRO_EXPR:
07711         return 2;
07712     case eENUM_SPEC:
07713         return 3;
07714     case eMEMBER:
07715         return 2;
07716     case eRETURN:
07717         return 1;
07718     case ePREINC:
07719         return 1;
07720     case ePOSTINC:
07721         return 1;
07722     case ePREDEC:
07723         return 1;
07724     case ePOSTDEC:
07725         return 1;
07726     case eCAST:
07727         return 2;
07728     default:
07729         MASSERT(FALSE);
07730     }
07731     return 0;
07732 }
07733 
07734 /************************************
07735  * Precedence
07736  *  - return precedence of operator
07737  *     result 0 - 13    
07738  ***********************************/
07739 int CNode::Precedence() 
07740 { 
07741     switch( op ) {
07742     case eERROR:
07743         return 13;
07744     case eVCONSTANT:
07745         return 13;
07746     case eRCONSTANT:
07747         return 13;
07748     case eCOMMENT:
07749         return 13;
07750     case eVRQ:
07751         return 13;
07752     case ePRAGMA:
07753         return 13;
07754     case eELIST:
07755         return 13;
07756     case eWIDTH:
07757         return 13;
07758     case eSUB:
07759         return 9;
07760     case eMUL:
07761         return 10;
07762     case eDIV:
07763         return 10;
07764     case ePOW:
07765         return 11;
07766     case eADD:
07767         return 9;
07768     case eLSH:
07769         return 8;
07770     case eRSH:
07771         return 8;
07772     case eLSHA:
07773         return 8;
07774     case eRSHA:
07775         return 8;
07776     case eMOD:
07777         return 10;
07778     case eOR:
07779         return 3;
07780     case eAND:
07781         return 5;
07782     case eANDANDAND:
07783         return 0;
07784     case eXOR:
07785         return 4;
07786     case eXNOR:
07787         return 4;
07788     case eSYSTASK_CALL:
07789         return 13;
07790     case eFUNCTION_CALL:
07791         return 13;
07792     case eARRAY:
07793         return 13;
07794     case eNET_REF:
07795         return 13;
07796     case eVAR_REF:
07797         return 13;
07798     case ePARAM_REF:
07799         return 13;
07800     case ePORT_REF:
07801         return 13;
07802     case eFWD_REF:
07803         return 13;
07804     case eGENVAR_REF:
07805         return 13;
07806     case eENUM_REF:
07807         return 13;
07808     case eTYPE_REF:
07809         return 13;
07810     case eRANGE:
07811         return 13;
07812     case eSLICE:
07813         return 13;
07814     case ePSLICE:
07815         return 13;
07816     case eMSLICE:
07817         return 13;
07818     case eCVRI:
07819         return 13;
07820     case eCVIR:
07821         return 13;
07822     case eREP:
07823         return 13;
07824     case eCAT:
07825         return 13;
07826     case eUCAT:
07827         return 13;
07828     case eCOM:
07829         return 12;
07830     case eNEG:
07831         return 12;
07832     case ePLUS:
07833         return 12;
07834     case eNOT:
07835         return 12;
07836     case eGT:
07837         return 7;
07838     case eGE:
07839         return 7;
07840     case eLT:
07841         return 7;
07842     case eLE:
07843         return 7;
07844     case eLAND:
07845         return 2;
07846     case eLOR:
07847         return 1;
07848     case eCEQ:
07849         return 6;
07850     case eCNE:
07851         return 6;
07852     case eEQ:
07853         return 6;
07854     case eNE:
07855         return 6;
07856     case eRAND:
07857         return 12;
07858     case eRNAND:
07859         return 12;
07860     case eROR:
07861         return 12;
07862     case eRNOR:
07863         return 12;
07864     case eRXOR:
07865         return 12;
07866     case eRXNOR:
07867         return 12;
07868     case eHOOK:
07869         return 0;
07870     case ePOSEDGE:
07871         return 13;
07872     case eNEGEDGE:
07873         return 13;
07874     case eEDGE:
07875         return 13;
07876     case eEVOR:
07877         return 13;
07878     case eMTM:
07879         return 13;
07880     case eEXTERNAL_REF:
07881         return 13;
07882     case eMACRO_EXPR:
07883         return 13;
07884     case eMEMBER:
07885         return 13;
07886     case ePREINC:
07887         return 12;
07888     case ePOSTINC:
07889         return 12;
07890     case ePREDEC:
07891         return 12;
07892     case ePOSTDEC:
07893         return 12;
07894     case eCAST:
07895         return 13;
07896     default:
07897         MASSERT( FALSE );
07898         return 13;
07899     }
07900 }
07901 
07902 /************************************************
07903         IsConstant
07904         - return true if expression is constant 
07905 **************************************************/
07906 
07907 int CNode::IsConstant()
07908 {
07909     switch( op ) {
07910     case eERROR:
07911         return FALSE;
07912     case eVCONSTANT:
07913         return TRUE;
07914     case eRCONSTANT:
07915         return TRUE;
07916     case eCOMMENT:
07917         return TRUE;
07918     case eVRQ:
07919         return TRUE;
07920     case ePRAGMA:
07921         return TRUE;
07922     case eELIST:
07923         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07924     case eWIDTH:
07925         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07926     case eSUB:
07927         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07928     case eMUL:
07929         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07930     case eDIV:
07931         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07932     case ePOW:
07933         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07934     case eADD:
07935         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07936     case eLSH:
07937         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07938     case eRSH:
07939         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07940     case eLSHA:
07941         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07942     case eRSHA:
07943         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07944     case eMOD:
07945         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07946     case eOR:
07947         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07948     case eAND:
07949         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07950     case eANDANDAND:
07951         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07952     case eXOR:
07953         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07954     case eXNOR:
07955         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07956     case eSYSTASK_CALL:
07957         return TRUE;
07958     case eFUNCTION_CALL:
07959         return Arg<CNode*>(1)->IsConstant();
07960     case eARRAY:
07961         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07962     case eNET_REF:
07963         return FALSE;
07964     case eVAR_REF:
07965         return FALSE;
07966     case ePARAM_REF:
07967         return TRUE;
07968     case ePORT_REF:
07969         return FALSE;
07970     case eFWD_REF:
07971         return FALSE;
07972     case eGENVAR_REF:
07973         return TRUE;
07974     case eENUM_REF:
07975         return TRUE;
07976     case eTYPE_REF:
07977         return TRUE;
07978     case eRANGE:
07979         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07980     case eSLICE:
07981         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07982     case ePSLICE:
07983         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07984     case eMSLICE:
07985         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07986     case eCVRI:
07987         return Arg<CNode*>(0)->IsConstant();
07988     case eCVIR:
07989         return Arg<CNode*>(0)->IsConstant();
07990     case eREP:
07991         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07992     case eCAT:
07993         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
07994     case eUCAT:
07995         return Arg<CNode*>(0)->IsConstant();
07996     case eCOM:
07997         return Arg<CNode*>(0)->IsConstant();
07998     case eNEG:
07999         return Arg<CNode*>(0)->IsConstant();
08000     case ePLUS:
08001         return Arg<CNode*>(0)->IsConstant();
08002     case eNOT:
08003         return Arg<CNode*>(0)->IsConstant();
08004     case eGT:
08005         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08006     case eGE:
08007         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08008     case eLT:
08009         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08010     case eLE:
08011         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08012     case eLAND:
08013         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08014     case eLOR:
08015         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08016     case eCEQ:
08017         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08018     case eCNE:
08019         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08020     case eEQ:
08021         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08022     case eNE:
08023         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08024     case eRAND:
08025         return Arg<CNode*>(0)->IsConstant();
08026     case eRNAND:
08027         return Arg<CNode*>(0)->IsConstant();
08028     case eROR:
08029         return Arg<CNode*>(0)->IsConstant();
08030     case eRNOR:
08031         return Arg<CNode*>(0)->IsConstant();
08032     case eRXOR:
08033         return Arg<CNode*>(0)->IsConstant();
08034     case eRXNOR:
08035         return Arg<CNode*>(0)->IsConstant();
08036     case eHOOK:
08037         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant() && Arg<CNode*>(2)->IsConstant();
08038     case eMTM:
08039         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant() && Arg<CNode*>(2)->IsConstant();
08040     case eEXTERNAL_REF:
08041         return FALSE;
08042     case eMACRO_EXPR:
08043         return TRUE;
08044     case eMEMBER:
08045         return Arg<CNode*>(0)->IsConstant();
08046     case ePREINC:
08047         return Arg<CNode*>(0)->IsConstant();
08048     case ePOSTINC:
08049         return Arg<CNode*>(0)->IsConstant();
08050     case ePREDEC:
08051         return Arg<CNode*>(0)->IsConstant();
08052     case ePOSTDEC:
08053         return Arg<CNode*>(0)->IsConstant();
08054     case eCAST:
08055         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08056     default:
08057         MASSERT( FALSE );
08058     }
08059 
08060     return TRUE;
08061 }       
08062 
08063 /************************************************
08064         IsVolatile
08065         - return false if expression is constant 
08066           and not dependent upon parameters
08067 **************************************************/
08068 
08069 int CNode::IsVolatile()
08070 {
08071     switch( op ) {
08072     case eERROR:
08073         return TRUE;
08074     case eVCONSTANT:
08075         return FALSE;
08076     case eRCONSTANT:
08077         return FALSE;
08078     case eCOMMENT:
08079         return FALSE;
08080     case eVRQ:
08081         return FALSE;
08082     case ePRAGMA:
08083         return FALSE;
08084     case eELIST:
08085         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08086     case eWIDTH:
08087         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08088     case eSUB:
08089         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08090     case eMUL:
08091         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08092     case eDIV:
08093         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08094     case ePOW:
08095         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08096     case eADD:
08097         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08098     case eLSH:
08099         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08100     case eRSH:
08101         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08102     case eLSHA:
08103         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08104     case eRSHA:
08105         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08106     case eMOD:
08107         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08108     case eOR:
08109         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08110     case eAND:
08111         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08112     case eANDANDAND:
08113         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08114     case eXOR:
08115         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08116     case eXNOR:
08117         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08118     case eSYSTASK_CALL:
08119         return TRUE;
08120     case eFUNCTION_CALL:
08121         return Arg<CNode*>(1)->IsVolatile();
08122     case eARRAY:
08123         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08124     case eNET_REF:
08125         return TRUE;
08126     case eVAR_REF:
08127         return TRUE;
08128     case ePARAM_REF:
08129         return TRUE;
08130     case ePORT_REF:
08131         return TRUE;
08132     case eFWD_REF:
08133         return TRUE;
08134     case eGENVAR_REF:
08135         return TRUE;
08136     case eENUM_REF:
08137         return Arg<CEnum*>(0)->GetExpression()->IsVolatile();
08138     case eTYPE_REF:
08139         return FALSE;
08140     case eRANGE:
08141         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08142     case eSLICE:
08143         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08144     case ePSLICE:
08145         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08146     case eMSLICE:
08147         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08148     case eCVRI:
08149         return Arg<CNode*>(0)->IsVolatile();
08150     case eCVIR:
08151         return Arg<CNode*>(0)->IsVolatile();
08152     case eREP:
08153         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08154     case eCAT:
08155         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08156     case eUCAT:
08157         return Arg<CNode*>(0)->IsVolatile();
08158     case eCOM:
08159         return Arg<CNode*>(0)->IsVolatile();
08160     case eNEG:
08161         return Arg<CNode*>(0)->IsVolatile();
08162     case ePLUS:
08163         return Arg<CNode*>(0)->IsVolatile();
08164     case eNOT:
08165         return Arg<CNode*>(0)->IsVolatile();
08166     case eGT:
08167         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08168     case eGE:
08169         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08170     case eLT:
08171         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08172     case eLE:
08173         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08174     case eLAND:
08175         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08176     case eLOR:
08177         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08178     case eCEQ:
08179         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08180     case eCNE:
08181         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08182     case eEQ:
08183         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08184     case eNE:
08185         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08186     case eRAND:
08187         return Arg<CNode*>(0)->IsVolatile();
08188     case eRNAND:
08189         return Arg<CNode*>(0)->IsVolatile();
08190     case eROR:
08191         return Arg<CNode*>(0)->IsVolatile();
08192     case eRNOR:
08193         return Arg<CNode*>(0)->IsVolatile();
08194     case eRXOR:
08195         return Arg<CNode*>(0)->IsVolatile();
08196     case eRXNOR:
08197         return Arg<CNode*>(0)->IsVolatile();
08198     case eHOOK:
08199         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile() || Arg<CNode*>(2)->IsVolatile();
08200     case eMTM:
08201         return TRUE;
08202     case eEXTERNAL_REF:
08203         return TRUE;
08204     case eMACRO_EXPR:
08205         return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsVolatile() : TRUE;
08206     case eMEMBER:
08207         return Arg<CNode*>(0)->IsVolatile();
08208     case ePREINC:
08209         return Arg<CNode*>(0)->IsVolatile();
08210     case ePOSTINC:
08211         return Arg<CNode*>(0)->IsVolatile();
08212     case ePREDEC:
08213         return Arg<CNode*>(0)->IsVolatile();
08214     case ePOSTDEC:
08215         return Arg<CNode*>(0)->IsVolatile();
08216     case eCAST:
08217         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08218     default:
08219         MASSERT( FALSE );
08220     }
08221 
08222     return TRUE;
08223 }       
08224 
08225 
08226 /************************************************
08227         IsWidthConstant
08228         - return true if expression has a constant width
08229 **************************************************/
08230 
08231 int     CNode::IsWidthConstant( )
08232 {
08233     switch( GetOp() ) {
08234     case eERROR:
08235         return TRUE;
08236     case eVCONSTANT:
08237         return Arg<CVector*>(0)->IsWidthConstant();
08238     case eRCONSTANT:
08239         return TRUE;
08240     case eELIST:
08241         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08242     case eWIDTH:
08243         return Arg<CNode*>(0)->IsConstant();
08244     case eSUB:
08245         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08246     case eMUL:
08247         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08248     case eDIV:
08249         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08250     case ePOW:
08251         return Arg<CNode*>(0)->IsWidthConstant();
08252     case eADD:
08253         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08254     case eLSH:
08255         return Arg<CNode*>(0)->IsWidthConstant();
08256     case eRSH:
08257         return Arg<CNode*>(0)->IsWidthConstant();
08258     case eLSHA:
08259         return Arg<CNode*>(0)->IsWidthConstant();
08260     case eRSHA:
08261         return Arg<CNode*>(0)->IsWidthConstant();
08262     case eMOD:
08263         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08264     case eOR:
08265         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08266     case eAND:
08267         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08268     case eANDANDAND:
08269         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08270     case eXOR:
08271         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08272     case eXNOR:
08273         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08274     case eSYSTASK_CALL:
08275         return Systask::WidthConstant(Arg<CSymbol*>(0),Arg<CNode*>(1));
08276     case eFUNCTION_CALL:
08277         return CFunction::WidthConstant(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
08278     case eARRAY:
08279         return Array::WidthConstant(Arg<CNode*>(0),Arg<CNode*>(1));
08280     case eNET_REF:
08281         return Arg<CNet*>(0)->IsWidthConstant();
08282     case eVAR_REF:
08283         return Arg<CVar*>(0)->IsWidthConstant();
08284     case ePARAM_REF:
08285         return Arg<CParam*>(0)->IsWidthConstant();
08286     case ePORT_REF:
08287         return Arg<CPortDir*>(0)->IsWidthConstant();
08288     case eFWD_REF:
08289         return Arg<CFref*>(0)->IsWidthConstant();
08290     case eGENVAR_REF:
08291         return Arg<CGenvar*>(0)->IsWidthConstant();
08292     case eENUM_REF:
08293         return Arg<CEnum*>(0)->IsWidthConstant();
08294     case eTYPE_REF:
08295         return TRUE;
08296     case eRANGE:
08297         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08298     case eSLICE:
08299         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
08300     case ePSLICE:
08301         return Arg<CNode*>(1)->IsConstant();
08302     case eMSLICE:
08303         return Arg<CNode*>(1)->IsConstant();
08304     case eCVRI:
08305         return TRUE;
08306     case eCVIR:
08307         return TRUE;
08308     case eREP:
08309         return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsWidthConstant();
08310     case eCAT:
08311         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
08312     case eUCAT:
08313         return Arg<CNode*>(0)->IsWidthConstant();
08314     case eCOM:
08315         return Arg<CNode*>(0)->IsWidthConstant();
08316     case eNEG:
08317         return Arg<CNode*>(0)->IsWidthConstant();
08318     case ePLUS:
08319         return Arg<CNode*>(0)->IsWidthConstant();
08320     case eNOT:
08321         return TRUE;
08322     case eGT:
08323         return TRUE;
08324     case eGE:
08325         return TRUE;
08326     case eLT:
08327         return TRUE;
08328     case eLE:
08329         return TRUE;
08330     case eLAND:
08331         return TRUE;
08332     case eLOR:
08333         return TRUE;
08334     case eCEQ:
08335         return TRUE;
08336     case eCNE:
08337         return TRUE;
08338     case eEQ:
08339         return TRUE;
08340     case eNE:
08341         return TRUE;
08342     case eRAND:
08343         return TRUE;
08344     case eRNAND:
08345         return TRUE;
08346     case eROR:
08347         return TRUE;
08348     case eRNOR:
08349         return TRUE;
08350     case eRXOR:
08351         return TRUE;
08352     case eRXNOR:
08353         return TRUE;
08354     case eHOOK:
08355         return Arg<CNode*>(1)->IsWidthConstant() && Arg<CNode*>(2)->IsWidthConstant();
08356     case eMTM:
08357         return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant() && Arg<CNode*>(2)->IsWidthConstant();
08358     case eEXTERNAL_REF:
08359         return External::WidthConstant(Arg<CSymbol*>(0));
08360     case eATTRIBUTE:
08361         return TRUE;
08362     case eMACRO_EXPR:
08363         return Arg<CNode*>(1)->IsWidthConstant();
08364     case eMEMBER:
08365         return Member::WidthConstant(Arg<CNode*>(0),Arg<CSymbol*>(1));
08366     case ePREINC:
08367         return Arg<CNode*>(0)->IsWidthConstant();
08368     case ePOSTINC:
08369         return Arg<CNode*>(0)->IsWidthConstant();
08370     case ePREDEC:
08371         return Arg<CNode*>(0)->IsWidthConstant();
08372     case ePOSTDEC:
08373         return Arg<CNode*>(0)->IsWidthConstant();
08374     case eCAST:
08375         return Arg<CNode*>(0)->IsConstant();
08376     default:
08377         MASSERT( FALSE );
08378         return 0;
08379     }
08380 }       
08381 
08382 /************************************************
08383         IsWidthVolatile
08384         - return true if expression has a volatile  width
08385 **************************************************/
08386 
08387 int     CNode::IsWidthVolatile( )
08388 {
08389     switch( GetOp() ) {
08390     case eERROR:
08391         return FALSE;
08392     case eVCONSTANT:
08393         return Arg<CVector*>(0)->IsWidthVolatile();
08394     case eRCONSTANT:
08395         return FALSE;
08396     case eELIST:
08397         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08398     case eWIDTH:
08399         return Arg<CNode*>(0)->IsVolatile();
08400     case eSUB:
08401         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08402     case eMUL:
08403         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08404     case eDIV:
08405         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08406     case ePOW:
08407         return Arg<CNode*>(0)->IsWidthVolatile();
08408     case eADD:
08409         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08410     case eLSH:
08411         return Arg<CNode*>(0)->IsWidthVolatile();
08412     case eRSH:
08413         return Arg<CNode*>(0)->IsWidthVolatile();
08414     case eLSHA:
08415         return Arg<CNode*>(0)->IsWidthVolatile();
08416     case eRSHA:
08417         return Arg<CNode*>(0)->IsWidthVolatile();
08418     case eMOD:
08419         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08420     case eOR:
08421         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08422     case eAND:
08423         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08424     case eANDANDAND:
08425         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08426     case eXOR:
08427         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08428     case eXNOR:
08429         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08430     case eSYSTASK_CALL:
08431         return Systask::WidthVolatile(Arg<CSymbol*>(0),Arg<CNode*>(1));
08432     case eFUNCTION_CALL:
08433         return CFunction::WidthVolatile(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
08434     case eARRAY:
08435         return Array::WidthVolatile(Arg<CNode*>(0),Arg<CNode*>(1));
08436     case eNET_REF:
08437         return Arg<CNet*>(0)->IsWidthVolatile();
08438     case eVAR_REF:
08439         return Arg<CVar*>(0)->IsWidthVolatile();
08440     case ePARAM_REF:
08441         return Arg<CParam*>(0)->IsWidthVolatile();
08442     case ePORT_REF:
08443         return Arg<CPortDir*>(0)->IsWidthVolatile();
08444     case eFWD_REF:
08445         return Arg<CFref*>(0)->IsWidthVolatile();
08446     case eGENVAR_REF:
08447         return Arg<CGenvar*>(0)->IsWidthVolatile();
08448     case eENUM_REF:
08449         return Arg<CEnum*>(0)->IsWidthVolatile();
08450     case eTYPE_REF:
08451         return FALSE;
08452     case eRANGE:
08453         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08454     case eSLICE:
08455         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
08456     case ePSLICE:
08457         return Arg<CNode*>(1)->IsVolatile();
08458     case eMSLICE:
08459         return Arg<CNode*>(1)->IsVolatile();
08460     case eCVRI:
08461         return FALSE;
08462     case eCVIR:
08463         return FALSE;
08464     case eREP:
08465         return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08466     case eCAT:
08467         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
08468     case eUCAT:
08469         return Arg<CNode*>(0)->IsWidthVolatile();
08470     case eCOM:
08471         return Arg<CNode*>(0)->IsWidthVolatile();
08472     case eNEG:
08473         return Arg<CNode*>(0)->IsWidthVolatile();
08474     case ePLUS:
08475         return Arg<CNode*>(0)->IsWidthVolatile();
08476     case eNOT:
08477         return FALSE;
08478     case eGT:
08479         return FALSE;
08480     case eGE:
08481         return FALSE;
08482     case eLT:
08483         return FALSE;
08484     case eLE:
08485         return FALSE;
08486     case eLAND:
08487         return FALSE;
08488     case eLOR:
08489         return FALSE;
08490     case eCEQ:
08491         return FALSE;
08492     case eCNE:
08493         return FALSE;
08494     case eEQ:
08495         return FALSE;
08496     case eNE:
08497         return FALSE;
08498     case eRAND:
08499         return FALSE;
08500     case eRNAND:
08501         return FALSE;
08502     case eROR:
08503         return FALSE;
08504     case eRNOR:
08505         return FALSE;
08506     case eRXOR:
08507         return FALSE;
08508     case eRXNOR:
08509         return FALSE;
08510     case eHOOK:
08511         return Arg<CNode*>(1)->IsWidthVolatile() || Arg<CNode*>(2)->IsWidthVolatile();
08512     case eMTM:
08513         return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile() || Arg<CNode*>(2)->IsWidthVolatile();
08514     case eEXTERNAL_REF:
08515         return External::WidthVolatile(Arg<CSymbol*>(0));
08516     case eATTRIBUTE:
08517         return FALSE;
08518     case eMACRO_EXPR:
08519         return Arg<CNode*>(1)->IsWidthVolatile();
08520     case eMEMBER:
08521         return Member::WidthVolatile(Arg<CNode*>(0),Arg<CSymbol*>(1));
08522     case ePREINC:
08523         return Arg<CNode*>(0)->IsWidthVolatile();
08524     case ePOSTINC:
08525         return Arg<CNode*>(0)->IsWidthVolatile();
08526     case ePREDEC:
08527         return Arg<CNode*>(0)->IsWidthVolatile();
08528     case ePOSTDEC:
08529         return Arg<CNode*>(0)->IsWidthVolatile();
08530     case eCAST:
08531         return Arg<CNode*>(0)->IsVolatile();
08532     default:
08533         MASSERT( FALSE );
08534         return 0;
08535     }
08536 
08537 }       
08538 
08539 /************************************************
08540         GetWidthExp
08541         - return expression tree for width of 
08542           expression, return NULL if not-determinable
08543 **************************************************/
08544 
08545 CNode*  CNode::GetWidthExp()
08546 {
08547     switch( GetOp() ) {
08548     case eERROR: {
08549         CNode* temp0;
08550         CNode* temp1;
08551         CNode* temp2;
08552         return NULL;
08553         }
08554     case eVCONSTANT: {
08555         CNode* temp0;
08556         CNode* temp1;
08557         CNode* temp2;
08558         return Arg<CVector*>(0)->GetWidthExp();
08559         }
08560     case eRCONSTANT: {
08561         CNode* temp0;
08562         CNode* temp1;
08563         CNode* temp2;
08564         return NULL;
08565         }
08566     case eELIST: {
08567         CNode* temp0;
08568         CNode* temp1;
08569         CNode* temp2;
08570         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cADD_N(temp0,temp1,NULL) : NULL;
08571         }
08572     case eWIDTH: {
08573         CNode* temp0;
08574         CNode* temp1;
08575         CNode* temp2;
08576         return cINT32(Arg<CNode*>(0)->EvalINT32());
08577         }
08578     case eSUB: {
08579         CNode* temp0;
08580         CNode* temp1;
08581         CNode* temp2;
08582         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08583         }
08584     case eMUL: {
08585         CNode* temp0;
08586         CNode* temp1;
08587         CNode* temp2;
08588         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08589         }
08590     case eDIV: {
08591         CNode* temp0;
08592         CNode* temp1;
08593         CNode* temp2;
08594         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08595         }
08596     case ePOW: {
08597         CNode* temp0;
08598         CNode* temp1;
08599         CNode* temp2;
08600         return Arg<CNode*>(0)->GetWidthExp();
08601         }
08602     case eADD: {
08603         CNode* temp0;
08604         CNode* temp1;
08605         CNode* temp2;
08606         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08607         }
08608     case eLSH: {
08609         CNode* temp0;
08610         CNode* temp1;
08611         CNode* temp2;
08612         return Arg<CNode*>(0)->GetWidthExp();
08613         }
08614     case eRSH: {
08615         CNode* temp0;
08616         CNode* temp1;
08617         CNode* temp2;
08618         return Arg<CNode*>(0)->GetWidthExp();
08619         }
08620     case eLSHA: {
08621         CNode* temp0;
08622         CNode* temp1;
08623         CNode* temp2;
08624         return Arg<CNode*>(0)->GetWidthExp();
08625         }
08626     case eRSHA: {
08627         CNode* temp0;
08628         CNode* temp1;
08629         CNode* temp2;
08630         return Arg<CNode*>(0)->GetWidthExp();
08631         }
08632     case eMOD: {
08633         CNode* temp0;
08634         CNode* temp1;
08635         CNode* temp2;
08636         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08637         }
08638     case eOR: {
08639         CNode* temp0;
08640         CNode* temp1;
08641         CNode* temp2;
08642         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08643         }
08644     case eAND: {
08645         CNode* temp0;
08646         CNode* temp1;
08647         CNode* temp2;
08648         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08649         }
08650     case eANDANDAND: {
08651         CNode* temp0;
08652         CNode* temp1;
08653         CNode* temp2;
08654         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08655         }
08656     case eXOR: {
08657         CNode* temp0;
08658         CNode* temp1;
08659         CNode* temp2;
08660         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08661         }
08662     case eXNOR: {
08663         CNode* temp0;
08664         CNode* temp1;
08665         CNode* temp2;
08666         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMAX_N(temp0,temp1,NULL) : NULL;
08667         }
08668     case eSYSTASK_CALL: {
08669         CNode* temp0;
08670         CNode* temp1;
08671         CNode* temp2;
08672         return Systask::WidthExp(Arg<CSymbol*>(0),Arg<CNode*>(1));
08673         }
08674     case eFUNCTION_CALL: {
08675         CNode* temp0;
08676         CNode* temp1;
08677         CNode* temp2;
08678         return CFunction::WidthExp(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
08679         }
08680     case eARRAY: {
08681         CNode* temp0;
08682         CNode* temp1;
08683         CNode* temp2;
08684         return Array::WidthExp(Arg<CNode*>(0),Arg<CNode*>(1));
08685         }
08686     case eNET_REF: {
08687         CNode* temp0;
08688         CNode* temp1;
08689         CNode* temp2;
08690         return Arg<CNet*>(0)->GetWidthExp();
08691         }
08692     case eVAR_REF: {
08693         CNode* temp0;
08694         CNode* temp1;
08695         CNode* temp2;
08696         return Arg<CVar*>(0)->GetWidthExp();
08697         }
08698     case ePARAM_REF: {
08699         CNode* temp0;
08700         CNode* temp1;
08701         CNode* temp2;
08702         return Arg<CParam*>(0)->GetWidthExp();
08703         }
08704     case ePORT_REF: {
08705         CNode* temp0;
08706         CNode* temp1;
08707         CNode* temp2;
08708         return Arg<CPortDir*>(0)->GetWidthExp();
08709         }
08710     case eFWD_REF: {
08711         CNode* temp0;
08712         CNode* temp1;
08713         CNode* temp2;
08714         return Arg<CFref*>(0)->GetWidthExp();
08715         }
08716     case eGENVAR_REF: {
08717         CNode* temp0;
08718         CNode* temp1;
08719         CNode* temp2;
08720         return Arg<CGenvar*>(0)->GetWidthExp();
08721         }
08722     case eENUM_REF: {
08723         CNode* temp0;
08724         CNode* temp1;
08725         CNode* temp2;
08726         return Arg<CEnum*>(0)->GetWidthExp();
08727         }
08728     case eTYPE_REF: {
08729         CNode* temp0;
08730         CNode* temp1;
08731         CNode* temp2;
08732         return cINT32(32);
08733         }
08734     case eRANGE: {
08735         CNode* temp0;
08736         CNode* temp1;
08737         CNode* temp2;
08738         return (1 && 1) ? cABSDIFFPLUS1_N(Arg<CNode*>(0)->Clone(),Arg<CNode*>(1)->Clone(),NULL) : NULL;
08739         }
08740     case eSLICE: {
08741         CNode* temp0;
08742         CNode* temp1;
08743         CNode* temp2;
08744         return (1 && 1) ? cABSDIFFPLUS1_N(Arg<CNode*>(0)->Clone(),Arg<CNode*>(1)->Clone(),NULL) : NULL;
08745         }
08746     case ePSLICE: {
08747         CNode* temp0;
08748         CNode* temp1;
08749         CNode* temp2;
08750         return Arg<CNode*>(1);
08751         }
08752     case eMSLICE: {
08753         CNode* temp0;
08754         CNode* temp1;
08755         CNode* temp2;
08756         return Arg<CNode*>(1);
08757         }
08758     case eCVRI: {
08759         CNode* temp0;
08760         CNode* temp1;
08761         CNode* temp2;
08762         return cINT32(32);
08763         }
08764     case eCVIR: {
08765         CNode* temp0;
08766         CNode* temp1;
08767         CNode* temp2;
08768         return NULL;
08769         }
08770     case eREP: {
08771         CNode* temp0;
08772         CNode* temp1;
08773         CNode* temp2;
08774         return (1 && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cMUL_N(Arg<CNode*>(0)->Clone(),temp1,NULL) : NULL;
08775         }
08776     case eCAT: {
08777         CNode* temp0;
08778         CNode* temp1;
08779         CNode* temp2;
08780         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp())) ? cADD_N(temp0,temp1,NULL) : NULL;
08781         }
08782     case eUCAT: {
08783         CNode* temp0;
08784         CNode* temp1;
08785         CNode* temp2;
08786         return Arg<CNode*>(0)->GetWidthExp();
08787         }
08788     case eCOM: {
08789         CNode* temp0;
08790         CNode* temp1;
08791         CNode* temp2;
08792         return Arg<CNode*>(0)->GetWidthExp();
08793         }
08794     case eNEG: {
08795         CNode* temp0;
08796         CNode* temp1;
08797         CNode* temp2;
08798         return Arg<CNode*>(0)->GetWidthExp();
08799         }
08800     case ePLUS: {
08801         CNode* temp0;
08802         CNode* temp1;
08803         CNode* temp2;
08804         return Arg<CNode*>(0)->GetWidthExp();
08805         }
08806     case eNOT: {
08807         CNode* temp0;
08808         CNode* temp1;
08809         CNode* temp2;
08810         return cINT32(1);
08811         }
08812     case eGT: {
08813         CNode* temp0;
08814         CNode* temp1;
08815         CNode* temp2;
08816         return cINT32(1);
08817         }
08818     case eGE: {
08819         CNode* temp0;
08820         CNode* temp1;
08821         CNode* temp2;
08822         return cINT32(1);
08823         }
08824     case eLT: {
08825         CNode* temp0;
08826         CNode* temp1;
08827         CNode* temp2;
08828         return cINT32(1);
08829         }
08830     case eLE: {
08831         CNode* temp0;
08832         CNode* temp1;
08833         CNode* temp2;
08834         return cINT32(1);
08835         }
08836     case eLAND: {
08837         CNode* temp0;
08838         CNode* temp1;
08839         CNode* temp2;
08840         return cINT32(1);
08841         }
08842     case eLOR: {
08843         CNode* temp0;
08844         CNode* temp1;
08845         CNode* temp2;
08846         return cINT32(1);
08847         }
08848     case eCEQ: {
08849         CNode* temp0;
08850         CNode* temp1;
08851         CNode* temp2;
08852         return cINT32(1);
08853         }
08854     case eCNE: {
08855         CNode* temp0;
08856         CNode* temp1;
08857         CNode* temp2;
08858         return cINT32(1);
08859         }
08860     case eEQ: {
08861         CNode* temp0;
08862         CNode* temp1;
08863         CNode* temp2;
08864         return cINT32(1);
08865         }
08866     case eNE: {
08867         CNode* temp0;
08868         CNode* temp1;
08869         CNode* temp2;
08870         return cINT32(1);
08871         }
08872     case eRAND: {
08873         CNode* temp0;
08874         CNode* temp1;
08875         CNode* temp2;
08876         return cINT32(1);
08877         }
08878     case eRNAND: {
08879         CNode* temp0;
08880         CNode* temp1;
08881         CNode* temp2;
08882         return cINT32(1);
08883         }
08884     case eROR: {
08885         CNode* temp0;
08886         CNode* temp1;
08887         CNode* temp2;
08888         return cINT32(1);
08889         }
08890     case eRNOR: {
08891         CNode* temp0;
08892         CNode* temp1;
08893         CNode* temp2;
08894         return cINT32(1);
08895         }
08896     case eRXOR: {
08897         CNode* temp0;
08898         CNode* temp1;
08899         CNode* temp2;
08900         return cINT32(1);
08901         }
08902     case eRXNOR: {
08903         CNode* temp0;
08904         CNode* temp1;
08905         CNode* temp2;
08906         return cINT32(1);
08907         }
08908     case eHOOK: {
08909         CNode* temp0;
08910         CNode* temp1;
08911         CNode* temp2;
08912         return ((temp1=Arg<CNode*>(1)->GetWidthExp()) && (temp2=Arg<CNode*>(2)->GetWidthExp())) ? cMAX_N(temp1,temp2,NULL) : NULL;
08913         }
08914     case eMTM: {
08915         CNode* temp0;
08916         CNode* temp1;
08917         CNode* temp2;
08918         return ((temp0=Arg<CNode*>(0)->GetWidthExp()) && (temp1=Arg<CNode*>(1)->GetWidthExp()) && (temp2=Arg<CNode*>(2)->GetWidthExp())) ? cMAX_N(temp0,temp1,temp2,NULL) : NULL;
08919         }
08920     case eEXTERNAL_REF: {
08921         CNode* temp0;
08922         CNode* temp1;
08923         CNode* temp2;
08924         return External::WidthExp(Arg<CSymbol*>(0));
08925         }
08926     case eATTRIBUTE: {
08927         CNode* temp0;
08928         CNode* temp1;
08929         CNode* temp2;
08930         return cINT32(0);
08931         }
08932     case eMACRO_EXPR: {
08933         CNode* temp0;
08934         CNode* temp1;
08935         CNode* temp2;
08936         return Arg<CNode*>(1)->GetWidthExp();
08937         }
08938     case eMEMBER: {
08939         CNode* temp0;
08940         CNode* temp1;
08941         CNode* temp2;
08942         return Member::WidthExp(Arg<CNode*>(0),Arg<CSymbol*>(1));
08943         }
08944     case ePREINC: {
08945         CNode* temp0;
08946         CNode* temp1;
08947         CNode* temp2;
08948         return Arg<CNode*>(0)->GetWidthExp();
08949         }
08950     case ePOSTINC: {
08951         CNode* temp0;
08952         CNode* temp1;
08953         CNode* temp2;
08954         return Arg<CNode*>(0)->GetWidthExp();
08955         }
08956     case ePREDEC: {
08957         CNode* temp0;
08958         CNode* temp1;
08959         CNode* temp2;
08960         return Arg<CNode*>(0)->GetWidthExp();
08961         }
08962     case ePOSTDEC: {
08963         CNode* temp0;
08964         CNode* temp1;
08965         CNode* temp2;
08966         return Arg<CNode*>(0)->GetWidthExp();
08967         }
08968     case eCAST: {
08969         CNode* temp0;
08970         CNode* temp1;
08971         CNode* temp2;
08972         return cINT32(Arg<CNode*>(0)->EvalINT32());
08973         }
08974     default:
08975         MASSERT( FALSE );
08976         return NULL;
08977     }
08978 }
08979 
08980 /************************************************
08981         IsWidthEvaluateable
08982         - return true if expression width can be evaluated
08983 **************************************************/
08984 
08985 int     CNode::IsWidthEvaluateable( )
08986 {
08987     switch( GetOp() ) {
08988     case eERROR:
08989         return FALSE;
08990     case eVCONSTANT:
08991         return Arg<CVector*>(0)->IsWidthEvaluateable();
08992     case eRCONSTANT:
08993         return FALSE;
08994     case eELIST:
08995         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
08996     case eWIDTH:
08997         return Arg<CNode*>(0)->IsEvaluateable();
08998     case eSUB:
08999         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09000     case eMUL:
09001         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09002     case eDIV:
09003         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09004     case ePOW:
09005         return Arg<CNode*>(0)->IsWidthEvaluateable();
09006     case eADD:
09007         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09008     case eLSH:
09009         return Arg<CNode*>(0)->IsWidthEvaluateable();
09010     case eRSH:
09011         return Arg<CNode*>(0)->IsWidthEvaluateable();
09012     case eLSHA:
09013         return Arg<CNode*>(0)->IsWidthEvaluateable();
09014     case eRSHA:
09015         return Arg<CNode*>(0)->IsWidthEvaluateable();
09016     case eMOD:
09017         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09018     case eOR:
09019         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09020     case eAND:
09021         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09022     case eANDANDAND:
09023         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09024     case eXOR:
09025         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09026     case eXNOR:
09027         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09028     case eSYSTASK_CALL:
09029         return Systask::WidthEvaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1));
09030     case eFUNCTION_CALL:
09031         return CFunction::WidthEvaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
09032     case eARRAY:
09033         return Array::WidthEvaluateable(Arg<CNode*>(0),Arg<CNode*>(1));
09034     case eNET_REF:
09035         return Arg<CNet*>(0)->IsWidthEvaluateable();
09036     case eVAR_REF:
09037         return Arg<CVar*>(0)->IsWidthEvaluateable();
09038     case ePARAM_REF:
09039         return Arg<CParam*>(0)->IsWidthEvaluateable();
09040     case ePORT_REF:
09041         return Arg<CPortDir*>(0)->IsWidthEvaluateable();
09042     case eFWD_REF:
09043         return Arg<CFref*>(0)->IsWidthEvaluateable();
09044     case eGENVAR_REF:
09045         return Arg<CGenvar*>(0)->IsWidthEvaluateable();
09046     case eENUM_REF:
09047         return Arg<CEnum*>(0)->IsWidthEvaluateable();
09048     case eTYPE_REF:
09049         return TRUE;
09050     case eRANGE:
09051         return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsEvaluateable();
09052     case eSLICE:
09053         return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsEvaluateable();
09054     case ePSLICE:
09055         return Arg<CNode*>(1)->IsEvaluateable();
09056     case eMSLICE:
09057         return Arg<CNode*>(1)->IsEvaluateable();
09058     case eCVRI:
09059         return TRUE;
09060     case eCVIR:
09061         return FALSE;
09062     case eREP:
09063         return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09064     case eCAT:
09065         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
09066     case eUCAT:
09067         return Arg<CNode*>(0)->IsWidthEvaluateable();
09068     case eCOM:
09069         return Arg<CNode*>(0)->IsWidthEvaluateable();
09070     case eNEG:
09071         return Arg<CNode*>(0)->IsWidthEvaluateable();
09072     case ePLUS:
09073         return Arg<CNode*>(0)->IsWidthEvaluateable();
09074     case eNOT:
09075         return TRUE;
09076     case eGT:
09077         return TRUE;
09078     case eGE:
09079         return TRUE;
09080     case eLT:
09081         return TRUE;
09082     case eLE:
09083         return TRUE;
09084     case eLAND:
09085         return TRUE;
09086     case eLOR:
09087         return TRUE;
09088     case eCEQ:
09089         return TRUE;
09090     case eCNE:
09091         return TRUE;
09092     case eEQ:
09093         return TRUE;
09094     case eNE:
09095         return TRUE;
09096     case eRAND:
09097         return TRUE;
09098     case eRNAND:
09099         return TRUE;
09100     case eROR:
09101         return TRUE;
09102     case eRNOR:
09103         return TRUE;
09104     case eRXOR:
09105         return TRUE;
09106     case eRXNOR:
09107         return TRUE;
09108     case eHOOK:
09109         return Arg<CNode*>(1)->IsWidthEvaluateable() && Arg<CNode*>(2)->IsWidthEvaluateable();
09110     case eMTM:
09111         return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable() && Arg<CNode*>(2)->IsWidthEvaluateable();
09112     case eEXTERNAL_REF:
09113         return External::WidthEvaluateable(Arg<CSymbol*>(0));
09114     case eATTRIBUTE:
09115         return TRUE;
09116     case eMACRO_EXPR:
09117         return Arg<CNode*>(1)->IsWidthEvaluateable();
09118     case eMEMBER:
09119         return Member::WidthEvaluateable(Arg<CNode*>(0),Arg<CSymbol*>(1));
09120     case ePREINC:
09121         return Arg<CNode*>(0)->IsWidthEvaluateable();
09122     case ePOSTINC:
09123         return Arg<CNode*>(0)->IsWidthEvaluateable();
09124     case ePREDEC:
09125         return Arg<CNode*>(0)->IsWidthEvaluateable();
09126     case ePOSTDEC:
09127         return Arg<CNode*>(0)->IsWidthEvaluateable();
09128     case eCAST:
09129         return Arg<CNode*>(0)->IsEvaluateable();
09130     default:
09131         MASSERT( FALSE );
09132         return 0;
09133     }
09134 }       
09135 
09136 /************************************************
09137         IsNonX
09138         - return true if expression cannot be X(or Z)
09139           exclude any variable with attribute 
09140           specified by exclude and optionally integers.
09141 **************************************************/
09142 
09143 int     CNode::IsNonX( int integerIsNonX, char* exclude )
09144 {
09145     switch( GetOp() ) {
09146     case eERROR:
09147         return FALSE;
09148     case eVCONSTANT:
09149         return !Arg<CVector*>(0)->HasXZ();
09150     case eRCONSTANT:
09151         return TRUE;
09152     case eELIST:
09153         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09154     case eWIDTH:
09155         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09156     case eSUB:
09157         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09158     case eMUL:
09159         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09160     case eDIV:
09161         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09162     case ePOW:
09163         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09164     case eADD:
09165         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09166     case eLSH:
09167         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09168     case eRSH:
09169         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09170     case eLSHA:
09171         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09172     case eRSHA:
09173         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09174     case eMOD:
09175         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09176     case eOR:
09177         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09178     case eAND:
09179         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09180     case eANDANDAND:
09181         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09182     case eXOR:
09183         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09184     case eXNOR:
09185         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09186     case eSYSTASK_CALL:
09187         return FALSE;
09188     case eFUNCTION_CALL:
09189         return FALSE;
09190     case eARRAY:
09191         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09192     case eNET_REF:
09193         return Arg<CDecl*>(0)->HasAttribute( exclude ) ||
09194 
09195              (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINT);
09196     case eVAR_REF:
09197         return Arg<CDecl*>(0)->GetDataType()->GetTwoState() || 
09198 
09199              Arg<CDecl*>(0)->GetNodeType() == eR || 
09200 
09201              Arg<CDecl*>(0)->HasAttribute( exclude ) ||
09202 
09203              (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINTEGER);
09204     case ePARAM_REF:
09205         return TRUE;
09206     case ePORT_REF:
09207         return Arg<CDecl*>(0)->HasAttribute( exclude ) ||
09208 
09209              (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINT);
09210     case eFWD_REF:
09211         return FALSE;
09212     case eGENVAR_REF:
09213         return TRUE;
09214     case eENUM_REF:
09215         return Arg<CEnum*>(0)->GetExpression()->IsNonX( integerIsNonX, exclude );
09216     case eTYPE_REF:
09217         return TRUE;
09218     case eRANGE:
09219         return FALSE;
09220     case eSLICE:
09221         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09222     case ePSLICE:
09223         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09224     case eMSLICE:
09225         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09226     case eCVRI:
09227         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09228     case eCVIR:
09229         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09230     case eREP:
09231         return Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09232     case eCAT:
09233         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09234     case eUCAT:
09235         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09236     case eCOM:
09237         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09238     case eNEG:
09239         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09240     case ePLUS:
09241         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09242     case eNOT:
09243         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09244     case eGT:
09245         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09246     case eGE:
09247         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09248     case eLT:
09249         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09250     case eLE:
09251         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09252     case eLAND:
09253         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09254     case eLOR:
09255         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09256     case eCEQ:
09257         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09258     case eCNE:
09259         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09260     case eEQ:
09261         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09262     case eNE:
09263         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09264     case eRAND:
09265         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09266     case eRNAND:
09267         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09268     case eROR:
09269         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09270     case eRNOR:
09271         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09272     case eRXOR:
09273         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09274     case eRXNOR:
09275         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09276     case eHOOK:
09277         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(2)->IsNonX( integerIsNonX, exclude );
09278     case ePOSEDGE:
09279         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09280     case eNEGEDGE:
09281         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09282     case eEVOR:
09283         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09284     case eMTM:
09285         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(2)->IsNonX( integerIsNonX, exclude );
09286     case eEXTERNAL_REF:
09287         return FALSE;
09288     case eMACRO_EXPR:
09289         return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsNonX(integerIsNonX, exclude) : FALSE;
09290     case eMEMBER:
09291         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09292     case ePREINC:
09293         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09294     case ePOSTINC:
09295         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09296     case ePREDEC:
09297         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09298     case ePOSTDEC:
09299         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
09300     case eCAST:
09301         return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
09302     default:
09303         MASSERT( FALSE );
09304         return 0;
09305     }
09306 }       
09307 
09308 /***********************************************
09309         Clone
09310         - clone a copy of this tree use
09311           stack)for storage 
09312 ************************************************/
09313 
09314 CNode* CNode::Clone( CObstack* heap ) 
09315 {
09316     int nodeMask = 0;
09317     switch( GetOp() ) {
09318     case eERROR:
09319         nodeMask = 0;
09320         break;
09321     case eVCONSTANT:
09322         nodeMask = 0;
09323         break;
09324     case eRCONSTANT:
09325         nodeMask = 0;
09326         break;
09327     case eCOMMENT:
09328         nodeMask = 0;
09329         break;
09330     case eVRQ:
09331         nodeMask = 0;
09332         break;
09333     case ePRAGMA:
09334         nodeMask = 0;
09335         break;
09336     case eELIST:
09337         nodeMask = 3;
09338         break;
09339     case eWIDTH:
09340         nodeMask = 3;
09341         break;
09342     case eNOP:
09343         nodeMask = 0;
09344         break;
09345     case eSUB:
09346         nodeMask = 3;
09347         break;
09348     case eMUL:
09349         nodeMask = 3;
09350         break;
09351     case eDIV:
09352         nodeMask = 3;
09353         break;
09354     case ePOW:
09355         nodeMask = 3;
09356         break;
09357     case eADD:
09358         nodeMask = 3;
09359         break;
09360     case eLSH:
09361         nodeMask = 3;
09362         break;
09363     case eRSH:
09364         nodeMask = 3;
09365         break;
09366     case eLSHA:
09367         nodeMask = 3;
09368         break;
09369     case eRSHA:
09370         nodeMask = 3;
09371         break;
09372     case eMOD:
09373         nodeMask = 3;
09374         break;
09375     case eOR:
09376         nodeMask = 3;
09377         break;
09378     case eAND:
09379         nodeMask = 3;
09380         break;
09381     case eANDANDAND:
09382         nodeMask = 3;
09383         break;
09384     case eXOR:
09385         nodeMask = 3;
09386         break;
09387     case eXNOR:
09388         nodeMask = 3;
09389         break;
09390     case eINSTANCE_REF:
09391         nodeMask = 0;
09392         break;
09393     case eGATE_REF:
09394         nodeMask = 0;
09395         break;
09396     case eTASK_ENABLE:
09397         nodeMask = 2;
09398         break;
09399     case eSYSTASK_CALL:
09400         nodeMask = 2;
09401         break;
09402     case eTIMING_CALL:
09403         nodeMask = 2;
09404         break;
09405     case eFUNCTION_CALL:
09406         nodeMask = 2;
09407         break;
09408     case eARRAY:
09409         nodeMask = 3;
09410         break;
09411     case eNET_REF:
09412         nodeMask = 0;
09413         break;
09414     case eVAR_REF:
09415         nodeMask = 0;
09416         break;
09417     case ePARAM_REF:
09418         nodeMask = 0;
09419         break;
09420     case ePORT_REF:
09421         nodeMask = 0;
09422         break;
09423     case eFWD_REF:
09424         nodeMask = 0;
09425         break;
09426     case eGENVAR_REF:
09427         nodeMask = 0;
09428         break;
09429     case eENUM_REF:
09430         nodeMask = 0;
09431         break;
09432     case eTYPE_REF:
09433         nodeMask = 0;
09434         break;
09435     case eNET_DECL:
09436         nodeMask = 2;
09437         break;
09438     case eVAR_DECL:
09439         nodeMask = 2;
09440         break;
09441     case ePARAM_DECL:
09442         nodeMask = 0;
09443         break;
09444     case eSPECPARAM_DECL:
09445         nodeMask = 0;
09446         break;
09447     case ePORT_DECL:
09448         nodeMask = 0;
09449         break;
09450     case eGENVAR_DECL:
09451         nodeMask = 0;
09452         break;
09453     case eTYPEDEF_DECL:
09454         nodeMask = 0;
09455         break;
09456     case eLIST:
09457         nodeMask = 3;
09458         break;
09459     case eRANGE:
09460         nodeMask = 3;
09461         break;
09462     case eSLICE:
09463         nodeMask = 3;
09464         break;
09465     case ePSLICE:
09466         nodeMask = 3;
09467         break;
09468     case eMSLICE:
09469         nodeMask = 3;
09470         break;
09471     case eCVRI:
09472         nodeMask = 1;
09473         break;
09474     case eCVIR:
09475         nodeMask = 1;
09476         break;
09477     case eREP:
09478         nodeMask = 3;
09479         break;
09480     case eCAT:
09481         nodeMask = 3;
09482         break;
09483     case eUCAT:
09484         nodeMask = 1;
09485         break;
09486     case eCOM:
09487         nodeMask = 1;
09488         break;
09489     case eNEG:
09490         nodeMask = 1;
09491         break;
09492     case ePLUS:
09493         nodeMask = 1;
09494         break;
09495     case eNOT:
09496         nodeMask = 1;
09497         break;
09498     case eGT:
09499         nodeMask = 3;
09500         break;
09501     case eGE:
09502         nodeMask = 3;
09503         break;
09504     case eLT:
09505         nodeMask = 3;
09506         break;
09507     case eLE:
09508         nodeMask = 3;
09509         break;
09510     case eLAND:
09511         nodeMask = 3;
09512         break;
09513     case eLOR:
09514         nodeMask = 3;
09515         break;
09516     case eCEQ:
09517         nodeMask = 3;
09518         break;
09519     case eCNE:
09520         nodeMask = 3;
09521         break;
09522     case eEQ:
09523         nodeMask = 3;
09524         break;
09525     case eNE:
09526         nodeMask = 3;
09527         break;
09528     case eRAND:
09529         nodeMask = 1;
09530         break;
09531     case eRNAND:
09532         nodeMask = 1;
09533         break;
09534     case eROR:
09535         nodeMask = 1;
09536         break;
09537     case eRNOR:
09538         nodeMask = 1;
09539         break;
09540     case eRXOR:
09541         nodeMask = 1;
09542         break;
09543     case eRXNOR:
09544         nodeMask = 1;
09545         break;
09546     case eHOOK:
09547         nodeMask = 7;
09548         break;
09549     case eINIT:
09550         nodeMask = 1;
09551         break;
09552     case eALWAYS:
09553         nodeMask = 1;
09554         break;
09555     case eALWAYS_LATCH:
09556         nodeMask = 1;
09557         break;
09558     case eALWAYS_FF:
09559         nodeMask = 1;
09560         break;
09561     case eALWAYS_COMB:
09562         nodeMask = 1;
09563         break;
09564     case eEVENT:
09565         nodeMask = 3;
09566         break;
09567     case eBLOCK_REF:
09568         nodeMask = 2;
09569         break;
09570     case eSPECIFY_REF:
09571         nodeMask = 2;
09572         break;
09573     case eASSIGN:
09574         nodeMask = 7;
09575         break;
09576     case eADD_ASSIGN:
09577         nodeMask = 7;
09578         break;
09579     case eSUB_ASSIGN:
09580         nodeMask = 7;
09581         break;
09582     case eMUL_ASSIGN:
09583         nodeMask = 7;
09584         break;
09585     case eDIV_ASSIGN:
09586         nodeMask = 7;
09587         break;
09588     case eMOD_ASSIGN:
09589         nodeMask = 7;
09590         break;
09591     case eAND_ASSIGN:
09592         nodeMask = 7;
09593         break;
09594     case eOR_ASSIGN:
09595         nodeMask = 7;
09596         break;
09597     case eXOR_ASSIGN:
09598         nodeMask = 7;
09599         break;
09600     case eLSH_ASSIGN:
09601         nodeMask = 7;
09602         break;
09603     case eRSH_ASSIGN:
09604         nodeMask = 7;
09605         break;
09606     case eLSHA_ASSIGN:
09607         nodeMask = 7;
09608         break;
09609     case eRSHA_ASSIGN:
09610         nodeMask = 7;
09611         break;
09612     case eFORCE:
09613         nodeMask = 3;
09614         break;
09615     case eRELEASE:
09616         nodeMask = 1;
09617         break;
09618     case eNBASSIGN:
09619         nodeMask = 7;
09620         break;
09621     case ePOSEDGE:
09622         nodeMask = 1;
09623         break;
09624     case eNEGEDGE:
09625         nodeMask = 1;
09626         break;
09627     case eEDGE:
09628         nodeMask = 1;
09629         break;
09630     case eEVOR:
09631         nodeMask = 3;
09632         break;
09633     case eDELAY:
09634         nodeMask = 3;
09635         break;
09636     case eMTM:
09637         nodeMask = 7;
09638         break;
09639     case eIF:
09640         nodeMask = 7;
09641         break;
09642     case eFOREVER:
09643         nodeMask = 1;
09644         break;
09645     case eREPEAT:
09646         nodeMask = 3;
09647         break;
09648     case eWHILE:
09649         nodeMask = 3;
09650         break;
09651     case eWAIT:
09652         nodeMask = 3;
09653         break;
09654     case eFOR:
09655         nodeMask = 15;
09656         break;
09657     case eCASE:
09658         nodeMask = 3;
09659         break;
09660     case eCASEX:
09661         nodeMask = 3;
09662         break;
09663     case eCASEZ:
09664         nodeMask = 3;
09665         break;
09666     case eCASEITEM:
09667         nodeMask = 3;
09668         break;
09669     case eCASSIGN:
09670         nodeMask = 14;
09671         break;
09672     case eARG:
09673         nodeMask = 2;
09674         break;
09675     case eFUNCTION_DEF:
09676         nodeMask = 0;
09677         break;
09678     case eMODULE_DEF:
09679         nodeMask = 0;
09680         break;
09681     case eREPEAT_CONTROL:
09682         nodeMask = 3;
09683         break;
09684     case eDELAY_CONTROL:
09685         nodeMask = 1;
09686         break;
09687     case eEVENT_CONTROL:
09688         nodeMask = 1;
09689         break;
09690     case eEXTERNAL_REF:
09691         nodeMask = 0;
09692         break;
09693     case ePORT_DEF:
09694         nodeMask = 0;
09695         break;
09696     case eDEFPARAM:
09697         nodeMask = 3;
09698         break;
09699     case ePATH:
09700         nodeMask = 82;
09701         break;
09702     case ePATH_ASSIGN:
09703         nodeMask = 7;
09704         break;
09705     case eIFNONE_PATH_ASSIGN:
09706         nodeMask = 3;
09707         break;
09708     case eTRIGGER:
09709         nodeMask = 1;
09710         break;
09711     case ePASSIGN:
09712         nodeMask = 3;
09713         break;
09714     case eDEASSIGN:
09715         nodeMask = 1;
09716         break;
09717     case eDISABLE:
09718         nodeMask = 0;
09719         break;
09720     case eATTRIBUTE:
09721         nodeMask = 0;
09722         break;
09723     case eGIF:
09724         nodeMask = 7;
09725         break;
09726     case eGFOR:
09727         nodeMask = 15;
09728         break;
09729     case eGCASE:
09730         nodeMask = 3;
09731         break;
09732     case eTABLE:
09733         nodeMask = 1;
09734         break;
09735     case eTABLE_ENTRY:
09736         nodeMask = 1;
09737         break;
09738     case eTABLE_SYMBOL:
09739         nodeMask = 0;
09740         break;
09741     case ePORTLIST_END:
09742         nodeMask = 0;
09743         break;
09744     case eMACRO_EXPR:
09745         nodeMask = 2;
09746         break;
09747     case eENUM_SPEC:
09748         nodeMask = 6;
09749         break;
09750     case eMEMBER:
09751         nodeMask = 1;
09752         break;
09753     case eRETURN:
09754         nodeMask = 1;
09755         break;
09756     case ePREINC:
09757         nodeMask = 1;
09758         break;
09759     case ePOSTINC:
09760         nodeMask = 1;
09761         break;
09762     case ePREDEC:
09763         nodeMask = 1;
09764         break;
09765     case ePOSTDEC:
09766         nodeMask = 1;
09767         break;
09768     case eCAST:
09769         nodeMask = 3;
09770         break;
09771     default:
09772         MASSERT( FALSE );
09773     }
09774 
09775     CNode* n = new(stack) CNode( &loc, op );
09776     n->width = width;
09777     n->type = type;
09778     n->fixedWidth = fixedWidth;
09779     if( attributes ) {
09780         n->attributes = attributes->Clone(heap);
09781     }
09782     for( int i = 0; i < ArgCount(); i++ ) {
09783         if( ((nodeMask>>i)&1) && Arg<CNode*>(i) ) {
09784             n->Arg<CNode*>(i) = Arg<CNode*>(i)->Clone(heap);
09785         } else {
09786             void* tmp = Arg<void*>(i);
09787             n->Arg<void*>(i) = tmp;
09788         }
09789     }
09790     return n;
09791 }
09792 
09793 
09794 /***********************************************
09795         PreVisit1
09796         - traverse tree, evoking 
09797           parent then leaves. 
09798           Callback may terminate traversal of subtree early.
09799 ************************************************/
09800 
09801 void CNode::PreVisit1( int (*func)(CNode*, void*), void* data ) 
09802 {
09803     if( !(*func)( this, data ) ) {
09804         return;
09805     }
09806 
09807     if( GetAttributes() ) {
09808         GetAttributes()->PreVisit1( func, data );
09809     }
09810 
09811     int nodeMask = 0;
09812     switch( GetOp() ) {
09813        case eERROR:
09814            nodeMask = 0;
09815            break;
09816        case eVCONSTANT:
09817            nodeMask = 1;
09818            break;
09819        case eRCONSTANT:
09820            nodeMask = 1;
09821            break;
09822        case eCOMMENT:
09823            nodeMask = 1;
09824            break;
09825        case eVRQ:
09826            nodeMask = 1;
09827            break;
09828        case ePRAGMA:
09829            nodeMask = 1;
09830            break;
09831        case eELIST:
09832            nodeMask = 0;
09833            break;
09834        case eWIDTH:
09835            nodeMask = 0;
09836            break;
09837        case eNOP:
09838            nodeMask = 0;
09839            break;
09840        case eSUB:
09841            nodeMask = 0;
09842            break;
09843        case eMUL:
09844            nodeMask = 0;
09845            break;
09846        case eDIV:
09847            nodeMask = 0;
09848            break;
09849        case ePOW:
09850            nodeMask = 0;
09851            break;
09852        case eADD:
09853            nodeMask = 0;
09854            break;
09855        case eLSH:
09856            nodeMask = 0;
09857            break;
09858        case eRSH:
09859            nodeMask = 0;
09860            break;
09861        case eLSHA:
09862            nodeMask = 0;
09863            break;
09864        case eRSHA:
09865            nodeMask = 0;
09866            break;
09867        case eMOD:
09868            nodeMask = 0;
09869            break;
09870        case eOR:
09871            nodeMask = 0;
09872            break;
09873        case eAND:
09874            nodeMask = 0;
09875            break;
09876        case eANDANDAND:
09877            nodeMask = 0;
09878            break;
09879        case eXOR:
09880            nodeMask = 0;
09881            break;
09882        case eXNOR:
09883            nodeMask = 0;
09884            break;
09885        case eINSTANCE_REF:
09886            nodeMask = 1;
09887            if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PreVisit1( func, data );
09888            break;
09889        case eGATE_REF:
09890            nodeMask = 1;
09891            if(Arg<CGate*>(0)) Arg<CGate*>(0)->PreVisit1( func, data );
09892            break;
09893        case eTASK_ENABLE:
09894            nodeMask = 1;
09895            break;
09896        case eSYSTASK_CALL:
09897            nodeMask = 1;
09898            break;
09899        case eTIMING_CALL:
09900            nodeMask = 1;
09901            break;
09902        case eFUNCTION_CALL:
09903            nodeMask = 5;
09904            break;
09905        case eARRAY:
09906            nodeMask = 0;
09907            break;
09908        case eNET_REF:
09909            return;
09910        case eVAR_REF:
09911            return;
09912        case ePARAM_REF:
09913            return;
09914        case ePORT_REF:
09915            return;
09916        case eFWD_REF:
09917            return;
09918        case eGENVAR_REF:
09919            return;
09920        case eENUM_REF:
09921            return;
09922        case eTYPE_REF:
09923            return;
09924        case eNET_DECL:
09925            nodeMask = 1;
09926            if(Arg<CNet*>(0)) Arg<CNet*>(0)->PreVisit1( func, data );
09927            break;
09928        case eVAR_DECL:
09929            nodeMask = 1;
09930            if(Arg<CVar*>(0)) Arg<CVar*>(0)->PreVisit1( func, data );
09931            break;
09932        case ePARAM_DECL:
09933            nodeMask = 1;
09934            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PreVisit1( func, data );
09935            break;
09936        case eSPECPARAM_DECL:
09937            nodeMask = 1;
09938            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PreVisit1( func, data );
09939            break;
09940        case ePORT_DECL:
09941            nodeMask = 1;
09942            if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PreVisit1( func, data );
09943            break;
09944        case eGENVAR_DECL:
09945            nodeMask = 1;
09946            if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PreVisit1( func, data );
09947            break;
09948        case eTYPEDEF_DECL:
09949            nodeMask = 1;
09950            if(Arg<CTypedef*>(0)) Arg<CTypedef*>(0)->PreVisit1( func, data );
09951            break;
09952        case eLIST:
09953            nodeMask = 0;
09954            break;
09955        case eRANGE:
09956            nodeMask = 0;
09957            break;
09958        case eSLICE:
09959            nodeMask = 0;
09960            break;
09961        case ePSLICE:
09962            nodeMask = 0;
09963            break;
09964        case eMSLICE:
09965            nodeMask = 0;
09966            break;
09967        case eCVRI:
09968            nodeMask = 0;
09969            break;
09970        case eCVIR:
09971            nodeMask = 0;
09972            break;
09973        case eREP:
09974            nodeMask = 0;
09975            break;
09976        case eCAT:
09977            nodeMask = 0;
09978            break;
09979        case eUCAT:
09980            nodeMask = 0;
09981            break;
09982        case eCOM:
09983            nodeMask = 0;
09984            break;
09985        case eNEG:
09986            nodeMask = 0;
09987            break;
09988        case ePLUS:
09989            nodeMask = 0;
09990            break;
09991        case eNOT:
09992            nodeMask = 0;
09993            break;
09994        case eGT:
09995            nodeMask = 0;
09996            break;
09997        case eGE:
09998            nodeMask = 0;
09999            break;
10000        case eLT:
10001            nodeMask = 0;
10002            break;
10003        case eLE:
10004            nodeMask = 0;
10005            break;
10006        case eLAND:
10007            nodeMask = 0;
10008            break;
10009        case eLOR:
10010            nodeMask = 0;
10011            break;
10012        case eCEQ:
10013            nodeMask = 0;
10014            break;
10015        case eCNE:
10016            nodeMask = 0;
10017            break;
10018        case eEQ:
10019            nodeMask = 0;
10020            break;
10021        case eNE:
10022            nodeMask = 0;
10023            break;
10024        case eRAND:
10025            nodeMask = 0;
10026            break;
10027        case eRNAND:
10028            nodeMask = 0;
10029            break;
10030        case eROR:
10031            nodeMask = 0;
10032            break;
10033        case eRNOR:
10034            nodeMask = 0;
10035            break;
10036        case eRXOR:
10037            nodeMask = 0;
10038            break;
10039        case eRXNOR:
10040            nodeMask = 0;
10041            break;
10042        case eHOOK:
10043            nodeMask = 0;
10044            break;
10045        case eINIT:
10046            nodeMask = 0;
10047            break;
10048        case eALWAYS:
10049            nodeMask = 0;
10050            break;
10051        case eALWAYS_LATCH:
10052            nodeMask = 0;
10053            break;
10054        case eALWAYS_FF:
10055            nodeMask = 0;
10056            break;
10057        case eALWAYS_COMB:
10058            nodeMask = 0;
10059            break;
10060        case eEVENT:
10061            nodeMask = 0;
10062            break;
10063        case eBLOCK_REF:
10064            nodeMask = 1;
10065            if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PreVisit1( func, data );
10066            break;
10067        case eSPECIFY_REF:
10068            nodeMask = 1;
10069            if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PreVisit1( func, data );
10070            break;
10071        case eASSIGN:
10072            nodeMask = 0;
10073            break;
10074        case eADD_ASSIGN:
10075            nodeMask = 0;
10076            break;
10077        case eSUB_ASSIGN:
10078            nodeMask = 0;
10079            break;
10080        case eMUL_ASSIGN:
10081            nodeMask = 0;
10082            break;
10083        case eDIV_ASSIGN:
10084            nodeMask = 0;
10085            break;
10086        case eMOD_ASSIGN:
10087            nodeMask = 0;
10088            break;
10089        case eAND_ASSIGN:
10090            nodeMask = 0;
10091            break;
10092        case eOR_ASSIGN:
10093            nodeMask = 0;
10094            break;
10095        case eXOR_ASSIGN:
10096            nodeMask = 0;
10097            break;
10098        case eLSH_ASSIGN:
10099            nodeMask = 0;
10100            break;
10101        case eRSH_ASSIGN:
10102            nodeMask = 0;
10103            break;
10104        case eLSHA_ASSIGN:
10105            nodeMask = 0;
10106            break;
10107        case eRSHA_ASSIGN:
10108            nodeMask = 0;
10109            break;
10110        case eFORCE:
10111            nodeMask = 0;
10112            break;
10113        case eRELEASE:
10114            nodeMask = 0;
10115            break;
10116        case eNBASSIGN:
10117            nodeMask = 0;
10118            break;
10119        case ePOSEDGE:
10120            nodeMask = 0;
10121            break;
10122        case eNEGEDGE:
10123            nodeMask = 0;
10124            break;
10125        case eEDGE:
10126            nodeMask = 2;
10127            break;
10128        case eEVOR:
10129            nodeMask = 0;
10130            break;
10131        case eDELAY:
10132            nodeMask = 0;
10133            break;
10134        case eMTM:
10135            nodeMask = 0;
10136            break;
10137        case eIF:
10138            nodeMask = 0;
10139            break;
10140        case eFOREVER:
10141            nodeMask = 0;
10142            break;
10143        case eREPEAT:
10144            nodeMask = 0;
10145            break;
10146        case eWHILE:
10147            nodeMask = 0;
10148            break;
10149        case eWAIT:
10150            nodeMask = 0;
10151            break;
10152        case eFOR:
10153            nodeMask = 0;
10154            break;
10155        case eCASE:
10156            nodeMask = 0;
10157            break;
10158        case eCASEX:
10159            nodeMask = 0;
10160            break;
10161        case eCASEZ:
10162            nodeMask = 0;
10163            break;
10164        case eCASEITEM:
10165            nodeMask = 0;
10166            break;
10167        case eCASSIGN:
10168            nodeMask = 1;
10169            break;
10170        case eARG:
10171            nodeMask = 1;
10172            break;
10173        case eFUNCTION_DEF:
10174            nodeMask = 1;
10175            if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PreVisit1( func, data );
10176            break;
10177        case eMODULE_DEF:
10178            nodeMask = 1;
10179            if(Arg<CModule*>(0)) Arg<CModule*>(0)->PreVisit1( func, data );
10180            break;
10181        case eREPEAT_CONTROL:
10182            nodeMask = 0;
10183            break;
10184        case eDELAY_CONTROL:
10185            nodeMask = 0;
10186            break;
10187        case eEVENT_CONTROL:
10188            nodeMask = 0;
10189            break;
10190        case eEXTERNAL_REF:
10191            nodeMask = 1;
10192            break;
10193        case ePORT_DEF:
10194            nodeMask = 1;
10195            if(Arg<CPort*>(0)) Arg<CPort*>(0)->PreVisit1( func, data );
10196            break;
10197        case eDEFPARAM:
10198            nodeMask = 0;
10199            break;
10200        case ePATH:
10201            nodeMask = 45;
10202            break;
10203        case ePATH_ASSIGN:
10204            nodeMask = 0;
10205            break;
10206        case eIFNONE_PATH_ASSIGN:
10207            nodeMask = 0;
10208            break;
10209        case eTRIGGER:
10210            nodeMask = 0;
10211            break;
10212        case ePASSIGN:
10213            nodeMask = 0;
10214            break;
10215        case eDEASSIGN:
10216            nodeMask = 0;
10217            break;
10218        case eDISABLE:
10219            nodeMask = 1;
10220            break;
10221        case eATTRIBUTE:
10222            nodeMask = 1;
10223            if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PreVisit1( func, data );
10224            break;
10225        case eGIF:
10226            nodeMask = 0;
10227            break;
10228        case eGFOR:
10229            nodeMask = 0;
10230            break;
10231        case eGCASE:
10232            nodeMask = 0;
10233            break;
10234        case eTABLE:
10235            nodeMask = 0;
10236            break;
10237        case eTABLE_ENTRY:
10238            nodeMask = 0;
10239            break;
10240        case eTABLE_SYMBOL:
10241            nodeMask = 1;
10242            break;
10243        case ePORTLIST_END:
10244            nodeMask = 0;
10245            break;
10246        case eMACRO_EXPR:
10247            nodeMask = 1;
10248            break;
10249        case eENUM_SPEC:
10250            nodeMask = 1;
10251            break;
10252        case eMEMBER:
10253            nodeMask = 2;
10254            break;
10255        case eRETURN:
10256            nodeMask = 0;
10257            break;
10258        case ePREINC:
10259            nodeMask = 0;
10260            break;
10261        case ePOSTINC:
10262            nodeMask = 0;
10263            break;
10264        case ePREDEC:
10265            nodeMask = 0;
10266            break;
10267        case ePOSTDEC:
10268            nodeMask = 0;
10269            break;
10270        case eCAST:
10271            nodeMask = 0;
10272            break;
10273     }
10274 
10275     /*
10276      * special case LIST nodes for tail recursion optimizations
10277      */
10278     if( GetOp() != eLIST ) {
10279         for( int i = 0; i < ArgCount(); i++ ) {
10280             if( Arg<CNode*>(i) && !((nodeMask>>i)&1) )  Arg<CNode*>(i)->PreVisit1( func, data );
10281         }
10282     } else {
10283         CNode* n = this;
10284         while( 1 ) {
10285             if( n->Arg<CNode*>(0) ) {
10286                  n->Arg<CNode*>(0)->PreVisit1( func, data );
10287             }
10288             if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
10289                 break;
10290             }
10291             n = n->Arg<CNode*>(1); 
10292             if( !(*func)( n, data ) ) {
10293                 return;
10294             }
10295             if( n->GetAttributes() ) {
10296                 n->GetAttributes()->PreVisit1( func, data );
10297             }
10298         } 
10299         if( n->Arg<CNode*>(1) ) {
10300              n->Arg<CNode*>(1)->PreVisit1( func, data );
10301         }
10302     }
10303 }
10304 
10305 
10306 /***********************************************
10307         PostVisit1
10308         - traverse tree, evoking 
10309           leaves then parent. 
10310 ************************************************/
10311 void CNode::PostVisit1( void (*func)(CNode*, void*), void* data ) 
10312 {
10313     if( GetAttributes() ) {
10314         GetAttributes()->PostVisit1( func, data );
10315     }
10316 
10317     int nodeMask = 0;
10318     switch( GetOp() ) {
10319        case eERROR:
10320            nodeMask = 0;
10321            break;
10322        case eVCONSTANT:
10323            nodeMask = 1;
10324            break;
10325        case eRCONSTANT:
10326            nodeMask = 1;
10327            break;
10328        case eCOMMENT:
10329            nodeMask = 1;
10330            break;
10331        case eVRQ:
10332            nodeMask = 1;
10333            break;
10334        case ePRAGMA:
10335            nodeMask = 1;
10336            break;
10337        case eELIST:
10338            nodeMask = 0;
10339            break;
10340        case eWIDTH:
10341            nodeMask = 0;
10342            break;
10343        case eNOP:
10344            nodeMask = 0;
10345            break;
10346        case eSUB:
10347            nodeMask = 0;
10348            break;
10349        case eMUL:
10350            nodeMask = 0;
10351            break;
10352        case eDIV:
10353            nodeMask = 0;
10354            break;
10355        case ePOW:
10356            nodeMask = 0;
10357            break;
10358        case eADD:
10359            nodeMask = 0;
10360            break;
10361        case eLSH:
10362            nodeMask = 0;
10363            break;
10364        case eRSH:
10365            nodeMask = 0;
10366            break;
10367        case eLSHA:
10368            nodeMask = 0;
10369            break;
10370        case eRSHA:
10371            nodeMask = 0;
10372            break;
10373        case eMOD:
10374            nodeMask = 0;
10375            break;
10376        case eOR:
10377            nodeMask = 0;
10378            break;
10379        case eAND:
10380            nodeMask = 0;
10381            break;
10382        case eANDANDAND:
10383            nodeMask = 0;
10384            break;
10385        case eXOR:
10386            nodeMask = 0;
10387            break;
10388        case eXNOR:
10389            nodeMask = 0;
10390            break;
10391        case eINSTANCE_REF:
10392            nodeMask = 1;
10393            if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PostVisit1( func, data );
10394            break;
10395        case eGATE_REF:
10396            nodeMask = 1;
10397            if(Arg<CGate*>(0)) Arg<CGate*>(0)->PostVisit1( func, data );
10398            break;
10399        case eTASK_ENABLE:
10400            nodeMask = 1;
10401            break;
10402        case eSYSTASK_CALL:
10403            nodeMask = 1;
10404            break;
10405        case eTIMING_CALL:
10406            nodeMask = 1;
10407            break;
10408        case eFUNCTION_CALL:
10409            nodeMask = 5;
10410            break;
10411        case eARRAY:
10412            nodeMask = 0;
10413            break;
10414        case eNET_REF:
10415            nodeMask = ~0;
10416            break;
10417        case eVAR_REF:
10418            nodeMask = ~0;
10419            break;
10420        case ePARAM_REF:
10421            nodeMask = ~0;
10422            break;
10423        case ePORT_REF:
10424            nodeMask = ~0;
10425            break;
10426        case eFWD_REF:
10427            nodeMask = ~0;
10428            break;
10429        case eGENVAR_REF:
10430            nodeMask = ~0;
10431            break;
10432        case eENUM_REF:
10433            nodeMask = ~0;
10434            break;
10435        case eTYPE_REF:
10436            nodeMask = ~0;
10437            break;
10438        case eNET_DECL:
10439            nodeMask = 1;
10440            if(Arg<CNet*>(0)) Arg<CNet*>(0)->PostVisit1( func, data );
10441            break;
10442        case eVAR_DECL:
10443            nodeMask = 1;
10444            if(Arg<CVar*>(0)) Arg<CVar*>(0)->PostVisit1( func, data );
10445            break;
10446        case ePARAM_DECL:
10447            nodeMask = 1;
10448            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostVisit1( func, data );
10449            break;
10450        case eSPECPARAM_DECL:
10451            nodeMask = 1;
10452            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostVisit1( func, data );
10453            break;
10454        case ePORT_DECL:
10455            nodeMask = 1;
10456            if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PostVisit1( func, data );
10457            break;
10458        case eGENVAR_DECL:
10459            nodeMask = 1;
10460            if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PostVisit1( func, data );
10461            break;
10462        case eTYPEDEF_DECL:
10463            nodeMask = 1;
10464            if(Arg<CTypedef*>(0)) Arg<CTypedef*>(0)->PostVisit1( func, data );
10465            break;
10466        case eLIST:
10467            nodeMask = 0;
10468            break;
10469        case eRANGE:
10470            nodeMask = 0;
10471            break;
10472        case eSLICE:
10473            nodeMask = 0;
10474            break;
10475        case ePSLICE:
10476            nodeMask = 0;
10477            break;
10478        case eMSLICE:
10479            nodeMask = 0;
10480            break;
10481        case eCVRI:
10482            nodeMask = 0;
10483            break;
10484        case eCVIR:
10485            nodeMask = 0;
10486            break;
10487        case eREP:
10488            nodeMask = 0;
10489            break;
10490        case eCAT:
10491            nodeMask = 0;
10492            break;
10493        case eUCAT:
10494            nodeMask = 0;
10495            break;
10496        case eCOM:
10497            nodeMask = 0;
10498            break;
10499        case eNEG:
10500            nodeMask = 0;
10501            break;
10502        case ePLUS:
10503            nodeMask = 0;
10504            break;
10505        case eNOT:
10506            nodeMask = 0;
10507            break;
10508        case eGT:
10509            nodeMask = 0;
10510            break;
10511        case eGE:
10512            nodeMask = 0;
10513            break;
10514        case eLT:
10515            nodeMask = 0;
10516            break;
10517        case eLE:
10518            nodeMask = 0;
10519            break;
10520        case eLAND:
10521            nodeMask = 0;
10522            break;
10523        case eLOR:
10524            nodeMask = 0;
10525            break;
10526        case eCEQ:
10527            nodeMask = 0;
10528            break;
10529        case eCNE:
10530            nodeMask = 0;
10531            break;
10532        case eEQ:
10533            nodeMask = 0;
10534            break;
10535        case eNE:
10536            nodeMask = 0;
10537            break;
10538        case eRAND:
10539            nodeMask = 0;
10540            break;
10541        case eRNAND:
10542            nodeMask = 0;
10543            break;
10544        case eROR:
10545            nodeMask = 0;
10546            break;
10547        case eRNOR:
10548            nodeMask = 0;
10549            break;
10550        case eRXOR:
10551            nodeMask = 0;
10552            break;
10553        case eRXNOR:
10554            nodeMask = 0;
10555            break;
10556        case eHOOK:
10557            nodeMask = 0;
10558            break;
10559        case eINIT:
10560            nodeMask = 0;
10561            break;
10562        case eALWAYS:
10563            nodeMask = 0;
10564            break;
10565        case eALWAYS_LATCH:
10566            nodeMask = 0;
10567            break;
10568        case eALWAYS_FF:
10569            nodeMask = 0;
10570            break;
10571        case eALWAYS_COMB:
10572            nodeMask = 0;
10573            break;
10574        case eEVENT:
10575            nodeMask = 0;
10576            break;
10577        case eBLOCK_REF:
10578            nodeMask = 1;
10579            if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PostVisit1( func, data );
10580            break;
10581        case eSPECIFY_REF:
10582            nodeMask = 1;
10583            if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PostVisit1( func, data );
10584            break;
10585        case eASSIGN:
10586            nodeMask = 0;
10587            break;
10588        case eADD_ASSIGN:
10589            nodeMask = 0;
10590            break;
10591        case eSUB_ASSIGN:
10592            nodeMask = 0;
10593            break;
10594        case eMUL_ASSIGN:
10595            nodeMask = 0;
10596            break;
10597        case eDIV_ASSIGN:
10598            nodeMask = 0;
10599            break;
10600        case eMOD_ASSIGN:
10601            nodeMask = 0;
10602            break;
10603        case eAND_ASSIGN:
10604            nodeMask = 0;
10605            break;
10606        case eOR_ASSIGN:
10607            nodeMask = 0;
10608            break;
10609        case eXOR_ASSIGN:
10610            nodeMask = 0;
10611            break;
10612        case eLSH_ASSIGN:
10613            nodeMask = 0;
10614            break;
10615        case eRSH_ASSIGN:
10616            nodeMask = 0;
10617            break;
10618        case eLSHA_ASSIGN:
10619            nodeMask = 0;
10620            break;
10621        case eRSHA_ASSIGN:
10622            nodeMask = 0;
10623            break;
10624        case eFORCE:
10625            nodeMask = 0;
10626            break;
10627        case eRELEASE:
10628            nodeMask = 0;
10629            break;
10630        case eNBASSIGN:
10631            nodeMask = 0;
10632            break;
10633        case ePOSEDGE:
10634            nodeMask = 0;
10635            break;
10636        case eNEGEDGE:
10637            nodeMask = 0;
10638            break;
10639        case eEDGE:
10640            nodeMask = 2;
10641            break;
10642        case eEVOR:
10643            nodeMask = 0;
10644            break;
10645        case eDELAY:
10646            nodeMask = 0;
10647            break;
10648        case eMTM:
10649            nodeMask = 0;
10650            break;
10651        case eIF:
10652            nodeMask = 0;
10653            break;
10654        case eFOREVER:
10655            nodeMask = 0;
10656            break;
10657        case eREPEAT:
10658            nodeMask = 0;
10659            break;
10660        case eWHILE:
10661            nodeMask = 0;
10662            break;
10663        case eWAIT:
10664            nodeMask = 0;
10665            break;
10666        case eFOR:
10667            nodeMask = 0;
10668            break;
10669        case eCASE:
10670            nodeMask = 0;
10671            break;
10672        case eCASEX:
10673            nodeMask = 0;
10674            break;
10675        case eCASEZ:
10676            nodeMask = 0;
10677            break;
10678        case eCASEITEM:
10679            nodeMask = 0;
10680            break;
10681        case eCASSIGN:
10682            nodeMask = 1;
10683            break;
10684        case eARG:
10685            nodeMask = 1;
10686            break;
10687        case eFUNCTION_DEF:
10688            nodeMask = 1;
10689            if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PostVisit1( func, data );
10690            break;
10691        case eMODULE_DEF:
10692            nodeMask = 1;
10693            if(Arg<CModule*>(0)) Arg<CModule*>(0)->PostVisit1( func, data );
10694            break;
10695        case eREPEAT_CONTROL:
10696            nodeMask = 0;
10697            break;
10698        case eDELAY_CONTROL:
10699            nodeMask = 0;
10700            break;
10701        case eEVENT_CONTROL:
10702            nodeMask = 0;
10703            break;
10704        case eEXTERNAL_REF:
10705            nodeMask = 1;
10706            break;
10707        case ePORT_DEF:
10708            nodeMask = 1;
10709            if(Arg<CPort*>(0)) Arg<CPort*>(0)->PostVisit1( func, data );
10710            break;
10711        case eDEFPARAM:
10712            nodeMask = 0;
10713            break;
10714        case ePATH:
10715            nodeMask = 45;
10716            break;
10717        case ePATH_ASSIGN:
10718            nodeMask = 0;
10719            break;
10720        case eIFNONE_PATH_ASSIGN:
10721            nodeMask = 0;
10722            break;
10723        case eTRIGGER:
10724            nodeMask = 0;
10725            break;
10726        case ePASSIGN:
10727            nodeMask = 0;
10728            break;
10729        case eDEASSIGN:
10730            nodeMask = 0;
10731            break;
10732        case eDISABLE:
10733            nodeMask = 1;
10734            break;
10735        case eATTRIBUTE:
10736            nodeMask = 1;
10737            if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PostVisit1( func, data );
10738            break;
10739        case eGIF:
10740            nodeMask = 0;
10741            break;
10742        case eGFOR:
10743            nodeMask = 0;
10744            break;
10745        case eGCASE:
10746            nodeMask = 0;
10747            break;
10748        case eTABLE:
10749            nodeMask = 0;
10750            break;
10751        case eTABLE_ENTRY:
10752            nodeMask = 0;
10753            break;
10754        case eTABLE_SYMBOL:
10755            nodeMask = 1;
10756            break;
10757        case ePORTLIST_END:
10758            nodeMask = 0;
10759            break;
10760        case eMACRO_EXPR:
10761            nodeMask = 1;
10762            break;
10763        case eENUM_SPEC:
10764            nodeMask = 1;
10765            break;
10766        case eMEMBER:
10767            nodeMask = 2;
10768            break;
10769        case eRETURN:
10770            nodeMask = 0;
10771            break;
10772        case ePREINC:
10773            nodeMask = 0;
10774            break;
10775        case ePOSTINC:
10776            nodeMask = 0;
10777            break;
10778        case ePREDEC:
10779            nodeMask = 0;
10780            break;
10781        case ePOSTDEC:
10782            nodeMask = 0;
10783            break;
10784        case eCAST:
10785            nodeMask = 0;
10786            break;
10787     }
10788 
10789     /*
10790      * special case LIST nodes for tail recursion optimizations
10791      */
10792     if( GetOp() != eLIST ) {
10793         for( int i = 0; i < ArgCount(); i++ ) {
10794             if( Arg<CNode*>(i) && !((nodeMask>>i)&1) )  Arg<CNode*>(i)->PostVisit1( func, data );
10795         }
10796     } else {
10797         std::stack<CNode*> visitLog;
10798         CNode* n = this;
10799         while( 1 ) {
10800             if( n->Arg<CNode*>(0) ) {
10801                 n->Arg<CNode*>(0)-> PostVisit1( func, data );
10802             } 
10803             if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
10804                 break;
10805             }
10806             visitLog.push(n);
10807             n = n->Arg<CNode*>(1); 
10808             if( n->GetAttributes() ) {
10809                 n->GetAttributes()->PostVisit1( func, data );
10810             }
10811         } 
10812         if( n->Arg<CNode*>(1) ) {
10813             n->Arg<CNode*>(1)->PostVisit1( func, data );
10814         }
10815         while( !visitLog.empty() ) {
10816             CNode* top = visitLog.top();
10817             if( top->Arg<CNode*>(1) ) {
10818                 (*func)(top->Arg<CNode*>(1),data);
10819             }
10820             visitLog.pop();
10821         }
10822     }
10823 
10824     (*func)( this, data );
10825 }
10826 
10827 /***********************************************
10828         PostSubVisit1
10829         - traverse tree, evoking 
10830           leaves then parents, substituting
10831           results
10832 ************************************************/
10833 
10834 CNode* CNode::PostSubVisit1( CNode* (*func)(CNode*, void*), void* data ) 
10835 {
10836     if( GetAttributes() ) {
10837         SetAttributes( GetAttributes()->PostSubVisit1( func, data ) );
10838     }
10839 
10840     int nodeMask = 0;
10841     switch( GetOp() ) {
10842        case eERROR:
10843            nodeMask = 0;
10844            break;
10845        case eVCONSTANT:
10846            nodeMask = 1;
10847            break;
10848        case eRCONSTANT:
10849            nodeMask = 1;
10850            break;
10851        case eCOMMENT:
10852            nodeMask = 1;
10853            break;
10854        case eVRQ:
10855            nodeMask = 1;
10856            break;
10857        case ePRAGMA:
10858            nodeMask = 1;
10859            break;
10860        case eELIST:
10861            nodeMask = 0;
10862            break;
10863        case eWIDTH:
10864            nodeMask = 0;
10865            break;
10866        case eNOP:
10867            nodeMask = 0;
10868            break;
10869        case eSUB:
10870            nodeMask = 0;
10871            break;
10872        case eMUL:
10873            nodeMask = 0;
10874            break;
10875        case eDIV:
10876            nodeMask = 0;
10877            break;
10878        case ePOW:
10879            nodeMask = 0;
10880            break;
10881        case eADD:
10882            nodeMask = 0;
10883            break;
10884        case eLSH:
10885            nodeMask = 0;
10886            break;
10887        case eRSH:
10888            nodeMask = 0;
10889            break;
10890        case eLSHA:
10891            nodeMask = 0;
10892            break;
10893        case eRSHA:
10894            nodeMask = 0;
10895            break;
10896        case eMOD:
10897            nodeMask = 0;
10898            break;
10899        case eOR:
10900            nodeMask = 0;
10901            break;
10902        case eAND:
10903            nodeMask = 0;
10904            break;
10905        case eANDANDAND:
10906            nodeMask = 0;
10907            break;
10908        case eXOR:
10909            nodeMask = 0;
10910            break;
10911        case eXNOR:
10912            nodeMask = 0;
10913            break;
10914        case eINSTANCE_REF:
10915            nodeMask = 1;
10916            if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PostSubVisit1( func, data );
10917            break;
10918        case eGATE_REF:
10919            nodeMask = 1;
10920            if(Arg<CGate*>(0)) Arg<CGate*>(0)->PostSubVisit1( func, data );
10921            break;
10922        case eTASK_ENABLE:
10923            nodeMask = 1;
10924            break;
10925        case eSYSTASK_CALL:
10926            nodeMask = 1;
10927            break;
10928        case eTIMING_CALL:
10929            nodeMask = 1;
10930            break;
10931        case eFUNCTION_CALL:
10932            nodeMask = 5;
10933            break;
10934        case eARRAY:
10935            nodeMask = 0;
10936            break;
10937        case eNET_REF:
10938            nodeMask = ~0;
10939            break;
10940        case eVAR_REF:
10941            nodeMask = ~0;
10942            break;
10943        case ePARAM_REF:
10944            nodeMask = ~0;
10945            break;
10946        case ePORT_REF:
10947            nodeMask = ~0;
10948            break;
10949        case eFWD_REF:
10950            nodeMask = ~0;
10951            break;
10952        case eGENVAR_REF:
10953            nodeMask = ~0;
10954            break;
10955        case eENUM_REF:
10956            nodeMask = ~0;
10957            break;
10958        case eTYPE_REF:
10959            nodeMask = ~0;
10960            break;
10961        case eNET_DECL:
10962            nodeMask = 1;
10963            if(Arg<CNet*>(0)) Arg<CNet*>(0)->PostSubVisit1( func, data );
10964            break;
10965        case eVAR_DECL:
10966            nodeMask = 1;
10967            if(Arg<CVar*>(0)) Arg<CVar*>(0)->PostSubVisit1( func, data );
10968            break;
10969        case ePARAM_DECL:
10970            nodeMask = 1;
10971            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostSubVisit1( func, data );
10972            break;
10973        case eSPECPARAM_DECL:
10974            nodeMask = 1;
10975            if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostSubVisit1( func, data );
10976            break;
10977        case ePORT_DECL:
10978            nodeMask = 1;
10979            if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PostSubVisit1( func, data );
10980            break;
10981        case eGENVAR_DECL:
10982            nodeMask = 1;
10983            if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PostSubVisit1( func, data );
10984            break;
10985        case eTYPEDEF_DECL:
10986            nodeMask = 1;
10987            if(Arg<CTypedef*>(0)) Arg<CTypedef*>(0)->PostSubVisit1( func, data );
10988            break;
10989        case eLIST:
10990            nodeMask = 0;
10991            break;
10992        case eRANGE:
10993            nodeMask = 0;
10994            break;
10995        case eSLICE:
10996            nodeMask = 0;
10997            break;
10998        case ePSLICE:
10999            nodeMask = 0;
11000            break;
11001        case eMSLICE:
11002            nodeMask = 0;
11003            break;
11004        case eCVRI:
11005            nodeMask = 0;
11006            break;
11007        case eCVIR:
11008            nodeMask = 0;
11009            break;
11010        case eREP:
11011            nodeMask = 0;
11012            break;
11013        case eCAT:
11014            nodeMask = 0;
11015            break;
11016        case eUCAT:
11017            nodeMask = 0;
11018            break;
11019        case eCOM:
11020            nodeMask = 0;
11021            break;
11022        case eNEG:
11023            nodeMask = 0;
11024            break;
11025        case ePLUS:
11026            nodeMask = 0;
11027            break;
11028        case eNOT:
11029            nodeMask = 0;
11030            break;
11031        case eGT:
11032            nodeMask = 0;
11033            break;
11034        case eGE:
11035            nodeMask = 0;
11036            break;
11037        case eLT:
11038            nodeMask = 0;
11039            break;
11040        case eLE:
11041            nodeMask = 0;
11042            break;
11043        case eLAND:
11044            nodeMask = 0;
11045            break;
11046        case eLOR:
11047            nodeMask = 0;
11048            break;
11049        case eCEQ:
11050            nodeMask = 0;
11051            break;
11052        case eCNE:
11053            nodeMask = 0;
11054            break;
11055        case eEQ:
11056            nodeMask = 0;
11057            break;
11058        case eNE:
11059            nodeMask = 0;
11060            break;
11061        case eRAND:
11062            nodeMask = 0;
11063            break;
11064        case eRNAND:
11065            nodeMask = 0;
11066            break;
11067        case eROR:
11068            nodeMask = 0;
11069            break;
11070        case eRNOR:
11071            nodeMask = 0;
11072            break;
11073        case eRXOR:
11074            nodeMask = 0;
11075            break;
11076        case eRXNOR:
11077            nodeMask = 0;
11078            break;
11079        case eHOOK:
11080            nodeMask = 0;
11081            break;
11082        case eINIT:
11083            nodeMask = 0;
11084            break;
11085        case eALWAYS:
11086            nodeMask = 0;
11087            break;
11088        case eALWAYS_LATCH:
11089            nodeMask = 0;
11090            break;
11091        case eALWAYS_FF:
11092            nodeMask = 0;
11093            break;
11094        case eALWAYS_COMB:
11095            nodeMask = 0;
11096            break;
11097        case eEVENT:
11098            nodeMask = 0;
11099            break;
11100        case eBLOCK_REF:
11101            nodeMask = 1;
11102            if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PostSubVisit1( func, data );
11103            break;
11104        case eSPECIFY_REF:
11105            nodeMask = 1;
11106            if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PostSubVisit1( func, data );
11107            break;
11108        case eASSIGN:
11109            nodeMask = 0;
11110            break;
11111        case eADD_ASSIGN:
11112            nodeMask = 0;
11113            break;
11114        case eSUB_ASSIGN:
11115            nodeMask = 0;
11116            break;
11117        case eMUL_ASSIGN:
11118            nodeMask = 0;
11119            break;
11120        case eDIV_ASSIGN:
11121            nodeMask = 0;
11122            break;
11123        case eMOD_ASSIGN:
11124            nodeMask = 0;
11125            break;
11126        case eAND_ASSIGN:
11127            nodeMask = 0;
11128            break;
11129        case eOR_ASSIGN:
11130            nodeMask = 0;
11131            break;
11132        case eXOR_ASSIGN:
11133            nodeMask = 0;
11134            break;
11135        case eLSH_ASSIGN:
11136            nodeMask = 0;
11137            break;
11138        case eRSH_ASSIGN:
11139            nodeMask = 0;
11140            break;
11141        case eLSHA_ASSIGN:
11142            nodeMask = 0;
11143            break;
11144        case eRSHA_ASSIGN:
11145            nodeMask = 0;
11146            break;
11147        case eFORCE:
11148            nodeMask = 0;
11149            break;
11150        case eRELEASE:
11151            nodeMask = 0;
11152            break;
11153        case eNBASSIGN:
11154            nodeMask = 0;
11155            break;
11156        case ePOSEDGE:
11157            nodeMask = 0;
11158            break;
11159        case eNEGEDGE:
11160            nodeMask = 0;
11161            break;
11162        case eEDGE:
11163            nodeMask = 2;
11164            break;
11165        case eEVOR:
11166            nodeMask = 0;
11167            break;
11168        case eDELAY:
11169            nodeMask = 0;
11170            break;
11171        case eMTM:
11172            nodeMask = 0;
11173            break;
11174        case eIF:
11175            nodeMask = 0;
11176            break;
11177        case eFOREVER:
11178            nodeMask = 0;
11179            break;
11180        case eREPEAT:
11181            nodeMask = 0;
11182            break;
11183        case eWHILE:
11184            nodeMask = 0;
11185            break;
11186        case eWAIT:
11187            nodeMask = 0;
11188            break;
11189        case eFOR:
11190            nodeMask = 0;
11191            break;
11192        case eCASE:
11193            nodeMask = 0;
11194            break;
11195        case eCASEX:
11196            nodeMask = 0;
11197            break;
11198        case eCASEZ:
11199            nodeMask = 0;
11200            break;
11201        case eCASEITEM:
11202            nodeMask = 0;
11203            break;
11204        case eCASSIGN:
11205            nodeMask = 1;
11206            break;
11207        case eARG:
11208            nodeMask = 1;
11209            break;
11210        case eFUNCTION_DEF:
11211            nodeMask = 1;
11212            if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PostSubVisit1( func, data );
11213            break;
11214        case eMODULE_DEF:
11215            nodeMask = 1;
11216            if(Arg<CModule*>(0)) Arg<CModule*>(0)->PostSubVisit1( func, data );
11217            break;
11218        case eREPEAT_CONTROL:
11219            nodeMask = 0;
11220            break;
11221        case eDELAY_CONTROL:
11222            nodeMask = 0;
11223            break;
11224        case eEVENT_CONTROL:
11225            nodeMask = 0;
11226            break;
11227        case eEXTERNAL_REF:
11228            nodeMask = 1;
11229            break;
11230        case ePORT_DEF:
11231            nodeMask = 1;
11232            if(Arg<CPort*>(0)) Arg<CPort*>(0)->PostSubVisit1( func, data );
11233            break;
11234        case eDEFPARAM:
11235            nodeMask = 0;
11236            break;
11237        case ePATH:
11238            nodeMask = 45;
11239            break;
11240        case ePATH_ASSIGN:
11241            nodeMask = 0;
11242            break;
11243        case eIFNONE_PATH_ASSIGN:
11244            nodeMask = 0;
11245            break;
11246        case eTRIGGER:
11247            nodeMask = 0;
11248            break;
11249        case ePASSIGN:
11250            nodeMask = 0;
11251            break;
11252        case eDEASSIGN:
11253            nodeMask = 0;
11254            break;
11255        case eDISABLE:
11256            nodeMask = 1;
11257            break;
11258        case eATTRIBUTE:
11259            nodeMask = 1;
11260            if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PostSubVisit1( func, data );
11261            break;
11262        case eGIF:
11263            nodeMask = 0;
11264            break;
11265        case eGFOR:
11266            nodeMask = 0;
11267            break;
11268        case eGCASE:
11269            nodeMask = 0;
11270            break;
11271        case eTABLE:
11272            nodeMask = 0;
11273            break;
11274        case eTABLE_ENTRY:
11275            nodeMask = 0;
11276            break;
11277        case eTABLE_SYMBOL:
11278            nodeMask = 1;
11279            break;
11280        case ePORTLIST_END:
11281            nodeMask = 0;
11282            break;
11283        case eMACRO_EXPR:
11284            nodeMask = 1;
11285            break;
11286        case eENUM_SPEC:
11287            nodeMask = 1;
11288            break;
11289        case eMEMBER:
11290            nodeMask = 2;
11291            break;
11292        case eRETURN:
11293            nodeMask = 0;
11294            break;
11295        case ePREINC:
11296            nodeMask = 0;
11297            break;
11298        case ePOSTINC:
11299            nodeMask = 0;
11300            break;
11301        case ePREDEC:
11302            nodeMask = 0;
11303            break;
11304        case ePOSTDEC:
11305            nodeMask = 0;
11306            break;
11307        case eCAST:
11308            nodeMask = 0;
11309            break;
11310     }
11311 
11312     /*
11313      * special case LIST nodes for tail recursion optimizations
11314      */
11315     if( GetOp() != eLIST ) {
11316         for( int i = 0; i < ArgCount(); i++ ) {
11317             if( Arg<CNode*>(i) && !((nodeMask>>i)&1) )  Arg<CNode*>(i) = Arg<CNode*>(i)->PostSubVisit1( func, data );
11318         }
11319     } else {
11320         std::stack<CNode*> visitLog;
11321         CNode* n = this;
11322         while( 1 ) {
11323             if( n->Arg<CNode*>(0) ) {
11324                 n->Arg<CNode*>(0) = n->Arg<CNode*>(0)->
11325                                         PostSubVisit1( func, data );
11326             } 
11327             if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
11328                 break;
11329             }
11330             visitLog.push(n);
11331             n = n->Arg<CNode*>(1); 
11332             if( n->GetAttributes() ) {
11333                 n->SetAttributes( n->GetAttributes()->PostSubVisit1( func, data ) );
11334             }
11335         } 
11336         if( n->Arg<CNode*>(1) ) {
11337             n->Arg<CNode*>(1) = n->Arg<CNode*>(1)->PostSubVisit1( func, data );
11338         }
11339         while( !visitLog.empty() ) {
11340             CNode* top = visitLog.top();
11341             if( top->Arg<CNode*>(1) ) {
11342                 top->Arg<CNode*>(1) = (*func)(top->Arg<CNode*>(1),data);
11343             }
11344             visitLog.pop();
11345         }
11346     }
11347 
11348     return (*func)( this, data );
11349 }
11350 
11351 /***********************************************
11352         Hash
11353         - returns a unique hash number 
11354           representing tree
11355           The following is always true:
11356             Equivilent(n1,n2) => Hash(n1) == Hash(n2)
11357 ************************************************/
11358 
11359 unsigned CNode::Hash() 
11360 {
11361     unsigned result = GetOp();
11362     int nodeMask = 0;
11363     switch( GetOp() ) {
11364        case eERROR:
11365            nodeMask = 0;
11366            break;
11367        case eVCONSTANT:
11368            nodeMask = 1;
11369            result ^= Arg<CVector*>(0)->Hash();
11370            break;
11371        case eRCONSTANT:
11372            nodeMask = 1;
11373            result ^= strlen(Arg<char*>(0));
11374            break;
11375        case eCOMMENT:
11376            nodeMask = 1;
11377            result ^= strlen(Arg<char*>(0));
11378            break;
11379        case eVRQ:
11380            nodeMask = 1;
11381            result ^= strlen(Arg<char*>(0));
11382            break;
11383        case ePRAGMA:
11384            nodeMask = 1;
11385            result ^= strlen(Arg<char*>(0));
11386            break;
11387        case eELIST:
11388            nodeMask = 0;
11389            break;
11390        case eWIDTH:
11391            nodeMask = 0;
11392            break;
11393        case eNOP:
11394            nodeMask = 0;
11395            break;
11396        case eSUB:
11397            nodeMask = 0;
11398            break;
11399        case eMUL:
11400            nodeMask = 0;
11401            break;
11402        case eDIV:
11403            nodeMask = 0;
11404            break;
11405        case ePOW:
11406            nodeMask = 0;
11407            break;
11408        case eADD:
11409            nodeMask = 0;
11410            break;
11411        case eLSH:
11412            nodeMask = 0;
11413            break;
11414        case eRSH:
11415            nodeMask = 0;
11416            break;
11417        case eLSHA:
11418            nodeMask = 0;
11419            break;
11420        case eRSHA:
11421            nodeMask = 0;
11422            break;
11423        case eMOD:
11424            nodeMask = 0;
11425            break;
11426        case eOR:
11427            nodeMask = 0;
11428            break;
11429        case eAND:
11430            nodeMask = 0;
11431            break;
11432        case eANDANDAND:
11433            nodeMask = 0;
11434            break;
11435        case eXOR:
11436            nodeMask = 0;
11437            break;
11438        case eXNOR:
11439            nodeMask = 0;
11440            break;
11441        case eINSTANCE_REF:
11442            nodeMask = 1;
11443            result ^= Arg<unsigned long>(0);
11444            break;
11445        case eGATE_REF:
11446            nodeMask = 1;
11447            result ^= Arg<unsigned long>(0);
11448            break;
11449        case eTASK_ENABLE:
11450            nodeMask = 1;
11451            result ^= Arg<unsigned long>(0);
11452            break;
11453        case eSYSTASK_CALL:
11454            nodeMask = 1;
11455            result ^= Arg<unsigned long>(0);
11456            break;
11457        case eTIMING_CALL:
11458            nodeMask = 1;
11459            result ^= Arg<unsigned long>(0);
11460            break;
11461        case eFUNCTION_CALL:
11462            nodeMask = 5;
11463            result ^= Arg<unsigned long>(0);
11464            result ^= Arg<unsigned long>(2);
11465            break;
11466        case eARRAY:
11467            nodeMask = 0;
11468            break;
11469        case eNET_REF:
11470            nodeMask = 1;
11471            result ^= Arg<unsigned long>(0);
11472            break;
11473        case eVAR_REF:
11474            nodeMask = 1;
11475            result ^= Arg<unsigned long>(0);
11476            break;
11477        case ePARAM_REF:
11478            nodeMask = 1;
11479            result ^= Arg<unsigned long>(0);
11480            break;
11481        case ePORT_REF:
11482            nodeMask = 1;
11483            result ^= Arg<unsigned long>(0);
11484            break;
11485        case eFWD_REF:
11486            nodeMask = 1;
11487            result ^= Arg<unsigned long>(0);
11488            break;
11489        case eGENVAR_REF:
11490            nodeMask = 1;
11491            result ^= Arg<unsigned long>(0);
11492            break;
11493        case eENUM_REF:
11494            nodeMask = 1;
11495            result ^= Arg<unsigned long>(0);
11496            break;
11497        case eTYPE_REF:
11498            nodeMask = 1;
11499            result ^= Arg<unsigned long>(0);
11500            break;
11501        case eNET_DECL:
11502            nodeMask = 1;
11503            result ^= Arg<unsigned long>(0);
11504            break;
11505        case eVAR_DECL:
11506            nodeMask = 1;
11507            result ^= Arg<unsigned long>(0);
11508            break;
11509        case ePARAM_DECL:
11510            nodeMask = 1;
11511            result ^= Arg<unsigned long>(0);
11512            break;
11513        case eSPECPARAM_DECL:
11514            nodeMask = 1;
11515            result ^= Arg<unsigned long>(0);
11516            break;
11517        case ePORT_DECL:
11518            nodeMask = 1;
11519            result ^= Arg<unsigned long>(0);
11520            break;
11521        case eGENVAR_DECL:
11522            nodeMask = 1;
11523            result ^= Arg<unsigned long>(0);
11524            break;
11525        case eTYPEDEF_DECL:
11526            nodeMask = 1;
11527            result ^= Arg<unsigned long>(0);
11528            break;
11529        case eLIST:
11530            nodeMask = 0;
11531            break;
11532        case eRANGE:
11533            nodeMask = 0;
11534            break;
11535        case eSLICE:
11536            nodeMask = 0;
11537            break;
11538        case ePSLICE:
11539            nodeMask = 0;
11540            break;
11541        case eMSLICE:
11542            nodeMask = 0;
11543            break;
11544        case eCVRI:
11545            nodeMask = 0;
11546            break;
11547        case eCVIR:
11548            nodeMask = 0;
11549            break;
11550        case eREP:
11551            nodeMask = 0;
11552            break;
11553        case eCAT:
11554            nodeMask = 0;
11555            break;
11556        case eUCAT:
11557            nodeMask = 0;
11558            break;
11559        case eCOM:
11560            nodeMask = 0;
11561            break;
11562        case eNEG:
11563            nodeMask = 0;
11564            break;
11565        case ePLUS:
11566            nodeMask = 0;
11567            break;
11568        case eNOT:
11569            nodeMask = 0;
11570            break;
11571        case eGT:
11572            nodeMask = 0;
11573            break;
11574        case eGE:
11575            nodeMask = 0;
11576            break;
11577        case eLT:
11578            nodeMask = 0;
11579            break;
11580        case eLE:
11581            nodeMask = 0;
11582            break;
11583        case eLAND:
11584            nodeMask = 0;
11585            break;
11586        case eLOR:
11587            nodeMask = 0;
11588            break;
11589        case eCEQ:
11590            nodeMask = 0;
11591            break;
11592        case eCNE:
11593            nodeMask = 0;
11594            break;
11595        case eEQ:
11596            nodeMask = 0;
11597            break;
11598        case eNE:
11599            nodeMask = 0;
11600            break;
11601        case eRAND:
11602            nodeMask = 0;
11603            break;
11604        case eRNAND:
11605            nodeMask = 0;
11606            break;
11607        case eROR:
11608            nodeMask = 0;
11609            break;
11610        case eRNOR:
11611            nodeMask = 0;
11612            break;
11613        case eRXOR:
11614            nodeMask = 0;
11615            break;
11616        case eRXNOR:
11617            nodeMask = 0;
11618            break;
11619        case eHOOK:
11620            nodeMask = 0;
11621            break;
11622        case eINIT:
11623            nodeMask = 0;
11624            break;
11625        case eALWAYS:
11626            nodeMask = 0;
11627            break;
11628        case eALWAYS_LATCH:
11629            nodeMask = 0;
11630            break;
11631        case eALWAYS_FF:
11632            nodeMask = 0;
11633            break;
11634        case eALWAYS_COMB:
11635            nodeMask = 0;
11636            break;
11637        case eEVENT:
11638            nodeMask = 0;
11639            break;
11640        case eBLOCK_REF:
11641            nodeMask = 1;
11642            result ^= Arg<unsigned long>(0);
11643            break;
11644        case eSPECIFY_REF:
11645            nodeMask = 1;
11646            result ^= Arg<unsigned long>(0);
11647            break;
11648        case eASSIGN:
11649            nodeMask = 0;
11650            break;
11651        case eADD_ASSIGN:
11652            nodeMask = 0;
11653            break;
11654        case eSUB_ASSIGN:
11655            nodeMask = 0;
11656            break;
11657        case eMUL_ASSIGN:
11658            nodeMask = 0;
11659            break;
11660        case eDIV_ASSIGN:
11661            nodeMask = 0;
11662            break;
11663        case eMOD_ASSIGN:
11664            nodeMask = 0;
11665            break;
11666        case eAND_ASSIGN:
11667            nodeMask = 0;
11668            break;
11669        case eOR_ASSIGN:
11670            nodeMask = 0;
11671            break;
11672        case eXOR_ASSIGN:
11673            nodeMask = 0;
11674            break;
11675        case eLSH_ASSIGN:
11676            nodeMask = 0;
11677            break;
11678        case eRSH_ASSIGN:
11679            nodeMask = 0;
11680            break;
11681        case eLSHA_ASSIGN:
11682            nodeMask = 0;
11683            break;
11684        case eRSHA_ASSIGN:
11685            nodeMask = 0;
11686            break;
11687        case eFORCE:
11688            nodeMask = 0;
11689            break;
11690        case eRELEASE:
11691            nodeMask = 0;
11692            break;
11693        case eNBASSIGN:
11694            nodeMask = 0;
11695            break;
11696        case ePOSEDGE:
11697            nodeMask = 0;
11698            break;
11699        case eNEGEDGE:
11700            nodeMask = 0;
11701            break;
11702        case eEDGE:
11703            nodeMask = 2;
11704            result ^= (unsigned long)Arg<Edge_t>(1);
11705            break;
11706        case eEVOR:
11707            nodeMask = 0;
11708            break;
11709        case eDELAY:
11710            nodeMask = 0;
11711            break;
11712        case eMTM:
11713            nodeMask = 0;
11714            break;
11715        case eIF:
11716            nodeMask = 0;
11717            break;
11718        case eFOREVER:
11719            nodeMask = 0;
11720            break;
11721        case eREPEAT:
11722            nodeMask = 0;
11723            break;
11724        case eWHILE:
11725            nodeMask = 0;
11726            break;
11727        case eWAIT:
11728            nodeMask = 0;
11729            break;
11730        case eFOR:
11731            nodeMask = 0;
11732            break;
11733        case eCASE:
11734            nodeMask = 0;
11735            break;
11736        case eCASEX:
11737            nodeMask = 0;
11738            break;
11739        case eCASEZ:
11740            nodeMask = 0;
11741            break;
11742        case eCASEITEM:
11743            nodeMask = 0;
11744            break;
11745        case eCASSIGN:
11746            nodeMask = 1;
11747            result ^= Arg<unsigned long>(0);
11748            break;
11749        case eARG:
11750            nodeMask = 1;
11751            result ^= Arg<unsigned long>(0);
11752            break;
11753        case eFUNCTION_DEF:
11754            nodeMask = 1;
11755            result ^= Arg<unsigned long>(0);
11756            break;
11757        case eMODULE_DEF:
11758            nodeMask = 1;
11759            result ^= Arg<unsigned long>(0);
11760            break;
11761        case eREPEAT_CONTROL:
11762            nodeMask = 0;
11763            break;
11764        case eDELAY_CONTROL:
11765            nodeMask = 0;
11766            break;
11767        case eEVENT_CONTROL:
11768            nodeMask = 0;
11769            break;
11770        case eEXTERNAL_REF:
11771            nodeMask = 1;
11772            result ^= Arg<unsigned long>(0);
11773            break;
11774        case ePORT_DEF:
11775            nodeMask = 1;
11776            result ^= Arg<unsigned long>(0);
11777            break;
11778        case eDEFPARAM:
11779            nodeMask = 0;
11780            break;
11781        case ePATH:
11782            nodeMask = 45;
11783            result ^= Arg<int>(0);
11784            result ^= Arg<int>(2);
11785            result ^= Arg<int>(3);
11786            result ^= Arg<int>(5);
11787            break;
11788        case ePATH_ASSIGN:
11789            nodeMask = 0;
11790            break;
11791        case eIFNONE_PATH_ASSIGN:
11792            nodeMask = 0;
11793            break;
11794        case eTRIGGER:
11795            nodeMask = 0;
11796            break;
11797        case ePASSIGN:
11798            nodeMask = 0;
11799            break;
11800        case eDEASSIGN:
11801            nodeMask = 0;
11802            break;
11803        case eDISABLE:
11804            nodeMask = 1;
11805            result ^= Arg<unsigned long>(0);
11806            break;
11807        case eATTRIBUTE:
11808            nodeMask = 1;
11809            result ^= Arg<unsigned long>(0);
11810            break;
11811        case eGIF:
11812            nodeMask = 0;
11813            break;
11814        case eGFOR:
11815            nodeMask = 0;
11816            break;
11817        case eGCASE:
11818            nodeMask = 0;
11819            break;
11820        case eTABLE:
11821            nodeMask = 0;
11822            break;
11823        case eTABLE_ENTRY:
11824            nodeMask = 0;
11825            break;
11826        case eTABLE_SYMBOL:
11827            nodeMask = 1;
11828            result ^= strlen(Arg<char*>(0));
11829            break;
11830        case ePORTLIST_END:
11831            nodeMask = 0;
11832            break;
11833        case eMACRO_EXPR:
11834            nodeMask = 1;
11835            result ^= strlen(Arg<char*>(0));
11836            break;
11837        case eENUM_SPEC:
11838            nodeMask = 1;
11839            result ^= Arg<unsigned long>(0);
11840            break;
11841        case eMEMBER:
11842            nodeMask = 2;
11843            result ^= Arg<unsigned long>(1);
11844            break;
11845        case eRETURN:
11846            nodeMask = 0;
11847            break;
11848        case ePREINC:
11849            nodeMask = 0;
11850            break;
11851        case ePOSTINC:
11852            nodeMask = 0;
11853            break;
11854        case ePREDEC:
11855            nodeMask = 0;
11856            break;
11857        case ePOSTDEC:
11858            nodeMask = 0;
11859            break;
11860        case eCAST:
11861            nodeMask = 0;
11862            break;
11863     }
11864 
11865     for( int i = 0; i < ArgCount(); i++ ) {
11866         if( !((nodeMask>>i)&1) ) result ^= Arg<CNode*>(i)->Hash();
11867     }
11868     return result;
11869 }
11870 
11871 /***********************************************
11872         Equivalent
11873         - returns TRUE if both trees are equivalent 
11874         Note: this currently will only match if
11875               the trees are structurally the same.
11876               It does not attempt rename and match
11877               leaf declarations.
11878               In the future this may be expanded
11879               to match if the trees are functionally
11880               equivalent.
11881 ************************************************/
11882 
11883 int Equivalent( CNode* a, CNode* b ) 
11884 {
11885     /*
11886      * handles NULL/NULL and trivial equivalence case
11887      */
11888     if( a == b ) {
11889         return TRUE;
11890     }
11891     /*
11892      * reject if one is NULL but not the other
11893      */
11894     if( a == NULL || b == NULL ) {
11895         return FALSE;
11896     }
11897     /*
11898      * reject if node types are different
11899      */
11900     if( a->GetOp() != b->GetOp() ) {
11901         return FALSE;
11902     }
11903 
11904     int nodeMask = 0;
11905     switch( a->GetOp() ) {
11906        case eERROR:
11907            nodeMask = 0;
11908            break;
11909        case eVCONSTANT:
11910            nodeMask = 1;
11911            if( !(*a->Arg<CVector*>(0)==*b->Arg<CVector*>(0)) ) { return FALSE; }
11912            break;
11913        case eRCONSTANT:
11914            nodeMask = 1;
11915            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
11916            break;
11917        case eCOMMENT:
11918            nodeMask = 1;
11919            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
11920            break;
11921        case eVRQ:
11922            nodeMask = 1;
11923            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
11924            break;
11925        case ePRAGMA:
11926            nodeMask = 1;
11927            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
11928            break;
11929        case eELIST:
11930            nodeMask = 0;
11931            break;
11932        case eWIDTH:
11933            nodeMask = 0;
11934            break;
11935        case eNOP:
11936            nodeMask = 0;
11937            break;
11938        case eSUB:
11939            nodeMask = 0;
11940            break;
11941        case eMUL:
11942            nodeMask = 0;
11943            break;
11944        case eDIV:
11945            nodeMask = 0;
11946            break;
11947        case ePOW:
11948            nodeMask = 0;
11949            break;
11950        case eADD:
11951            nodeMask = 0;
11952            break;
11953        case eLSH:
11954            nodeMask = 0;
11955            break;
11956        case eRSH:
11957            nodeMask = 0;
11958            break;
11959        case eLSHA:
11960            nodeMask = 0;
11961            break;
11962        case eRSHA:
11963            nodeMask = 0;
11964            break;
11965        case eMOD:
11966            nodeMask = 0;
11967            break;
11968        case eOR:
11969            nodeMask = 0;
11970            break;
11971        case eAND:
11972            nodeMask = 0;
11973            break;
11974        case eANDANDAND:
11975            nodeMask = 0;
11976            break;
11977        case eXOR:
11978            nodeMask = 0;
11979            break;
11980        case eXNOR:
11981            nodeMask = 0;
11982            break;
11983        case eINSTANCE_REF:
11984            nodeMask = 1;
11985            if( !(a->Arg<CInstance*>(0)==b->Arg<CInstance*>(0)) ) { return FALSE; }
11986            break;
11987        case eGATE_REF:
11988            nodeMask = 1;
11989            if( !(a->Arg<CGate*>(0)==b->Arg<CGate*>(0)) ) { return FALSE; }
11990            break;
11991        case eTASK_ENABLE:
11992            nodeMask = 1;
11993            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
11994            break;
11995        case eSYSTASK_CALL:
11996            nodeMask = 1;
11997            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
11998            break;
11999        case eTIMING_CALL:
12000            nodeMask = 1;
12001            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12002            break;
12003        case eFUNCTION_CALL:
12004            nodeMask = 5;
12005            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12006            if( !(a->Arg<CScope*>(2)==b->Arg<CScope*>(2)) ) { return FALSE; }
12007            break;
12008        case eARRAY:
12009            nodeMask = 0;
12010            break;
12011        case eNET_REF:
12012            nodeMask = 1;
12013            if( !(a->Arg<CNet*>(0)==b->Arg<CNet*>(0)) ) { return FALSE; }
12014            break;
12015        case eVAR_REF:
12016            nodeMask = 1;
12017            if( !(a->Arg<CVar*>(0)==b->Arg<CVar*>(0)) ) { return FALSE; }
12018            break;
12019        case ePARAM_REF:
12020            nodeMask = 1;
12021            if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
12022            break;
12023        case ePORT_REF:
12024            nodeMask = 1;
12025            if( !(a->Arg<CPortDir*>(0)==b->Arg<CPortDir*>(0)) ) { return FALSE; }
12026            break;
12027        case eFWD_REF:
12028            nodeMask = 1;
12029            if( !(a->Arg<CFref*>(0)==b->Arg<CFref*>(0)) ) { return FALSE; }
12030            break;
12031        case eGENVAR_REF:
12032            nodeMask = 1;
12033            if( !(a->Arg<CGenvar*>(0)==b->Arg<CGenvar*>(0)) ) { return FALSE; }
12034            break;
12035        case eENUM_REF:
12036            nodeMask = 1;
12037            MASSERT(FALSE); // arg0<CEnum*>
12038            break;
12039        case eTYPE_REF:
12040            nodeMask = 1;
12041            MASSERT(FALSE); // arg0<CTypedef*>
12042            break;
12043        case eNET_DECL:
12044            nodeMask = 1;
12045            if( !(a->Arg<CNet*>(0)==b->Arg<CNet*>(0)) ) { return FALSE; }
12046            break;
12047        case eVAR_DECL:
12048            nodeMask = 1;
12049            if( !(a->Arg<CVar*>(0)==b->Arg<CVar*>(0)) ) { return FALSE; }
12050            break;
12051        case ePARAM_DECL:
12052            nodeMask = 1;
12053            if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
12054            break;
12055        case eSPECPARAM_DECL:
12056            nodeMask = 1;
12057            if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
12058            break;
12059        case ePORT_DECL:
12060            nodeMask = 1;
12061            if( !(a->Arg<CPortDir*>(0)==b->Arg<CPortDir*>(0)) ) { return FALSE; }
12062            break;
12063        case eGENVAR_DECL:
12064            nodeMask = 1;
12065            if( !(a->Arg<CGenvar*>(0)==b->Arg<CGenvar*>(0)) ) { return FALSE; }
12066            break;
12067        case eTYPEDEF_DECL:
12068            nodeMask = 1;
12069            MASSERT(FALSE); // arg0<CTypedef*>
12070            break;
12071        case eLIST:
12072            nodeMask = 0;
12073            break;
12074        case eRANGE:
12075            nodeMask = 0;
12076            break;
12077        case eSLICE:
12078            nodeMask = 0;
12079            break;
12080        case ePSLICE:
12081            nodeMask = 0;
12082            break;
12083        case eMSLICE:
12084            nodeMask = 0;
12085            break;
12086        case eCVRI:
12087            nodeMask = 0;
12088            break;
12089        case eCVIR:
12090            nodeMask = 0;
12091            break;
12092        case eREP:
12093            nodeMask = 0;
12094            break;
12095        case eCAT:
12096            nodeMask = 0;
12097            break;
12098        case eUCAT:
12099            nodeMask = 0;
12100            break;
12101        case eCOM:
12102            nodeMask = 0;
12103            break;
12104        case eNEG:
12105            nodeMask = 0;
12106            break;
12107        case ePLUS:
12108            nodeMask = 0;
12109            break;
12110        case eNOT:
12111            nodeMask = 0;
12112            break;
12113        case eGT:
12114            nodeMask = 0;
12115            break;
12116        case eGE:
12117            nodeMask = 0;
12118            break;
12119        case eLT:
12120            nodeMask = 0;
12121            break;
12122        case eLE:
12123            nodeMask = 0;
12124            break;
12125        case eLAND:
12126            nodeMask = 0;
12127            break;
12128        case eLOR:
12129            nodeMask = 0;
12130            break;
12131        case eCEQ:
12132            nodeMask = 0;
12133            break;
12134        case eCNE:
12135            nodeMask = 0;
12136            break;
12137        case eEQ:
12138            nodeMask = 0;
12139            break;
12140        case eNE:
12141            nodeMask = 0;
12142            break;
12143        case eRAND:
12144            nodeMask = 0;
12145            break;
12146        case eRNAND:
12147            nodeMask = 0;
12148            break;
12149        case eROR:
12150            nodeMask = 0;
12151            break;
12152        case eRNOR:
12153            nodeMask = 0;
12154            break;
12155        case eRXOR:
12156            nodeMask = 0;
12157            break;
12158        case eRXNOR:
12159            nodeMask = 0;
12160            break;
12161        case eHOOK:
12162            nodeMask = 0;
12163            break;
12164        case eINIT:
12165            nodeMask = 0;
12166            break;
12167        case eALWAYS:
12168            nodeMask = 0;
12169            break;
12170        case eALWAYS_LATCH:
12171            nodeMask = 0;
12172            break;
12173        case eALWAYS_FF:
12174            nodeMask = 0;
12175            break;
12176        case eALWAYS_COMB:
12177            nodeMask = 0;
12178            break;
12179        case eEVENT:
12180            nodeMask = 0;
12181            break;
12182        case eBLOCK_REF:
12183            nodeMask = 1;
12184            if( !(a->Arg<CBlock*>(0)==b->Arg<CBlock*>(0)) ) { return FALSE; }
12185            break;
12186        case eSPECIFY_REF:
12187            nodeMask = 1;
12188            if( !(a->Arg<CSpecify*>(0)==b->Arg<CSpecify*>(0)) ) { return FALSE; }
12189            break;
12190        case eASSIGN:
12191            nodeMask = 0;
12192            break;
12193        case eADD_ASSIGN:
12194            nodeMask = 0;
12195            break;
12196        case eSUB_ASSIGN:
12197            nodeMask = 0;
12198            break;
12199        case eMUL_ASSIGN:
12200            nodeMask = 0;
12201            break;
12202        case eDIV_ASSIGN:
12203            nodeMask = 0;
12204            break;
12205        case eMOD_ASSIGN:
12206            nodeMask = 0;
12207            break;
12208        case eAND_ASSIGN:
12209            nodeMask = 0;
12210            break;
12211        case eOR_ASSIGN:
12212            nodeMask = 0;
12213            break;
12214        case eXOR_ASSIGN:
12215            nodeMask = 0;
12216            break;
12217        case eLSH_ASSIGN:
12218            nodeMask = 0;
12219            break;
12220        case eRSH_ASSIGN:
12221            nodeMask = 0;
12222            break;
12223        case eLSHA_ASSIGN:
12224            nodeMask = 0;
12225            break;
12226        case eRSHA_ASSIGN:
12227            nodeMask = 0;
12228            break;
12229        case eFORCE:
12230            nodeMask = 0;
12231            break;
12232        case eRELEASE:
12233            nodeMask = 0;
12234            break;
12235        case eNBASSIGN:
12236            nodeMask = 0;
12237            break;
12238        case ePOSEDGE:
12239            nodeMask = 0;
12240            break;
12241        case eNEGEDGE:
12242            nodeMask = 0;
12243            break;
12244        case eEDGE:
12245            nodeMask = 2;
12246            if( !(a->Arg<Edge_t>(1)==b->Arg<Edge_t>(1)) ) { return FALSE; }
12247            break;
12248        case eEVOR:
12249            nodeMask = 0;
12250            break;
12251        case eDELAY:
12252            nodeMask = 0;
12253            break;
12254        case eMTM:
12255            nodeMask = 0;
12256            break;
12257        case eIF:
12258            nodeMask = 0;
12259            break;
12260        case eFOREVER:
12261            nodeMask = 0;
12262            break;
12263        case eREPEAT:
12264            nodeMask = 0;
12265            break;
12266        case eWHILE:
12267            nodeMask = 0;
12268            break;
12269        case eWAIT:
12270            nodeMask = 0;
12271            break;
12272        case eFOR:
12273            nodeMask = 0;
12274            break;
12275        case eCASE:
12276            nodeMask = 0;
12277            break;
12278        case eCASEX:
12279            nodeMask = 0;
12280            break;
12281        case eCASEZ:
12282            nodeMask = 0;
12283            break;
12284        case eCASEITEM:
12285            nodeMask = 0;
12286            break;
12287        case eCASSIGN:
12288            nodeMask = 1;
12289            if( !(a->Arg<StrengthPair_t*>(0)==b->Arg<StrengthPair_t*>(0)) ) { return FALSE; }
12290            break;
12291        case eARG:
12292            nodeMask = 1;
12293            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12294            break;
12295        case eFUNCTION_DEF:
12296            nodeMask = 1;
12297            if( !(a->Arg<CFunction*>(0)==b->Arg<CFunction*>(0)) ) { return FALSE; }
12298            break;
12299        case eMODULE_DEF:
12300            nodeMask = 1;
12301            if( !(a->Arg<CModule*>(0)==b->Arg<CModule*>(0)) ) { return FALSE; }
12302            break;
12303        case eREPEAT_CONTROL:
12304            nodeMask = 0;
12305            break;
12306        case eDELAY_CONTROL:
12307            nodeMask = 0;
12308            break;
12309        case eEVENT_CONTROL:
12310            nodeMask = 0;
12311            break;
12312        case eEXTERNAL_REF:
12313            nodeMask = 1;
12314            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12315            break;
12316        case ePORT_DEF:
12317            nodeMask = 1;
12318            if( !(a->Arg<CPort*>(0)==b->Arg<CPort*>(0)) ) { return FALSE; }
12319            break;
12320        case eDEFPARAM:
12321            nodeMask = 0;
12322            break;
12323        case ePATH:
12324            nodeMask = 45;
12325            if( !(a->Arg<int>(0)==b->Arg<int>(0)) ) { return FALSE; }
12326            if( !(a->Arg<int>(2)==b->Arg<int>(2)) ) { return FALSE; }
12327            if( !(a->Arg<int>(3)==b->Arg<int>(3)) ) { return FALSE; }
12328            if( !(a->Arg<int>(5)==b->Arg<int>(5)) ) { return FALSE; }
12329            break;
12330        case ePATH_ASSIGN:
12331            nodeMask = 0;
12332            break;
12333        case eIFNONE_PATH_ASSIGN:
12334            nodeMask = 0;
12335            break;
12336        case eTRIGGER:
12337            nodeMask = 0;
12338            break;
12339        case ePASSIGN:
12340            nodeMask = 0;
12341            break;
12342        case eDEASSIGN:
12343            nodeMask = 0;
12344            break;
12345        case eDISABLE:
12346            nodeMask = 1;
12347            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12348            break;
12349        case eATTRIBUTE:
12350            nodeMask = 1;
12351            if( !(a->Arg<CAttr*>(0)==b->Arg<CAttr*>(0)) ) { return FALSE; }
12352            break;
12353        case eGIF:
12354            nodeMask = 0;
12355            break;
12356        case eGFOR:
12357            nodeMask = 0;
12358            break;
12359        case eGCASE:
12360            nodeMask = 0;
12361            break;
12362        case eTABLE:
12363            nodeMask = 0;
12364            break;
12365        case eTABLE_ENTRY:
12366            nodeMask = 0;
12367            break;
12368        case eTABLE_SYMBOL:
12369            nodeMask = 1;
12370            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
12371            break;
12372        case ePORTLIST_END:
12373            nodeMask = 0;
12374            break;
12375        case eMACRO_EXPR:
12376            nodeMask = 1;
12377            if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
12378            break;
12379        case eENUM_SPEC:
12380            nodeMask = 1;
12381            if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
12382            break;
12383        case eMEMBER:
12384            nodeMask = 2;
12385            if( !(a->Arg<CSymbol*>(1)==b->Arg<CSymbol*>(1)) ) { return FALSE; }
12386            break;
12387        case eRETURN:
12388            nodeMask = 0;
12389            break;
12390        case ePREINC:
12391            nodeMask = 0;
12392            break;
12393        case ePOSTINC:
12394            nodeMask = 0;
12395            break;
12396        case ePREDEC:
12397            nodeMask = 0;
12398            break;
12399        case ePOSTDEC:
12400            nodeMask = 0;
12401            break;
12402        case eCAST:
12403            nodeMask = 0;
12404            break;
12405     }
12406 
12407     for( int i = 0; i < a->ArgCount(); i++ ) {
12408         if( !((nodeMask>>i)&1) &&
12409             !Equivalent(a->Arg<CNode*>(i),b->Arg<CNode*>(i)) ) return FALSE;
12410     }
12411     return TRUE;
12412 }
12413 
12414 /*************************************************
12415         IsEvaluateable
12416         - returns true if expression can be evaluated
12417 **************************************************/
12418 
12419 int     CNode::IsEvaluateable()
12420 {
12421     switch( op ) {
12422     case eFUNCTION_CALL:
12423         return CFunction::Evaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;
12424     case ePARAM_REF:
12425         return Arg<CParam*>(0)->GetExpression()->IsEvaluateable();
12426     case eENUM_REF:
12427         return Arg<CParam*>(0)->GetExpression()->IsEvaluateable();
12428     case eMACRO_EXPR:
12429         return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsEvaluateable() : FALSE;
12430     case eVCONSTANT:
12431     case eRCONSTANT:
12432         return TRUE;
12433     case eWIDTH:
12434     case eSUB:
12435     case eMUL:
12436     case eDIV:
12437     case ePOW:
12438     case eADD:
12439     case eLSH:
12440     case eRSH:
12441     case eLSHA:
12442     case eRSHA:
12443     case eMOD:
12444     case eOR:
12445     case eAND:
12446     case eXOR:
12447     case eXNOR:
12448     case eCVRI:
12449     case eCVIR:
12450     case eREP:
12451     case eCAT:
12452     case eUCAT:
12453     case eCOM:
12454     case eNEG:
12455     case ePLUS:
12456     case eNOT:
12457     case eGT:
12458     case eGE:
12459     case eLT:
12460     case eLE:
12461     case eLAND:
12462     case eLOR:
12463     case eCEQ:
12464     case eCNE:
12465     case eEQ:
12466     case eNE:
12467     case eRAND:
12468     case eRNAND:
12469     case eROR:
12470     case eRNOR:
12471     case eRXOR:
12472     case eRXNOR:
12473     case eHOOK:
12474         break;
12475     case eERROR:
12476     case eCOMMENT:
12477     case eVRQ:
12478     case ePRAGMA:
12479     case eELIST:
12480     case eNOP:
12481     case eANDANDAND:
12482     case eINSTANCE_REF:
12483     case eGATE_REF:
12484     case eTASK_ENABLE:
12485     case eSYSTASK_CALL:
12486     case eTIMING_CALL:
12487     case eARRAY:
12488     case eNET_REF:
12489     case eVAR_REF:
12490     case ePORT_REF:
12491     case eFWD_REF:
12492     case eGENVAR_REF:
12493     case eTYPE_REF:
12494     case eNET_DECL:
12495     case eVAR_DECL:
12496     case ePARAM_DECL:
12497     case eSPECPARAM_DECL:
12498     case ePORT_DECL:
12499     case eGENVAR_DECL:
12500     case eTYPEDEF_DECL:
12501     case eLIST:
12502     case eRANGE:
12503     case eSLICE:
12504     case ePSLICE:
12505     case eMSLICE:
12506     case eINIT:
12507     case eALWAYS:
12508     case eALWAYS_LATCH:
12509     case eALWAYS_FF:
12510     case eALWAYS_COMB:
12511     case eEVENT:
12512     case eBLOCK_REF:
12513     case eSPECIFY_REF:
12514     case eASSIGN:
12515     case eADD_ASSIGN:
12516     case eSUB_ASSIGN:
12517     case eMUL_ASSIGN:
12518     case eDIV_ASSIGN:
12519     case eMOD_ASSIGN:
12520     case eAND_ASSIGN:
12521     case eOR_ASSIGN:
12522     case eXOR_ASSIGN:
12523     case eLSH_ASSIGN:
12524     case eRSH_ASSIGN:
12525     case eLSHA_ASSIGN:
12526     case eRSHA_ASSIGN:
12527     case eFORCE:
12528     case eRELEASE:
12529     case eNBASSIGN:
12530     case ePOSEDGE:
12531     case eNEGEDGE:
12532     case eEDGE:
12533     case eEVOR:
12534     case eDELAY:
12535     case eMTM:
12536     case eIF:
12537     case eFOREVER:
12538     case eREPEAT:
12539     case eWHILE:
12540     case eWAIT:
12541     case eFOR:
12542     case eCASE:
12543     case eCASEX:
12544     case eCASEZ:
12545     case eCASEITEM:
12546     case eCASSIGN:
12547     case eARG:
12548     case eFUNCTION_DEF:
12549     case eMODULE_DEF:
12550     case eREPEAT_CONTROL:
12551     case eDELAY_CONTROL:
12552     case eEVENT_CONTROL:
12553     case eEXTERNAL_REF:
12554     case ePORT_DEF:
12555     case eDEFPARAM:
12556     case ePATH:
12557     case ePATH_ASSIGN:
12558     case eIFNONE_PATH_ASSIGN:
12559     case eTRIGGER:
12560     case ePASSIGN:
12561     case eDEASSIGN:
12562     case eDISABLE:
12563     case eATTRIBUTE:
12564     case eGIF:
12565     case eGFOR:
12566     case eGCASE:
12567     case eTABLE:
12568     case eTABLE_ENTRY:
12569     case eTABLE_SYMBOL:
12570     case ePORTLIST_END:
12571     case eENUM_SPEC:
12572     case eMEMBER:
12573     case eRETURN:
12574     case ePREINC:
12575     case ePOSTINC:
12576     case ePREDEC:
12577     case ePOSTDEC:
12578     case eCAST:
12579         return FALSE;
12580     default:
12581         MASSERT( FALSE );
12582     }
12583 
12584     for( int i = 0; i < ArgCount(); i++ ) {
12585         if( !Arg<CNode*>(i)->IsEvaluateable() ) return FALSE;
12586     }
12587 
12588     return TRUE;
12589 }       
12590 
12591 /*************************************************
12592         _EvalVector
12593         - Helper function for EvalVector.
12594           Evaluates constant vector expression tree.
12595           Requires tree nodes to be labeled and 
12596           augmented with conversion nodes.
12597 **************************************************/
12598 
12599 
12600 void    CNode::_EvalVector( CVector& v )
12601 {
12602     switch( op ) {
12603     case eVCONSTANT:
12604         { int width = v.GetWidth(); v.SetWidth(Arg<CVector*>(0)->GetWidth()); v = *Arg<CVector*>(0); v.SetWidth(width); };    
12605         break;
12606     case eWIDTH:
12607         {CVector vi(Arg<CNode*>(1)->width); vi.Signed(Arg<CNode*>(1)->type==eS);v.Signed(type==eS); Arg<CNode*>(1)->_EvalVector(vi); vi.SetWidth(width);vi.Signed(type==eS); v = vi;};    
12608         break;
12609     case eSUB:
12610         EVAL_VECTOR_BINARY(Sub);    
12611         break;
12612     case eMUL:
12613         EVAL_VECTOR_BINARY(Mul);    
12614         break;
12615     case eDIV:
12616         EVAL_VECTOR_BINARY(Div);    
12617         break;
12618     case ePOW:
12619         EVAL_VECTOR_BINARY(Pow);    
12620         break;
12621     case eADD:
12622         EVAL_VECTOR_BINARY(Add);    
12623         break;
12624     case eLSH:
12625         EVAL_VECTOR_BINARY_SELF_RIGHT(Lsh);    
12626         break;
12627     case eRSH:
12628         EVAL_VECTOR_BINARY_SELF_RIGHT(Rsh);    
12629         break;
12630     case eLSHA:
12631         EVAL_VECTOR_BINARY_SELF_RIGHT(Lsha);    
12632         break;
12633     case eRSHA:
12634         EVAL_VECTOR_BINARY_SELF_RIGHT(Rsha);    
12635         break;
12636     case eMOD:
12637         EVAL_VECTOR_BINARY(Mod);    
12638         break;
12639     case eOR:
12640         EVAL_VECTOR_BINARY(Or);    
12641         break;
12642     case eAND:
12643         EVAL_VECTOR_BINARY(And);    
12644         break;
12645     case eXOR:
12646         EVAL_VECTOR_BINARY(Xor);    
12647         break;
12648     case eXNOR:
12649         EVAL_VECTOR_BINARY(Xnor);    
12650         break;
12651     case eFUNCTION_CALL:
12652         CFunction::EvalVector(v,Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;    
12653         break;
12654     case ePARAM_REF:
12655         EVAL_VECTOR_PARAM_REF();    
12656         break;
12657     case eENUM_REF:
12658         EVAL_VECTOR_ENUM_REF();    
12659         break;
12660     case eCVRI:
12661         v.LoadReal( Arg<CNode*>(0)->_EvalReal() );    
12662         break;
12663     case eREP:
12664         EVAL_VECTOR_BINARY(Rep);    
12665         break;
12666     case eCAT:
12667         EVAL_VECTOR_BINARY(Cat);    
12668         break;
12669     case eUCAT:
12670         { CVector vv(Arg<CNode*>(0)->width); Arg<CNode*>(0)->_EvalVector(vv); v = vv;};    
12671         break;
12672     case eCOM:
12673         EVAL_VECTOR_UNARY(Com);    
12674         break;
12675     case eNEG:
12676         EVAL_VECTOR_UNARY(Neg);    
12677         break;
12678     case ePLUS:
12679         EVAL_VECTOR_UNARY(Plus);    
12680         break;
12681     case eNOT:
12682         EVAL_VECTOR_UNARY(Not);    
12683         break;
12684     case eGT:
12685         EVAL_RELATIONAL(Gt);    
12686         break;
12687     case eGE:
12688         EVAL_RELATIONAL(Ge);    
12689         break;
12690     case eLT:
12691         EVAL_RELATIONAL(Lt);    
12692         break;
12693     case eLE:
12694         EVAL_RELATIONAL(Le);    
12695         break;
12696     case eLAND:
12697         EVAL_VECTOR_BINARY(Land);    
12698         break;
12699     case eLOR:
12700         EVAL_VECTOR_BINARY(Lor);    
12701         break;
12702     case eCEQ:
12703         EVAL_RELATIONAL(Ceq);    
12704         break;
12705     case eCNE:
12706         EVAL_RELATIONAL(Cne);    
12707         break;
12708     case eEQ:
12709         EVAL_RELATIONAL(Eq);    
12710         break;
12711     case eNE:
12712         EVAL_RELATIONAL(Ne);    
12713         break;
12714     case eRAND:
12715         EVAL_VECTOR_UNARY_SELF(Rand);    
12716         break;
12717     case eRNAND:
12718         EVAL_VECTOR_UNARY_SELF(Rnand);    
12719         break;
12720     case eROR:
12721         EVAL_VECTOR_UNARY_SELF(Ror);    
12722         break;
12723     case eRNOR:
12724         EVAL_VECTOR_UNARY_SELF(Rnor);    
12725         break;
12726     case eRXOR:
12727         EVAL_VECTOR_UNARY_SELF(Rxor);    
12728         break;
12729     case eRXNOR:
12730         EVAL_VECTOR_UNARY_SELF(Rxnor);    
12731         break;
12732     case eHOOK:
12733         EVAL_VECTOR_HOOK();    
12734         break;
12735     case eMACRO_EXPR:
12736         Arg<CNode*>(1)->EvalVector(v);    
12737         break;
12738     default:
12739         MASSERT( FALSE );
12740     }
12741 }
12742 
12743 
12744 /*************************************************
12745         _EvalReal
12746         - Helper function for EvalReal.
12747           Evaluates constant real expression tree.
12748           Requires tree nodes to be labeled and 
12749           augmented with conversion nodes.
12750 **************************************************/
12751 
12752 double  CNode::_EvalReal()
12753 {
12754     double d;
12755     switch( op ) {
12756     case eRCONSTANT:
12757         d = s2d(Arg<char*>(0));    
12758         break;
12759     case eSUB:
12760         EVAL_REAL_BINARY(Sub);    
12761         break;
12762     case eMUL:
12763         EVAL_REAL_BINARY(Mul);    
12764         break;
12765     case eDIV:
12766         EVAL_REAL_BINARY(Div);    
12767         break;
12768     case ePOW:
12769         EVAL_REAL_BINARY(Pow);    
12770         break;
12771     case eADD:
12772         EVAL_REAL_BINARY(Add);    
12773         break;
12774     case eFUNCTION_CALL:
12775         d = CFunction::EvalReal(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;    
12776         break;
12777     case ePARAM_REF:
12778         EVAL_REAL_PARAM_REF();    
12779         break;
12780     case eENUM_REF:
12781         EVAL_REAL_ENUM_REF();    
12782         break;
12783     case eCVIR:
12784          { CVector v(Arg<CNode*>(0)->width); v.Signed(Arg<CNode*>(0)->type == eS); Arg<CNode*>(0)->_EvalVector(v); d = v.GetReal(); };    
12785         break;
12786     case eNEG:
12787         EVAL_REAL_UNARY(Neg);    
12788         break;
12789     case ePLUS:
12790         EVAL_REAL_UNARY(Plus);    
12791         break;
12792     case eHOOK:
12793         EVAL_REAL_HOOK();    
12794         break;
12795     case eMACRO_EXPR:
12796         d = Arg<CNode*>(1)->EvalReal();    
12797         break;
12798     default:
12799         MASSERT( FALSE );
12800     }
12801     return d;
12802 }
12803 /************************************************
12804         ConditionalWiden
12805         - return non-zero if op conditionally
12806           widens operands
12807 **************************************************/
12808 int CNode::ConditionalWiden()
12809 {
12810     switch( GetOp() ) {
12811        case eVCONSTANT:
12812            return 0;
12813        case eRCONSTANT:
12814            return 0;
12815        case eELIST:
12816            return 0;
12817        case eWIDTH:
12818            return 0;
12819        case eSUB:
12820            return 0;
12821        case eMUL:
12822            return 0;
12823        case eDIV:
12824            return 0;
12825        case ePOW:
12826            return 0;
12827        case eADD:
12828            return 0;
12829        case eLSH:
12830            return 0;
12831        case eRSH:
12832            return 0;
12833        case eLSHA:
12834            return 0;
12835        case eRSHA:
12836            return 0;
12837        case eMOD:
12838            return 0;
12839        case eOR:
12840            return 1;
12841        case eAND:
12842            return 1;
12843        case eANDANDAND:
12844            return 0;
12845        case eXOR:
12846            return 1;
12847        case eXNOR:
12848            return 1;
12849        case eSYSTASK_CALL:
12850            return 0;
12851        case eFUNCTION_CALL:
12852            return 0;
12853        case eARRAY:
12854            return 0;
12855        case eNET_REF:
12856            return 0;
12857        case eVAR_REF:
12858            return 0;
12859        case ePARAM_REF:
12860            return 0;
12861        case ePORT_REF:
12862            return 0;
12863        case eFWD_REF:
12864            return 0;
12865        case eGENVAR_REF:
12866            return 0;
12867        case eENUM_REF:
12868            return 0;
12869        case eTYPE_REF:
12870            return 0;
12871        case eRANGE:
12872            return 0;
12873        case eSLICE:
12874            return 0;
12875        case ePSLICE:
12876            return 0;
12877        case eMSLICE:
12878            return 0;
12879        case eCVRI:
12880            return 0;
12881        case eCVIR:
12882            return 0;
12883        case eREP:
12884            return 0;
12885        case eCAT:
12886            return 0;
12887        case eUCAT:
12888            return 0;
12889        case eCOM:
12890            return 0;
12891        case eNEG:
12892            return 0;
12893        case ePLUS:
12894            return 0;
12895        case eNOT:
12896            return 0;
12897        case eGT:
12898            return 0;
12899        case eGE:
12900            return 0;
12901        case eLT:
12902            return 0;
12903        case eLE:
12904            return 0;
12905        case eLAND:
12906            return 0;
12907        case eLOR:
12908            return 0;
12909        case eCEQ:
12910            return 0;
12911        case eCNE:
12912            return 0;
12913        case eEQ:
12914            return 0;
12915        case eNE:
12916            return 0;
12917        case eRAND:
12918            return 0;
12919        case eRNAND:
12920            return 0;
12921        case eROR:
12922            return 0;
12923        case eRNOR:
12924            return 0;
12925        case eRXOR:
12926            return 0;
12927        case eRXNOR:
12928            return 0;
12929        case eHOOK:
12930            return 0;
12931        case ePOSEDGE:
12932            return 0;
12933        case eNEGEDGE:
12934            return 0;
12935        case eEVOR:
12936            return 0;
12937        case eMTM:
12938            return 0;
12939        case eEXTERNAL_REF:
12940            return 0;
12941        case eATTRIBUTE:
12942            return 0;
12943        case eMACRO_EXPR:
12944            return 0;
12945        case eMEMBER:
12946            return 0;
12947        case ePREINC:
12948            return 0;
12949        case ePOSTINC:
12950            return 0;
12951        case ePREDEC:
12952            return 0;
12953        case ePOSTDEC:
12954            return 0;
12955        case eCAST:
12956            return 0;
12957     default:
12958         MASSERT( FALSE );
12959     }
12960     return 0;
12961 }
12962 
12963 /************************************************
12964         NodeMask
12965         - return a bit vector with 1's where the
12966           type is CNode*
12967 **************************************************/
12968 unsigned CNode::NodeMask()
12969 {
12970     switch( GetOp() ) {
12971        case eERROR:
12972            return 0;
12973        case eVCONSTANT:
12974            return 0;
12975        case eRCONSTANT:
12976            return 0;
12977        case eCOMMENT:
12978            return 0;
12979        case eVRQ:
12980            return 0;
12981        case ePRAGMA:
12982            return 0;
12983        case eELIST:
12984            return 3;
12985        case eWIDTH:
12986            return 3;
12987        case eNOP:
12988            return 0;
12989        case eSUB:
12990            return 3;
12991        case eMUL:
12992            return 3;
12993        case eDIV:
12994            return 3;
12995        case ePOW:
12996            return 3;
12997        case eADD:
12998            return 3;
12999        case eLSH:
13000            return 3;
13001        case eRSH:
13002            return 3;
13003        case eLSHA:
13004            return 3;
13005        case eRSHA:
13006            return 3;
13007        case eMOD:
13008            return 3;
13009        case eOR:
13010            return 3;
13011        case eAND:
13012            return 3;
13013        case eANDANDAND:
13014            return 3;
13015        case eXOR:
13016            return 3;
13017        case eXNOR:
13018            return 3;
13019        case eINSTANCE_REF:
13020            return 0;
13021        case eGATE_REF:
13022            return 0;
13023        case eTASK_ENABLE:
13024            return 2;
13025        case eSYSTASK_CALL:
13026            return 2;
13027        case eTIMING_CALL:
13028            return 2;
13029        case eFUNCTION_CALL:
13030            return 2;
13031        case eARRAY:
13032            return 3;
13033        case eNET_REF:
13034            return 0;
13035        case eVAR_REF:
13036            return 0;
13037        case ePARAM_REF:
13038            return 0;
13039        case ePORT_REF:
13040            return 0;
13041        case eFWD_REF:
13042            return 0;
13043        case eGENVAR_REF:
13044            return 0;
13045        case eENUM_REF:
13046            return 0;
13047        case eTYPE_REF:
13048            return 0;
13049        case eNET_DECL:
13050            return 2;
13051        case eVAR_DECL:
13052            return 2;
13053        case ePARAM_DECL:
13054            return 0;
13055        case eSPECPARAM_DECL:
13056            return 0;
13057        case ePORT_DECL:
13058            return 0;
13059        case eGENVAR_DECL:
13060            return 0;
13061        case eTYPEDEF_DECL:
13062            return 0;
13063        case eLIST:
13064            return 3;
13065        case eRANGE:
13066            return 3;
13067        case eSLICE:
13068            return 3;
13069        case ePSLICE:
13070            return 3;
13071        case eMSLICE:
13072            return 3;
13073        case eCVRI:
13074            return 1;
13075        case eCVIR:
13076            return 1;
13077        case eREP:
13078            return 3;
13079        case eCAT:
13080            return 3;
13081        case eUCAT:
13082            return 1;
13083        case eCOM:
13084            return 1;
13085        case eNEG:
13086            return 1;
13087        case ePLUS:
13088            return 1;
13089        case eNOT:
13090            return 1;
13091        case eGT:
13092            return 3;
13093        case eGE:
13094            return 3;
13095        case eLT:
13096            return 3;
13097        case eLE:
13098            return 3;
13099        case eLAND:
13100            return 3;
13101        case eLOR:
13102            return 3;
13103        case eCEQ:
13104            return 3;
13105        case eCNE:
13106            return 3;
13107        case eEQ:
13108            return 3;
13109        case eNE:
13110            return 3;
13111        case eRAND:
13112            return 1;
13113        case eRNAND:
13114            return 1;
13115        case eROR:
13116            return 1;
13117        case eRNOR:
13118            return 1;
13119        case eRXOR:
13120            return 1;
13121        case eRXNOR:
13122            return 1;
13123        case eHOOK:
13124            return 7;
13125        case eINIT:
13126            return 1;
13127        case eALWAYS:
13128            return 1;
13129        case eALWAYS_LATCH:
13130            return 1;
13131        case eALWAYS_FF:
13132            return 1;
13133        case eALWAYS_COMB:
13134            return 1;
13135        case eEVENT:
13136            return 3;
13137        case eBLOCK_REF:
13138            return 2;
13139        case eSPECIFY_REF:
13140            return 2;
13141        case eASSIGN:
13142            return 7;
13143        case eADD_ASSIGN:
13144            return 7;
13145        case eSUB_ASSIGN:
13146            return 7;
13147        case eMUL_ASSIGN:
13148            return 7;
13149        case eDIV_ASSIGN:
13150            return 7;
13151        case eMOD_ASSIGN:
13152            return 7;
13153        case eAND_ASSIGN:
13154            return 7;
13155        case eOR_ASSIGN:
13156            return 7;
13157        case eXOR_ASSIGN:
13158            return 7;
13159        case eLSH_ASSIGN:
13160            return 7;
13161        case eRSH_ASSIGN:
13162            return 7;
13163        case eLSHA_ASSIGN:
13164            return 7;
13165        case eRSHA_ASSIGN:
13166            return 7;
13167        case eFORCE:
13168            return 3;
13169        case eRELEASE:
13170            return 1;
13171        case eNBASSIGN:
13172            return 7;
13173        case ePOSEDGE:
13174            return 1;
13175        case eNEGEDGE:
13176            return 1;
13177        case eEDGE:
13178            return 1;
13179        case eEVOR:
13180            return 3;
13181        case eDELAY:
13182            return 3;
13183        case eMTM:
13184            return 7;
13185        case eIF:
13186            return 7;
13187        case eFOREVER:
13188            return 1;
13189        case eREPEAT:
13190            return 3;
13191        case eWHILE:
13192            return 3;
13193        case eWAIT:
13194            return 3;
13195        case eFOR:
13196            return 15;
13197        case eCASE:
13198            return 3;
13199        case eCASEX:
13200            return 3;
13201        case eCASEZ:
13202            return 3;
13203        case eCASEITEM:
13204            return 3;
13205        case eCASSIGN:
13206            return 14;
13207        case eARG:
13208            return 2;
13209        case eFUNCTION_DEF:
13210            return 0;
13211        case eMODULE_DEF:
13212            return 0;
13213        case eREPEAT_CONTROL:
13214            return 3;
13215        case eDELAY_CONTROL:
13216            return 1;
13217        case eEVENT_CONTROL:
13218            return 1;
13219        case eEXTERNAL_REF:
13220            return 0;
13221        case ePORT_DEF:
13222            return 0;
13223        case eDEFPARAM:
13224            return 3;
13225        case ePATH:
13226            return 82;
13227        case ePATH_ASSIGN:
13228            return 7;
13229        case eIFNONE_PATH_ASSIGN:
13230            return 3;
13231        case eTRIGGER:
13232            return 1;
13233        case ePASSIGN:
13234            return 3;
13235        case eDEASSIGN:
13236            return 1;
13237        case eDISABLE:
13238            return 0;
13239        case eATTRIBUTE:
13240            return 0;
13241        case eGIF:
13242            return 7;
13243        case eGFOR:
13244            return 15;
13245        case eGCASE:
13246            return 3;
13247        case eTABLE:
13248            return 1;
13249        case eTABLE_ENTRY:
13250            return 1;
13251        case eTABLE_SYMBOL:
13252            return 0;
13253        case ePORTLIST_END:
13254            return 0;
13255        case eMACRO_EXPR:
13256            return 2;
13257        case eENUM_SPEC:
13258            return 6;
13259        case eMEMBER:
13260            return 1;
13261        case eRETURN:
13262            return 1;
13263        case ePREINC:
13264            return 1;
13265        case ePOSTINC:
13266            return 1;
13267        case ePREDEC:
13268            return 1;
13269        case ePOSTDEC:
13270            return 1;
13271        case eCAST:
13272            return 3;
13273     default:
13274         MASSERT( FALSE );
13275     }
13276     return 0;
13277 }
13278 
13279 /************************************************
13280         WidthFixed      
13281         - return non-zero if op has fixed 
13282           self determined width 
13283 **************************************************/
13284 int CNode::WidthFixed()
13285 {
13286     switch( GetOp() ) {
13287        case eVCONSTANT:
13288         return NodeMask()==0;
13289        case eRCONSTANT:
13290         return 1;
13291        case eELIST:
13292         return NodeMask()==0;
13293        case eWIDTH:
13294         return NodeMask()==0;
13295        case eSUB:
13296         return NodeMask()==0;
13297        case eMUL:
13298         return NodeMask()==0;
13299        case eDIV:
13300         return NodeMask()==0;
13301        case ePOW:
13302         return NodeMask()==0;
13303        case eADD:
13304         return NodeMask()==0;
13305        case eLSH:
13306         return NodeMask()==0;
13307        case eRSH:
13308         return NodeMask()==0;
13309        case eLSHA:
13310         return NodeMask()==0;
13311        case eRSHA:
13312         return NodeMask()==0;
13313        case eMOD:
13314         return NodeMask()==0;
13315        case eOR:
13316         return NodeMask()==0;
13317        case eAND:
13318         return NodeMask()==0;
13319        case eANDANDAND:
13320         return NodeMask()==0;
13321        case eXOR:
13322         return NodeMask()==0;
13323        case eXNOR:
13324         return NodeMask()==0;
13325        case eSYSTASK_CALL:
13326         return NodeMask()==0;
13327        case eFUNCTION_CALL:
13328         return NodeMask()==0;
13329        case eARRAY:
13330         return NodeMask()==0;
13331        case eNET_REF:
13332         return NodeMask()==0;
13333        case eVAR_REF:
13334         return NodeMask()==0;
13335        case ePARAM_REF:
13336         return NodeMask()==0;
13337        case ePORT_REF:
13338         return NodeMask()==0;
13339        case eFWD_REF:
13340         return NodeMask()==0;
13341        case eGENVAR_REF:
13342         return NodeMask()==0;
13343        case eENUM_REF:
13344         return NodeMask()==0;
13345        case eTYPE_REF:
13346         return 1;
13347        case eRANGE:
13348         return NodeMask()==0;
13349        case eSLICE:
13350         return NodeMask()==0;
13351        case ePSLICE:
13352         return NodeMask()==0;
13353        case eMSLICE:
13354         return NodeMask()==0;
13355        case eCVRI:
13356         return 1;
13357        case eCVIR:
13358         return 1;
13359        case eREP:
13360         return NodeMask()==0;
13361        case eCAT:
13362         return NodeMask()==0;
13363        case eUCAT:
13364         return NodeMask()==0;
13365        case eCOM:
13366         return NodeMask()==0;
13367        case eNEG:
13368         return NodeMask()==0;
13369        case ePLUS:
13370         return NodeMask()==0;
13371        case eNOT:
13372         return 1;
13373        case eGT:
13374         return 1;
13375        case eGE:
13376         return 1;
13377        case eLT:
13378         return 1;
13379        case eLE:
13380         return 1;
13381        case eLAND:
13382         return 1;
13383        case eLOR:
13384         return 1;
13385        case eCEQ:
13386         return 1;
13387        case eCNE:
13388         return 1;
13389        case eEQ:
13390         return 1;
13391        case eNE:
13392         return 1;
13393        case eRAND:
13394         return 1;
13395        case eRNAND:
13396         return 1;
13397        case eROR:
13398         return 1;
13399        case eRNOR:
13400         return 1;
13401        case eRXOR:
13402         return 1;
13403        case eRXNOR:
13404         return 1;
13405        case eHOOK:
13406         return NodeMask()==0;
13407        case ePOSEDGE:
13408         return NodeMask()==0;
13409        case eNEGEDGE:
13410         return NodeMask()==0;
13411        case eEVOR:
13412         return NodeMask()==0;
13413        case eMTM:
13414         return NodeMask()==0;
13415        case eEXTERNAL_REF:
13416         return NodeMask()==0;
13417        case eATTRIBUTE:
13418         return 1;
13419        case eMACRO_EXPR:
13420         return NodeMask()==0;
13421        case eMEMBER:
13422         return NodeMask()==0;
13423        case ePREINC:
13424         return NodeMask()==0;
13425        case ePOSTINC:
13426         return NodeMask()==0;
13427        case ePREDEC:
13428         return NodeMask()==0;
13429        case ePOSTDEC:
13430         return NodeMask()==0;
13431        case eCAST:
13432         return NodeMask()==0;
13433     default:
13434         MASSERT( FALSE );
13435     }
13436     return 0;
13437 }
13438 
13439 /************************************************
13440         _LabelBits
13441         - labels type and width fields bottom up
13442 **************************************************/
13443 struct LabelBitsInfo {
13444     int suppressErrorMessages;
13445     int error;
13446 };
13447 
13448 void CNode::_LabelBits( CNode* n, void* arg )
13449 {
13450     /*
13451      * If label caching is enabled, don't remark nodes
13452      * already visited. Also disable caching when the 
13453      * the eval stack is in use and the node was allocated from
13454      * it as its pointers are temporary and will be recycled.
13455      */
13456     if( labelCacheEnabled && (evalCount == 0 || !evalHeap.IsOwner(n)) ) {
13457         if( labelCache.find(n) != labelCache.end() ) {
13458             return;
13459         }
13460         labelCache[n] = 1;
13461     }
13462 
13463 
13464     LabelBitsInfo* info = (LabelBitsInfo*)arg;
13465     int suppressErrorMessages = info->suppressErrorMessages;
13466     unsigned nodeMask = n->NodeMask();
13467     int conditionalWiden = n->ConditionalWiden();
13468 
13469     switch( n->GetOp() ) {
13470        case eVCONSTANT:
13471            n->type = n->Arg<CVector*>(0)->GetNodeType();
13472            break;
13473        case eRCONSTANT:
13474            if(1) {
13475                n->type = eR;
13476            }
13477            break;
13478        case eELIST:
13479            if( n->Arg<CNode*>(0)->type == eR  ) {
13480                info->error = 1;
13481                if( !suppressErrorMessages ) {
13482                    error(n->GetCoord(), "Illegal expression operand" );
13483                }
13484            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13485                info->error = 1;
13486                if( !suppressErrorMessages ) {
13487                    error(n->GetCoord(), "Illegal expression operand" );
13488                }
13489            } else if(1) {
13490                n->type = eB;
13491            }
13492            break;
13493        case eWIDTH:
13494            if( n->Arg<CNode*>(1)->type == eS  ) {
13495                n->type = eS;
13496            } else if(1) {
13497                n->type = eB;
13498            }
13499            break;
13500        case eSUB:
13501            if( n->Arg<CNode*>(0)->type == eR  ) {
13502                n->type = eR;
13503            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13504                n->type = eR;
13505            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13506                n->type = eS;
13507            } else if(1) {
13508                n->type = eB;
13509            }
13510            break;
13511        case eMUL:
13512            if( n->Arg<CNode*>(0)->type == eR  ) {
13513                n->type = eR;
13514            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13515                n->type = eR;
13516            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13517                n->type = eS;
13518            } else if(1) {
13519                n->type = eB;
13520            }
13521            break;
13522        case eDIV:
13523            if( n->Arg<CNode*>(0)->type == eR  ) {
13524                n->type = eR;
13525            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13526                n->type = eR;
13527            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13528                n->type = eS;
13529            } else if(1) {
13530                n->type = eB;
13531            }
13532            break;
13533        case ePOW:
13534            if( n->Arg<CNode*>(0)->type == eR  ) {
13535                n->type = eR;
13536            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13537                n->type = eR;
13538            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13539                n->type = eS;
13540            } else if(1) {
13541                n->type = eB;
13542            }
13543            break;
13544        case eADD:
13545            if( n->Arg<CNode*>(0)->type == eR  ) {
13546                n->type = eR;
13547            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13548                n->type = eR;
13549            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13550                n->type = eS;
13551            } else if(1) {
13552                n->type = eB;
13553            }
13554            break;
13555        case eLSH:
13556            if( n->Arg<CNode*>(0)->type == eS  ) {
13557                n->type = eS;
13558            } else if(1) {
13559                n->type = eB;
13560            }
13561            break;
13562        case eRSH:
13563            if( n->Arg<CNode*>(0)->type == eS  ) {
13564                n->type = eS;
13565            } else if(1) {
13566                n->type = eB;
13567            }
13568            break;
13569        case eLSHA:
13570            if( n->Arg<CNode*>(0)->type == eS  ) {
13571                n->type = eS;
13572            } else if(1) {
13573                n->type = eB;
13574            }
13575            break;
13576        case eRSHA:
13577            if( n->Arg<CNode*>(0)->type == eS  ) {
13578                n->type = eS;
13579            } else if(1) {
13580                n->type = eB;
13581            }
13582            break;
13583        case eMOD:
13584            if( n->Arg<CNode*>(0)->type == eR  ) {
13585                info->error = 1;
13586                if( !suppressErrorMessages ) {
13587                    error(n->GetCoord(), "Illegal expression operand" );
13588                }
13589            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13590                info->error = 1;
13591                if( !suppressErrorMessages ) {
13592                    error(n->GetCoord(), "Illegal expression operand" );
13593                }
13594            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13595                n->type = eS;
13596            } else if(1) {
13597                n->type = eB;
13598            }
13599            break;
13600        case eOR:
13601            if( n->Arg<CNode*>(0)->type == eR  ) {
13602                info->error = 1;
13603                if( !suppressErrorMessages ) {
13604                    error(n->GetCoord(), "Illegal expression operand" );
13605                }
13606            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13607                info->error = 1;
13608                if( !suppressErrorMessages ) {
13609                    error(n->GetCoord(), "Illegal expression operand" );
13610                }
13611            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13612                n->type = eS;
13613            } else if(1) {
13614                n->type = eB;
13615            }
13616            break;
13617        case eAND:
13618            if( n->Arg<CNode*>(0)->type == eR  ) {
13619                info->error = 1;
13620                if( !suppressErrorMessages ) {
13621                    error(n->GetCoord(), "Illegal expression operand" );
13622                }
13623            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13624                info->error = 1;
13625                if( !suppressErrorMessages ) {
13626                    error(n->GetCoord(), "Illegal expression operand" );
13627                }
13628            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13629                n->type = eS;
13630            } else if(1) {
13631                n->type = eB;
13632            }
13633            break;
13634        case eANDANDAND:
13635            if( n->Arg<CNode*>(0)->type == eR  ) {
13636                info->error = 1;
13637                if( !suppressErrorMessages ) {
13638                    error(n->GetCoord(), "Illegal expression operand" );
13639                }
13640            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13641                info->error = 1;
13642                if( !suppressErrorMessages ) {
13643                    error(n->GetCoord(), "Illegal expression operand" );
13644                }
13645            } else if(1) {
13646                n->type = eB;
13647            }
13648            break;
13649        case eXOR:
13650            if( n->Arg<CNode*>(0)->type == eR  ) {
13651                info->error = 1;
13652                if( !suppressErrorMessages ) {
13653                    error(n->GetCoord(), "Illegal expression operand" );
13654                }
13655            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13656                info->error = 1;
13657                if( !suppressErrorMessages ) {
13658                    error(n->GetCoord(), "Illegal expression operand" );
13659                }
13660            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13661                n->type = eS;
13662            } else if(1) {
13663                n->type = eB;
13664            }
13665            break;
13666        case eXNOR:
13667            if( n->Arg<CNode*>(0)->type == eR  ) {
13668                info->error = 1;
13669                if( !suppressErrorMessages ) {
13670                    error(n->GetCoord(), "Illegal expression operand" );
13671                }
13672            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13673                info->error = 1;
13674                if( !suppressErrorMessages ) {
13675                    error(n->GetCoord(), "Illegal expression operand" );
13676                }
13677            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  ) {
13678                n->type = eS;
13679            } else if(1) {
13680                n->type = eB;
13681            }
13682            break;
13683        case eSYSTASK_CALL:
13684             n->type = Systask::Type(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1));
13685            break;
13686        case eFUNCTION_CALL:
13687             n->type = CFunction::Type(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1),n->Arg<CScope*>(2));
13688            break;
13689        case eARRAY:
13690             n->type = Array::Type(n->Arg<CNode*>(0),n->Arg<CNode*>(1));
13691            break;
13692        case eNET_REF:
13693            n->type = n->Arg<CNet*>(0)->GetNodeType();
13694            break;
13695        case eVAR_REF:
13696            n->type = n->Arg<CVar*>(0)->GetNodeType();
13697            break;
13698        case ePARAM_REF:
13699            n->type = n->Arg<CParam*>(0)->GetNodeType();
13700            break;
13701        case ePORT_REF:
13702            n->type = n->Arg<CPortDir*>(0)->GetNodeType();
13703            break;
13704        case eFWD_REF:
13705            if(1) {
13706                n->type = eB;
13707            }
13708            break;
13709        case eGENVAR_REF:
13710            n->type = n->Arg<CGenvar*>(0)->GetNodeType();
13711            break;
13712        case eENUM_REF:
13713            n->type = n->Arg<CEnum*>(0)->GetNodeType();
13714            break;
13715        case eTYPE_REF:
13716            if(1) {
13717                n->type = eS;
13718            }
13719            break;
13720        case eRANGE:
13721            if( n->Arg<CNode*>(0)->type == eR  ) {
13722                info->error = 1;
13723                if( !suppressErrorMessages ) {
13724                    error(n->GetCoord(), "Illegal expression operand" );
13725                }
13726            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13727                info->error = 1;
13728                if( !suppressErrorMessages ) {
13729                    error(n->GetCoord(), "Illegal expression operand" );
13730                }
13731            } else if(1) {
13732                n->type = eB;
13733            }
13734            break;
13735        case eSLICE:
13736            if( n->Arg<CNode*>(0)->type == eR  ) {
13737                info->error = 1;
13738                if( !suppressErrorMessages ) {
13739                    error(n->GetCoord(), "Illegal expression operand" );
13740                }
13741            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13742                info->error = 1;
13743                if( !suppressErrorMessages ) {
13744                    error(n->GetCoord(), "Illegal expression operand" );
13745                }
13746            } else if(1) {
13747                n->type = eB;
13748            }
13749            break;
13750        case ePSLICE:
13751            if( n->Arg<CNode*>(1)->type == eR  ) {
13752                info->error = 1;
13753                if( !suppressErrorMessages ) {
13754                    error(n->GetCoord(), "Illegal expression operand" );
13755                }
13756            } else if(1) {
13757                n->type = eB;
13758            }
13759            break;
13760        case eMSLICE:
13761            if( n->Arg<CNode*>(1)->type == eR  ) {
13762                info->error = 1;
13763                if( !suppressErrorMessages ) {
13764                    error(n->GetCoord(), "Illegal expression operand" );
13765                }
13766            } else if(1) {
13767                n->type = eB;
13768            }
13769            break;
13770        case eCVRI:
13771            if(1) {
13772                n->type = eS;
13773            }
13774            break;
13775        case eCVIR:
13776            if(1) {
13777                n->type = eR;
13778            }
13779            break;
13780        case eREP:
13781            if( n->Arg<CNode*>(0)->type == eR  ) {
13782                info->error = 1;
13783                if( !suppressErrorMessages ) {
13784                    error(n->GetCoord(), "Illegal expression operand" );
13785                }
13786            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13787                info->error = 1;
13788                if( !suppressErrorMessages ) {
13789                    error(n->GetCoord(), "Illegal expression operand" );
13790                }
13791            } else if(1) {
13792                n->type = eB;
13793            }
13794            break;
13795        case eCAT:
13796            if( n->Arg<CNode*>(0)->type == eR  ) {
13797                info->error = 1;
13798                if( !suppressErrorMessages ) {
13799                    error(n->GetCoord(), "Illegal expression operand" );
13800                }
13801            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13802                info->error = 1;
13803                if( !suppressErrorMessages ) {
13804                    error(n->GetCoord(), "Illegal expression operand" );
13805                }
13806            } else if(1) {
13807                n->type = eB;
13808            }
13809            break;
13810        case eUCAT:
13811            if( n->Arg<CNode*>(0)->type == eR  ) {
13812                info->error = 1;
13813                if( !suppressErrorMessages ) {
13814                    error(n->GetCoord(), "Illegal expression operand" );
13815                }
13816            } else if(1) {
13817                n->type = eB;
13818            }
13819            break;
13820        case eCOM:
13821            if( n->Arg<CNode*>(0)->type == eR  ) {
13822                info->error = 1;
13823                if( !suppressErrorMessages ) {
13824                    error(n->GetCoord(), "Illegal expression operand" );
13825                }
13826            } else if( n->Arg<CNode*>(0)->type == eS  ) {
13827                n->type = eS;
13828            } else if(1) {
13829                n->type = eB;
13830            }
13831            break;
13832        case eNEG:
13833            n->type = n->Arg<CNode*>(0)->type;
13834            break;
13835        case ePLUS:
13836            n->type = n->Arg<CNode*>(0)->type;
13837            break;
13838        case eNOT:
13839            if(1) {
13840                n->type = eB;
13841            }
13842            break;
13843        case eGT:
13844            if(1) {
13845                n->type = eB;
13846            }
13847            break;
13848        case eGE:
13849            if(1) {
13850                n->type = eB;
13851            }
13852            break;
13853        case eLT:
13854            if(1) {
13855                n->type = eB;
13856            }
13857            break;
13858        case eLE:
13859            if(1) {
13860                n->type = eB;
13861            }
13862            break;
13863        case eLAND:
13864            if(1) {
13865                n->type = eB;
13866            }
13867            break;
13868        case eLOR:
13869            if(1) {
13870                n->type = eB;
13871            }
13872            break;
13873        case eCEQ:
13874            if( n->Arg<CNode*>(0)->type == eR  ) {
13875                info->error = 1;
13876                if( !suppressErrorMessages ) {
13877                    error(n->GetCoord(), "Illegal expression operand" );
13878                }
13879            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13880                info->error = 1;
13881                if( !suppressErrorMessages ) {
13882                    error(n->GetCoord(), "Illegal expression operand" );
13883                }
13884            } else if(1) {
13885                n->type = eB;
13886            }
13887            break;
13888        case eCNE:
13889            if( n->Arg<CNode*>(0)->type == eR  ) {
13890                info->error = 1;
13891                if( !suppressErrorMessages ) {
13892                    error(n->GetCoord(), "Illegal expression operand" );
13893                }
13894            } else if( n->Arg<CNode*>(1)->type == eR  ) {
13895                info->error = 1;
13896                if( !suppressErrorMessages ) {
13897                    error(n->GetCoord(), "Illegal expression operand" );
13898                }
13899            } else if(1) {
13900                n->type = eB;
13901            }
13902            break;
13903        case eEQ:
13904            if(1) {
13905                n->type = eB;
13906            }
13907            break;
13908        case eNE:
13909            if(1) {
13910                n->type = eB;
13911            }
13912            break;
13913        case eRAND:
13914            if( n->Arg<CNode*>(0)->type == eR  ) {
13915                info->error = 1;
13916                if( !suppressErrorMessages ) {
13917                    error(n->GetCoord(), "Illegal expression operand" );
13918                }
13919            } else if(1) {
13920                n->type = eB;
13921            }
13922            break;
13923        case eRNAND:
13924            if( n->Arg<CNode*>(0)->type == eR  ) {
13925                info->error = 1;
13926                if( !suppressErrorMessages ) {
13927                    error(n->GetCoord(), "Illegal expression operand" );
13928                }
13929            } else if(1) {
13930                n->type = eB;
13931            }
13932            break;
13933        case eROR:
13934            if( n->Arg<CNode*>(0)->type == eR  ) {
13935                info->error = 1;
13936                if( !suppressErrorMessages ) {
13937                    error(n->GetCoord(), "Illegal expression operand" );
13938                }
13939            } else if(1) {
13940                n->type = eB;
13941            }
13942            break;
13943        case eRNOR:
13944            if( n->Arg<CNode*>(0)->type == eR  ) {
13945                info->error = 1;
13946                if( !suppressErrorMessages ) {
13947                    error(n->GetCoord(), "Illegal expression operand" );
13948                }
13949            } else if(1) {
13950                n->type = eB;
13951            }
13952            break;
13953        case eRXOR:
13954            if( n->Arg<CNode*>(0)->type == eR  ) {
13955                info->error = 1;
13956                if( !suppressErrorMessages ) {
13957                    error(n->GetCoord(), "Illegal expression operand" );
13958                }
13959            } else if(1) {
13960                n->type = eB;
13961            }
13962            break;
13963        case eRXNOR:
13964            if( n->Arg<CNode*>(0)->type == eR  ) {
13965                info->error = 1;
13966                if( !suppressErrorMessages ) {
13967                    error(n->GetCoord(), "Illegal expression operand" );
13968                }
13969            } else if(1) {
13970                n->type = eB;
13971            }
13972            break;
13973        case eHOOK:
13974            if( n->Arg<CNode*>(1)->type == eR  ) {
13975                n->type = eR;
13976            } else if( n->Arg<CNode*>(2)->type == eR  ) {
13977                n->type = eR;
13978            } else if( n->Arg<CNode*>(1)->type == eS  && n->Arg<CNode*>(2)->type == eS  ) {
13979                n->type = eS;
13980            } else if(1) {
13981                n->type = eB;
13982            }
13983            break;
13984        case ePOSEDGE:
13985            if(1) {
13986                n->type = eE;
13987            }
13988            break;
13989        case eNEGEDGE:
13990            if(1) {
13991                n->type = eE;
13992            }
13993            break;
13994        case eEVOR:
13995            if(1) {
13996                n->type = eE;
13997            }
13998            break;
13999        case eMTM:
14000            if( n->Arg<CNode*>(0)->type == eR  ) {
14001                n->type = eR;
14002            } else if( n->Arg<CNode*>(1)->type == eR  ) {
14003                n->type = eR;
14004            } else if( n->Arg<CNode*>(2)->type == eR  ) {
14005                n->type = eR;
14006            } else if( n->Arg<CNode*>(0)->type == eS  && n->Arg<CNode*>(1)->type == eS  && n->Arg<CNode*>(2)->type == eS  ) {
14007                n->type = eS;
14008            } else if(1) {
14009                n->type = eB;
14010            }
14011            break;
14012        case eEXTERNAL_REF:
14013             n->type = External::Type(n->Arg<CSymbol*>(0));
14014            break;
14015        case eATTRIBUTE:
14016            if(1) {
14017                n->type = eU;
14018            }
14019            break;
14020        case eMACRO_EXPR:
14021            n->type = n->Arg<CNode*>(1)->type;
14022            break;
14023        case eMEMBER:
14024             n->type = Member::Type(n->Arg<CNode*>(0),n->Arg<CSymbol*>(1));
14025            break;
14026        case ePREINC:
14027            if( n->Arg<CNode*>(0)->type == eR  ) {
14028                n->type = eR;
14029            } else if( n->Arg<CNode*>(0)->type == eS  ) {
14030                n->type = eS;
14031            } else if(1) {
14032                n->type = eB;
14033            }
14034            break;
14035        case ePOSTINC:
14036            if( n->Arg<CNode*>(0)->type == eR  ) {
14037                n->type = eR;
14038            } else if( n->Arg<CNode*>(0)->type == eS  ) {
14039                n->type = eS;
14040            } else if(1) {
14041                n->type = eB;
14042            }
14043            break;
14044        case ePREDEC:
14045            if( n->Arg<CNode*>(0)->type == eR  ) {
14046                n->type = eR;
14047            } else if( n->Arg<CNode*>(0)->type == eS  ) {
14048                n->type = eS;
14049            } else if(1) {
14050                n->type = eB;
14051            }
14052            break;
14053        case ePOSTDEC:
14054            if( n->Arg<CNode*>(0)->type == eR  ) {
14055                n->type = eR;
14056            } else if( n->Arg<CNode*>(0)->type == eS  ) {
14057                n->type = eS;
14058            } else if(1) {
14059                n->type = eB;
14060            }
14061            break;
14062        case eCAST:
14063            if(1) {
14064                n->type = eB;
14065            }
14066            break;
14067     default:
14068         MASSERT( FALSE );
14069     }
14070 
14071     /*
14072      * enforce width conventions for fixed width types
14073      */
14074     switch( n->type ) {
14075     case eU:
14076     case eE:
14077     case eR:
14078         n->width = 0;
14079         return;
14080     }
14081 
14082     /*
14083      * set node width
14084      */
14085     switch( n->GetOp() ) {
14086     case eERROR:
14087         n->width = 0;
14088         break;
14089     case eVCONSTANT:
14090         n->width = (!n->Arg<CVector*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CVector*>(0)->GetWidth();
14091         break;
14092     case eRCONSTANT:
14093         n->width = 0;
14094         break;
14095     case eELIST:
14096         n->width = cADD(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14097         break;
14098     case eWIDTH:
14099         n->width = ((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(0)->EvalINT32();
14100         break;
14101     case eSUB:
14102         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14103         break;
14104     case eMUL:
14105         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14106         break;
14107     case eDIV:
14108         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14109         break;
14110     case ePOW:
14111         n->width = n->Arg<CNode*>(0)->width;
14112         break;
14113     case eADD:
14114         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14115         break;
14116     case eLSH:
14117         n->width = n->Arg<CNode*>(0)->width;
14118         break;
14119     case eRSH:
14120         n->width = n->Arg<CNode*>(0)->width;
14121         break;
14122     case eLSHA:
14123         n->width = n->Arg<CNode*>(0)->width;
14124         break;
14125     case eRSHA:
14126         n->width = n->Arg<CNode*>(0)->width;
14127         break;
14128     case eMOD:
14129         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14130         break;
14131     case eOR:
14132         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14133         break;
14134     case eAND:
14135         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14136         break;
14137     case eANDANDAND:
14138         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14139         break;
14140     case eXOR:
14141         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14142         break;
14143     case eXNOR:
14144         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14145         break;
14146     case eSYSTASK_CALL:
14147         n->width = Systask::Width(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1));
14148         break;
14149     case eFUNCTION_CALL:
14150         n->width = CFunction::Width(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1),n->Arg<CScope*>(2));
14151         break;
14152     case eARRAY:
14153         n->width = Array::Width(n->Arg<CNode*>(0),n->Arg<CNode*>(1));
14154         break;
14155     case eNET_REF:
14156         n->width = (!n->Arg<CNet*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CNet*>(0)->GetWidth();
14157         break;
14158     case eVAR_REF:
14159         n->width = (!n->Arg<CVar*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CVar*>(0)->GetWidth();
14160         break;
14161     case ePARAM_REF:
14162         n->width = (!n->Arg<CParam*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CParam*>(0)->GetWidth();
14163         break;
14164     case ePORT_REF:
14165         n->width = (!n->Arg<CPortDir*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CPortDir*>(0)->GetWidth();
14166         break;
14167     case eFWD_REF:
14168         n->width = (!n->Arg<CFref*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CFref*>(0)->GetWidth();
14169         break;
14170     case eGENVAR_REF:
14171         n->width = (!n->Arg<CGenvar*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CGenvar*>(0)->GetWidth();
14172         break;
14173     case eENUM_REF:
14174         n->width = (!n->Arg<CEnum*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CEnum*>(0)->GetWidth();
14175         break;
14176     case eTYPE_REF:
14177         n->width = 32;
14178         break;
14179     case eRANGE:
14180         n->width = cABSDIFFPLUS1(((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(0)->EvalINT32(),((info->error |= !n->Arg<CNode*>(1)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(1)->EvalINT32());
14181         break;
14182     case eSLICE:
14183         n->width = cABSDIFFPLUS1(((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(0)->EvalINT32(),((info->error |= !n->Arg<CNode*>(1)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(1)->EvalINT32());
14184         break;
14185     case ePSLICE:
14186         n->width = (!n->Arg<CNode*>(1)->IsEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(1)->EvalINT32();
14187         break;
14188     case eMSLICE:
14189         n->width = (!n->Arg<CNode*>(1)->IsEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(1)->EvalINT32();
14190         break;
14191     case eCVRI:
14192         n->width = 32;
14193         break;
14194     case eCVIR:
14195         n->width = 0;
14196         break;
14197     case eREP:
14198         n->width = cMUL(((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(0)->EvalINT32(),n->Arg<CNode*>(1)->width);
14199         break;
14200     case eCAT:
14201         n->width = cADD(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
14202         break;
14203     case eUCAT:
14204         n->width = n->Arg<CNode*>(0)->width;
14205         break;
14206     case eCOM:
14207         n->width = n->Arg<CNode*>(0)->width;
14208         break;
14209     case eNEG:
14210         n->width = n->Arg<CNode*>(0)->width;
14211         break;
14212     case ePLUS:
14213         n->width = n->Arg<CNode*>(0)->width;
14214         break;
14215     case eNOT:
14216         n->width = 1;
14217         break;
14218     case eGT:
14219         n->width = 1;
14220         break;
14221     case eGE:
14222         n->width = 1;
14223         break;
14224     case eLT:
14225         n->width = 1;
14226         break;
14227     case eLE:
14228         n->width = 1;
14229         break;
14230     case eLAND:
14231         n->width = 1;
14232         break;
14233     case eLOR:
14234         n->width = 1;
14235         break;
14236     case eCEQ:
14237         n->width = 1;
14238         break;
14239     case eCNE:
14240         n->width = 1;
14241         break;
14242     case eEQ:
14243         n->width = 1;
14244         break;
14245     case eNE:
14246         n->width = 1;
14247         break;
14248     case eRAND:
14249         n->width = 1;
14250         break;
14251     case eRNAND:
14252         n->width = 1;
14253         break;
14254     case eROR:
14255         n->width = 1;
14256         break;
14257     case eRNOR:
14258         n->width = 1;
14259         break;
14260     case eRXOR:
14261         n->width = 1;
14262         break;
14263     case eRXNOR:
14264         n->width = 1;
14265         break;
14266     case eHOOK:
14267         n->width = cMAX(n->Arg<CNode*>(1)->width,n->Arg<CNode*>(2)->width);
14268         break;
14269     case eMTM:
14270         n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width,n->Arg<CNode*>(2)->width);
14271         break;
14272     case eEXTERNAL_REF:
14273         n->width = External::Width(n->Arg<CSymbol*>(0));
14274         break;
14275     case eATTRIBUTE:
14276         n->width = 0;
14277         break;
14278     case eMACRO_EXPR:
14279         n->width = n->Arg<CNode*>(1)->width;
14280         break;
14281     case eMEMBER:
14282         n->width = Member::Width(n->Arg<CNode*>(0),n->Arg<CSymbol*>(1));
14283         break;
14284     case ePREINC:
14285         n->width = n->Arg<CNode*>(0)->width;
14286         break;
14287     case ePOSTINC:
14288         n->width = n->Arg<CNode*>(0)->width;
14289         break;
14290     case ePREDEC:
14291         n->width = n->Arg<CNode*>(0)->width;
14292         break;
14293     case ePOSTDEC:
14294         n->width = n->Arg<CNode*>(0)->width;
14295         break;
14296     case eCAST:
14297         n->width = ((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(0)->EvalINT32();
14298         break;
14299     }
14300 
14301     /*
14302      * deterimine if operands have differing width
14303      */
14304     n->FixedWidth(1);
14305     int operandWidth = -1;
14306     for( int i = 0; i < n->ArgCount(); i++ ) {
14307         if( ((nodeMask>>i)&1) && n->Arg<CNode*>(i) )  {
14308             int widthFixed = n->Arg<CNode*>(i)->WidthFixed() || 
14309                              n->Arg<CNode*>(i)->FixedWidth();
14310 
14311             if( n->ConditionalWiden() && !widthFixed ) {
14312                 n->FixedWidth( 0 );
14313                 break;
14314             } else if( !widthFixed ) {
14315                 n->FixedWidth( 0 );
14316                 break;
14317             } else {
14318                 int w = n->Arg<CNode*>(i)->width;
14319                 if( operandWidth != w ) {
14320                     if( operandWidth >= 0 ) {
14321                         n->FixedWidth( 0 );
14322                         break;
14323                     }
14324                     operandWidth = w;
14325                 }
14326             }
14327         }
14328     }
14329     if( !conditionalWiden && nodeMask != 0 ) {
14330         n->FixedWidth( 0 );
14331     }
14332 }
14333 
14334 /************************************************
14335         FixBits
14336         - relabels node width based on destination 
14337           width and type. Add type conversions
14338           and check argument types. Assumes
14339           LabelBits has already been called and
14340           no illegal operand types are present.
14341 **************************************************/
14342 
14343 CNode*  CNode::FixBits( INT32 newWidth, NodeType_t newType )
14344 {
14345 
14346     int      calculateMax = 0;
14347     int      realOp = 0;
14348     int      conditionalWiden = ConditionalWiden();
14349     unsigned nodeMask = NodeMask();
14350     unsigned scalarMask = 0;
14351     unsigned selfDeterminedMask = 0;
14352     switch( GetOp() ) {
14353     case eERROR:
14354         realOp = 0;
14355         break;
14356     case eVCONSTANT:
14357         realOp = 0;
14358         break;
14359     case eRCONSTANT:
14360         realOp = 0;
14361         break;
14362     case eCOMMENT:
14363         realOp = 0;
14364         break;
14365     case eVRQ:
14366         realOp = 0;
14367         break;
14368     case ePRAGMA:
14369         realOp = 0;
14370         break;
14371     case eELIST:
14372         realOp = 0;
14373         selfDeterminedMask = nodeMask;
14374         break;
14375     case eWIDTH:
14376         realOp = 0;
14377         selfDeterminedMask = nodeMask;
14378         break;
14379     case eNOP:
14380         realOp = 0;
14381         break;
14382     case eSUB:
14383         realOp = 1;
14384         break;
14385     case eMUL:
14386         realOp = 1;
14387         break;
14388     case eDIV:
14389         realOp = 1;
14390         break;
14391     case ePOW:
14392         realOp = 1;
14393         selfDeterminedMask = 1<<1;
14394         break;
14395     case eADD:
14396         realOp = 1;
14397         break;
14398     case eLSH:
14399         realOp = 0;
14400         selfDeterminedMask = 1<<1;
14401         break;
14402     case eRSH:
14403         realOp = 0;
14404         selfDeterminedMask = 1<<1;
14405         break;
14406     case eLSHA:
14407         realOp = 0;
14408         selfDeterminedMask = 1<<1;
14409         break;
14410     case eRSHA:
14411         realOp = 0;
14412         selfDeterminedMask = 1<<1;
14413         break;
14414     case eMOD:
14415         realOp = 0;
14416         break;
14417     case eOR:
14418         realOp = 0;
14419         break;
14420     case eAND:
14421         realOp = 0;
14422         break;
14423     case eANDANDAND:
14424         realOp = 0;
14425         break;
14426     case eXOR:
14427         realOp = 0;
14428         break;
14429     case eXNOR:
14430         realOp = 0;
14431         break;
14432     case eINSTANCE_REF:
14433         realOp = 0;
14434         break;
14435     case eGATE_REF:
14436         realOp = 0;
14437         break;
14438     case eTASK_ENABLE:
14439         realOp = 0;
14440         break;
14441     case eSYSTASK_CALL:
14442         realOp = 0;
14443         selfDeterminedMask = nodeMask;
14444         break;
14445     case eTIMING_CALL:
14446         realOp = 0;
14447         break;
14448     case eFUNCTION_CALL:
14449         realOp = 0;
14450         selfDeterminedMask = nodeMask;
14451         break;
14452     case eARRAY:
14453         realOp = 0;
14454         selfDeterminedMask = 1<<1;
14455         break;
14456     case eNET_REF:
14457         realOp = 0;
14458         break;
14459     case eVAR_REF:
14460         realOp = 0;
14461         break;
14462     case ePARAM_REF:
14463         realOp = 0;
14464         break;
14465     case ePORT_REF:
14466         realOp = 0;
14467         break;
14468     case eFWD_REF:
14469         realOp = 0;
14470         break;
14471     case eGENVAR_REF:
14472         realOp = 0;
14473         break;
14474     case eENUM_REF:
14475         realOp = 0;
14476         break;
14477     case eTYPE_REF:
14478         realOp = 0;
14479         break;
14480     case eNET_DECL:
14481         realOp = 0;
14482         break;
14483     case eVAR_DECL:
14484         realOp = 0;
14485         break;
14486     case ePARAM_DECL:
14487         realOp = 0;
14488         break;
14489     case eSPECPARAM_DECL:
14490         realOp = 0;
14491         break;
14492     case ePORT_DECL:
14493         realOp = 0;
14494         break;
14495     case eGENVAR_DECL:
14496         realOp = 0;
14497         break;
14498     case eTYPEDEF_DECL:
14499         realOp = 0;
14500         break;
14501     case eLIST:
14502         realOp = 0;
14503         break;
14504     case eRANGE:
14505         realOp = 0;
14506         selfDeterminedMask = nodeMask;
14507         break;
14508     case eSLICE:
14509         realOp = 0;
14510         selfDeterminedMask = nodeMask;
14511         break;
14512     case ePSLICE:
14513         realOp = 0;
14514         selfDeterminedMask = nodeMask;
14515         break;
14516     case eMSLICE:
14517         realOp = 0;
14518         selfDeterminedMask = nodeMask;
14519         break;
14520     case eCVRI:
14521         realOp = 0;
14522         selfDeterminedMask = nodeMask;
14523         break;
14524     case eCVIR:
14525         realOp = 0;
14526         selfDeterminedMask = nodeMask;
14527         break;
14528     case eREP:
14529         realOp = 0;
14530         selfDeterminedMask = nodeMask;
14531         break;
14532     case eCAT:
14533         realOp = 0;
14534         selfDeterminedMask = nodeMask;
14535         break;
14536     case eUCAT:
14537         realOp = 0;
14538         selfDeterminedMask = nodeMask;
14539         break;
14540     case eCOM:
14541         realOp = 0;
14542         break;
14543     case eNEG:
14544         realOp = 0;
14545         break;
14546     case ePLUS:
14547         realOp = 0;
14548         break;
14549     case eNOT:
14550         realOp = 0;
14551         scalarMask = 1;
14552         break;
14553     case eGT:
14554         realOp = 0;
14555         calculateMax = 1;
14556         break;
14557     case eGE:
14558         realOp = 0;
14559         calculateMax = 1;
14560         break;
14561     case eLT:
14562         realOp = 0;
14563         calculateMax = 1;
14564         break;
14565     case eLE:
14566         realOp = 0;
14567         calculateMax = 1;
14568         break;
14569     case eLAND:
14570         realOp = 0;
14571         scalarMask = 3;
14572         break;
14573     case eLOR:
14574         realOp = 0;
14575         scalarMask = 3;
14576         break;
14577     case eCEQ:
14578         realOp = 0;
14579         calculateMax = 1;
14580         break;
14581     case eCNE:
14582         realOp = 0;
14583         calculateMax = 1;
14584         break;
14585     case eEQ:
14586         realOp = 0;
14587         calculateMax = 1;
14588         break;
14589     case eNE:
14590         realOp = 0;
14591         calculateMax = 1;
14592         break;
14593     case eRAND:
14594         realOp = 0;
14595         selfDeterminedMask = nodeMask;
14596         break;
14597     case eRNAND:
14598         realOp = 0;
14599         selfDeterminedMask = nodeMask;
14600         break;
14601     case eROR:
14602         realOp = 0;
14603         selfDeterminedMask = nodeMask;
14604         break;
14605     case eRNOR:
14606         realOp = 0;
14607         selfDeterminedMask = nodeMask;
14608         break;
14609     case eRXOR:
14610         realOp = 0;
14611         selfDeterminedMask = nodeMask;
14612         break;
14613     case eRXNOR:
14614         realOp = 0;
14615         selfDeterminedMask = nodeMask;
14616         break;
14617     case eHOOK:
14618         realOp = 1;
14619         scalarMask = 1;
14620         break;
14621     case eINIT:
14622         realOp = 0;
14623         break;
14624     case eALWAYS:
14625         realOp = 0;
14626         break;
14627     case eALWAYS_LATCH:
14628         realOp = 0;
14629         break;
14630     case eALWAYS_FF:
14631         realOp = 0;
14632         break;
14633     case eALWAYS_COMB:
14634         realOp = 0;
14635         break;
14636     case eEVENT:
14637         realOp = 0;
14638         break;
14639     case eBLOCK_REF:
14640         realOp = 0;
14641         break;
14642     case eSPECIFY_REF:
14643         realOp = 0;
14644         break;
14645     case eASSIGN:
14646         realOp = 0;
14647         break;
14648     case eADD_ASSIGN:
14649         realOp = 0;
14650         break;
14651     case eSUB_ASSIGN:
14652         realOp = 0;
14653         break;
14654     case eMUL_ASSIGN:
14655         realOp = 0;
14656         break;
14657     case eDIV_ASSIGN:
14658         realOp = 0;
14659         break;
14660     case eMOD_ASSIGN:
14661         realOp = 0;
14662         break;
14663     case eAND_ASSIGN:
14664         realOp = 0;
14665         break;
14666     case eOR_ASSIGN:
14667         realOp = 0;
14668         break;
14669     case eXOR_ASSIGN:
14670         realOp = 0;
14671         break;
14672     case eLSH_ASSIGN:
14673         realOp = 0;
14674         break;
14675     case eRSH_ASSIGN:
14676         realOp = 0;
14677         break;
14678     case eLSHA_ASSIGN:
14679         realOp = 0;
14680         break;
14681     case eRSHA_ASSIGN:
14682         realOp = 0;
14683         break;
14684     case eFORCE:
14685         realOp = 0;
14686         break;
14687     case eRELEASE:
14688         realOp = 0;
14689         break;
14690     case eNBASSIGN:
14691         realOp = 0;
14692         break;
14693     case ePOSEDGE:
14694         realOp = 0;
14695         break;
14696     case eNEGEDGE:
14697         realOp = 0;
14698         break;
14699     case eEDGE:
14700         realOp = 0;
14701         break;
14702     case eEVOR:
14703         realOp = 0;
14704         break;
14705     case eDELAY:
14706         realOp = 0;
14707         break;
14708     case eMTM:
14709         realOp = 1;
14710         break;
14711     case eIF:
14712         realOp = 0;
14713         break;
14714     case eFOREVER:
14715         realOp = 0;
14716         break;
14717     case eREPEAT:
14718         realOp = 0;
14719         break;
14720     case eWHILE:
14721         realOp = 0;
14722         break;
14723     case eWAIT:
14724         realOp = 0;
14725         break;
14726     case eFOR:
14727         realOp = 0;
14728         break;
14729     case eCASE:
14730         realOp = 0;
14731         break;
14732     case eCASEX:
14733         realOp = 0;
14734         break;
14735     case eCASEZ:
14736         realOp = 0;
14737         break;
14738     case eCASEITEM:
14739         realOp = 0;
14740         break;
14741     case eCASSIGN:
14742         realOp = 0;
14743         break;
14744     case eARG:
14745         realOp = 0;
14746         break;
14747     case eFUNCTION_DEF:
14748         realOp = 0;
14749         break;
14750     case eMODULE_DEF:
14751         realOp = 0;
14752         break;
14753     case eREPEAT_CONTROL:
14754         realOp = 0;
14755         break;
14756     case eDELAY_CONTROL:
14757         realOp = 0;
14758         break;
14759     case eEVENT_CONTROL:
14760         realOp = 0;
14761         break;
14762     case eEXTERNAL_REF:
14763         realOp = 0;
14764         break;
14765     case ePORT_DEF:
14766         realOp = 0;
14767         break;
14768     case eDEFPARAM:
14769         realOp = 0;
14770         break;
14771     case ePATH:
14772         realOp = 0;
14773         break;
14774     case ePATH_ASSIGN:
14775         realOp = 0;
14776         break;
14777     case eIFNONE_PATH_ASSIGN:
14778         realOp = 0;
14779         break;
14780     case eTRIGGER:
14781         realOp = 0;
14782         break;
14783     case ePASSIGN:
14784         realOp = 0;
14785         break;
14786     case eDEASSIGN:
14787         realOp = 0;
14788         break;
14789     case eDISABLE:
14790         realOp = 0;
14791         break;
14792     case eATTRIBUTE:
14793         realOp = 0;
14794         break;
14795     case eGIF:
14796         realOp = 0;
14797         break;
14798     case eGFOR:
14799         realOp = 0;
14800         break;
14801     case eGCASE:
14802         realOp = 0;
14803         break;
14804     case eTABLE:
14805         realOp = 0;
14806         break;
14807     case eTABLE_ENTRY:
14808         realOp = 0;
14809         break;
14810     case eTABLE_SYMBOL:
14811         realOp = 0;
14812         break;
14813     case ePORTLIST_END:
14814         realOp = 0;
14815         break;
14816     case eMACRO_EXPR:
14817         realOp = 0;
14818         break;
14819     case eENUM_SPEC:
14820         realOp = 0;
14821         break;
14822     case eMEMBER:
14823         realOp = 0;
14824         break;
14825     case eRETURN:
14826         realOp = 0;
14827         break;
14828     case ePREINC:
14829         realOp = 1;
14830         break;
14831     case ePOSTINC:
14832         realOp = 1;
14833         break;
14834     case ePREDEC:
14835         realOp = 1;
14836         break;
14837     case ePOSTDEC:
14838         realOp = 1;
14839         break;
14840     case eCAST:
14841         realOp = 0;
14842         selfDeterminedMask = nodeMask;
14843         break;
14844     default:
14845         MASSERT( FALSE );
14846     }
14847     /*
14848      * find location of all real args
14849      */
14850     unsigned realMask = 0;
14851     unsigned forceRealMask = 0;
14852     int      widthsDiffer = 0;
14853     int      originalWidth = width;
14854     for( int i = 0; i < ArgCount(); i++ ) {
14855         if( ((nodeMask>>i)&1) && Arg<CNode*>(i)->type == eR )  {
14856             realMask |= 1<<i;
14857         }
14858         if( ((nodeMask>>i)&1) && 
14859             Arg<CNode*>(i)->type != eR &&
14860             (Arg<CNode*>(i)->GetOp() != eVCONSTANT || 
14861              Arg<CNode*>(i)->width != width) ) {
14862             widthsDiffer = 1;
14863         }
14864     }
14865 
14866     /*
14867      * if new type is undetermined, use current type and width
14868      */
14869     if( newType == eU && newWidth == 0 ) {
14870         newType  = type;
14871         newWidth = width;
14872     /*
14873      * increase expression width if new width is larger
14874      * and a vector
14875      */
14876     } else if( (newType == eB || newType == eS || newType == eU) &&
14877         (type == eB || type == eS)  ) {
14878         if( newWidth > width ) {
14879             width = newWidth;
14880         }
14881         if( newType == eU ) {
14882             newType = type;
14883         }
14884      }
14885         
14886     MASSERT( newType != eR || newWidth == 0 );
14887     MASSERT( newType != eE || newWidth == 0 );
14888 
14889 
14890     /*
14891      * non-real operands are self determined when mixed with real
14892      */
14893     if( realMask ) {
14894         forceRealMask = (~realMask & nodeMask);
14895     }
14896 
14897     /*
14898      * special case for bit operations
14899      * Only widen if operand widths differ
14900      */
14901     int convertWidth = conditionalWiden && FixedWidth();
14902     if( convertWidth ) {
14903         width = originalWidth;  
14904     }
14905     if( newType == eB && type == eS ) {
14906         type = eB;
14907     }
14908     /*
14909      * calculate max with of args if needed
14910      */
14911     int cWidth = width;
14912     NodeType_t cType = type;
14913     if( calculateMax ) {
14914         cType = eS;
14915         int max = 0;    
14916         int foundReal = 0;
14917         int foundUnsigned = 0;
14918         for( int i = 0; i < ArgCount(); i++ ) {
14919             if( (nodeMask>>i)&1 )  {
14920                 switch( Arg<CNode*>(i)->type ) {
14921                 case eB:
14922                     foundUnsigned = 1;
14923                     break;
14924                 case eR:
14925                     foundReal = 1;
14926                     break;
14927                 }
14928                 if( Arg<CNode*>(i)->width > max ) {
14929                     max = Arg<CNode*>(i)->width;
14930                 }       
14931             }
14932         }
14933         if( foundReal ) {
14934             cWidth = 0;
14935             cType  = eR;
14936         } else if( foundUnsigned ) {
14937             cType = eB;
14938             cWidth = max;
14939         } else {
14940             cWidth = max;
14941         }
14942     }
14943         
14944     /*
14945      * Fix each CNode* argument
14946      */
14947     for( int i = 0; i < ArgCount(); i++ ) {
14948         if( (nodeMask>>i)&1 )  {
14949             if( (scalarMask>>i)&1 ) {
14950                 if( Arg<CNode*>(i)->type == eR ) {
14951                         CNode* node;
14952                         Arg<CNode*>(i) =  cNE( Arg<CNode*>(i), cREAL(0), &loc );
14953                         Arg<CNode*>(i)->LabelBits();
14954                 } else if( type == eR ) {
14955                         // Hack for ? operator
14956                         CNode* node;
14957                         Arg<CNode*>(i) =  cCNE( Arg<CNode*>(i), cINT32(0), &loc );
14958                         Arg<CNode*>(i)->LabelBits();
14959                 }
14960                 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eU );
14961             } else if( (forceRealMask>>i)&1 ) {
14962                 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eR );
14963             } else if( (selfDeterminedMask>>i)&1 ) {
14964                 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eU );
14965             } else {
14966                 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( cWidth, cType );
14967             }
14968         }
14969     }
14970         
14971 
14972 
14973     /*
14974      * add conversions if needed
14975      */
14976     if( newType != eR && convertWidth ) {
14977         CNode* nn = cWIDTH(cINT32(newWidth), this);
14978         nn->width = newWidth;
14979         nn->type =  type;
14980         return nn;
14981     } 
14982     if( newType == eR && (type == eB || type == eS) ) {
14983         CNode* nn = cCVIR( this );
14984         nn->width =  0;
14985         nn->type = eR;
14986         return  nn;
14987         
14988     } else if( (newType == eB || newType == eS) && type == eR ) {
14989         CNode* nn = cCVRI( this );
14990         nn->width = newWidth;
14991         nn->type = newType;
14992         return  nn;
14993     }
14994     
14995     return this;
14996 }
14997 
14998 /*************************************************
14999         Dump
15000         - dump expression for debug 
15001 **************************************************/
15002 void    CNode::Dump( FILE* f )
15003 {
15004     switch( GetOp() ) {
15005     case eERROR:
15006         fprintf( f, "???" );
15007         break;
15008     case eVCONSTANT:
15009           fprintf( f, "%s", Arg<CVector*>(0)->GetVString() );
15010         break;
15011     case eRCONSTANT:
15012           fprintf( f, "%s", (char*)Arg<char*>(0) );
15013         break;
15014     case ePRAGMA:
15015           fprintf( f, "%s", (char*)Arg<char*>(0) );
15016         break;
15017     case eELIST:
15018         fprintf( f, "" );
15019         Arg<CNode*>(0)->Dump( f );
15020         fprintf( f, "," );
15021         Arg<CNode*>(1)->Dump( f );
15022         fprintf( f, "" );
15023         break;
15024     case eWIDTH:
15025         fprintf( f, "WIDTH(" );
15026         fprintf( f, "%s", type==eS ? "S" : "U" );
15027         fprintf( f, "," );
15028         fprintf( f, "%d", width );
15029         fprintf( f, "," );
15030         Arg<CNode*>(0)->Dump( f );
15031         fprintf( f, "," );
15032         Arg<CNode*>(1)->Dump( f );
15033         fprintf( f, ")" );
15034         break;
15035     case eSUB:
15036         fprintf( f, "(" );
15037         Arg<CNode*>(0)->Dump( f );
15038         fprintf( f, ")-(" );
15039         Arg<CNode*>(1)->Dump( f );
15040         fprintf( f, ")" );
15041         break;
15042     case eMUL:
15043         fprintf( f, "(" );
15044         Arg<CNode*>(0)->Dump( f );
15045         fprintf( f, ")*(" );
15046         Arg<CNode*>(1)->Dump( f );
15047         fprintf( f, ")" );
15048         break;
15049     case eDIV:
15050         fprintf( f, "(" );
15051         Arg<CNode*>(0)->Dump( f );
15052         fprintf( f, ")/(" );
15053         Arg<CNode*>(1)->Dump( f );
15054         fprintf( f, ")" );
15055         break;
15056     case ePOW:
15057         fprintf( f, "(" );
15058         Arg<CNode*>(0)->Dump( f );
15059         fprintf( f, ")**(" );
15060         Arg<CNode*>(1)->Dump( f );
15061         fprintf( f, ")" );
15062         break;
15063     case eADD:
15064         fprintf( f, "(" );
15065         Arg<CNode*>(0)->Dump( f );
15066         fprintf( f, ")+(" );
15067         Arg<CNode*>(1)->Dump( f );
15068         fprintf( f, ")" );
15069         break;
15070     case eLSH:
15071         fprintf( f, "(" );
15072         Arg<CNode*>(0)->Dump( f );
15073         fprintf( f, ")<<(" );
15074         Arg<CNode*>(1)->Dump( f );
15075         fprintf( f, ")" );
15076         break;
15077     case eRSH:
15078         fprintf( f, "(" );
15079         Arg<CNode*>(0)->Dump( f );
15080         fprintf( f, ")>>(" );
15081         Arg<CNode*>(1)->Dump( f );
15082         fprintf( f, ")" );
15083         break;
15084     case eLSHA:
15085         fprintf( f, "(" );
15086         Arg<CNode*>(0)->Dump( f );
15087         fprintf( f, ")<<<(" );
15088         Arg<CNode*>(1)->Dump( f );
15089         fprintf( f, ")" );
15090         break;
15091     case eRSHA:
15092         fprintf( f, "(" );
15093         Arg<CNode*>(0)->Dump( f );
15094         fprintf( f, ")>>>(" );
15095         Arg<CNode*>(1)->Dump( f );
15096         fprintf( f, ")" );
15097         break;
15098     case eMOD:
15099         fprintf( f, "(" );
15100         Arg<CNode*>(0)->Dump( f );
15101         fprintf( f, ")%%(" );
15102         Arg<CNode*>(1)->Dump( f );
15103         fprintf( f, ")" );
15104         break;
15105     case eOR:
15106         fprintf( f, "(" );
15107         Arg<CNode*>(0)->Dump( f );
15108         fprintf( f, ")|(" );
15109         Arg<CNode*>(1)->Dump( f );
15110         fprintf( f, ")" );
15111         break;
15112     case eAND:
15113         fprintf( f, "(" );
15114         Arg<CNode*>(0)->Dump( f );
15115         fprintf( f, ")&(" );
15116         Arg<CNode*>(1)->Dump( f );
15117         fprintf( f, ")" );
15118         break;
15119     case eANDANDAND:
15120         fprintf( f, "(" );
15121         Arg<CNode*>(0)->Dump( f );
15122         fprintf( f, ")&&&(" );
15123         Arg<CNode*>(1)->Dump( f );
15124         fprintf( f, ")" );
15125         break;
15126     case eXOR:
15127         fprintf( f, "(" );
15128         Arg<CNode*>(0)->Dump( f );
15129         fprintf( f, ")^(" );
15130         Arg<CNode*>(1)->Dump( f );
15131         fprintf( f, ")" );
15132         break;
15133     case eXNOR:
15134         fprintf( f, "(" );
15135         Arg<CNode*>(0)->Dump( f );
15136         fprintf( f, ")~^(" );
15137         Arg<CNode*>(1)->Dump( f );
15138         fprintf( f, ")" );
15139         break;
15140     case eFUNCTION_CALL:
15141         fprintf( f, "" );
15142         fprintf( f, "%s", Arg<CSymbol*>(0)->GetName() );
15143         fprintf( f, "(" );
15144         Arg<CNode*>(1)->Dump( f );
15145         fprintf( f, ")" );
15146         break;
15147     case eARRAY:
15148         fprintf( f, "" );
15149         Arg<CNode*>(0)->Dump( f );
15150         fprintf( f, "[" );
15151         Arg<CNode*>(1)->Dump( f );
15152         fprintf( f, "]" );
15153         break;
15154     case eNET_REF:
15155           fprintf( f, "%s", Arg<CNet*>(0)->GetName() );
15156         break;
15157     case eVAR_REF:
15158           fprintf( f, "%s", Arg<CVar*>(0)->GetName() );
15159         break;
15160     case ePARAM_REF:
15161           fprintf( f, "%s", Arg<CParam*>(0)->GetName() );
15162         break;
15163     case ePORT_REF:
15164           fprintf( f, "%s", Arg<CPort*>(0)->GetName() );
15165         break;
15166     case eFWD_REF:
15167           fprintf( f, "%s", Arg<CFref*>(0)->GetName() );
15168         break;
15169     case eGENVAR_REF:
15170           fprintf( f, "%s", Arg<CGenvar*>(0)->GetName() );
15171         break;
15172     case eENUM_REF:
15173           fprintf( f, "%s", Arg<CEnum*>(0)->GetName() );
15174         break;
15175     case eTYPE_REF:
15176           fprintf( f, "%s", Arg<CTypedef*>(0)->GetName() );
15177         break;
15178     case eVAR_DECL:
15179         fprintf( f, "VarDecl" );
15180         break;
15181     case eLIST:
15182         fprintf( f, "(" );
15183         Arg<CNode*>(0)->Dump( f );
15184         fprintf( f, "," );
15185         Arg<CNode*>(1)->Dump( f );
15186         fprintf( f, ")" );
15187         break;
15188     case eRANGE:
15189         fprintf( f, "" );
15190         Arg<CNode*>(0)->Dump( f );
15191         fprintf( f, ":" );
15192         Arg<CNode*>(1)->Dump( f );
15193         fprintf( f, "" );
15194         break;
15195     case eSLICE:
15196         fprintf( f, "" );
15197         Arg<CNode*>(0)->Dump( f );
15198         fprintf( f, ":" );
15199         Arg<CNode*>(1)->Dump( f );
15200         fprintf( f, "" );
15201         break;
15202     case ePSLICE:
15203         fprintf( f, "" );
15204         Arg<CNode*>(0)->Dump( f );
15205         fprintf( f, "+:" );
15206         Arg<CNode*>(1)->Dump( f );
15207         fprintf( f, "" );
15208         break;
15209     case eMSLICE:
15210         fprintf( f, "" );
15211         Arg<CNode*>(0)->Dump( f );
15212         fprintf( f, "-:" );
15213         Arg<CNode*>(1)->Dump( f );
15214         fprintf( f, "" );
15215         break;
15216     case eCVRI:
15217         fprintf( f, "CVRI(" );
15218         Arg<CNode*>(0)->Dump( f );
15219         fprintf( f, ")" );
15220         break;
15221     case eCVIR:
15222         fprintf( f, "CVIR(" );
15223         Arg<CNode*>(0)->Dump( f );
15224         fprintf( f, ")" );
15225         break;
15226     case eREP:
15227         fprintf( f, "{" );
15228         Arg<CNode*>(0)->Dump( f );
15229         fprintf( f, "{" );
15230         Arg<CNode*>(1)->Dump( f );
15231         fprintf( f, "}}" );
15232         break;
15233     case eCAT:
15234         fprintf( f, "{" );
15235         Arg<CNode*>(0)->Dump( f );
15236         fprintf( f, "," );
15237         Arg<CNode*>(1)->Dump( f );
15238         fprintf( f, "}" );
15239         break;
15240     case eUCAT:
15241         fprintf( f, "{" );
15242         Arg<CNode*>(0)->Dump( f );
15243         fprintf( f, "}" );
15244         break;
15245     case eCOM:
15246         fprintf( f, "~(" );
15247         Arg<CNode*>(0)->Dump( f );
15248         fprintf( f, ")" );
15249         break;
15250     case eNEG:
15251         fprintf( f, "-(" );
15252         Arg<CNode*>(0)->Dump( f );
15253         fprintf( f, ")" );
15254         break;
15255     case ePLUS:
15256         fprintf( f, "+(" );
15257         Arg<CNode*>(0)->Dump( f );
15258         fprintf( f, ")" );
15259         break;
15260     case eNOT:
15261         fprintf( f, "!(" );
15262         Arg<CNode*>(0)->Dump( f );
15263         fprintf( f, ")" );
15264         break;
15265     case eGT:
15266         fprintf( f, "(" );
15267         Arg<CNode*>(0)->Dump( f );
15268         fprintf( f, ")>(" );
15269         Arg<CNode*>(1)->Dump( f );
15270         fprintf( f, ")" );
15271         break;
15272     case eGE:
15273         fprintf( f, "(" );
15274         Arg<CNode*>(0)->Dump( f );
15275         fprintf( f, ")>=(" );
15276         Arg<CNode*>(1)->Dump( f );
15277         fprintf( f, ")" );
15278         break;
15279     case eLT:
15280         fprintf( f, "(" );
15281         Arg<CNode*>(0)->Dump( f );
15282         fprintf( f, ")<(" );
15283         Arg<CNode*>(1)->Dump( f );
15284         fprintf( f, ")" );
15285         break;
15286     case eLE:
15287         fprintf( f, "(" );
15288         Arg<CNode*>(0)->Dump( f );
15289         fprintf( f, ")<=(" );
15290         Arg<CNode*>(1)->Dump( f );
15291         fprintf( f, ")" );
15292         break;
15293     case eLAND:
15294         fprintf( f, "(" );
15295         Arg<CNode*>(0)->Dump( f );
15296         fprintf( f, ")&&(" );
15297         Arg<CNode*>(1)->Dump( f );
15298         fprintf( f, ")" );
15299         break;
15300     case eLOR:
15301         fprintf( f, "(" );
15302         Arg<CNode*>(0)->Dump( f );
15303         fprintf( f, ")||(" );
15304         Arg<CNode*>(1)->Dump( f );
15305         fprintf( f, ")" );
15306         break;
15307     case eCEQ:
15308         fprintf( f, "(" );
15309         Arg<CNode*>(0)->Dump( f );
15310         fprintf( f, ")===(" );
15311         Arg<CNode*>(1)->Dump( f );
15312         fprintf( f, ")" );
15313         break;
15314     case eCNE:
15315         fprintf( f, "(" );
15316         Arg<CNode*>(0)->Dump( f );
15317         fprintf( f, ")!==(" );
15318         Arg<CNode*>(1)->Dump( f );
15319         fprintf( f, ")" );
15320         break;
15321     case eEQ:
15322         fprintf( f, "(" );
15323         Arg<CNode*>(0)->Dump( f );
15324         fprintf( f, ")==(" );
15325         Arg<CNode*>(1)->Dump( f );
15326         fprintf( f, ")" );
15327         break;
15328     case eNE:
15329         fprintf( f, "(" );
15330         Arg<CNode*>(0)->Dump( f );
15331         fprintf( f, ")!=(" );
15332         Arg<CNode*>(1)->Dump( f );
15333         fprintf( f, ")" );
15334         break;
15335     case eRAND:
15336         fprintf( f, "&(" );
15337         Arg<CNode*>(0)->Dump( f );
15338         fprintf( f, ")" );
15339         break;
15340     case eRNAND:
15341         fprintf( f, "~&(" );
15342         Arg<CNode*>(0)->Dump( f );
15343         fprintf( f, ")" );
15344         break;
15345     case eROR:
15346         fprintf( f, "|(" );
15347         Arg<CNode*>(0)->Dump( f );
15348         fprintf( f, ")" );
15349         break;
15350     case eRNOR:
15351         fprintf( f, "~|(" );
15352         Arg<CNode*>(0)->Dump( f );
15353         fprintf( f, ")" );
15354         break;
15355     case eRXOR:
15356         fprintf( f, "^(" );
15357         Arg<CNode*>(0)->Dump( f );
15358         fprintf( f, ")" );
15359         break;
15360     case eRXNOR:
15361         fprintf( f, "~^(" );
15362         Arg<CNode*>(0)->Dump( f );
15363         fprintf( f, ")" );
15364         break;
15365     case eHOOK:
15366         fprintf( f, "(" );
15367         Arg<CNode*>(0)->Dump( f );
15368         fprintf( f, ")?(" );
15369         Arg<CNode*>(1)->Dump( f );
15370         fprintf( f, "):(" );
15371         Arg<CNode*>(2)->Dump( f );
15372         fprintf( f, ")" );
15373         break;
15374     case eINIT:
15375         fprintf( f, "INIT(*)" );
15376         break;
15377     case ePOSEDGE:
15378         fprintf( f, "POSEDGE(" );
15379         Arg<CNode*>(0)->Dump( f );
15380         fprintf( f, ")" );
15381         break;
15382     case eNEGEDGE:
15383         fprintf( f, "NEGEDGE(" );
15384         Arg<CNode*>(0)->Dump( f );
15385         fprintf( f, ")" );
15386         break;
15387     case eEDGE:
15388         fprintf( f, "EDGE(" );
15389         Arg<CNode*>(0)->Dump( f );
15390         fprintf( f, ")" );
15391         break;
15392     case eMTM:
15393         fprintf( f, "(" );
15394         Arg<CNode*>(0)->Dump( f );
15395         fprintf( f, ":" );
15396         Arg<CNode*>(1)->Dump( f );
15397         fprintf( f, ":" );
15398         Arg<CNode*>(2)->Dump( f );
15399         fprintf( f, ")" );
15400         break;
15401     case eMODULE_DEF:
15402         fprintf( f, "MODULE_DEF" );
15403         break;
15404     case eMACRO_EXPR:
15405         fprintf( f, "" );
15406         fprintf( f, "%s", (const char*)Arg<const char*>(0) );
15407         fprintf( f, "<" );
15408         Arg<CNode*>(1)->Dump( f );
15409         fprintf( f, ">" );
15410         break;
15411     case eMEMBER:
15412         fprintf( f, "" );
15413         Arg<CNode*>(0)->Dump( f );
15414         fprintf( f, "." );
15415         fprintf( f, "%s", Arg<CSymbol*>(1)->GetName() );
15416         fprintf( f, "" );
15417         break;
15418     case ePREINC:
15419         fprintf( f, "++(" );
15420         Arg<CNode*>(0)->Dump( f );
15421         fprintf( f, ")" );
15422         break;
15423     case ePOSTINC:
15424         fprintf( f, "(" );
15425         Arg<CNode*>(0)->Dump( f );
15426         fprintf( f, ")++" );
15427         break;
15428     case ePREDEC:
15429         fprintf( f, "--(" );
15430         Arg<CNode*>(0)->Dump( f );
15431         fprintf( f, ")" );
15432         break;
15433     case ePOSTDEC:
15434         fprintf( f, "(" );
15435         Arg<CNode*>(0)->Dump( f );
15436         fprintf( f, ")--" );
15437         break;
15438     case eCAST:
15439         fprintf( f, "CAST(" );
15440         Arg<CNode*>(0)->Dump( f );
15441         fprintf( f, "," );
15442         Arg<CNode*>(1)->Dump( f );
15443         fprintf( f, ")" );
15444         break;
15445     case eCOMMENT:
15446     case eVRQ:
15447     case eNOP:
15448     case eINSTANCE_REF:
15449     case eGATE_REF:
15450     case eTASK_ENABLE:
15451     case eSYSTASK_CALL:
15452     case eTIMING_CALL:
15453     case eNET_DECL:
15454     case ePARAM_DECL:
15455     case eSPECPARAM_DECL:
15456     case ePORT_DECL:
15457     case eGENVAR_DECL:
15458     case eTYPEDEF_DECL:
15459     case eALWAYS:
15460     case eALWAYS_LATCH:
15461     case eALWAYS_FF:
15462     case eALWAYS_COMB:
15463     case eEVENT:
15464     case eBLOCK_REF:
15465     case eSPECIFY_REF:
15466     case eASSIGN:
15467     case eADD_ASSIGN:
15468     case eSUB_ASSIGN:
15469     case eMUL_ASSIGN:
15470     case eDIV_ASSIGN:
15471     case eMOD_ASSIGN:
15472     case eAND_ASSIGN:
15473     case eOR_ASSIGN:
15474     case eXOR_ASSIGN:
15475     case eLSH_ASSIGN:
15476     case eRSH_ASSIGN:
15477     case eLSHA_ASSIGN:
15478     case eRSHA_ASSIGN:
15479     case eFORCE:
15480     case eRELEASE:
15481     case eNBASSIGN:
15482     case eEVOR:
15483     case eDELAY:
15484     case eIF:
15485     case eFOREVER:
15486     case eREPEAT:
15487     case eWHILE:
15488     case eWAIT:
15489     case eFOR:
15490     case eCASE:
15491     case eCASEX:
15492     case eCASEZ:
15493     case eCASEITEM:
15494     case eCASSIGN:
15495     case eARG:
15496     case eFUNCTION_DEF:
15497     case eREPEAT_CONTROL:
15498     case eDELAY_CONTROL:
15499     case eEVENT_CONTROL:
15500     case eEXTERNAL_REF:
15501     case ePORT_DEF:
15502     case eDEFPARAM:
15503     case ePATH:
15504     case ePATH_ASSIGN:
15505     case eIFNONE_PATH_ASSIGN:
15506     case eTRIGGER:
15507     case ePASSIGN:
15508     case eDEASSIGN:
15509     case eDISABLE:
15510     case eATTRIBUTE:
15511     case eGIF:
15512     case eGFOR:
15513     case eGCASE:
15514     case eTABLE:
15515     case eTABLE_ENTRY:
15516     case eTABLE_SYMBOL:
15517     case ePORTLIST_END:
15518     case eENUM_SPEC:
15519     case eRETURN:
15520         fprintf( f, "%s(%p)", nodeOpName[GetOp()],this );
15521         break;
15522     }
15523 }
15524 
15525 #endif // DEFINE_METHODS
15526 
15527 #ifdef DEFINE_TEST_HARNESS
15528 void CNodeTestHarness()
15529 {
15530     for( int i = 0; i < 150; ++i ) {
15531         CNode* n = new(CNode::stack) CNode( NULL, (NodeOp_t)i );
15532         if( n->Precedence() != n->Precedence_1() ) {
15533             printf( "Fail %s\n", nodeOpName[i] );
15534             exit(1); 
15535         } 
15536     }
15537 }
15538 #endif // DEFINE_TEST_HARNESS