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
00030
00031 #ifndef CDECL_HPP
00032 #define CDECL_HPP
00033
00034 #include <stdio.h>
00035 #include <vector>
00036 #include <list>
00037 #include "glue.h"
00038 #include "csymbol.h"
00039
00040 class CNode;
00041
00045 struct Coord_t {
00046 int lineno;
00047 const char* filename;
00048 };
00049
00050
00054 enum NodeType_t {
00055 eU,
00056 eR,
00057 eS,
00058 eE,
00059 eB
00060 };
00061
00062
00066 enum Decl_t {
00067 eREG = 0,
00068 eREAL,
00069 eREALTIME,
00070 eTIME,
00071 eINT,
00072 eWIRE,
00073 eTRI,
00074 eWAND,
00075 eTRIAND,
00076 eWOR,
00077 eTRIOR,
00078 eTRI1,
00079 eTRI0,
00080 eTRIREG,
00081 eSUPPLY0,
00082 eSUPPLY1,
00083 ePARAM,
00084 eLOCALPARAM,
00085 eBLOCK,
00086 ePARALLELBLOCK,
00087 eGENVARBLOCK,
00088 eMODULE,
00089 eMACRO,
00090 eINSTANCE,
00091 eINPUT,
00092 eOUTPUT,
00093 eINOUT,
00094 ePORT,
00095 eFREF,
00096 eFUNCTION,
00097 eSPECIFYBLOCK,
00098 eGENVAR,
00099 eDEVENT,
00100
00101 eNET,
00102 ePORTDIR,
00103 eATTR,
00104 eUDP,
00105 eNONE
00106 };
00107
00108 #if defined CDECL_CPP
00109
00112 const char* declName[] = {
00113 "reg",
00114 "real",
00115 "realtime",
00116 "time",
00117 "integer",
00118 "wire",
00119 "tri",
00120 "wand",
00121 "triand",
00122 "wor",
00123 "trior",
00124 "tri1",
00125 "tri0",
00126 "trireg",
00127 "supply0",
00128 "supply1",
00129 "param",
00130 "localparam",
00131 "block",
00132 "parallel block",
00133 "genvar block",
00134 "module",
00135 "macro",
00136 "instance",
00137 "input",
00138 "output",
00139 "inout",
00140 "port",
00141 "fref",
00142 "function",
00143 "specify block",
00144 "genvar",
00145 "event",
00146 "net",
00147 "portdir",
00148 "attr",
00149 "upd",
00150 "none"
00151 };
00152 #else
00153 extern char* declName[];
00154 #endif
00155
00156
00157
00161 class CDecl : public CObject
00162 {
00163 public:
00164 enum Flag {
00165 eFLAG_NONE = 0,
00166 eFLAG_PRAGMA = 1,
00167 eFLAG_ARRAY = 2,
00168 eFLAG_VECTOR = 4
00169 };
00170 static Flag Or( Flag f1, Flag f2 )
00171 { return static_cast<Flag>(((unsigned)f1 | (unsigned)f2)); }
00172 static Flag Or( Flag f1, Flag f2, Flag f3 )
00173 { return static_cast<Flag>(((unsigned)f1 | (unsigned)f2) | (unsigned)f3); }
00174 private:
00175 Coord_t loc;
00176 CSymbol* symbol;
00177 Decl_t type;
00178 int declStatement;
00179
00180 CNode* attributes;
00181 CNode* pragmas;
00182 vector<CNode*> indexes;
00183 int signed_;
00184 CNode* range;
00185 int numberOfDimensions;
00186 Flag flags;
00187 public:
00193 virtual int IsWidthConstant( void );
00199 virtual int IsWidthVolatile( void );
00204 virtual int IsWidthEvaluateable( void );
00209 virtual INT32 GetWidth( void );
00214 virtual CNode* GetWidthExp( void );
00219 virtual int WidthDirection( void );
00224 virtual INT32 GetMsbInt( void );
00229 virtual CNode* GetMsb();
00234 virtual CNode* GetRange() { return range; }
00239 virtual void SetRange( CNode* n );
00244 virtual INT32 GetLsbInt( void );
00249 virtual CNode* GetLsb();
00254 virtual INT32 GetNumberOfDimensions( void ) {
00255 return numberOfDimensions;
00256 }
00262 virtual CNode* GetMsi( INT32 dim );
00268 virtual CNode* GetLsi( INT32 dim );
00273 virtual void SetNumberOfDimensions( INT32 dim ) {
00274 MASSERT( flags & eFLAG_ARRAY );
00275 numberOfDimensions = dim;
00276 indexes.reserve( dim );
00277 }
00283 virtual CNode* GetIndex( INT32 dim ) { return indexes[dim]; }
00289 virtual void SetIndex( INT32 dim, CNode* v )
00290 { MASSERT(flags & eFLAG_ARRAY); indexes[dim] = v; }
00295 virtual void SetSigned( int v )
00296 { MASSERT( flags & eFLAG_VECTOR ); signed_ = v; }
00301 virtual int GetSigned() { return signed_; }
00306 virtual void SetVectored( int v ) { MASSERT( FALSE ); }
00311 virtual int GetVectored() { MASSERT( FALSE ); return 0; }
00316 virtual void SetScalared( int v ) { MASSERT( FALSE ); }
00321 virtual int GetScalared() { MASSERT( FALSE ); return 0; }
00326 void SetAttributes( CNode* attr ) { attributes = attr; }
00331 CNode* GetAttributes() { return attributes; }
00338 int HasAttribute( char* name, CNode* n=NULL, int init = 1 );
00343 virtual NodeType_t GetNodeType( void ) { return eU; }
00348 Decl_t GetClass( void )
00349 {
00350 switch( type ) {
00351 case ePARAM:
00352 case eLOCALPARAM:
00353 return ePARAM;
00354 case eREAL:
00355 case eREALTIME:
00356 return eREAL;
00357 case eREG:
00358 case eTIME:
00359 case eINT:
00360 return eREG;
00361 case eWIRE:
00362 case eTRI:
00363 case eWAND:
00364 case eTRIAND:
00365 case eWOR:
00366 case eTRIOR:
00367 case eTRI1:
00368 case eTRI0:
00369 case eTRIREG:
00370 case eSUPPLY0:
00371 case eSUPPLY1:
00372 return eNET;
00373 case eINPUT:
00374 case eOUTPUT:
00375 case eINOUT:
00376 return ePORTDIR;
00377 default:
00378 return type;
00379 }
00380 }
00381
00387 static void GetMembers( Decl_t type, list<Decl_t>& result )
00388 {
00389 switch( type ) {
00390 case ePARAM:
00391 result.push_back( ePARAM );
00392 result.push_back( eLOCALPARAM );
00393 break;
00394 case eREAL:
00395 result.push_back( eREAL );
00396 result.push_back( eREALTIME );
00397 case eREG:
00398 result.push_back( eREG );
00399 result.push_back( eTIME );
00400 result.push_back( eINT );
00401 break;
00402 case eNET:
00403 result.push_back( eWIRE );
00404 result.push_back( eTRI );
00405 result.push_back( eWAND );
00406 result.push_back( eTRIAND );
00407 result.push_back( eWOR );
00408 result.push_back( eTRIOR );
00409 result.push_back( eTRI1 );
00410 result.push_back( eTRI0 );
00411 result.push_back( eTRIREG );
00412 result.push_back( eSUPPLY0 );
00413 result.push_back( eSUPPLY1 );
00414 break;
00415 case ePORTDIR:
00416 result.push_back( eINPUT );
00417 result.push_back( eOUTPUT );
00418 result.push_back( eINOUT );
00419 break;
00420 default:
00421 result.push_back( type );
00422 break;
00423 }
00424 }
00425
00431 void SetDeclStatementCreated( void ) { declStatement = TRUE; }
00432
00437 int DeclStatementCreated( void ) { return declStatement; }
00438
00443 Decl_t GetType( void ) { return type; }
00444
00449 void SetCoord( Coord_t* aLoc ) { loc = *aLoc; }
00450
00455 Coord_t* GetCoord( void ) {
00456 return &loc;
00457 }
00458
00463 virtual void Dump( FILE* f )
00464 { fprintf( f, "'%s' line %d", loc.filename , loc.lineno ); }
00465
00470 virtual void DumpDeclInfo( FILE* f )
00471 {
00472 fprintf( f, "%s: %s, defined in '%s' line %d\n",
00473 declName[GetType()], GetName(), loc.filename , loc.lineno );
00474 }
00475
00480 const char* GetName( void ) { return symbol->GetName(); }
00485 void SetSymbol( CSymbol* aSymbol ) { symbol = aSymbol; }
00490 CSymbol* GetSymbol( void ) { return symbol; }
00495 void SetPragmas( CNode* p )
00496 { MASSERT( flags & eFLAG_PRAGMA );pragmas = p; }
00501 CNode* GetPragmas() { return pragmas; }
00502 protected:
00511 CDecl( CSymbol* aSymbol, Coord_t* aLoc,
00512 Decl_t aType, Flag flags ) {
00513 loc = *aLoc;
00514 symbol = aSymbol;
00515 type = aType;
00516 numberOfDimensions = 0;
00517 declStatement = FALSE;
00518 attributes = NULL;
00519 pragmas = NULL;
00520 range = NULL;
00521 signed_ = FALSE;
00522 this->flags = flags;
00523 }
00529 void Copy( const CDecl& o );
00535 CDecl( const CDecl& o ) { Copy( o ); }
00536
00537 public:
00538 virtual void PreVisit1( int (*func)(CNode*,void*), void* data );
00539 virtual void PostVisit1( void (*func)(CNode*, void*), void* data );
00540 virtual void PostSubVisit1( CNode* (*func)(CNode*, void*), void* data );
00541
00542 };
00543
00544 #endif // CDECL_HPP
00545