00001
00028 #ifndef __DSD_H__
00029 #define __DSD_H__
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00038
00039 typedef struct Dsd_Manager_t_ Dsd_Manager_t;
00040 typedef struct Dsd_Node_t_ Dsd_Node_t;
00041 typedef enum Dsd_Type_t_ Dsd_Type_t;
00042
00046
00050
00051
00052 enum Dsd_Type_t_ {
00053 DSD_NODE_NONE = 0,
00054 DSD_NODE_CONST1 = 1,
00055 DSD_NODE_BUF = 2,
00056 DSD_NODE_OR = 3,
00057 DSD_NODE_EXOR = 4,
00058 DSD_NODE_PRIME = 5,
00059 };
00060
00064
00065
00066 #define Dsd_IsComplement(p) (((int)((unsigned long) (p) & 01)))
00067 #define Dsd_Regular(p) ((Dsd_Node_t *)((unsigned long)(p) & ~01))
00068 #define Dsd_Not(p) ((Dsd_Node_t *)((unsigned long)(p) ^ 01))
00069 #define Dsd_NotCond(p,c) ((Dsd_Node_t *)((unsigned long)(p) ^ (c)))
00070
00074
00075
00076 #define Dsd_NodeForEachChild( Node, Index, Child ) \
00077 for ( Index = 0; \
00078 Index < Dsd_NodeReadDecsNum(Node) && \
00079 ((Child = Dsd_NodeReadDec(Node,Index))>=0); \
00080 Index++ )
00081
00085
00086
00087 extern Dsd_Type_t Dsd_NodeReadType( Dsd_Node_t * p );
00088 extern DdNode * Dsd_NodeReadFunc( Dsd_Node_t * p );
00089 extern DdNode * Dsd_NodeReadSupp( Dsd_Node_t * p );
00090 extern Dsd_Node_t ** Dsd_NodeReadDecs( Dsd_Node_t * p );
00091 extern Dsd_Node_t * Dsd_NodeReadDec ( Dsd_Node_t * p, int i );
00092 extern int Dsd_NodeReadDecsNum( Dsd_Node_t * p );
00093 extern int Dsd_NodeReadMark( Dsd_Node_t * p );
00094 extern void Dsd_NodeSetMark( Dsd_Node_t * p, int Mark );
00095 extern DdManager * Dsd_ManagerReadDd( Dsd_Manager_t * pMan );
00096 extern Dsd_Node_t * Dsd_ManagerReadRoot( Dsd_Manager_t * pMan, int i );
00097 extern Dsd_Node_t * Dsd_ManagerReadInput( Dsd_Manager_t * pMan, int i );
00098 extern Dsd_Node_t * Dsd_ManagerReadConst1( Dsd_Manager_t * pMan );
00099
00100 extern Dsd_Manager_t * Dsd_ManagerStart( DdManager * dd, int nSuppMax, int fVerbose );
00101 extern void Dsd_ManagerStop( Dsd_Manager_t * dMan );
00102
00103 extern void Dsd_Decompose( Dsd_Manager_t * dMan, DdNode ** pbFuncs, int nFuncs );
00104 extern Dsd_Node_t * Dsd_DecomposeOne( Dsd_Manager_t * pDsdMan, DdNode * bFunc );
00105
00106 extern void Dsd_TreeNodeGetInfo( Dsd_Manager_t * dMan, int * DepthMax, int * GateSizeMax );
00107 extern void Dsd_TreeNodeGetInfoOne( Dsd_Node_t * pNode, int * DepthMax, int * GateSizeMax );
00108 extern int Dsd_TreeGetAigCost( Dsd_Node_t * pNode );
00109 extern int Dsd_TreeCountNonTerminalNodes( Dsd_Manager_t * dMan );
00110 extern int Dsd_TreeCountNonTerminalNodesOne( Dsd_Node_t * pRoot );
00111 extern int Dsd_TreeCountPrimeNodes( Dsd_Manager_t * pDsdMan );
00112 extern int Dsd_TreeCountPrimeNodesOne( Dsd_Node_t * pRoot );
00113 extern int Dsd_TreeCollectDecomposableVars( Dsd_Manager_t * dMan, int * pVars );
00114 extern Dsd_Node_t ** Dsd_TreeCollectNodesDfs( Dsd_Manager_t * dMan, int * pnNodes );
00115 extern Dsd_Node_t ** Dsd_TreeCollectNodesDfsOne( Dsd_Manager_t * pDsdMan, Dsd_Node_t * pNode, int * pnNodes );
00116 extern void Dsd_TreePrint( FILE * pFile, Dsd_Manager_t * dMan, char * pInputNames[], char * pOutputNames[], int fShortNames, int Output );
00117 extern void Dsd_NodePrint( FILE * pFile, Dsd_Node_t * pNode );
00118
00119 extern DdNode * Dsd_TreeGetPrimeFunction( DdManager * dd, Dsd_Node_t * pNode );
00120
00121 #ifdef __cplusplus
00122 }
00123 #endif
00124
00125 #endif
00126