54static DdNode * extraTransferPermuteRecur( DdManager * ddS, DdManager * ddD, DdNode * f,
st__table * table,
int * Permute );
55static DdNode * extraTransferPermute( DdManager * ddS, DdManager * ddD, DdNode * f,
int * Permute );
56static DdNode * cuddBddPermuteRecur
ARGS( ( DdManager * manager, DdHashTable * table, DdNode * node,
int *permut ) );
58static DdNode * extraBddAndPermute( DdHashTable * table, DdManager * ddF, DdNode * bF, DdManager * ddG, DdNode * bG,
int * pPermute );
64static DdNode* extraZddPrimes( DdManager *dd, DdNode* F );
92 ddDestination->reordered = 0;
93 bRes = extraTransferPermute( ddSource, ddDestination, f, Permute );
95 while ( ddDestination->reordered == 1 );
118 nMin = ddMin(ddSource->size, ddDestination->size);
119 nMax = ddMax(ddSource->size, ddDestination->size);
122 for ( i = 0; i < nMin; i++ )
123 pPermute[ ddSource->invperm[i] ] = ddDestination->invperm[i];
124 if ( ddSource->size > ddDestination->size )
126 for ( ; i < nMax; i++ )
127 pPermute[ ddSource->invperm[i] ] = -1;
150 DdNode * bSupp, * bTemp, * bRes;
156 bSupp = Cudd_Support( dd, bF ); Cudd_Ref( bSupp );
161 for ( bTemp = bSupp; bTemp != dd->one; bTemp = cuddT(bTemp) )
162 pPermute[bTemp->index] = dd->invperm[Counter++];
165 bRes = Cudd_bddPermute( dd, bF, pPermute ); Cudd_Ref( bRes );
168 Cudd_RecursiveDeref( dd, bSupp );
196 if ( Cudd_IsConstant(bF) )
198 assert( nVars <= dd->size );
200 bVars = dd->vars[nVars];
202 bVars = Cudd_Not(dd->vars[-nVars]);
207 }
while (dd->reordered == 1);
227 RetValue = Cudd_CheckZeroRef( dd );
230 printf(
"\nThe number of referenced nodes = %d\n\n", RetValue );
250 CUDD_VALUE_TYPE Value;
251 int nVars = dd->size;
262 printf(
"Constant 0");
267 printf(
"Constant 1");
271 Cudd_ForeachCube( dd, F, Gen,
Cube, Value )
279 for ( i = 0; i < nVars; i++ )
281 printf(
"[%d]'", i );
283 else if (
Cube[i] == 1 )
305 bSupp = Cudd_Support( dd, F ); Cudd_Ref( bSupp );
307 Cudd_RecursiveDeref( dd, bSupp );
324 while ( bSupp !=
b1 )
326 assert( !Cudd_IsComplement(bSupp) );
329 bSupp = cuddT(bSupp);
348 for( ; bS !=
b1; bS = cuddT(bS) )
349 if ( bS->index == bVar->index )
367 while ( S1->index != CUDD_CONST_INDEX && S2->index != CUDD_CONST_INDEX )
370 if ( S1->index == S2->index )
373 if ( dd->perm[S1->index] < dd->perm[S2->index] )
396 while ( S1->index != CUDD_CONST_INDEX && S2->index != CUDD_CONST_INDEX )
399 if ( S1->index == S2->index )
408 if ( Result >= DiffMax )
412 if ( dd->perm[S1->index] < dd->perm[S2->index] )
419 if ( S1->index != CUDD_CONST_INDEX )
421 else if ( S2->index != CUDD_CONST_INDEX )
424 if ( Result >= DiffMax )
454 while ( bSL !=
b1 || bSH !=
b1 )
459 if ( fHcontainsL == 0 )
468 if ( fLcontainsH == 0 )
475 if ( dd->perm[bSL->index] < dd->perm[bSH->index] )
480 if ( TopVar == bSL->index && TopVar == bSH->index )
487 else if ( TopVar == bSL->index )
502 if ( !fHcontainsL && !fLcontainsH )
506 assert( !fHcontainsL || !fLcontainsH );
545 size = ddMax(dd->size, dd->sizeZ);
546 for (i = 0; i < size; i++)
581 size = ddMax( dd->size, dd->sizeZ );
582 for ( i = 0; i < size; i++ )
586 for ( i = 0; i < n; i++ )
588 for ( i = 0; i < n; i++ )
608 DdNode * bCube, * bTemp;
613 Cudd_bddPickOneCube( dd, bF, s_Temp );
616 bCube =
b1; Cudd_Ref( bCube );
617 for ( v = 0; v < dd->size; v++ )
618 if ( s_Temp[v] == 0 )
621 bCube = Cudd_bddAnd( dd, bTemp = bCube, Cudd_Not(dd->vars[v]) ); Cudd_Ref( bCube );
622 Cudd_RecursiveDeref( dd, bTemp );
624 else if ( s_Temp[v] == 1 )
627 bCube = Cudd_bddAnd( dd, bTemp = bCube, dd->vars[v] ); Cudd_Ref( bCube );
628 Cudd_RecursiveDeref( dd, bTemp );
647 DdNode * bFuncR, * bFunc0, * bFunc1;
648 DdNode * bRes0, * bRes1, * bRes;
650 bFuncR = Cudd_Regular(bFunc);
651 if ( cuddIsConstant(bFuncR) )
655 if ( Cudd_IsComplement(bFunc) )
657 bFunc0 = Cudd_Not( cuddE(bFuncR) );
658 bFunc1 = Cudd_Not( cuddT(bFuncR) );
662 bFunc0 = cuddE(bFuncR);
663 bFunc1 = cuddT(bFuncR);
671 bRes = Cudd_bddAnd( dd, bRes0, Cudd_Not(dd->vars[bFuncR->index]) ); Cudd_Ref( bRes );
672 Cudd_RecursiveDeref( dd, bRes0 );
676 Cudd_RecursiveDeref( dd, bRes0 );
680 bRes = Cudd_bddAnd( dd, bRes1, dd->vars[bFuncR->index] ); Cudd_Ref( bRes );
681 Cudd_RecursiveDeref( dd, bRes1 );
701 DdNode * bTemp, * bProd;
703 assert( iStart <= iStop );
704 assert( iStart >= 0 && iStart <= dd->size );
705 assert( iStop >= 0 && iStop <= dd->size );
706 bProd =
b1; Cudd_Ref( bProd );
707 for ( i = iStart; i < iStop; i++ )
709 bProd = Cudd_bddAnd( dd, bTemp = bProd, dd->vars[i] ); Cudd_Ref( bProd );
710 Cudd_RecursiveDeref( dd, bTemp );
733 DdNode * bTemp, * bVar, * bVarBdd, * bResult;
735 bResult =
b1; Cudd_Ref( bResult );
736 for ( z = 0; z < CodeWidth; z++ )
738 bVarBdd = (pbVars)? pbVars[z]: dd->vars[z];
740 bVar = Cudd_NotCond( bVarBdd, (
Code & (1 << (CodeWidth-1-z)))==0 );
742 bVar = Cudd_NotCond( bVarBdd, (
Code & (1 << (z)))==0 );
743 bResult = Cudd_bddAnd( dd, bTemp = bResult, bVar ); Cudd_Ref( bResult );
744 Cudd_RecursiveDeref( dd, bTemp );
746 Cudd_Deref( bResult );
767 DdNode *res, *tmp, *var;
772 size = ddMax( dd->size, dd->sizeZ );
774 if ( support == NULL )
776 dd->errorCode = CUDD_MEMORY_OUT;
779 for ( i = 0; i < size; i++ )
794 for ( j = size - 1; j >= 0; j-- )
796 i = ( j >= dd->size ) ? j : dd->invperm[j];
797 if ( support[i] == 1 )
799 var = cuddUniqueInter( dd, i, dd->one, Cudd_Not( dd->one ) );
804 tmp = cuddBddAndRecur( dd, res, var );
807 Cudd_RecursiveDeref( dd, res );
808 Cudd_RecursiveDeref( dd, var );
813 Cudd_RecursiveDeref( dd, res );
814 Cudd_RecursiveDeref( dd, var );
819 while ( dd->reordered == 1 );
841 bFunc = Cudd_Regular( bFunc );
842 if ( cuddIsConstant(bFunc) )
844 return cuddIsConstant( cuddT(bFunc) ) && cuddIsConstant( Cudd_Regular(cuddE(bFunc)) );
860 DdNode * bFunc, * bTemp;
862 bFunc = Cudd_ReadOne(dd); Cudd_Ref( bFunc );
863 for ( i = 0; i < nVars; i++ )
865 bFunc = Cudd_bddAnd( dd, bTemp = bFunc, Cudd_bddIthVar(dd,i) ); Cudd_Ref( bFunc );
866 Cudd_RecursiveDeref( dd, bTemp );
885 DdNode * bFunc, * bTemp;
887 bFunc = Cudd_ReadLogicZero(dd); Cudd_Ref( bFunc );
888 for ( i = 0; i < nVars; i++ )
890 bFunc = Cudd_bddOr( dd, bTemp = bFunc, Cudd_bddIthVar(dd,i) ); Cudd_Ref( bFunc );
891 Cudd_RecursiveDeref( dd, bTemp );
910 DdNode * bFunc, * bTemp;
912 bFunc = Cudd_ReadLogicZero(dd); Cudd_Ref( bFunc );
913 for ( i = 0; i < nVars; i++ )
915 bFunc = Cudd_bddXor( dd, bTemp = bFunc, Cudd_bddIthVar(dd,i) ); Cudd_Ref( bFunc );
916 Cudd_RecursiveDeref( dd, bTemp );
938 res = extraZddPrimes(dd, F);
939 if ( dd->reordered == 1 )
940 printf(
"\nReordering in Extra_zddPrimes()\n");
941 }
while (dd->reordered == 1);
967 manager->reordered = 0;
968 table = cuddHashTableInit( manager, 1, 2 );
971 for ( i = 0; i < nNodes; i++ )
973 bNodesOut[i] = cuddBddPermuteRecur( manager, table, bNodesIn[i], permut );
974 if ( bNodesOut[i] == NULL )
977 for ( k = 0; k < i; k++ )
978 Cudd_RecursiveDeref( manager, bNodesOut[k] );
981 cuddRef( bNodesOut[i] );
984 cuddHashTableQuit( table );
986 while ( manager->reordered == 1 );
1007 bRes =
b1; Cudd_Ref( bRes );
1008 for ( i = 0; i < nVars; i++ )
1010 bRes = Cudd_bddAnd( dd, bTemp = bRes, bXVars[i] ); Cudd_Ref( bRes );
1011 Cudd_RecursiveDeref( dd, bTemp );
1038 }
while (dd->reordered == 1);
1058 DdNode * bCube0, * bCube1;
1059 while ( Cudd_Regular(bCube)->index != CUDD_CONST_INDEX )
1061 bCube0 = Cudd_NotCond( cuddE(Cudd_Regular(bCube)), Cudd_IsComplement(bCube) );
1062 bCube1 = Cudd_NotCond( cuddT(Cudd_Regular(bCube)), Cudd_IsComplement(bCube) );
1064 assert( (Cudd_IsComplement(bCube0) && Cudd_Regular(bCube0)->index == CUDD_CONST_INDEX) ||
1065 (Cudd_IsComplement(bCube1) && Cudd_Regular(bCube1)->index == CUDD_CONST_INDEX) );
1067 if ( Cudd_Regular(bCube)->index == iVar )
1068 return (
int)(Cudd_IsComplement(bCube0) && Cudd_Regular(bCube0)->index == CUDD_CONST_INDEX);
1070 if ( (Cudd_IsComplement(bCube0) && Cudd_Regular(bCube0)->index == CUDD_CONST_INDEX) )
1092 DdHashTable * table;
1097 table = cuddHashTableInit( ddF, 2, 256 );
1098 if (table == NULL)
return NULL;
1099 bRes = extraBddAndPermute( table, ddF, bF, ddG, bG, pPermute );
1100 if ( bRes ) cuddRef( bRes );
1101 cuddHashTableQuit( table );
1102 if ( bRes ) cuddDeref( bRes );
1106 while ( ddF->reordered == 1 );
1135 if ( Cudd_IsConstant(bF) )
1138 if ( (bRes = cuddCacheLookup2(dd,
extraBddMove, bF, bDist)) )
1142 DdNode * bRes0, * bRes1;
1143 DdNode * bF0, * bF1;
1144 DdNode * bFR = Cudd_Regular(bF);
1147 if ( Cudd_IsComplement(bDist) )
1148 VarNew = bFR->index - Cudd_Not(bDist)->index;
1150 VarNew = bFR->index + bDist->index;
1151 assert( VarNew < dd->size );
1156 bF0 = Cudd_Not( cuddE(bFR) );
1157 bF1 = Cudd_Not( cuddT(bFR) );
1166 if ( bRes0 == NULL )
1171 if ( bRes1 == NULL )
1173 Cudd_RecursiveDeref( dd, bRes0 );
1179 bRes = cuddBddIteRecur( dd, dd->vars[VarNew], bRes1, bRes0 );
1182 Cudd_RecursiveDeref( dd, bRes0 );
1183 Cudd_RecursiveDeref( dd, bRes1 );
1187 Cudd_RecursiveDeref( dd, bRes0 );
1188 Cudd_RecursiveDeref( dd, bRes1 );
1224 if ( (zC->index & 1) == 0 )
1227 DdNode *Temp = cuddE( zC );
1229 if ( cuddIZ(dd,Temp->index) == cuddIZ(dd,zC->index) + 1 )
1232 *zC2 = cuddE( Temp );
1233 *zC0 = cuddT( Temp );
1262static DdNode * extraBddCountCubes( DdManager * dd, DdNode * L, DdNode * U,
st__table *table,
int * pnCubes,
int Limit )
1264 DdNode *one = DD_ONE(dd);
1265 DdNode *zero = Cudd_Not(one);
1266 int v, top_l, top_u;
1267 DdNode *Lsub0, *Usub0, *Lsub1, *Usub1, *Ld, *Ud;
1268 DdNode *Lsuper0, *Usuper0, *Lsuper1, *Usuper1;
1269 DdNode *Isub0, *Isub1, *Id;
1271 DdNode *term0, *term1, *sum;
1272 DdNode *Lv, *Uv, *Lnv, *Unv;
1275 int Count0 = 0, Count1 = 0, Count2 = 0;
1290 r = cuddCacheLookup2(dd, cuddBddIsop, L, U);
1300 top_l = dd->perm[Cudd_Regular(L)->index];
1301 top_u = dd->perm[Cudd_Regular(U)->index];
1302 v = ddMin(top_l, top_u);
1306 index = Cudd_Regular(L)->index;
1309 if (Cudd_IsComplement(L)) {
1311 Lnv = Cudd_Not(Lnv);
1315 index = Cudd_Regular(U)->index;
1322 if (Cudd_IsComplement(U)) {
1324 Unv = Cudd_Not(Unv);
1331 Lsub0 = cuddBddAndRecur(dd, Lnv, Cudd_Not(Uv));
1336 Lsub1 = cuddBddAndRecur(dd, Lv, Cudd_Not(Unv));
1337 if (Lsub1 == NULL) {
1338 Cudd_RecursiveDeref(dd, Lsub0);
1344 Isub0 = extraBddCountCubes(dd, Lsub0, Usub0, table, &Count0, Limit);
1345 if (Isub0 == NULL) {
1346 Cudd_RecursiveDeref(dd, Lsub0);
1347 Cudd_RecursiveDeref(dd, Lsub1);
1351 Isub1 = extraBddCountCubes(dd, Lsub1, Usub1, table, &Count1, Limit);
1352 if (Isub1 == NULL) {
1353 Cudd_RecursiveDeref(dd, Lsub0);
1354 Cudd_RecursiveDeref(dd, Lsub1);
1355 Cudd_RecursiveDeref(dd, Isub0);
1359 Cudd_RecursiveDeref(dd, Lsub0);
1360 Cudd_RecursiveDeref(dd, Lsub1);
1362 Lsuper0 = cuddBddAndRecur(dd, Lnv, Cudd_Not(Isub0));
1363 if (Lsuper0 == NULL) {
1364 Cudd_RecursiveDeref(dd, Isub0);
1365 Cudd_RecursiveDeref(dd, Isub1);
1369 Lsuper1 = cuddBddAndRecur(dd, Lv, Cudd_Not(Isub1));
1370 if (Lsuper1 == NULL) {
1371 Cudd_RecursiveDeref(dd, Isub0);
1372 Cudd_RecursiveDeref(dd, Isub1);
1373 Cudd_RecursiveDeref(dd, Lsuper0);
1381 Ld = cuddBddAndRecur(dd, Cudd_Not(Lsuper0), Cudd_Not(Lsuper1));
1382 Ld = Cudd_NotCond(Ld, Ld != NULL);
1384 Cudd_RecursiveDeref(dd, Isub0);
1385 Cudd_RecursiveDeref(dd, Isub1);
1386 Cudd_RecursiveDeref(dd, Lsuper0);
1387 Cudd_RecursiveDeref(dd, Lsuper1);
1391 Ud = cuddBddAndRecur(dd, Usuper0, Usuper1);
1393 Cudd_RecursiveDeref(dd, Isub0);
1394 Cudd_RecursiveDeref(dd, Isub1);
1395 Cudd_RecursiveDeref(dd, Lsuper0);
1396 Cudd_RecursiveDeref(dd, Lsuper1);
1397 Cudd_RecursiveDeref(dd, Ld);
1401 Cudd_RecursiveDeref(dd, Lsuper0);
1402 Cudd_RecursiveDeref(dd, Lsuper1);
1404 Id = extraBddCountCubes(dd, Ld, Ud, table, &Count2, Limit);
1406 Cudd_RecursiveDeref(dd, Isub0);
1407 Cudd_RecursiveDeref(dd, Isub1);
1408 Cudd_RecursiveDeref(dd, Ld);
1409 Cudd_RecursiveDeref(dd, Ud);
1413 Cudd_RecursiveDeref(dd, Ld);
1414 Cudd_RecursiveDeref(dd, Ud);
1416 x = cuddUniqueInter(dd, index, one, zero);
1418 Cudd_RecursiveDeref(dd, Isub0);
1419 Cudd_RecursiveDeref(dd, Isub1);
1420 Cudd_RecursiveDeref(dd, Id);
1424 term0 = cuddBddAndRecur(dd, Cudd_Not(x), Isub0);
1425 if (term0 == NULL) {
1426 Cudd_RecursiveDeref(dd, Isub0);
1427 Cudd_RecursiveDeref(dd, Isub1);
1428 Cudd_RecursiveDeref(dd, Id);
1429 Cudd_RecursiveDeref(dd, x);
1433 Cudd_RecursiveDeref(dd, Isub0);
1434 term1 = cuddBddAndRecur(dd, x, Isub1);
1435 if (term1 == NULL) {
1436 Cudd_RecursiveDeref(dd, Isub1);
1437 Cudd_RecursiveDeref(dd, Id);
1438 Cudd_RecursiveDeref(dd, x);
1439 Cudd_RecursiveDeref(dd, term0);
1443 Cudd_RecursiveDeref(dd, x);
1444 Cudd_RecursiveDeref(dd, Isub1);
1446 sum = cuddBddAndRecur(dd, Cudd_Not(term0), Cudd_Not(term1));
1447 sum = Cudd_NotCond(sum, sum != NULL);
1449 Cudd_RecursiveDeref(dd, Id);
1450 Cudd_RecursiveDeref(dd, term0);
1451 Cudd_RecursiveDeref(dd, term1);
1455 Cudd_RecursiveDeref(dd, term0);
1456 Cudd_RecursiveDeref(dd, term1);
1458 r = cuddBddAndRecur(dd, Cudd_Not(sum), Cudd_Not(Id));
1459 r = Cudd_NotCond(r, r != NULL);
1461 Cudd_RecursiveDeref(dd, Id);
1462 Cudd_RecursiveDeref(dd, sum);
1466 Cudd_RecursiveDeref(dd, sum);
1467 Cudd_RecursiveDeref(dd, Id);
1469 cuddCacheInsert2(dd, cuddBddIsop, L, U, r);
1470 *pnCubes = Count0 + Count1 + Count2;
1473 Cudd_RecursiveDeref( dd, r );
1476 if ( *pnCubes > Limit )
1478 Cudd_RecursiveDeref( dd, r );
1487 DdNode * pF0, * pF1;
1488 int i, Count, Count0, Count1, CounterAll = 0;
1490 unsigned int saveLimit = dd->maxLive;
1491 dd->maxLive = dd->keys - dd->dead + 1000000;
1492 for ( i = 0; i < nFuncs; i++ )
1497 Count0 = Count1 = nLimit;
1498 if ( fMode == -1 || fMode == 1 )
1499 pF1 = extraBddCountCubes( dd, pFuncs[i], pFuncs[i], table, &Count1, nLimit );
1500 pFuncs[i] = Cudd_Not( pFuncs[i] );
1501 if ( fMode == -1 || fMode == 0 )
1502 pF0 = extraBddCountCubes( dd, pFuncs[i], pFuncs[i], table, &Count0, Count1 );
1503 pFuncs[i] = Cudd_Not( pFuncs[i] );
1506 if ( !pF0 ) pGuide[i] = 1, Count = Count1;
1507 else if ( !pF1 ) pGuide[i] = 0, Count = Count0;
1508 else if ( Count1 <= Count0 ) pGuide[i] = 1, Count = Count1;
1509 else pGuide[i] = 0, Count = Count0;
1510 CounterAll += Count;
1513 dd->maxLive = saveLimit;
1515 return i == nFuncs ? CounterAll : -1;
1535DdNode * extraTransferPermute( DdManager * ddS, DdManager * ddD, DdNode * f,
int * Permute )
1543 if ( table == NULL )
1545 res = extraTransferPermuteRecur( ddS, ddD, f, table, Permute );
1557 Cudd_RecursiveDeref( ddD,
value );
1569 if ( table != NULL )
1591extraTransferPermuteRecur(
1598 DdNode *ft, *fe, *t, *e, *
var, *res;
1604 one = DD_ONE( ddD );
1605 comple = Cudd_IsComplement( f );
1608 if ( Cudd_IsConstant( f ) )
1609 return ( Cudd_NotCond( one, comple ) );
1613 f = Cudd_NotCond( f, comple );
1617 if (
st__lookup( table, (
char * ) f, (
char ** ) &res ) )
1618 return ( Cudd_NotCond( res, comple ) );
1620 if ( ddS->TimeStop && Abc_Clock() > ddS->TimeStop )
1622 if ( ddD->TimeStop && Abc_Clock() > ddD->TimeStop )
1627 index = Permute[f->index];
1634 t = extraTransferPermuteRecur( ddS, ddD, ft, table, Permute );
1641 e = extraTransferPermuteRecur( ddS, ddD, fe, table, Permute );
1644 Cudd_RecursiveDeref( ddD, t );
1649 zero = Cudd_Not(ddD->one);
1650 var = cuddUniqueInter( ddD, index, one, zero );
1653 Cudd_RecursiveDeref( ddD, t );
1654 Cudd_RecursiveDeref( ddD, e );
1657 res = cuddBddIteRecur( ddD, var, t, e );
1661 Cudd_RecursiveDeref( ddD, t );
1662 Cudd_RecursiveDeref( ddD, e );
1666 Cudd_RecursiveDeref( ddD, t );
1667 Cudd_RecursiveDeref( ddD, e );
1672 Cudd_RecursiveDeref( ddD, res );
1675 return ( Cudd_NotCond( res, comple ) );
1697 if (cuddIsConstant(f) || Cudd_IsComplement(f->next)) {
1701 support[f->index] = 1;
1705 f->next = Cudd_Not(f->next);
1727 if (!Cudd_IsComplement(f->next)) {
1731 f->next = Cudd_Regular(f->next);
1732 if (cuddIsConstant(f)) {
1761 DdNode * zRes, * zTemp;
1763 zTemp = cuddZddGetNode( dd, 2*TopVar + 1, zC0, zC2 );
1764 if ( zTemp == NULL )
1766 Cudd_RecursiveDerefZdd(dd, zC0);
1767 Cudd_RecursiveDerefZdd(dd, zC1);
1768 Cudd_RecursiveDerefZdd(dd, zC2);
1776 zRes = cuddZddGetNode( dd, 2*TopVar, zC1, zTemp );
1779 Cudd_RecursiveDerefZdd(dd, zC1);
1780 Cudd_RecursiveDerefZdd(dd, zTemp);
1799DdNode* extraZddPrimes( DdManager *dd, DdNode* F )
1803 if ( F == Cudd_Not( dd->one ) )
1809 zRes = cuddCacheLookup1Zdd(dd, extraZddPrimes, F);
1814 DdNode *bF01, *zP0, *zP1;
1816 DdNode *zResE, *zResP, *zResN;
1817 int fIsComp = Cudd_IsComplement( F );
1820 DdNode * bF0 = Cudd_NotCond( Cudd_E( F ), fIsComp );
1821 DdNode * bF1 = Cudd_NotCond( Cudd_T( F ), fIsComp );
1824 bF01 = cuddBddAndRecur( dd, bF0, bF1 );
1825 if ( bF01 == NULL )
return NULL;
1829 zP0 = extraZddPrimes( dd, bF0 );
1832 Cudd_RecursiveDeref( dd, bF01 );
1837 zP1 = extraZddPrimes( dd, bF1 );
1840 Cudd_RecursiveDeref( dd, bF01 );
1841 Cudd_RecursiveDerefZdd( dd, zP0 );
1857 zResP = cuddZddDiff( dd, zP1, zP0 );
1858 if ( zResP == NULL )
1860 Cudd_RecursiveDerefZdd( dd, zResE );
1861 Cudd_RecursiveDerefZdd( dd, zResN );
1862 Cudd_RecursiveDerefZdd( dd, zP1 );
1866 Cudd_RecursiveDerefZdd( dd, zP1 );
1868 else if ( bF01 == bF1 )
1878 zResN = cuddZddDiff( dd, zP0, zP1 );
1879 if ( zResN == NULL )
1881 Cudd_RecursiveDerefZdd( dd, zResE );
1882 Cudd_RecursiveDerefZdd( dd, zResP );
1883 Cudd_RecursiveDerefZdd( dd, zP0 );
1887 Cudd_RecursiveDerefZdd( dd, zP0 );
1892 zResE = extraZddPrimes( dd, bF01 );
1893 if ( zResE == NULL )
1895 Cudd_RecursiveDerefZdd( dd, bF01 );
1896 Cudd_RecursiveDerefZdd( dd, zP0 );
1897 Cudd_RecursiveDerefZdd( dd, zP1 );
1901 Cudd_RecursiveDeref( dd, bF01 );
1904 zResN = cuddZddDiff( dd, zP0, zResE );
1905 if ( zResN == NULL )
1907 Cudd_RecursiveDerefZdd( dd, zResE );
1908 Cudd_RecursiveDerefZdd( dd, zP0 );
1909 Cudd_RecursiveDerefZdd( dd, zP1 );
1913 Cudd_RecursiveDerefZdd( dd, zP0 );
1916 zResP = cuddZddDiff( dd, zP1, zResE );
1917 if ( zResP == NULL )
1919 Cudd_RecursiveDerefZdd( dd, zResE );
1920 Cudd_RecursiveDerefZdd( dd, zResN );
1921 Cudd_RecursiveDerefZdd( dd, zP1 );
1925 Cudd_RecursiveDerefZdd( dd, zP1 );
1929 if ( zRes == NULL )
return NULL;
1932 cuddCacheInsert1(dd, extraZddPrimes, F, zRes);
1958cuddBddPermuteRecur( DdManager * manager ,
1959 DdHashTable * table ,
1967 statLine( manager );
1968 N = Cudd_Regular( node );
1971 if ( cuddIsConstant( N ) )
1977 if ( N->ref != 1 && ( res = cuddHashTableLookup1( table, N ) ) != NULL )
1979 return ( Cudd_NotCond( res, N != node ) );
1983 T = cuddBddPermuteRecur( manager, table, cuddT( N ), permut );
1987 E = cuddBddPermuteRecur( manager, table, cuddE( N ), permut );
1990 Cudd_IterDerefBdd( manager, T );
1999 index = permut[N->index];
2000 res = cuddBddIteRecur( manager, manager->vars[index], T, E );
2003 Cudd_IterDerefBdd( manager, T );
2004 Cudd_IterDerefBdd( manager, E );
2008 Cudd_IterDerefBdd( manager, T );
2009 Cudd_IterDerefBdd( manager, E );
2016 ptrint fanout = ( ptrint ) N->ref;
2017 cuddSatDec( fanout );
2018 if ( !cuddHashTableInsert1( table, N, res, fanout ) )
2020 Cudd_IterDerefBdd( manager, res );
2025 return ( Cudd_NotCond( res, N != node ) );
2050 if ( Cudd_IsConstant(bFunc) )
2057 DdNode * bFR = Cudd_Regular(bFunc);
2058 int LevelF = dd->perm[bFR->index];
2059 int LevelV = dd->perm[bVars->index];
2061 if ( LevelV < LevelF )
2065 DdNode * bRes0, * bRes1;
2066 DdNode * bF0, * bF1;
2072 bF0 = Cudd_Not( cuddE(bFR) );
2073 bF1 = Cudd_Not( cuddT(bFR) );
2081 if ( LevelF == LevelV )
2082 bVarsNext = cuddT(bVars);
2087 if ( bRes0 == NULL )
2092 if ( bRes1 == NULL )
2094 Cudd_RecursiveDeref( dd, bRes0 );
2099 if ( LevelF == LevelV )
2110 if ( bRes0 == bRes1 )
2113 else if ( Cudd_IsComplement(bRes1) )
2115 bRes = cuddUniqueInter(dd, bFR->index, Cudd_Not(bRes1), Cudd_Not(bRes0));
2118 Cudd_RecursiveDeref(dd,bRes0);
2119 Cudd_RecursiveDeref(dd,bRes1);
2122 bRes = Cudd_Not(bRes);
2126 bRes = cuddUniqueInter( dd, bFR->index, bRes1, bRes0 );
2129 Cudd_RecursiveDeref(dd,bRes0);
2130 Cudd_RecursiveDeref(dd,bRes1);
2146static int Counter = 0;
2159DdNode * extraBddAndPermute( DdHashTable * table, DdManager * ddF, DdNode * bF, DdManager * ddG, DdNode * bG,
int * pPermute )
2161 DdNode * bF0, * bF1, * bG0, * bG1, * bRes0, * bRes1, * bRes, * bVar;
2162 int LevF, LevG, Lev;
2165 if ( bF == Cudd_Not(ddF->one) )
2166 return Cudd_Not(ddF->one);
2168 if ( bG == Cudd_Not(ddG->one) )
2169 return Cudd_Not(ddF->one);
2171 if ( bG == ddG->one )
2177 (bRes = cuddHashTableLookup2(table, bF, bG)) )
2181 if ( ddF->TimeStop && Abc_Clock() > ddF->TimeStop )
2183 if ( ddG->TimeStop && Abc_Clock() > ddG->TimeStop )
2187 LevF = cuddI( ddF, Cudd_Regular(bF)->index );
2188 LevG = cuddI( ddF, pPermute ? pPermute[Cudd_Regular(bG)->index] : Cudd_Regular(bG)->index );
2189 Lev = Abc_MinInt( LevF, LevG );
2190 assert( Lev < ddF->size );
2191 bVar = ddF->vars[ddF->invperm[Lev]];
2194 bF0 = (Lev < LevF) ? bF : Cudd_NotCond( cuddE(Cudd_Regular(bF)), Cudd_IsComplement(bF) );
2195 bF1 = (Lev < LevF) ? bF : Cudd_NotCond( cuddT(Cudd_Regular(bF)), Cudd_IsComplement(bF) );
2196 bG0 = (Lev < LevG) ? bG : Cudd_NotCond( cuddE(Cudd_Regular(bG)), Cudd_IsComplement(bG) );
2197 bG1 = (Lev < LevG) ? bG : Cudd_NotCond( cuddT(Cudd_Regular(bG)), Cudd_IsComplement(bG) );
2200 bRes0 = extraBddAndPermute( table, ddF, bF0, ddG, bG0, pPermute );
2201 if ( bRes0 == NULL )
2205 bRes1 = extraBddAndPermute( table, ddF, bF1, ddG, bG1, pPermute );
2206 if ( bRes1 == NULL )
2208 Cudd_IterDerefBdd( ddF, bRes0 );
2214 bRes = cuddBddIteRecur( ddF, bVar, bRes1, bRes0 );
2217 Cudd_IterDerefBdd( ddF, bRes0 );
2218 Cudd_IterDerefBdd( ddF, bRes1 );
2222 Cudd_IterDerefBdd( ddF, bRes0 );
2223 Cudd_IterDerefBdd( ddF, bRes1 );
2228 ptrint fanout = (ptrint)Cudd_Regular(bF)->ref * Cudd_Regular(bG)->ref;
2230 cuddHashTableInsert2( table, bF, bG, bRes, fanout );
2253 DdNode * bG2, * bRes1, * bRes2;
2256 Cudd_AutodynDisable( ddF );
2259 ddG = Cudd_Init( ddF->size, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
2261 Cudd_ShuffleHeap( ddG, ddF->invperm );
2264 Cudd_ReduceHeap( ddG, CUDD_REORDER_SYMM_SIFT, 1 );
2268 bRes1 = Cudd_bddAnd( ddF, bF, bG ); Cudd_Ref( bRes1 );
2269Abc_PrintTime( 1,
"Runtime of Cudd_bddAnd ", Abc_Clock() - clk );
2275Abc_PrintTime( 1,
"Runtime of new procedure", Abc_Clock() - clk );
2276printf(
"Recursive calls = %d\n", Counter );
2277printf(
"|F| =%6d |G| =%6d |H| =%6d |F|*|G| =%9d ",
2278 Cudd_DagSize(bF), Cudd_DagSize(bG), Cudd_DagSize(bRes2),
2279 Cudd_DagSize(bF) * Cudd_DagSize(bG) );
2281 if ( bRes1 == bRes2 )
2282 printf(
"Result verified.\n\n" );
2284 printf(
"Result is incorrect.\n\n" );
2286 Cudd_RecursiveDeref( ddF, bRes1 );
2287 Cudd_RecursiveDeref( ddF, bRes2 );
2289 Cudd_RecursiveDeref( ddG, bG2 );
2293 Cudd_AutodynEnable( ddF, CUDD_REORDER_SYMM_SIFT );
2312 FILE * pFile = fopen( pFileName,
"wb" );
2313 if ( pFile == NULL )
2315 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
2318 fprintf( pFile,
"# PLA file dumped by Extra_zddDumpPla() in ABC\n" );
2319 fprintf( pFile,
".i %d\n", nVars );
2320 fprintf( pFile,
".o 1\n" );
2322 Cudd_zddForeachPath( dd, F, gen, pPath )
2324 for ( i = 0; i < nVars; i++ )
2326 for ( i = 0; i < nVars; i++ )
2327 if ( pPath[2*i] == 1 || pPath[2*i+1] == 1 )
2328 pCube[i] =
'0' + (pPath[2*i] == 1);
2329 fprintf( pFile,
"%s 1\n", pCube );
2331 fprintf( pFile,
".e\n\n" );
2357 DdManager * dd = Cudd_Init( 0, 6, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
2360 DdNode * zGraph, * zEdge, * zVar, * zTemp;
2361 zGraph = DD_ZERO(dd); Cudd_Ref( zGraph );
2362 for ( e = 0; Edges[e][0]; e++ )
2364 zEdge = DD_ONE(dd); Cudd_Ref( zEdge );
2365 for ( n = 0; Edges[e][n]; n++ )
2367 zVar = cuddZddGetNode( dd, Edges[e][n], DD_ONE(dd), DD_ZERO(dd) ); Cudd_Ref( zVar );
2368 zEdge = Cudd_zddUnateProduct( dd, zTemp = zEdge, zVar ); Cudd_Ref( zEdge );
2369 Cudd_RecursiveDerefZdd( dd, zTemp );
2370 Cudd_RecursiveDerefZdd( dd, zVar );
2372 zGraph = Cudd_zddUnion( dd, zTemp = zGraph, zEdge ); Cudd_Ref( zGraph );
2373 Cudd_RecursiveDerefZdd( dd, zTemp );
2374 Cudd_RecursiveDerefZdd( dd, zEdge );
2377 Cudd_zddPrintMinterm( dd, zGraph );
2379 Cudd_RecursiveDerefZdd( dd, zGraph );
2405 DdNode *zRes, *zTemp;
2414 for (lev = nVars - 1; lev >= 0; lev--)
2416 index = (lev >= dd->sizeZ) ? lev : dd->invpermZ[lev];
2417 if (VarValues[index] == 1)
2420 zRes = cuddZddGetNode( dd, index, zTemp = zRes, dd->zero );
2423 Cudd_RecursiveDerefZdd( dd, zTemp );
2460 }
while (dd->reordered == 1);
2486 DdNode *Result, *TempComb, *Aux;
2487 int c, v, Limit, *VarValues;
2490 if ( n <= 0 || k <= 0 || d < 0.0 || d > 1.0 )
2495 if (VarValues == NULL)
2497 dd->errorCode = CUDD_MEMORY_OUT;
2506 Cudd_Srandom( time(NULL) );
2509 Limit = (int)(d * 2147483561.0);
2512 for ( c = 0; c < k; c++ )
2514 for ( v = 0; v < n; v++ )
2515 if ( Cudd_Random() <= Limit )
2521 Cudd_Ref( TempComb );
2527 Aux = Cudd_zddDiff( dd, Result, TempComb );
2529 if ( Aux != Result )
2531 Cudd_RecursiveDerefZdd( dd, Aux );
2532 Cudd_RecursiveDerefZdd( dd, TempComb );
2542 Result = Cudd_zddUnion( dd, Aux = Result, TempComb );
2544 Cudd_RecursiveDerefZdd( dd, Aux );
2545 Cudd_RecursiveDerefZdd( dd, TempComb );
2549 Cudd_Deref( Result );
2570 DdManager * dd = Cudd_Init( 0, 32, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
2571 for ( i = 1; i <= 10; i++ )
2575 Size = Cudd_zddDagSize(zRandSet);
2577 printf(
"N = %5d K = %5d BddSize = %6d MemBdd = %8.3f MB MemBit = %8.3f MB Ratio = %8.3f %%\n",
2578 N, K, Size, 20.0*Size/(1<<20), 0.125 * N * K /(1<<20), 100.0*(0.125 * N * K)/(20.0*Size) );
2579 Cudd_RecursiveDerefZdd( dd, zRandSet );
2602 DdNode *bRes, *bRes0, *bRes1;
2611 if ( cuddI( dd, bVarsK->index ) < cuddI( dd, bVarsN->index ) )
2624 if ( bRes0 == NULL )
2638 if ( bRes1 == NULL )
2640 Cudd_RecursiveDeref( dd, bRes0 );
2647 if ( bRes0 == bRes1 )
2650 else if ( Cudd_IsComplement(bRes1) )
2652 bRes = cuddUniqueInter(dd, bVarsN->index, Cudd_Not(bRes1), Cudd_Not(bRes0));
2655 Cudd_RecursiveDeref(dd,bRes0);
2656 Cudd_RecursiveDeref(dd,bRes1);
2659 bRes = Cudd_Not(bRes);
2663 bRes = cuddUniqueInter( dd, bVarsN->index, bRes1, bRes0 );
2666 Cudd_RecursiveDeref(dd,bRes0);
2667 Cudd_RecursiveDeref(dd,bRes1);
2702 autoDyn = dd->autoDyn;
2708 DdNode *VarSet = VarsN, *VarsK = VarsN;
2712 while ( VarSet !=
b1 )
2716 if ( cuddE( VarSet ) !=
b0 )
2718 VarSet = cuddT( VarSet );
2729 for ( i = 0; i < nVars-K; i++ )
2730 VarsK = cuddT( VarsK );
2735 }
while (dd->reordered == 1);
2736 dd->autoDyn = autoDyn;
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef signed char value
int st__gen(st__generator *gen, const char **key_p, char **value_p)
int st__lookup_int(st__table *table, char *key, int *value)
int st__ptrhash(const char *, int)
int st__ptrcmp(const char *, const char *)
void st__free_gen(st__generator *gen)
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)
st__generator * st__init_gen(st__table *table)
int st__add_direct(st__table *table, char *key, char *value)
void st__free_table(st__table *table)