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 #ifndef CBLOCK_HPP
00031 #define CBLOCK_HPP
00032
00033 #include <vector>
00034 #include "glue.h"
00035 #include "cdecl.h"
00036 #include "csymtab.h"
00037
00038
00039 class CParam;
00040 class CVar;
00041 class CNode;
00042 class CNet;
00043 class CFref;
00044 class CInstance;
00045 class CGenvar;
00046 class CPortDir;
00047
00048
00052 class CBlock: public CDecl
00053 {
00054 protected:
00055 vector<CParam*> paramList;
00056 vector<CVar*> varList;
00057 vector<CGenvar*> genvarList;
00058 vector<CFref*> frefList;
00059 vector<CNet*> netList;
00060 CBlock* parent;
00061 vector<CBlock*> children;
00062 CSymtab<CDecl> symtab;
00063 private:
00064 CNode* codeList;
00065 int rebalance;
00066 public:
00072 CBlock( CSymbol* name, Coord_t* aLoc );
00079 CBlock( CSymbol* name, Coord_t* aLoc, Decl_t dtype );
00083 virtual ~CBlock() {}
00089 virtual CDecl* Clone( CObstack* heap ) { MASSERT(FALSE); }
00098 virtual void Add( CInstance* instance );
00107 virtual void Add( CParam* param );
00116 virtual void Add( CNet* net );
00125 virtual void Add( CVar* var );
00134 virtual void Add( CBlock* child );
00143 virtual void Add( CFref* fref );
00152 virtual void Add( CGenvar* genvar );
00157 virtual void Add( CNode* code );
00162 void SetParent( CBlock* parent );
00167 CBlock* GetParent( void );
00172 virtual void Dump( FILE* f );
00177 vector<CNet*>* GetNetList();
00182 vector<CVar*>* GetVarList();
00187 vector<CParam*>* GetParamList();
00192 vector<CGenvar*>* GetGenvarList();
00197 virtual CNode* GetCodeList();
00202 virtual void SetCodeList( CNode* list );
00207 vector<CBlock*>* GetChildList();
00212 virtual vector<CPortDir*>* GetPortDirList()
00213 { static vector<CPortDir*> nullList; return &nullList;}
00218 virtual void SetSymtab( CSymtab<CDecl>& symtab );
00223 virtual CSymtab<CDecl>& GetSymtab() { return symtab; }
00228 void PreVisit1( int (*func)(CNode*,void*), void* data );
00229 void PostVisit1( void (*func)(CNode*, void*), void* data );
00230 void PostSubVisit1( CNode* (*func)(CNode*, void*), void* data );
00231 protected:
00232 static void Reconnect( CNode *n );
00233 void RedeclarePorts();
00234 void LinkFrefs( CSymtab<CDecl>& portSymtab,
00235 CSymtab<CDecl>& moduleSymtab,
00236 vector<CFref*>& frefList,
00237 int inferVectors );
00238 virtual void CodeListChanged() {}
00239 private:
00240 void LinkPortFref( CSymtab<CDecl>* symtab1,
00241 CSymtab<CDecl>* symtab2,
00242 CFref* fref );
00243 void InferFref( CSymtab<CDecl>* symtab1,
00244 CFref* fref,
00245 int inferVector );
00246 void LinkFref( CSymtab<CDecl>* symtab,
00247 CFref* fref, int inferVector );
00248 CBlock( const CBlock& );
00252 };
00253
00257 typedef CBlock CScope;
00258
00259
00260 #endif // CBLOCK_HPP