37#define _TABLESIZE_COF 51113
46#define _TABLESIZE_MINT 15113
62static unsigned s_Signature = 1;
64static int s_CutLevel = 0;
72static int s_MaxDepth = 5;
74static int s_nVarsBest;
75static int s_VarOrderBest[32];
76static int s_VarOrderCur[32];
79static DdNode * s_Field[8][256];
80static DdNode * s_Encoded;
81static DdNode * s_VarAll;
82static int s_MultiStart;
85static DdNode ** s_pbTemp;
87static int s_BackTracks;
88static int s_BackTrackLimit = 100;
90static DdNode * s_Terminal;
93static int s_EncodingVarsLevel;
107static DdNode * CreateTheCodes_rec( DdManager * dd, DdNode * bEncoded,
int Level, DdNode ** pCVars );
108static void EvaluateEncodings_rec( DdManager * dd, DdNode * bVarsCol,
int nVarsCol,
int nMulti,
int Level );
110static DdNode * ComputeVarSetAndCountMinterms( DdManager * dd, DdNode * bVars, DdNode * bVarTop,
unsigned * Cost );
111static DdNode * ComputeVarSetAndCountMinterms2( DdManager * dd, DdNode * bVars, DdNode * bVarTop,
unsigned * Cost );
113static unsigned Extra_CountMintermsSimple( DdNode * bFunc,
unsigned max );
115static void CountNodeVisits_rec( DdManager * dd, DdNode * aFunc,
st__table * Visited );
116static void CollectNodesAndComputePaths_rec( DdManager * dd, DdNode * aFunc, DdNode * bCube,
st__table * Visited,
st__table * CutNodes );
147 DdNode * bCube, * bTemp, * bProd;
149 assert( nVars >= Abc_Base2Log(nFuncs) );
151 bResult =
b0; Cudd_Ref( bResult );
152 for ( i = 0; i < nFuncs; i++ )
155 bProd = Cudd_bddAnd( dd, bCube, pbFuncs[i] ); Cudd_Ref( bProd );
156 Cudd_RecursiveDeref( dd, bCube );
158 bResult = Cudd_bddOr( dd, bProd, bTemp = bResult ); Cudd_Ref( bResult );
159 Cudd_RecursiveDeref( dd, bTemp );
160 Cudd_RecursiveDeref( dd, bProd );
163 Cudd_Deref( bResult );
193 DdNode * bEncoded, * bResult;
194 int nVarsCol = Cudd_SupportSize(dd,bVarsCol);
207 s_EncodingVarsLevel = dd->invperm[pCVars[0]->index];
217 s_Encoded = bEncoded;
221 s_MultiStart = nMulti;
227 EvaluateEncodings_rec( dd, bVarsCol, nVarsCol, nMulti, 1 );
232 s_pbTemp = (DdNode **)
ABC_ALLOC(
char, nColumns *
sizeof(DdNode *) );
235 bResult = CreateTheCodes_rec( dd, bEncoded, 0, pCVars ); Cudd_Ref( bResult );
239 Cudd_RecursiveDeref( dd, bEncoded );
244 *pSimple = s_nVarsBest;
245 Cudd_Deref( bResult );
270 s_CutLevel = CutLevel;
274 if ( Cudd_IsConstant( bFunc ) )
292 aFunc = Cudd_BddToAdd( dd, bFunc ); Cudd_Ref( aFunc );
299 CountNodeVisits_rec( dd, aFunc, Visited );
302 CollectNodesAndComputePaths_rec( dd, aFunc,
b1, Visited, CutNodes );
311 Cudd_RecursiveDeref( dd,
p->bSum );
320 DdNode * aNode, * bNode, * bSum;
324 bNode = Cudd_addBddPattern( dd, aNode ); Cudd_Ref( bNode );
325 st__insert( Result, (
char*)bNode, (
char*)bSum );
332 Cudd_RecursiveDeref( dd, aFunc );
361 s_CutLevel = CutLevel;
365 if ( nNodes == 1 && Cudd_IsConstant( paNodes[0] ) )
367 if ( paNodes[0] ==
a1 )
369 paNodesRes[0] =
a1; Cudd_Ref(
a1 );
370 pbCubesRes[0] = pbCubes[0]; Cudd_Ref( pbCubes[0] );
374 paNodesRes[0] =
a0; Cudd_Ref(
a0 );
375 pbCubesRes[0] = pbCubes[0]; Cudd_Ref( pbCubes[0] );
385 for ( i = 0; i < nNodes; i++ )
386 CountNodeVisits_rec( dd, paNodes[i], Visited );
389 for ( i = 0; i < nNodes; i++ )
390 CollectNodesAndComputePaths_rec( dd, paNodes[i], pbCubes[i], Visited, CutNodes );
399 Cudd_RecursiveDeref( dd,
p->bSum );
408 DdNode * aNode, * bSum;
412 paNodesRes[Counter] = aNode; Cudd_Ref( aNode );
413 pbCubesRes[Counter] = bSum;
438 FuncR = Cudd_Regular(Func);
441 if ( cuddIsConstant(FuncR) )
484 if (
st__find_or_add( tNodeTopRef, (
char*)node, (
char***)&pTopLevel ) )
487 if ( *pTopLevel > TopLevelNew )
488 *pTopLevel = TopLevelNew;
493 *pTopLevel = TopLevelNew;
526 int LevelStart, Limit;
542 nodeR = Cudd_Regular(node);
543 if ( cuddIsConstant(nodeR) )
552 size = ddMax(dd->size, dd->sizeZ) + 1;
553 for ( i = 0; i < size; i++ )
557 st__foreach_item( tNodeTopRef, gen, (
const char**)&node, (
char**)&LevelStart )
559 nodeR = Cudd_Regular(node);
560 Limit = (cuddIsConstant(nodeR))? dd->size: dd->perm[nodeR->index];
561 for ( i = LevelStart; i <= Limit; i++ )
565 if ( CutLevel != -1 && CutLevel != 0 )
570 for ( i = 0; i < size; i++ )
571 if ( WidthMax < pProfile[i] )
572 WidthMax = pProfile[i];
599DdNode * CreateTheCodes_rec( DdManager * dd, DdNode * bEncoded,
int Level, DdNode ** pCVars )
605 if ( Level == s_nVarsBest )
638 DdNode * bColumn, * bCode;
644 Cudd_RecursiveDeref( dd, bColumn );
645 Cudd_RecursiveDeref( dd, bCode );
650 s_pbTemp[ nCols ] = bColumn;
651 Cudd_RecursiveDeref( dd, bCode );
660 if ( s_MultiStart-Level == 0 )
664 bRes = s_pbTemp[0]; Cudd_Ref( bRes );
674 for ( i = 0; i < nCols; i++ )
675 Cudd_RecursiveDeref( dd, s_pbTemp[i] );
681 DdNode * bCof0, * bCof1;
682 DdNode * bRes0, * bRes1;
683 DdNode * bProd0, * bProd1;
685 DdNode * bVarNext = dd->vars[ s_VarOrderBest[Level] ];
687 bCof0 = Cudd_Cofactor( dd, bEncoded, Cudd_Not( bVarNext ) ); Cudd_Ref( bCof0 );
688 bCof1 = Cudd_Cofactor( dd, bEncoded, bVarNext ); Cudd_Ref( bCof1 );
691 bRes0 = CreateTheCodes_rec( dd, bCof0, Level+1, pCVars ); Cudd_Ref( bRes0 );
692 bRes1 = CreateTheCodes_rec( dd, bCof1, Level+1, pCVars ); Cudd_Ref( bRes1 );
694 Cudd_RecursiveDeref( dd, bCof0 );
695 Cudd_RecursiveDeref( dd, bCof1 );
699 bProd0 = Cudd_bddAnd( dd, Cudd_Not(bVarNext), Cudd_Not(pCVars[Level]) ); Cudd_Ref( bProd0 );
700 bProd1 = Cudd_bddAnd( dd, bVarNext , pCVars[Level] ); Cudd_Ref( bProd1 );
702 bProd0 = Cudd_bddAnd( dd, bTemp = bProd0, bRes0 ); Cudd_Ref( bProd0 );
703 Cudd_RecursiveDeref( dd, bTemp );
704 Cudd_RecursiveDeref( dd, bRes0 );
706 bProd1 = Cudd_bddAnd( dd, bTemp = bProd1, bRes1 ); Cudd_Ref( bProd1 );
707 Cudd_RecursiveDeref( dd, bTemp );
708 Cudd_RecursiveDeref( dd, bRes1 );
710 bRes = Cudd_bddOr( dd, bProd0, bProd1 ); Cudd_Ref( bRes );
712 Cudd_RecursiveDeref( dd, bProd0 );
713 Cudd_RecursiveDeref( dd, bProd1 );
730void EvaluateEncodings_rec( DdManager * dd, DdNode * bVarsCol,
int nVarsCol,
int nMulti,
int Level )
738 int nEntries = (1<<(Level-1));
739 DdNode * bVars0, * bVars1;
740 unsigned nMint0, nMint1;
747 if ( Level > s_MaxDepth )
751 if ( bVarsCol ==
b1 )
754 if ( s_BackTracks > s_BackTrackLimit )
760 for ( bTempV = bVarsCol; bTempV !=
b1; bTempV = cuddT(bTempV) )
763 bVarTop = dd->vars[bTempV->index];
766 s_VarOrderCur[Level-1] = bTempV->index;
770 for ( i = 0; i < nEntries; i++ )
772 bVars0 = ComputeVarSetAndCountMinterms( dd, s_Field[Level-1][i], Cudd_Not(bVarTop), &nMint0 );
778 Cudd_RecursiveDeref( dd, bVars0 );
783 bVars1 = ComputeVarSetAndCountMinterms( dd, s_Field[Level-1][i], bVarTop, &nMint1 );
789 Cudd_RecursiveDeref( dd, bVars0 );
790 Cudd_RecursiveDeref( dd, bVars1 );
796 s_Field[Level][2*i + 0] = bVars0;
797 s_Field[Level][2*i + 1] = bVars1;
805 if ( s_nVarsBest < Level )
809 for ( k = 0; k < Level; k++ )
810 s_VarOrderBest[k] = s_VarOrderCur[k];
817 bVarsRem = Cudd_bddExistAbstract( dd, bVarsCol, bVarTop ); Cudd_Ref( bVarsRem );
818 EvaluateEncodings_rec( dd, bVarsRem, nVarsCol-1, nMulti-1, Level+1 );
819 Cudd_RecursiveDeref( dd, bVarsRem );
824 for ( k = 0; k < i; k++ )
826 Cudd_RecursiveDeref( dd, s_Field[Level][2*k + 0] );
827 Cudd_RecursiveDeref( dd, s_Field[Level][2*k + 1] );
831 if ( s_nVarsBest == s_MaxDepth )
835 if ( s_nVarsBest == s_MultiStart )
852DdNode * ComputeVarSetAndCountMinterms( DdManager * dd, DdNode * bVars, DdNode * bVarTop,
unsigned * Cost )
860 bVarsRes = Cudd_bddAnd( dd, bVars, bVarTop ); Cudd_Ref( bVarsRes );
866 Cudd_Deref( bVarsRes );
882DdNode * ComputeVarSetAndCountMinterms2( DdManager * dd, DdNode * bVars, DdNode * bVarTop,
unsigned * Cost )
885 DdNode * bCof, * bFun;
887 bVarsRes = Cudd_bddAnd( dd, bVars, bVarTop ); Cudd_Ref( bVarsRes );
889 bCof = Cudd_Cofactor( dd, s_Encoded, bVarsRes ); Cudd_Ref( bCof );
890 bFun = Cudd_bddExistAbstract( dd, bCof, s_VarAll ); Cudd_Ref( bFun );
891 *Cost = (unsigned)Cudd_CountMinterm( dd, bFun, s_MultiStart );
892 Cudd_RecursiveDeref( dd, bFun );
893 Cudd_RecursiveDeref( dd, bCof );
895 Cudd_Deref( bVarsRes );
932 bFuncR = Cudd_Regular(bFunc);
942 if ( dd->perm[bFuncR->index] >= s_EncodingVarsLevel )
954 return Extra_CountMintermsSimple( bFunc, (1<<s_MultiStart) );
958 DdNode * bFunc0, * bFunc1;
959 DdNode * bVarsCof0, * bVarsCof1;
960 DdNode * bVarsCofR = Cudd_Regular(bVarsCof);
964 int LevelF = dd->perm[bFuncR->index];
965 int LevelC = cuddI(dd,bVarsCofR->index);
966 int LevelA = dd->perm[bVarsAll->index];
968 int LevelTop = LevelF;
970 if ( LevelTop > LevelC )
973 if ( LevelTop > LevelA )
977 assert( !( LevelTop == LevelF || LevelTop == LevelC ) || LevelTop == LevelA );
980 if ( LevelTop == LevelF )
982 if ( bFuncR != bFunc )
984 bFunc0 = Cudd_Not( cuddE(bFuncR) );
985 bFunc1 = Cudd_Not( cuddT(bFuncR) );
989 bFunc0 = cuddE(bFuncR);
990 bFunc1 = cuddT(bFuncR);
994 bFunc0 = bFunc1 = bFunc;
997 if ( LevelTop == LevelC )
999 if ( bVarsCofR != bVarsCof )
1001 bVarsCof0 = Cudd_Not( cuddE(bVarsCofR) );
1002 bVarsCof1 = Cudd_Not( cuddT(bVarsCofR) );
1006 bVarsCof0 = cuddE(bVarsCofR);
1007 bVarsCof1 = cuddT(bVarsCofR);
1011 bVarsCof0 = bVarsCof1 = bVarsCof;
1019 if ( LevelTop == LevelC )
1021 if ( bVarsCof1 ==
b0 )
1069unsigned Extra_CountMintermsSimple( DdNode * bFunc,
unsigned max )
1074 if ( Cudd_IsComplement(bFunc) )
1075 return max - Extra_CountMintermsSimple( Cudd_Not(bFunc), max );
1078 if ( cuddIsConstant(bFunc) )
1079 return ((bFunc==s_Terminal)? 0: max);
1088 unsigned min = (Extra_CountMintermsSimple( cuddE(bFunc), max ) >> 1) +
1089 (Extra_CountMintermsSimple( cuddT(bFunc), max ) >> 1);
1113void CountNodeVisits_rec( DdManager * dd, DdNode * aFunc,
st__table * Visited )
1126 assert( !Cudd_IsComplement(aFunc) );
1131 p->bSum =
b0; Cudd_Ref(
b0 );
1138 if ( cuddI(dd,aFunc->index) < s_CutLevel )
1140 CountNodeVisits_rec( dd, cuddE(aFunc), Visited );
1141 CountNodeVisits_rec( dd, cuddT(aFunc), Visited );
1159void CollectNodesAndComputePaths_rec( DdManager * dd, DdNode * aFunc, DdNode * bCube,
st__table * Visited,
st__table * CutNodes )
1174 p->bSum = Cudd_bddOr( dd, bTemp =
p->bSum, bCube ); Cudd_Ref(
p->bSum );
1175 Cudd_RecursiveDeref( dd, bTemp );
1187 if ( cuddI(dd,aFunc->index) < s_CutLevel )
1189 DdNode * bCube0, * bCube1;
1192 DdNode * bVarTop = dd->vars[aFunc->index];
1195 bCube0 = Cudd_bddAnd( dd,
p->bSum, Cudd_Not( bVarTop ) ); Cudd_Ref( bCube0 );
1196 bCube1 = Cudd_bddAnd( dd,
p->bSum, bVarTop ); Cudd_Ref( bCube1 );
1199 CollectNodesAndComputePaths_rec( dd, cuddE(aFunc), bCube0, Visited, CutNodes );
1200 CollectNodesAndComputePaths_rec( dd, cuddT(aFunc), bCube1, Visited, CutNodes );
1203 Cudd_RecursiveDeref( dd, bCube0 );
1204 Cudd_RecursiveDeref( dd, bCube1 );
1217 *slot = (
char*)
p->bSum; Cudd_Ref(
p->bSum );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int st__ptrhash(const char *, int)
int st__find_or_add(st__table *table, char *key, char ***slot)
int st__ptrcmp(const char *, const char *)
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
int st__insert(st__table *table, const char *key, char *value)
void st__free_table(st__table *table)
#define st__foreach_item(table, gen, key, value)