32static DdNode * Extra_dsdRemap( DdManager * dd, DdNode * bFunc,
st__table * pCache,
33 int * pVar2Form,
int * pForm2Var, DdNode * pbCube0[], DdNode * pbCube1[] );
34static DdNode * Extra_bddNodePointedByCube( DdManager * dd, DdNode * bF, DdNode * bC );
58 int i, iVar, iLev, * pPermute;
59 DdNode ** pbCube0, ** pbCube1;
60 DdNode * bFunc, * bRes, * bTemp;
67 pbCube0 =
ABC_ALLOC( DdNode *, dd->size );
68 pbCube1 =
ABC_ALLOC( DdNode *, dd->size );
73 for ( i = 0; i < pNode->
nDecs; i++ )
75 pForm2Var[i] = dd->invperm[i];
76 for ( bTemp = pNode->
pDecs[i]->
S; bTemp !=
b1; bTemp = cuddT(bTemp) )
78 iVar = dd->invperm[iLev];
79 pPermute[bTemp->index] = iVar;
86 Cudd_Ref( pbCube0[i] );
88 Cudd_Ref( pbCube1[i] );
92 bFunc = Cudd_bddPermute( dd, pNode->
G, pPermute ); Cudd_Ref( bFunc );
94 for ( i = 0; i < pNode->
nDecs; i++ )
96 pbCube0[i] = Cudd_bddPermute( dd, bTemp = pbCube0[i], pPermute ); Cudd_Ref( pbCube0[i] );
97 Cudd_RecursiveDeref( dd, bTemp );
98 pbCube1[i] = Cudd_bddPermute( dd, bTemp = pbCube1[i], pPermute ); Cudd_Ref( pbCube1[i] );
99 Cudd_RecursiveDeref( dd, bTemp );
104 bRes = Extra_dsdRemap( dd, bFunc, pCache, pVar2Form, pForm2Var, pbCube0, pbCube1 ); Cudd_Ref( bRes );
107 Cudd_RecursiveDeref( dd, bFunc );
108 for ( i = 0; i < pNode->
nDecs; i++ )
110 Cudd_RecursiveDeref( dd, pbCube0[i] );
111 Cudd_RecursiveDeref( dd, pbCube1[i] );
115 // permute the function once again
116 // in such a way that i-th var stood for i-th formal input
117 for ( i = 0; i < dd->size; i++ )
119 for ( i = 0; i < pNode->nDecs; i++ )
120 pPermute[dd->invperm[i]] = i;
121 bRes = Cudd_bddPermute( dd, bTemp = bRes, pPermute ); Cudd_Ref( bRes );
122 Cudd_RecursiveDeref( dd, bTemp );
146DdNode * Extra_dsdRemap( DdManager * dd, DdNode * bF,
st__table * pCache,
147 int * pVar2Form,
int * pForm2Var, DdNode * pbCube0[], DdNode * pbCube1[] )
149 DdNode * bFR, * bF0, * bF1;
150 DdNode * bRes0, * bRes1, * bRes;
153 bFR = Cudd_Regular(bF);
154 if ( cuddIsConstant(bFR) )
160 if (
st__lookup( pCache, (
char *)bF, (
char **)&bRes ) )
165 iForm = pVar2Form[bFR->index];
168 bF0 = Extra_bddNodePointedByCube( dd, bF, pbCube0[iForm] );
169 bF1 = Extra_bddNodePointedByCube( dd, bF, pbCube1[iForm] );
172 bRes0 = Extra_dsdRemap( dd, bF0, pCache, pVar2Form, pForm2Var, pbCube0, pbCube1 ); Cudd_Ref( bRes0 );
173 bRes1 = Extra_dsdRemap( dd, bF1, pCache, pVar2Form, pForm2Var, pbCube0, pbCube1 ); Cudd_Ref( bRes1 );
176 bRes = Cudd_bddIte( dd, dd->vars[ pForm2Var[iForm] ], bRes1, bRes0 ); Cudd_Ref( bRes );
177 Cudd_RecursiveDeref( dd, bRes0 );
178 Cudd_RecursiveDeref( dd, bRes1 );
182 st__insert( pCache, (
char *)bF, (
char *)bRes );
198DdNode * Extra_bddNodePointedByCube( DdManager * dd, DdNode * bF, DdNode * bC )
217 bFR = Cudd_Regular( bF );
218 bCR = Cudd_Regular( bC );
219 assert( !cuddIsConstant( bFR ) );
221 LevelF = dd->perm[bFR->index];
222 LevelC = dd->perm[bCR->index];
224 if ( LevelF <= LevelC )
228 bF0 = Cudd_Not( cuddE(bFR) );
229 bF1 = Cudd_Not( cuddT(bFR) );
242 if ( LevelC <= LevelF )
246 bC0 = Cudd_Not( cuddE(bCR) );
247 bC1 = Cudd_Not( cuddT(bCR) );
262 return Extra_bddNodePointedByCube( dd, bF1, bC1 );
263 return Extra_bddNodePointedByCube( dd, bF0, bC0 );
279DdNode * dsdTreeGetPrimeFunction( DdManager * dd,
Dsd_Node_t * pNode,
int fRemap )
281 DdNode * bCof0, * bCof1, * bCube0, * bCube1, * bNewFunc, * bTemp;
297 bNewFunc = pNode->
G; Cudd_Ref( bNewFunc );
299 for ( i = 0; i < pNode->
nDecs; i++ )
303 bCof0 = Cudd_Cofactor( dd, bNewFunc, bCube0 ); Cudd_Ref( bCof0 );
304 Cudd_RecursiveDeref( dd, bCube0 );
307 bCof1 = Cudd_Cofactor( dd, bNewFunc, bCube1 ); Cudd_Ref( bCof1 );
308 Cudd_RecursiveDeref( dd, bCube1 );
310 Cudd_RecursiveDeref( dd, bNewFunc );
315 bNewFunc = Cudd_bddIte( dd, dd->vars[pNode->
pDecs[i]->
S->index],bCof1,bCof0 ); Cudd_Ref( bNewFunc );
316 Cudd_RecursiveDeref( dd, bCof0 );
317 Cudd_RecursiveDeref( dd, bCof1 );
324 for ( i = 0; i < pNode->
nDecs; i++ )
326 Permute[ pNode->
pDecs[i]->
S->index ] = i;
328 bNewFunc = Cudd_bddPermute( dd, bTemp = bNewFunc, Permute ); Cudd_Ref( bNewFunc );
329 Cudd_RecursiveDeref( dd, bTemp );
332 Cudd_Deref( bNewFunc );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define MAXINPUTS
INCLUDES ///.
DdNode * Dsd_TreeGetPrimeFunction(DdManager *dd, Dsd_Node_t *pNode)
FUNCTION DEFINITIONS ///.
struct Dsd_Node_t_ Dsd_Node_t
#define Dsd_IsComplement(p)
MACRO DEFINITIONS ///.
int st__ptrhash(const char *, int)
int st__ptrcmp(const char *, const char *)
int st__lookup(st__table *table, const char *key, char **value)
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
int st__insert(st__table *table, const char *key, char *value)
void st__free_table(st__table *table)