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