295 DdNode * zSet, * zCube, * zTemp;
304 pMapVars2Nums =
ABC_ALLOC(
int, dd->size );
305 memset( pMapVars2Nums, 0, dd->size *
sizeof(
int) );
308 p->nVarsMax = dd->size;
311 for ( i = 0, bTemp = bSupp; bTemp !=
b1; bTemp = cuddT(bTemp), i++ )
313 p->pVars[i] = bTemp->index;
314 pMapVars2Nums[bTemp->index] = i;
318 zSet = zPairs; Cudd_Ref( zSet );
325 assert( cuddT( cuddT(zCube) ) ==
z1 );
326 iVar1 = zCube->index/2;
327 iVar2 = cuddT(zCube)->index/2;
328 if ( pMapVars2Nums[iVar1] < pMapVars2Nums[iVar2] )
329 p->pSymms[ pMapVars2Nums[iVar1] ][ pMapVars2Nums[iVar2] ] = 1;
331 p->pSymms[ pMapVars2Nums[iVar2] ][ pMapVars2Nums[iVar1] ] = 1;
336 zSet = Cudd_zddDiff( dd, zTemp = zSet, zCube ); Cudd_Ref( zSet );
337 Cudd_RecursiveDerefZdd( dd, zTemp );
338 Cudd_RecursiveDerefZdd( dd, zCube );
341 Cudd_RecursiveDerefZdd( dd, zSet );
449 DdNode * bCube1, * bCube2;
450 DdNode * bCof01, * bCof10;
454 assert( iVar1 < dd->size );
455 assert( iVar2 < dd->size );
457 bCube1 = Cudd_bddAnd( dd, Cudd_Not( dd->vars[iVar1] ), dd->vars[iVar2] ); Cudd_Ref( bCube1 );
458 bCube2 = Cudd_bddAnd( dd, Cudd_Not( dd->vars[iVar2] ), dd->vars[iVar1] ); Cudd_Ref( bCube2 );
460 bCof01 = Cudd_Cofactor( dd, bF, bCube1 ); Cudd_Ref( bCof01 );
461 bCof10 = Cudd_Cofactor( dd, bF, bCube2 ); Cudd_Ref( bCof10 );
463 Res = (int)( bCof10 == bCof01 );
465 Cudd_RecursiveDeref( dd, bCof01 );
466 Cudd_RecursiveDeref( dd, bCof10 );
467 Cudd_RecursiveDeref( dd, bCube1 );
468 Cudd_RecursiveDeref( dd, bCube2 );
586 DdNode * bFR = Cudd_Regular(bFunc);
588 if ( cuddIsConstant(bFR) )
602 for ( i = 0; i < nVars-2; i++ )
603 bVarsK = cuddT( bVarsK );
613 DdNode * zRes0, * zRes1;
614 DdNode * zTemp, * zPlus, * zSymmVars;
624 LevelF = dd->perm[bFR->index];
625 for ( bVarsNew = bVars; LevelF > dd->perm[bVarsNew->index]; bVarsNew = cuddT(bVarsNew) )
628 assert( bFR->index == bVarsNew->index );
633 bF0 = Cudd_Not( cuddE(bFR) );
634 bF1 = Cudd_Not( cuddT(bFR) );
657 Cudd_RecursiveDerefZdd( dd, zRes0 );
665 zRes = cuddZddIntersect( dd, zRes0, zRes1 );
668 Cudd_RecursiveDerefZdd( dd, zRes0 );
669 Cudd_RecursiveDerefZdd( dd, zRes1 );
673 Cudd_RecursiveDerefZdd( dd, zRes0 );
674 Cudd_RecursiveDerefZdd( dd, zRes1 );
681 if ( zSymmVars == NULL )
683 Cudd_RecursiveDerefZdd( dd, zRes );
686 cuddRef( zSymmVars );
692 if ( zSymmVars ==
z0 )
693 Cudd_RecursiveDerefZdd( dd, zSymmVars );
696 zPlus = cuddZddGetNode( dd, 2*bFR->index, zSymmVars,
z0 );
699 Cudd_RecursiveDerefZdd( dd, zRes );
700 Cudd_RecursiveDerefZdd( dd, zSymmVars );
704 cuddDeref( zSymmVars );
707 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
710 Cudd_RecursiveDerefZdd( dd, zTemp );
711 Cudd_RecursiveDerefZdd( dd, zPlus );
715 Cudd_RecursiveDerefZdd( dd, zTemp );
716 Cudd_RecursiveDerefZdd( dd, zPlus );
735 if ( bVarsExtra == NULL )
737 Cudd_RecursiveDerefZdd( dd, zRes );
740 cuddRef( bVarsExtra );
746 Cudd_RecursiveDeref( dd, bVarsExtra );
755 for ( i = 0; i < nVars-2; i++ )
756 bVarsK = cuddT( bVarsK );
762 Cudd_RecursiveDeref( dd, bVarsExtra );
763 Cudd_RecursiveDerefZdd( dd, zRes );
767 Cudd_RecursiveDeref( dd, bVarsExtra );
770 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
773 Cudd_RecursiveDerefZdd( dd, zTemp );
774 Cudd_RecursiveDerefZdd( dd, zPlus );
778 Cudd_RecursiveDerefZdd( dd, zTemp );
779 Cudd_RecursiveDerefZdd( dd, zPlus );
811 DdNode * bFR = Cudd_Regular(bF);
812 DdNode * bGR = Cudd_Regular(bG);
814 if ( cuddIsConstant(bFR) && cuddIsConstant(bGR) )
827 DdNode * zRes0, * zRes1;
828 DdNode * zPlus, * zTemp;
833 int LevelF = cuddI(dd,bFR->index);
834 int LevelG = cuddI(dd,bGR->index);
837 if ( LevelF < LevelG )
843 assert( LevelFG < dd->size );
847 for ( bVarsNew = bVars; LevelFG > dd->perm[bVarsNew->index]; bVarsNew = cuddT(bVarsNew) );
848 assert( LevelFG == dd->perm[bVarsNew->index] );
851 if ( LevelF == LevelFG )
855 bF0 = Cudd_Not( cuddE(bFR) );
856 bF1 = Cudd_Not( cuddT(bFR) );
867 if ( LevelG == LevelFG )
871 bG0 = Cudd_Not( cuddE(bGR) );
872 bG1 = Cudd_Not( cuddT(bGR) );
898 Cudd_RecursiveDerefZdd( dd, zRes0 );
905 zRes = cuddZddIntersect( dd, zRes0, zRes1 );
908 Cudd_RecursiveDerefZdd( dd, zRes0 );
909 Cudd_RecursiveDerefZdd( dd, zRes1 );
913 Cudd_RecursiveDerefZdd( dd, zRes0 );
914 Cudd_RecursiveDerefZdd( dd, zRes1 );
920 zPlus = cuddZddGetNode( dd, 2*bVarsNew->index,
z1,
z0 );
923 Cudd_RecursiveDerefZdd( dd, zRes );
929 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
932 Cudd_RecursiveDerefZdd( dd, zTemp );
933 Cudd_RecursiveDerefZdd( dd, zPlus );
937 Cudd_RecursiveDerefZdd( dd, zTemp );
938 Cudd_RecursiveDerefZdd( dd, zPlus );
941 if ( bF == bG && bVars != bVarsNew )
948 assert( LevelFG > dd->perm[bVars->index] );
951 bVarsExtra = cuddBddExistAbstractRecur( dd, bVars, bVarsNew );
952 if ( bVarsExtra == NULL )
954 Cudd_RecursiveDerefZdd( dd, zRes );
957 cuddRef( bVarsExtra );
962 Cudd_RecursiveDeref( dd, bVarsExtra );
963 Cudd_RecursiveDerefZdd( dd, zRes );
967 Cudd_RecursiveDeref( dd, bVarsExtra );
970 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
973 Cudd_RecursiveDerefZdd( dd, zTemp );
974 Cudd_RecursiveDerefZdd( dd, zPlus );
978 Cudd_RecursiveDerefZdd( dd, zTemp );
979 Cudd_RecursiveDerefZdd( dd, zPlus );
1015 DdNode * zTemp, * zPlus;
1023 zPlus = cuddZddGetNode( dd, 2*bVars->index,
z1,
z0 );
1024 if ( zPlus == NULL )
1026 Cudd_RecursiveDerefZdd( dd, zRes );
1032 zRes = cuddZddUnion( dd, zTemp = zRes, zPlus );
1035 Cudd_RecursiveDerefZdd( dd, zTemp );
1036 Cudd_RecursiveDerefZdd( dd, zPlus );
1040 Cudd_RecursiveDerefZdd( dd, zTemp );
1041 Cudd_RecursiveDerefZdd( dd, zPlus );
1068 DdNode * bFR = Cudd_Regular(bF);
1070 if ( cuddIsConstant(bFR) || bVars ==
b1 )
1077 DdNode * bF0, * bF1;
1078 DdNode * bVarsThis, * bVarsLower, * bTemp;
1082 LevelF = dd->perm[bFR->index];
1083 for ( bVarsThis = bVars; LevelF > cuddI(dd,bVarsThis->index); bVarsThis = cuddT(bVarsThis) );
1085 if ( LevelF == cuddI(dd,bVarsThis->index) )
1086 bVarsLower = cuddT(bVarsThis);
1088 bVarsLower = bVarsThis;
1093 bF0 = Cudd_Not( cuddE(bFR) );
1094 bF1 = Cudd_Not( cuddT(bFR) );
1111 Cudd_RecursiveDeref( dd, bTemp );
1115 Cudd_RecursiveDeref( dd, bTemp );
1119 if ( bVarsThis != bVars )
1121 DdNode * bVarsExtra;
1124 bVarsExtra = cuddBddExistAbstractRecur( dd, bVars, bVarsThis );
1125 if ( bVarsExtra == NULL )
1127 Cudd_RecursiveDeref( dd, bRes );
1130 cuddRef( bVarsExtra );
1133 bRes = cuddBddAndRecur( dd, bTemp = bRes, bVarsExtra );
1136 Cudd_RecursiveDeref( dd, bTemp );
1137 Cudd_RecursiveDeref( dd, bVarsExtra );
1141 Cudd_RecursiveDeref( dd, bTemp );
1142 Cudd_RecursiveDeref( dd, bVarsExtra );
1185 DdNode * bRes0, * bRes1;
1186 DdNode * bF0, * bF1;
1187 DdNode * bFR = Cudd_Regular(bF);
1188 int LevelF = cuddI(dd,bFR->index);
1190 DdNode * bVarsR = Cudd_Regular(bVars);
1195 if ( bVarsR != bVars )
1200 iLev2 = dd->perm[bVarsR->index];
1205 if ( cuddT(bVars) ==
b1 )
1208 iLev2 = dd->perm[bVars->index];
1212 assert( cuddT(cuddT(bVars)) ==
b1 );
1213 iLev1 = dd->perm[bVars->index];
1214 iLev2 = dd->perm[cuddT(bVars)->index];
1220 if ( LevelF < iLev2 )
1224 bF0 = Cudd_Not( cuddE(bFR) );
1225 bF1 = Cudd_Not( cuddT(bFR) );
1244 if ( LevelF < iLev1 )
1260 else if ( LevelF == iLev1 )
1273 if ( bRes0 ==
z0 || bRes1 ==
z0 )
1281 else if ( LevelF < iLev2 )
1295 if ( bRes0 ==
z0 || bRes1 ==
z0 )
1303 else if ( LevelF == iLev2 )
1346 DdNode *zRes, *zRes0, *zRes1;
1355 if ( cuddI( dd, bVarsK->index ) < cuddI( dd, bVarsN->index ) )
1368 if ( zRes0 == NULL )
1382 if ( zRes1 == NULL )
1384 Cudd_RecursiveDerefZdd( dd, zRes0 );
1391 zRes = cuddZddGetNode( dd, 2*bVarsN->index, zRes1, zRes0 );
1394 Cudd_RecursiveDerefZdd( dd, zRes0 );
1395 Cudd_RecursiveDerefZdd( dd, zRes1 );