00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00504 #ifdef DEFINE_ENUM
00505
00508 enum NodeOp_t {
00512
00513
00514
00515
00516
00517 eERROR,
00521
00522
00523
00524
00525
00526
00527 eVCONSTANT,
00531
00532
00533
00534
00535
00536
00537 eRCONSTANT,
00541
00542
00543
00544
00545
00546
00547 eCOMMENT,
00551
00552
00553
00554
00555
00556
00557 eVRQ,
00561
00562
00563
00564
00565
00566
00567 ePRAGMA,
00571
00572
00573
00574
00575
00576
00577
00578 eELIST,
00582
00583
00584
00585
00586
00587
00588
00589 eWIDTH,
00593
00594
00595
00596
00597
00598 eNOP,
00602
00603
00604
00605
00606
00607
00608
00609 eSUB,
00613
00614
00615
00616
00617
00618
00619
00620 eMUL,
00624
00625
00626
00627
00628
00629
00630
00631 eDIV,
00635
00636
00637
00638
00639
00640
00641
00642 ePOW,
00646
00647
00648
00649
00650
00651
00652
00653 eADD,
00657
00658
00659
00660
00661
00662
00663
00664 eLSH,
00668
00669
00670
00671
00672
00673
00674
00675 eRSH,
00679
00680
00681
00682
00683
00684
00685
00686 eLSHA,
00690
00691
00692
00693
00694
00695
00696
00697 eRSHA,
00701
00702
00703
00704
00705
00706
00707
00708 eMOD,
00712
00713
00714
00715
00716
00717
00718
00719 eOR,
00723
00724
00725
00726
00727
00728
00729
00730 eAND,
00734
00735
00736
00737
00738
00739
00740
00741 eANDANDAND,
00745
00746
00747
00748
00749
00750
00751
00752 eXOR,
00756
00757
00758
00759
00760
00761
00762
00763 eXNOR,
00767
00768
00769
00770
00771
00772
00773 eINSTANCE_REF,
00777
00778
00779
00780
00781
00782
00783 eGATE_REF,
00787
00788
00789
00790
00791
00792
00793
00794 eTASK_ENABLE,
00798
00799
00800
00801
00802
00803
00804
00805 eSYSTASK_CALL,
00809
00810
00811
00812
00813
00814
00815
00816 eTIMING_CALL,
00820
00821
00822
00823
00824
00825
00826
00827
00828 eFUNCTION_CALL,
00832
00833
00834
00835
00836
00837
00838
00839 eARRAY,
00843
00844
00845
00846
00847
00848
00849 eNET_REF,
00853
00854
00855
00856
00857
00858
00859 eVAR_REF,
00863
00864
00865
00866
00867
00868
00869 ePARAM_REF,
00873
00874
00875
00876
00877
00878
00879 ePORT_REF,
00883
00884
00885
00886
00887
00888
00889 eFWD_REF,
00893
00894
00895
00896
00897
00898
00899 eGENVAR_REF,
00903
00904
00905
00906
00907
00908
00909
00910 eNET_DECL,
00914
00915
00916
00917
00918
00919
00920
00921 eVAR_DECL,
00925
00926
00927
00928
00929
00930
00931 ePARAM_DECL,
00935
00936
00937
00938
00939
00940
00941 eSPECPARAM_DECL,
00945
00946
00947
00948
00949
00950
00951 ePORT_DECL,
00955
00956
00957
00958
00959
00960
00961 eGENVAR_DECL,
00965
00966
00967
00968
00969
00970
00971
00972 eLIST,
00976
00977
00978
00979
00980
00981
00982
00983 eRANGE,
00987
00988
00989
00990
00991
00992
00993
00994 eSLICE,
00998
00999
01000
01001
01002
01003
01004
01005 ePSLICE,
01009
01010
01011
01012
01013
01014
01015
01016 eMSLICE,
01020
01021
01022
01023
01024
01025
01026 eCVRI,
01030
01031
01032
01033
01034
01035
01036 eCVIR,
01040
01041
01042
01043
01044
01045
01046
01047 eREP,
01051
01052
01053
01054
01055
01056
01057
01058 eCAT,
01062
01063
01064
01065
01066
01067
01068 eUCAT,
01072
01073
01074
01075
01076
01077
01078 eCOM,
01082
01083
01084
01085
01086
01087
01088 eNEG,
01092
01093
01094
01095
01096
01097
01098 ePLUS,
01102
01103
01104
01105
01106
01107
01108 eNOT,
01112
01113
01114
01115
01116
01117
01118
01119 eGT,
01123
01124
01125
01126
01127
01128
01129
01130 eGE,
01134
01135
01136
01137
01138
01139
01140
01141 eLT,
01145
01146
01147
01148
01149
01150
01151
01152 eLE,
01156
01157
01158
01159
01160
01161
01162
01163 eLAND,
01167
01168
01169
01170
01171
01172
01173
01174 eLOR,
01178
01179
01180
01181
01182
01183
01184
01185 eCEQ,
01189
01190
01191
01192
01193
01194
01195
01196 eCNE,
01200
01201
01202
01203
01204
01205
01206
01207 eEQ,
01211
01212
01213
01214
01215
01216
01217
01218 eNE,
01222
01223
01224
01225
01226
01227
01228 eRAND,
01232
01233
01234
01235
01236
01237
01238 eRNAND,
01242
01243
01244
01245
01246
01247
01248 eROR,
01252
01253
01254
01255
01256
01257
01258 eRNOR,
01262
01263
01264
01265
01266
01267
01268 eRXOR,
01272
01273
01274
01275
01276
01277
01278 eRXNOR,
01282
01283
01284
01285
01286
01287
01288
01289
01290 eHOOK,
01294
01295
01296
01297
01298
01299
01300 eINIT,
01304
01305
01306
01307
01308
01309
01310 eALWAYS,
01314
01315
01316
01317
01318
01319
01320
01321 eEVENT,
01325
01326
01327
01328
01329
01330
01331
01332 eBLOCK_REF,
01336
01337
01338
01339
01340
01341
01342
01343 eSPECIFY_REF,
01347
01348
01349
01350
01351
01352
01353
01354
01355 eASSIGN,
01359
01360
01361
01362
01363
01364
01365
01366 eFORCE,
01370
01371
01372
01373
01374
01375
01376 eRELEASE,
01380
01381
01382
01383
01384
01385
01386
01387
01388 eNBASSIGN,
01392
01393
01394
01395
01396
01397
01398 ePOSEDGE,
01402
01403
01404
01405
01406
01407
01408 eNEGEDGE,
01412
01413
01414
01415
01416
01417
01418
01419 eEDGE,
01423
01424
01425
01426
01427
01428
01429
01430 eEVOR,
01434
01435
01436
01437
01438
01439
01440
01441 eDELAY,
01445
01446
01447
01448
01449
01450
01451
01452
01453 eMTM,
01457
01458
01459
01460
01461
01462
01463
01464
01465 eIF,
01469
01470
01471
01472
01473
01474
01475 eFOREVER,
01479
01480
01481
01482
01483
01484
01485
01486 eREPEAT,
01490
01491
01492
01493
01494
01495
01496
01497 eWHILE,
01501
01502
01503
01504
01505
01506
01507
01508 eWAIT,
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521 eFOR,
01525
01526
01527
01528
01529
01530
01531
01532 eCASE,
01536
01537
01538
01539
01540
01541
01542
01543 eCASEX,
01547
01548
01549
01550
01551
01552
01553
01554 eCASEZ,
01558
01559
01560
01561
01562
01563
01564
01565 eCASEITEM,
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578 eCASSIGN,
01582
01583
01584
01585
01586
01587
01588
01589 eARG,
01593
01594
01595
01596
01597
01598
01599 eFUNCTION_DEF,
01603
01604
01605
01606
01607
01608
01609 eMODULE_DEF,
01613
01614
01615
01616
01617
01618
01619
01620 eREPEAT_CONTROL,
01624
01625
01626
01627
01628
01629
01630 eDELAY_CONTROL,
01634
01635
01636
01637
01638
01639
01640 eEVENT_CONTROL,
01644
01645
01646
01647
01648
01649
01650 eEXTERNAL_REF,
01654
01655
01656
01657
01658
01659
01660 ePORT_DEF,
01664
01665
01666
01667
01668
01669
01670
01671 eDEFPARAM,
01675
01676
01677
01678
01679
01680
01681
01682
01683
01684
01685
01686
01687 ePATH,
01691
01692
01693
01694
01695
01696
01697
01698
01699 ePATH_ASSIGN,
01703
01704
01705
01706
01707
01708
01709
01710 eIFNONE_PATH_ASSIGN,
01714
01715
01716
01717
01718
01719
01720 eTRIGGER,
01724
01725
01726
01727
01728
01729
01730
01731 ePASSIGN,
01735
01736
01737
01738
01739
01740
01741 eDEASSIGN,
01745
01746
01747
01748
01749
01750
01751 eDISABLE,
01755
01756
01757
01758
01759
01760
01761 eATTRIBUTE,
01765
01766
01767
01768
01769
01770
01771
01772
01773 eGIF,
01777
01778
01779
01780
01781
01782
01783
01784
01785
01786 eGFOR,
01790
01791
01792
01793
01794
01795
01796
01797 eGCASE,
01801
01802
01803
01804
01805
01806
01807 eTABLE,
01811
01812
01813
01814
01815
01816
01817 eTABLE_ENTRY,
01821
01822
01823
01824
01825
01826
01827 eTABLE_SYMBOL,
01831
01832
01833
01834
01835
01836 ePORTLIST_END,
01840
01841
01842
01843
01844
01845
01846
01847 eMACRO_EXPR
01848 };
01849 extern const char* nodeOpName[];
01850 extern const char* nodeOpDescription[];
01851 #endif // DEFINE_ENUM
01852 #ifdef DEFINE_METHODS
01853 const char* nodeOpName[] = {
01854 "ERROR",
01855 "VCONSTANT",
01856 "RCONSTANT",
01857 "COMMENT",
01858 "VRQ",
01859 "PRAGMA",
01860 "ELIST",
01861 "WIDTH",
01862 "NOP",
01863 "SUB",
01864 "MUL",
01865 "DIV",
01866 "POW",
01867 "ADD",
01868 "LSH",
01869 "RSH",
01870 "LSHA",
01871 "RSHA",
01872 "MOD",
01873 "OR",
01874 "AND",
01875 "ANDANDAND",
01876 "XOR",
01877 "XNOR",
01878 "INSTANCE_REF",
01879 "GATE_REF",
01880 "TASK_ENABLE",
01881 "SYSTASK_CALL",
01882 "TIMING_CALL",
01883 "FUNCTION_CALL",
01884 "ARRAY",
01885 "NET_REF",
01886 "VAR_REF",
01887 "PARAM_REF",
01888 "PORT_REF",
01889 "FWD_REF",
01890 "GENVAR_REF",
01891 "NET_DECL",
01892 "VAR_DECL",
01893 "PARAM_DECL",
01894 "SPECPARAM_DECL",
01895 "PORT_DECL",
01896 "GENVAR_DECL",
01897 "LIST",
01898 "RANGE",
01899 "SLICE",
01900 "PSLICE",
01901 "MSLICE",
01902 "CVRI",
01903 "CVIR",
01904 "REP",
01905 "CAT",
01906 "UCAT",
01907 "COM",
01908 "NEG",
01909 "PLUS",
01910 "NOT",
01911 "GT",
01912 "GE",
01913 "LT",
01914 "LE",
01915 "LAND",
01916 "LOR",
01917 "CEQ",
01918 "CNE",
01919 "EQ",
01920 "NE",
01921 "RAND",
01922 "RNAND",
01923 "ROR",
01924 "RNOR",
01925 "RXOR",
01926 "RXNOR",
01927 "HOOK",
01928 "INIT",
01929 "ALWAYS",
01930 "EVENT",
01931 "BLOCK_REF",
01932 "SPECIFY_REF",
01933 "ASSIGN",
01934 "FORCE",
01935 "RELEASE",
01936 "NBASSIGN",
01937 "POSEDGE",
01938 "NEGEDGE",
01939 "EDGE",
01940 "EVOR",
01941 "DELAY",
01942 "MTM",
01943 "IF",
01944 "FOREVER",
01945 "REPEAT",
01946 "WHILE",
01947 "WAIT",
01948 "FOR",
01949 "CASE",
01950 "CASEX",
01951 "CASEZ",
01952 "CASEITEM",
01953 "CASSIGN",
01954 "ARG",
01955 "FUNCTION_DEF",
01956 "MODULE_DEF",
01957 "REPEAT_CONTROL",
01958 "DELAY_CONTROL",
01959 "EVENT_CONTROL",
01960 "EXTERNAL_REF",
01961 "PORT_DEF",
01962 "DEFPARAM",
01963 "PATH",
01964 "PATH_ASSIGN",
01965 "IFNONE_PATH_ASSIGN",
01966 "TRIGGER",
01967 "PASSIGN",
01968 "DEASSIGN",
01969 "DISABLE",
01970 "ATTRIBUTE",
01971 "GIF",
01972 "GFOR",
01973 "GCASE",
01974 "TABLE",
01975 "TABLE_ENTRY",
01976 "TABLE_SYMBOL",
01977 "PORTLIST_END",
01978 "MACRO_EXPR",
01979 NULL
01980 };
01981 const char* nodeOpDescription[] = {
01982 "error node",
01983 "vector constant",
01984 "real constant",
01985 "comment",
01986 "vrq comment",
01987 "program pragma",
01988 "expression list",
01989 "expression width change",
01990 "no operation",
01991 "subtract",
01992 "multiply",
01993 "divide",
01994 "exponent",
01995 "addition",
01996 "logical left shift",
01997 "logical right shift",
01998 "arithmetic left shift",
01999 "arithmetic right shift",
02000 "modulus",
02001 "bitwise or",
02002 "bitwise and",
02003 "triple and",
02004 "bitwise xor",
02005 "bitwise xnor",
02006 "instance reference",
02007 "gate instance",
02008 "call to a task",
02009 "call to enable a systask",
02010 "call to a timing task",
02011 "call to a function",
02012 "dimensioned reference (array/bit select)",
02013 "reference to net",
02014 "reference to variable",
02015 "reference to parameter",
02016 "reference to port",
02017 "reference to a forward declared variable",
02018 "reference to a genvar",
02019 "net declaration",
02020 "variable declaration",
02021 "parameter declaration",
02022 "specify parameter declaration",
02023 "port declaration",
02024 "genvar declaration",
02025 "list of nodes",
02026 "vector decl range specification",
02027 "vector subrange",
02028 "vector subrange with ascending index select",
02029 "vector subrange with descending index select",
02030 "convert real to integer",
02031 "convert integer to real",
02032 "replication operator",
02033 "concatenation operator",
02034 "unary concat",
02035 "bitwise complement",
02036 "negation",
02037 "unary plus",
02038 "logical complement",
02039 "greater than",
02040 "greater than or equal",
02041 "less than",
02042 "less than or equal",
02043 "logical and",
02044 "logical or",
02045 "case equal",
02046 "case not equal",
02047 "equal",
02048 "not equal",
02049 "reduction and",
02050 "reduction nand",
02051 "reduction or",
02052 "reduction nor",
02053 "reduction xor",
02054 "reduction xnor",
02055 "condition expression operator",
02056 "initial block",
02057 "always block",
02058 "event statement",
02059 "statement block",
02060 "specify block",
02061 "procedural assignment",
02062 "force statement",
02063 "release statement",
02064 "nonblocking assignment",
02065 "positive event qualifier",
02066 "negative event qualifier",
02067 "edge qualifier",
02068 "event or",
02069 "delay statement",
02070 "min/typ/max expression",
02071 "if statement",
02072 "forever statement",
02073 "repeat statement",
02074 "while statement",
02075 "wait statement",
02076 "for statement",
02077 "case statement",
02078 "casex statement",
02079 "casez statement",
02080 "case item",
02081 "continious assignment",
02082 "port connection",
02083 "function definition",
02084 "module definition",
02085 "repeat control",
02086 "delay control",
02087 "event control",
02088 "external reference",
02089 "port definition",
02090 "defparam statement",
02091 "path statement",
02092 "path assignment statement",
02093 "ifnone path assignment statement",
02094 "event trigger",
02095 "procedural assignment",
02096 "deassign statement",
02097 "disable statement",
02098 "attribute specification",
02099 "structural if statement",
02100 "structural for statement",
02101 "structural case statement",
02102 "udp table",
02103 "udp table entry",
02104 "udp table symbol",
02105 "sentinal at end of port list",
02106 "expression represented by a macro",
02107 NULL
02108 };
02109 #endif // DEFINE_METHODS
02110
02111
02112 #ifdef DEFINE_CONSTRUCTOR
02113
02121 inline CNode* cERROR( Coord_t* loc=NULL )
02122 {
02123 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eERROR );
02124 return n;
02125 }
02134 inline CNode* cERROR( CObstack* heap, Coord_t* loc=NULL )
02135 {
02136 CNode* n = new(heap) CNode( loc, eERROR );
02137 return n;
02138 }
02147 inline CNode* cVCONSTANT( CVector* a0, Coord_t* loc=NULL )
02148 {
02149 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVCONSTANT );
02150 n->Arg<CVector*>(0) = a0;
02151 return n;
02152 }
02162 inline CNode* cVCONSTANT( CObstack* heap, CVector* a0, Coord_t* loc=NULL )
02163 {
02164 CNode* n = new(heap) CNode( loc, eVCONSTANT );
02165 n->Arg<CVector*>(0) = a0;
02166 return n;
02167 }
02176 inline CNode* cRCONSTANT( char* a0, Coord_t* loc=NULL )
02177 {
02178 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRCONSTANT );
02179 n->Arg<char*>(0) = a0;
02180 return n;
02181 }
02191 inline CNode* cRCONSTANT( CObstack* heap, char* a0, Coord_t* loc=NULL )
02192 {
02193 CNode* n = new(heap) CNode( loc, eRCONSTANT );
02194 n->Arg<char*>(0) = a0;
02195 return n;
02196 }
02205 inline CNode* cCOMMENT( const char* a0, Coord_t* loc=NULL )
02206 {
02207 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCOMMENT );
02208 n->Arg<const char*>(0) = a0;
02209 return n;
02210 }
02220 inline CNode* cCOMMENT( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02221 {
02222 CNode* n = new(heap) CNode( loc, eCOMMENT );
02223 n->Arg<const char*>(0) = a0;
02224 return n;
02225 }
02234 inline CNode* cVRQ( const char* a0, Coord_t* loc=NULL )
02235 {
02236 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVRQ );
02237 n->Arg<const char*>(0) = a0;
02238 return n;
02239 }
02249 inline CNode* cVRQ( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02250 {
02251 CNode* n = new(heap) CNode( loc, eVRQ );
02252 n->Arg<const char*>(0) = a0;
02253 return n;
02254 }
02263 inline CNode* cPRAGMA( const char* a0, Coord_t* loc=NULL )
02264 {
02265 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePRAGMA );
02266 n->Arg<const char*>(0) = a0;
02267 return n;
02268 }
02278 inline CNode* cPRAGMA( CObstack* heap, const char* a0, Coord_t* loc=NULL )
02279 {
02280 CNode* n = new(heap) CNode( loc, ePRAGMA );
02281 n->Arg<const char*>(0) = a0;
02282 return n;
02283 }
02293 inline CNode* cELIST( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02294 {
02295 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eELIST );
02296 n->Arg<CNode*>(0) = a0;
02297 n->Arg<CNode*>(1) = a1;
02298 return n;
02299 }
02310 inline CNode* cELIST( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02311 {
02312 CNode* n = new(heap) CNode( loc, eELIST );
02313 n->Arg<CNode*>(0) = a0;
02314 n->Arg<CNode*>(1) = a1;
02315 return n;
02316 }
02326 inline CNode* cWIDTH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02327 {
02328 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWIDTH );
02329 n->Arg<CNode*>(0) = a0;
02330 n->Arg<CNode*>(1) = a1;
02331 return n;
02332 }
02343 inline CNode* cWIDTH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02344 {
02345 CNode* n = new(heap) CNode( loc, eWIDTH );
02346 n->Arg<CNode*>(0) = a0;
02347 n->Arg<CNode*>(1) = a1;
02348 return n;
02349 }
02357 inline CNode* cNOP( Coord_t* loc=NULL )
02358 {
02359 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNOP );
02360 return n;
02361 }
02370 inline CNode* cNOP( CObstack* heap, Coord_t* loc=NULL )
02371 {
02372 CNode* n = new(heap) CNode( loc, eNOP );
02373 return n;
02374 }
02384 inline CNode* cSUB( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02385 {
02386 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSUB );
02387 n->Arg<CNode*>(0) = a0;
02388 n->Arg<CNode*>(1) = a1;
02389 return n;
02390 }
02401 inline CNode* cSUB( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02402 {
02403 CNode* n = new(heap) CNode( loc, eSUB );
02404 n->Arg<CNode*>(0) = a0;
02405 n->Arg<CNode*>(1) = a1;
02406 return n;
02407 }
02417 inline CNode* cMUL( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02418 {
02419 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMUL );
02420 n->Arg<CNode*>(0) = a0;
02421 n->Arg<CNode*>(1) = a1;
02422 return n;
02423 }
02434 inline CNode* cMUL( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02435 {
02436 CNode* n = new(heap) CNode( loc, eMUL );
02437 n->Arg<CNode*>(0) = a0;
02438 n->Arg<CNode*>(1) = a1;
02439 return n;
02440 }
02450 inline CNode* cDIV( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02451 {
02452 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDIV );
02453 n->Arg<CNode*>(0) = a0;
02454 n->Arg<CNode*>(1) = a1;
02455 return n;
02456 }
02467 inline CNode* cDIV( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02468 {
02469 CNode* n = new(heap) CNode( loc, eDIV );
02470 n->Arg<CNode*>(0) = a0;
02471 n->Arg<CNode*>(1) = a1;
02472 return n;
02473 }
02483 inline CNode* cPOW( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02484 {
02485 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOW );
02486 n->Arg<CNode*>(0) = a0;
02487 n->Arg<CNode*>(1) = a1;
02488 return n;
02489 }
02500 inline CNode* cPOW( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02501 {
02502 CNode* n = new(heap) CNode( loc, ePOW );
02503 n->Arg<CNode*>(0) = a0;
02504 n->Arg<CNode*>(1) = a1;
02505 return n;
02506 }
02516 inline CNode* cADD( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02517 {
02518 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eADD );
02519 n->Arg<CNode*>(0) = a0;
02520 n->Arg<CNode*>(1) = a1;
02521 return n;
02522 }
02533 inline CNode* cADD( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02534 {
02535 CNode* n = new(heap) CNode( loc, eADD );
02536 n->Arg<CNode*>(0) = a0;
02537 n->Arg<CNode*>(1) = a1;
02538 return n;
02539 }
02549 inline CNode* cLSH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02550 {
02551 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSH );
02552 n->Arg<CNode*>(0) = a0;
02553 n->Arg<CNode*>(1) = a1;
02554 return n;
02555 }
02566 inline CNode* cLSH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02567 {
02568 CNode* n = new(heap) CNode( loc, eLSH );
02569 n->Arg<CNode*>(0) = a0;
02570 n->Arg<CNode*>(1) = a1;
02571 return n;
02572 }
02582 inline CNode* cRSH( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02583 {
02584 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSH );
02585 n->Arg<CNode*>(0) = a0;
02586 n->Arg<CNode*>(1) = a1;
02587 return n;
02588 }
02599 inline CNode* cRSH( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02600 {
02601 CNode* n = new(heap) CNode( loc, eRSH );
02602 n->Arg<CNode*>(0) = a0;
02603 n->Arg<CNode*>(1) = a1;
02604 return n;
02605 }
02615 inline CNode* cLSHA( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02616 {
02617 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLSHA );
02618 n->Arg<CNode*>(0) = a0;
02619 n->Arg<CNode*>(1) = a1;
02620 return n;
02621 }
02632 inline CNode* cLSHA( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02633 {
02634 CNode* n = new(heap) CNode( loc, eLSHA );
02635 n->Arg<CNode*>(0) = a0;
02636 n->Arg<CNode*>(1) = a1;
02637 return n;
02638 }
02648 inline CNode* cRSHA( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02649 {
02650 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRSHA );
02651 n->Arg<CNode*>(0) = a0;
02652 n->Arg<CNode*>(1) = a1;
02653 return n;
02654 }
02665 inline CNode* cRSHA( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02666 {
02667 CNode* n = new(heap) CNode( loc, eRSHA );
02668 n->Arg<CNode*>(0) = a0;
02669 n->Arg<CNode*>(1) = a1;
02670 return n;
02671 }
02681 inline CNode* cMOD( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02682 {
02683 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMOD );
02684 n->Arg<CNode*>(0) = a0;
02685 n->Arg<CNode*>(1) = a1;
02686 return n;
02687 }
02698 inline CNode* cMOD( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02699 {
02700 CNode* n = new(heap) CNode( loc, eMOD );
02701 n->Arg<CNode*>(0) = a0;
02702 n->Arg<CNode*>(1) = a1;
02703 return n;
02704 }
02714 inline CNode* cOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02715 {
02716 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eOR );
02717 n->Arg<CNode*>(0) = a0;
02718 n->Arg<CNode*>(1) = a1;
02719 return n;
02720 }
02731 inline CNode* cOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02732 {
02733 CNode* n = new(heap) CNode( loc, eOR );
02734 n->Arg<CNode*>(0) = a0;
02735 n->Arg<CNode*>(1) = a1;
02736 return n;
02737 }
02747 inline CNode* cAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02748 {
02749 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eAND );
02750 n->Arg<CNode*>(0) = a0;
02751 n->Arg<CNode*>(1) = a1;
02752 return n;
02753 }
02764 inline CNode* cAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02765 {
02766 CNode* n = new(heap) CNode( loc, eAND );
02767 n->Arg<CNode*>(0) = a0;
02768 n->Arg<CNode*>(1) = a1;
02769 return n;
02770 }
02780 inline CNode* cANDANDAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02781 {
02782 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eANDANDAND );
02783 n->Arg<CNode*>(0) = a0;
02784 n->Arg<CNode*>(1) = a1;
02785 return n;
02786 }
02797 inline CNode* cANDANDAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02798 {
02799 CNode* n = new(heap) CNode( loc, eANDANDAND );
02800 n->Arg<CNode*>(0) = a0;
02801 n->Arg<CNode*>(1) = a1;
02802 return n;
02803 }
02813 inline CNode* cXOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02814 {
02815 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eXOR );
02816 n->Arg<CNode*>(0) = a0;
02817 n->Arg<CNode*>(1) = a1;
02818 return n;
02819 }
02830 inline CNode* cXOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02831 {
02832 CNode* n = new(heap) CNode( loc, eXOR );
02833 n->Arg<CNode*>(0) = a0;
02834 n->Arg<CNode*>(1) = a1;
02835 return n;
02836 }
02846 inline CNode* cXNOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
02847 {
02848 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eXNOR );
02849 n->Arg<CNode*>(0) = a0;
02850 n->Arg<CNode*>(1) = a1;
02851 return n;
02852 }
02863 inline CNode* cXNOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
02864 {
02865 CNode* n = new(heap) CNode( loc, eXNOR );
02866 n->Arg<CNode*>(0) = a0;
02867 n->Arg<CNode*>(1) = a1;
02868 return n;
02869 }
02878 inline CNode* cINSTANCE_REF( CInstance* a0, Coord_t* loc=NULL )
02879 {
02880 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eINSTANCE_REF );
02881 n->Arg<CInstance*>(0) = a0;
02882 return n;
02883 }
02893 inline CNode* cINSTANCE_REF( CObstack* heap, CInstance* a0, Coord_t* loc=NULL )
02894 {
02895 CNode* n = new(heap) CNode( loc, eINSTANCE_REF );
02896 n->Arg<CInstance*>(0) = a0;
02897 return n;
02898 }
02907 inline CNode* cGATE_REF( CGate* a0, Coord_t* loc=NULL )
02908 {
02909 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGATE_REF );
02910 n->Arg<CGate*>(0) = a0;
02911 return n;
02912 }
02922 inline CNode* cGATE_REF( CObstack* heap, CGate* a0, Coord_t* loc=NULL )
02923 {
02924 CNode* n = new(heap) CNode( loc, eGATE_REF );
02925 n->Arg<CGate*>(0) = a0;
02926 return n;
02927 }
02937 inline CNode* cTASK_ENABLE( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
02938 {
02939 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTASK_ENABLE );
02940 n->Arg<CSymbol*>(0) = a0;
02941 n->Arg<CNode*>(1) = a1;
02942 return n;
02943 }
02954 inline CNode* cTASK_ENABLE( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
02955 {
02956 CNode* n = new(heap) CNode( loc, eTASK_ENABLE );
02957 n->Arg<CSymbol*>(0) = a0;
02958 n->Arg<CNode*>(1) = a1;
02959 return n;
02960 }
02970 inline CNode* cSYSTASK_CALL( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
02971 {
02972 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSYSTASK_CALL );
02973 n->Arg<CSymbol*>(0) = a0;
02974 n->Arg<CNode*>(1) = a1;
02975 return n;
02976 }
02987 inline CNode* cSYSTASK_CALL( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
02988 {
02989 CNode* n = new(heap) CNode( loc, eSYSTASK_CALL );
02990 n->Arg<CSymbol*>(0) = a0;
02991 n->Arg<CNode*>(1) = a1;
02992 return n;
02993 }
03003 inline CNode* cTIMING_CALL( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03004 {
03005 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTIMING_CALL );
03006 n->Arg<CSymbol*>(0) = a0;
03007 n->Arg<CNode*>(1) = a1;
03008 return n;
03009 }
03020 inline CNode* cTIMING_CALL( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
03021 {
03022 CNode* n = new(heap) CNode( loc, eTIMING_CALL );
03023 n->Arg<CSymbol*>(0) = a0;
03024 n->Arg<CNode*>(1) = a1;
03025 return n;
03026 }
03037 inline CNode* cFUNCTION_CALL( CSymbol* a0, CNode* a1, CScope* a2, Coord_t* loc=NULL )
03038 {
03039 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFUNCTION_CALL );
03040 n->Arg<CSymbol*>(0) = a0;
03041 n->Arg<CNode*>(1) = a1;
03042 n->Arg<CScope*>(2) = a2;
03043 return n;
03044 }
03056 inline CNode* cFUNCTION_CALL( CObstack* heap, CSymbol* a0, CNode* a1, CScope* a2, Coord_t* loc=NULL )
03057 {
03058 CNode* n = new(heap) CNode( loc, eFUNCTION_CALL );
03059 n->Arg<CSymbol*>(0) = a0;
03060 n->Arg<CNode*>(1) = a1;
03061 n->Arg<CScope*>(2) = a2;
03062 return n;
03063 }
03073 inline CNode* cARRAY( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03074 {
03075 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eARRAY );
03076 n->Arg<CNode*>(0) = a0;
03077 n->Arg<CNode*>(1) = a1;
03078 return n;
03079 }
03090 inline CNode* cARRAY( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03091 {
03092 CNode* n = new(heap) CNode( loc, eARRAY );
03093 n->Arg<CNode*>(0) = a0;
03094 n->Arg<CNode*>(1) = a1;
03095 return n;
03096 }
03105 inline CNode* cNET_REF( CNet* a0, Coord_t* loc=NULL )
03106 {
03107 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNET_REF );
03108 n->Arg<CNet*>(0) = a0;
03109 return n;
03110 }
03120 inline CNode* cNET_REF( CObstack* heap, CNet* a0, Coord_t* loc=NULL )
03121 {
03122 CNode* n = new(heap) CNode( loc, eNET_REF );
03123 n->Arg<CNet*>(0) = a0;
03124 return n;
03125 }
03134 inline CNode* cVAR_REF( CVar* a0, Coord_t* loc=NULL )
03135 {
03136 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVAR_REF );
03137 n->Arg<CVar*>(0) = a0;
03138 return n;
03139 }
03149 inline CNode* cVAR_REF( CObstack* heap, CVar* a0, Coord_t* loc=NULL )
03150 {
03151 CNode* n = new(heap) CNode( loc, eVAR_REF );
03152 n->Arg<CVar*>(0) = a0;
03153 return n;
03154 }
03163 inline CNode* cPARAM_REF( CParam* a0, Coord_t* loc=NULL )
03164 {
03165 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePARAM_REF );
03166 n->Arg<CParam*>(0) = a0;
03167 return n;
03168 }
03178 inline CNode* cPARAM_REF( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03179 {
03180 CNode* n = new(heap) CNode( loc, ePARAM_REF );
03181 n->Arg<CParam*>(0) = a0;
03182 return n;
03183 }
03192 inline CNode* cPORT_REF( CPortDir* a0, Coord_t* loc=NULL )
03193 {
03194 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_REF );
03195 n->Arg<CPortDir*>(0) = a0;
03196 return n;
03197 }
03207 inline CNode* cPORT_REF( CObstack* heap, CPortDir* a0, Coord_t* loc=NULL )
03208 {
03209 CNode* n = new(heap) CNode( loc, ePORT_REF );
03210 n->Arg<CPortDir*>(0) = a0;
03211 return n;
03212 }
03221 inline CNode* cFWD_REF( CFref* a0, Coord_t* loc=NULL )
03222 {
03223 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFWD_REF );
03224 n->Arg<CFref*>(0) = a0;
03225 return n;
03226 }
03236 inline CNode* cFWD_REF( CObstack* heap, CFref* a0, Coord_t* loc=NULL )
03237 {
03238 CNode* n = new(heap) CNode( loc, eFWD_REF );
03239 n->Arg<CFref*>(0) = a0;
03240 return n;
03241 }
03250 inline CNode* cGENVAR_REF( CGenvar* a0, Coord_t* loc=NULL )
03251 {
03252 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGENVAR_REF );
03253 n->Arg<CGenvar*>(0) = a0;
03254 return n;
03255 }
03265 inline CNode* cGENVAR_REF( CObstack* heap, CGenvar* a0, Coord_t* loc=NULL )
03266 {
03267 CNode* n = new(heap) CNode( loc, eGENVAR_REF );
03268 n->Arg<CGenvar*>(0) = a0;
03269 return n;
03270 }
03280 inline CNode* cNET_DECL( CNet* a0, CNode* a1, Coord_t* loc=NULL )
03281 {
03282 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNET_DECL );
03283 n->Arg<CNet*>(0) = a0;
03284 n->Arg<CNode*>(1) = a1;
03285 return n;
03286 }
03297 inline CNode* cNET_DECL( CObstack* heap, CNet* a0, CNode* a1, Coord_t* loc=NULL )
03298 {
03299 CNode* n = new(heap) CNode( loc, eNET_DECL );
03300 n->Arg<CNet*>(0) = a0;
03301 n->Arg<CNode*>(1) = a1;
03302 return n;
03303 }
03313 inline CNode* cVAR_DECL( CVar* a0, CNode* a1, Coord_t* loc=NULL )
03314 {
03315 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eVAR_DECL );
03316 n->Arg<CVar*>(0) = a0;
03317 n->Arg<CNode*>(1) = a1;
03318 return n;
03319 }
03330 inline CNode* cVAR_DECL( CObstack* heap, CVar* a0, CNode* a1, Coord_t* loc=NULL )
03331 {
03332 CNode* n = new(heap) CNode( loc, eVAR_DECL );
03333 n->Arg<CVar*>(0) = a0;
03334 n->Arg<CNode*>(1) = a1;
03335 return n;
03336 }
03345 inline CNode* cPARAM_DECL( CParam* a0, Coord_t* loc=NULL )
03346 {
03347 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePARAM_DECL );
03348 n->Arg<CParam*>(0) = a0;
03349 return n;
03350 }
03360 inline CNode* cPARAM_DECL( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03361 {
03362 CNode* n = new(heap) CNode( loc, ePARAM_DECL );
03363 n->Arg<CParam*>(0) = a0;
03364 return n;
03365 }
03374 inline CNode* cSPECPARAM_DECL( CParam* a0, Coord_t* loc=NULL )
03375 {
03376 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSPECPARAM_DECL );
03377 n->Arg<CParam*>(0) = a0;
03378 return n;
03379 }
03389 inline CNode* cSPECPARAM_DECL( CObstack* heap, CParam* a0, Coord_t* loc=NULL )
03390 {
03391 CNode* n = new(heap) CNode( loc, eSPECPARAM_DECL );
03392 n->Arg<CParam*>(0) = a0;
03393 return n;
03394 }
03403 inline CNode* cPORT_DECL( CPortDir* a0, Coord_t* loc=NULL )
03404 {
03405 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_DECL );
03406 n->Arg<CPortDir*>(0) = a0;
03407 return n;
03408 }
03418 inline CNode* cPORT_DECL( CObstack* heap, CPortDir* a0, Coord_t* loc=NULL )
03419 {
03420 CNode* n = new(heap) CNode( loc, ePORT_DECL );
03421 n->Arg<CPortDir*>(0) = a0;
03422 return n;
03423 }
03432 inline CNode* cGENVAR_DECL( CGenvar* a0, Coord_t* loc=NULL )
03433 {
03434 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGENVAR_DECL );
03435 n->Arg<CGenvar*>(0) = a0;
03436 return n;
03437 }
03447 inline CNode* cGENVAR_DECL( CObstack* heap, CGenvar* a0, Coord_t* loc=NULL )
03448 {
03449 CNode* n = new(heap) CNode( loc, eGENVAR_DECL );
03450 n->Arg<CGenvar*>(0) = a0;
03451 return n;
03452 }
03462 inline CNode* cLIST( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03463 {
03464 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLIST );
03465 n->Arg<CNode*>(0) = a0;
03466 n->Arg<CNode*>(1) = a1;
03467 return n;
03468 }
03479 inline CNode* cLIST( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03480 {
03481 CNode* n = new(heap) CNode( loc, eLIST );
03482 n->Arg<CNode*>(0) = a0;
03483 n->Arg<CNode*>(1) = a1;
03484 return n;
03485 }
03495 inline CNode* cRANGE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03496 {
03497 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRANGE );
03498 n->Arg<CNode*>(0) = a0;
03499 n->Arg<CNode*>(1) = a1;
03500 return n;
03501 }
03512 inline CNode* cRANGE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03513 {
03514 CNode* n = new(heap) CNode( loc, eRANGE );
03515 n->Arg<CNode*>(0) = a0;
03516 n->Arg<CNode*>(1) = a1;
03517 return n;
03518 }
03528 inline CNode* cSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03529 {
03530 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSLICE );
03531 n->Arg<CNode*>(0) = a0;
03532 n->Arg<CNode*>(1) = a1;
03533 return n;
03534 }
03545 inline CNode* cSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03546 {
03547 CNode* n = new(heap) CNode( loc, eSLICE );
03548 n->Arg<CNode*>(0) = a0;
03549 n->Arg<CNode*>(1) = a1;
03550 return n;
03551 }
03561 inline CNode* cPSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03562 {
03563 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePSLICE );
03564 n->Arg<CNode*>(0) = a0;
03565 n->Arg<CNode*>(1) = a1;
03566 return n;
03567 }
03578 inline CNode* cPSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03579 {
03580 CNode* n = new(heap) CNode( loc, ePSLICE );
03581 n->Arg<CNode*>(0) = a0;
03582 n->Arg<CNode*>(1) = a1;
03583 return n;
03584 }
03594 inline CNode* cMSLICE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03595 {
03596 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMSLICE );
03597 n->Arg<CNode*>(0) = a0;
03598 n->Arg<CNode*>(1) = a1;
03599 return n;
03600 }
03611 inline CNode* cMSLICE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03612 {
03613 CNode* n = new(heap) CNode( loc, eMSLICE );
03614 n->Arg<CNode*>(0) = a0;
03615 n->Arg<CNode*>(1) = a1;
03616 return n;
03617 }
03626 inline CNode* cCVRI( CNode* a0, Coord_t* loc=NULL )
03627 {
03628 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCVRI );
03629 n->Arg<CNode*>(0) = a0;
03630 return n;
03631 }
03641 inline CNode* cCVRI( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03642 {
03643 CNode* n = new(heap) CNode( loc, eCVRI );
03644 n->Arg<CNode*>(0) = a0;
03645 return n;
03646 }
03655 inline CNode* cCVIR( CNode* a0, Coord_t* loc=NULL )
03656 {
03657 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCVIR );
03658 n->Arg<CNode*>(0) = a0;
03659 return n;
03660 }
03670 inline CNode* cCVIR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03671 {
03672 CNode* n = new(heap) CNode( loc, eCVIR );
03673 n->Arg<CNode*>(0) = a0;
03674 return n;
03675 }
03685 inline CNode* cREP( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03686 {
03687 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREP );
03688 n->Arg<CNode*>(0) = a0;
03689 n->Arg<CNode*>(1) = a1;
03690 return n;
03691 }
03702 inline CNode* cREP( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03703 {
03704 CNode* n = new(heap) CNode( loc, eREP );
03705 n->Arg<CNode*>(0) = a0;
03706 n->Arg<CNode*>(1) = a1;
03707 return n;
03708 }
03718 inline CNode* cCAT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03719 {
03720 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCAT );
03721 n->Arg<CNode*>(0) = a0;
03722 n->Arg<CNode*>(1) = a1;
03723 return n;
03724 }
03735 inline CNode* cCAT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03736 {
03737 CNode* n = new(heap) CNode( loc, eCAT );
03738 n->Arg<CNode*>(0) = a0;
03739 n->Arg<CNode*>(1) = a1;
03740 return n;
03741 }
03750 inline CNode* cUCAT( CNode* a0, Coord_t* loc=NULL )
03751 {
03752 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eUCAT );
03753 n->Arg<CNode*>(0) = a0;
03754 return n;
03755 }
03765 inline CNode* cUCAT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03766 {
03767 CNode* n = new(heap) CNode( loc, eUCAT );
03768 n->Arg<CNode*>(0) = a0;
03769 return n;
03770 }
03779 inline CNode* cCOM( CNode* a0, Coord_t* loc=NULL )
03780 {
03781 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCOM );
03782 n->Arg<CNode*>(0) = a0;
03783 return n;
03784 }
03794 inline CNode* cCOM( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03795 {
03796 CNode* n = new(heap) CNode( loc, eCOM );
03797 n->Arg<CNode*>(0) = a0;
03798 return n;
03799 }
03808 inline CNode* cNEG( CNode* a0, Coord_t* loc=NULL )
03809 {
03810 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNEG );
03811 n->Arg<CNode*>(0) = a0;
03812 return n;
03813 }
03823 inline CNode* cNEG( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03824 {
03825 CNode* n = new(heap) CNode( loc, eNEG );
03826 n->Arg<CNode*>(0) = a0;
03827 return n;
03828 }
03837 inline CNode* cPLUS( CNode* a0, Coord_t* loc=NULL )
03838 {
03839 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePLUS );
03840 n->Arg<CNode*>(0) = a0;
03841 return n;
03842 }
03852 inline CNode* cPLUS( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03853 {
03854 CNode* n = new(heap) CNode( loc, ePLUS );
03855 n->Arg<CNode*>(0) = a0;
03856 return n;
03857 }
03866 inline CNode* cNOT( CNode* a0, Coord_t* loc=NULL )
03867 {
03868 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNOT );
03869 n->Arg<CNode*>(0) = a0;
03870 return n;
03871 }
03881 inline CNode* cNOT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
03882 {
03883 CNode* n = new(heap) CNode( loc, eNOT );
03884 n->Arg<CNode*>(0) = a0;
03885 return n;
03886 }
03896 inline CNode* cGT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03897 {
03898 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGT );
03899 n->Arg<CNode*>(0) = a0;
03900 n->Arg<CNode*>(1) = a1;
03901 return n;
03902 }
03913 inline CNode* cGT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03914 {
03915 CNode* n = new(heap) CNode( loc, eGT );
03916 n->Arg<CNode*>(0) = a0;
03917 n->Arg<CNode*>(1) = a1;
03918 return n;
03919 }
03929 inline CNode* cGE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03930 {
03931 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGE );
03932 n->Arg<CNode*>(0) = a0;
03933 n->Arg<CNode*>(1) = a1;
03934 return n;
03935 }
03946 inline CNode* cGE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03947 {
03948 CNode* n = new(heap) CNode( loc, eGE );
03949 n->Arg<CNode*>(0) = a0;
03950 n->Arg<CNode*>(1) = a1;
03951 return n;
03952 }
03962 inline CNode* cLT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03963 {
03964 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLT );
03965 n->Arg<CNode*>(0) = a0;
03966 n->Arg<CNode*>(1) = a1;
03967 return n;
03968 }
03979 inline CNode* cLT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
03980 {
03981 CNode* n = new(heap) CNode( loc, eLT );
03982 n->Arg<CNode*>(0) = a0;
03983 n->Arg<CNode*>(1) = a1;
03984 return n;
03985 }
03995 inline CNode* cLE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
03996 {
03997 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLE );
03998 n->Arg<CNode*>(0) = a0;
03999 n->Arg<CNode*>(1) = a1;
04000 return n;
04001 }
04012 inline CNode* cLE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04013 {
04014 CNode* n = new(heap) CNode( loc, eLE );
04015 n->Arg<CNode*>(0) = a0;
04016 n->Arg<CNode*>(1) = a1;
04017 return n;
04018 }
04028 inline CNode* cLAND( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04029 {
04030 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLAND );
04031 n->Arg<CNode*>(0) = a0;
04032 n->Arg<CNode*>(1) = a1;
04033 return n;
04034 }
04045 inline CNode* cLAND( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04046 {
04047 CNode* n = new(heap) CNode( loc, eLAND );
04048 n->Arg<CNode*>(0) = a0;
04049 n->Arg<CNode*>(1) = a1;
04050 return n;
04051 }
04061 inline CNode* cLOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04062 {
04063 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eLOR );
04064 n->Arg<CNode*>(0) = a0;
04065 n->Arg<CNode*>(1) = a1;
04066 return n;
04067 }
04078 inline CNode* cLOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04079 {
04080 CNode* n = new(heap) CNode( loc, eLOR );
04081 n->Arg<CNode*>(0) = a0;
04082 n->Arg<CNode*>(1) = a1;
04083 return n;
04084 }
04094 inline CNode* cCEQ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04095 {
04096 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCEQ );
04097 n->Arg<CNode*>(0) = a0;
04098 n->Arg<CNode*>(1) = a1;
04099 return n;
04100 }
04111 inline CNode* cCEQ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04112 {
04113 CNode* n = new(heap) CNode( loc, eCEQ );
04114 n->Arg<CNode*>(0) = a0;
04115 n->Arg<CNode*>(1) = a1;
04116 return n;
04117 }
04127 inline CNode* cCNE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04128 {
04129 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCNE );
04130 n->Arg<CNode*>(0) = a0;
04131 n->Arg<CNode*>(1) = a1;
04132 return n;
04133 }
04144 inline CNode* cCNE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04145 {
04146 CNode* n = new(heap) CNode( loc, eCNE );
04147 n->Arg<CNode*>(0) = a0;
04148 n->Arg<CNode*>(1) = a1;
04149 return n;
04150 }
04160 inline CNode* cEQ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04161 {
04162 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEQ );
04163 n->Arg<CNode*>(0) = a0;
04164 n->Arg<CNode*>(1) = a1;
04165 return n;
04166 }
04177 inline CNode* cEQ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04178 {
04179 CNode* n = new(heap) CNode( loc, eEQ );
04180 n->Arg<CNode*>(0) = a0;
04181 n->Arg<CNode*>(1) = a1;
04182 return n;
04183 }
04193 inline CNode* cNE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04194 {
04195 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNE );
04196 n->Arg<CNode*>(0) = a0;
04197 n->Arg<CNode*>(1) = a1;
04198 return n;
04199 }
04210 inline CNode* cNE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04211 {
04212 CNode* n = new(heap) CNode( loc, eNE );
04213 n->Arg<CNode*>(0) = a0;
04214 n->Arg<CNode*>(1) = a1;
04215 return n;
04216 }
04225 inline CNode* cRAND( CNode* a0, Coord_t* loc=NULL )
04226 {
04227 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRAND );
04228 n->Arg<CNode*>(0) = a0;
04229 return n;
04230 }
04240 inline CNode* cRAND( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04241 {
04242 CNode* n = new(heap) CNode( loc, eRAND );
04243 n->Arg<CNode*>(0) = a0;
04244 return n;
04245 }
04254 inline CNode* cRNAND( CNode* a0, Coord_t* loc=NULL )
04255 {
04256 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRNAND );
04257 n->Arg<CNode*>(0) = a0;
04258 return n;
04259 }
04269 inline CNode* cRNAND( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04270 {
04271 CNode* n = new(heap) CNode( loc, eRNAND );
04272 n->Arg<CNode*>(0) = a0;
04273 return n;
04274 }
04283 inline CNode* cROR( CNode* a0, Coord_t* loc=NULL )
04284 {
04285 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eROR );
04286 n->Arg<CNode*>(0) = a0;
04287 return n;
04288 }
04298 inline CNode* cROR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04299 {
04300 CNode* n = new(heap) CNode( loc, eROR );
04301 n->Arg<CNode*>(0) = a0;
04302 return n;
04303 }
04312 inline CNode* cRNOR( CNode* a0, Coord_t* loc=NULL )
04313 {
04314 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRNOR );
04315 n->Arg<CNode*>(0) = a0;
04316 return n;
04317 }
04327 inline CNode* cRNOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04328 {
04329 CNode* n = new(heap) CNode( loc, eRNOR );
04330 n->Arg<CNode*>(0) = a0;
04331 return n;
04332 }
04341 inline CNode* cRXOR( CNode* a0, Coord_t* loc=NULL )
04342 {
04343 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRXOR );
04344 n->Arg<CNode*>(0) = a0;
04345 return n;
04346 }
04356 inline CNode* cRXOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04357 {
04358 CNode* n = new(heap) CNode( loc, eRXOR );
04359 n->Arg<CNode*>(0) = a0;
04360 return n;
04361 }
04370 inline CNode* cRXNOR( CNode* a0, Coord_t* loc=NULL )
04371 {
04372 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRXNOR );
04373 n->Arg<CNode*>(0) = a0;
04374 return n;
04375 }
04385 inline CNode* cRXNOR( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04386 {
04387 CNode* n = new(heap) CNode( loc, eRXNOR );
04388 n->Arg<CNode*>(0) = a0;
04389 return n;
04390 }
04401 inline CNode* cHOOK( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04402 {
04403 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eHOOK );
04404 n->Arg<CNode*>(0) = a0;
04405 n->Arg<CNode*>(1) = a1;
04406 n->Arg<CNode*>(2) = a2;
04407 return n;
04408 }
04420 inline CNode* cHOOK( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04421 {
04422 CNode* n = new(heap) CNode( loc, eHOOK );
04423 n->Arg<CNode*>(0) = a0;
04424 n->Arg<CNode*>(1) = a1;
04425 n->Arg<CNode*>(2) = a2;
04426 return n;
04427 }
04436 inline CNode* cINIT( CNode* a0, Coord_t* loc=NULL )
04437 {
04438 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eINIT );
04439 n->Arg<CNode*>(0) = a0;
04440 return n;
04441 }
04451 inline CNode* cINIT( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04452 {
04453 CNode* n = new(heap) CNode( loc, eINIT );
04454 n->Arg<CNode*>(0) = a0;
04455 return n;
04456 }
04465 inline CNode* cALWAYS( CNode* a0, Coord_t* loc=NULL )
04466 {
04467 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eALWAYS );
04468 n->Arg<CNode*>(0) = a0;
04469 return n;
04470 }
04480 inline CNode* cALWAYS( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04481 {
04482 CNode* n = new(heap) CNode( loc, eALWAYS );
04483 n->Arg<CNode*>(0) = a0;
04484 return n;
04485 }
04495 inline CNode* cEVENT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04496 {
04497 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVENT );
04498 n->Arg<CNode*>(0) = a0;
04499 n->Arg<CNode*>(1) = a1;
04500 return n;
04501 }
04512 inline CNode* cEVENT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04513 {
04514 CNode* n = new(heap) CNode( loc, eEVENT );
04515 n->Arg<CNode*>(0) = a0;
04516 n->Arg<CNode*>(1) = a1;
04517 return n;
04518 }
04528 inline CNode* cBLOCK_REF( CBlock* a0, CNode* a1, Coord_t* loc=NULL )
04529 {
04530 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eBLOCK_REF );
04531 n->Arg<CBlock*>(0) = a0;
04532 n->Arg<CNode*>(1) = a1;
04533 return n;
04534 }
04545 inline CNode* cBLOCK_REF( CObstack* heap, CBlock* a0, CNode* a1, Coord_t* loc=NULL )
04546 {
04547 CNode* n = new(heap) CNode( loc, eBLOCK_REF );
04548 n->Arg<CBlock*>(0) = a0;
04549 n->Arg<CNode*>(1) = a1;
04550 return n;
04551 }
04561 inline CNode* cSPECIFY_REF( CSpecify* a0, CNode* a1, Coord_t* loc=NULL )
04562 {
04563 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eSPECIFY_REF );
04564 n->Arg<CSpecify*>(0) = a0;
04565 n->Arg<CNode*>(1) = a1;
04566 return n;
04567 }
04578 inline CNode* cSPECIFY_REF( CObstack* heap, CSpecify* a0, CNode* a1, Coord_t* loc=NULL )
04579 {
04580 CNode* n = new(heap) CNode( loc, eSPECIFY_REF );
04581 n->Arg<CSpecify*>(0) = a0;
04582 n->Arg<CNode*>(1) = a1;
04583 return n;
04584 }
04595 inline CNode* cASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04596 {
04597 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eASSIGN );
04598 n->Arg<CNode*>(0) = a0;
04599 n->Arg<CNode*>(1) = a1;
04600 n->Arg<CNode*>(2) = a2;
04601 return n;
04602 }
04614 inline CNode* cASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04615 {
04616 CNode* n = new(heap) CNode( loc, eASSIGN );
04617 n->Arg<CNode*>(0) = a0;
04618 n->Arg<CNode*>(1) = a1;
04619 n->Arg<CNode*>(2) = a2;
04620 return n;
04621 }
04631 inline CNode* cFORCE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04632 {
04633 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFORCE );
04634 n->Arg<CNode*>(0) = a0;
04635 n->Arg<CNode*>(1) = a1;
04636 return n;
04637 }
04648 inline CNode* cFORCE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04649 {
04650 CNode* n = new(heap) CNode( loc, eFORCE );
04651 n->Arg<CNode*>(0) = a0;
04652 n->Arg<CNode*>(1) = a1;
04653 return n;
04654 }
04663 inline CNode* cRELEASE( CNode* a0, Coord_t* loc=NULL )
04664 {
04665 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eRELEASE );
04666 n->Arg<CNode*>(0) = a0;
04667 return n;
04668 }
04678 inline CNode* cRELEASE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04679 {
04680 CNode* n = new(heap) CNode( loc, eRELEASE );
04681 n->Arg<CNode*>(0) = a0;
04682 return n;
04683 }
04694 inline CNode* cNBASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04695 {
04696 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNBASSIGN );
04697 n->Arg<CNode*>(0) = a0;
04698 n->Arg<CNode*>(1) = a1;
04699 n->Arg<CNode*>(2) = a2;
04700 return n;
04701 }
04713 inline CNode* cNBASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04714 {
04715 CNode* n = new(heap) CNode( loc, eNBASSIGN );
04716 n->Arg<CNode*>(0) = a0;
04717 n->Arg<CNode*>(1) = a1;
04718 n->Arg<CNode*>(2) = a2;
04719 return n;
04720 }
04729 inline CNode* cPOSEDGE( CNode* a0, Coord_t* loc=NULL )
04730 {
04731 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePOSEDGE );
04732 n->Arg<CNode*>(0) = a0;
04733 return n;
04734 }
04744 inline CNode* cPOSEDGE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04745 {
04746 CNode* n = new(heap) CNode( loc, ePOSEDGE );
04747 n->Arg<CNode*>(0) = a0;
04748 return n;
04749 }
04758 inline CNode* cNEGEDGE( CNode* a0, Coord_t* loc=NULL )
04759 {
04760 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eNEGEDGE );
04761 n->Arg<CNode*>(0) = a0;
04762 return n;
04763 }
04773 inline CNode* cNEGEDGE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04774 {
04775 CNode* n = new(heap) CNode( loc, eNEGEDGE );
04776 n->Arg<CNode*>(0) = a0;
04777 return n;
04778 }
04788 inline CNode* cEDGE( CNode* a0, Edge_t a1, Coord_t* loc=NULL )
04789 {
04790 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEDGE );
04791 n->Arg<CNode*>(0) = a0;
04792 n->Arg<Edge_t>(1) = a1;
04793 return n;
04794 }
04805 inline CNode* cEDGE( CObstack* heap, CNode* a0, Edge_t a1, Coord_t* loc=NULL )
04806 {
04807 CNode* n = new(heap) CNode( loc, eEDGE );
04808 n->Arg<CNode*>(0) = a0;
04809 n->Arg<Edge_t>(1) = a1;
04810 return n;
04811 }
04821 inline CNode* cEVOR( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04822 {
04823 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVOR );
04824 n->Arg<CNode*>(0) = a0;
04825 n->Arg<CNode*>(1) = a1;
04826 return n;
04827 }
04838 inline CNode* cEVOR( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04839 {
04840 CNode* n = new(heap) CNode( loc, eEVOR );
04841 n->Arg<CNode*>(0) = a0;
04842 n->Arg<CNode*>(1) = a1;
04843 return n;
04844 }
04854 inline CNode* cDELAY( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04855 {
04856 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDELAY );
04857 n->Arg<CNode*>(0) = a0;
04858 n->Arg<CNode*>(1) = a1;
04859 return n;
04860 }
04871 inline CNode* cDELAY( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
04872 {
04873 CNode* n = new(heap) CNode( loc, eDELAY );
04874 n->Arg<CNode*>(0) = a0;
04875 n->Arg<CNode*>(1) = a1;
04876 return n;
04877 }
04888 inline CNode* cMTM( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04889 {
04890 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMTM );
04891 n->Arg<CNode*>(0) = a0;
04892 n->Arg<CNode*>(1) = a1;
04893 n->Arg<CNode*>(2) = a2;
04894 return n;
04895 }
04907 inline CNode* cMTM( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04908 {
04909 CNode* n = new(heap) CNode( loc, eMTM );
04910 n->Arg<CNode*>(0) = a0;
04911 n->Arg<CNode*>(1) = a1;
04912 n->Arg<CNode*>(2) = a2;
04913 return n;
04914 }
04925 inline CNode* cIF( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04926 {
04927 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eIF );
04928 n->Arg<CNode*>(0) = a0;
04929 n->Arg<CNode*>(1) = a1;
04930 n->Arg<CNode*>(2) = a2;
04931 return n;
04932 }
04944 inline CNode* cIF( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
04945 {
04946 CNode* n = new(heap) CNode( loc, eIF );
04947 n->Arg<CNode*>(0) = a0;
04948 n->Arg<CNode*>(1) = a1;
04949 n->Arg<CNode*>(2) = a2;
04950 return n;
04951 }
04960 inline CNode* cFOREVER( CNode* a0, Coord_t* loc=NULL )
04961 {
04962 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFOREVER );
04963 n->Arg<CNode*>(0) = a0;
04964 return n;
04965 }
04975 inline CNode* cFOREVER( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
04976 {
04977 CNode* n = new(heap) CNode( loc, eFOREVER );
04978 n->Arg<CNode*>(0) = a0;
04979 return n;
04980 }
04990 inline CNode* cREPEAT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
04991 {
04992 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREPEAT );
04993 n->Arg<CNode*>(0) = a0;
04994 n->Arg<CNode*>(1) = a1;
04995 return n;
04996 }
05007 inline CNode* cREPEAT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05008 {
05009 CNode* n = new(heap) CNode( loc, eREPEAT );
05010 n->Arg<CNode*>(0) = a0;
05011 n->Arg<CNode*>(1) = a1;
05012 return n;
05013 }
05023 inline CNode* cWHILE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05024 {
05025 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWHILE );
05026 n->Arg<CNode*>(0) = a0;
05027 n->Arg<CNode*>(1) = a1;
05028 return n;
05029 }
05040 inline CNode* cWHILE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05041 {
05042 CNode* n = new(heap) CNode( loc, eWHILE );
05043 n->Arg<CNode*>(0) = a0;
05044 n->Arg<CNode*>(1) = a1;
05045 return n;
05046 }
05056 inline CNode* cWAIT( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05057 {
05058 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eWAIT );
05059 n->Arg<CNode*>(0) = a0;
05060 n->Arg<CNode*>(1) = a1;
05061 return n;
05062 }
05073 inline CNode* cWAIT( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05074 {
05075 CNode* n = new(heap) CNode( loc, eWAIT );
05076 n->Arg<CNode*>(0) = a0;
05077 n->Arg<CNode*>(1) = a1;
05078 return n;
05079 }
05091 inline CNode* cFOR( CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05092 {
05093 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFOR );
05094 n->Arg<CNode*>(0) = a0;
05095 n->Arg<CNode*>(1) = a1;
05096 n->Arg<CNode*>(2) = a2;
05097 n->Arg<CNode*>(3) = a3;
05098 return n;
05099 }
05112 inline CNode* cFOR( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05113 {
05114 CNode* n = new(heap) CNode( loc, eFOR );
05115 n->Arg<CNode*>(0) = a0;
05116 n->Arg<CNode*>(1) = a1;
05117 n->Arg<CNode*>(2) = a2;
05118 n->Arg<CNode*>(3) = a3;
05119 return n;
05120 }
05130 inline CNode* cCASE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05131 {
05132 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASE );
05133 n->Arg<CNode*>(0) = a0;
05134 n->Arg<CNode*>(1) = a1;
05135 return n;
05136 }
05147 inline CNode* cCASE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05148 {
05149 CNode* n = new(heap) CNode( loc, eCASE );
05150 n->Arg<CNode*>(0) = a0;
05151 n->Arg<CNode*>(1) = a1;
05152 return n;
05153 }
05163 inline CNode* cCASEX( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05164 {
05165 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEX );
05166 n->Arg<CNode*>(0) = a0;
05167 n->Arg<CNode*>(1) = a1;
05168 return n;
05169 }
05180 inline CNode* cCASEX( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05181 {
05182 CNode* n = new(heap) CNode( loc, eCASEX );
05183 n->Arg<CNode*>(0) = a0;
05184 n->Arg<CNode*>(1) = a1;
05185 return n;
05186 }
05196 inline CNode* cCASEZ( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05197 {
05198 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEZ );
05199 n->Arg<CNode*>(0) = a0;
05200 n->Arg<CNode*>(1) = a1;
05201 return n;
05202 }
05213 inline CNode* cCASEZ( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05214 {
05215 CNode* n = new(heap) CNode( loc, eCASEZ );
05216 n->Arg<CNode*>(0) = a0;
05217 n->Arg<CNode*>(1) = a1;
05218 return n;
05219 }
05229 inline CNode* cCASEITEM( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05230 {
05231 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASEITEM );
05232 n->Arg<CNode*>(0) = a0;
05233 n->Arg<CNode*>(1) = a1;
05234 return n;
05235 }
05246 inline CNode* cCASEITEM( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05247 {
05248 CNode* n = new(heap) CNode( loc, eCASEITEM );
05249 n->Arg<CNode*>(0) = a0;
05250 n->Arg<CNode*>(1) = a1;
05251 return n;
05252 }
05264 inline CNode* cCASSIGN( StrengthPair_t* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05265 {
05266 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eCASSIGN );
05267 n->Arg<StrengthPair_t*>(0) = a0;
05268 n->Arg<CNode*>(1) = a1;
05269 n->Arg<CNode*>(2) = a2;
05270 n->Arg<CNode*>(3) = a3;
05271 return n;
05272 }
05285 inline CNode* cCASSIGN( CObstack* heap, StrengthPair_t* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05286 {
05287 CNode* n = new(heap) CNode( loc, eCASSIGN );
05288 n->Arg<StrengthPair_t*>(0) = a0;
05289 n->Arg<CNode*>(1) = a1;
05290 n->Arg<CNode*>(2) = a2;
05291 n->Arg<CNode*>(3) = a3;
05292 return n;
05293 }
05303 inline CNode* cARG( CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
05304 {
05305 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eARG );
05306 n->Arg<CSymbol*>(0) = a0;
05307 n->Arg<CNode*>(1) = a1;
05308 return n;
05309 }
05320 inline CNode* cARG( CObstack* heap, CSymbol* a0, CNode* a1, Coord_t* loc=NULL )
05321 {
05322 CNode* n = new(heap) CNode( loc, eARG );
05323 n->Arg<CSymbol*>(0) = a0;
05324 n->Arg<CNode*>(1) = a1;
05325 return n;
05326 }
05335 inline CNode* cFUNCTION_DEF( CFunction* a0, Coord_t* loc=NULL )
05336 {
05337 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eFUNCTION_DEF );
05338 n->Arg<CFunction*>(0) = a0;
05339 return n;
05340 }
05350 inline CNode* cFUNCTION_DEF( CObstack* heap, CFunction* a0, Coord_t* loc=NULL )
05351 {
05352 CNode* n = new(heap) CNode( loc, eFUNCTION_DEF );
05353 n->Arg<CFunction*>(0) = a0;
05354 return n;
05355 }
05364 inline CNode* cMODULE_DEF( CModule* a0, Coord_t* loc=NULL )
05365 {
05366 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMODULE_DEF );
05367 n->Arg<CModule*>(0) = a0;
05368 return n;
05369 }
05379 inline CNode* cMODULE_DEF( CObstack* heap, CModule* a0, Coord_t* loc=NULL )
05380 {
05381 CNode* n = new(heap) CNode( loc, eMODULE_DEF );
05382 n->Arg<CModule*>(0) = a0;
05383 return n;
05384 }
05394 inline CNode* cREPEAT_CONTROL( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05395 {
05396 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eREPEAT_CONTROL );
05397 n->Arg<CNode*>(0) = a0;
05398 n->Arg<CNode*>(1) = a1;
05399 return n;
05400 }
05411 inline CNode* cREPEAT_CONTROL( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05412 {
05413 CNode* n = new(heap) CNode( loc, eREPEAT_CONTROL );
05414 n->Arg<CNode*>(0) = a0;
05415 n->Arg<CNode*>(1) = a1;
05416 return n;
05417 }
05426 inline CNode* cDELAY_CONTROL( CNode* a0, Coord_t* loc=NULL )
05427 {
05428 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDELAY_CONTROL );
05429 n->Arg<CNode*>(0) = a0;
05430 return n;
05431 }
05441 inline CNode* cDELAY_CONTROL( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05442 {
05443 CNode* n = new(heap) CNode( loc, eDELAY_CONTROL );
05444 n->Arg<CNode*>(0) = a0;
05445 return n;
05446 }
05455 inline CNode* cEVENT_CONTROL( CNode* a0, Coord_t* loc=NULL )
05456 {
05457 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEVENT_CONTROL );
05458 n->Arg<CNode*>(0) = a0;
05459 return n;
05460 }
05470 inline CNode* cEVENT_CONTROL( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05471 {
05472 CNode* n = new(heap) CNode( loc, eEVENT_CONTROL );
05473 n->Arg<CNode*>(0) = a0;
05474 return n;
05475 }
05484 inline CNode* cEXTERNAL_REF( CSymbol* a0, Coord_t* loc=NULL )
05485 {
05486 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eEXTERNAL_REF );
05487 n->Arg<CSymbol*>(0) = a0;
05488 return n;
05489 }
05499 inline CNode* cEXTERNAL_REF( CObstack* heap, CSymbol* a0, Coord_t* loc=NULL )
05500 {
05501 CNode* n = new(heap) CNode( loc, eEXTERNAL_REF );
05502 n->Arg<CSymbol*>(0) = a0;
05503 return n;
05504 }
05513 inline CNode* cPORT_DEF( CPort* a0, Coord_t* loc=NULL )
05514 {
05515 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORT_DEF );
05516 n->Arg<CPort*>(0) = a0;
05517 return n;
05518 }
05528 inline CNode* cPORT_DEF( CObstack* heap, CPort* a0, Coord_t* loc=NULL )
05529 {
05530 CNode* n = new(heap) CNode( loc, ePORT_DEF );
05531 n->Arg<CPort*>(0) = a0;
05532 return n;
05533 }
05543 inline CNode* cDEFPARAM( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05544 {
05545 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDEFPARAM );
05546 n->Arg<CNode*>(0) = a0;
05547 n->Arg<CNode*>(1) = a1;
05548 return n;
05549 }
05560 inline CNode* cDEFPARAM( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05561 {
05562 CNode* n = new(heap) CNode( loc, eDEFPARAM );
05563 n->Arg<CNode*>(0) = a0;
05564 n->Arg<CNode*>(1) = a1;
05565 return n;
05566 }
05581 inline CNode* cPATH( int a0, CNode* a1, int a2, int a3, CNode* a4, int a5, CNode* a6, Coord_t* loc=NULL )
05582 {
05583 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePATH );
05584 n->Arg<int>(0) = a0;
05585 n->Arg<CNode*>(1) = a1;
05586 n->Arg<int>(2) = a2;
05587 n->Arg<int>(3) = a3;
05588 n->Arg<CNode*>(4) = a4;
05589 n->Arg<int>(5) = a5;
05590 n->Arg<CNode*>(6) = a6;
05591 return n;
05592 }
05608 inline CNode* cPATH( CObstack* heap, int a0, CNode* a1, int a2, int a3, CNode* a4, int a5, CNode* a6, Coord_t* loc=NULL )
05609 {
05610 CNode* n = new(heap) CNode( loc, ePATH );
05611 n->Arg<int>(0) = a0;
05612 n->Arg<CNode*>(1) = a1;
05613 n->Arg<int>(2) = a2;
05614 n->Arg<int>(3) = a3;
05615 n->Arg<CNode*>(4) = a4;
05616 n->Arg<int>(5) = a5;
05617 n->Arg<CNode*>(6) = a6;
05618 return n;
05619 }
05630 inline CNode* cPATH_ASSIGN( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05631 {
05632 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePATH_ASSIGN );
05633 n->Arg<CNode*>(0) = a0;
05634 n->Arg<CNode*>(1) = a1;
05635 n->Arg<CNode*>(2) = a2;
05636 return n;
05637 }
05649 inline CNode* cPATH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05650 {
05651 CNode* n = new(heap) CNode( loc, ePATH_ASSIGN );
05652 n->Arg<CNode*>(0) = a0;
05653 n->Arg<CNode*>(1) = a1;
05654 n->Arg<CNode*>(2) = a2;
05655 return n;
05656 }
05666 inline CNode* cIFNONE_PATH_ASSIGN( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05667 {
05668 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eIFNONE_PATH_ASSIGN );
05669 n->Arg<CNode*>(0) = a0;
05670 n->Arg<CNode*>(1) = a1;
05671 return n;
05672 }
05683 inline CNode* cIFNONE_PATH_ASSIGN( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05684 {
05685 CNode* n = new(heap) CNode( loc, eIFNONE_PATH_ASSIGN );
05686 n->Arg<CNode*>(0) = a0;
05687 n->Arg<CNode*>(1) = a1;
05688 return n;
05689 }
05698 inline CNode* cTRIGGER( CNode* a0, Coord_t* loc=NULL )
05699 {
05700 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTRIGGER );
05701 n->Arg<CNode*>(0) = a0;
05702 return n;
05703 }
05713 inline CNode* cTRIGGER( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05714 {
05715 CNode* n = new(heap) CNode( loc, eTRIGGER );
05716 n->Arg<CNode*>(0) = a0;
05717 return n;
05718 }
05728 inline CNode* cPASSIGN( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05729 {
05730 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePASSIGN );
05731 n->Arg<CNode*>(0) = a0;
05732 n->Arg<CNode*>(1) = a1;
05733 return n;
05734 }
05745 inline CNode* cPASSIGN( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05746 {
05747 CNode* n = new(heap) CNode( loc, ePASSIGN );
05748 n->Arg<CNode*>(0) = a0;
05749 n->Arg<CNode*>(1) = a1;
05750 return n;
05751 }
05760 inline CNode* cDEASSIGN( CNode* a0, Coord_t* loc=NULL )
05761 {
05762 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDEASSIGN );
05763 n->Arg<CNode*>(0) = a0;
05764 return n;
05765 }
05775 inline CNode* cDEASSIGN( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05776 {
05777 CNode* n = new(heap) CNode( loc, eDEASSIGN );
05778 n->Arg<CNode*>(0) = a0;
05779 return n;
05780 }
05789 inline CNode* cDISABLE( CSymbol* a0, Coord_t* loc=NULL )
05790 {
05791 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eDISABLE );
05792 n->Arg<CSymbol*>(0) = a0;
05793 return n;
05794 }
05804 inline CNode* cDISABLE( CObstack* heap, CSymbol* a0, Coord_t* loc=NULL )
05805 {
05806 CNode* n = new(heap) CNode( loc, eDISABLE );
05807 n->Arg<CSymbol*>(0) = a0;
05808 return n;
05809 }
05818 inline CNode* cATTRIBUTE( CAttr* a0, Coord_t* loc=NULL )
05819 {
05820 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eATTRIBUTE );
05821 n->Arg<CAttr*>(0) = a0;
05822 return n;
05823 }
05833 inline CNode* cATTRIBUTE( CObstack* heap, CAttr* a0, Coord_t* loc=NULL )
05834 {
05835 CNode* n = new(heap) CNode( loc, eATTRIBUTE );
05836 n->Arg<CAttr*>(0) = a0;
05837 return n;
05838 }
05849 inline CNode* cGIF( CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05850 {
05851 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGIF );
05852 n->Arg<CNode*>(0) = a0;
05853 n->Arg<CNode*>(1) = a1;
05854 n->Arg<CNode*>(2) = a2;
05855 return n;
05856 }
05868 inline CNode* cGIF( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, Coord_t* loc=NULL )
05869 {
05870 CNode* n = new(heap) CNode( loc, eGIF );
05871 n->Arg<CNode*>(0) = a0;
05872 n->Arg<CNode*>(1) = a1;
05873 n->Arg<CNode*>(2) = a2;
05874 return n;
05875 }
05887 inline CNode* cGFOR( CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05888 {
05889 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGFOR );
05890 n->Arg<CNode*>(0) = a0;
05891 n->Arg<CNode*>(1) = a1;
05892 n->Arg<CNode*>(2) = a2;
05893 n->Arg<CNode*>(3) = a3;
05894 return n;
05895 }
05908 inline CNode* cGFOR( CObstack* heap, CNode* a0, CNode* a1, CNode* a2, CNode* a3, Coord_t* loc=NULL )
05909 {
05910 CNode* n = new(heap) CNode( loc, eGFOR );
05911 n->Arg<CNode*>(0) = a0;
05912 n->Arg<CNode*>(1) = a1;
05913 n->Arg<CNode*>(2) = a2;
05914 n->Arg<CNode*>(3) = a3;
05915 return n;
05916 }
05926 inline CNode* cGCASE( CNode* a0, CNode* a1, Coord_t* loc=NULL )
05927 {
05928 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eGCASE );
05929 n->Arg<CNode*>(0) = a0;
05930 n->Arg<CNode*>(1) = a1;
05931 return n;
05932 }
05943 inline CNode* cGCASE( CObstack* heap, CNode* a0, CNode* a1, Coord_t* loc=NULL )
05944 {
05945 CNode* n = new(heap) CNode( loc, eGCASE );
05946 n->Arg<CNode*>(0) = a0;
05947 n->Arg<CNode*>(1) = a1;
05948 return n;
05949 }
05958 inline CNode* cTABLE( CNode* a0, Coord_t* loc=NULL )
05959 {
05960 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE );
05961 n->Arg<CNode*>(0) = a0;
05962 return n;
05963 }
05973 inline CNode* cTABLE( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
05974 {
05975 CNode* n = new(heap) CNode( loc, eTABLE );
05976 n->Arg<CNode*>(0) = a0;
05977 return n;
05978 }
05987 inline CNode* cTABLE_ENTRY( CNode* a0, Coord_t* loc=NULL )
05988 {
05989 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE_ENTRY );
05990 n->Arg<CNode*>(0) = a0;
05991 return n;
05992 }
06002 inline CNode* cTABLE_ENTRY( CObstack* heap, CNode* a0, Coord_t* loc=NULL )
06003 {
06004 CNode* n = new(heap) CNode( loc, eTABLE_ENTRY );
06005 n->Arg<CNode*>(0) = a0;
06006 return n;
06007 }
06016 inline CNode* cTABLE_SYMBOL( char* a0, Coord_t* loc=NULL )
06017 {
06018 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eTABLE_SYMBOL );
06019 n->Arg<char*>(0) = a0;
06020 return n;
06021 }
06031 inline CNode* cTABLE_SYMBOL( CObstack* heap, char* a0, Coord_t* loc=NULL )
06032 {
06033 CNode* n = new(heap) CNode( loc, eTABLE_SYMBOL );
06034 n->Arg<char*>(0) = a0;
06035 return n;
06036 }
06044 inline CNode* cPORTLIST_END( Coord_t* loc=NULL )
06045 {
06046 CNode* n = new(CNode::CurrentHeap()) CNode( loc, ePORTLIST_END );
06047 return n;
06048 }
06057 inline CNode* cPORTLIST_END( CObstack* heap, Coord_t* loc=NULL )
06058 {
06059 CNode* n = new(heap) CNode( loc, ePORTLIST_END );
06060 return n;
06061 }
06071 inline CNode* cMACRO_EXPR( const char* a0, CNode* a1, Coord_t* loc=NULL )
06072 {
06073 CNode* n = new(CNode::CurrentHeap()) CNode( loc, eMACRO_EXPR );
06074 n->Arg<const char*>(0) = a0;
06075 n->Arg<CNode*>(1) = a1;
06076 return n;
06077 }
06088 inline CNode* cMACRO_EXPR( CObstack* heap, const char* a0, CNode* a1, Coord_t* loc=NULL )
06089 {
06090 CNode* n = new(heap) CNode( loc, eMACRO_EXPR );
06091 n->Arg<const char*>(0) = a0;
06092 n->Arg<CNode*>(1) = a1;
06093 return n;
06094 }
06095 #endif // DEFINE_CONSTUCTOR
06096
06097
06098
06099
06100
06101
06102
06103
06104
06105 #ifdef DEFINE_METHODS
06106
06107
06108
06109
06110
06111 int CNode::ArgCount()
06112 {
06113 switch( op ) {
06114 case eERROR:
06115 return 0;
06116 case eVCONSTANT:
06117 return 1;
06118 case eRCONSTANT:
06119 return 1;
06120 case eCOMMENT:
06121 return 1;
06122 case eVRQ:
06123 return 1;
06124 case ePRAGMA:
06125 return 1;
06126 case eELIST:
06127 return 2;
06128 case eWIDTH:
06129 return 2;
06130 case eNOP:
06131 return 0;
06132 case eSUB:
06133 return 2;
06134 case eMUL:
06135 return 2;
06136 case eDIV:
06137 return 2;
06138 case ePOW:
06139 return 2;
06140 case eADD:
06141 return 2;
06142 case eLSH:
06143 return 2;
06144 case eRSH:
06145 return 2;
06146 case eLSHA:
06147 return 2;
06148 case eRSHA:
06149 return 2;
06150 case eMOD:
06151 return 2;
06152 case eOR:
06153 return 2;
06154 case eAND:
06155 return 2;
06156 case eANDANDAND:
06157 return 2;
06158 case eXOR:
06159 return 2;
06160 case eXNOR:
06161 return 2;
06162 case eINSTANCE_REF:
06163 return 1;
06164 case eGATE_REF:
06165 return 1;
06166 case eTASK_ENABLE:
06167 return 2;
06168 case eSYSTASK_CALL:
06169 return 2;
06170 case eTIMING_CALL:
06171 return 2;
06172 case eFUNCTION_CALL:
06173 return 3;
06174 case eARRAY:
06175 return 2;
06176 case eNET_REF:
06177 return 1;
06178 case eVAR_REF:
06179 return 1;
06180 case ePARAM_REF:
06181 return 1;
06182 case ePORT_REF:
06183 return 1;
06184 case eFWD_REF:
06185 return 1;
06186 case eGENVAR_REF:
06187 return 1;
06188 case eNET_DECL:
06189 return 2;
06190 case eVAR_DECL:
06191 return 2;
06192 case ePARAM_DECL:
06193 return 1;
06194 case eSPECPARAM_DECL:
06195 return 1;
06196 case ePORT_DECL:
06197 return 1;
06198 case eGENVAR_DECL:
06199 return 1;
06200 case eLIST:
06201 return 2;
06202 case eRANGE:
06203 return 2;
06204 case eSLICE:
06205 return 2;
06206 case ePSLICE:
06207 return 2;
06208 case eMSLICE:
06209 return 2;
06210 case eCVRI:
06211 return 1;
06212 case eCVIR:
06213 return 1;
06214 case eREP:
06215 return 2;
06216 case eCAT:
06217 return 2;
06218 case eUCAT:
06219 return 1;
06220 case eCOM:
06221 return 1;
06222 case eNEG:
06223 return 1;
06224 case ePLUS:
06225 return 1;
06226 case eNOT:
06227 return 1;
06228 case eGT:
06229 return 2;
06230 case eGE:
06231 return 2;
06232 case eLT:
06233 return 2;
06234 case eLE:
06235 return 2;
06236 case eLAND:
06237 return 2;
06238 case eLOR:
06239 return 2;
06240 case eCEQ:
06241 return 2;
06242 case eCNE:
06243 return 2;
06244 case eEQ:
06245 return 2;
06246 case eNE:
06247 return 2;
06248 case eRAND:
06249 return 1;
06250 case eRNAND:
06251 return 1;
06252 case eROR:
06253 return 1;
06254 case eRNOR:
06255 return 1;
06256 case eRXOR:
06257 return 1;
06258 case eRXNOR:
06259 return 1;
06260 case eHOOK:
06261 return 3;
06262 case eINIT:
06263 return 1;
06264 case eALWAYS:
06265 return 1;
06266 case eEVENT:
06267 return 2;
06268 case eBLOCK_REF:
06269 return 2;
06270 case eSPECIFY_REF:
06271 return 2;
06272 case eASSIGN:
06273 return 3;
06274 case eFORCE:
06275 return 2;
06276 case eRELEASE:
06277 return 1;
06278 case eNBASSIGN:
06279 return 3;
06280 case ePOSEDGE:
06281 return 1;
06282 case eNEGEDGE:
06283 return 1;
06284 case eEDGE:
06285 return 2;
06286 case eEVOR:
06287 return 2;
06288 case eDELAY:
06289 return 2;
06290 case eMTM:
06291 return 3;
06292 case eIF:
06293 return 3;
06294 case eFOREVER:
06295 return 1;
06296 case eREPEAT:
06297 return 2;
06298 case eWHILE:
06299 return 2;
06300 case eWAIT:
06301 return 2;
06302 case eFOR:
06303 return 4;
06304 case eCASE:
06305 return 2;
06306 case eCASEX:
06307 return 2;
06308 case eCASEZ:
06309 return 2;
06310 case eCASEITEM:
06311 return 2;
06312 case eCASSIGN:
06313 return 4;
06314 case eARG:
06315 return 2;
06316 case eFUNCTION_DEF:
06317 return 1;
06318 case eMODULE_DEF:
06319 return 1;
06320 case eREPEAT_CONTROL:
06321 return 2;
06322 case eDELAY_CONTROL:
06323 return 1;
06324 case eEVENT_CONTROL:
06325 return 1;
06326 case eEXTERNAL_REF:
06327 return 1;
06328 case ePORT_DEF:
06329 return 1;
06330 case eDEFPARAM:
06331 return 2;
06332 case ePATH:
06333 return 7;
06334 case ePATH_ASSIGN:
06335 return 3;
06336 case eIFNONE_PATH_ASSIGN:
06337 return 2;
06338 case eTRIGGER:
06339 return 1;
06340 case ePASSIGN:
06341 return 2;
06342 case eDEASSIGN:
06343 return 1;
06344 case eDISABLE:
06345 return 1;
06346 case eATTRIBUTE:
06347 return 1;
06348 case eGIF:
06349 return 3;
06350 case eGFOR:
06351 return 4;
06352 case eGCASE:
06353 return 2;
06354 case eTABLE:
06355 return 1;
06356 case eTABLE_ENTRY:
06357 return 1;
06358 case eTABLE_SYMBOL:
06359 return 1;
06360 case ePORTLIST_END:
06361 return 0;
06362 case eMACRO_EXPR:
06363 return 2;
06364 default:
06365 MASSERT(FALSE);
06366 }
06367 return 0;
06368 }
06369
06370
06371
06372
06373
06374
06375 int CNode::Precedence()
06376 {
06377 switch( op ) {
06378 case eERROR:
06379 return 13;
06380 case eVCONSTANT:
06381 return 13;
06382 case eRCONSTANT:
06383 return 13;
06384 case eCOMMENT:
06385 return 13;
06386 case eVRQ:
06387 return 13;
06388 case ePRAGMA:
06389 return 13;
06390 case eELIST:
06391 return 13;
06392 case eWIDTH:
06393 return 13;
06394 case eSUB:
06395 return 9;
06396 case eMUL:
06397 return 10;
06398 case eDIV:
06399 return 10;
06400 case ePOW:
06401 return 11;
06402 case eADD:
06403 return 9;
06404 case eLSH:
06405 return 8;
06406 case eRSH:
06407 return 8;
06408 case eLSHA:
06409 return 8;
06410 case eRSHA:
06411 return 8;
06412 case eMOD:
06413 return 10;
06414 case eOR:
06415 return 3;
06416 case eAND:
06417 return 5;
06418 case eANDANDAND:
06419 return 0;
06420 case eXOR:
06421 return 4;
06422 case eXNOR:
06423 return 4;
06424 case eSYSTASK_CALL:
06425 return 13;
06426 case eFUNCTION_CALL:
06427 return 13;
06428 case eARRAY:
06429 return 13;
06430 case eNET_REF:
06431 return 13;
06432 case eVAR_REF:
06433 return 13;
06434 case ePARAM_REF:
06435 return 13;
06436 case ePORT_REF:
06437 return 13;
06438 case eFWD_REF:
06439 return 13;
06440 case eGENVAR_REF:
06441 return 13;
06442 case eRANGE:
06443 return 13;
06444 case eSLICE:
06445 return 13;
06446 case ePSLICE:
06447 return 13;
06448 case eMSLICE:
06449 return 13;
06450 case eCVRI:
06451 return 13;
06452 case eCVIR:
06453 return 13;
06454 case eREP:
06455 return 13;
06456 case eCAT:
06457 return 13;
06458 case eUCAT:
06459 return 13;
06460 case eCOM:
06461 return 12;
06462 case eNEG:
06463 return 12;
06464 case ePLUS:
06465 return 12;
06466 case eNOT:
06467 return 12;
06468 case eGT:
06469 return 7;
06470 case eGE:
06471 return 7;
06472 case eLT:
06473 return 7;
06474 case eLE:
06475 return 7;
06476 case eLAND:
06477 return 2;
06478 case eLOR:
06479 return 1;
06480 case eCEQ:
06481 return 6;
06482 case eCNE:
06483 return 6;
06484 case eEQ:
06485 return 6;
06486 case eNE:
06487 return 6;
06488 case eRAND:
06489 return 12;
06490 case eRNAND:
06491 return 12;
06492 case eROR:
06493 return 12;
06494 case eRNOR:
06495 return 12;
06496 case eRXOR:
06497 return 12;
06498 case eRXNOR:
06499 return 12;
06500 case eHOOK:
06501 return 0;
06502 case ePOSEDGE:
06503 return 13;
06504 case eNEGEDGE:
06505 return 13;
06506 case eEDGE:
06507 return 13;
06508 case eEVOR:
06509 return 13;
06510 case eMTM:
06511 return 13;
06512 case eEXTERNAL_REF:
06513 return 13;
06514 case eMACRO_EXPR:
06515 return 13;
06516 default:
06517 MASSERT( FALSE );
06518 return 13;
06519 }
06520 }
06521
06522
06523
06524
06525
06526
06527 int CNode::IsConstant()
06528 {
06529 switch( op ) {
06530 case eERROR:
06531 return FALSE;
06532 case eVCONSTANT:
06533 return TRUE;
06534 case eRCONSTANT:
06535 return TRUE;
06536 case eCOMMENT:
06537 return TRUE;
06538 case eVRQ:
06539 return TRUE;
06540 case ePRAGMA:
06541 return TRUE;
06542 case eELIST:
06543 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06544 case eWIDTH:
06545 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06546 case eSUB:
06547 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06548 case eMUL:
06549 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06550 case eDIV:
06551 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06552 case ePOW:
06553 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06554 case eADD:
06555 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06556 case eLSH:
06557 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06558 case eRSH:
06559 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06560 case eLSHA:
06561 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06562 case eRSHA:
06563 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06564 case eMOD:
06565 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06566 case eOR:
06567 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06568 case eAND:
06569 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06570 case eANDANDAND:
06571 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06572 case eXOR:
06573 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06574 case eXNOR:
06575 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06576 case eSYSTASK_CALL:
06577 return FALSE;
06578 case eFUNCTION_CALL:
06579 return Arg<CNode*>(1)->IsConstant();
06580 case eARRAY:
06581 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06582 case eNET_REF:
06583 return FALSE;
06584 case eVAR_REF:
06585 return FALSE;
06586 case ePARAM_REF:
06587 return TRUE;
06588 case ePORT_REF:
06589 return FALSE;
06590 case eFWD_REF:
06591 return FALSE;
06592 case eGENVAR_REF:
06593 return TRUE;
06594 case eRANGE:
06595 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06596 case eSLICE:
06597 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06598 case ePSLICE:
06599 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06600 case eMSLICE:
06601 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06602 case eCVRI:
06603 return Arg<CNode*>(0)->IsConstant();
06604 case eCVIR:
06605 return Arg<CNode*>(0)->IsConstant();
06606 case eREP:
06607 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06608 case eCAT:
06609 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06610 case eUCAT:
06611 return Arg<CNode*>(0)->IsConstant();
06612 case eCOM:
06613 return Arg<CNode*>(0)->IsConstant();
06614 case eNEG:
06615 return Arg<CNode*>(0)->IsConstant();
06616 case ePLUS:
06617 return Arg<CNode*>(0)->IsConstant();
06618 case eNOT:
06619 return Arg<CNode*>(0)->IsConstant();
06620 case eGT:
06621 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06622 case eGE:
06623 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06624 case eLT:
06625 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06626 case eLE:
06627 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06628 case eLAND:
06629 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06630 case eLOR:
06631 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06632 case eCEQ:
06633 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06634 case eCNE:
06635 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06636 case eEQ:
06637 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06638 case eNE:
06639 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06640 case eRAND:
06641 return Arg<CNode*>(0)->IsConstant();
06642 case eRNAND:
06643 return Arg<CNode*>(0)->IsConstant();
06644 case eROR:
06645 return Arg<CNode*>(0)->IsConstant();
06646 case eRNOR:
06647 return Arg<CNode*>(0)->IsConstant();
06648 case eRXOR:
06649 return Arg<CNode*>(0)->IsConstant();
06650 case eRXNOR:
06651 return Arg<CNode*>(0)->IsConstant();
06652 case eHOOK:
06653 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant() && Arg<CNode*>(2)->IsConstant();
06654 case eMTM:
06655 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant() && Arg<CNode*>(2)->IsConstant();
06656 case eEXTERNAL_REF:
06657 return FALSE;
06658 case eMACRO_EXPR:
06659 return TRUE;
06660 default:
06661 MASSERT( FALSE );
06662 }
06663
06664 return TRUE;
06665 }
06666
06667
06668
06669
06670
06671
06672
06673 int CNode::IsVolatile()
06674 {
06675 switch( op ) {
06676 case eERROR:
06677 return TRUE;
06678 case eVCONSTANT:
06679 return FALSE;
06680 case eRCONSTANT:
06681 return FALSE;
06682 case eCOMMENT:
06683 return FALSE;
06684 case eVRQ:
06685 return FALSE;
06686 case ePRAGMA:
06687 return FALSE;
06688 case eELIST:
06689 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06690 case eWIDTH:
06691 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06692 case eSUB:
06693 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06694 case eMUL:
06695 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06696 case eDIV:
06697 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06698 case ePOW:
06699 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06700 case eADD:
06701 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06702 case eLSH:
06703 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06704 case eRSH:
06705 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06706 case eLSHA:
06707 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06708 case eRSHA:
06709 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06710 case eMOD:
06711 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06712 case eOR:
06713 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06714 case eAND:
06715 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06716 case eANDANDAND:
06717 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06718 case eXOR:
06719 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06720 case eXNOR:
06721 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06722 case eSYSTASK_CALL:
06723 return TRUE;
06724 case eFUNCTION_CALL:
06725 return Arg<CNode*>(1)->IsVolatile();
06726 case eARRAY:
06727 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06728 case eNET_REF:
06729 return TRUE;
06730 case eVAR_REF:
06731 return TRUE;
06732 case ePARAM_REF:
06733 return TRUE;
06734 case ePORT_REF:
06735 return TRUE;
06736 case eFWD_REF:
06737 return TRUE;
06738 case eGENVAR_REF:
06739 return TRUE;
06740 case eRANGE:
06741 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06742 case eSLICE:
06743 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06744 case ePSLICE:
06745 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06746 case eMSLICE:
06747 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06748 case eCVRI:
06749 return Arg<CNode*>(0)->IsVolatile();
06750 case eCVIR:
06751 return Arg<CNode*>(0)->IsVolatile();
06752 case eREP:
06753 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06754 case eCAT:
06755 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06756 case eUCAT:
06757 return Arg<CNode*>(0)->IsVolatile();
06758 case eCOM:
06759 return Arg<CNode*>(0)->IsVolatile();
06760 case eNEG:
06761 return Arg<CNode*>(0)->IsVolatile();
06762 case ePLUS:
06763 return Arg<CNode*>(0)->IsVolatile();
06764 case eNOT:
06765 return Arg<CNode*>(0)->IsVolatile();
06766 case eGT:
06767 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06768 case eGE:
06769 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06770 case eLT:
06771 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06772 case eLE:
06773 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06774 case eLAND:
06775 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06776 case eLOR:
06777 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06778 case eCEQ:
06779 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06780 case eCNE:
06781 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06782 case eEQ:
06783 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06784 case eNE:
06785 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
06786 case eRAND:
06787 return Arg<CNode*>(0)->IsVolatile();
06788 case eRNAND:
06789 return Arg<CNode*>(0)->IsVolatile();
06790 case eROR:
06791 return Arg<CNode*>(0)->IsVolatile();
06792 case eRNOR:
06793 return Arg<CNode*>(0)->IsVolatile();
06794 case eRXOR:
06795 return Arg<CNode*>(0)->IsVolatile();
06796 case eRXNOR:
06797 return Arg<CNode*>(0)->IsVolatile();
06798 case eHOOK:
06799 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile() || Arg<CNode*>(2)->IsVolatile();
06800 case eMTM:
06801 return TRUE;
06802 case eEXTERNAL_REF:
06803 return TRUE;
06804 case eMACRO_EXPR:
06805 return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsVolatile() : TRUE;
06806 default:
06807 MASSERT( FALSE );
06808 }
06809
06810 return TRUE;
06811 }
06812
06813
06814
06815
06816
06817
06818
06819 int CNode::IsWidthConstant( )
06820 {
06821 switch( GetOp() ) {
06822 case eERROR:
06823 return TRUE;
06824 case eVCONSTANT:
06825 return Arg<CVector*>(0)->IsWidthConstant();
06826 case eRCONSTANT:
06827 return TRUE;
06828 case eELIST:
06829 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06830 case eWIDTH:
06831 return Arg<CNode*>(0)->IsConstant();
06832 case eSUB:
06833 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06834 case eMUL:
06835 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06836 case eDIV:
06837 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06838 case ePOW:
06839 return Arg<CNode*>(0)->IsWidthConstant();
06840 case eADD:
06841 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06842 case eLSH:
06843 return Arg<CNode*>(0)->IsWidthConstant();
06844 case eRSH:
06845 return Arg<CNode*>(0)->IsWidthConstant();
06846 case eLSHA:
06847 return Arg<CNode*>(0)->IsWidthConstant();
06848 case eRSHA:
06849 return Arg<CNode*>(0)->IsWidthConstant();
06850 case eMOD:
06851 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06852 case eOR:
06853 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06854 case eAND:
06855 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06856 case eANDANDAND:
06857 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06858 case eXOR:
06859 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06860 case eXNOR:
06861 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06862 case eSYSTASK_CALL:
06863 return Systask::WidthConstant(Arg<CSymbol*>(0),Arg<CNode*>(1));
06864 case eFUNCTION_CALL:
06865 return CFunction::WidthConstant(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
06866 case eARRAY:
06867 return Array::WidthConstant(Arg<CNode*>(0),Arg<CNode*>(1));
06868 case eNET_REF:
06869 return Arg<CNet*>(0)->IsWidthConstant();
06870 case eVAR_REF:
06871 return Arg<CVar*>(0)->IsWidthConstant();
06872 case ePARAM_REF:
06873 return Arg<CParam*>(0)->IsWidthConstant();
06874 case ePORT_REF:
06875 return Arg<CPortDir*>(0)->IsWidthConstant();
06876 case eFWD_REF:
06877 return Arg<CFref*>(0)->IsWidthConstant();
06878 case eGENVAR_REF:
06879 return Arg<CGenvar*>(0)->IsWidthConstant();
06880 case eRANGE:
06881 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06882 case eSLICE:
06883 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsConstant();
06884 case ePSLICE:
06885 return Arg<CNode*>(1)->IsConstant();
06886 case eMSLICE:
06887 return Arg<CNode*>(1)->IsConstant();
06888 case eCVRI:
06889 return TRUE;
06890 case eCVIR:
06891 return TRUE;
06892 case eREP:
06893 return Arg<CNode*>(0)->IsConstant() && Arg<CNode*>(1)->IsWidthConstant();
06894 case eCAT:
06895 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant();
06896 case eUCAT:
06897 return Arg<CNode*>(0)->IsWidthConstant();
06898 case eCOM:
06899 return Arg<CNode*>(0)->IsWidthConstant();
06900 case eNEG:
06901 return Arg<CNode*>(0)->IsWidthConstant();
06902 case ePLUS:
06903 return Arg<CNode*>(0)->IsWidthConstant();
06904 case eNOT:
06905 return TRUE;
06906 case eGT:
06907 return TRUE;
06908 case eGE:
06909 return TRUE;
06910 case eLT:
06911 return TRUE;
06912 case eLE:
06913 return TRUE;
06914 case eLAND:
06915 return TRUE;
06916 case eLOR:
06917 return TRUE;
06918 case eCEQ:
06919 return TRUE;
06920 case eCNE:
06921 return TRUE;
06922 case eEQ:
06923 return TRUE;
06924 case eNE:
06925 return TRUE;
06926 case eRAND:
06927 return TRUE;
06928 case eRNAND:
06929 return TRUE;
06930 case eROR:
06931 return TRUE;
06932 case eRNOR:
06933 return TRUE;
06934 case eRXOR:
06935 return TRUE;
06936 case eRXNOR:
06937 return TRUE;
06938 case eHOOK:
06939 return Arg<CNode*>(1)->IsWidthConstant() && Arg<CNode*>(2)->IsWidthConstant();
06940 case eMTM:
06941 return Arg<CNode*>(0)->IsWidthConstant() && Arg<CNode*>(1)->IsWidthConstant() && Arg<CNode*>(2)->IsWidthConstant();
06942 case eEXTERNAL_REF:
06943 return External::WidthConstant(Arg<CSymbol*>(0));
06944 case eATTRIBUTE:
06945 return TRUE;
06946 case eMACRO_EXPR:
06947 return Arg<CNode*>(1)->IsWidthConstant();
06948 default:
06949 MASSERT( FALSE );
06950 return 0;
06951 }
06952 }
06953
06954
06955
06956
06957
06958
06959 int CNode::IsWidthVolatile( )
06960 {
06961 switch( GetOp() ) {
06962 case eERROR:
06963 return FALSE;
06964 case eVCONSTANT:
06965 return Arg<CVector*>(0)->IsWidthVolatile();
06966 case eRCONSTANT:
06967 return FALSE;
06968 case eELIST:
06969 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06970 case eWIDTH:
06971 return Arg<CNode*>(0)->IsVolatile();
06972 case eSUB:
06973 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06974 case eMUL:
06975 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06976 case eDIV:
06977 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06978 case ePOW:
06979 return Arg<CNode*>(0)->IsWidthVolatile();
06980 case eADD:
06981 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06982 case eLSH:
06983 return Arg<CNode*>(0)->IsWidthVolatile();
06984 case eRSH:
06985 return Arg<CNode*>(0)->IsWidthVolatile();
06986 case eLSHA:
06987 return Arg<CNode*>(0)->IsWidthVolatile();
06988 case eRSHA:
06989 return Arg<CNode*>(0)->IsWidthVolatile();
06990 case eMOD:
06991 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06992 case eOR:
06993 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06994 case eAND:
06995 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06996 case eANDANDAND:
06997 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
06998 case eXOR:
06999 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
07000 case eXNOR:
07001 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
07002 case eSYSTASK_CALL:
07003 return Systask::WidthVolatile(Arg<CSymbol*>(0),Arg<CNode*>(1));
07004 case eFUNCTION_CALL:
07005 return CFunction::WidthVolatile(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
07006 case eARRAY:
07007 return Array::WidthVolatile(Arg<CNode*>(0),Arg<CNode*>(1));
07008 case eNET_REF:
07009 return Arg<CNet*>(0)->IsWidthVolatile();
07010 case eVAR_REF:
07011 return Arg<CVar*>(0)->IsWidthVolatile();
07012 case ePARAM_REF:
07013 return Arg<CParam*>(0)->IsWidthVolatile();
07014 case ePORT_REF:
07015 return Arg<CPortDir*>(0)->IsWidthVolatile();
07016 case eFWD_REF:
07017 return Arg<CFref*>(0)->IsWidthVolatile();
07018 case eGENVAR_REF:
07019 return Arg<CGenvar*>(0)->IsWidthVolatile();
07020 case eRANGE:
07021 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
07022 case eSLICE:
07023 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsVolatile();
07024 case ePSLICE:
07025 return Arg<CNode*>(1)->IsVolatile();
07026 case eMSLICE:
07027 return Arg<CNode*>(1)->IsVolatile();
07028 case eCVRI:
07029 return FALSE;
07030 case eCVIR:
07031 return FALSE;
07032 case eREP:
07033 return Arg<CNode*>(0)->IsVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
07034 case eCAT:
07035 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile();
07036 case eUCAT:
07037 return Arg<CNode*>(0)->IsWidthVolatile();
07038 case eCOM:
07039 return Arg<CNode*>(0)->IsWidthVolatile();
07040 case eNEG:
07041 return Arg<CNode*>(0)->IsWidthVolatile();
07042 case ePLUS:
07043 return Arg<CNode*>(0)->IsWidthVolatile();
07044 case eNOT:
07045 return FALSE;
07046 case eGT:
07047 return FALSE;
07048 case eGE:
07049 return FALSE;
07050 case eLT:
07051 return FALSE;
07052 case eLE:
07053 return FALSE;
07054 case eLAND:
07055 return FALSE;
07056 case eLOR:
07057 return FALSE;
07058 case eCEQ:
07059 return FALSE;
07060 case eCNE:
07061 return FALSE;
07062 case eEQ:
07063 return FALSE;
07064 case eNE:
07065 return FALSE;
07066 case eRAND:
07067 return FALSE;
07068 case eRNAND:
07069 return FALSE;
07070 case eROR:
07071 return FALSE;
07072 case eRNOR:
07073 return FALSE;
07074 case eRXOR:
07075 return FALSE;
07076 case eRXNOR:
07077 return FALSE;
07078 case eHOOK:
07079 return Arg<CNode*>(1)->IsWidthVolatile() || Arg<CNode*>(2)->IsWidthVolatile();
07080 case eMTM:
07081 return Arg<CNode*>(0)->IsWidthVolatile() || Arg<CNode*>(1)->IsWidthVolatile() || Arg<CNode*>(2)->IsWidthVolatile();
07082 case eEXTERNAL_REF:
07083 return External::WidthVolatile(Arg<CSymbol*>(0));
07084 case eATTRIBUTE:
07085 return FALSE;
07086 case eMACRO_EXPR:
07087 return Arg<CNode*>(1)->IsWidthVolatile();
07088 default:
07089 MASSERT( FALSE );
07090 return 0;
07091 }
07092
07093 }
07094
07095
07096
07097
07098
07099
07100
07101 CNode* CNode::GetWidthExp()
07102 {
07103 switch( GetOp() ) {
07104 case eERROR:
07105 return NULL;
07106 case eVCONSTANT:
07107 return Arg<CVector*>(0)->GetWidthExp();
07108 case eRCONSTANT:
07109 return NULL;
07110 case eELIST:
07111 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cADD_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07112 case eWIDTH:
07113 return cINT32(Arg<CNode*>(0)->EvalINT32());
07114 case eSUB:
07115 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07116 case eMUL:
07117 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07118 case eDIV:
07119 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07120 case ePOW:
07121 return Arg<CNode*>(0)->GetWidthExp();
07122 case eADD:
07123 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07124 case eLSH:
07125 return Arg<CNode*>(0)->GetWidthExp();
07126 case eRSH:
07127 return Arg<CNode*>(0)->GetWidthExp();
07128 case eLSHA:
07129 return Arg<CNode*>(0)->GetWidthExp();
07130 case eRSHA:
07131 return Arg<CNode*>(0)->GetWidthExp();
07132 case eMOD:
07133 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07134 case eOR:
07135 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07136 case eAND:
07137 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07138 case eANDANDAND:
07139 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07140 case eXOR:
07141 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07142 case eXNOR:
07143 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07144 case eSYSTASK_CALL:
07145 return Systask::WidthExp(Arg<CSymbol*>(0),Arg<CNode*>(1));
07146 case eFUNCTION_CALL:
07147 return CFunction::WidthExp(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
07148 case eARRAY:
07149 return Array::WidthExp(Arg<CNode*>(0),Arg<CNode*>(1));
07150 case eNET_REF:
07151 return Arg<CNet*>(0)->GetWidthExp();
07152 case eVAR_REF:
07153 return Arg<CVar*>(0)->GetWidthExp();
07154 case ePARAM_REF:
07155 return Arg<CParam*>(0)->GetWidthExp();
07156 case ePORT_REF:
07157 return Arg<CPortDir*>(0)->GetWidthExp();
07158 case eFWD_REF:
07159 return Arg<CFref*>(0)->GetWidthExp();
07160 case eGENVAR_REF:
07161 return Arg<CGenvar*>(0)->GetWidthExp();
07162 case eRANGE:
07163 return (1 && 1) ? cABSDIFFPLUS1_N(Arg<CNode*>(0)->Clone(),Arg<CNode*>(1)->Clone(),NULL) : NULL;
07164 case eSLICE:
07165 return (1 && 1) ? cABSDIFFPLUS1_N(Arg<CNode*>(0)->Clone(),Arg<CNode*>(1)->Clone(),NULL) : NULL;
07166 case ePSLICE:
07167 return cINT32(Arg<CNode*>(1)->EvalINT32());
07168 case eMSLICE:
07169 return cINT32(Arg<CNode*>(1)->EvalINT32());
07170 case eCVRI:
07171 return cINT32(32);
07172 case eCVIR:
07173 return NULL;
07174 case eREP:
07175 return (1 && Arg<CNode*>(1)->GetWidthExp()) ? cMUL_N(Arg<CNode*>(0)->Clone(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07176 case eCAT:
07177 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp()) ? cADD_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),NULL) : NULL;
07178 case eUCAT:
07179 return Arg<CNode*>(0)->GetWidthExp();
07180 case eCOM:
07181 return Arg<CNode*>(0)->GetWidthExp();
07182 case eNEG:
07183 return Arg<CNode*>(0)->GetWidthExp();
07184 case ePLUS:
07185 return Arg<CNode*>(0)->GetWidthExp();
07186 case eNOT:
07187 return cINT32(1);
07188 case eGT:
07189 return cINT32(1);
07190 case eGE:
07191 return cINT32(1);
07192 case eLT:
07193 return cINT32(1);
07194 case eLE:
07195 return cINT32(1);
07196 case eLAND:
07197 return cINT32(1);
07198 case eLOR:
07199 return cINT32(1);
07200 case eCEQ:
07201 return cINT32(1);
07202 case eCNE:
07203 return cINT32(1);
07204 case eEQ:
07205 return cINT32(1);
07206 case eNE:
07207 return cINT32(1);
07208 case eRAND:
07209 return cINT32(1);
07210 case eRNAND:
07211 return cINT32(1);
07212 case eROR:
07213 return cINT32(1);
07214 case eRNOR:
07215 return cINT32(1);
07216 case eRXOR:
07217 return cINT32(1);
07218 case eRXNOR:
07219 return cINT32(1);
07220 case eHOOK:
07221 return (Arg<CNode*>(1)->GetWidthExp() && Arg<CNode*>(2)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(1)->GetWidthExp(),Arg<CNode*>(2)->GetWidthExp(),NULL) : NULL;
07222 case eMTM:
07223 return (Arg<CNode*>(0)->GetWidthExp() && Arg<CNode*>(1)->GetWidthExp() && Arg<CNode*>(2)->GetWidthExp()) ? cMAX_N(Arg<CNode*>(0)->GetWidthExp(),Arg<CNode*>(1)->GetWidthExp(),Arg<CNode*>(2)->GetWidthExp(),NULL) : NULL;
07224 case eEXTERNAL_REF:
07225 return External::WidthExp(Arg<CSymbol*>(0));
07226 case eATTRIBUTE:
07227 return cINT32(0);
07228 case eMACRO_EXPR:
07229 return Arg<CNode*>(1)->GetWidthExp();
07230 default:
07231 MASSERT( FALSE );
07232 return NULL;
07233 }
07234 }
07235
07236
07237
07238
07239
07240
07241 int CNode::IsWidthEvaluateable( )
07242 {
07243 switch( GetOp() ) {
07244 case eERROR:
07245 return FALSE;
07246 case eVCONSTANT:
07247 return Arg<CVector*>(0)->IsWidthEvaluateable();
07248 case eRCONSTANT:
07249 return FALSE;
07250 case eELIST:
07251 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07252 case eWIDTH:
07253 return Arg<CNode*>(0)->IsEvaluateable();
07254 case eSUB:
07255 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07256 case eMUL:
07257 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07258 case eDIV:
07259 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07260 case ePOW:
07261 return Arg<CNode*>(0)->IsWidthEvaluateable();
07262 case eADD:
07263 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07264 case eLSH:
07265 return Arg<CNode*>(0)->IsWidthEvaluateable();
07266 case eRSH:
07267 return Arg<CNode*>(0)->IsWidthEvaluateable();
07268 case eLSHA:
07269 return Arg<CNode*>(0)->IsWidthEvaluateable();
07270 case eRSHA:
07271 return Arg<CNode*>(0)->IsWidthEvaluateable();
07272 case eMOD:
07273 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07274 case eOR:
07275 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07276 case eAND:
07277 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07278 case eANDANDAND:
07279 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07280 case eXOR:
07281 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07282 case eXNOR:
07283 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07284 case eSYSTASK_CALL:
07285 return Systask::WidthEvaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1));
07286 case eFUNCTION_CALL:
07287 return CFunction::WidthEvaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CScope*>(2));
07288 case eARRAY:
07289 return Array::WidthEvaluateable(Arg<CNode*>(0),Arg<CNode*>(1));
07290 case eNET_REF:
07291 return Arg<CNet*>(0)->IsWidthEvaluateable();
07292 case eVAR_REF:
07293 return Arg<CVar*>(0)->IsWidthEvaluateable();
07294 case ePARAM_REF:
07295 return Arg<CParam*>(0)->IsWidthEvaluateable();
07296 case ePORT_REF:
07297 return Arg<CPortDir*>(0)->IsWidthEvaluateable();
07298 case eFWD_REF:
07299 return Arg<CFref*>(0)->IsWidthEvaluateable();
07300 case eGENVAR_REF:
07301 return Arg<CGenvar*>(0)->IsWidthEvaluateable();
07302 case eRANGE:
07303 return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsEvaluateable();
07304 case eSLICE:
07305 return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsEvaluateable();
07306 case ePSLICE:
07307 return Arg<CNode*>(1)->IsEvaluateable();
07308 case eMSLICE:
07309 return Arg<CNode*>(1)->IsEvaluateable();
07310 case eCVRI:
07311 return TRUE;
07312 case eCVIR:
07313 return FALSE;
07314 case eREP:
07315 return Arg<CNode*>(0)->IsEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07316 case eCAT:
07317 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable();
07318 case eUCAT:
07319 return Arg<CNode*>(0)->IsWidthEvaluateable();
07320 case eCOM:
07321 return Arg<CNode*>(0)->IsWidthEvaluateable();
07322 case eNEG:
07323 return Arg<CNode*>(0)->IsWidthEvaluateable();
07324 case ePLUS:
07325 return Arg<CNode*>(0)->IsWidthEvaluateable();
07326 case eNOT:
07327 return TRUE;
07328 case eGT:
07329 return TRUE;
07330 case eGE:
07331 return TRUE;
07332 case eLT:
07333 return TRUE;
07334 case eLE:
07335 return TRUE;
07336 case eLAND:
07337 return TRUE;
07338 case eLOR:
07339 return TRUE;
07340 case eCEQ:
07341 return TRUE;
07342 case eCNE:
07343 return TRUE;
07344 case eEQ:
07345 return TRUE;
07346 case eNE:
07347 return TRUE;
07348 case eRAND:
07349 return TRUE;
07350 case eRNAND:
07351 return TRUE;
07352 case eROR:
07353 return TRUE;
07354 case eRNOR:
07355 return TRUE;
07356 case eRXOR:
07357 return TRUE;
07358 case eRXNOR:
07359 return TRUE;
07360 case eHOOK:
07361 return Arg<CNode*>(1)->IsWidthEvaluateable() && Arg<CNode*>(2)->IsWidthEvaluateable();
07362 case eMTM:
07363 return Arg<CNode*>(0)->IsWidthEvaluateable() && Arg<CNode*>(1)->IsWidthEvaluateable() && Arg<CNode*>(2)->IsWidthEvaluateable();
07364 case eEXTERNAL_REF:
07365 return External::WidthEvaluateable(Arg<CSymbol*>(0));
07366 case eATTRIBUTE:
07367 return TRUE;
07368 case eMACRO_EXPR:
07369 return Arg<CNode*>(1)->IsWidthEvaluateable();
07370 default:
07371 MASSERT( FALSE );
07372 return 0;
07373 }
07374 }
07375
07376
07377
07378
07379
07380
07381
07382
07383 int CNode::IsNonX( int integerIsNonX, char* exclude )
07384 {
07385 switch( GetOp() ) {
07386 case eERROR:
07387 return FALSE;
07388 case eVCONSTANT:
07389 return !Arg<CVector*>(0)->HasXZ();
07390 case eRCONSTANT:
07391 return TRUE;
07392 case eELIST:
07393 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07394 case eWIDTH:
07395 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07396 case eSUB:
07397 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07398 case eMUL:
07399 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07400 case eDIV:
07401 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07402 case ePOW:
07403 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07404 case eADD:
07405 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07406 case eLSH:
07407 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07408 case eRSH:
07409 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07410 case eLSHA:
07411 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07412 case eRSHA:
07413 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07414 case eMOD:
07415 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07416 case eOR:
07417 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07418 case eAND:
07419 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07420 case eANDANDAND:
07421 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07422 case eXOR:
07423 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07424 case eXNOR:
07425 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07426 case eSYSTASK_CALL:
07427 return FALSE;
07428 case eFUNCTION_CALL:
07429 return FALSE;
07430 case eARRAY:
07431 return FALSE;
07432 case eNET_REF:
07433 return Arg<CDecl*>(0)->HasAttribute( exclude ) ||
07434
07435 (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINT);
07436 case eVAR_REF:
07437 return Arg<CDecl*>(0)->GetDataType()->GetTwoState() ||
07438
07439 Arg<CDecl*>(0)->GetNodeType() == eR ||
07440
07441 Arg<CDecl*>(0)->HasAttribute( exclude ) ||
07442
07443 (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINTEGER);
07444 case ePARAM_REF:
07445 return TRUE;
07446 case ePORT_REF:
07447 return Arg<CDecl*>(0)->HasAttribute( exclude ) ||
07448
07449 (integerIsNonX && Arg<CDecl*>(0)->GetDataType()->GetVarDataType() == eINT);
07450 case eFWD_REF:
07451 return FALSE;
07452 case eGENVAR_REF:
07453 return TRUE;
07454 case eRANGE:
07455 return FALSE;
07456 case eSLICE:
07457 return FALSE;
07458 case ePSLICE:
07459 return FALSE;
07460 case eMSLICE:
07461 return FALSE;
07462 case eCVRI:
07463 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07464 case eCVIR:
07465 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07466 case eREP:
07467 return Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07468 case eCAT:
07469 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07470 case eUCAT:
07471 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07472 case eCOM:
07473 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07474 case eNEG:
07475 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07476 case ePLUS:
07477 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07478 case eNOT:
07479 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07480 case eGT:
07481 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07482 case eGE:
07483 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07484 case eLT:
07485 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07486 case eLE:
07487 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07488 case eLAND:
07489 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07490 case eLOR:
07491 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07492 case eCEQ:
07493 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07494 case eCNE:
07495 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07496 case eEQ:
07497 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07498 case eNE:
07499 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07500 case eRAND:
07501 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07502 case eRNAND:
07503 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07504 case eROR:
07505 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07506 case eRNOR:
07507 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07508 case eRXOR:
07509 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07510 case eRXNOR:
07511 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07512 case eHOOK:
07513 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(2)->IsNonX( integerIsNonX, exclude );
07514 case ePOSEDGE:
07515 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07516 case eNEGEDGE:
07517 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude );
07518 case eEVOR:
07519 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude );
07520 case eMTM:
07521 return Arg<CNode*>(0)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(1)->IsNonX( integerIsNonX, exclude ) && Arg<CNode*>(2)->IsNonX( integerIsNonX, exclude );
07522 case eEXTERNAL_REF:
07523 return FALSE;
07524 case eMACRO_EXPR:
07525 return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsNonX(integerIsNonX, exclude) : FALSE;
07526 default:
07527 MASSERT( FALSE );
07528 return 0;
07529 }
07530 }
07531
07532
07533
07534
07535
07536
07537
07538 CNode* CNode::Clone( CObstack* heap )
07539 {
07540 int nodeMask = 0;
07541 switch( GetOp() ) {
07542 case eERROR:
07543 nodeMask = 0;
07544 break;
07545 case eVCONSTANT:
07546 nodeMask = 0;
07547 break;
07548 case eRCONSTANT:
07549 nodeMask = 0;
07550 break;
07551 case eCOMMENT:
07552 nodeMask = 0;
07553 break;
07554 case eVRQ:
07555 nodeMask = 0;
07556 break;
07557 case ePRAGMA:
07558 nodeMask = 0;
07559 break;
07560 case eELIST:
07561 nodeMask = 3;
07562 break;
07563 case eWIDTH:
07564 nodeMask = 3;
07565 break;
07566 case eNOP:
07567 nodeMask = 0;
07568 break;
07569 case eSUB:
07570 nodeMask = 3;
07571 break;
07572 case eMUL:
07573 nodeMask = 3;
07574 break;
07575 case eDIV:
07576 nodeMask = 3;
07577 break;
07578 case ePOW:
07579 nodeMask = 3;
07580 break;
07581 case eADD:
07582 nodeMask = 3;
07583 break;
07584 case eLSH:
07585 nodeMask = 3;
07586 break;
07587 case eRSH:
07588 nodeMask = 3;
07589 break;
07590 case eLSHA:
07591 nodeMask = 3;
07592 break;
07593 case eRSHA:
07594 nodeMask = 3;
07595 break;
07596 case eMOD:
07597 nodeMask = 3;
07598 break;
07599 case eOR:
07600 nodeMask = 3;
07601 break;
07602 case eAND:
07603 nodeMask = 3;
07604 break;
07605 case eANDANDAND:
07606 nodeMask = 3;
07607 break;
07608 case eXOR:
07609 nodeMask = 3;
07610 break;
07611 case eXNOR:
07612 nodeMask = 3;
07613 break;
07614 case eINSTANCE_REF:
07615 nodeMask = 0;
07616 break;
07617 case eGATE_REF:
07618 nodeMask = 0;
07619 break;
07620 case eTASK_ENABLE:
07621 nodeMask = 2;
07622 break;
07623 case eSYSTASK_CALL:
07624 nodeMask = 2;
07625 break;
07626 case eTIMING_CALL:
07627 nodeMask = 2;
07628 break;
07629 case eFUNCTION_CALL:
07630 nodeMask = 2;
07631 break;
07632 case eARRAY:
07633 nodeMask = 3;
07634 break;
07635 case eNET_REF:
07636 nodeMask = 0;
07637 break;
07638 case eVAR_REF:
07639 nodeMask = 0;
07640 break;
07641 case ePARAM_REF:
07642 nodeMask = 0;
07643 break;
07644 case ePORT_REF:
07645 nodeMask = 0;
07646 break;
07647 case eFWD_REF:
07648 nodeMask = 0;
07649 break;
07650 case eGENVAR_REF:
07651 nodeMask = 0;
07652 break;
07653 case eNET_DECL:
07654 nodeMask = 2;
07655 break;
07656 case eVAR_DECL:
07657 nodeMask = 2;
07658 break;
07659 case ePARAM_DECL:
07660 nodeMask = 0;
07661 break;
07662 case eSPECPARAM_DECL:
07663 nodeMask = 0;
07664 break;
07665 case ePORT_DECL:
07666 nodeMask = 0;
07667 break;
07668 case eGENVAR_DECL:
07669 nodeMask = 0;
07670 break;
07671 case eLIST:
07672 nodeMask = 3;
07673 break;
07674 case eRANGE:
07675 nodeMask = 3;
07676 break;
07677 case eSLICE:
07678 nodeMask = 3;
07679 break;
07680 case ePSLICE:
07681 nodeMask = 3;
07682 break;
07683 case eMSLICE:
07684 nodeMask = 3;
07685 break;
07686 case eCVRI:
07687 nodeMask = 1;
07688 break;
07689 case eCVIR:
07690 nodeMask = 1;
07691 break;
07692 case eREP:
07693 nodeMask = 3;
07694 break;
07695 case eCAT:
07696 nodeMask = 3;
07697 break;
07698 case eUCAT:
07699 nodeMask = 1;
07700 break;
07701 case eCOM:
07702 nodeMask = 1;
07703 break;
07704 case eNEG:
07705 nodeMask = 1;
07706 break;
07707 case ePLUS:
07708 nodeMask = 1;
07709 break;
07710 case eNOT:
07711 nodeMask = 1;
07712 break;
07713 case eGT:
07714 nodeMask = 3;
07715 break;
07716 case eGE:
07717 nodeMask = 3;
07718 break;
07719 case eLT:
07720 nodeMask = 3;
07721 break;
07722 case eLE:
07723 nodeMask = 3;
07724 break;
07725 case eLAND:
07726 nodeMask = 3;
07727 break;
07728 case eLOR:
07729 nodeMask = 3;
07730 break;
07731 case eCEQ:
07732 nodeMask = 3;
07733 break;
07734 case eCNE:
07735 nodeMask = 3;
07736 break;
07737 case eEQ:
07738 nodeMask = 3;
07739 break;
07740 case eNE:
07741 nodeMask = 3;
07742 break;
07743 case eRAND:
07744 nodeMask = 1;
07745 break;
07746 case eRNAND:
07747 nodeMask = 1;
07748 break;
07749 case eROR:
07750 nodeMask = 1;
07751 break;
07752 case eRNOR:
07753 nodeMask = 1;
07754 break;
07755 case eRXOR:
07756 nodeMask = 1;
07757 break;
07758 case eRXNOR:
07759 nodeMask = 1;
07760 break;
07761 case eHOOK:
07762 nodeMask = 7;
07763 break;
07764 case eINIT:
07765 nodeMask = 1;
07766 break;
07767 case eALWAYS:
07768 nodeMask = 1;
07769 break;
07770 case eEVENT:
07771 nodeMask = 3;
07772 break;
07773 case eBLOCK_REF:
07774 nodeMask = 2;
07775 break;
07776 case eSPECIFY_REF:
07777 nodeMask = 2;
07778 break;
07779 case eASSIGN:
07780 nodeMask = 7;
07781 break;
07782 case eFORCE:
07783 nodeMask = 3;
07784 break;
07785 case eRELEASE:
07786 nodeMask = 1;
07787 break;
07788 case eNBASSIGN:
07789 nodeMask = 7;
07790 break;
07791 case ePOSEDGE:
07792 nodeMask = 1;
07793 break;
07794 case eNEGEDGE:
07795 nodeMask = 1;
07796 break;
07797 case eEDGE:
07798 nodeMask = 1;
07799 break;
07800 case eEVOR:
07801 nodeMask = 3;
07802 break;
07803 case eDELAY:
07804 nodeMask = 3;
07805 break;
07806 case eMTM:
07807 nodeMask = 7;
07808 break;
07809 case eIF:
07810 nodeMask = 7;
07811 break;
07812 case eFOREVER:
07813 nodeMask = 1;
07814 break;
07815 case eREPEAT:
07816 nodeMask = 3;
07817 break;
07818 case eWHILE:
07819 nodeMask = 3;
07820 break;
07821 case eWAIT:
07822 nodeMask = 3;
07823 break;
07824 case eFOR:
07825 nodeMask = 15;
07826 break;
07827 case eCASE:
07828 nodeMask = 3;
07829 break;
07830 case eCASEX:
07831 nodeMask = 3;
07832 break;
07833 case eCASEZ:
07834 nodeMask = 3;
07835 break;
07836 case eCASEITEM:
07837 nodeMask = 3;
07838 break;
07839 case eCASSIGN:
07840 nodeMask = 14;
07841 break;
07842 case eARG:
07843 nodeMask = 2;
07844 break;
07845 case eFUNCTION_DEF:
07846 nodeMask = 0;
07847 break;
07848 case eMODULE_DEF:
07849 nodeMask = 0;
07850 break;
07851 case eREPEAT_CONTROL:
07852 nodeMask = 3;
07853 break;
07854 case eDELAY_CONTROL:
07855 nodeMask = 1;
07856 break;
07857 case eEVENT_CONTROL:
07858 nodeMask = 1;
07859 break;
07860 case eEXTERNAL_REF:
07861 nodeMask = 0;
07862 break;
07863 case ePORT_DEF:
07864 nodeMask = 0;
07865 break;
07866 case eDEFPARAM:
07867 nodeMask = 3;
07868 break;
07869 case ePATH:
07870 nodeMask = 82;
07871 break;
07872 case ePATH_ASSIGN:
07873 nodeMask = 7;
07874 break;
07875 case eIFNONE_PATH_ASSIGN:
07876 nodeMask = 3;
07877 break;
07878 case eTRIGGER:
07879 nodeMask = 1;
07880 break;
07881 case ePASSIGN:
07882 nodeMask = 3;
07883 break;
07884 case eDEASSIGN:
07885 nodeMask = 1;
07886 break;
07887 case eDISABLE:
07888 nodeMask = 0;
07889 break;
07890 case eATTRIBUTE:
07891 nodeMask = 0;
07892 break;
07893 case eGIF:
07894 nodeMask = 7;
07895 break;
07896 case eGFOR:
07897 nodeMask = 15;
07898 break;
07899 case eGCASE:
07900 nodeMask = 3;
07901 break;
07902 case eTABLE:
07903 nodeMask = 1;
07904 break;
07905 case eTABLE_ENTRY:
07906 nodeMask = 1;
07907 break;
07908 case eTABLE_SYMBOL:
07909 nodeMask = 0;
07910 break;
07911 case ePORTLIST_END:
07912 nodeMask = 0;
07913 break;
07914 case eMACRO_EXPR:
07915 nodeMask = 2;
07916 break;
07917 default:
07918 MASSERT( FALSE );
07919 }
07920
07921 CNode* n = new(stack) CNode( &loc, op );
07922 n->width = width;
07923 n->type = type;
07924 n->fixedWidth = fixedWidth;
07925 if( attributes ) {
07926 n->attributes = attributes->Clone(heap);
07927 }
07928 for( int i = 0; i < ArgCount(); i++ ) {
07929 if( ((nodeMask>>i)&1) && Arg<CNode*>(i) ) {
07930 n->Arg<CNode*>(i) = Arg<CNode*>(i)->Clone(heap);
07931 } else {
07932 void* tmp = Arg<void*>(i);
07933 n->Arg<void*>(i) = tmp;
07934 }
07935 }
07936 return n;
07937 }
07938
07939
07940
07941
07942
07943
07944
07945
07946
07947 void CNode::PreVisit1( int (*func)(CNode*, void*), void* data )
07948 {
07949 if( !(*func)( this, data ) ) {
07950 return;
07951 }
07952
07953 if( GetAttributes() ) {
07954 GetAttributes()->PreVisit1( func, data );
07955 }
07956
07957 int nodeMask = 0;
07958 switch( GetOp() ) {
07959 case eERROR:
07960 nodeMask = 0;
07961 break;
07962 case eVCONSTANT:
07963 nodeMask = 1;
07964 break;
07965 case eRCONSTANT:
07966 nodeMask = 1;
07967 break;
07968 case eCOMMENT:
07969 nodeMask = 1;
07970 break;
07971 case eVRQ:
07972 nodeMask = 1;
07973 break;
07974 case ePRAGMA:
07975 nodeMask = 1;
07976 break;
07977 case eELIST:
07978 nodeMask = 0;
07979 break;
07980 case eWIDTH:
07981 nodeMask = 0;
07982 break;
07983 case eNOP:
07984 nodeMask = 0;
07985 break;
07986 case eSUB:
07987 nodeMask = 0;
07988 break;
07989 case eMUL:
07990 nodeMask = 0;
07991 break;
07992 case eDIV:
07993 nodeMask = 0;
07994 break;
07995 case ePOW:
07996 nodeMask = 0;
07997 break;
07998 case eADD:
07999 nodeMask = 0;
08000 break;
08001 case eLSH:
08002 nodeMask = 0;
08003 break;
08004 case eRSH:
08005 nodeMask = 0;
08006 break;
08007 case eLSHA:
08008 nodeMask = 0;
08009 break;
08010 case eRSHA:
08011 nodeMask = 0;
08012 break;
08013 case eMOD:
08014 nodeMask = 0;
08015 break;
08016 case eOR:
08017 nodeMask = 0;
08018 break;
08019 case eAND:
08020 nodeMask = 0;
08021 break;
08022 case eANDANDAND:
08023 nodeMask = 0;
08024 break;
08025 case eXOR:
08026 nodeMask = 0;
08027 break;
08028 case eXNOR:
08029 nodeMask = 0;
08030 break;
08031 case eINSTANCE_REF:
08032 nodeMask = 1;
08033 if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PreVisit1( func, data );
08034 break;
08035 case eGATE_REF:
08036 nodeMask = 1;
08037 if(Arg<CGate*>(0)) Arg<CGate*>(0)->PreVisit1( func, data );
08038 break;
08039 case eTASK_ENABLE:
08040 nodeMask = 1;
08041 break;
08042 case eSYSTASK_CALL:
08043 nodeMask = 1;
08044 break;
08045 case eTIMING_CALL:
08046 nodeMask = 1;
08047 break;
08048 case eFUNCTION_CALL:
08049 nodeMask = 5;
08050 break;
08051 case eARRAY:
08052 nodeMask = 0;
08053 break;
08054 case eNET_REF:
08055 return;
08056 case eVAR_REF:
08057 return;
08058 case ePARAM_REF:
08059 return;
08060 case ePORT_REF:
08061 return;
08062 case eFWD_REF:
08063 return;
08064 case eGENVAR_REF:
08065 return;
08066 case eNET_DECL:
08067 nodeMask = 1;
08068 if(Arg<CNet*>(0)) Arg<CNet*>(0)->PreVisit1( func, data );
08069 break;
08070 case eVAR_DECL:
08071 nodeMask = 1;
08072 if(Arg<CVar*>(0)) Arg<CVar*>(0)->PreVisit1( func, data );
08073 break;
08074 case ePARAM_DECL:
08075 nodeMask = 1;
08076 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PreVisit1( func, data );
08077 break;
08078 case eSPECPARAM_DECL:
08079 nodeMask = 1;
08080 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PreVisit1( func, data );
08081 break;
08082 case ePORT_DECL:
08083 nodeMask = 1;
08084 if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PreVisit1( func, data );
08085 break;
08086 case eGENVAR_DECL:
08087 nodeMask = 1;
08088 if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PreVisit1( func, data );
08089 break;
08090 case eLIST:
08091 nodeMask = 0;
08092 break;
08093 case eRANGE:
08094 nodeMask = 0;
08095 break;
08096 case eSLICE:
08097 nodeMask = 0;
08098 break;
08099 case ePSLICE:
08100 nodeMask = 0;
08101 break;
08102 case eMSLICE:
08103 nodeMask = 0;
08104 break;
08105 case eCVRI:
08106 nodeMask = 0;
08107 break;
08108 case eCVIR:
08109 nodeMask = 0;
08110 break;
08111 case eREP:
08112 nodeMask = 0;
08113 break;
08114 case eCAT:
08115 nodeMask = 0;
08116 break;
08117 case eUCAT:
08118 nodeMask = 0;
08119 break;
08120 case eCOM:
08121 nodeMask = 0;
08122 break;
08123 case eNEG:
08124 nodeMask = 0;
08125 break;
08126 case ePLUS:
08127 nodeMask = 0;
08128 break;
08129 case eNOT:
08130 nodeMask = 0;
08131 break;
08132 case eGT:
08133 nodeMask = 0;
08134 break;
08135 case eGE:
08136 nodeMask = 0;
08137 break;
08138 case eLT:
08139 nodeMask = 0;
08140 break;
08141 case eLE:
08142 nodeMask = 0;
08143 break;
08144 case eLAND:
08145 nodeMask = 0;
08146 break;
08147 case eLOR:
08148 nodeMask = 0;
08149 break;
08150 case eCEQ:
08151 nodeMask = 0;
08152 break;
08153 case eCNE:
08154 nodeMask = 0;
08155 break;
08156 case eEQ:
08157 nodeMask = 0;
08158 break;
08159 case eNE:
08160 nodeMask = 0;
08161 break;
08162 case eRAND:
08163 nodeMask = 0;
08164 break;
08165 case eRNAND:
08166 nodeMask = 0;
08167 break;
08168 case eROR:
08169 nodeMask = 0;
08170 break;
08171 case eRNOR:
08172 nodeMask = 0;
08173 break;
08174 case eRXOR:
08175 nodeMask = 0;
08176 break;
08177 case eRXNOR:
08178 nodeMask = 0;
08179 break;
08180 case eHOOK:
08181 nodeMask = 0;
08182 break;
08183 case eINIT:
08184 nodeMask = 0;
08185 break;
08186 case eALWAYS:
08187 nodeMask = 0;
08188 break;
08189 case eEVENT:
08190 nodeMask = 0;
08191 break;
08192 case eBLOCK_REF:
08193 nodeMask = 1;
08194 if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PreVisit1( func, data );
08195 break;
08196 case eSPECIFY_REF:
08197 nodeMask = 1;
08198 if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PreVisit1( func, data );
08199 break;
08200 case eASSIGN:
08201 nodeMask = 0;
08202 break;
08203 case eFORCE:
08204 nodeMask = 0;
08205 break;
08206 case eRELEASE:
08207 nodeMask = 0;
08208 break;
08209 case eNBASSIGN:
08210 nodeMask = 0;
08211 break;
08212 case ePOSEDGE:
08213 nodeMask = 0;
08214 break;
08215 case eNEGEDGE:
08216 nodeMask = 0;
08217 break;
08218 case eEDGE:
08219 nodeMask = 2;
08220 break;
08221 case eEVOR:
08222 nodeMask = 0;
08223 break;
08224 case eDELAY:
08225 nodeMask = 0;
08226 break;
08227 case eMTM:
08228 nodeMask = 0;
08229 break;
08230 case eIF:
08231 nodeMask = 0;
08232 break;
08233 case eFOREVER:
08234 nodeMask = 0;
08235 break;
08236 case eREPEAT:
08237 nodeMask = 0;
08238 break;
08239 case eWHILE:
08240 nodeMask = 0;
08241 break;
08242 case eWAIT:
08243 nodeMask = 0;
08244 break;
08245 case eFOR:
08246 nodeMask = 0;
08247 break;
08248 case eCASE:
08249 nodeMask = 0;
08250 break;
08251 case eCASEX:
08252 nodeMask = 0;
08253 break;
08254 case eCASEZ:
08255 nodeMask = 0;
08256 break;
08257 case eCASEITEM:
08258 nodeMask = 0;
08259 break;
08260 case eCASSIGN:
08261 nodeMask = 1;
08262 break;
08263 case eARG:
08264 nodeMask = 1;
08265 break;
08266 case eFUNCTION_DEF:
08267 nodeMask = 1;
08268 if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PreVisit1( func, data );
08269 break;
08270 case eMODULE_DEF:
08271 nodeMask = 1;
08272 if(Arg<CModule*>(0)) Arg<CModule*>(0)->PreVisit1( func, data );
08273 break;
08274 case eREPEAT_CONTROL:
08275 nodeMask = 0;
08276 break;
08277 case eDELAY_CONTROL:
08278 nodeMask = 0;
08279 break;
08280 case eEVENT_CONTROL:
08281 nodeMask = 0;
08282 break;
08283 case eEXTERNAL_REF:
08284 nodeMask = 1;
08285 break;
08286 case ePORT_DEF:
08287 nodeMask = 1;
08288 if(Arg<CPort*>(0)) Arg<CPort*>(0)->PreVisit1( func, data );
08289 break;
08290 case eDEFPARAM:
08291 nodeMask = 0;
08292 break;
08293 case ePATH:
08294 nodeMask = 45;
08295 break;
08296 case ePATH_ASSIGN:
08297 nodeMask = 0;
08298 break;
08299 case eIFNONE_PATH_ASSIGN:
08300 nodeMask = 0;
08301 break;
08302 case eTRIGGER:
08303 nodeMask = 0;
08304 break;
08305 case ePASSIGN:
08306 nodeMask = 0;
08307 break;
08308 case eDEASSIGN:
08309 nodeMask = 0;
08310 break;
08311 case eDISABLE:
08312 nodeMask = 1;
08313 break;
08314 case eATTRIBUTE:
08315 nodeMask = 1;
08316 if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PreVisit1( func, data );
08317 break;
08318 case eGIF:
08319 nodeMask = 0;
08320 break;
08321 case eGFOR:
08322 nodeMask = 0;
08323 break;
08324 case eGCASE:
08325 nodeMask = 0;
08326 break;
08327 case eTABLE:
08328 nodeMask = 0;
08329 break;
08330 case eTABLE_ENTRY:
08331 nodeMask = 0;
08332 break;
08333 case eTABLE_SYMBOL:
08334 nodeMask = 1;
08335 break;
08336 case ePORTLIST_END:
08337 nodeMask = 0;
08338 break;
08339 case eMACRO_EXPR:
08340 nodeMask = 1;
08341 break;
08342 }
08343
08344
08345
08346
08347 if( GetOp() != eLIST ) {
08348 for( int i = 0; i < ArgCount(); i++ ) {
08349 if( Arg<CNode*>(i) && !((nodeMask>>i)&1) ) Arg<CNode*>(i)->PreVisit1( func, data );
08350 }
08351 } else {
08352 CNode* n = this;
08353 while( 1 ) {
08354 if( n->Arg<CNode*>(0) ) {
08355 n->Arg<CNode*>(0)->PreVisit1( func, data );
08356 }
08357 if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
08358 break;
08359 }
08360 n = n->Arg<CNode*>(1);
08361 if( !(*func)( n, data ) ) {
08362 return;
08363 }
08364 if( n->GetAttributes() ) {
08365 n->GetAttributes()->PreVisit1( func, data );
08366 }
08367 }
08368 if( n->Arg<CNode*>(1) ) {
08369 n->Arg<CNode*>(1)->PreVisit1( func, data );
08370 }
08371 }
08372 }
08373
08374
08375
08376
08377
08378
08379
08380 void CNode::PostVisit1( void (*func)(CNode*, void*), void* data )
08381 {
08382 if( GetAttributes() ) {
08383 GetAttributes()->PostVisit1( func, data );
08384 }
08385
08386 int nodeMask = 0;
08387 switch( GetOp() ) {
08388 case eERROR:
08389 nodeMask = 0;
08390 break;
08391 case eVCONSTANT:
08392 nodeMask = 1;
08393 break;
08394 case eRCONSTANT:
08395 nodeMask = 1;
08396 break;
08397 case eCOMMENT:
08398 nodeMask = 1;
08399 break;
08400 case eVRQ:
08401 nodeMask = 1;
08402 break;
08403 case ePRAGMA:
08404 nodeMask = 1;
08405 break;
08406 case eELIST:
08407 nodeMask = 0;
08408 break;
08409 case eWIDTH:
08410 nodeMask = 0;
08411 break;
08412 case eNOP:
08413 nodeMask = 0;
08414 break;
08415 case eSUB:
08416 nodeMask = 0;
08417 break;
08418 case eMUL:
08419 nodeMask = 0;
08420 break;
08421 case eDIV:
08422 nodeMask = 0;
08423 break;
08424 case ePOW:
08425 nodeMask = 0;
08426 break;
08427 case eADD:
08428 nodeMask = 0;
08429 break;
08430 case eLSH:
08431 nodeMask = 0;
08432 break;
08433 case eRSH:
08434 nodeMask = 0;
08435 break;
08436 case eLSHA:
08437 nodeMask = 0;
08438 break;
08439 case eRSHA:
08440 nodeMask = 0;
08441 break;
08442 case eMOD:
08443 nodeMask = 0;
08444 break;
08445 case eOR:
08446 nodeMask = 0;
08447 break;
08448 case eAND:
08449 nodeMask = 0;
08450 break;
08451 case eANDANDAND:
08452 nodeMask = 0;
08453 break;
08454 case eXOR:
08455 nodeMask = 0;
08456 break;
08457 case eXNOR:
08458 nodeMask = 0;
08459 break;
08460 case eINSTANCE_REF:
08461 nodeMask = 1;
08462 if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PostVisit1( func, data );
08463 break;
08464 case eGATE_REF:
08465 nodeMask = 1;
08466 if(Arg<CGate*>(0)) Arg<CGate*>(0)->PostVisit1( func, data );
08467 break;
08468 case eTASK_ENABLE:
08469 nodeMask = 1;
08470 break;
08471 case eSYSTASK_CALL:
08472 nodeMask = 1;
08473 break;
08474 case eTIMING_CALL:
08475 nodeMask = 1;
08476 break;
08477 case eFUNCTION_CALL:
08478 nodeMask = 5;
08479 break;
08480 case eARRAY:
08481 nodeMask = 0;
08482 break;
08483 case eNET_REF:
08484 nodeMask = ~0;
08485 break;
08486 case eVAR_REF:
08487 nodeMask = ~0;
08488 break;
08489 case ePARAM_REF:
08490 nodeMask = ~0;
08491 break;
08492 case ePORT_REF:
08493 nodeMask = ~0;
08494 break;
08495 case eFWD_REF:
08496 nodeMask = ~0;
08497 break;
08498 case eGENVAR_REF:
08499 nodeMask = ~0;
08500 break;
08501 case eNET_DECL:
08502 nodeMask = 1;
08503 if(Arg<CNet*>(0)) Arg<CNet*>(0)->PostVisit1( func, data );
08504 break;
08505 case eVAR_DECL:
08506 nodeMask = 1;
08507 if(Arg<CVar*>(0)) Arg<CVar*>(0)->PostVisit1( func, data );
08508 break;
08509 case ePARAM_DECL:
08510 nodeMask = 1;
08511 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostVisit1( func, data );
08512 break;
08513 case eSPECPARAM_DECL:
08514 nodeMask = 1;
08515 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostVisit1( func, data );
08516 break;
08517 case ePORT_DECL:
08518 nodeMask = 1;
08519 if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PostVisit1( func, data );
08520 break;
08521 case eGENVAR_DECL:
08522 nodeMask = 1;
08523 if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PostVisit1( func, data );
08524 break;
08525 case eLIST:
08526 nodeMask = 0;
08527 break;
08528 case eRANGE:
08529 nodeMask = 0;
08530 break;
08531 case eSLICE:
08532 nodeMask = 0;
08533 break;
08534 case ePSLICE:
08535 nodeMask = 0;
08536 break;
08537 case eMSLICE:
08538 nodeMask = 0;
08539 break;
08540 case eCVRI:
08541 nodeMask = 0;
08542 break;
08543 case eCVIR:
08544 nodeMask = 0;
08545 break;
08546 case eREP:
08547 nodeMask = 0;
08548 break;
08549 case eCAT:
08550 nodeMask = 0;
08551 break;
08552 case eUCAT:
08553 nodeMask = 0;
08554 break;
08555 case eCOM:
08556 nodeMask = 0;
08557 break;
08558 case eNEG:
08559 nodeMask = 0;
08560 break;
08561 case ePLUS:
08562 nodeMask = 0;
08563 break;
08564 case eNOT:
08565 nodeMask = 0;
08566 break;
08567 case eGT:
08568 nodeMask = 0;
08569 break;
08570 case eGE:
08571 nodeMask = 0;
08572 break;
08573 case eLT:
08574 nodeMask = 0;
08575 break;
08576 case eLE:
08577 nodeMask = 0;
08578 break;
08579 case eLAND:
08580 nodeMask = 0;
08581 break;
08582 case eLOR:
08583 nodeMask = 0;
08584 break;
08585 case eCEQ:
08586 nodeMask = 0;
08587 break;
08588 case eCNE:
08589 nodeMask = 0;
08590 break;
08591 case eEQ:
08592 nodeMask = 0;
08593 break;
08594 case eNE:
08595 nodeMask = 0;
08596 break;
08597 case eRAND:
08598 nodeMask = 0;
08599 break;
08600 case eRNAND:
08601 nodeMask = 0;
08602 break;
08603 case eROR:
08604 nodeMask = 0;
08605 break;
08606 case eRNOR:
08607 nodeMask = 0;
08608 break;
08609 case eRXOR:
08610 nodeMask = 0;
08611 break;
08612 case eRXNOR:
08613 nodeMask = 0;
08614 break;
08615 case eHOOK:
08616 nodeMask = 0;
08617 break;
08618 case eINIT:
08619 nodeMask = 0;
08620 break;
08621 case eALWAYS:
08622 nodeMask = 0;
08623 break;
08624 case eEVENT:
08625 nodeMask = 0;
08626 break;
08627 case eBLOCK_REF:
08628 nodeMask = 1;
08629 if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PostVisit1( func, data );
08630 break;
08631 case eSPECIFY_REF:
08632 nodeMask = 1;
08633 if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PostVisit1( func, data );
08634 break;
08635 case eASSIGN:
08636 nodeMask = 0;
08637 break;
08638 case eFORCE:
08639 nodeMask = 0;
08640 break;
08641 case eRELEASE:
08642 nodeMask = 0;
08643 break;
08644 case eNBASSIGN:
08645 nodeMask = 0;
08646 break;
08647 case ePOSEDGE:
08648 nodeMask = 0;
08649 break;
08650 case eNEGEDGE:
08651 nodeMask = 0;
08652 break;
08653 case eEDGE:
08654 nodeMask = 2;
08655 break;
08656 case eEVOR:
08657 nodeMask = 0;
08658 break;
08659 case eDELAY:
08660 nodeMask = 0;
08661 break;
08662 case eMTM:
08663 nodeMask = 0;
08664 break;
08665 case eIF:
08666 nodeMask = 0;
08667 break;
08668 case eFOREVER:
08669 nodeMask = 0;
08670 break;
08671 case eREPEAT:
08672 nodeMask = 0;
08673 break;
08674 case eWHILE:
08675 nodeMask = 0;
08676 break;
08677 case eWAIT:
08678 nodeMask = 0;
08679 break;
08680 case eFOR:
08681 nodeMask = 0;
08682 break;
08683 case eCASE:
08684 nodeMask = 0;
08685 break;
08686 case eCASEX:
08687 nodeMask = 0;
08688 break;
08689 case eCASEZ:
08690 nodeMask = 0;
08691 break;
08692 case eCASEITEM:
08693 nodeMask = 0;
08694 break;
08695 case eCASSIGN:
08696 nodeMask = 1;
08697 break;
08698 case eARG:
08699 nodeMask = 1;
08700 break;
08701 case eFUNCTION_DEF:
08702 nodeMask = 1;
08703 if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PostVisit1( func, data );
08704 break;
08705 case eMODULE_DEF:
08706 nodeMask = 1;
08707 if(Arg<CModule*>(0)) Arg<CModule*>(0)->PostVisit1( func, data );
08708 break;
08709 case eREPEAT_CONTROL:
08710 nodeMask = 0;
08711 break;
08712 case eDELAY_CONTROL:
08713 nodeMask = 0;
08714 break;
08715 case eEVENT_CONTROL:
08716 nodeMask = 0;
08717 break;
08718 case eEXTERNAL_REF:
08719 nodeMask = 1;
08720 break;
08721 case ePORT_DEF:
08722 nodeMask = 1;
08723 if(Arg<CPort*>(0)) Arg<CPort*>(0)->PostVisit1( func, data );
08724 break;
08725 case eDEFPARAM:
08726 nodeMask = 0;
08727 break;
08728 case ePATH:
08729 nodeMask = 45;
08730 break;
08731 case ePATH_ASSIGN:
08732 nodeMask = 0;
08733 break;
08734 case eIFNONE_PATH_ASSIGN:
08735 nodeMask = 0;
08736 break;
08737 case eTRIGGER:
08738 nodeMask = 0;
08739 break;
08740 case ePASSIGN:
08741 nodeMask = 0;
08742 break;
08743 case eDEASSIGN:
08744 nodeMask = 0;
08745 break;
08746 case eDISABLE:
08747 nodeMask = 1;
08748 break;
08749 case eATTRIBUTE:
08750 nodeMask = 1;
08751 if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PostVisit1( func, data );
08752 break;
08753 case eGIF:
08754 nodeMask = 0;
08755 break;
08756 case eGFOR:
08757 nodeMask = 0;
08758 break;
08759 case eGCASE:
08760 nodeMask = 0;
08761 break;
08762 case eTABLE:
08763 nodeMask = 0;
08764 break;
08765 case eTABLE_ENTRY:
08766 nodeMask = 0;
08767 break;
08768 case eTABLE_SYMBOL:
08769 nodeMask = 1;
08770 break;
08771 case ePORTLIST_END:
08772 nodeMask = 0;
08773 break;
08774 case eMACRO_EXPR:
08775 nodeMask = 1;
08776 break;
08777 }
08778
08779
08780
08781
08782 if( GetOp() != eLIST ) {
08783 for( int i = 0; i < ArgCount(); i++ ) {
08784 if( Arg<CNode*>(i) && !((nodeMask>>i)&1) ) Arg<CNode*>(i)->PostVisit1( func, data );
08785 }
08786 } else {
08787 std::stack<CNode*> visitLog;
08788 CNode* n = this;
08789 while( 1 ) {
08790 if( n->Arg<CNode*>(0) ) {
08791 n->Arg<CNode*>(0)-> PostVisit1( func, data );
08792 }
08793 if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
08794 break;
08795 }
08796 visitLog.push(n);
08797 n = n->Arg<CNode*>(1);
08798 if( n->GetAttributes() ) {
08799 n->GetAttributes()->PostVisit1( func, data );
08800 }
08801 }
08802 if( n->Arg<CNode*>(1) ) {
08803 n->Arg<CNode*>(1)->PostVisit1( func, data );
08804 }
08805 while( !visitLog.empty() ) {
08806 CNode* top = visitLog.top();
08807 if( top->Arg<CNode*>(1) ) {
08808 (*func)(top->Arg<CNode*>(1),data);
08809 }
08810 visitLog.pop();
08811 }
08812 }
08813
08814 (*func)( this, data );
08815 }
08816
08817
08818
08819
08820
08821
08822
08823
08824 CNode* CNode::PostSubVisit1( CNode* (*func)(CNode*, void*), void* data )
08825 {
08826 if( GetAttributes() ) {
08827 SetAttributes( GetAttributes()->PostSubVisit1( func, data ) );
08828 }
08829
08830 int nodeMask = 0;
08831 switch( GetOp() ) {
08832 case eERROR:
08833 nodeMask = 0;
08834 break;
08835 case eVCONSTANT:
08836 nodeMask = 1;
08837 break;
08838 case eRCONSTANT:
08839 nodeMask = 1;
08840 break;
08841 case eCOMMENT:
08842 nodeMask = 1;
08843 break;
08844 case eVRQ:
08845 nodeMask = 1;
08846 break;
08847 case ePRAGMA:
08848 nodeMask = 1;
08849 break;
08850 case eELIST:
08851 nodeMask = 0;
08852 break;
08853 case eWIDTH:
08854 nodeMask = 0;
08855 break;
08856 case eNOP:
08857 nodeMask = 0;
08858 break;
08859 case eSUB:
08860 nodeMask = 0;
08861 break;
08862 case eMUL:
08863 nodeMask = 0;
08864 break;
08865 case eDIV:
08866 nodeMask = 0;
08867 break;
08868 case ePOW:
08869 nodeMask = 0;
08870 break;
08871 case eADD:
08872 nodeMask = 0;
08873 break;
08874 case eLSH:
08875 nodeMask = 0;
08876 break;
08877 case eRSH:
08878 nodeMask = 0;
08879 break;
08880 case eLSHA:
08881 nodeMask = 0;
08882 break;
08883 case eRSHA:
08884 nodeMask = 0;
08885 break;
08886 case eMOD:
08887 nodeMask = 0;
08888 break;
08889 case eOR:
08890 nodeMask = 0;
08891 break;
08892 case eAND:
08893 nodeMask = 0;
08894 break;
08895 case eANDANDAND:
08896 nodeMask = 0;
08897 break;
08898 case eXOR:
08899 nodeMask = 0;
08900 break;
08901 case eXNOR:
08902 nodeMask = 0;
08903 break;
08904 case eINSTANCE_REF:
08905 nodeMask = 1;
08906 if(Arg<CInstance*>(0)) Arg<CInstance*>(0)->PostSubVisit1( func, data );
08907 break;
08908 case eGATE_REF:
08909 nodeMask = 1;
08910 if(Arg<CGate*>(0)) Arg<CGate*>(0)->PostSubVisit1( func, data );
08911 break;
08912 case eTASK_ENABLE:
08913 nodeMask = 1;
08914 break;
08915 case eSYSTASK_CALL:
08916 nodeMask = 1;
08917 break;
08918 case eTIMING_CALL:
08919 nodeMask = 1;
08920 break;
08921 case eFUNCTION_CALL:
08922 nodeMask = 5;
08923 break;
08924 case eARRAY:
08925 nodeMask = 0;
08926 break;
08927 case eNET_REF:
08928 nodeMask = ~0;
08929 break;
08930 case eVAR_REF:
08931 nodeMask = ~0;
08932 break;
08933 case ePARAM_REF:
08934 nodeMask = ~0;
08935 break;
08936 case ePORT_REF:
08937 nodeMask = ~0;
08938 break;
08939 case eFWD_REF:
08940 nodeMask = ~0;
08941 break;
08942 case eGENVAR_REF:
08943 nodeMask = ~0;
08944 break;
08945 case eNET_DECL:
08946 nodeMask = 1;
08947 if(Arg<CNet*>(0)) Arg<CNet*>(0)->PostSubVisit1( func, data );
08948 break;
08949 case eVAR_DECL:
08950 nodeMask = 1;
08951 if(Arg<CVar*>(0)) Arg<CVar*>(0)->PostSubVisit1( func, data );
08952 break;
08953 case ePARAM_DECL:
08954 nodeMask = 1;
08955 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostSubVisit1( func, data );
08956 break;
08957 case eSPECPARAM_DECL:
08958 nodeMask = 1;
08959 if(Arg<CParam*>(0)) Arg<CParam*>(0)->PostSubVisit1( func, data );
08960 break;
08961 case ePORT_DECL:
08962 nodeMask = 1;
08963 if(Arg<CPortDir*>(0)) Arg<CPortDir*>(0)->PostSubVisit1( func, data );
08964 break;
08965 case eGENVAR_DECL:
08966 nodeMask = 1;
08967 if(Arg<CGenvar*>(0)) Arg<CGenvar*>(0)->PostSubVisit1( func, data );
08968 break;
08969 case eLIST:
08970 nodeMask = 0;
08971 break;
08972 case eRANGE:
08973 nodeMask = 0;
08974 break;
08975 case eSLICE:
08976 nodeMask = 0;
08977 break;
08978 case ePSLICE:
08979 nodeMask = 0;
08980 break;
08981 case eMSLICE:
08982 nodeMask = 0;
08983 break;
08984 case eCVRI:
08985 nodeMask = 0;
08986 break;
08987 case eCVIR:
08988 nodeMask = 0;
08989 break;
08990 case eREP:
08991 nodeMask = 0;
08992 break;
08993 case eCAT:
08994 nodeMask = 0;
08995 break;
08996 case eUCAT:
08997 nodeMask = 0;
08998 break;
08999 case eCOM:
09000 nodeMask = 0;
09001 break;
09002 case eNEG:
09003 nodeMask = 0;
09004 break;
09005 case ePLUS:
09006 nodeMask = 0;
09007 break;
09008 case eNOT:
09009 nodeMask = 0;
09010 break;
09011 case eGT:
09012 nodeMask = 0;
09013 break;
09014 case eGE:
09015 nodeMask = 0;
09016 break;
09017 case eLT:
09018 nodeMask = 0;
09019 break;
09020 case eLE:
09021 nodeMask = 0;
09022 break;
09023 case eLAND:
09024 nodeMask = 0;
09025 break;
09026 case eLOR:
09027 nodeMask = 0;
09028 break;
09029 case eCEQ:
09030 nodeMask = 0;
09031 break;
09032 case eCNE:
09033 nodeMask = 0;
09034 break;
09035 case eEQ:
09036 nodeMask = 0;
09037 break;
09038 case eNE:
09039 nodeMask = 0;
09040 break;
09041 case eRAND:
09042 nodeMask = 0;
09043 break;
09044 case eRNAND:
09045 nodeMask = 0;
09046 break;
09047 case eROR:
09048 nodeMask = 0;
09049 break;
09050 case eRNOR:
09051 nodeMask = 0;
09052 break;
09053 case eRXOR:
09054 nodeMask = 0;
09055 break;
09056 case eRXNOR:
09057 nodeMask = 0;
09058 break;
09059 case eHOOK:
09060 nodeMask = 0;
09061 break;
09062 case eINIT:
09063 nodeMask = 0;
09064 break;
09065 case eALWAYS:
09066 nodeMask = 0;
09067 break;
09068 case eEVENT:
09069 nodeMask = 0;
09070 break;
09071 case eBLOCK_REF:
09072 nodeMask = 1;
09073 if(Arg<CBlock*>(0)) Arg<CBlock*>(0)->PostSubVisit1( func, data );
09074 break;
09075 case eSPECIFY_REF:
09076 nodeMask = 1;
09077 if(Arg<CSpecify*>(0)) Arg<CSpecify*>(0)->PostSubVisit1( func, data );
09078 break;
09079 case eASSIGN:
09080 nodeMask = 0;
09081 break;
09082 case eFORCE:
09083 nodeMask = 0;
09084 break;
09085 case eRELEASE:
09086 nodeMask = 0;
09087 break;
09088 case eNBASSIGN:
09089 nodeMask = 0;
09090 break;
09091 case ePOSEDGE:
09092 nodeMask = 0;
09093 break;
09094 case eNEGEDGE:
09095 nodeMask = 0;
09096 break;
09097 case eEDGE:
09098 nodeMask = 2;
09099 break;
09100 case eEVOR:
09101 nodeMask = 0;
09102 break;
09103 case eDELAY:
09104 nodeMask = 0;
09105 break;
09106 case eMTM:
09107 nodeMask = 0;
09108 break;
09109 case eIF:
09110 nodeMask = 0;
09111 break;
09112 case eFOREVER:
09113 nodeMask = 0;
09114 break;
09115 case eREPEAT:
09116 nodeMask = 0;
09117 break;
09118 case eWHILE:
09119 nodeMask = 0;
09120 break;
09121 case eWAIT:
09122 nodeMask = 0;
09123 break;
09124 case eFOR:
09125 nodeMask = 0;
09126 break;
09127 case eCASE:
09128 nodeMask = 0;
09129 break;
09130 case eCASEX:
09131 nodeMask = 0;
09132 break;
09133 case eCASEZ:
09134 nodeMask = 0;
09135 break;
09136 case eCASEITEM:
09137 nodeMask = 0;
09138 break;
09139 case eCASSIGN:
09140 nodeMask = 1;
09141 break;
09142 case eARG:
09143 nodeMask = 1;
09144 break;
09145 case eFUNCTION_DEF:
09146 nodeMask = 1;
09147 if(Arg<CFunction*>(0)) Arg<CFunction*>(0)->PostSubVisit1( func, data );
09148 break;
09149 case eMODULE_DEF:
09150 nodeMask = 1;
09151 if(Arg<CModule*>(0)) Arg<CModule*>(0)->PostSubVisit1( func, data );
09152 break;
09153 case eREPEAT_CONTROL:
09154 nodeMask = 0;
09155 break;
09156 case eDELAY_CONTROL:
09157 nodeMask = 0;
09158 break;
09159 case eEVENT_CONTROL:
09160 nodeMask = 0;
09161 break;
09162 case eEXTERNAL_REF:
09163 nodeMask = 1;
09164 break;
09165 case ePORT_DEF:
09166 nodeMask = 1;
09167 if(Arg<CPort*>(0)) Arg<CPort*>(0)->PostSubVisit1( func, data );
09168 break;
09169 case eDEFPARAM:
09170 nodeMask = 0;
09171 break;
09172 case ePATH:
09173 nodeMask = 45;
09174 break;
09175 case ePATH_ASSIGN:
09176 nodeMask = 0;
09177 break;
09178 case eIFNONE_PATH_ASSIGN:
09179 nodeMask = 0;
09180 break;
09181 case eTRIGGER:
09182 nodeMask = 0;
09183 break;
09184 case ePASSIGN:
09185 nodeMask = 0;
09186 break;
09187 case eDEASSIGN:
09188 nodeMask = 0;
09189 break;
09190 case eDISABLE:
09191 nodeMask = 1;
09192 break;
09193 case eATTRIBUTE:
09194 nodeMask = 1;
09195 if(Arg<CAttr*>(0)) Arg<CAttr*>(0)->PostSubVisit1( func, data );
09196 break;
09197 case eGIF:
09198 nodeMask = 0;
09199 break;
09200 case eGFOR:
09201 nodeMask = 0;
09202 break;
09203 case eGCASE:
09204 nodeMask = 0;
09205 break;
09206 case eTABLE:
09207 nodeMask = 0;
09208 break;
09209 case eTABLE_ENTRY:
09210 nodeMask = 0;
09211 break;
09212 case eTABLE_SYMBOL:
09213 nodeMask = 1;
09214 break;
09215 case ePORTLIST_END:
09216 nodeMask = 0;
09217 break;
09218 case eMACRO_EXPR:
09219 nodeMask = 1;
09220 break;
09221 }
09222
09223
09224
09225
09226 if( GetOp() != eLIST ) {
09227 for( int i = 0; i < ArgCount(); i++ ) {
09228 if( Arg<CNode*>(i) && !((nodeMask>>i)&1) ) Arg<CNode*>(i) = Arg<CNode*>(i)->PostSubVisit1( func, data );
09229 }
09230 } else {
09231 std::stack<CNode*> visitLog;
09232 CNode* n = this;
09233 while( 1 ) {
09234 if( n->Arg<CNode*>(0) ) {
09235 n->Arg<CNode*>(0) = n->Arg<CNode*>(0)->
09236 PostSubVisit1( func, data );
09237 }
09238 if( !n->Arg<CNode*>(1) || n->Arg<CNode*>(1)->GetOp() != eLIST ) {
09239 break;
09240 }
09241 visitLog.push(n);
09242 n = n->Arg<CNode*>(1);
09243 if( n->GetAttributes() ) {
09244 n->SetAttributes( n->GetAttributes()->PostSubVisit1( func, data ) );
09245 }
09246 }
09247 if( n->Arg<CNode*>(1) ) {
09248 n->Arg<CNode*>(1) = n->Arg<CNode*>(1)->PostSubVisit1( func, data );
09249 }
09250 while( !visitLog.empty() ) {
09251 CNode* top = visitLog.top();
09252 if( top->Arg<CNode*>(1) ) {
09253 top->Arg<CNode*>(1) = (*func)(top->Arg<CNode*>(1),data);
09254 }
09255 visitLog.pop();
09256 }
09257 }
09258
09259 return (*func)( this, data );
09260 }
09261
09262
09263
09264
09265
09266
09267
09268
09269
09270 unsigned CNode::Hash()
09271 {
09272 unsigned result = GetOp();
09273 int nodeMask = 0;
09274 switch( GetOp() ) {
09275 case eERROR:
09276 nodeMask = 0;
09277 break;
09278 case eVCONSTANT:
09279 nodeMask = 1;
09280 result ^= Arg<CVector*>(0)->Hash();
09281 break;
09282 case eRCONSTANT:
09283 nodeMask = 1;
09284 result ^= strlen(Arg<char*>(0));
09285 break;
09286 case eCOMMENT:
09287 nodeMask = 1;
09288 result ^= strlen(Arg<char*>(0));
09289 break;
09290 case eVRQ:
09291 nodeMask = 1;
09292 result ^= strlen(Arg<char*>(0));
09293 break;
09294 case ePRAGMA:
09295 nodeMask = 1;
09296 result ^= strlen(Arg<char*>(0));
09297 break;
09298 case eELIST:
09299 nodeMask = 0;
09300 break;
09301 case eWIDTH:
09302 nodeMask = 0;
09303 break;
09304 case eNOP:
09305 nodeMask = 0;
09306 break;
09307 case eSUB:
09308 nodeMask = 0;
09309 break;
09310 case eMUL:
09311 nodeMask = 0;
09312 break;
09313 case eDIV:
09314 nodeMask = 0;
09315 break;
09316 case ePOW:
09317 nodeMask = 0;
09318 break;
09319 case eADD:
09320 nodeMask = 0;
09321 break;
09322 case eLSH:
09323 nodeMask = 0;
09324 break;
09325 case eRSH:
09326 nodeMask = 0;
09327 break;
09328 case eLSHA:
09329 nodeMask = 0;
09330 break;
09331 case eRSHA:
09332 nodeMask = 0;
09333 break;
09334 case eMOD:
09335 nodeMask = 0;
09336 break;
09337 case eOR:
09338 nodeMask = 0;
09339 break;
09340 case eAND:
09341 nodeMask = 0;
09342 break;
09343 case eANDANDAND:
09344 nodeMask = 0;
09345 break;
09346 case eXOR:
09347 nodeMask = 0;
09348 break;
09349 case eXNOR:
09350 nodeMask = 0;
09351 break;
09352 case eINSTANCE_REF:
09353 nodeMask = 1;
09354 result ^= Arg<unsigned long>(0);
09355 break;
09356 case eGATE_REF:
09357 nodeMask = 1;
09358 result ^= Arg<unsigned long>(0);
09359 break;
09360 case eTASK_ENABLE:
09361 nodeMask = 1;
09362 result ^= Arg<unsigned long>(0);
09363 break;
09364 case eSYSTASK_CALL:
09365 nodeMask = 1;
09366 result ^= Arg<unsigned long>(0);
09367 break;
09368 case eTIMING_CALL:
09369 nodeMask = 1;
09370 result ^= Arg<unsigned long>(0);
09371 break;
09372 case eFUNCTION_CALL:
09373 nodeMask = 5;
09374 result ^= Arg<unsigned long>(0);
09375 result ^= Arg<unsigned long>(2);
09376 break;
09377 case eARRAY:
09378 nodeMask = 0;
09379 break;
09380 case eNET_REF:
09381 nodeMask = 1;
09382 result ^= Arg<unsigned long>(0);
09383 break;
09384 case eVAR_REF:
09385 nodeMask = 1;
09386 result ^= Arg<unsigned long>(0);
09387 break;
09388 case ePARAM_REF:
09389 nodeMask = 1;
09390 result ^= Arg<unsigned long>(0);
09391 break;
09392 case ePORT_REF:
09393 nodeMask = 1;
09394 result ^= Arg<unsigned long>(0);
09395 break;
09396 case eFWD_REF:
09397 nodeMask = 1;
09398 result ^= Arg<unsigned long>(0);
09399 break;
09400 case eGENVAR_REF:
09401 nodeMask = 1;
09402 result ^= Arg<unsigned long>(0);
09403 break;
09404 case eNET_DECL:
09405 nodeMask = 1;
09406 result ^= Arg<unsigned long>(0);
09407 break;
09408 case eVAR_DECL:
09409 nodeMask = 1;
09410 result ^= Arg<unsigned long>(0);
09411 break;
09412 case ePARAM_DECL:
09413 nodeMask = 1;
09414 result ^= Arg<unsigned long>(0);
09415 break;
09416 case eSPECPARAM_DECL:
09417 nodeMask = 1;
09418 result ^= Arg<unsigned long>(0);
09419 break;
09420 case ePORT_DECL:
09421 nodeMask = 1;
09422 result ^= Arg<unsigned long>(0);
09423 break;
09424 case eGENVAR_DECL:
09425 nodeMask = 1;
09426 result ^= Arg<unsigned long>(0);
09427 break;
09428 case eLIST:
09429 nodeMask = 0;
09430 break;
09431 case eRANGE:
09432 nodeMask = 0;
09433 break;
09434 case eSLICE:
09435 nodeMask = 0;
09436 break;
09437 case ePSLICE:
09438 nodeMask = 0;
09439 break;
09440 case eMSLICE:
09441 nodeMask = 0;
09442 break;
09443 case eCVRI:
09444 nodeMask = 0;
09445 break;
09446 case eCVIR:
09447 nodeMask = 0;
09448 break;
09449 case eREP:
09450 nodeMask = 0;
09451 break;
09452 case eCAT:
09453 nodeMask = 0;
09454 break;
09455 case eUCAT:
09456 nodeMask = 0;
09457 break;
09458 case eCOM:
09459 nodeMask = 0;
09460 break;
09461 case eNEG:
09462 nodeMask = 0;
09463 break;
09464 case ePLUS:
09465 nodeMask = 0;
09466 break;
09467 case eNOT:
09468 nodeMask = 0;
09469 break;
09470 case eGT:
09471 nodeMask = 0;
09472 break;
09473 case eGE:
09474 nodeMask = 0;
09475 break;
09476 case eLT:
09477 nodeMask = 0;
09478 break;
09479 case eLE:
09480 nodeMask = 0;
09481 break;
09482 case eLAND:
09483 nodeMask = 0;
09484 break;
09485 case eLOR:
09486 nodeMask = 0;
09487 break;
09488 case eCEQ:
09489 nodeMask = 0;
09490 break;
09491 case eCNE:
09492 nodeMask = 0;
09493 break;
09494 case eEQ:
09495 nodeMask = 0;
09496 break;
09497 case eNE:
09498 nodeMask = 0;
09499 break;
09500 case eRAND:
09501 nodeMask = 0;
09502 break;
09503 case eRNAND:
09504 nodeMask = 0;
09505 break;
09506 case eROR:
09507 nodeMask = 0;
09508 break;
09509 case eRNOR:
09510 nodeMask = 0;
09511 break;
09512 case eRXOR:
09513 nodeMask = 0;
09514 break;
09515 case eRXNOR:
09516 nodeMask = 0;
09517 break;
09518 case eHOOK:
09519 nodeMask = 0;
09520 break;
09521 case eINIT:
09522 nodeMask = 0;
09523 break;
09524 case eALWAYS:
09525 nodeMask = 0;
09526 break;
09527 case eEVENT:
09528 nodeMask = 0;
09529 break;
09530 case eBLOCK_REF:
09531 nodeMask = 1;
09532 result ^= Arg<unsigned long>(0);
09533 break;
09534 case eSPECIFY_REF:
09535 nodeMask = 1;
09536 result ^= Arg<unsigned long>(0);
09537 break;
09538 case eASSIGN:
09539 nodeMask = 0;
09540 break;
09541 case eFORCE:
09542 nodeMask = 0;
09543 break;
09544 case eRELEASE:
09545 nodeMask = 0;
09546 break;
09547 case eNBASSIGN:
09548 nodeMask = 0;
09549 break;
09550 case ePOSEDGE:
09551 nodeMask = 0;
09552 break;
09553 case eNEGEDGE:
09554 nodeMask = 0;
09555 break;
09556 case eEDGE:
09557 nodeMask = 2;
09558 result ^= (unsigned long)Arg<Edge_t>(1);
09559 break;
09560 case eEVOR:
09561 nodeMask = 0;
09562 break;
09563 case eDELAY:
09564 nodeMask = 0;
09565 break;
09566 case eMTM:
09567 nodeMask = 0;
09568 break;
09569 case eIF:
09570 nodeMask = 0;
09571 break;
09572 case eFOREVER:
09573 nodeMask = 0;
09574 break;
09575 case eREPEAT:
09576 nodeMask = 0;
09577 break;
09578 case eWHILE:
09579 nodeMask = 0;
09580 break;
09581 case eWAIT:
09582 nodeMask = 0;
09583 break;
09584 case eFOR:
09585 nodeMask = 0;
09586 break;
09587 case eCASE:
09588 nodeMask = 0;
09589 break;
09590 case eCASEX:
09591 nodeMask = 0;
09592 break;
09593 case eCASEZ:
09594 nodeMask = 0;
09595 break;
09596 case eCASEITEM:
09597 nodeMask = 0;
09598 break;
09599 case eCASSIGN:
09600 nodeMask = 1;
09601 result ^= Arg<unsigned long>(0);
09602 break;
09603 case eARG:
09604 nodeMask = 1;
09605 result ^= Arg<unsigned long>(0);
09606 break;
09607 case eFUNCTION_DEF:
09608 nodeMask = 1;
09609 result ^= Arg<unsigned long>(0);
09610 break;
09611 case eMODULE_DEF:
09612 nodeMask = 1;
09613 result ^= Arg<unsigned long>(0);
09614 break;
09615 case eREPEAT_CONTROL:
09616 nodeMask = 0;
09617 break;
09618 case eDELAY_CONTROL:
09619 nodeMask = 0;
09620 break;
09621 case eEVENT_CONTROL:
09622 nodeMask = 0;
09623 break;
09624 case eEXTERNAL_REF:
09625 nodeMask = 1;
09626 result ^= Arg<unsigned long>(0);
09627 break;
09628 case ePORT_DEF:
09629 nodeMask = 1;
09630 result ^= Arg<unsigned long>(0);
09631 break;
09632 case eDEFPARAM:
09633 nodeMask = 0;
09634 break;
09635 case ePATH:
09636 nodeMask = 45;
09637 result ^= Arg<int>(0);
09638 result ^= Arg<int>(2);
09639 result ^= Arg<int>(3);
09640 result ^= Arg<int>(5);
09641 break;
09642 case ePATH_ASSIGN:
09643 nodeMask = 0;
09644 break;
09645 case eIFNONE_PATH_ASSIGN:
09646 nodeMask = 0;
09647 break;
09648 case eTRIGGER:
09649 nodeMask = 0;
09650 break;
09651 case ePASSIGN:
09652 nodeMask = 0;
09653 break;
09654 case eDEASSIGN:
09655 nodeMask = 0;
09656 break;
09657 case eDISABLE:
09658 nodeMask = 1;
09659 result ^= Arg<unsigned long>(0);
09660 break;
09661 case eATTRIBUTE:
09662 nodeMask = 1;
09663 result ^= Arg<unsigned long>(0);
09664 break;
09665 case eGIF:
09666 nodeMask = 0;
09667 break;
09668 case eGFOR:
09669 nodeMask = 0;
09670 break;
09671 case eGCASE:
09672 nodeMask = 0;
09673 break;
09674 case eTABLE:
09675 nodeMask = 0;
09676 break;
09677 case eTABLE_ENTRY:
09678 nodeMask = 0;
09679 break;
09680 case eTABLE_SYMBOL:
09681 nodeMask = 1;
09682 result ^= strlen(Arg<char*>(0));
09683 break;
09684 case ePORTLIST_END:
09685 nodeMask = 0;
09686 break;
09687 case eMACRO_EXPR:
09688 nodeMask = 1;
09689 result ^= strlen(Arg<char*>(0));
09690 break;
09691 }
09692
09693 for( int i = 0; i < ArgCount(); i++ ) {
09694 if( !((nodeMask>>i)&1) ) result ^= Arg<CNode*>(i)->Hash();
09695 }
09696 return result;
09697 }
09698
09699
09700
09701
09702
09703
09704
09705
09706
09707
09708
09709
09710
09711 int Equivalent( CNode* a, CNode* b )
09712 {
09713
09714
09715
09716 if( a == b ) {
09717 return TRUE;
09718 }
09719
09720
09721
09722 if( a == NULL || b == NULL ) {
09723 return FALSE;
09724 }
09725
09726
09727
09728 if( a->GetOp() != b->GetOp() ) {
09729 return FALSE;
09730 }
09731
09732 int nodeMask = 0;
09733 switch( a->GetOp() ) {
09734 case eERROR:
09735 nodeMask = 0;
09736 break;
09737 case eVCONSTANT:
09738 nodeMask = 1;
09739 if( !(*a->Arg<CVector*>(0)==*b->Arg<CVector*>(0)) ) { return FALSE; }
09740 break;
09741 case eRCONSTANT:
09742 nodeMask = 1;
09743 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
09744 break;
09745 case eCOMMENT:
09746 nodeMask = 1;
09747 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
09748 break;
09749 case eVRQ:
09750 nodeMask = 1;
09751 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
09752 break;
09753 case ePRAGMA:
09754 nodeMask = 1;
09755 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
09756 break;
09757 case eELIST:
09758 nodeMask = 0;
09759 break;
09760 case eWIDTH:
09761 nodeMask = 0;
09762 break;
09763 case eNOP:
09764 nodeMask = 0;
09765 break;
09766 case eSUB:
09767 nodeMask = 0;
09768 break;
09769 case eMUL:
09770 nodeMask = 0;
09771 break;
09772 case eDIV:
09773 nodeMask = 0;
09774 break;
09775 case ePOW:
09776 nodeMask = 0;
09777 break;
09778 case eADD:
09779 nodeMask = 0;
09780 break;
09781 case eLSH:
09782 nodeMask = 0;
09783 break;
09784 case eRSH:
09785 nodeMask = 0;
09786 break;
09787 case eLSHA:
09788 nodeMask = 0;
09789 break;
09790 case eRSHA:
09791 nodeMask = 0;
09792 break;
09793 case eMOD:
09794 nodeMask = 0;
09795 break;
09796 case eOR:
09797 nodeMask = 0;
09798 break;
09799 case eAND:
09800 nodeMask = 0;
09801 break;
09802 case eANDANDAND:
09803 nodeMask = 0;
09804 break;
09805 case eXOR:
09806 nodeMask = 0;
09807 break;
09808 case eXNOR:
09809 nodeMask = 0;
09810 break;
09811 case eINSTANCE_REF:
09812 nodeMask = 1;
09813 if( !(a->Arg<CInstance*>(0)==b->Arg<CInstance*>(0)) ) { return FALSE; }
09814 break;
09815 case eGATE_REF:
09816 nodeMask = 1;
09817 if( !(a->Arg<CGate*>(0)==b->Arg<CGate*>(0)) ) { return FALSE; }
09818 break;
09819 case eTASK_ENABLE:
09820 nodeMask = 1;
09821 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
09822 break;
09823 case eSYSTASK_CALL:
09824 nodeMask = 1;
09825 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
09826 break;
09827 case eTIMING_CALL:
09828 nodeMask = 1;
09829 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
09830 break;
09831 case eFUNCTION_CALL:
09832 nodeMask = 5;
09833 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
09834 if( !(a->Arg<CScope*>(2)==b->Arg<CScope*>(2)) ) { return FALSE; }
09835 break;
09836 case eARRAY:
09837 nodeMask = 0;
09838 break;
09839 case eNET_REF:
09840 nodeMask = 1;
09841 if( !(a->Arg<CNet*>(0)==b->Arg<CNet*>(0)) ) { return FALSE; }
09842 break;
09843 case eVAR_REF:
09844 nodeMask = 1;
09845 if( !(a->Arg<CVar*>(0)==b->Arg<CVar*>(0)) ) { return FALSE; }
09846 break;
09847 case ePARAM_REF:
09848 nodeMask = 1;
09849 if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
09850 break;
09851 case ePORT_REF:
09852 nodeMask = 1;
09853 if( !(a->Arg<CPortDir*>(0)==b->Arg<CPortDir*>(0)) ) { return FALSE; }
09854 break;
09855 case eFWD_REF:
09856 nodeMask = 1;
09857 if( !(a->Arg<CFref*>(0)==b->Arg<CFref*>(0)) ) { return FALSE; }
09858 break;
09859 case eGENVAR_REF:
09860 nodeMask = 1;
09861 if( !(a->Arg<CGenvar*>(0)==b->Arg<CGenvar*>(0)) ) { return FALSE; }
09862 break;
09863 case eNET_DECL:
09864 nodeMask = 1;
09865 if( !(a->Arg<CNet*>(0)==b->Arg<CNet*>(0)) ) { return FALSE; }
09866 break;
09867 case eVAR_DECL:
09868 nodeMask = 1;
09869 if( !(a->Arg<CVar*>(0)==b->Arg<CVar*>(0)) ) { return FALSE; }
09870 break;
09871 case ePARAM_DECL:
09872 nodeMask = 1;
09873 if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
09874 break;
09875 case eSPECPARAM_DECL:
09876 nodeMask = 1;
09877 if( !(a->Arg<CParam*>(0)==b->Arg<CParam*>(0)) ) { return FALSE; }
09878 break;
09879 case ePORT_DECL:
09880 nodeMask = 1;
09881 if( !(a->Arg<CPortDir*>(0)==b->Arg<CPortDir*>(0)) ) { return FALSE; }
09882 break;
09883 case eGENVAR_DECL:
09884 nodeMask = 1;
09885 if( !(a->Arg<CGenvar*>(0)==b->Arg<CGenvar*>(0)) ) { return FALSE; }
09886 break;
09887 case eLIST:
09888 nodeMask = 0;
09889 break;
09890 case eRANGE:
09891 nodeMask = 0;
09892 break;
09893 case eSLICE:
09894 nodeMask = 0;
09895 break;
09896 case ePSLICE:
09897 nodeMask = 0;
09898 break;
09899 case eMSLICE:
09900 nodeMask = 0;
09901 break;
09902 case eCVRI:
09903 nodeMask = 0;
09904 break;
09905 case eCVIR:
09906 nodeMask = 0;
09907 break;
09908 case eREP:
09909 nodeMask = 0;
09910 break;
09911 case eCAT:
09912 nodeMask = 0;
09913 break;
09914 case eUCAT:
09915 nodeMask = 0;
09916 break;
09917 case eCOM:
09918 nodeMask = 0;
09919 break;
09920 case eNEG:
09921 nodeMask = 0;
09922 break;
09923 case ePLUS:
09924 nodeMask = 0;
09925 break;
09926 case eNOT:
09927 nodeMask = 0;
09928 break;
09929 case eGT:
09930 nodeMask = 0;
09931 break;
09932 case eGE:
09933 nodeMask = 0;
09934 break;
09935 case eLT:
09936 nodeMask = 0;
09937 break;
09938 case eLE:
09939 nodeMask = 0;
09940 break;
09941 case eLAND:
09942 nodeMask = 0;
09943 break;
09944 case eLOR:
09945 nodeMask = 0;
09946 break;
09947 case eCEQ:
09948 nodeMask = 0;
09949 break;
09950 case eCNE:
09951 nodeMask = 0;
09952 break;
09953 case eEQ:
09954 nodeMask = 0;
09955 break;
09956 case eNE:
09957 nodeMask = 0;
09958 break;
09959 case eRAND:
09960 nodeMask = 0;
09961 break;
09962 case eRNAND:
09963 nodeMask = 0;
09964 break;
09965 case eROR:
09966 nodeMask = 0;
09967 break;
09968 case eRNOR:
09969 nodeMask = 0;
09970 break;
09971 case eRXOR:
09972 nodeMask = 0;
09973 break;
09974 case eRXNOR:
09975 nodeMask = 0;
09976 break;
09977 case eHOOK:
09978 nodeMask = 0;
09979 break;
09980 case eINIT:
09981 nodeMask = 0;
09982 break;
09983 case eALWAYS:
09984 nodeMask = 0;
09985 break;
09986 case eEVENT:
09987 nodeMask = 0;
09988 break;
09989 case eBLOCK_REF:
09990 nodeMask = 1;
09991 if( !(a->Arg<CBlock*>(0)==b->Arg<CBlock*>(0)) ) { return FALSE; }
09992 break;
09993 case eSPECIFY_REF:
09994 nodeMask = 1;
09995 if( !(a->Arg<CSpecify*>(0)==b->Arg<CSpecify*>(0)) ) { return FALSE; }
09996 break;
09997 case eASSIGN:
09998 nodeMask = 0;
09999 break;
10000 case eFORCE:
10001 nodeMask = 0;
10002 break;
10003 case eRELEASE:
10004 nodeMask = 0;
10005 break;
10006 case eNBASSIGN:
10007 nodeMask = 0;
10008 break;
10009 case ePOSEDGE:
10010 nodeMask = 0;
10011 break;
10012 case eNEGEDGE:
10013 nodeMask = 0;
10014 break;
10015 case eEDGE:
10016 nodeMask = 2;
10017 if( !(a->Arg<Edge_t>(1)==b->Arg<Edge_t>(1)) ) { return FALSE; }
10018 break;
10019 case eEVOR:
10020 nodeMask = 0;
10021 break;
10022 case eDELAY:
10023 nodeMask = 0;
10024 break;
10025 case eMTM:
10026 nodeMask = 0;
10027 break;
10028 case eIF:
10029 nodeMask = 0;
10030 break;
10031 case eFOREVER:
10032 nodeMask = 0;
10033 break;
10034 case eREPEAT:
10035 nodeMask = 0;
10036 break;
10037 case eWHILE:
10038 nodeMask = 0;
10039 break;
10040 case eWAIT:
10041 nodeMask = 0;
10042 break;
10043 case eFOR:
10044 nodeMask = 0;
10045 break;
10046 case eCASE:
10047 nodeMask = 0;
10048 break;
10049 case eCASEX:
10050 nodeMask = 0;
10051 break;
10052 case eCASEZ:
10053 nodeMask = 0;
10054 break;
10055 case eCASEITEM:
10056 nodeMask = 0;
10057 break;
10058 case eCASSIGN:
10059 nodeMask = 1;
10060 if( !(a->Arg<StrengthPair_t*>(0)==b->Arg<StrengthPair_t*>(0)) ) { return FALSE; }
10061 break;
10062 case eARG:
10063 nodeMask = 1;
10064 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
10065 break;
10066 case eFUNCTION_DEF:
10067 nodeMask = 1;
10068 if( !(a->Arg<CFunction*>(0)==b->Arg<CFunction*>(0)) ) { return FALSE; }
10069 break;
10070 case eMODULE_DEF:
10071 nodeMask = 1;
10072 if( !(a->Arg<CModule*>(0)==b->Arg<CModule*>(0)) ) { return FALSE; }
10073 break;
10074 case eREPEAT_CONTROL:
10075 nodeMask = 0;
10076 break;
10077 case eDELAY_CONTROL:
10078 nodeMask = 0;
10079 break;
10080 case eEVENT_CONTROL:
10081 nodeMask = 0;
10082 break;
10083 case eEXTERNAL_REF:
10084 nodeMask = 1;
10085 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
10086 break;
10087 case ePORT_DEF:
10088 nodeMask = 1;
10089 if( !(a->Arg<CPort*>(0)==b->Arg<CPort*>(0)) ) { return FALSE; }
10090 break;
10091 case eDEFPARAM:
10092 nodeMask = 0;
10093 break;
10094 case ePATH:
10095 nodeMask = 45;
10096 if( !(a->Arg<int>(0)==b->Arg<int>(0)) ) { return FALSE; }
10097 if( !(a->Arg<int>(2)==b->Arg<int>(2)) ) { return FALSE; }
10098 if( !(a->Arg<int>(3)==b->Arg<int>(3)) ) { return FALSE; }
10099 if( !(a->Arg<int>(5)==b->Arg<int>(5)) ) { return FALSE; }
10100 break;
10101 case ePATH_ASSIGN:
10102 nodeMask = 0;
10103 break;
10104 case eIFNONE_PATH_ASSIGN:
10105 nodeMask = 0;
10106 break;
10107 case eTRIGGER:
10108 nodeMask = 0;
10109 break;
10110 case ePASSIGN:
10111 nodeMask = 0;
10112 break;
10113 case eDEASSIGN:
10114 nodeMask = 0;
10115 break;
10116 case eDISABLE:
10117 nodeMask = 1;
10118 if( !(a->Arg<CSymbol*>(0)==b->Arg<CSymbol*>(0)) ) { return FALSE; }
10119 break;
10120 case eATTRIBUTE:
10121 nodeMask = 1;
10122 if( !(a->Arg<CAttr*>(0)==b->Arg<CAttr*>(0)) ) { return FALSE; }
10123 break;
10124 case eGIF:
10125 nodeMask = 0;
10126 break;
10127 case eGFOR:
10128 nodeMask = 0;
10129 break;
10130 case eGCASE:
10131 nodeMask = 0;
10132 break;
10133 case eTABLE:
10134 nodeMask = 0;
10135 break;
10136 case eTABLE_ENTRY:
10137 nodeMask = 0;
10138 break;
10139 case eTABLE_SYMBOL:
10140 nodeMask = 1;
10141 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
10142 break;
10143 case ePORTLIST_END:
10144 nodeMask = 0;
10145 break;
10146 case eMACRO_EXPR:
10147 nodeMask = 1;
10148 if( !(!strcmp(a->Arg<char*>(0),b->Arg<char*>(0))) ) { return FALSE; }
10149 break;
10150 }
10151
10152 for( int i = 0; i < a->ArgCount(); i++ ) {
10153 if( !((nodeMask>>i)&1) &&
10154 !Equivalent(a->Arg<CNode*>(i),b->Arg<CNode*>(i)) ) return FALSE;
10155 }
10156 return TRUE;
10157 }
10158
10159
10160
10161
10162
10163
10164 int CNode::IsEvaluateable()
10165 {
10166 switch( op ) {
10167 case eFUNCTION_CALL:
10168 return CFunction::Evaluateable(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;
10169 case ePARAM_REF:
10170 return Arg<CParam*>(0)->GetExpression()->IsEvaluateable();
10171 case eMACRO_EXPR:
10172 return Arg<CNode*>(1) ? Arg<CNode*>(1)->IsEvaluateable() : FALSE;
10173 case eVCONSTANT:
10174 case eRCONSTANT:
10175 return TRUE;
10176 case eWIDTH:
10177 case eSUB:
10178 case eMUL:
10179 case eDIV:
10180 case ePOW:
10181 case eADD:
10182 case eLSH:
10183 case eRSH:
10184 case eLSHA:
10185 case eRSHA:
10186 case eMOD:
10187 case eOR:
10188 case eAND:
10189 case eXOR:
10190 case eXNOR:
10191 case eCVRI:
10192 case eCVIR:
10193 case eREP:
10194 case eCAT:
10195 case eUCAT:
10196 case eCOM:
10197 case eNEG:
10198 case ePLUS:
10199 case eNOT:
10200 case eGT:
10201 case eGE:
10202 case eLT:
10203 case eLE:
10204 case eLAND:
10205 case eLOR:
10206 case eCEQ:
10207 case eCNE:
10208 case eEQ:
10209 case eNE:
10210 case eRAND:
10211 case eRNAND:
10212 case eROR:
10213 case eRNOR:
10214 case eRXOR:
10215 case eRXNOR:
10216 case eHOOK:
10217 break;
10218 case eERROR:
10219 case eCOMMENT:
10220 case eVRQ:
10221 case ePRAGMA:
10222 case eELIST:
10223 case eNOP:
10224 case eANDANDAND:
10225 case eINSTANCE_REF:
10226 case eGATE_REF:
10227 case eTASK_ENABLE:
10228 case eSYSTASK_CALL:
10229 case eTIMING_CALL:
10230 case eARRAY:
10231 case eNET_REF:
10232 case eVAR_REF:
10233 case ePORT_REF:
10234 case eFWD_REF:
10235 case eGENVAR_REF:
10236 case eNET_DECL:
10237 case eVAR_DECL:
10238 case ePARAM_DECL:
10239 case eSPECPARAM_DECL:
10240 case ePORT_DECL:
10241 case eGENVAR_DECL:
10242 case eLIST:
10243 case eRANGE:
10244 case eSLICE:
10245 case ePSLICE:
10246 case eMSLICE:
10247 case eINIT:
10248 case eALWAYS:
10249 case eEVENT:
10250 case eBLOCK_REF:
10251 case eSPECIFY_REF:
10252 case eASSIGN:
10253 case eFORCE:
10254 case eRELEASE:
10255 case eNBASSIGN:
10256 case ePOSEDGE:
10257 case eNEGEDGE:
10258 case eEDGE:
10259 case eEVOR:
10260 case eDELAY:
10261 case eMTM:
10262 case eIF:
10263 case eFOREVER:
10264 case eREPEAT:
10265 case eWHILE:
10266 case eWAIT:
10267 case eFOR:
10268 case eCASE:
10269 case eCASEX:
10270 case eCASEZ:
10271 case eCASEITEM:
10272 case eCASSIGN:
10273 case eARG:
10274 case eFUNCTION_DEF:
10275 case eMODULE_DEF:
10276 case eREPEAT_CONTROL:
10277 case eDELAY_CONTROL:
10278 case eEVENT_CONTROL:
10279 case eEXTERNAL_REF:
10280 case ePORT_DEF:
10281 case eDEFPARAM:
10282 case ePATH:
10283 case ePATH_ASSIGN:
10284 case eIFNONE_PATH_ASSIGN:
10285 case eTRIGGER:
10286 case ePASSIGN:
10287 case eDEASSIGN:
10288 case eDISABLE:
10289 case eATTRIBUTE:
10290 case eGIF:
10291 case eGFOR:
10292 case eGCASE:
10293 case eTABLE:
10294 case eTABLE_ENTRY:
10295 case eTABLE_SYMBOL:
10296 case ePORTLIST_END:
10297 return FALSE;
10298 default:
10299 MASSERT( FALSE );
10300 }
10301
10302 for( int i = 0; i < ArgCount(); i++ ) {
10303 if( !Arg<CNode*>(i)->IsEvaluateable() ) return FALSE;
10304 }
10305
10306 return TRUE;
10307 }
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318 void CNode::_EvalVector( CVector& v )
10319 {
10320 switch( op ) {
10321 case eVCONSTANT:
10322 { int width = v.GetWidth(); v.SetWidth(Arg<CVector*>(0)->GetWidth()); v = *Arg<CVector*>(0); v.SetWidth(width); };
10323 break;
10324 case eWIDTH:
10325 {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;};
10326 break;
10327 case eSUB:
10328 EVAL_VECTOR_BINARY(Sub);
10329 break;
10330 case eMUL:
10331 EVAL_VECTOR_BINARY(Mul);
10332 break;
10333 case eDIV:
10334 EVAL_VECTOR_BINARY(Div);
10335 break;
10336 case ePOW:
10337 EVAL_VECTOR_BINARY(Pow);
10338 break;
10339 case eADD:
10340 EVAL_VECTOR_BINARY(Add);
10341 break;
10342 case eLSH:
10343 EVAL_VECTOR_BINARY_SELF_RIGHT(Lsh);
10344 break;
10345 case eRSH:
10346 EVAL_VECTOR_BINARY_SELF_RIGHT(Rsh);
10347 break;
10348 case eLSHA:
10349 EVAL_VECTOR_BINARY_SELF_RIGHT(Lsha);
10350 break;
10351 case eRSHA:
10352 EVAL_VECTOR_BINARY_SELF_RIGHT(Rsha);
10353 break;
10354 case eMOD:
10355 EVAL_VECTOR_BINARY(Mod);
10356 break;
10357 case eOR:
10358 EVAL_VECTOR_BINARY(Or);
10359 break;
10360 case eAND:
10361 EVAL_VECTOR_BINARY(And);
10362 break;
10363 case eXOR:
10364 EVAL_VECTOR_BINARY(Xor);
10365 break;
10366 case eXNOR:
10367 EVAL_VECTOR_BINARY(Xnor);
10368 break;
10369 case eFUNCTION_CALL:
10370 CFunction::EvalVector(v,Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;
10371 break;
10372 case ePARAM_REF:
10373 EVAL_VECTOR_PARAM_REF();
10374 break;
10375 case eCVRI:
10376 v.LoadReal( Arg<CNode*>(0)->_EvalReal() );
10377 break;
10378 case eREP:
10379 EVAL_VECTOR_BINARY(Rep);
10380 break;
10381 case eCAT:
10382 EVAL_VECTOR_BINARY(Cat);
10383 break;
10384 case eUCAT:
10385 { CVector vv(Arg<CNode*>(0)->width); Arg<CNode*>(0)->_EvalVector(vv); v = vv;};
10386 break;
10387 case eCOM:
10388 EVAL_VECTOR_UNARY(Com);
10389 break;
10390 case eNEG:
10391 EVAL_VECTOR_UNARY(Neg);
10392 break;
10393 case ePLUS:
10394 EVAL_VECTOR_UNARY(Plus);
10395 break;
10396 case eNOT:
10397 EVAL_VECTOR_UNARY(Not);
10398 break;
10399 case eGT:
10400 EVAL_RELATIONAL(Gt);
10401 break;
10402 case eGE:
10403 EVAL_RELATIONAL(Ge);
10404 break;
10405 case eLT:
10406 EVAL_RELATIONAL(Lt);
10407 break;
10408 case eLE:
10409 EVAL_RELATIONAL(Le);
10410 break;
10411 case eLAND:
10412 EVAL_VECTOR_BINARY(Land);
10413 break;
10414 case eLOR:
10415 EVAL_VECTOR_BINARY(Lor);
10416 break;
10417 case eCEQ:
10418 EVAL_RELATIONAL(Ceq);
10419 break;
10420 case eCNE:
10421 EVAL_RELATIONAL(Cne);
10422 break;
10423 case eEQ:
10424 EVAL_RELATIONAL(Eq);
10425 break;
10426 case eNE:
10427 EVAL_RELATIONAL(Ne);
10428 break;
10429 case eRAND:
10430 EVAL_VECTOR_UNARY_SELF(Rand);
10431 break;
10432 case eRNAND:
10433 EVAL_VECTOR_UNARY_SELF(Rnand);
10434 break;
10435 case eROR:
10436 EVAL_VECTOR_UNARY_SELF(Ror);
10437 break;
10438 case eRNOR:
10439 EVAL_VECTOR_UNARY_SELF(Rnor);
10440 break;
10441 case eRXOR:
10442 EVAL_VECTOR_UNARY_SELF(Rxor);
10443 break;
10444 case eRXNOR:
10445 EVAL_VECTOR_UNARY_SELF(Rxnor);
10446 break;
10447 case eHOOK:
10448 EVAL_VECTOR_HOOK();
10449 break;
10450 case eMACRO_EXPR:
10451 Arg<CNode*>(1)->EvalVector(v);
10452 break;
10453 default:
10454 MASSERT( FALSE );
10455 }
10456 }
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467 double CNode::_EvalReal()
10468 {
10469 double d;
10470 switch( op ) {
10471 case eRCONSTANT:
10472 d = s2d(Arg<char*>(0));
10473 break;
10474 case eSUB:
10475 EVAL_REAL_BINARY(Sub);
10476 break;
10477 case eMUL:
10478 EVAL_REAL_BINARY(Mul);
10479 break;
10480 case eDIV:
10481 EVAL_REAL_BINARY(Div);
10482 break;
10483 case ePOW:
10484 EVAL_REAL_BINARY(Pow);
10485 break;
10486 case eADD:
10487 EVAL_REAL_BINARY(Add);
10488 break;
10489 case eFUNCTION_CALL:
10490 d = CFunction::EvalReal(Arg<CSymbol*>(0),Arg<CNode*>(1),Arg<CBlock*>(2));;
10491 break;
10492 case ePARAM_REF:
10493 EVAL_REAL_PARAM_REF();
10494 break;
10495 case eCVIR:
10496 { CVector v(Arg<CNode*>(0)->width); v.Signed(Arg<CNode*>(0)->type == eS); Arg<CNode*>(0)->_EvalVector(v); d = v.GetReal(); };
10497 break;
10498 case eNEG:
10499 EVAL_REAL_UNARY(Neg);
10500 break;
10501 case ePLUS:
10502 EVAL_REAL_UNARY(Plus);
10503 break;
10504 case eHOOK:
10505 EVAL_REAL_HOOK();
10506 break;
10507 case eMACRO_EXPR:
10508 d = Arg<CNode*>(1)->EvalReal();
10509 break;
10510 default:
10511 MASSERT( FALSE );
10512 }
10513 return d;
10514 }
10515
10516
10517
10518
10519
10520 int CNode::ConditionalWiden()
10521 {
10522 switch( GetOp() ) {
10523 case eVCONSTANT:
10524 return 0;
10525 case eRCONSTANT:
10526 return 0;
10527 case eELIST:
10528 return 0;
10529 case eWIDTH:
10530 return 0;
10531 case eSUB:
10532 return 0;
10533 case eMUL:
10534 return 0;
10535 case eDIV:
10536 return 0;
10537 case ePOW:
10538 return 0;
10539 case eADD:
10540 return 0;
10541 case eLSH:
10542 return 0;
10543 case eRSH:
10544 return 0;
10545 case eLSHA:
10546 return 0;
10547 case eRSHA:
10548 return 0;
10549 case eMOD:
10550 return 0;
10551 case eOR:
10552 return 1;
10553 case eAND:
10554 return 1;
10555 case eANDANDAND:
10556 return 0;
10557 case eXOR:
10558 return 1;
10559 case eXNOR:
10560 return 1;
10561 case eSYSTASK_CALL:
10562 return 0;
10563 case eFUNCTION_CALL:
10564 return 0;
10565 case eARRAY:
10566 return 0;
10567 case eNET_REF:
10568 return 0;
10569 case eVAR_REF:
10570 return 0;
10571 case ePARAM_REF:
10572 return 0;
10573 case ePORT_REF:
10574 return 0;
10575 case eFWD_REF:
10576 return 0;
10577 case eGENVAR_REF:
10578 return 0;
10579 case eRANGE:
10580 return 0;
10581 case eSLICE:
10582 return 0;
10583 case ePSLICE:
10584 return 0;
10585 case eMSLICE:
10586 return 0;
10587 case eCVRI:
10588 return 0;
10589 case eCVIR:
10590 return 0;
10591 case eREP:
10592 return 0;
10593 case eCAT:
10594 return 0;
10595 case eUCAT:
10596 return 0;
10597 case eCOM:
10598 return 0;
10599 case eNEG:
10600 return 0;
10601 case ePLUS:
10602 return 0;
10603 case eNOT:
10604 return 0;
10605 case eGT:
10606 return 0;
10607 case eGE:
10608 return 0;
10609 case eLT:
10610 return 0;
10611 case eLE:
10612 return 0;
10613 case eLAND:
10614 return 0;
10615 case eLOR:
10616 return 0;
10617 case eCEQ:
10618 return 0;
10619 case eCNE:
10620 return 0;
10621 case eEQ:
10622 return 0;
10623 case eNE:
10624 return 0;
10625 case eRAND:
10626 return 0;
10627 case eRNAND:
10628 return 0;
10629 case eROR:
10630 return 0;
10631 case eRNOR:
10632 return 0;
10633 case eRXOR:
10634 return 0;
10635 case eRXNOR:
10636 return 0;
10637 case eHOOK:
10638 return 0;
10639 case ePOSEDGE:
10640 return 0;
10641 case eNEGEDGE:
10642 return 0;
10643 case eEVOR:
10644 return 0;
10645 case eMTM:
10646 return 0;
10647 case eEXTERNAL_REF:
10648 return 0;
10649 case eATTRIBUTE:
10650 return 0;
10651 case eMACRO_EXPR:
10652 return 0;
10653 default:
10654 MASSERT( FALSE );
10655 }
10656 return 0;
10657 }
10658
10659
10660
10661
10662
10663
10664 unsigned CNode::NodeMask()
10665 {
10666 switch( GetOp() ) {
10667 case eERROR:
10668 return 0;
10669 case eVCONSTANT:
10670 return 0;
10671 case eRCONSTANT:
10672 return 0;
10673 case eCOMMENT:
10674 return 0;
10675 case eVRQ:
10676 return 0;
10677 case ePRAGMA:
10678 return 0;
10679 case eELIST:
10680 return 3;
10681 case eWIDTH:
10682 return 3;
10683 case eNOP:
10684 return 0;
10685 case eSUB:
10686 return 3;
10687 case eMUL:
10688 return 3;
10689 case eDIV:
10690 return 3;
10691 case ePOW:
10692 return 3;
10693 case eADD:
10694 return 3;
10695 case eLSH:
10696 return 3;
10697 case eRSH:
10698 return 3;
10699 case eLSHA:
10700 return 3;
10701 case eRSHA:
10702 return 3;
10703 case eMOD:
10704 return 3;
10705 case eOR:
10706 return 3;
10707 case eAND:
10708 return 3;
10709 case eANDANDAND:
10710 return 3;
10711 case eXOR:
10712 return 3;
10713 case eXNOR:
10714 return 3;
10715 case eINSTANCE_REF:
10716 return 0;
10717 case eGATE_REF:
10718 return 0;
10719 case eTASK_ENABLE:
10720 return 2;
10721 case eSYSTASK_CALL:
10722 return 2;
10723 case eTIMING_CALL:
10724 return 2;
10725 case eFUNCTION_CALL:
10726 return 2;
10727 case eARRAY:
10728 return 3;
10729 case eNET_REF:
10730 return 0;
10731 case eVAR_REF:
10732 return 0;
10733 case ePARAM_REF:
10734 return 0;
10735 case ePORT_REF:
10736 return 0;
10737 case eFWD_REF:
10738 return 0;
10739 case eGENVAR_REF:
10740 return 0;
10741 case eNET_DECL:
10742 return 2;
10743 case eVAR_DECL:
10744 return 2;
10745 case ePARAM_DECL:
10746 return 0;
10747 case eSPECPARAM_DECL:
10748 return 0;
10749 case ePORT_DECL:
10750 return 0;
10751 case eGENVAR_DECL:
10752 return 0;
10753 case eLIST:
10754 return 3;
10755 case eRANGE:
10756 return 3;
10757 case eSLICE:
10758 return 3;
10759 case ePSLICE:
10760 return 3;
10761 case eMSLICE:
10762 return 3;
10763 case eCVRI:
10764 return 1;
10765 case eCVIR:
10766 return 1;
10767 case eREP:
10768 return 3;
10769 case eCAT:
10770 return 3;
10771 case eUCAT:
10772 return 1;
10773 case eCOM:
10774 return 1;
10775 case eNEG:
10776 return 1;
10777 case ePLUS:
10778 return 1;
10779 case eNOT:
10780 return 1;
10781 case eGT:
10782 return 3;
10783 case eGE:
10784 return 3;
10785 case eLT:
10786 return 3;
10787 case eLE:
10788 return 3;
10789 case eLAND:
10790 return 3;
10791 case eLOR:
10792 return 3;
10793 case eCEQ:
10794 return 3;
10795 case eCNE:
10796 return 3;
10797 case eEQ:
10798 return 3;
10799 case eNE:
10800 return 3;
10801 case eRAND:
10802 return 1;
10803 case eRNAND:
10804 return 1;
10805 case eROR:
10806 return 1;
10807 case eRNOR:
10808 return 1;
10809 case eRXOR:
10810 return 1;
10811 case eRXNOR:
10812 return 1;
10813 case eHOOK:
10814 return 7;
10815 case eINIT:
10816 return 1;
10817 case eALWAYS:
10818 return 1;
10819 case eEVENT:
10820 return 3;
10821 case eBLOCK_REF:
10822 return 2;
10823 case eSPECIFY_REF:
10824 return 2;
10825 case eASSIGN:
10826 return 7;
10827 case eFORCE:
10828 return 3;
10829 case eRELEASE:
10830 return 1;
10831 case eNBASSIGN:
10832 return 7;
10833 case ePOSEDGE:
10834 return 1;
10835 case eNEGEDGE:
10836 return 1;
10837 case eEDGE:
10838 return 1;
10839 case eEVOR:
10840 return 3;
10841 case eDELAY:
10842 return 3;
10843 case eMTM:
10844 return 7;
10845 case eIF:
10846 return 7;
10847 case eFOREVER:
10848 return 1;
10849 case eREPEAT:
10850 return 3;
10851 case eWHILE:
10852 return 3;
10853 case eWAIT:
10854 return 3;
10855 case eFOR:
10856 return 15;
10857 case eCASE:
10858 return 3;
10859 case eCASEX:
10860 return 3;
10861 case eCASEZ:
10862 return 3;
10863 case eCASEITEM:
10864 return 3;
10865 case eCASSIGN:
10866 return 14;
10867 case eARG:
10868 return 2;
10869 case eFUNCTION_DEF:
10870 return 0;
10871 case eMODULE_DEF:
10872 return 0;
10873 case eREPEAT_CONTROL:
10874 return 3;
10875 case eDELAY_CONTROL:
10876 return 1;
10877 case eEVENT_CONTROL:
10878 return 1;
10879 case eEXTERNAL_REF:
10880 return 0;
10881 case ePORT_DEF:
10882 return 0;
10883 case eDEFPARAM:
10884 return 3;
10885 case ePATH:
10886 return 82;
10887 case ePATH_ASSIGN:
10888 return 7;
10889 case eIFNONE_PATH_ASSIGN:
10890 return 3;
10891 case eTRIGGER:
10892 return 1;
10893 case ePASSIGN:
10894 return 3;
10895 case eDEASSIGN:
10896 return 1;
10897 case eDISABLE:
10898 return 0;
10899 case eATTRIBUTE:
10900 return 0;
10901 case eGIF:
10902 return 7;
10903 case eGFOR:
10904 return 15;
10905 case eGCASE:
10906 return 3;
10907 case eTABLE:
10908 return 1;
10909 case eTABLE_ENTRY:
10910 return 1;
10911 case eTABLE_SYMBOL:
10912 return 0;
10913 case ePORTLIST_END:
10914 return 0;
10915 case eMACRO_EXPR:
10916 return 2;
10917 default:
10918 MASSERT( FALSE );
10919 }
10920 return 0;
10921 }
10922
10923
10924
10925
10926
10927
10928 int CNode::WidthFixed()
10929 {
10930 switch( GetOp() ) {
10931 case eVCONSTANT:
10932 return NodeMask()==0;
10933 case eRCONSTANT:
10934 return 1;
10935 case eELIST:
10936 return NodeMask()==0;
10937 case eWIDTH:
10938 return NodeMask()==0;
10939 case eSUB:
10940 return NodeMask()==0;
10941 case eMUL:
10942 return NodeMask()==0;
10943 case eDIV:
10944 return NodeMask()==0;
10945 case ePOW:
10946 return NodeMask()==0;
10947 case eADD:
10948 return NodeMask()==0;
10949 case eLSH:
10950 return NodeMask()==0;
10951 case eRSH:
10952 return NodeMask()==0;
10953 case eLSHA:
10954 return NodeMask()==0;
10955 case eRSHA:
10956 return NodeMask()==0;
10957 case eMOD:
10958 return NodeMask()==0;
10959 case eOR:
10960 return NodeMask()==0;
10961 case eAND:
10962 return NodeMask()==0;
10963 case eANDANDAND:
10964 return NodeMask()==0;
10965 case eXOR:
10966 return NodeMask()==0;
10967 case eXNOR:
10968 return NodeMask()==0;
10969 case eSYSTASK_CALL:
10970 return NodeMask()==0;
10971 case eFUNCTION_CALL:
10972 return NodeMask()==0;
10973 case eARRAY:
10974 return NodeMask()==0;
10975 case eNET_REF:
10976 return NodeMask()==0;
10977 case eVAR_REF:
10978 return NodeMask()==0;
10979 case ePARAM_REF:
10980 return NodeMask()==0;
10981 case ePORT_REF:
10982 return NodeMask()==0;
10983 case eFWD_REF:
10984 return NodeMask()==0;
10985 case eGENVAR_REF:
10986 return NodeMask()==0;
10987 case eRANGE:
10988 return NodeMask()==0;
10989 case eSLICE:
10990 return NodeMask()==0;
10991 case ePSLICE:
10992 return NodeMask()==0;
10993 case eMSLICE:
10994 return NodeMask()==0;
10995 case eCVRI:
10996 return 1;
10997 case eCVIR:
10998 return 1;
10999 case eREP:
11000 return NodeMask()==0;
11001 case eCAT:
11002 return NodeMask()==0;
11003 case eUCAT:
11004 return NodeMask()==0;
11005 case eCOM:
11006 return NodeMask()==0;
11007 case eNEG:
11008 return NodeMask()==0;
11009 case ePLUS:
11010 return NodeMask()==0;
11011 case eNOT:
11012 return 1;
11013 case eGT:
11014 return 1;
11015 case eGE:
11016 return 1;
11017 case eLT:
11018 return 1;
11019 case eLE:
11020 return 1;
11021 case eLAND:
11022 return 1;
11023 case eLOR:
11024 return 1;
11025 case eCEQ:
11026 return 1;
11027 case eCNE:
11028 return 1;
11029 case eEQ:
11030 return 1;
11031 case eNE:
11032 return 1;
11033 case eRAND:
11034 return 1;
11035 case eRNAND:
11036 return 1;
11037 case eROR:
11038 return 1;
11039 case eRNOR:
11040 return 1;
11041 case eRXOR:
11042 return 1;
11043 case eRXNOR:
11044 return 1;
11045 case eHOOK:
11046 return NodeMask()==0;
11047 case ePOSEDGE:
11048 return NodeMask()==0;
11049 case eNEGEDGE:
11050 return NodeMask()==0;
11051 case eEVOR:
11052 return NodeMask()==0;
11053 case eMTM:
11054 return NodeMask()==0;
11055 case eEXTERNAL_REF:
11056 return NodeMask()==0;
11057 case eATTRIBUTE:
11058 return 1;
11059 case eMACRO_EXPR:
11060 return NodeMask()==0;
11061 default:
11062 MASSERT( FALSE );
11063 }
11064 return 0;
11065 }
11066
11067
11068
11069
11070
11071 struct LabelBitsInfo {
11072 int suppressErrorMessages;
11073 int error;
11074 };
11075
11076 void CNode::_LabelBits( CNode* n, void* arg )
11077 {
11078
11079
11080
11081
11082
11083
11084 if( labelCacheEnabled && (evalCount == 0 || !evalHeap.IsOwner(n)) ) {
11085 if( labelCache.find(n) != labelCache.end() ) {
11086 return;
11087 }
11088 labelCache[n] = 1;
11089 }
11090
11091
11092 LabelBitsInfo* info = (LabelBitsInfo*)arg;
11093 int suppressErrorMessages = info->suppressErrorMessages;
11094 unsigned nodeMask = n->NodeMask();
11095 int conditionalWiden = n->ConditionalWiden();
11096
11097 switch( n->GetOp() ) {
11098 case eVCONSTANT:
11099 n->type = n->Arg<CVector*>(0)->GetNodeType();
11100 break;
11101 case eRCONSTANT:
11102 if(1) {
11103 n->type = eR;
11104 }
11105 break;
11106 case eELIST:
11107 if( n->Arg<CNode*>(0)->type == eR ) {
11108 info->error = 1;
11109 if( !suppressErrorMessages ) {
11110 error(n->GetCoord(), "Illegal expression operand" );
11111 }
11112 } else if( n->Arg<CNode*>(1)->type == eR ) {
11113 info->error = 1;
11114 if( !suppressErrorMessages ) {
11115 error(n->GetCoord(), "Illegal expression operand" );
11116 }
11117 } else if(1) {
11118 n->type = eB;
11119 }
11120 break;
11121 case eWIDTH:
11122 if( n->Arg<CNode*>(1)->type == eS ) {
11123 n->type = eS;
11124 } else if(1) {
11125 n->type = eB;
11126 }
11127 break;
11128 case eSUB:
11129 if( n->Arg<CNode*>(0)->type == eR ) {
11130 n->type = eR;
11131 } else if( n->Arg<CNode*>(1)->type == eR ) {
11132 n->type = eR;
11133 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11134 n->type = eS;
11135 } else if(1) {
11136 n->type = eB;
11137 }
11138 break;
11139 case eMUL:
11140 if( n->Arg<CNode*>(0)->type == eR ) {
11141 n->type = eR;
11142 } else if( n->Arg<CNode*>(1)->type == eR ) {
11143 n->type = eR;
11144 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11145 n->type = eS;
11146 } else if(1) {
11147 n->type = eB;
11148 }
11149 break;
11150 case eDIV:
11151 if( n->Arg<CNode*>(0)->type == eR ) {
11152 n->type = eR;
11153 } else if( n->Arg<CNode*>(1)->type == eR ) {
11154 n->type = eR;
11155 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11156 n->type = eS;
11157 } else if(1) {
11158 n->type = eB;
11159 }
11160 break;
11161 case ePOW:
11162 if( n->Arg<CNode*>(0)->type == eR ) {
11163 n->type = eR;
11164 } else if( n->Arg<CNode*>(1)->type == eR ) {
11165 n->type = eR;
11166 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11167 n->type = eS;
11168 } else if(1) {
11169 n->type = eB;
11170 }
11171 break;
11172 case eADD:
11173 if( n->Arg<CNode*>(0)->type == eR ) {
11174 n->type = eR;
11175 } else if( n->Arg<CNode*>(1)->type == eR ) {
11176 n->type = eR;
11177 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11178 n->type = eS;
11179 } else if(1) {
11180 n->type = eB;
11181 }
11182 break;
11183 case eLSH:
11184 if( n->Arg<CNode*>(0)->type == eS ) {
11185 n->type = eS;
11186 } else if(1) {
11187 n->type = eB;
11188 }
11189 break;
11190 case eRSH:
11191 if( n->Arg<CNode*>(0)->type == eS ) {
11192 n->type = eS;
11193 } else if(1) {
11194 n->type = eB;
11195 }
11196 break;
11197 case eLSHA:
11198 if( n->Arg<CNode*>(0)->type == eS ) {
11199 n->type = eS;
11200 } else if(1) {
11201 n->type = eB;
11202 }
11203 break;
11204 case eRSHA:
11205 if( n->Arg<CNode*>(0)->type == eS ) {
11206 n->type = eS;
11207 } else if(1) {
11208 n->type = eB;
11209 }
11210 break;
11211 case eMOD:
11212 if( n->Arg<CNode*>(0)->type == eR ) {
11213 info->error = 1;
11214 if( !suppressErrorMessages ) {
11215 error(n->GetCoord(), "Illegal expression operand" );
11216 }
11217 } else if( n->Arg<CNode*>(1)->type == eR ) {
11218 info->error = 1;
11219 if( !suppressErrorMessages ) {
11220 error(n->GetCoord(), "Illegal expression operand" );
11221 }
11222 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11223 n->type = eS;
11224 } else if(1) {
11225 n->type = eB;
11226 }
11227 break;
11228 case eOR:
11229 if( n->Arg<CNode*>(0)->type == eR ) {
11230 info->error = 1;
11231 if( !suppressErrorMessages ) {
11232 error(n->GetCoord(), "Illegal expression operand" );
11233 }
11234 } else if( n->Arg<CNode*>(1)->type == eR ) {
11235 info->error = 1;
11236 if( !suppressErrorMessages ) {
11237 error(n->GetCoord(), "Illegal expression operand" );
11238 }
11239 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11240 n->type = eS;
11241 } else if(1) {
11242 n->type = eB;
11243 }
11244 break;
11245 case eAND:
11246 if( n->Arg<CNode*>(0)->type == eR ) {
11247 info->error = 1;
11248 if( !suppressErrorMessages ) {
11249 error(n->GetCoord(), "Illegal expression operand" );
11250 }
11251 } else if( n->Arg<CNode*>(1)->type == eR ) {
11252 info->error = 1;
11253 if( !suppressErrorMessages ) {
11254 error(n->GetCoord(), "Illegal expression operand" );
11255 }
11256 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11257 n->type = eS;
11258 } else if(1) {
11259 n->type = eB;
11260 }
11261 break;
11262 case eANDANDAND:
11263 if( n->Arg<CNode*>(0)->type == eR ) {
11264 info->error = 1;
11265 if( !suppressErrorMessages ) {
11266 error(n->GetCoord(), "Illegal expression operand" );
11267 }
11268 } else if( n->Arg<CNode*>(1)->type == eR ) {
11269 info->error = 1;
11270 if( !suppressErrorMessages ) {
11271 error(n->GetCoord(), "Illegal expression operand" );
11272 }
11273 } else if(1) {
11274 n->type = eB;
11275 }
11276 break;
11277 case eXOR:
11278 if( n->Arg<CNode*>(0)->type == eR ) {
11279 info->error = 1;
11280 if( !suppressErrorMessages ) {
11281 error(n->GetCoord(), "Illegal expression operand" );
11282 }
11283 } else if( n->Arg<CNode*>(1)->type == eR ) {
11284 info->error = 1;
11285 if( !suppressErrorMessages ) {
11286 error(n->GetCoord(), "Illegal expression operand" );
11287 }
11288 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11289 n->type = eS;
11290 } else if(1) {
11291 n->type = eB;
11292 }
11293 break;
11294 case eXNOR:
11295 if( n->Arg<CNode*>(0)->type == eR ) {
11296 info->error = 1;
11297 if( !suppressErrorMessages ) {
11298 error(n->GetCoord(), "Illegal expression operand" );
11299 }
11300 } else if( n->Arg<CNode*>(1)->type == eR ) {
11301 info->error = 1;
11302 if( !suppressErrorMessages ) {
11303 error(n->GetCoord(), "Illegal expression operand" );
11304 }
11305 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS ) {
11306 n->type = eS;
11307 } else if(1) {
11308 n->type = eB;
11309 }
11310 break;
11311 case eSYSTASK_CALL:
11312 n->type = Systask::Type(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1));
11313 break;
11314 case eFUNCTION_CALL:
11315 n->type = CFunction::Type(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1),n->Arg<CScope*>(2));
11316 break;
11317 case eARRAY:
11318 n->type = Array::Type(n->Arg<CNode*>(0),n->Arg<CNode*>(1));
11319 break;
11320 case eNET_REF:
11321 n->type = n->Arg<CNet*>(0)->GetNodeType();
11322 break;
11323 case eVAR_REF:
11324 n->type = n->Arg<CVar*>(0)->GetNodeType();
11325 break;
11326 case ePARAM_REF:
11327 n->type = n->Arg<CParam*>(0)->GetNodeType();
11328 break;
11329 case ePORT_REF:
11330 n->type = n->Arg<CPortDir*>(0)->GetNodeType();
11331 break;
11332 case eFWD_REF:
11333 if(1) {
11334 n->type = eB;
11335 }
11336 break;
11337 case eGENVAR_REF:
11338 n->type = n->Arg<CGenvar*>(0)->GetNodeType();
11339 break;
11340 case eRANGE:
11341 if( n->Arg<CNode*>(0)->type == eR ) {
11342 info->error = 1;
11343 if( !suppressErrorMessages ) {
11344 error(n->GetCoord(), "Illegal expression operand" );
11345 }
11346 } else if( n->Arg<CNode*>(1)->type == eR ) {
11347 info->error = 1;
11348 if( !suppressErrorMessages ) {
11349 error(n->GetCoord(), "Illegal expression operand" );
11350 }
11351 } else if(1) {
11352 n->type = eB;
11353 }
11354 break;
11355 case eSLICE:
11356 if( n->Arg<CNode*>(0)->type == eR ) {
11357 info->error = 1;
11358 if( !suppressErrorMessages ) {
11359 error(n->GetCoord(), "Illegal expression operand" );
11360 }
11361 } else if( n->Arg<CNode*>(1)->type == eR ) {
11362 info->error = 1;
11363 if( !suppressErrorMessages ) {
11364 error(n->GetCoord(), "Illegal expression operand" );
11365 }
11366 } else if(1) {
11367 n->type = eB;
11368 }
11369 break;
11370 case ePSLICE:
11371 if( n->Arg<CNode*>(1)->type == eR ) {
11372 info->error = 1;
11373 if( !suppressErrorMessages ) {
11374 error(n->GetCoord(), "Illegal expression operand" );
11375 }
11376 } else if(1) {
11377 n->type = eB;
11378 }
11379 break;
11380 case eMSLICE:
11381 if( n->Arg<CNode*>(1)->type == eR ) {
11382 info->error = 1;
11383 if( !suppressErrorMessages ) {
11384 error(n->GetCoord(), "Illegal expression operand" );
11385 }
11386 } else if(1) {
11387 n->type = eB;
11388 }
11389 break;
11390 case eCVRI:
11391 if(1) {
11392 n->type = eS;
11393 }
11394 break;
11395 case eCVIR:
11396 if(1) {
11397 n->type = eR;
11398 }
11399 break;
11400 case eREP:
11401 if( n->Arg<CNode*>(0)->type == eR ) {
11402 info->error = 1;
11403 if( !suppressErrorMessages ) {
11404 error(n->GetCoord(), "Illegal expression operand" );
11405 }
11406 } else if( n->Arg<CNode*>(1)->type == eR ) {
11407 info->error = 1;
11408 if( !suppressErrorMessages ) {
11409 error(n->GetCoord(), "Illegal expression operand" );
11410 }
11411 } else if(1) {
11412 n->type = eB;
11413 }
11414 break;
11415 case eCAT:
11416 if( n->Arg<CNode*>(0)->type == eR ) {
11417 info->error = 1;
11418 if( !suppressErrorMessages ) {
11419 error(n->GetCoord(), "Illegal expression operand" );
11420 }
11421 } else if( n->Arg<CNode*>(1)->type == eR ) {
11422 info->error = 1;
11423 if( !suppressErrorMessages ) {
11424 error(n->GetCoord(), "Illegal expression operand" );
11425 }
11426 } else if(1) {
11427 n->type = eB;
11428 }
11429 break;
11430 case eUCAT:
11431 if( n->Arg<CNode*>(0)->type == eR ) {
11432 info->error = 1;
11433 if( !suppressErrorMessages ) {
11434 error(n->GetCoord(), "Illegal expression operand" );
11435 }
11436 } else if(1) {
11437 n->type = eB;
11438 }
11439 break;
11440 case eCOM:
11441 if( n->Arg<CNode*>(0)->type == eR ) {
11442 info->error = 1;
11443 if( !suppressErrorMessages ) {
11444 error(n->GetCoord(), "Illegal expression operand" );
11445 }
11446 } else if( n->Arg<CNode*>(0)->type == eS ) {
11447 n->type = eS;
11448 } else if(1) {
11449 n->type = eB;
11450 }
11451 break;
11452 case eNEG:
11453 n->type = n->Arg<CNode*>(0)->type;
11454 break;
11455 case ePLUS:
11456 n->type = n->Arg<CNode*>(0)->type;
11457 break;
11458 case eNOT:
11459 if(1) {
11460 n->type = eB;
11461 }
11462 break;
11463 case eGT:
11464 if(1) {
11465 n->type = eB;
11466 }
11467 break;
11468 case eGE:
11469 if(1) {
11470 n->type = eB;
11471 }
11472 break;
11473 case eLT:
11474 if(1) {
11475 n->type = eB;
11476 }
11477 break;
11478 case eLE:
11479 if(1) {
11480 n->type = eB;
11481 }
11482 break;
11483 case eLAND:
11484 if(1) {
11485 n->type = eB;
11486 }
11487 break;
11488 case eLOR:
11489 if(1) {
11490 n->type = eB;
11491 }
11492 break;
11493 case eCEQ:
11494 if( n->Arg<CNode*>(0)->type == eR ) {
11495 info->error = 1;
11496 if( !suppressErrorMessages ) {
11497 error(n->GetCoord(), "Illegal expression operand" );
11498 }
11499 } else if( n->Arg<CNode*>(1)->type == eR ) {
11500 info->error = 1;
11501 if( !suppressErrorMessages ) {
11502 error(n->GetCoord(), "Illegal expression operand" );
11503 }
11504 } else if(1) {
11505 n->type = eB;
11506 }
11507 break;
11508 case eCNE:
11509 if( n->Arg<CNode*>(0)->type == eR ) {
11510 info->error = 1;
11511 if( !suppressErrorMessages ) {
11512 error(n->GetCoord(), "Illegal expression operand" );
11513 }
11514 } else if( n->Arg<CNode*>(1)->type == eR ) {
11515 info->error = 1;
11516 if( !suppressErrorMessages ) {
11517 error(n->GetCoord(), "Illegal expression operand" );
11518 }
11519 } else if(1) {
11520 n->type = eB;
11521 }
11522 break;
11523 case eEQ:
11524 if(1) {
11525 n->type = eB;
11526 }
11527 break;
11528 case eNE:
11529 if(1) {
11530 n->type = eB;
11531 }
11532 break;
11533 case eRAND:
11534 if( n->Arg<CNode*>(0)->type == eR ) {
11535 info->error = 1;
11536 if( !suppressErrorMessages ) {
11537 error(n->GetCoord(), "Illegal expression operand" );
11538 }
11539 } else if(1) {
11540 n->type = eB;
11541 }
11542 break;
11543 case eRNAND:
11544 if( n->Arg<CNode*>(0)->type == eR ) {
11545 info->error = 1;
11546 if( !suppressErrorMessages ) {
11547 error(n->GetCoord(), "Illegal expression operand" );
11548 }
11549 } else if(1) {
11550 n->type = eB;
11551 }
11552 break;
11553 case eROR:
11554 if( n->Arg<CNode*>(0)->type == eR ) {
11555 info->error = 1;
11556 if( !suppressErrorMessages ) {
11557 error(n->GetCoord(), "Illegal expression operand" );
11558 }
11559 } else if(1) {
11560 n->type = eB;
11561 }
11562 break;
11563 case eRNOR:
11564 if( n->Arg<CNode*>(0)->type == eR ) {
11565 info->error = 1;
11566 if( !suppressErrorMessages ) {
11567 error(n->GetCoord(), "Illegal expression operand" );
11568 }
11569 } else if(1) {
11570 n->type = eB;
11571 }
11572 break;
11573 case eRXOR:
11574 if( n->Arg<CNode*>(0)->type == eR ) {
11575 info->error = 1;
11576 if( !suppressErrorMessages ) {
11577 error(n->GetCoord(), "Illegal expression operand" );
11578 }
11579 } else if(1) {
11580 n->type = eB;
11581 }
11582 break;
11583 case eRXNOR:
11584 if( n->Arg<CNode*>(0)->type == eR ) {
11585 info->error = 1;
11586 if( !suppressErrorMessages ) {
11587 error(n->GetCoord(), "Illegal expression operand" );
11588 }
11589 } else if(1) {
11590 n->type = eB;
11591 }
11592 break;
11593 case eHOOK:
11594 if( n->Arg<CNode*>(1)->type == eR ) {
11595 n->type = eR;
11596 } else if( n->Arg<CNode*>(2)->type == eR ) {
11597 n->type = eR;
11598 } else if( n->Arg<CNode*>(1)->type == eS && n->Arg<CNode*>(2)->type == eS ) {
11599 n->type = eS;
11600 } else if(1) {
11601 n->type = eB;
11602 }
11603 break;
11604 case ePOSEDGE:
11605 if(1) {
11606 n->type = eE;
11607 }
11608 break;
11609 case eNEGEDGE:
11610 if(1) {
11611 n->type = eE;
11612 }
11613 break;
11614 case eEVOR:
11615 if(1) {
11616 n->type = eE;
11617 }
11618 break;
11619 case eMTM:
11620 if( n->Arg<CNode*>(0)->type == eR ) {
11621 n->type = eR;
11622 } else if( n->Arg<CNode*>(1)->type == eR ) {
11623 n->type = eR;
11624 } else if( n->Arg<CNode*>(2)->type == eR ) {
11625 n->type = eR;
11626 } else if( n->Arg<CNode*>(0)->type == eS && n->Arg<CNode*>(1)->type == eS && n->Arg<CNode*>(2)->type == eS ) {
11627 n->type = eS;
11628 } else if(1) {
11629 n->type = eB;
11630 }
11631 break;
11632 case eEXTERNAL_REF:
11633 n->type = External::Type(n->Arg<CSymbol*>(0));
11634 break;
11635 case eATTRIBUTE:
11636 if(1) {
11637 n->type = eU;
11638 }
11639 break;
11640 case eMACRO_EXPR:
11641 n->type = n->Arg<CNode*>(1)->type;
11642 break;
11643 default:
11644 MASSERT( FALSE );
11645 }
11646
11647
11648
11649
11650 switch( n->type ) {
11651 case eE:
11652 case eR:
11653 n->width = 0;
11654 return;
11655 }
11656
11657
11658
11659
11660 switch( n->GetOp() ) {
11661 case eERROR:
11662 n->width = 0;
11663 break;
11664 case eVCONSTANT:
11665 n->width = (!n->Arg<CVector*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CVector*>(0)->GetWidth();
11666 break;
11667 case eRCONSTANT:
11668 n->width = 0;
11669 break;
11670 case eELIST:
11671 n->width = cADD(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11672 break;
11673 case eWIDTH:
11674 n->width = ((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(0)->EvalINT32();
11675 break;
11676 case eSUB:
11677 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11678 break;
11679 case eMUL:
11680 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11681 break;
11682 case eDIV:
11683 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11684 break;
11685 case ePOW:
11686 n->width = n->Arg<CNode*>(0)->width;
11687 break;
11688 case eADD:
11689 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11690 break;
11691 case eLSH:
11692 n->width = n->Arg<CNode*>(0)->width;
11693 break;
11694 case eRSH:
11695 n->width = n->Arg<CNode*>(0)->width;
11696 break;
11697 case eLSHA:
11698 n->width = n->Arg<CNode*>(0)->width;
11699 break;
11700 case eRSHA:
11701 n->width = n->Arg<CNode*>(0)->width;
11702 break;
11703 case eMOD:
11704 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11705 break;
11706 case eOR:
11707 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11708 break;
11709 case eAND:
11710 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11711 break;
11712 case eANDANDAND:
11713 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11714 break;
11715 case eXOR:
11716 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11717 break;
11718 case eXNOR:
11719 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11720 break;
11721 case eSYSTASK_CALL:
11722 n->width = Systask::Width(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1));
11723 break;
11724 case eFUNCTION_CALL:
11725 n->width = CFunction::Width(n->Arg<CSymbol*>(0),n->Arg<CNode*>(1),n->Arg<CScope*>(2));
11726 break;
11727 case eARRAY:
11728 n->width = Array::Width(n->Arg<CNode*>(0),n->Arg<CNode*>(1));
11729 break;
11730 case eNET_REF:
11731 n->width = (!n->Arg<CNet*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CNet*>(0)->GetWidth();
11732 break;
11733 case eVAR_REF:
11734 n->width = (!n->Arg<CVar*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CVar*>(0)->GetWidth();
11735 break;
11736 case ePARAM_REF:
11737 n->width = (!n->Arg<CParam*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CParam*>(0)->GetWidth();
11738 break;
11739 case ePORT_REF:
11740 n->width = (!n->Arg<CPortDir*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CPortDir*>(0)->GetWidth();
11741 break;
11742 case eFWD_REF:
11743 n->width = (!n->Arg<CFref*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CFref*>(0)->GetWidth();
11744 break;
11745 case eGENVAR_REF:
11746 n->width = (!n->Arg<CGenvar*>(0)->IsWidthEvaluateable()&&suppressErrorMessages) ? 0 : n->Arg<CGenvar*>(0)->GetWidth();
11747 break;
11748 case eRANGE:
11749 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());
11750 break;
11751 case eSLICE:
11752 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());
11753 break;
11754 case ePSLICE:
11755 n->width = ((info->error |= !n->Arg<CNode*>(1)->IsEvaluateable())&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(1)->EvalINT32();
11756 break;
11757 case eMSLICE:
11758 n->width = ((info->error |= !n->Arg<CNode*>(1)->IsEvaluateable())&&suppressErrorMessages) ? 0 : n->Arg<CNode*>(1)->EvalINT32();
11759 break;
11760 case eCVRI:
11761 n->width = 32;
11762 break;
11763 case eCVIR:
11764 n->width = 0;
11765 break;
11766 case eREP:
11767 n->width = cMUL(((info->error |= !n->Arg<CNode*>(0)->IsEvaluateable())&&suppressErrorMessages) ? 0: n->Arg<CNode*>(0)->EvalINT32(),n->Arg<CNode*>(1)->width);
11768 break;
11769 case eCAT:
11770 n->width = cADD(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width);
11771 break;
11772 case eUCAT:
11773 n->width = n->Arg<CNode*>(0)->width;
11774 break;
11775 case eCOM:
11776 n->width = n->Arg<CNode*>(0)->width;
11777 break;
11778 case eNEG:
11779 n->width = n->Arg<CNode*>(0)->width;
11780 break;
11781 case ePLUS:
11782 n->width = n->Arg<CNode*>(0)->width;
11783 break;
11784 case eNOT:
11785 n->width = 1;
11786 break;
11787 case eGT:
11788 n->width = 1;
11789 break;
11790 case eGE:
11791 n->width = 1;
11792 break;
11793 case eLT:
11794 n->width = 1;
11795 break;
11796 case eLE:
11797 n->width = 1;
11798 break;
11799 case eLAND:
11800 n->width = 1;
11801 break;
11802 case eLOR:
11803 n->width = 1;
11804 break;
11805 case eCEQ:
11806 n->width = 1;
11807 break;
11808 case eCNE:
11809 n->width = 1;
11810 break;
11811 case eEQ:
11812 n->width = 1;
11813 break;
11814 case eNE:
11815 n->width = 1;
11816 break;
11817 case eRAND:
11818 n->width = 1;
11819 break;
11820 case eRNAND:
11821 n->width = 1;
11822 break;
11823 case eROR:
11824 n->width = 1;
11825 break;
11826 case eRNOR:
11827 n->width = 1;
11828 break;
11829 case eRXOR:
11830 n->width = 1;
11831 break;
11832 case eRXNOR:
11833 n->width = 1;
11834 break;
11835 case eHOOK:
11836 n->width = cMAX(n->Arg<CNode*>(1)->width,n->Arg<CNode*>(2)->width);
11837 break;
11838 case eMTM:
11839 n->width = cMAX(n->Arg<CNode*>(0)->width,n->Arg<CNode*>(1)->width,n->Arg<CNode*>(2)->width);
11840 break;
11841 case eEXTERNAL_REF:
11842 n->width = External::Width(n->Arg<CSymbol*>(0));
11843 break;
11844 case eATTRIBUTE:
11845 n->width = 0;
11846 break;
11847 case eMACRO_EXPR:
11848 n->width = n->Arg<CNode*>(1)->width;
11849 break;
11850 }
11851
11852
11853
11854
11855 n->FixedWidth(1);
11856 int operandWidth = -1;
11857 for( int i = 0; i < n->ArgCount(); i++ ) {
11858 if( ((nodeMask>>i)&1) && n->Arg<CNode*>(i) ) {
11859 int widthFixed = n->Arg<CNode*>(i)->WidthFixed() ||
11860 n->Arg<CNode*>(i)->FixedWidth();
11861
11862 if( n->ConditionalWiden() && !widthFixed ) {
11863 n->FixedWidth( 0 );
11864 break;
11865 } else if( !widthFixed ) {
11866 n->FixedWidth( 0 );
11867 break;
11868 } else {
11869 int w = n->Arg<CNode*>(i)->width;
11870 if( operandWidth != w ) {
11871 if( operandWidth >= 0 ) {
11872 n->FixedWidth( 0 );
11873 break;
11874 }
11875 operandWidth = w;
11876 }
11877 }
11878 }
11879 }
11880 if( !conditionalWiden && nodeMask != 0 ) {
11881 n->FixedWidth( 0 );
11882 }
11883 }
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894 CNode* CNode::FixBits( INT32 newWidth, NodeType_t newType )
11895 {
11896
11897 int calculateMax = 0;
11898 int realOp = 0;
11899 int conditionalWiden = ConditionalWiden();
11900 unsigned nodeMask = NodeMask();
11901 unsigned scalarMask = 0;
11902 unsigned selfDeterminedMask = 0;
11903 switch( GetOp() ) {
11904 case eERROR:
11905 realOp = 0;
11906 break;
11907 case eVCONSTANT:
11908 realOp = 0;
11909 break;
11910 case eRCONSTANT:
11911 realOp = 0;
11912 break;
11913 case eCOMMENT:
11914 realOp = 0;
11915 break;
11916 case eVRQ:
11917 realOp = 0;
11918 break;
11919 case ePRAGMA:
11920 realOp = 0;
11921 break;
11922 case eELIST:
11923 realOp = 0;
11924 selfDeterminedMask = nodeMask;
11925 break;
11926 case eWIDTH:
11927 realOp = 0;
11928 selfDeterminedMask = nodeMask;
11929 break;
11930 case eNOP:
11931 realOp = 0;
11932 break;
11933 case eSUB:
11934 realOp = 1;
11935 break;
11936 case eMUL:
11937 realOp = 1;
11938 break;
11939 case eDIV:
11940 realOp = 1;
11941 break;
11942 case ePOW:
11943 realOp = 1;
11944 selfDeterminedMask = 1<<1;
11945 break;
11946 case eADD:
11947 realOp = 1;
11948 break;
11949 case eLSH:
11950 realOp = 0;
11951 selfDeterminedMask = 1<<1;
11952 break;
11953 case eRSH:
11954 realOp = 0;
11955 selfDeterminedMask = 1<<1;
11956 break;
11957 case eLSHA:
11958 realOp = 0;
11959 selfDeterminedMask = 1<<1;
11960 break;
11961 case eRSHA:
11962 realOp = 0;
11963 selfDeterminedMask = 1<<1;
11964 break;
11965 case eMOD:
11966 realOp = 0;
11967 break;
11968 case eOR:
11969 realOp = 0;
11970 break;
11971 case eAND:
11972 realOp = 0;
11973 break;
11974 case eANDANDAND:
11975 realOp = 0;
11976 break;
11977 case eXOR:
11978 realOp = 0;
11979 break;
11980 case eXNOR:
11981 realOp = 0;
11982 break;
11983 case eINSTANCE_REF:
11984 realOp = 0;
11985 break;
11986 case eGATE_REF:
11987 realOp = 0;
11988 break;
11989 case eTASK_ENABLE:
11990 realOp = 0;
11991 break;
11992 case eSYSTASK_CALL:
11993 realOp = 0;
11994 selfDeterminedMask = nodeMask;
11995 break;
11996 case eTIMING_CALL:
11997 realOp = 0;
11998 break;
11999 case eFUNCTION_CALL:
12000 realOp = 0;
12001 selfDeterminedMask = nodeMask;
12002 break;
12003 case eARRAY:
12004 realOp = 0;
12005 selfDeterminedMask = 1<<1;
12006 break;
12007 case eNET_REF:
12008 realOp = 0;
12009 break;
12010 case eVAR_REF:
12011 realOp = 0;
12012 break;
12013 case ePARAM_REF:
12014 realOp = 0;
12015 break;
12016 case ePORT_REF:
12017 realOp = 0;
12018 break;
12019 case eFWD_REF:
12020 realOp = 0;
12021 break;
12022 case eGENVAR_REF:
12023 realOp = 0;
12024 break;
12025 case eNET_DECL:
12026 realOp = 0;
12027 break;
12028 case eVAR_DECL:
12029 realOp = 0;
12030 break;
12031 case ePARAM_DECL:
12032 realOp = 0;
12033 break;
12034 case eSPECPARAM_DECL:
12035 realOp = 0;
12036 break;
12037 case ePORT_DECL:
12038 realOp = 0;
12039 break;
12040 case eGENVAR_DECL:
12041 realOp = 0;
12042 break;
12043 case eLIST:
12044 realOp = 0;
12045 break;
12046 case eRANGE:
12047 realOp = 0;
12048 selfDeterminedMask = nodeMask;
12049 break;
12050 case eSLICE:
12051 realOp = 0;
12052 selfDeterminedMask = nodeMask;
12053 break;
12054 case ePSLICE:
12055 realOp = 0;
12056 selfDeterminedMask = nodeMask;
12057 break;
12058 case eMSLICE:
12059 realOp = 0;
12060 selfDeterminedMask = nodeMask;
12061 break;
12062 case eCVRI:
12063 realOp = 0;
12064 selfDeterminedMask = nodeMask;
12065 break;
12066 case eCVIR:
12067 realOp = 0;
12068 selfDeterminedMask = nodeMask;
12069 break;
12070 case eREP:
12071 realOp = 0;
12072 selfDeterminedMask = nodeMask;
12073 break;
12074 case eCAT:
12075 realOp = 0;
12076 selfDeterminedMask = nodeMask;
12077 break;
12078 case eUCAT:
12079 realOp = 0;
12080 selfDeterminedMask = nodeMask;
12081 break;
12082 case eCOM:
12083 realOp = 0;
12084 break;
12085 case eNEG:
12086 realOp = 0;
12087 break;
12088 case ePLUS:
12089 realOp = 0;
12090 break;
12091 case eNOT:
12092 realOp = 0;
12093 scalarMask = 1;
12094 break;
12095 case eGT:
12096 realOp = 0;
12097 calculateMax = 1;
12098 break;
12099 case eGE:
12100 realOp = 0;
12101 calculateMax = 1;
12102 break;
12103 case eLT:
12104 realOp = 0;
12105 calculateMax = 1;
12106 break;
12107 case eLE:
12108 realOp = 0;
12109 calculateMax = 1;
12110 break;
12111 case eLAND:
12112 realOp = 0;
12113 scalarMask = 3;
12114 break;
12115 case eLOR:
12116 realOp = 0;
12117 scalarMask = 3;
12118 break;
12119 case eCEQ:
12120 realOp = 0;
12121 calculateMax = 1;
12122 break;
12123 case eCNE:
12124 realOp = 0;
12125 calculateMax = 1;
12126 break;
12127 case eEQ:
12128 realOp = 0;
12129 calculateMax = 1;
12130 break;
12131 case eNE:
12132 realOp = 0;
12133 calculateMax = 1;
12134 break;
12135 case eRAND:
12136 realOp = 0;
12137 selfDeterminedMask = nodeMask;
12138 break;
12139 case eRNAND:
12140 realOp = 0;
12141 selfDeterminedMask = nodeMask;
12142 break;
12143 case eROR:
12144 realOp = 0;
12145 selfDeterminedMask = nodeMask;
12146 break;
12147 case eRNOR:
12148 realOp = 0;
12149 selfDeterminedMask = nodeMask;
12150 break;
12151 case eRXOR:
12152 realOp = 0;
12153 selfDeterminedMask = nodeMask;
12154 break;
12155 case eRXNOR:
12156 realOp = 0;
12157 selfDeterminedMask = nodeMask;
12158 break;
12159 case eHOOK:
12160 realOp = 1;
12161 scalarMask = 1;
12162 break;
12163 case eINIT:
12164 realOp = 0;
12165 break;
12166 case eALWAYS:
12167 realOp = 0;
12168 break;
12169 case eEVENT:
12170 realOp = 0;
12171 break;
12172 case eBLOCK_REF:
12173 realOp = 0;
12174 break;
12175 case eSPECIFY_REF:
12176 realOp = 0;
12177 break;
12178 case eASSIGN:
12179 realOp = 0;
12180 break;
12181 case eFORCE:
12182 realOp = 0;
12183 break;
12184 case eRELEASE:
12185 realOp = 0;
12186 break;
12187 case eNBASSIGN:
12188 realOp = 0;
12189 break;
12190 case ePOSEDGE:
12191 realOp = 0;
12192 break;
12193 case eNEGEDGE:
12194 realOp = 0;
12195 break;
12196 case eEDGE:
12197 realOp = 0;
12198 break;
12199 case eEVOR:
12200 realOp = 0;
12201 break;
12202 case eDELAY:
12203 realOp = 0;
12204 break;
12205 case eMTM:
12206 realOp = 1;
12207 break;
12208 case eIF:
12209 realOp = 0;
12210 break;
12211 case eFOREVER:
12212 realOp = 0;
12213 break;
12214 case eREPEAT:
12215 realOp = 0;
12216 break;
12217 case eWHILE:
12218 realOp = 0;
12219 break;
12220 case eWAIT:
12221 realOp = 0;
12222 break;
12223 case eFOR:
12224 realOp = 0;
12225 break;
12226 case eCASE:
12227 realOp = 0;
12228 break;
12229 case eCASEX:
12230 realOp = 0;
12231 break;
12232 case eCASEZ:
12233 realOp = 0;
12234 break;
12235 case eCASEITEM:
12236 realOp = 0;
12237 break;
12238 case eCASSIGN:
12239 realOp = 0;
12240 break;
12241 case eARG:
12242 realOp = 0;
12243 break;
12244 case eFUNCTION_DEF:
12245 realOp = 0;
12246 break;
12247 case eMODULE_DEF:
12248 realOp = 0;
12249 break;
12250 case eREPEAT_CONTROL:
12251 realOp = 0;
12252 break;
12253 case eDELAY_CONTROL:
12254 realOp = 0;
12255 break;
12256 case eEVENT_CONTROL:
12257 realOp = 0;
12258 break;
12259 case eEXTERNAL_REF:
12260 realOp = 0;
12261 break;
12262 case ePORT_DEF:
12263 realOp = 0;
12264 break;
12265 case eDEFPARAM:
12266 realOp = 0;
12267 break;
12268 case ePATH:
12269 realOp = 0;
12270 break;
12271 case ePATH_ASSIGN:
12272 realOp = 0;
12273 break;
12274 case eIFNONE_PATH_ASSIGN:
12275 realOp = 0;
12276 break;
12277 case eTRIGGER:
12278 realOp = 0;
12279 break;
12280 case ePASSIGN:
12281 realOp = 0;
12282 break;
12283 case eDEASSIGN:
12284 realOp = 0;
12285 break;
12286 case eDISABLE:
12287 realOp = 0;
12288 break;
12289 case eATTRIBUTE:
12290 realOp = 0;
12291 break;
12292 case eGIF:
12293 realOp = 0;
12294 break;
12295 case eGFOR:
12296 realOp = 0;
12297 break;
12298 case eGCASE:
12299 realOp = 0;
12300 break;
12301 case eTABLE:
12302 realOp = 0;
12303 break;
12304 case eTABLE_ENTRY:
12305 realOp = 0;
12306 break;
12307 case eTABLE_SYMBOL:
12308 realOp = 0;
12309 break;
12310 case ePORTLIST_END:
12311 realOp = 0;
12312 break;
12313 case eMACRO_EXPR:
12314 realOp = 0;
12315 break;
12316 default:
12317 MASSERT( FALSE );
12318 }
12319
12320
12321
12322 unsigned realMask = 0;
12323 unsigned forceRealMask = 0;
12324 int widthsDiffer = 0;
12325 int originalWidth = width;
12326 for( int i = 0; i < ArgCount(); i++ ) {
12327 if( ((nodeMask>>i)&1) && Arg<CNode*>(i)->type == eR ) {
12328 realMask |= 1<<i;
12329 }
12330 if( ((nodeMask>>i)&1) &&
12331 Arg<CNode*>(i)->type != eR &&
12332 (Arg<CNode*>(i)->GetOp() != eVCONSTANT ||
12333 Arg<CNode*>(i)->width != width) ) {
12334 widthsDiffer = 1;
12335 }
12336 }
12337
12338
12339
12340
12341 if( newType == eU && newWidth == 0 ) {
12342 newType = type;
12343 newWidth = width;
12344
12345
12346
12347
12348 } else if( (newType == eB || newType == eS || newType == eU) &&
12349 (type == eB || type == eS) ) {
12350 if( newWidth > width ) {
12351 width = newWidth;
12352 }
12353 if( newType == eU ) {
12354 newType = type;
12355 }
12356 }
12357
12358 MASSERT( newType != eR || newWidth == 0 );
12359 MASSERT( newType != eE || newWidth == 0 );
12360
12361
12362
12363
12364
12365 if( realMask ) {
12366 forceRealMask = (~realMask & nodeMask);
12367 }
12368
12369
12370
12371
12372
12373 int convertWidth = conditionalWiden && FixedWidth();
12374 if( convertWidth ) {
12375 width = originalWidth;
12376 }
12377 if( newType == eB && type == eS ) {
12378 type = eB;
12379 }
12380
12381
12382
12383 int cWidth = width;
12384 NodeType_t cType = type;
12385 if( calculateMax ) {
12386 cType = eS;
12387 int max = 0;
12388 int foundReal = 0;
12389 int foundUnsigned = 0;
12390 for( int i = 0; i < ArgCount(); i++ ) {
12391 if( (nodeMask>>i)&1 ) {
12392 switch( Arg<CNode*>(i)->type ) {
12393 case eB:
12394 foundUnsigned = 1;
12395 break;
12396 case eR:
12397 foundReal = 1;
12398 break;
12399 }
12400 if( Arg<CNode*>(i)->width > max ) {
12401 max = Arg<CNode*>(i)->width;
12402 }
12403 }
12404 }
12405 if( foundReal ) {
12406 cWidth = 0;
12407 cType = eR;
12408 } else if( foundUnsigned ) {
12409 cType = eB;
12410 cWidth = max;
12411 } else {
12412 cWidth = max;
12413 }
12414 }
12415
12416
12417
12418
12419 for( int i = 0; i < ArgCount(); i++ ) {
12420 if( (nodeMask>>i)&1 ) {
12421 if( (scalarMask>>i)&1 ) {
12422 if( Arg<CNode*>(i)->type == eR ) {
12423 CNode* node;
12424 Arg<CNode*>(i) = cNE( Arg<CNode*>(i), cREAL(0), &loc );
12425 Arg<CNode*>(i)->LabelBits();
12426 } else if( type == eR ) {
12427
12428 CNode* node;
12429 Arg<CNode*>(i) = cCNE( Arg<CNode*>(i), cINT32(0), &loc );
12430 Arg<CNode*>(i)->LabelBits();
12431 }
12432 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eU );
12433 } else if( (forceRealMask>>i)&1 ) {
12434 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eR );
12435 } else if( (selfDeterminedMask>>i)&1 ) {
12436 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( 0, eU );
12437 } else {
12438 Arg<CNode*>(i) = Arg<CNode*>(i)->FixBits( cWidth, cType );
12439 }
12440 }
12441 }
12442
12443
12444
12445
12446
12447
12448 if( newType != eR && convertWidth ) {
12449 CNode* nn = cWIDTH(cINT32(newWidth), this);
12450 nn->width = newWidth;
12451 nn->type = type;
12452 return nn;
12453 }
12454 if( newType == eR && (type == eB || type == eS) ) {
12455 CNode* nn = cCVIR( this );
12456 nn->width = 0;
12457 nn->type = eR;
12458 return nn;
12459
12460 } else if( (newType == eB || newType == eS) && type == eR ) {
12461 CNode* nn = cCVRI( this );
12462 nn->width = newWidth;
12463 nn->type = newType;
12464 return nn;
12465 }
12466
12467 return this;
12468 }
12469
12470
12471
12472
12473
12474 void CNode::Dump( FILE* f )
12475 {
12476 switch( GetOp() ) {
12477 case eERROR:
12478 fprintf( f, "???" );
12479 break;
12480 case eVCONSTANT:
12481 fprintf( f, "%s", Arg<CVector*>(0)->GetVString() );
12482 break;
12483 case eRCONSTANT:
12484 fprintf( f, "%s", (char*)Arg<char*>(0) );
12485 break;
12486 case ePRAGMA:
12487 fprintf( f, "%s", (char*)Arg<char*>(0) );
12488 break;
12489 case eELIST:
12490 fprintf( f, "" );
12491 Arg<CNode*>(0)->Dump( f );
12492 fprintf( f, "," );
12493 Arg<CNode*>(1)->Dump( f );
12494 fprintf( f, "" );
12495 break;
12496 case eWIDTH:
12497 fprintf( f, "WIDTH(" );
12498 fprintf( f, "%s", type==eS ? "S" : "U" );
12499 fprintf( f, "," );
12500 fprintf( f, "%d", width );
12501 fprintf( f, "," );
12502 Arg<CNode*>(0)->Dump( f );
12503 fprintf( f, "," );
12504 Arg<CNode*>(1)->Dump( f );
12505 fprintf( f, ")" );
12506 break;
12507 case eSUB:
12508 fprintf( f, "(" );
12509 Arg<CNode*>(0)->Dump( f );
12510 fprintf( f, ")-(" );
12511 Arg<CNode*>(1)->Dump( f );
12512 fprintf( f, ")" );
12513 break;
12514 case eMUL:
12515 fprintf( f, "(" );
12516 Arg<CNode*>(0)->Dump( f );
12517 fprintf( f, ")*(" );
12518 Arg<CNode*>(1)->Dump( f );
12519 fprintf( f, ")" );
12520 break;
12521 case eDIV:
12522 fprintf( f, "(" );
12523 Arg<CNode*>(0)->Dump( f );
12524 fprintf( f, ")/(" );
12525 Arg<CNode*>(1)->Dump( f );
12526 fprintf( f, ")" );
12527 break;
12528 case ePOW:
12529 fprintf( f, "(" );
12530 Arg<CNode*>(0)->Dump( f );
12531 fprintf( f, ")**(" );
12532 Arg<CNode*>(1)->Dump( f );
12533 fprintf( f, ")" );
12534 break;
12535 case eADD:
12536 fprintf( f, "(" );
12537 Arg<CNode*>(0)->Dump( f );
12538 fprintf( f, ")+(" );
12539 Arg<CNode*>(1)->Dump( f );
12540 fprintf( f, ")" );
12541 break;
12542 case eLSH:
12543 fprintf( f, "(" );
12544 Arg<CNode*>(0)->Dump( f );
12545 fprintf( f, ")<<(" );
12546 Arg<CNode*>(1)->Dump( f );
12547 fprintf( f, ")" );
12548 break;
12549 case eRSH:
12550 fprintf( f, "(" );
12551 Arg<CNode*>(0)->Dump( f );
12552 fprintf( f, ")>>(" );
12553 Arg<CNode*>(1)->Dump( f );
12554 fprintf( f, ")" );
12555 break;
12556 case eLSHA:
12557 fprintf( f, "(" );
12558 Arg<CNode*>(0)->Dump( f );
12559 fprintf( f, ")<<<(" );
12560 Arg<CNode*>(1)->Dump( f );
12561 fprintf( f, ")" );
12562 break;
12563 case eRSHA:
12564 fprintf( f, "(" );
12565 Arg<CNode*>(0)->Dump( f );
12566 fprintf( f, ")>>>(" );
12567 Arg<CNode*>(1)->Dump( f );
12568 fprintf( f, ")" );
12569 break;
12570 case eMOD:
12571 fprintf( f, "(" );
12572 Arg<CNode*>(0)->Dump( f );
12573 fprintf( f, ")%%(" );
12574 Arg<CNode*>(1)->Dump( f );
12575 fprintf( f, ")" );
12576 break;
12577 case eOR:
12578 fprintf( f, "(" );
12579 Arg<CNode*>(0)->Dump( f );
12580 fprintf( f, ")|(" );
12581 Arg<CNode*>(1)->Dump( f );
12582 fprintf( f, ")" );
12583 break;
12584 case eAND:
12585 fprintf( f, "(" );
12586 Arg<CNode*>(0)->Dump( f );
12587 fprintf( f, ")&(" );
12588 Arg<CNode*>(1)->Dump( f );
12589 fprintf( f, ")" );
12590 break;
12591 case eANDANDAND:
12592 fprintf( f, "(" );
12593 Arg<CNode*>(0)->Dump( f );
12594 fprintf( f, ")&&&(" );
12595 Arg<CNode*>(1)->Dump( f );
12596 fprintf( f, ")" );
12597 break;
12598 case eXOR:
12599 fprintf( f, "(" );
12600 Arg<CNode*>(0)->Dump( f );
12601 fprintf( f, ")^(" );
12602 Arg<CNode*>(1)->Dump( f );
12603 fprintf( f, ")" );
12604 break;
12605 case eXNOR:
12606 fprintf( f, "(" );
12607 Arg<CNode*>(0)->Dump( f );
12608 fprintf( f, ")~^(" );
12609 Arg<CNode*>(1)->Dump( f );
12610 fprintf( f, ")" );
12611 break;
12612 case eFUNCTION_CALL:
12613 fprintf( f, "" );
12614 fprintf( f, "%s", Arg<CSymbol*>(0)->GetName() );
12615 fprintf( f, "(" );
12616 Arg<CNode*>(1)->Dump( f );
12617 fprintf( f, ")" );
12618 break;
12619 case eARRAY:
12620 fprintf( f, "" );
12621 Arg<CNode*>(0)->Dump( f );
12622 fprintf( f, "[" );
12623 Arg<CNode*>(1)->Dump( f );
12624 fprintf( f, "]" );
12625 break;
12626 case eNET_REF:
12627 fprintf( f, "%s", Arg<CNet*>(0)->GetName() );
12628 break;
12629 case eVAR_REF:
12630 fprintf( f, "%s", Arg<CVar*>(0)->GetName() );
12631 break;
12632 case ePARAM_REF:
12633 fprintf( f, "%s", Arg<CParam*>(0)->GetName() );
12634 break;
12635 case ePORT_REF:
12636 fprintf( f, "%s", Arg<CPort*>(0)->GetName() );
12637 break;
12638 case eFWD_REF:
12639 fprintf( f, "%s", Arg<CFref*>(0)->GetName() );
12640 break;
12641 case eGENVAR_REF:
12642 fprintf( f, "%s", Arg<CGenvar*>(0)->GetName() );
12643 break;
12644 case eVAR_DECL:
12645 fprintf( f, "VarDecl" );
12646 break;
12647 case eLIST:
12648 fprintf( f, "(" );
12649 Arg<CNode*>(0)->Dump( f );
12650 fprintf( f, "," );
12651 Arg<CNode*>(1)->Dump( f );
12652 fprintf( f, ")" );
12653 break;
12654 case eRANGE:
12655 fprintf( f, "" );
12656 Arg<CNode*>(0)->Dump( f );
12657 fprintf( f, ":" );
12658 Arg<CNode*>(1)->Dump( f );
12659 fprintf( f, "" );
12660 break;
12661 case eSLICE:
12662 fprintf( f, "" );
12663 Arg<CNode*>(0)->Dump( f );
12664 fprintf( f, ":" );
12665 Arg<CNode*>(1)->Dump( f );
12666 fprintf( f, "" );
12667 break;
12668 case ePSLICE:
12669 fprintf( f, "" );
12670 Arg<CNode*>(0)->Dump( f );
12671 fprintf( f, "+:" );
12672 Arg<CNode*>(1)->Dump( f );
12673 fprintf( f, "" );
12674 break;
12675 case eMSLICE:
12676 fprintf( f, "" );
12677 Arg<CNode*>(0)->Dump( f );
12678 fprintf( f, "-:" );
12679 Arg<CNode*>(1)->Dump( f );
12680 fprintf( f, "" );
12681 break;
12682 case eCVRI:
12683 fprintf( f, "CVRI(" );
12684 Arg<CNode*>(0)->Dump( f );
12685 fprintf( f, ")" );
12686 break;
12687 case eCVIR:
12688 fprintf( f, "CVIR(" );
12689 Arg<CNode*>(0)->Dump( f );
12690 fprintf( f, ")" );
12691 break;
12692 case eREP:
12693 fprintf( f, "{" );
12694 Arg<CNode*>(0)->Dump( f );
12695 fprintf( f, "{" );
12696 Arg<CNode*>(1)->Dump( f );
12697 fprintf( f, "}}" );
12698 break;
12699 case eCAT:
12700 fprintf( f, "{" );
12701 Arg<CNode*>(0)->Dump( f );
12702 fprintf( f, "," );
12703 Arg<CNode*>(1)->Dump( f );
12704 fprintf( f, "}" );
12705 break;
12706 case eUCAT:
12707 fprintf( f, "{" );
12708 Arg<CNode*>(0)->Dump( f );
12709 fprintf( f, "}" );
12710 break;
12711 case eCOM:
12712 fprintf( f, "~(" );
12713 Arg<CNode*>(0)->Dump( f );
12714 fprintf( f, ")" );
12715 break;
12716 case eNEG:
12717 fprintf( f, "-(" );
12718 Arg<CNode*>(0)->Dump( f );
12719 fprintf( f, ")" );
12720 break;
12721 case ePLUS:
12722 fprintf( f, "+(" );
12723 Arg<CNode*>(0)->Dump( f );
12724 fprintf( f, ")" );
12725 break;
12726 case eNOT:
12727 fprintf( f, "!(" );
12728 Arg<CNode*>(0)->Dump( f );
12729 fprintf( f, ")" );
12730 break;
12731 case eGT:
12732 fprintf( f, "(" );
12733 Arg<CNode*>(0)->Dump( f );
12734 fprintf( f, ")>(" );
12735 Arg<CNode*>(1)->Dump( f );
12736 fprintf( f, ")" );
12737 break;
12738 case eGE:
12739 fprintf( f, "(" );
12740 Arg<CNode*>(0)->Dump( f );
12741 fprintf( f, ")>=(" );
12742 Arg<CNode*>(1)->Dump( f );
12743 fprintf( f, ")" );
12744 break;
12745 case eLT:
12746 fprintf( f, "(" );
12747 Arg<CNode*>(0)->Dump( f );
12748 fprintf( f, ")<(" );
12749 Arg<CNode*>(1)->Dump( f );
12750 fprintf( f, ")" );
12751 break;
12752 case eLE:
12753 fprintf( f, "(" );
12754 Arg<CNode*>(0)->Dump( f );
12755 fprintf( f, ")<=(" );
12756 Arg<CNode*>(1)->Dump( f );
12757 fprintf( f, ")" );
12758 break;
12759 case eLAND:
12760 fprintf( f, "(" );
12761 Arg<CNode*>(0)->Dump( f );
12762 fprintf( f, ")&&(" );
12763 Arg<CNode*>(1)->Dump( f );
12764 fprintf( f, ")" );
12765 break;
12766 case eLOR:
12767 fprintf( f, "(" );
12768 Arg<CNode*>(0)->Dump( f );
12769 fprintf( f, ")||(" );
12770 Arg<CNode*>(1)->Dump( f );
12771 fprintf( f, ")" );
12772 break;
12773 case eCEQ:
12774 fprintf( f, "(" );
12775 Arg<CNode*>(0)->Dump( f );
12776 fprintf( f, ")===(" );
12777 Arg<CNode*>(1)->Dump( f );
12778 fprintf( f, ")" );
12779 break;
12780 case eCNE:
12781 fprintf( f, "(" );
12782 Arg<CNode*>(0)->Dump( f );
12783 fprintf( f, ")!==(" );
12784 Arg<CNode*>(1)->Dump( f );
12785 fprintf( f, ")" );
12786 break;
12787 case eEQ:
12788 fprintf( f, "(" );
12789 Arg<CNode*>(0)->Dump( f );
12790 fprintf( f, ")==(" );
12791 Arg<CNode*>(1)->Dump( f );
12792 fprintf( f, ")" );
12793 break;
12794 case eNE:
12795 fprintf( f, "(" );
12796 Arg<CNode*>(0)->Dump( f );
12797 fprintf( f, ")!=(" );
12798 Arg<CNode*>(1)->Dump( f );
12799 fprintf( f, ")" );
12800 break;
12801 case eRAND:
12802 fprintf( f, "&(" );
12803 Arg<CNode*>(0)->Dump( f );
12804 fprintf( f, ")" );
12805 break;
12806 case eRNAND:
12807 fprintf( f, "~&(" );
12808 Arg<CNode*>(0)->Dump( f );
12809 fprintf( f, ")" );
12810 break;
12811 case eROR:
12812 fprintf( f, "|(" );
12813 Arg<CNode*>(0)->Dump( f );
12814 fprintf( f, ")" );
12815 break;
12816 case eRNOR:
12817 fprintf( f, "~|(" );
12818 Arg<CNode*>(0)->Dump( f );
12819 fprintf( f, ")" );
12820 break;
12821 case eRXOR:
12822 fprintf( f, "^(" );
12823 Arg<CNode*>(0)->Dump( f );
12824 fprintf( f, ")" );
12825 break;
12826 case eRXNOR:
12827 fprintf( f, "~^(" );
12828 Arg<CNode*>(0)->Dump( f );
12829 fprintf( f, ")" );
12830 break;
12831 case eHOOK:
12832 fprintf( f, "(" );
12833 Arg<CNode*>(0)->Dump( f );
12834 fprintf( f, ")?(" );
12835 Arg<CNode*>(1)->Dump( f );
12836 fprintf( f, "):(" );
12837 Arg<CNode*>(2)->Dump( f );
12838 fprintf( f, ")" );
12839 break;
12840 case eINIT:
12841 fprintf( f, "INIT(*)" );
12842 break;
12843 case ePOSEDGE:
12844 fprintf( f, "POSEDGE(" );
12845 Arg<CNode*>(0)->Dump( f );
12846 fprintf( f, ")" );
12847 break;
12848 case eNEGEDGE:
12849 fprintf( f, "NEGEDGE(" );
12850 Arg<CNode*>(0)->Dump( f );
12851 fprintf( f, ")" );
12852 break;
12853 case eEDGE:
12854 fprintf( f, "EDGE(" );
12855 Arg<CNode*>(0)->Dump( f );
12856 fprintf( f, ")" );
12857 break;
12858 case eMTM:
12859 fprintf( f, "(" );
12860 Arg<CNode*>(0)->Dump( f );
12861 fprintf( f, ":" );
12862 Arg<CNode*>(1)->Dump( f );
12863 fprintf( f, ":" );
12864 Arg<CNode*>(2)->Dump( f );
12865 fprintf( f, ")" );
12866 break;
12867 case eMODULE_DEF:
12868 fprintf( f, "MODULE_DEF" );
12869 break;
12870 case eMACRO_EXPR:
12871 fprintf( f, "" );
12872 fprintf( f, "%s", (const char*)Arg<const char*>(0) );
12873 fprintf( f, "<" );
12874 Arg<CNode*>(1)->Dump( f );
12875 fprintf( f, ">" );
12876 break;
12877 case eCOMMENT:
12878 case eVRQ:
12879 case eNOP:
12880 case eINSTANCE_REF:
12881 case eGATE_REF:
12882 case eTASK_ENABLE:
12883 case eSYSTASK_CALL:
12884 case eTIMING_CALL:
12885 case eNET_DECL:
12886 case ePARAM_DECL:
12887 case eSPECPARAM_DECL:
12888 case ePORT_DECL:
12889 case eGENVAR_DECL:
12890 case eALWAYS:
12891 case eEVENT:
12892 case eBLOCK_REF:
12893 case eSPECIFY_REF:
12894 case eASSIGN:
12895 case eFORCE:
12896 case eRELEASE:
12897 case eNBASSIGN:
12898 case eEVOR:
12899 case eDELAY:
12900 case eIF:
12901 case eFOREVER:
12902 case eREPEAT:
12903 case eWHILE:
12904 case eWAIT:
12905 case eFOR:
12906 case eCASE:
12907 case eCASEX:
12908 case eCASEZ:
12909 case eCASEITEM:
12910 case eCASSIGN:
12911 case eARG:
12912 case eFUNCTION_DEF:
12913 case eREPEAT_CONTROL:
12914 case eDELAY_CONTROL:
12915 case eEVENT_CONTROL:
12916 case eEXTERNAL_REF:
12917 case ePORT_DEF:
12918 case eDEFPARAM:
12919 case ePATH:
12920 case ePATH_ASSIGN:
12921 case eIFNONE_PATH_ASSIGN:
12922 case eTRIGGER:
12923 case ePASSIGN:
12924 case eDEASSIGN:
12925 case eDISABLE:
12926 case eATTRIBUTE:
12927 case eGIF:
12928 case eGFOR:
12929 case eGCASE:
12930 case eTABLE:
12931 case eTABLE_ENTRY:
12932 case eTABLE_SYMBOL:
12933 case ePORTLIST_END:
12934 MASSERT( FALSE );
12935 break;
12936 }
12937 }
12938
12939 #endif // DEFINE_METHODS
12940
12941 #ifdef DEFINE_TEST_HARNESS
12942 void CNodeTestHarness()
12943 {
12944 for( int i = 0; i < 124; ++i ) {
12945 CNode* n = new(CNode::stack) CNode( NULL, (NodeOp_t)i );
12946 if( n->Precedence() != n->Precedence_1() ) {
12947 printf( "Fail %s\n", nodeOpName[i] );
12948 exit(1);
12949 }
12950 }
12951 }
12952 #endif // DEFINE_TEST_HARNESS