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 CReg;
00041 class CReal;
00042 class CNode;
00043 class CNet;
00044 class CFref;
00045 class CInstance;
00046 class CEvent;
00047 class CGenvar;
00048 class CPortDir;
00049
00050
00054 class CBlock: public CDecl
00055 {
00056 protected:
00057 vector<CParam*> paramList;
00058 vector<CEvent*> eventList;
00059 vector<CReg*> regList;
00060 vector<CReal*> realList;
00061 vector<CGenvar*> genvarList;
00062 vector<CFref*> frefList;
00063 vector<CNet*> netList;
00064 CBlock* parent;
00065 vector<CBlock*> children;
00066 CSymtab<CDecl> symtab;
00067 private:
00068 CNode* codeList;
00069 int rebalance;
00070 public:
00076 CBlock( CSymbol* name, Coord_t* aLoc );
00083 CBlock( CSymbol* name, Coord_t* aLoc, Decl_t dtype );
00087 virtual ~CBlock() {}
00096 virtual void Add( CInstance* instance );
00105 virtual void Add( CParam* param );
00114 virtual void Add( CNet* net );
00123 virtual void Add( CReg* reg );
00132 virtual void Add( CEvent* event );
00141 virtual void Add( CReal* real );
00150 virtual void Add( CBlock* child );
00159 virtual void Add( CFref* fref );
00168 virtual void Add( CGenvar* genvar );
00173 virtual void Add( CNode* code );
00178 void SetParent( CBlock* parent );
00183 CBlock* GetParent( void );
00188 virtual void Dump( FILE* f );
00193 vector<CNet*>* GetNetList();
00198 vector<CReg*>* GetRegList();
00203 vector<CParam*>* GetParamList();
00208 vector<CReal*>* GetRealList();
00213 vector<CGenvar*>* GetGenvarList();
00218 virtual CNode* GetCodeList();
00223 virtual void SetCodeList( CNode* list );
00228 vector<CBlock*>* GetChildList();
00233 virtual vector<CPortDir*>* GetPortDirList()
00234 { static vector<CPortDir*> nullList; return &nullList;}
00239 virtual void SetSymtab( CSymtab<CDecl>& symtab );
00244 virtual CSymtab<CDecl>& GetSymtab() { return symtab; }
00249 void PreVisit1( int (*func)(CNode*,void*), void* data );
00250 void PostVisit1( void (*func)(CNode*, void*), void* data );
00251 void PostSubVisit1( CNode* (*func)(CNode*, void*), void* data );
00252 protected:
00253 static void Reconnect( CNode *n );
00254 void RedeclarePorts();
00255 void LinkFrefs( CSymtab<CDecl>& portSymtab,
00256 CSymtab<CDecl>& moduleSymtab,
00257 vector<CFref*>& frefList,
00258 int inferVectors );
00259 virtual void CodeListChanged() {}
00260 private:
00261 void LinkPortFref( CSymtab<CDecl>* symtab1,
00262 CSymtab<CDecl>* symtab2,
00263 CFref* fref );
00264 void InferFref( CSymtab<CDecl>* symtab1,
00265 CFref* fref,
00266 int inferVector );
00267 void LinkFref( CSymtab<CDecl>* symtab,
00268 CFref* fref, int inferVector );
00272 };
00273
00277 typedef CBlock CScope;
00278
00279
00280 #endif // CBLOCK_HPP