summaryrefslogtreecommitdiffstats
path: root/src/bdd/dsd/dsd.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bdd/dsd/dsd.h')
-rw-r--r--src/bdd/dsd/dsd.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/bdd/dsd/dsd.h b/src/bdd/dsd/dsd.h
new file mode 100644
index 00000000..60cf4a4e
--- /dev/null
+++ b/src/bdd/dsd/dsd.h
@@ -0,0 +1,115 @@
+/**CFile****************************************************************
+
+ FileName [dsd.h]
+
+ PackageName [DSD: Disjoint-support decomposition package.]
+
+ Synopsis [External declarations of the package.
+ This fast BDD-based recursive algorithm for simple
+ (single-output) DSD is based on the following papers:
+ (1) V. Bertacco and M. Damiani, "Disjunctive decomposition of
+ logic functions," Proc. ICCAD '97, pp. 78-82.
+ (2) Y. Matsunaga, "An exact and efficient algorithm for disjunctive
+ decomposition", Proc. SASIMI '98, pp. 44-50.
+ The scope of detected decompositions is the same as in the paper:
+ T. Sasao and M. Matsuura, "DECOMPOS: An integrated system for
+ functional decomposition," Proc. IWLS '98, pp. 471-477.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 8.0. Started - September 22, 2003.]
+
+ Revision [$Id: dsd.h,v 1.0 2002/22/09 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#ifndef __DSD_H__
+#define __DSD_H__
+
+////////////////////////////////////////////////////////////////////////
+/// TYPEDEF DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+typedef struct Dsd_Manager_t_ Dsd_Manager_t;
+typedef struct Dsd_Node_t_ Dsd_Node_t;
+typedef enum Dsd_Type_t_ Dsd_Type_t;
+
+////////////////////////////////////////////////////////////////////////
+/// STRUCTURE DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// PARAMETERS ///
+////////////////////////////////////////////////////////////////////////
+
+// types of DSD nodes
+enum Dsd_Type_t_ {
+ DSD_NODE_NONE = 0,
+ DSD_NODE_CONST1 = 1,
+ DSD_NODE_BUF = 2,
+ DSD_NODE_OR = 3,
+ DSD_NODE_EXOR = 4,
+ DSD_NODE_PRIME = 5,
+};
+
+////////////////////////////////////////////////////////////////////////
+/// MACRO DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+// complementation and testing for pointers for decomposition entries
+#define Dsd_IsComplement(p) (((int)((long) (p) & 01)))
+#define Dsd_Regular(p) ((Dsd_Node_t *)((unsigned)(p) & ~01))
+#define Dsd_Not(p) ((Dsd_Node_t *)((long)(p) ^ 01))
+#define Dsd_NotCond(p,c) ((Dsd_Node_t *)((long)(p) ^ (c)))
+
+////////////////////////////////////////////////////////////////////////
+/// ITERATORS ///
+////////////////////////////////////////////////////////////////////////
+
+// iterator through the transitions
+#define Dsd_NodeForEachChild( Node, Index, Child ) \
+ for ( Index = 0; \
+ Index < Dsd_NodeReadDecsNum(Node) && \
+ ((Child = Dsd_NodeReadDec(Node,Index))>=0); \
+ Index++ )
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/*=== dsdApi.c =======================================================*/
+extern Dsd_Type_t Dsd_NodeReadType( Dsd_Node_t * p );
+extern DdNode * Dsd_NodeReadFunc( Dsd_Node_t * p );
+extern DdNode * Dsd_NodeReadSupp( Dsd_Node_t * p );
+extern Dsd_Node_t ** Dsd_NodeReadDecs( Dsd_Node_t * p );
+extern Dsd_Node_t * Dsd_NodeReadDec ( Dsd_Node_t * p, int i );
+extern int Dsd_NodeReadDecsNum( Dsd_Node_t * p );
+extern int Dsd_NodeReadMark( Dsd_Node_t * p );
+extern void Dsd_NodeSetMark( Dsd_Node_t * p, int Mark );
+extern Dsd_Node_t * Dsd_ManagerReadRoot( Dsd_Manager_t * pMan, int i );
+extern Dsd_Node_t * Dsd_ManagerReadInput( Dsd_Manager_t * pMan, int i );
+/*=== dsdMan.c =======================================================*/
+extern Dsd_Manager_t * Dsd_ManagerStart( DdManager * dd, int nSuppMax, int fVerbose );
+extern void Dsd_ManagerStop( Dsd_Manager_t * dMan );
+/*=== dsdProc.c =======================================================*/
+extern void Dsd_Decompose( Dsd_Manager_t * dMan, DdNode ** pbFuncs, int nFuncs );
+/*=== dsdTree.c =======================================================*/
+extern void Dsd_TreeNodeGetInfo( Dsd_Manager_t * dMan, int * DepthMax, int * GateSizeMax );
+extern void Dsd_TreeNodeGetInfoOne( Dsd_Node_t * pNode, int * DepthMax, int * GateSizeMax );
+extern int Dsd_TreeCountNonTerminalNodes( Dsd_Manager_t * dMan );
+extern int Dsd_TreeCountNonTerminalNodesOne( Dsd_Node_t * pRoot );
+extern int Dsd_TreeCountPrimeNodes( Dsd_Manager_t * pDsdMan );
+extern int Dsd_TreeCountPrimeNodesOne( Dsd_Node_t * pRoot );
+extern int Dsd_TreeCollectDecomposableVars( Dsd_Manager_t * dMan, int * pVars );
+extern Dsd_Node_t ** Dsd_TreeCollectNodesDfs( Dsd_Manager_t * dMan, int * pnNodes );
+extern void Dsd_TreePrint( FILE * pFile, Dsd_Manager_t * dMan, char * pInputNames[], char * pOutputNames[], int fShortNames, int Output );
+/*=== dsdLocal.c =======================================================*/
+extern DdNode * Dsd_TreeGetPrimeFunction( DdManager * dd, Dsd_Node_t * pNode );
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+#endif \ No newline at end of file