Main Page | Class List | File List | Class Members | File Members

tarski.h

Go to the documentation of this file.
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, // LISP style cons list
00038   Pair_c, // used to encode a pair of nodes -- differs from a list
00039           // in that we use a single node rather than two nodes
00040 
00041   // inputs
00042   ScalarPI_c, // scalar primary input node has id in left field, right is nil
00043   BooleanPI_c, // Boolean primary input node has id in left field, right is nil
00044 
00045   // regs
00046   ScalarReg_c, // scalar register, left child is name, right is list of 
00047                // length two; first entry is the init, second is the ns function
00048   BooleanReg_c, // Boolean register, same org as for scalar
00049 
00050   // internal vars
00051   InternalScalarVar_c, // internal scalar variable, leftchild is its name, right is nil
00052   InternalBooleanVar_c, // internal boolean variable, leftchild is its name, right is nil
00053 
00054   Assign_c, // left node is variable name, right node is expression it's being assigned to
00055 
00056   // Boolean ops
00057   And_c, // left node is one of two ops, right is the other
00058   Or_c, // left node is one of two ops, right is the other
00059   Not_c, // left node is argument, right node is nil
00060   Iff_c, // children are arguments, applies to booleans only
00061   TRUE_c, // Boolean const TRUE, no children
00062   FALSE_c, // Boolean const FALSE, no children
00063 
00064   // scalar ops
00065   Mux_c, // left node is control, right is pair of two inputs, first is for IF case
00066   Equal_c, // children are arguments, applies to scalars
00067   UnaryFunc_c, // single argument function, name is in left node, arg in right
00068   Func_c, // multi argument function, name is left node, args are in list form on right
00069   Relation_c, // uninterpreted relation, name is left node, args are in list form on right
00070   ScalarConst_c, // scalar constant, its name is in left child, right child is nil
00071 
00072 } Operator_t;
00073 
00074 /*---------------------------------------------------------------------------*/
00075 /* Structure declarations                                                    */
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 // forward declaration, needed for vector matrix product
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++( );  // takes or of all entries
00149     F operator--( );  // takes and of all entries; mnemonic: makes smaller
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!( ); // point wise negation
00189     Fmatrix *operator*( Fmatrix * );
00190     Fmatrix *operator|( Fmatrix * );
00191     Fvector *operator[]( int );
00192     F operator++(); // or all entries
00193     F operator--(); // and all entries
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 /* Macro declarations                                                    */
00263 /*---------------------------------------------------------------------------*/
00264 
00281 #define USE  __attribute__((unused)) 
00282 
00283 
00294 extern F Fnil;
00301 #define nil ( ( Fnode * ) 0 )   
00302 
00305 /*---------------------------------------------------------------------------*/
00306 /* Extern function prototypes                                                */
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 } /* extern "C" */
00443 #endif
00444 
00445 
00446 #endif /* _TRK */
00447 

Generated on Thu Oct 11 11:47:29 2007 for Tarski by  doxygen 1.3.9.1