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 CFUNCTION_HPP
00032 #define CFUNCTION_HPP
00033
00034 #include <stdio.h>
00035 #include <vector>
00036 #include <list>
00037 #include "glue.h"
00038 #include "cdecl.h"
00039 #include "csymtab.h"
00040 #include "cblock.h"
00041 #include "cnode.h"
00042 #include "cfref.h"
00043
00044 class CContext;
00045
00046
00050 class CFunction: public CBlock
00051 {
00052 private:
00053 CSymtab<CDecl> portSymtab;
00054 int portDirListValid;
00055
00056 vector<CPortDir*> portDirList;
00057 CDecl* output;
00058
00059 int automatic;
00060 CNode* ports;
00061 int inlinePortDecls;
00062 public:
00069 CFunction( CSymbol* symbol, Coord_t* aLoc, int automatic );
00074 virtual void Dump( FILE* f );
00079 virtual vector<CPortDir*>* GetPortDirList();
00084 void SetPorts( CNode* n ) { ports = n; }
00089 CNode* GetPorts() { return ports; }
00094 int InlinePortDecls() { return inlinePortDecls; }
00099 void InlinePortDecls( int v ) { inlinePortDecls = v; }
00104 void SetOutput( CDecl* output ) { this->output = output; }
00109 CDecl* GetOutput() { return output; }
00115 int GetAutomatic() { return automatic; }
00116
00126 static int Width( CSymbol* symbol, CNode* args, CBlock* block ) ;
00136 static CNode* WidthExp( CSymbol* symbol, CNode* args, CBlock* block ) ;
00147 static int WidthConstant( CSymbol* symbol, CNode* args,
00148 CBlock* block );
00159 static int WidthVolatile( CSymbol* symbol, CNode* args,
00160 CBlock* block );
00170 static int WidthEvaluateable( CSymbol* symbol, CNode* args,
00171 CBlock* block );
00181 static NodeType_t Type( CSymbol* symbol, CNode* args, CBlock* block );
00182
00190 static int Evaluateable( CSymbol* symbol, CNode* args, CBlock* block );
00191
00199 static void EvalVector( CVector& v, CSymbol* symbol,
00200 CNode* args, CBlock* block );
00201
00209 static double EvalReal( CSymbol* symbol, CNode* args, CBlock* block );
00210
00215 void PreVisit1( int (*func)(CNode*,void*), void* data );
00216 void PostVisit1( void (*func)(CNode*, void*), void* data );
00217 void PostSubVisit1( CNode* (*func)(CNode*, void*), void* data );
00218 void FixupPorts();
00219 void SetPortSymtab( CSymtab<CDecl>& symtab );
00220 protected:
00221 virtual void CodeListChanged() { portDirListValid = FALSE; }
00222 private:
00223 static CFunction* FindFunction( CSymbol* symbol,
00224 CNode* args, CBlock* block );
00225 void EvaluateArgs( CContext* context, CNode* args );
00229 };
00230
00231 #endif // CFUNCTION_HPP