96#define b0 Cudd_Not((dd)->one)
100#define ABC_PRB(dd,f) printf("%s = ", #f); Bbr_bddPrint(dd,f); printf("\n")
111 int nParts, DdNode ** pbParts, DdNode * bCare );
114 int nVars, DdNode ** pbVarsNs );
119static int Bbr_BuildTreeNode( DdManager * dd,
126static int Bbr_FindBestVariable( DdManager * dd,
129static void Bbr_FindBestPartitions( DdManager * dd, DdNode * bParts,
131 int * piNode1,
int * piNode2 );
132static Bbr_ImageNode_t * Bbr_CombineTwoNodes( DdManager * dd, DdNode * bCube,
135static void Bbr_bddImagePrintLatchDependency( DdManager * dd, DdNode * bCare,
136 int nParts, DdNode ** pbParts,
137 int nVars, DdNode ** pbVars );
138static void Bbr_bddImagePrintLatchDependencyOne( DdManager * dd, DdNode * bFunc,
139 DdNode * bVarsCs, DdNode * bVarsNs,
int iPart );
142static void Bbr_bddImagePrintTree_rec(
Bbr_ImageNode_t * pNode,
int nOffset );
144static void Bbr_bddPrint( DdManager * dd, DdNode * F );
169 DdManager * dd, DdNode * bCare,
170 int nParts, DdNode ** pbParts,
171 int nVars, DdNode ** pbVars,
int nBddMax,
int fVerbose )
179 if ( fVerbose && dd->size <= 80 )
180 Bbr_bddImagePrintLatchDependency( dd, bCare, nParts, pbParts, nVars, pbVars );
183 pParts = Bbr_CreateParts( dd, nParts, pbParts, bCare );
184 pVars = Bbr_CreateVars( dd, nParts + 1, pParts, nVars, pbVars );
185 pNodes = Bbr_CreateNodes( dd, nParts + 1, pParts, dd->size, pVars );
186 pCare = pNodes[nParts];
189 while ( Bbr_BuildTreeNode( dd, nParts + 1, pNodes, dd->size, pVars, &fStop, nBddMax ) );
194 for ( v = 0; v < dd->size; v++ )
198 for ( v = 0; v <= nParts; v++ )
201 Bbr_DeleteParts_rec( pNodes[v] );
202 Bbr_bddImageTreeDelete_rec( pNodes[v] );
210 for ( v = 0; v < dd->size; v++ )
211 assert( pVars[v] == NULL );
217 pTree->
pCare = pCare;
222 while ( (pTree->
pRoot = Bbr_MergeTopNodes( dd, nParts + 1, pNodes )) == NULL );
225 for ( v = 0; v < nParts + 1; v++ )
226 assert( pNodes[v] == NULL );
236 Bbr_DeleteParts_rec( pTree->
pRoot );
255 DdManager * dd = pTree->
pCare->dd;
256 DdNode * bSupp, * bRem;
261 bSupp = Cudd_Support( dd, bCare ); Cudd_Ref( bSupp );
264 bRem = Cudd_bddExistAbstract( dd, bSupp, pTree->
bCareSupp ); Cudd_Ref( bRem );
267printf(
"Original care set support: " );
269printf(
"Current care set support: " );
271 Cudd_RecursiveDeref( dd, bSupp );
272 Cudd_RecursiveDeref( dd, bRem );
273 printf(
"The care set depends on some vars that were not in the care set during scheduling.\n" );
276 Cudd_RecursiveDeref( dd, bRem );
278 Cudd_RecursiveDeref( dd, bSupp );
281 Cudd_RecursiveDeref( dd, pTree->
pCare->bImage );
282 pTree->
pCare->bImage = bCare; Cudd_Ref( bCare );
286 if ( !Bbr_bddImageCompute_rec( pTree, pTree->
pRoot ) )
293 return pTree->
pRoot->bImage;
311 Bbr_bddImageTreeDelete_rec( pTree->
pRoot );
328 return pTree->
pRoot->bImage;
346void Bbr_bddPrint( DdManager * dd, DdNode * F )
350 CUDD_VALUE_TYPE Value;
351 int nVars = dd->size;
362 printf(
"Constant 0");
367 printf(
"Constant 1");
371 Cudd_ForeachCube( dd, F, Gen,
Cube, Value )
379 for ( i = 0; i < nVars; i++ )
381 printf(
"[%d]'", i );
383 else if (
Cube[i] == 1 )
407 int nParts, DdNode ** pbParts, DdNode * bCare )
415 for ( i = 0; i < nParts; i++ )
418 pParts[i]->
bFunc = pbParts[i]; Cudd_Ref( pParts[i]->bFunc );
419 pParts[i]->
bSupp = Cudd_Support( dd, pParts[i]->bFunc ); Cudd_Ref( pParts[i]->bSupp );
420 pParts[i]->
nSupp = Cudd_SupportSize( dd, pParts[i]->bSupp );
421 pParts[i]->
nNodes = Cudd_DagSize( pParts[i]->bFunc );
422 pParts[i]->
iPart = i;
426 pParts[nParts]->
bFunc = bCare; Cudd_Ref( pParts[nParts]->bFunc );
427 pParts[nParts]->
bSupp = Cudd_Support( dd, pParts[nParts]->bFunc ); Cudd_Ref( pParts[nParts]->bSupp );
428 pParts[nParts]->
nSupp = Cudd_SupportSize( dd, pParts[nParts]->bSupp );
429 pParts[nParts]->
nNodes = Cudd_DagSize( pParts[nParts]->bFunc );
430 pParts[nParts]->
iPart = nParts;
447 int nVars, DdNode ** pbVars )
451 DdNode * bCubeNs, * bSupp, * bParts, * bTemp, * bSuppTemp;
452 int nVarsTotal, iVar,
p, Counter;
456 for (
p = 0;
p < nParts;
p++ )
457 pbFuncs[
p] = pParts[
p]->bSupp;
458 bSupp = Cudd_VectorSupport( dd, pbFuncs, nParts ); Cudd_Ref( bSupp );
462 bCubeNs = Cudd_bddComputeCube( dd, pbVars, NULL, nVars ); Cudd_Ref( bCubeNs );
463 bSupp = Cudd_bddExistAbstract( dd, bTemp = bSupp, bCubeNs ); Cudd_Ref( bSupp );
464 Cudd_RecursiveDeref( dd, bTemp );
465 Cudd_RecursiveDeref( dd, bCubeNs );
468 nVarsTotal = Cudd_SupportSize( dd, bSupp );
474 for ( bSuppTemp = bSupp; bSuppTemp !=
b1; bSuppTemp = cuddT(bSuppTemp) )
476 iVar = bSuppTemp->index;
478 pVars[iVar]->
iNum = iVar;
481 bParts =
b1; Cudd_Ref( bParts );
482 for (
p = 0;
p < nParts;
p++ )
483 if ( Cudd_bddLeq( dd, pParts[
p]->bSupp, dd->vars[bSuppTemp->index] ) )
485 bParts = Cudd_bddAnd( dd, bTemp = bParts, dd->vars[
p] ); Cudd_Ref( bParts );
486 Cudd_RecursiveDeref( dd, bTemp );
489 pVars[iVar]->
bParts = bParts;
490 pVars[iVar]->
nParts = Counter;
492 Cudd_RecursiveDeref( dd, bSupp );
526 for ( i = 0; i < nParts; i++ )
531 pNodes[i]->pPart = pParts[i];
534 for ( v = 0; v < nVars; v++ )
536 if ( pVars[v] == NULL )
538 assert( pVars[v]->nParts > 0 );
539 if ( pVars[v]->nParts > 1 )
541 iPart = pVars[v]->
bParts->index;
542 if ( pNodes[iPart]->bCube == NULL )
544 pNodes[iPart]->bCube = dd->vars[v];
545 Cudd_Ref( dd->vars[v] );
549 pNodes[iPart]->bCube = Cudd_bddAnd( dd, bTemp = pNodes[iPart]->bCube, dd->vars[v] );
550 Cudd_Ref( pNodes[iPart]->bCube );
551 Cudd_RecursiveDeref( dd, bTemp );
554 Cudd_RecursiveDeref( dd, pVars[v]->bParts );
559 for ( i = 0; i < nParts; i++ )
565 pParts[i]->
bFunc = Cudd_bddExistAbstract( dd, bTemp = pParts[i]->bFunc, pNode->bCube );
566 Cudd_Ref( pParts[i]->bFunc );
567 Cudd_RecursiveDeref( dd, bTemp );
569 pParts[i]->
bSupp = Cudd_bddExistAbstract( dd, bTemp = pParts[i]->bSupp, pNode->bCube );
570 Cudd_Ref( pParts[i]->bSupp );
571 Cudd_RecursiveDeref( dd, bTemp );
573 pParts[i]->
nSupp = Cudd_SupportSize( dd, pParts[i]->bSupp );
574 pParts[i]->
nNodes = Cudd_DagSize( pParts[i]->bFunc );
577 if ( i < nParts - 1 )
579 Cudd_RecursiveDeref( dd, pNode->bCube );
584 pNode->bImage = pParts[i]->
bFunc; Cudd_Ref( pNode->bImage );
615 Bbr_DeleteParts_rec( pNode->pNode1 );
617 Bbr_DeleteParts_rec( pNode->pNode2 );
618 pPart = pNode->pPart;
619 Cudd_RecursiveDeref( pNode->dd, pPart->
bFunc );
620 Cudd_RecursiveDeref( pNode->dd, pPart->
bSupp );
638 Bbr_bddImageTreeDelete_rec( pNode->pNode1 );
640 Bbr_bddImageTreeDelete_rec( pNode->pNode2 );
642 Cudd_RecursiveDeref( pNode->dd, pNode->bCube );
644 Cudd_RecursiveDeref( pNode->dd, pNode->bImage );
645 assert( pNode->pPart == NULL );
662 DdManager * dd = pNode->dd;
667 if ( pNode->pNode1 == NULL )
671 pNode->bImage = Cudd_bddExistAbstract( dd, bTemp = pNode->bImage, pNode->bCube );
672 Cudd_Ref( pNode->bImage );
673 Cudd_RecursiveDeref( dd, bTemp );
680 if ( !Bbr_bddImageCompute_rec( pTree, pNode->pNode1 ) )
683 if ( !Bbr_bddImageCompute_rec( pTree, pNode->pNode2 ) )
688 Cudd_RecursiveDeref( dd, pNode->bImage );
689 pNode->bImage = NULL;
693 pNode->bImage = Cudd_bddAndAbstract( dd,
694 pNode->pNode1->bImage, pNode->pNode2->bImage, pNode->bCube );
696 pNode->bImage = Cudd_bddAnd( dd, pNode->pNode1->bImage, pNode->pNode2->bImage );
697 Cudd_Ref( pNode->bImage );
701 nNodes = Cudd_DagSize( pNode->bImage );
705 if ( dd->keys-dd->dead > (
unsigned)pTree->
nBddMax )
721int Bbr_BuildTreeNode( DdManager * dd,
728 DdNode * bCube, * bTemp, * bSuppTemp;
730 int iVarBest, nSupp, v;
733 iVarBest = Bbr_FindBestVariable( dd, nNodes, pNodes, nVars, pVars );
734 if ( iVarBest == -1 )
749 pVar = pVars[iVarBest];
752 nSupp = Cudd_SupportSize( dd, pVar->
bParts );
761 iNode1 = pVar->
bParts->index;
762 iNode2 = cuddT(pVar->
bParts)->index;
763 pNode1 = pNodes[iNode1];
764 pNode2 = pNodes[iNode2];
767 bCube = dd->vars[pVar->
iNum]; Cudd_Ref( bCube );
769 for ( v = 0; v < nVars; v++ )
770 if ( pVars[v] && v != iVarBest && pVars[v]->bParts == pVars[iVarBest]->bParts )
773 bCube = Cudd_bddAnd( dd, bTemp = bCube, dd->vars[pVars[v]->iNum] ); Cudd_Ref( bCube );
774 Cudd_RecursiveDeref( dd, bTemp );
776 Cudd_RecursiveDeref( dd, pVars[v]->bParts );
780 Cudd_RecursiveDeref( dd, pVars[iVarBest]->bParts );
784 pNode = Bbr_CombineTwoNodes( dd, bCube, pNode1, pNode2 );
785 Cudd_RecursiveDeref( dd, bCube );
790 Bbr_FindBestPartitions( dd, pVar->
bParts, nNodes, pNodes, &iNode1, &iNode2 );
791 pNode1 = pNodes[iNode1];
792 pNode2 = pNodes[iNode2];
804 pNode = Bbr_CombineTwoNodes( dd,
b1, pNode1, pNode2 );
808 pNodes[iNode1] = pNode;
809 pNodes[iNode2] = NULL;
813 for ( bSuppTemp = pNode2->pPart->bSupp; bSuppTemp !=
b1; bSuppTemp = cuddT(bSuppTemp) )
815 pVar = pVars[bSuppTemp->index];
819 assert( Cudd_bddLeq( dd, pVar->
bParts, dd->vars[iNode2] ) );
820 pVar->
bParts = Cudd_bddExistAbstract( dd, bTemp = pVar->
bParts, dd->vars[iNode2] ); Cudd_Ref( pVar->
bParts );
821 Cudd_RecursiveDeref( dd, bTemp );
823 pVar->
bParts = Cudd_bddAnd( dd, bTemp = pVar->
bParts, dd->vars[iNode1] ); Cudd_Ref( pVar->
bParts );
824 Cudd_RecursiveDeref( dd, bTemp );
830 if ( dd->keys-dd->dead > (
unsigned)nBddMax )
854 int n1 = -1, n2 = -1, n;
857 for ( n = 0; n < nNodes; n++ )
880 pNode = Bbr_CombineTwoNodes( dd,
b1, pNodes[n1], pNodes[n2] );
909 pPart->
bFunc = Cudd_bddAndAbstract( dd, pNode1->pPart->bFunc, pNode2->pPart->bFunc, bCube );
910 Cudd_Ref( pPart->
bFunc );
912 pPart->
bSupp = Cudd_bddAndAbstract( dd, pNode1->pPart->bSupp, pNode2->pPart->bSupp, bCube );
913 Cudd_Ref( pPart->
bSupp );
915 pPart->
nSupp = Cudd_SupportSize( dd, pPart->
bSupp );
927 pNode->pPart = pPart;
928 pNode->pNode1 = pNode1;
929 pNode->pNode2 = pNode2;
931 pNode->bImage = Cudd_bddAndAbstract( dd, pNode1->bImage, pNode2->bImage, bCube );
932 Cudd_Ref( pNode->bImage );
936 pNode->bCube = bCube; Cudd_Ref( bCube );
953int Bbr_FindBestVariable( DdManager * dd,
959 double CostBest, CostCur;
961 CostBest = 100000000000000.0;
965 for ( v = 0; v < nVars; v++ )
966 if ( pVars[v] && pVars[v]->nParts == 2 )
969 for ( bTemp = pVars[v]->bParts; bTemp !=
b1; bTemp = cuddT(bTemp) )
970 CostCur += pNodes[bTemp->index]->pPart->nNodes *
971 pNodes[bTemp->index]->pPart->nNodes;
972 if ( CostBest > CostCur )
982 for ( v = 0; v < nVars; v++ )
985 assert( pVars[v]->nParts > 1 );
987 for ( bTemp = pVars[v]->bParts; bTemp !=
b1; bTemp = cuddT(bTemp) )
988 CostCur += pNodes[bTemp->index]->pPart->nNodes *
989 pNodes[bTemp->index]->pPart->nNodes;
990 if ( CostBest > CostCur )
1010void Bbr_FindBestPartitions( DdManager * dd, DdNode * bParts,
1012 int * piNode1,
int * piNode2 )
1016 int CostMin1, CostMin2, Cost;
1019 iPart1 = iPart2 = -1;
1020 CostMin1 = CostMin2 = 1000000;
1021 for ( bTemp = bParts; bTemp !=
b1; bTemp = cuddT(bTemp) )
1023 Cost = pNodes[bTemp->index]->pPart->nNodes;
1024 if ( CostMin1 > Cost )
1026 CostMin2 = CostMin1; iPart2 = iPart1;
1027 CostMin1 = Cost; iPart1 = bTemp->index;
1029 else if ( CostMin2 > Cost )
1031 CostMin2 = Cost; iPart2 = bTemp->index;
1050void Bbr_bddImagePrintLatchDependency(
1051 DdManager * dd, DdNode * bCare,
1052 int nParts, DdNode ** pbParts,
1053 int nVars, DdNode ** pbVars )
1056 DdNode * bVarsCs, * bVarsNs;
1058 bVarsCs = Cudd_Support( dd, bCare ); Cudd_Ref( bVarsCs );
1059 bVarsNs = Cudd_bddComputeCube( dd, pbVars, NULL, nVars ); Cudd_Ref( bVarsNs );
1061 printf(
"The latch dependency matrix:\n" );
1062 printf(
"Partitions = %d Variables: total = %d non-quantifiable = %d\n",
1063 nParts, dd->size, nVars );
1065 for ( i = 0; i < dd->size; i++ )
1066 printf(
"%d", i % 10 );
1069 for ( i = 0; i < nParts; i++ )
1070 Bbr_bddImagePrintLatchDependencyOne( dd, pbParts[i], bVarsCs, bVarsNs, i );
1071 Bbr_bddImagePrintLatchDependencyOne( dd, bCare, bVarsCs, bVarsNs, nParts );
1073 Cudd_RecursiveDeref( dd, bVarsCs );
1074 Cudd_RecursiveDeref( dd, bVarsNs );
1088void Bbr_bddImagePrintLatchDependencyOne(
1089 DdManager * dd, DdNode * bFunc,
1090 DdNode * bVarsCs, DdNode * bVarsNs,
1095 bSupport = Cudd_Support( dd, bFunc ); Cudd_Ref( bSupport );
1096 printf(
" %3d : ", iPart );
1097 for ( v = 0; v < dd->size; v++ )
1099 if ( Cudd_bddLeq( dd, bSupport, dd->vars[v] ) )
1101 if ( Cudd_bddLeq( dd, bVarsCs, dd->vars[v] ) )
1103 else if ( Cudd_bddLeq( dd, bVarsNs, dd->vars[v] ) )
1112 Cudd_RecursiveDeref( dd, bSupport );
1129 printf(
"The quantification scheduling tree:\n" );
1130 Bbr_bddImagePrintTree_rec( pTree->
pRoot, 1 );
1149 Cube = pNode->bCube;
1151 if ( pNode->pNode1 == NULL )
1153 printf(
"<%d> ", pNode->pPart->iPart );
1171 for ( i = 0; i < Offset; i++ )
1173 Bbr_bddImagePrintTree_rec( pNode->pNode1, Offset + 1 );
1175 for ( i = 0; i < Offset; i++ )
1177 Bbr_bddImagePrintTree_rec( pNode->pNode2, Offset + 1 );
1197 bRes =
b1; Cudd_Ref( bRes );
1198 for ( i = 0; i < nVars; i++ )
1200 bRes = Cudd_bddAnd( dd, bTemp = bRes, bXVars[i] ); Cudd_Ref( bRes );
1201 Cudd_RecursiveDeref( dd, bTemp );
1232 DdManager * dd, DdNode * bCare,
1233 int nParts, DdNode ** pbParts,
1234 int nVars, DdNode ** pbVars,
int fVerbose )
1237 DdNode * bCubeAll, * bCubeNot, * bTemp;
1246 pTree->
bCube = Cudd_bddExistAbstract( dd, bCubeAll, bCubeNot ); Cudd_Ref( pTree->
bCube );
1247 Cudd_RecursiveDeref( dd, bCubeAll );
1248 Cudd_RecursiveDeref( dd, bCubeNot );
1252 for ( i = 0; i < nParts; i++ )
1254 pTree->
bRel = Cudd_bddAnd( dd, bTemp = pTree->
bRel, pbParts[i] ); Cudd_Ref( pTree->
bRel );
1255 Cudd_RecursiveDeref( dd, bTemp );
1276 Cudd_RecursiveDeref( pTree->
dd, pTree->
bImage );
1277 pTree->
bImage = Cudd_bddAndAbstract( pTree->
dd, pTree->
bRel, bCare, pTree->
bCube );
1278 Cudd_Ref( pTree->
bImage );
1296 Cudd_RecursiveDeref( pTree->
dd, pTree->
bRel );
1298 Cudd_RecursiveDeref( pTree->
dd, pTree->
bCube );
1300 Cudd_RecursiveDeref( pTree->
dd, pTree->
bImage );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Bbr_bddImageTreeDelete(Bbr_ImageTree_t *pTree)
DdNode * Bbr_bddImageCompute2(Bbr_ImageTree2_t *pTree, DdNode *bCare)
void Bbr_bddImageTreeDelete2(Bbr_ImageTree2_t *pTree)
DdNode * Bbr_bddImageRead2(Bbr_ImageTree2_t *pTree)
Bbr_ImageTree_t * Bbr_bddImageStart(DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int nBddMax, int fVerbose)
struct Bbr_ImageVar_t_ Bbr_ImageVar_t
DdNode * Bbr_bddImageCompute(Bbr_ImageTree_t *pTree, DdNode *bCare)
DdNode * Bbr_bddImageRead(Bbr_ImageTree_t *pTree)
Bbr_ImageTree2_t * Bbr_bddImageStart2(DdManager *dd, DdNode *bCare, int nParts, DdNode **pbParts, int nVars, DdNode **pbVars, int fVerbose)
typedefABC_NAMESPACE_IMPL_START struct Bbr_ImageNode_t_ Bbr_ImageNode_t
DdNode * Bbr_bddComputeCube(DdManager *dd, DdNode **bXVars, int nVars)
struct Bbr_ImagePart_t_ Bbr_ImagePart_t
struct Bbr_ImageTree2_t_ Bbr_ImageTree2_t
struct Bbr_ImageTree_t_ Bbr_ImageTree_t
FUNCTION DECLARATIONS ///.