51DdNode * Kit_SopToBdd( DdManager * dd,
Kit_Sop_t * cSop,
int nVars )
53 DdNode * bSum, * bCube, * bTemp, * bVar;
58 bSum = Cudd_ReadLogicZero(dd); Cudd_Ref( bSum );
62 bCube = Cudd_ReadOne(dd); Cudd_Ref( bCube );
63 for ( v = 0; v < nVars; v++ )
65 Value = ((uCube >> 2*v) & 3);
67 bVar = Cudd_Not( Cudd_bddIthVar( dd, v ) );
68 else if ( Value == 2 )
69 bVar = Cudd_bddIthVar( dd, v );
72 bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube );
73 Cudd_RecursiveDeref( dd, bTemp );
75 bSum = Cudd_bddOr( dd, bTemp = bSum, bCube );
77 Cudd_RecursiveDeref( dd, bTemp );
78 Cudd_RecursiveDeref( dd, bCube );
96DdNode * Kit_GraphToBdd( DdManager * dd,
Kit_Graph_t * pGraph )
98 DdNode * bFunc, * bFunc0, * bFunc1;
103 assert( Kit_GraphLeaveNum(pGraph) >= 0 );
104 assert( Kit_GraphLeaveNum(pGraph) <= pGraph->
nSize );
107 if ( Kit_GraphIsConst(pGraph) )
108 return Cudd_NotCond(
b1, Kit_GraphIsComplement(pGraph) );
110 if ( Kit_GraphIsVar(pGraph) )
111 return Cudd_NotCond( Cudd_bddIthVar(dd, Kit_GraphVarInt(pGraph)), Kit_GraphIsComplement(pGraph) );
115 pNode->
pFunc = Cudd_bddIthVar( dd, i );
122 pNode->
pFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( (DdNode *)pNode->
pFunc );
126 bFunc = (DdNode *)pNode->
pFunc; Cudd_Ref( bFunc );
128 Cudd_RecursiveDeref( dd, (DdNode *)pNode->
pFunc );
132 return Cudd_NotCond( bFunc, Kit_GraphIsComplement(pGraph) );
146DdNode * Kit_TruthToBdd_rec( DdManager * dd,
unsigned * pTruth,
int iBit,
int nVars,
int nVarsTotal,
int fMSBonTop )
148 DdNode * bF0, * bF1, * bF;
152 unsigned uTruth, uMask;
153 uMask = ((~(unsigned)0) >> (32 - (1<<nVars)));
154 uTruth = (pTruth[iBit>>5] >> (iBit&31)) & uMask;
157 if ( uTruth == uMask )
161 Var = fMSBonTop? nVarsTotal-nVars : nVars-1;
163 bF0 = Kit_TruthToBdd_rec( dd, pTruth, iBit, nVars-1, nVarsTotal, fMSBonTop ); Cudd_Ref( bF0 );
164 bF1 = Kit_TruthToBdd_rec( dd, pTruth, iBit+(1<<(nVars-1)), nVars-1, nVarsTotal, fMSBonTop ); Cudd_Ref( bF1 );
165 bF = Cudd_bddIte( dd, dd->vars[
Var], bF1, bF0 ); Cudd_Ref( bF );
166 Cudd_RecursiveDeref( dd, bF0 );
167 Cudd_RecursiveDeref( dd, bF1 );
187DdNode * Kit_TruthToBdd( DdManager * dd,
unsigned * pTruth,
int nVars,
int fMSBonTop )
189 return Kit_TruthToBdd_rec( dd, pTruth, 0, nVars, nVars, fMSBonTop );
205 static DdManager * dd = NULL;
207 DdNode * bFunc1, * bFunc2;
212 dd = Cudd_Init( 16, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
214 vMemory = Vec_IntAlloc( Vec_IntSize(vCover) );
217 bFunc1 = Kit_SopToBdd( dd, cSop, nVars ); Cudd_Ref( bFunc1 );
218 bFunc2 = Kit_GraphToBdd( dd, pFForm ); Cudd_Ref( bFunc2 );
221 RetValue = (bFunc1 == bFunc2);
222 if ( bFunc1 != bFunc2 )
229 Cudd_RecursiveDeref( dd, bFunc1 );
230 Cudd_RecursiveDeref( dd, bFunc2 );
231 Vec_IntFree( vMemory );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Kit_SopFactorVerify(Vec_Int_t *cSop, Kit_Graph_t *pFForm, int nVars)
#define Kit_GraphForEachNode(pGraph, pAnd, i)
struct Kit_Graph_t_ Kit_Graph_t
void Kit_SopCreate(Kit_Sop_t *cResult, Vec_Int_t *vInput, int nVars, Vec_Int_t *vMemory)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Kit_Sop_t_ Kit_Sop_t
INCLUDES ///.
struct Kit_Node_t_ Kit_Node_t
#define Kit_SopForEachCube(cSop, uCube, i)
ITERATORS ///.
#define Kit_GraphForEachLeaf(pGraph, pLeaf, i)