159 DdNode * bCube, * bTemp;
160 DdNode * bSpace, * bFunc1, * bFunc2, * bSpaceShift;
165 pSupport =
ABC_ALLOC(
int, ddMax(dd->size,dd->sizeZ) );
168 for ( i = 0; i < dd->size; i++ )
173 if ( 2*nSupp > dd->size )
175 printf(
"Cannot derive linear space, because DD manager does not have enough variables.\n" );
183 pPermuteBack =
ABC_ALLOC(
int, dd->size );
184 pCompose =
ABC_ALLOC( DdNode *, dd->size );
185 for ( i = 0; i < dd->size; i++ )
189 pCompose[i] = dd->vars[i]; Cudd_Ref( pCompose[i] );
194 bCube =
b1; Cudd_Ref( bCube );
195 for ( lev = 0; lev < dd->size; lev++ )
196 if ( pSupport[ dd->invperm[lev] ] )
198 pPermute[ dd->invperm[lev] ] = dd->invperm[2*Counter];
200 pPermuteBack[ dd->invperm[2*Counter+1] ] = dd->invperm[lev];
203 Cudd_Deref( pCompose[ dd->invperm[2*Counter] ] );
204 pCompose[ dd->invperm[2*Counter] ] =
205 Cudd_bddXor( dd, dd->vars[ dd->invperm[2*Counter] ], dd->vars[ dd->invperm[2*Counter+1] ] );
206 Cudd_Ref( pCompose[ dd->invperm[2*Counter] ] );
208 bCube = Cudd_bddAnd( dd, bTemp = bCube, dd->vars[ dd->invperm[2*Counter] ] ); Cudd_Ref( bCube );
209 Cudd_RecursiveDeref( dd, bTemp );
215 bFunc1 = Cudd_bddPermute( dd, bFunc, pPermute ); Cudd_Ref( bFunc1 );
217 bFunc2 = Cudd_bddVectorCompose( dd, bFunc1, pCompose ); Cudd_Ref( bFunc2 );
220 bSpaceShift = Cudd_bddXorExistAbstract( dd, bFunc1, bFunc2, bCube ); Cudd_Ref( bSpaceShift );
221 bSpaceShift = Cudd_Not( bSpaceShift );
223 bSpace = Cudd_bddPermute( dd, bSpaceShift, pPermuteBack ); Cudd_Ref( bSpace );
224 Cudd_RecursiveDeref( dd, bFunc1 );
225 Cudd_RecursiveDeref( dd, bFunc2 );
226 Cudd_RecursiveDeref( dd, bSpaceShift );
227 Cudd_RecursiveDeref( dd, bCube );
229 for ( i = 0; i < dd->size; i++ )
230 Cudd_RecursiveDeref( dd, pCompose[i] );
236 Cudd_Deref( bSpace );
368 zRes = Cudd_zddUnion( dd, zEquPos, zEquNeg ); Cudd_Ref( zRes );
369 Cudd_RecursiveDerefZdd( dd, zEquPos );
370 Cudd_RecursiveDerefZdd( dd, zEquNeg );
503 DdNode * zExor, * zTemp;
506 pVarsNonCan =
ABC_ALLOC(
int, ddMax(dd->size,dd->sizeZ) );
511 memset( pzRes, 0,
sizeof(DdNode *) * dd->size );
514 zEquRem = zEquations; Cudd_Ref( zEquRem );
515 while ( zEquRem !=
z0 )
520 zEquRem = Cudd_zddDiff( dd, zTemp = zEquRem, zExor ); Cudd_Ref( zEquRem );
521 Cudd_RecursiveDerefZdd( dd, zTemp );
525 for ( zTemp = zExor; zTemp !=
z1; zTemp = cuddT(zTemp) )
527 if ( pVarsNonCan[zTemp->index/2] == 1 )
529 assert( iVarNonCan == -1 );
530 iVarNonCan = zTemp->index/2;
533 assert( iVarNonCan != -1 );
536 pzRes[ iVarNonCan ] = zExor;
538 Cudd_RecursiveDerefZdd( dd, zExor );
540 Cudd_RecursiveDerefZdd( dd, zEquRem );
567 bFR = Cudd_Regular( bF );
568 bGR = Cudd_Regular( bG );
569 if ( cuddIsConstant(bFR) )
576 if ( cuddIsConstant(bGR) )
581 if ( (
unsigned)(ABC_PTRUINT_T)bF > (
unsigned)(ABC_PTRUINT_T)bG )
591 DdNode * bTemp1, * bTemp2;
592 DdNode * bRes0, * bRes1;
596 LevelF = dd->perm[bFR->index];
597 LevelG = dd->perm[bGR->index];
598 if ( LevelF <= LevelG )
600 index = dd->invperm[LevelF];
603 bF0 = Cudd_Not( cuddE(bFR) );
604 bF1 = Cudd_Not( cuddT(bFR) );
614 index = dd->invperm[LevelG];
618 if ( LevelG <= LevelF )
622 bG0 = Cudd_Not( cuddE(bGR) );
623 bG1 = Cudd_Not( cuddT(bGR) );
635 if ( bTemp1 == NULL )
640 if ( bTemp2 == NULL )
642 Cudd_RecursiveDeref( dd, bTemp1 );
648 bRes0 = cuddBddAndRecur( dd, bTemp1, bTemp2 );
651 Cudd_RecursiveDeref( dd, bTemp1 );
652 Cudd_RecursiveDeref( dd, bTemp2 );
656 Cudd_RecursiveDeref( dd, bTemp1 );
657 Cudd_RecursiveDeref( dd, bTemp2 );
661 if ( bTemp1 == NULL )
663 Cudd_RecursiveDeref( dd, bRes0 );
669 if ( bTemp2 == NULL )
671 Cudd_RecursiveDeref( dd, bRes0 );
672 Cudd_RecursiveDeref( dd, bTemp1 );
677 bRes1 = cuddBddAndRecur( dd, bTemp1, bTemp2 );
680 Cudd_RecursiveDeref( dd, bRes0 );
681 Cudd_RecursiveDeref( dd, bTemp1 );
682 Cudd_RecursiveDeref( dd, bTemp2 );
686 Cudd_RecursiveDeref( dd, bTemp1 );
687 Cudd_RecursiveDeref( dd, bTemp2 );
692 if ( bRes0 == bRes1 )
695 else if ( Cudd_IsComplement(bRes1) )
697 bRes = cuddUniqueInter(dd, index, Cudd_Not(bRes1), Cudd_Not(bRes0));
700 Cudd_RecursiveDeref(dd,bRes0);
701 Cudd_RecursiveDeref(dd,bRes1);
704 bRes = Cudd_Not(bRes);
708 bRes = cuddUniqueInter( dd, index, bRes1, bRes0 );
711 Cudd_RecursiveDeref(dd,bRes0);
712 Cudd_RecursiveDeref(dd,bRes1);
740 DdNode * bRes, * bFR;
743 bFR = Cudd_Regular(bF);
744 if ( cuddIsConstant(bFR) )
752 DdNode * bPos0, * bPos1;
753 DdNode * bNeg0, * bNeg1;
754 DdNode * bRes0, * bRes1;
758 bF0 = Cudd_Not( cuddE(bFR) );
759 bF1 = Cudd_Not( cuddT(bFR) );
776 Cudd_RecursiveDeref( dd, bPos0 );
781 bRes0 = cuddBddAndRecur( dd, bPos0, bPos1 );
784 Cudd_RecursiveDeref( dd, bPos0 );
785 Cudd_RecursiveDeref( dd, bPos1 );
789 Cudd_RecursiveDeref( dd, bPos0 );
790 Cudd_RecursiveDeref( dd, bPos1 );
796 Cudd_RecursiveDeref( dd, bRes0 );
804 Cudd_RecursiveDeref( dd, bRes0 );
805 Cudd_RecursiveDeref( dd, bNeg0 );
810 bRes1 = cuddBddAndRecur( dd, bNeg0, bNeg1 );
813 Cudd_RecursiveDeref( dd, bRes0 );
814 Cudd_RecursiveDeref( dd, bNeg0 );
815 Cudd_RecursiveDeref( dd, bNeg1 );
819 Cudd_RecursiveDeref( dd, bNeg0 );
820 Cudd_RecursiveDeref( dd, bNeg1 );
824 if ( bRes0 == bRes1 )
827 else if ( Cudd_IsComplement(bRes1) )
829 bRes = cuddUniqueInter( dd, bFR->index, Cudd_Not(bRes1), Cudd_Not(bRes0) );
832 Cudd_RecursiveDeref(dd,bRes0);
833 Cudd_RecursiveDeref(dd,bRes1);
836 bRes = Cudd_Not(bRes);
840 bRes = cuddUniqueInter( dd, bFR->index, bRes1, bRes0 );
843 Cudd_RecursiveDeref(dd,bRes0);
844 Cudd_RecursiveDeref(dd,bRes1);
871 DdNode * bRes, * bFR;
874 bFR = Cudd_Regular(bF);
875 if ( cuddIsConstant(bFR) )
883 DdNode * bPos0, * bPos1;
884 DdNode * bNeg0, * bNeg1;
885 DdNode * bRes0, * bRes1;
889 bF0 = Cudd_Not( cuddE(bFR) );
890 bF1 = Cudd_Not( cuddT(bFR) );
907 Cudd_RecursiveDeref( dd, bPos0 );
912 bRes0 = cuddBddAndRecur( dd, bPos0, bPos1 );
915 Cudd_RecursiveDeref( dd, bPos0 );
916 Cudd_RecursiveDeref( dd, bPos1 );
920 Cudd_RecursiveDeref( dd, bPos0 );
921 Cudd_RecursiveDeref( dd, bPos1 );
927 Cudd_RecursiveDeref( dd, bRes0 );
935 Cudd_RecursiveDeref( dd, bRes0 );
936 Cudd_RecursiveDeref( dd, bNeg0 );
941 bRes1 = cuddBddAndRecur( dd, bNeg0, bNeg1 );
944 Cudd_RecursiveDeref( dd, bRes0 );
945 Cudd_RecursiveDeref( dd, bNeg0 );
946 Cudd_RecursiveDeref( dd, bNeg1 );
950 Cudd_RecursiveDeref( dd, bNeg0 );
951 Cudd_RecursiveDeref( dd, bNeg1 );
955 if ( bRes0 == bRes1 )
958 else if ( Cudd_IsComplement(bRes1) )
960 bRes = cuddUniqueInter( dd, bFR->index, Cudd_Not(bRes1), Cudd_Not(bRes0) );
963 Cudd_RecursiveDeref(dd,bRes0);
964 Cudd_RecursiveDeref(dd,bRes1);
967 bRes = Cudd_Not(bRes);
971 bRes = cuddUniqueInter( dd, bFR->index, bRes1, bRes0 );
974 Cudd_RecursiveDeref(dd,bRes0);
975 Cudd_RecursiveDeref(dd,bRes1);
1002 DdNode * bRes, * bFR;
1005 bFR = Cudd_Regular(bF);
1006 if ( cuddIsConstant(bFR) )
1013 DdNode * bF0, * bF1;
1014 DdNode * bRes, * bRes0;
1018 bF0 = Cudd_Not( cuddE(bFR) );
1019 bF1 = Cudd_Not( cuddT(bFR) );
1033 else if ( bF1 ==
b0 )
1042 if ( bRes0 == NULL )
1046 bRes = cuddUniqueInter( dd, bFR->index, bRes0,
b0 );
1049 Cudd_RecursiveDeref( dd,bRes0 );
1085 DdNode * bFR, * bF0, * bF1;
1086 DdNode * zPos0, * zPos1, * zNeg1;
1087 DdNode * zRes, * zRes0, * zRes1;
1089 bFR = Cudd_Regular(bF);
1092 bF0 = Cudd_Not( cuddE(bFR) );
1093 bF1 = Cudd_Not( cuddT(bFR) );
1104 if ( zRes1 == NULL )
1109 zRes = cuddZddGetNode( dd, 2*bFR->index,
z1, zRes1 );
1112 Cudd_RecursiveDerefZdd(dd, zRes1);
1117 else if ( bF1 ==
b0 )
1126 if ( zPos0 == NULL )
1131 if ( zPos1 == NULL )
1133 Cudd_RecursiveDerefZdd(dd, zPos0);
1139 if ( zNeg1 == NULL )
1141 Cudd_RecursiveDerefZdd(dd, zPos0);
1142 Cudd_RecursiveDerefZdd(dd, zPos1);
1148 zRes0 = cuddZddIntersect( dd, zPos0, zPos1 );
1149 if ( zRes0 == NULL )
1151 Cudd_RecursiveDerefZdd(dd, zNeg1);
1152 Cudd_RecursiveDerefZdd(dd, zPos0);
1153 Cudd_RecursiveDerefZdd(dd, zPos1);
1158 zRes1 = cuddZddIntersect( dd, zPos0, zNeg1 );
1159 if ( zRes1 == NULL )
1161 Cudd_RecursiveDerefZdd(dd, zRes0);
1162 Cudd_RecursiveDerefZdd(dd, zNeg1);
1163 Cudd_RecursiveDerefZdd(dd, zPos0);
1164 Cudd_RecursiveDerefZdd(dd, zPos1);
1168 Cudd_RecursiveDerefZdd(dd, zNeg1);
1169 Cudd_RecursiveDerefZdd(dd, zPos0);
1170 Cudd_RecursiveDerefZdd(dd, zPos1);
1173 zRes = cuddZddGetNode( dd, 2*bFR->index, zRes1, zRes0 );
1176 Cudd_RecursiveDerefZdd(dd, zRes0);
1177 Cudd_RecursiveDerefZdd(dd, zRes1);
1215 DdNode * bFR, * bF0, * bF1;
1216 DdNode * zPos0, * zPos1, * zNeg1;
1217 DdNode * zRes, * zRes0, * zRes1;
1219 bFR = Cudd_Regular(bF);
1222 bF0 = Cudd_Not( cuddE(bFR) );
1223 bF1 = Cudd_Not( cuddT(bFR) );
1237 else if ( bF1 ==
b0 )
1240 if ( zRes0 == NULL )
1245 zRes = cuddZddGetNode( dd, 2*bFR->index,
z1, zRes0 );
1248 Cudd_RecursiveDerefZdd(dd, zRes0);
1256 if ( zPos0 == NULL )
1261 if ( zPos1 == NULL )
1263 Cudd_RecursiveDerefZdd(dd, zPos0);
1269 if ( zNeg1 == NULL )
1271 Cudd_RecursiveDerefZdd(dd, zPos0);
1272 Cudd_RecursiveDerefZdd(dd, zPos1);
1278 zRes0 = cuddZddIntersect( dd, zPos0, zPos1 );
1279 if ( zRes0 == NULL )
1281 Cudd_RecursiveDerefZdd(dd, zNeg1);
1282 Cudd_RecursiveDerefZdd(dd, zPos0);
1283 Cudd_RecursiveDerefZdd(dd, zPos1);
1288 zRes1 = cuddZddIntersect( dd, zPos0, zNeg1 );
1289 if ( zRes1 == NULL )
1291 Cudd_RecursiveDerefZdd(dd, zRes0);
1292 Cudd_RecursiveDerefZdd(dd, zNeg1);
1293 Cudd_RecursiveDerefZdd(dd, zPos0);
1294 Cudd_RecursiveDerefZdd(dd, zPos1);
1298 Cudd_RecursiveDerefZdd(dd, zNeg1);
1299 Cudd_RecursiveDerefZdd(dd, zPos0);
1300 Cudd_RecursiveDerefZdd(dd, zPos1);
1303 zRes = cuddZddGetNode( dd, 2*bFR->index, zRes1, zRes0 );
1306 Cudd_RecursiveDerefZdd(dd, zRes0);
1307 Cudd_RecursiveDerefZdd(dd, zRes1);
1347 DdNode * bP0, * bP1;
1348 DdNode * bN0, * bN1;
1349 DdNode * bRes0, * bRes1;
1359 Cudd_RecursiveDeref( dd, bP0 );
1364 bRes0 = cuddBddAndRecur( dd, bP0, bP1 );
1365 if ( bRes0 == NULL )
1367 Cudd_RecursiveDeref( dd, bP0 );
1368 Cudd_RecursiveDeref( dd, bP1 );
1372 Cudd_RecursiveDeref( dd, bP0 );
1373 Cudd_RecursiveDeref( dd, bP1 );
1379 Cudd_RecursiveDeref( dd, bRes0 );
1387 Cudd_RecursiveDeref( dd, bRes0 );
1388 Cudd_RecursiveDeref( dd, bN0 );
1393 bRes1 = cuddBddAndRecur( dd, bN0, bN1 );
1394 if ( bRes1 == NULL )
1396 Cudd_RecursiveDeref( dd, bRes0 );
1397 Cudd_RecursiveDeref( dd, bN0 );
1398 Cudd_RecursiveDeref( dd, bN1 );
1402 Cudd_RecursiveDeref( dd, bN0 );
1403 Cudd_RecursiveDeref( dd, bN1 );
1407 if ( bRes0 == bRes1 )
1410 else if ( Cudd_IsComplement(bRes1) )
1412 bRes = cuddUniqueInter( dd, zA->index/2, Cudd_Not(bRes1), Cudd_Not(bRes0) );
1415 Cudd_RecursiveDeref(dd,bRes0);
1416 Cudd_RecursiveDeref(dd,bRes1);
1419 bRes = Cudd_Not(bRes);
1423 bRes = cuddUniqueInter( dd, zA->index/2, bRes1, bRes0 );
1426 Cudd_RecursiveDeref(dd,bRes0);
1427 Cudd_RecursiveDeref(dd,bRes1);
1465 DdNode * bP0, * bP1;
1466 DdNode * bN0, * bN1;
1467 DdNode * bRes0, * bRes1;
1477 Cudd_RecursiveDeref( dd, bP0 );
1482 bRes0 = cuddBddAndRecur( dd, bP0, bP1 );
1483 if ( bRes0 == NULL )
1485 Cudd_RecursiveDeref( dd, bP0 );
1486 Cudd_RecursiveDeref( dd, bP1 );
1490 Cudd_RecursiveDeref( dd, bP0 );
1491 Cudd_RecursiveDeref( dd, bP1 );
1497 Cudd_RecursiveDeref( dd, bRes0 );
1505 Cudd_RecursiveDeref( dd, bRes0 );
1506 Cudd_RecursiveDeref( dd, bN0 );
1511 bRes1 = cuddBddAndRecur( dd, bN0, bN1 );
1512 if ( bRes1 == NULL )
1514 Cudd_RecursiveDeref( dd, bRes0 );
1515 Cudd_RecursiveDeref( dd, bN0 );
1516 Cudd_RecursiveDeref( dd, bN1 );
1520 Cudd_RecursiveDeref( dd, bN0 );
1521 Cudd_RecursiveDeref( dd, bN1 );
1525 if ( bRes0 == bRes1 )
1528 else if ( Cudd_IsComplement(bRes1) )
1530 bRes = cuddUniqueInter( dd, zA->index/2, Cudd_Not(bRes1), Cudd_Not(bRes0) );
1533 Cudd_RecursiveDeref(dd,bRes0);
1534 Cudd_RecursiveDeref(dd,bRes1);
1537 bRes = Cudd_Not(bRes);
1541 bRes = cuddUniqueInter( dd, zA->index/2, bRes1, bRes0 );
1544 Cudd_RecursiveDeref(dd,bRes0);
1545 Cudd_RecursiveDeref(dd,bRes1);