100 int nParts, DdNode ** pbParts, DdNode * bCare );
103 int nVars, DdNode ** pbVarsNs );
108static int Extra_BuildTreeNode( DdManager * dd,
115static int Extra_FindBestVariable( DdManager * dd,
118static void Extra_FindBestPartitions( DdManager * dd, DdNode * bParts,
120 int * piNode1,
int * piNode2 );
124static void Extra_bddImagePrintLatchDependency( DdManager * dd, DdNode * bCare,
125 int nParts, DdNode ** pbParts,
126 int nVars, DdNode ** pbVars );
127static void Extra_bddImagePrintLatchDependencyOne( DdManager * dd, DdNode * bFunc,
128 DdNode * bVarsCs, DdNode * bVarsNs,
int iPart );
131static void Extra_bddImagePrintTree_rec(
Extra_ImageNode_t * pNode,
int nOffset );
157 DdManager * dd, DdNode * bCare,
158 int nParts, DdNode ** pbParts,
159 int nVars, DdNode ** pbVars,
int fVerbose )
167 if ( fVerbose && dd->size <= 80 )
168 Extra_bddImagePrintLatchDependency( dd, bCare, nParts, pbParts, nVars, pbVars );
171 pParts = Extra_CreateParts( dd, nParts, pbParts, bCare );
172 pVars = Extra_CreateVars( dd, nParts + 1, pParts, nVars, pbVars );
173 pNodes = Extra_CreateNodes( dd, nParts + 1, pParts, dd->size, pVars );
178 pTree->
pCare = pNodes[nParts];
182 while ( Extra_BuildTreeNode( dd, nParts + 1, pNodes, dd->size, pVars ) );
185 for ( v = 0; v < dd->size; v++ )
186 assert( pVars[v] == NULL );
190 while ( (pTree->
pRoot = Extra_MergeTopNodes( dd, nParts + 1, pNodes )) == NULL );
193 for ( v = 0; v < nParts + 1; v++ )
194 assert( pNodes[v] == NULL );
204 Extra_DeleteParts_rec( pTree->
pRoot );
222 DdManager * dd = pTree->
pCare->dd;
223 DdNode * bSupp, * bRem;
228 bSupp = Cudd_Support( dd, bCare ); Cudd_Ref( bSupp );
231 bRem = Cudd_bddExistAbstract( dd, bSupp, pTree->
bCareSupp ); Cudd_Ref( bRem );
234printf(
"Original care set support: " );
236printf(
"Current care set support: " );
238 Cudd_RecursiveDeref( dd, bSupp );
239 Cudd_RecursiveDeref( dd, bRem );
240 printf(
"The care set depends on some vars that were not in the care set during scheduling.\n" );
243 Cudd_RecursiveDeref( dd, bRem );
245 Cudd_RecursiveDeref( dd, bSupp );
248 Cudd_RecursiveDeref( dd, pTree->
pCare->bImage );
249 pTree->
pCare->bImage = bCare; Cudd_Ref( bCare );
253 Extra_bddImageCompute_rec( pTree, pTree->
pRoot );
259 return pTree->
pRoot->bImage;
277 Extra_bddImageTreeDelete_rec( pTree->
pRoot );
294 return pTree->
pRoot->bImage;
317 int nParts, DdNode ** pbParts, DdNode * bCare )
325 for ( i = 0; i < nParts; i++ )
328 pParts[i]->
bFunc = pbParts[i]; Cudd_Ref( pParts[i]->bFunc );
329 pParts[i]->
bSupp = Cudd_Support( dd, pParts[i]->bFunc ); Cudd_Ref( pParts[i]->bSupp );
331 pParts[i]->
nNodes = Cudd_DagSize( pParts[i]->bFunc );
332 pParts[i]->
iPart = i;
336 pParts[nParts]->
bFunc = bCare; Cudd_Ref( pParts[nParts]->bFunc );
337 pParts[nParts]->
bSupp = Cudd_Support( dd, pParts[nParts]->bFunc ); Cudd_Ref( pParts[nParts]->bSupp );
339 pParts[nParts]->
nNodes = Cudd_DagSize( pParts[nParts]->bFunc );
340 pParts[nParts]->
iPart = nParts;
357 int nVars, DdNode ** pbVars )
361 DdNode * bCubeNs, * bSupp, * bParts, * bTemp, * bSuppTemp;
362 int nVarsTotal, iVar,
p, Counter;
366 for (
p = 0;
p < nParts;
p++ )
367 pbFuncs[
p] = pParts[
p]->bSupp;
368 bSupp = Cudd_VectorSupport( dd, pbFuncs, nParts ); Cudd_Ref( bSupp );
372 bCubeNs = Cudd_bddComputeCube( dd, pbVars, NULL, nVars ); Cudd_Ref( bCubeNs );
373 bSupp = Cudd_bddExistAbstract( dd, bTemp = bSupp, bCubeNs ); Cudd_Ref( bSupp );
374 Cudd_RecursiveDeref( dd, bTemp );
375 Cudd_RecursiveDeref( dd, bCubeNs );
384 for ( bSuppTemp = bSupp; bSuppTemp !=
b1; bSuppTemp = cuddT(bSuppTemp) )
386 iVar = bSuppTemp->index;
388 pVars[iVar]->
iNum = iVar;
391 bParts =
b1; Cudd_Ref( bParts );
392 for (
p = 0;
p < nParts;
p++ )
393 if ( Cudd_bddLeq( dd, pParts[
p]->bSupp, dd->vars[bSuppTemp->index] ) )
395 bParts = Cudd_bddAnd( dd, bTemp = bParts, dd->vars[
p] ); Cudd_Ref( bParts );
396 Cudd_RecursiveDeref( dd, bTemp );
399 pVars[iVar]->
bParts = bParts;
400 pVars[iVar]->
nParts = Counter;
402 Cudd_RecursiveDeref( dd, bSupp );
436 for ( i = 0; i < nParts; i++ )
441 pNodes[i]->pPart = pParts[i];
444 for ( v = 0; v < nVars; v++ )
446 if ( pVars[v] == NULL )
448 assert( pVars[v]->nParts > 0 );
449 if ( pVars[v]->nParts > 1 )
451 iPart = pVars[v]->
bParts->index;
452 if ( pNodes[iPart]->bCube == NULL )
454 pNodes[iPart]->bCube = dd->vars[v];
455 Cudd_Ref( dd->vars[v] );
459 pNodes[iPart]->bCube = Cudd_bddAnd( dd, bTemp = pNodes[iPart]->bCube, dd->vars[v] );
460 Cudd_Ref( pNodes[iPart]->bCube );
461 Cudd_RecursiveDeref( dd, bTemp );
464 Cudd_RecursiveDeref( dd, pVars[v]->bParts );
469 for ( i = 0; i < nParts; i++ )
475 pParts[i]->
bFunc = Cudd_bddExistAbstract( dd, bTemp = pParts[i]->bFunc, pNode->bCube );
476 Cudd_Ref( pParts[i]->bFunc );
477 Cudd_RecursiveDeref( dd, bTemp );
479 pParts[i]->
bSupp = Cudd_bddExistAbstract( dd, bTemp = pParts[i]->bSupp, pNode->bCube );
480 Cudd_Ref( pParts[i]->bSupp );
481 Cudd_RecursiveDeref( dd, bTemp );
484 pParts[i]->
nNodes = Cudd_DagSize( pParts[i]->bFunc );
487 if ( i < nParts - 1 )
489 Cudd_RecursiveDeref( dd, pNode->bCube );
494 pNode->bImage = pParts[i]->
bFunc; Cudd_Ref( pNode->bImage );
525 Extra_DeleteParts_rec( pNode->pNode1 );
527 Extra_DeleteParts_rec( pNode->pNode2 );
528 pPart = pNode->pPart;
529 Cudd_RecursiveDeref( pNode->dd, pPart->
bFunc );
530 Cudd_RecursiveDeref( pNode->dd, pPart->
bSupp );
548 Extra_bddImageTreeDelete_rec( pNode->pNode1 );
550 Extra_bddImageTreeDelete_rec( pNode->pNode2 );
552 Cudd_RecursiveDeref( pNode->dd, pNode->bCube );
554 Cudd_RecursiveDeref( pNode->dd, pNode->bImage );
555 assert( pNode->pPart == NULL );
572 DdManager * dd = pNode->dd;
577 if ( pNode->pNode1 == NULL )
581 pNode->bImage = Cudd_bddExistAbstract( dd, bTemp = pNode->bImage, pNode->bCube );
582 Cudd_Ref( pNode->bImage );
583 Cudd_RecursiveDeref( dd, bTemp );
590 Extra_bddImageCompute_rec( pTree, pNode->pNode1 );
592 Extra_bddImageCompute_rec( pTree, pNode->pNode2 );
596 Cudd_RecursiveDeref( dd, pNode->bImage );
597 pNode->bImage = NULL;
601 pNode->bImage = Cudd_bddAndAbstract( dd,
602 pNode->pNode1->bImage, pNode->pNode2->bImage, pNode->bCube );
604 pNode->bImage = Cudd_bddAnd( dd, pNode->pNode1->bImage, pNode->pNode2->bImage );
605 Cudd_Ref( pNode->bImage );
609 nNodes = Cudd_DagSize( pNode->bImage );
626int Extra_BuildTreeNode( DdManager * dd,
633 DdNode * bCube, * bTemp, * bSuppTemp, * bParts;
635 int iVarBest, nSupp, v;
638 iVarBest = Extra_FindBestVariable( dd, nNodes, pNodes, nVars, pVars );
639 if ( iVarBest == -1 )
642 pVar = pVars[iVarBest];
653 iNode1 = pVar->
bParts->index;
654 iNode2 = cuddT(pVar->
bParts)->index;
655 pNode1 = pNodes[iNode1];
656 pNode2 = pNodes[iNode2];
659 bCube = dd->vars[pVar->
iNum]; Cudd_Ref( bCube );
661 for ( v = 0; v < nVars; v++ )
662 if ( pVars[v] && v != iVarBest && pVars[v]->bParts == pVars[iVarBest]->bParts )
665 bCube = Cudd_bddAnd( dd, bTemp = bCube, dd->vars[pVars[v]->iNum] ); Cudd_Ref( bCube );
666 Cudd_RecursiveDeref( dd, bTemp );
668 Cudd_RecursiveDeref( dd, pVars[v]->bParts );
672 Cudd_RecursiveDeref( dd, pVars[iVarBest]->bParts );
676 pNode = Extra_CombineTwoNodes( dd, bCube, pNode1, pNode2 );
677 Cudd_RecursiveDeref( dd, bCube );
682 Extra_FindBestPartitions( dd, pVar->
bParts, nNodes, pNodes, &iNode1, &iNode2 );
683 pNode1 = pNodes[iNode1];
684 pNode2 = pNodes[iNode2];
688 bParts = Cudd_bddAnd( dd, dd->vars[iNode1], dd->vars[iNode2] ); Cudd_Ref( bParts );
689 for ( v = 0; v < nVars; v++ )
690 if ( pVars[v] && pVars[v]->bParts == bParts )
692 Cudd_RecursiveDeref( dd, bParts );
695 pNode = Extra_CombineTwoNodes( dd,
b1, pNode1, pNode2 );
699 pNodes[iNode1] = pNode;
700 pNodes[iNode2] = NULL;
703 for ( bSuppTemp = pNode2->pPart->bSupp; bSuppTemp !=
b1; bSuppTemp = cuddT(bSuppTemp) )
705 pVar = pVars[bSuppTemp->index];
709 assert( Cudd_bddLeq( dd, pVar->
bParts, dd->vars[iNode2] ) );
710 pVar->
bParts = Cudd_bddExistAbstract( dd, bTemp = pVar->
bParts, dd->vars[iNode2] ); Cudd_Ref( pVar->
bParts );
711 Cudd_RecursiveDeref( dd, bTemp );
713 pVar->
bParts = Cudd_bddAnd( dd, bTemp = pVar->
bParts, dd->vars[iNode1] ); Cudd_Ref( pVar->
bParts );
714 Cudd_RecursiveDeref( dd, bTemp );
737 int n1 = -1, n2 = -1, n;
740 for ( n = 0; n < nNodes; n++ )
763 pNode = Extra_CombineTwoNodes( dd,
b1, pNodes[n1], pNodes[n2] );
792 pPart->
bFunc = Cudd_bddAndAbstract( dd, pNode1->pPart->bFunc, pNode2->pPart->bFunc, bCube );
793 Cudd_Ref( pPart->
bFunc );
795 pPart->
bSupp = Cudd_bddAndAbstract( dd, pNode1->pPart->bSupp, pNode2->pPart->bSupp, bCube );
796 Cudd_Ref( pPart->
bSupp );
810 pNode->pPart = pPart;
811 pNode->pNode1 = pNode1;
812 pNode->pNode2 = pNode2;
814 pNode->bImage = Cudd_bddAndAbstract( dd, pNode1->bImage, pNode2->bImage, bCube );
815 Cudd_Ref( pNode->bImage );
819 pNode->bCube = bCube; Cudd_Ref( bCube );
836int Extra_FindBestVariable( DdManager * dd,
842 double CostBest, CostCur;
844 CostBest = 100000000000000.0;
846 for ( v = 0; v < nVars; v++ )
850 for ( bTemp = pVars[v]->bParts; bTemp !=
b1; bTemp = cuddT(bTemp) )
851 CostCur += pNodes[bTemp->index]->pPart->nNodes *
852 pNodes[bTemp->index]->pPart->nNodes;
853 if ( CostBest > CostCur )
873void Extra_FindBestPartitions( DdManager * dd, DdNode * bParts,
875 int * piNode1,
int * piNode2 )
879 int CostMin1, CostMin2, Cost;
882 iPart1 = iPart2 = -1;
883 CostMin1 = CostMin2 = 1000000;
884 for ( bTemp = bParts; bTemp !=
b1; bTemp = cuddT(bTemp) )
886 Cost = pNodes[bTemp->index]->pPart->nNodes;
887 if ( CostMin1 > Cost )
889 CostMin2 = CostMin1; iPart2 = iPart1;
890 CostMin1 = Cost; iPart1 = bTemp->index;
892 else if ( CostMin2 > Cost )
894 CostMin2 = Cost; iPart2 = bTemp->index;
913void Extra_bddImagePrintLatchDependency(
914 DdManager * dd, DdNode * bCare,
915 int nParts, DdNode ** pbParts,
916 int nVars, DdNode ** pbVars )
919 DdNode * bVarsCs, * bVarsNs;
921 bVarsCs = Cudd_Support( dd, bCare ); Cudd_Ref( bVarsCs );
922 bVarsNs = Cudd_bddComputeCube( dd, pbVars, NULL, nVars ); Cudd_Ref( bVarsNs );
924 printf(
"The latch dependency matrix:\n" );
925 printf(
"Partitions = %d Variables: total = %d non-quantifiable = %d\n",
926 nParts, dd->size, nVars );
928 for ( i = 0; i < dd->size; i++ )
929 printf(
"%d", i % 10 );
932 for ( i = 0; i < nParts; i++ )
933 Extra_bddImagePrintLatchDependencyOne( dd, pbParts[i], bVarsCs, bVarsNs, i );
934 Extra_bddImagePrintLatchDependencyOne( dd, bCare, bVarsCs, bVarsNs, nParts );
936 Cudd_RecursiveDeref( dd, bVarsCs );
937 Cudd_RecursiveDeref( dd, bVarsNs );
951void Extra_bddImagePrintLatchDependencyOne(
952 DdManager * dd, DdNode * bFunc,
953 DdNode * bVarsCs, DdNode * bVarsNs,
958 bSupport = Cudd_Support( dd, bFunc ); Cudd_Ref( bSupport );
959 printf(
" %3d : ", iPart );
960 for ( v = 0; v < dd->size; v++ )
962 if ( Cudd_bddLeq( dd, bSupport, dd->vars[v] ) )
964 if ( Cudd_bddLeq( dd, bVarsCs, dd->vars[v] ) )
966 else if ( Cudd_bddLeq( dd, bVarsNs, dd->vars[v] ) )
975 Cudd_RecursiveDeref( dd, bSupport );
992 printf(
"The quantification scheduling tree:\n" );
993 Extra_bddImagePrintTree_rec( pTree->
pRoot, 1 );
1012 Cube = pNode->bCube;
1014 if ( pNode->pNode1 == NULL )
1016 printf(
"<%d> ", pNode->pPart->iPart );
1034 for ( i = 0; i < Offset; i++ )
1036 Extra_bddImagePrintTree_rec( pNode->pNode1, Offset + 1 );
1038 for ( i = 0; i < Offset; i++ )
1040 Extra_bddImagePrintTree_rec( pNode->pNode2, Offset + 1 );
1067 DdManager * dd, DdNode * bCare,
1068 int nParts, DdNode ** pbParts,
1069 int nVars, DdNode ** pbVars,
int fVerbose )
1072 DdNode * bCubeAll, * bCubeNot, * bTemp;
1081 pTree->
bCube = Cudd_bddExistAbstract( dd, bCubeAll, bCubeNot ); Cudd_Ref( pTree->
bCube );
1082 Cudd_RecursiveDeref( dd, bCubeAll );
1083 Cudd_RecursiveDeref( dd, bCubeNot );
1087 for ( i = 0; i < nParts; i++ )
1089 pTree->
bRel = Cudd_bddAnd( dd, bTemp = pTree->
bRel, pbParts[i] ); Cudd_Ref( pTree->
bRel );
1090 Cudd_RecursiveDeref( dd, bTemp );
1111 Cudd_RecursiveDeref( pTree->
dd, pTree->
bImage );
1112 pTree->
bImage = Cudd_bddAndAbstract( pTree->
dd, pTree->
bRel, bCare, pTree->
bCube );
1113 Cudd_Ref( pTree->
bImage );
1131 Cudd_RecursiveDeref( pTree->
dd, pTree->
bRel );
1133 Cudd_RecursiveDeref( pTree->
dd, pTree->
bCube );
1135 Cudd_RecursiveDeref( pTree->
dd, pTree->
bImage );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END