00001
00020 #ifndef _TRK
00021 #define _TRK
00022
00023 #include "assert.h"
00024 #include "util.h"
00025 #include "stdarg.h"
00026 #include "bdd.h"
00027
00034 typedef enum {
00035 Undef_c,
00036
00037 List_c,
00038 Pair_c,
00039
00040
00041
00042 ScalarPI_c,
00043 BooleanPI_c,
00044
00045
00046 ScalarReg_c,
00047
00048 BooleanReg_c,
00049
00050
00051 InternalScalarVar_c,
00052 InternalBooleanVar_c,
00053
00054 Assign_c,
00055
00056
00057 And_c,
00058 Or_c,
00059 Not_c,
00060 Iff_c,
00061 TRUE_c,
00062 FALSE_c,
00063
00064
00065 Mux_c,
00066 Equal_c,
00067 UnaryFunc_c,
00068 Func_c,
00069 Relation_c,
00070 ScalarConst_c,
00071
00072 } Operator_t;
00073
00074
00075
00076
00077
00078 class cube;
00079
00086 class Fnode {
00087 public:
00088 Operator_t type;
00089 Fnode* lchild;
00090 Fnode* rchild;
00091 Fnode *operator&( Fnode * );
00092 Fnode *operator|( Fnode * );
00093 Fnode *operator%( Fnode * );
00094 Fnode *operator^( Fnode * );
00095 Fnode *operator==(Fnode * );
00096 Fnode *operator<<(Fnode * );
00097 Fnode *operator!( );
00098 Fnode *operator,( Fnode *);
00099 };
00100
00101
00109 class F {
00110 public:
00111 Fnode *raw;
00112 Operator_t type() {return raw->type;}
00113 Fnode *lchild() {return (Fnode *) raw->lchild;}
00114 Fnode *rchild() {return (Fnode *) raw->rchild;}
00115 int node_print();
00116 F operator&( F B ) {F R; R.raw = (*(raw) & B.raw); return R;}
00117 F operator|( F B ) {F R; R.raw = (*(raw) | B.raw); return R;}
00118 F operator%( F B ) {F R; R.raw = (*(raw) % B.raw); return R;}
00119 F operator^( F B ) {F R; R.raw = (*(raw) ^ B.raw); return R;}
00120 F operator==(F B ) {F R; R.raw = (*(raw) == B.raw); return R;}
00121 F operator<<(F B ) {F R; R.raw = (*(raw) << B.raw); return R;}
00122 F operator,( F B ) {F R; R.raw = (*(raw) , B.raw); return R;}
00123 F operator>>( F B ) {F R; R.raw = *!(*raw) | B.raw; return R;}
00124 F operator!( ) {F R; R.raw = ( !(*(raw) ) ); return R;}
00125 int operator()(cube);
00126 };
00127
00128
00135
00136 class Fmatrix;
00137
00138 class Fvector {
00139 public:
00140 int N;
00141 char *name;
00142 F *array;
00143 F operator[]( int );
00144 Fvector* operator!( );
00145 Fvector* operator|( Fvector * );
00146 Fvector* operator&( Fvector * );
00147 Fvector* operator*( Fmatrix * );
00148 F operator++( );
00149 F operator--( );
00150 };
00151
00152
00160 class Fv {
00161 public:
00162 Fvector *raw;
00163 int N() {return raw->N;}
00164 char *name() {return raw->name;}
00165 F *array() {return raw->array;}
00166 F operator[]( int index ) {return (*raw)[index];}
00167 Fv operator!( ) {Fv R; R.raw= !(*raw); return R;}
00168 Fv operator|( Fv B) {Fv R; R.raw= (*raw | B.raw); return R;}
00169 Fv operator&( Fv B) {Fv R; R.raw= (*raw & B.raw); return R;}
00170 F operator++( ) {F R; R = (++(*raw)); return R;}
00171 Fv operator>>( Fv B ) {Fv R; R.raw = ( *!(*raw) | B.raw); return R;}
00172 F operator--( ) {F R; R = (--(*raw)); return R;}
00173 };
00174
00181 class Fmatrix {
00182 public:
00183 char *name;
00184 int N;
00185 int M;
00186 Fvector **rows;
00187 Fmatrix *operator~( );
00188 Fmatrix *operator!( );
00189 Fmatrix *operator*( Fmatrix * );
00190 Fmatrix *operator|( Fmatrix * );
00191 Fvector *operator[]( int );
00192 F operator++();
00193 F operator--();
00194 };
00195
00196
00203 class Fm {
00204 public:
00205 Fmatrix *raw;
00206 char *name() { return raw->name; }
00207 int N() {return raw->N; }
00208 int M() {return raw->M; }
00209 Fvector **rows() {return raw->rows;}
00210 Fm operator~( ) {Fm R; R.raw = ~(*raw); return R; }
00211 Fm operator!( ) {Fm R; R.raw = !(*raw); return R;}
00212 Fm operator*( Fm B ) {Fm R; R.raw = (*raw) * (B.raw); return R;}
00213 Fm operator|( Fm B ) {Fm R; R.raw = *raw | (B.raw); return R;}
00214 Fv operator[]( int index ) {Fv R; R.raw = (*raw)[index]; return R; }
00215 Fm operator>>( Fm B ) {Fm R; R.raw = ( *!(*(raw)) | B.raw ); return R;}
00216 F operator++() {return ++(*raw); }
00217 F operator--() {return --(*raw); }
00218 };
00219
00220
00228 struct NetStruct {
00229 public:
00230 array_t * formulas;
00231 int numNodes;
00232 array_t *allNodes;
00233 array_t *PIs;
00234 array_t *constants;
00235 st_table *UIFs;
00236 st_table *nameToNodeHash;
00237 st_table *nodeToId;
00238 st_table *nodeToFanoutArray;
00239 st_table *memToSizeHash;
00240 };
00241
00242 typedef struct NetStruct Net_t;
00243
00244
00252 class cube {
00253 public:
00254 st_table *nodeToValue;
00255 cube( );
00256 ~cube( );
00257 int operator[]( F );
00258 void insert( F, int );
00259 };
00260
00261
00262
00263
00264
00281 #define USE __attribute__((unused))
00282
00283
00294 extern F Fnil;
00301 #define nil ( ( Fnode * ) 0 )
00302
00305
00306
00307
00308
00309 #ifdef __cplusplus
00310 extern "C" {
00311 #endif
00312
00313 extern Fnode *new_node( Operator_t type, Fnode *lchild, Fnode *rchild );
00314 extern Fnode *new_node_raw( Operator_t type, Fnode *lchild, Fnode *rchild );
00315 extern char *string_register( char *aString );
00316 extern Fnode *node_register( Fnode *aNode );
00317 extern int node_cmp( Fnode *aNode, Fnode *bNode );
00318 extern int node_hash( Fnode *aNode, int modulus );
00319 extern Fnode *node_dup( Net_t *net, Fnode *formula, char *suf, st_table *processedTable );
00320 extern int node_test_is_boolean( Fnode*A );
00321 extern int node_test_is_scalar( Fnode *A );
00322 extern F TRUE();
00323 extern F FALSE();
00324 extern F si( char *name );
00325 extern F bi( char *name );
00326 extern F sr( char *name );
00327 extern F br( char *name );
00328 extern F sc( char *name );
00329 extern F bc( char *name );
00330 extern F uif2( char *name, F arg1, F arg2 );
00331 extern F uir3( char *name, F arg1, F arg2, F arg3 );
00332 extern F uif3( char *name, F arg1, F arg2, F arg3 );
00333 extern F uif( char *name, F arg );
00334 extern F assign( char *name, F arg );
00335 extern F mux( F c, F D1, F D0 );
00336 extern int Node_HasLeftChildNode( Fnode*node );
00337 extern int Node_HasRightChildNode( Fnode*node );
00338 extern Fnode * node_GetUnique(Fnode *node);
00339 extern Fnode *cons( Fnode *a, Fnode *b );
00340 extern Fnode *car( Fnode *a );
00341 extern Fnode *cdr( Fnode *a );
00342 extern F list( F startNode, ... );
00343 extern int listlength( F aList );
00344 extern F ri( char *name, F restrictedList );
00345 extern F restrict( F aNode, F restrictedList );
00346 extern Fnode *nn( Operator_t a, Fnode *b, Fnode *c);
00347 extern Fnode *rn( Fnode *aNode );
00348 extern char*rs( char*aString );
00349 extern Fnode*Mux_ThenInput( Fnode*aNode );
00350 extern Fnode*Mux_ElseInput( Fnode*aNode );
00351 extern Fnode *Reg_InitFunc( Fnode *node );
00352 extern Fnode *Reg_NsFunc( Fnode *node );
00353 extern Fnode *Func_FirstArg( Fnode *node );
00354 extern Fnode *Func_SecondArg( Fnode *node );
00355 extern Fnode *Func_ThirdArg( Fnode *node );
00356 extern Fnode* Func_NextArg (Fnode *node, Fnode *node);
00357 extern st_table *nodeGetSupport( F aNode );
00358 extern void nodeGetSupportRecur( F aNode, st_table *result, st_table *processedTable );
00359 extern void reg( F aReg, F nextState, F initState );
00360 extern Fnode *Net_NameToNode( Net_t *net, char *name );
00361 extern Net_t *Net_CreateFromFormula( Fnode *aFormula );
00362 extern Net_t *Net_CreateFromFormulaArray( array_t *aFormulas );
00363 extern int Net_FreeNet( Net_t *net );
00364 extern int Net_PopulateFields( Net_t *net, Fnode *aFormula, Fnode *parentFormula, st_table *processedNodes );
00365 extern int Net_DoBryantReduction( Net_t *net );
00366 extern int Net_PrintFormula( Net_t *net, Fnode *formula, char *filename);
00367 extern int Node_PrintVHDL( Net_t *net, Fnode *formula, FILE *fptr, st_table *nodeToNameHash, st_table *processedNodes, st_table *uifInstantiateHash, st_table *uifToNumInputs, int vector_width);
00368 extern int Net_NodeGetId( Net_t *net, Fnode *formula );
00369 extern int Net_ConstrainInput( Net_t *net, char *input, Fnode *const_formula );
00370 extern int Net_UnConstrainInput( Net_t *net, char *input, Fnode *const_formula );
00371 extern array_t *node_array_tfe( array_t *input_array, int N );
00372 extern Fnode *node_tfe( Fnode *formula, int N );
00373 extern int ReplaceWritewithRead( Net_t *net, char *writeUifName, char *readUifName);
00374 extern int AddReadatEnd(Net_t *net, Fnode *readAddress, char *readUifName, int formula_index);
00375 extern int Net_TopologicalSort(Fnode *aFormula, st_table *sortedTable, st_table *processedNodes);
00376 extern int Net_ConstantPropagation(st_table *sortedTable, st_table *equivalentNodeHash, int max_depth);
00377 extern Fnode* Net_SimplifyUsingConstantPropagation(Fnode *aFormula);
00378 extern Fv ivec( char *name, int N, int boolean );
00379 extern Fvector *ivecraw( char *name, int N, int boolean );
00380 extern Fv sivec( char *name, int N );
00381 extern Fv bivec( char *name, int N );
00382 extern Fmatrix *imatrixraw( char *name, int N, int M, int boolean );
00383 extern Fm imatrix( char *name, int N, int M, int boolean );
00384 extern Fm simatrix( char *name, int N, int M );
00385 extern Fm bimatrix( char *name, int N, int M );
00386 extern Fmatrix *bcm( int N, int M, int value );
00387 extern Fmatrix *raw_matrix( int N, int M );
00388 extern Fvector *raw_vector( int M );
00389 extern F matrix_lone_cols( Fm A );
00390 extern F matrix_lone_rows( Fm A );
00391 extern F vector_lone( Fv x );
00392 extern Fv operator*( Fv x, Fm M);
00393 extern F mexists( Fm A );
00394 extern F mforall( Fm A );
00395 extern F vexists( Fv A );
00396 extern F vforall( Fv A );
00397 extern F build_dlx();
00398 extern array_t *build_dlx_impl();
00399 extern array_t *build_dlx_impl2();
00400 extern F build_dlx_spec();
00401 extern array_t *build_dlx_spec2();
00402 extern array_t *build_dlx_spec3();
00403 extern F build_fs();
00404 extern F build_dlxuclidmain();
00405 extern F build_dlxuclidmain_nosimplify();
00406 extern F build_dlxuclid_seq();
00407 extern bdd_t *nodeComputeBdd( F aNode );
00408 extern int test_bdd();
00409 extern int bdd_print_dot( bdd_t *aBdd );
00410 extern int bdd_print_recur( bdd_t *aBdd, st_table *processedTable );
00411 extern int bdd_cmp( char *aBdd, char *bBdd );
00412 extern int bdd_hash( char *aBdd, int modulus );
00413 extern st_table *Net_ReadNodeVals( char * );
00414 extern int Net_CheckBurchFeasibility(Fnode *aFormula, Fnode *ctrl_child);
00415 extern void Net_CollectMuxes(Fnode *aFormula, st_table *mux_hash);
00416 extern F build_dlx_uclid_wholemodel();
00417 extern array_t * build_double_instr();
00418 extern F build_microarch_wrapper();
00419 extern array_t * build_single_instr();
00420 extern F build_dlx_uclid_compare();
00421 extern array_t * build_dlx_uclid_spec();
00422 extern array_t *build_dlx_uclid_impl();
00423 extern F build_dlx_uclid_superscalar();
00424 extern F build_dlx_uclid_superscalar_seq();
00425 extern F build_fold_unfold_check();
00426 extern void NodeAssignRegister( F reg,
00427 F init_state,
00428 F next_state);
00429 extern Net_t* Net_ReplaceWritewithRead( Net_t *net,
00430 char *writeUifName,
00431 char *readUifName,
00432 int output_index);
00433 extern Fnode* Net_AccessOutput (Net_t *net,
00434 int output_index);
00435
00436 extern int Net_PrintVHDL (Net_t * net, int scalarWidth, char *fileName, char *entityName="example");
00437 extern int Net_SetMemSize (Net_t *net, char *memName, int memSize);
00438 extern int Net_AnalyzeScalarBitWidth (Net_t *net);
00441 #ifdef __cplusplus
00442 }
00443 #endif
00444
00445
00446 #endif
00447