230 DdNode * bTemp, * zSet, * zCube, * zTemp;
240 pMapVars2Nums =
ABC_ALLOC(
int, dd->size );
241 memset( pMapVars2Nums, 0, dd->size *
sizeof(
int) );
244 p->nVarsMax = dd->size;
245 for ( i = 0, bTemp = bSupp; bTemp !=
b1; bTemp = cuddT(bTemp), i++ )
247 p->pVars[i].iVar = bTemp->index;
248 pMapVars2Nums[bTemp->index] = i;
252 zSet = zPairs; Cudd_Ref( zSet );
260 assert( cuddT(zCube) ==
z1 && cuddE(zCube) ==
z0 );
261 if ( zCube->index & 1 )
262 p->pVars[ pMapVars2Nums[zCube->index/2] ].Neg = 1;
264 p->pVars[ pMapVars2Nums[zCube->index/2] ].Pos = 1;
269 zSet = Cudd_zddDiff( dd, zTemp = zSet, zCube ); Cudd_Ref( zSet );
270 Cudd_RecursiveDerefZdd( dd, zTemp );
271 Cudd_RecursiveDerefZdd( dd, zCube );
274 Cudd_RecursiveDerefZdd( dd, zSet );
343 DdNode * bCof0, * bCof1;
346 assert( iVar < dd->size );
348 bCof0 = Cudd_Cofactor( dd, bF, Cudd_Not(Cudd_bddIthVar(dd,iVar)) ); Cudd_Ref( bCof0 );
349 bCof1 = Cudd_Cofactor( dd, bF, Cudd_bddIthVar(dd,iVar) ); Cudd_Ref( bCof1 );
351 if ( Cudd_bddLeq( dd, bCof0, bCof1 ) )
353 else if ( Cudd_bddLeq( dd, bCof1, bCof0 ) )
358 Cudd_RecursiveDeref( dd, bCof0 );
359 Cudd_RecursiveDeref( dd, bCof1 );
391 DdNode * bFR = Cudd_Regular(bFunc);
393 if ( cuddIsConstant(bFR) )
395 if ( cuddIsConstant(bVars) )
405 DdNode * zRes0, * zRes1;
406 DdNode * zTemp, * zPlus;
417 LevelF = dd->perm[bFR->index];
418 for ( bVarsNew = bVars; LevelF > dd->perm[bVarsNew->index]; bVarsNew = cuddT(bVarsNew) )
421 assert( bFR->index == bVarsNew->index );
426 bF0 = Cudd_Not( cuddE(bFR) );
427 bF1 = Cudd_Not( cuddT(bFR) );
450 Cudd_RecursiveDerefZdd( dd, zRes0 );
458 zRes = cuddZddIntersect( dd, zRes0, zRes1 );
461 Cudd_RecursiveDerefZdd( dd, zRes0 );
462 Cudd_RecursiveDerefZdd( dd, zRes1 );
466 Cudd_RecursiveDerefZdd( dd, zRes0 );
467 Cudd_RecursiveDerefZdd( dd, zRes1 );
472 if ( Cudd_bddLeq( dd, bF0, bF1 ) )
474 else if ( Cudd_bddLeq( dd, bF1, bF0 ) )
479 zPlus = cuddZddGetNode( dd, 2*bFR->index + AddVar,
z1,
z0 );
482 Cudd_RecursiveDerefZdd( dd, zRes );
488 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
491 Cudd_RecursiveDerefZdd( dd, zTemp );
492 Cudd_RecursiveDerefZdd( dd, zPlus );
496 Cudd_RecursiveDerefZdd( dd, zTemp );
497 Cudd_RecursiveDerefZdd( dd, zPlus );
504 for ( bVarsNew = bVars; LevelF > dd->perm[bVarsNew->index]; bVarsNew = cuddT(bVarsNew) )
507 zPlus = cuddZddGetNode( dd, 2*bVarsNew->index+1,
z1,
z0 );
510 Cudd_RecursiveDerefZdd( dd, zRes );
516 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
519 Cudd_RecursiveDerefZdd( dd, zTemp );
520 Cudd_RecursiveDerefZdd( dd, zPlus );
524 Cudd_RecursiveDerefZdd( dd, zTemp );
525 Cudd_RecursiveDerefZdd( dd, zPlus );
529 zPlus = cuddZddGetNode( dd, 2*bVarsNew->index,
z1,
z0 );
532 Cudd_RecursiveDerefZdd( dd, zRes );
538 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
541 Cudd_RecursiveDerefZdd( dd, zTemp );
542 Cudd_RecursiveDerefZdd( dd, zPlus );
546 Cudd_RecursiveDerefZdd( dd, zTemp );
547 Cudd_RecursiveDerefZdd( dd, zPlus );
583 DdNode * zTemp, * zPlus;
593 zPlus = cuddZddGetNode( dd, 2*bVars->index+1,
z1,
z0 );
596 Cudd_RecursiveDerefZdd( dd, zRes );
602 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
605 Cudd_RecursiveDerefZdd( dd, zTemp );
606 Cudd_RecursiveDerefZdd( dd, zPlus );
610 Cudd_RecursiveDerefZdd( dd, zTemp );
611 Cudd_RecursiveDerefZdd( dd, zPlus );
615 zPlus = cuddZddGetNode( dd, 2*bVars->index,
z1,
z0 );
618 Cudd_RecursiveDerefZdd( dd, zRes );
624 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
627 Cudd_RecursiveDerefZdd( dd, zTemp );
628 Cudd_RecursiveDerefZdd( dd, zPlus );
632 Cudd_RecursiveDerefZdd( dd, zTemp );
633 Cudd_RecursiveDerefZdd( dd, zPlus );