59 p->nNodesBeg = Cudd_SharingSize( Funcs, nFuncs );
66 for ( i = 0; i < dd->size; i++ )
67 p->nSupp +=
p->pSupp[i];
72 for ( i = 0; i < nFuncs; i++ )
74 FuncsRes[i] = Funcs[i]; Cudd_Ref( FuncsRes[i] );
82 for ( i = 0; i < dd->size; i++ )
83 if (
p->pSupp[ dd->invperm[i] ] )
85 p->pMapToPlanes[ dd->invperm[i] ] = Counter;
86 p->pMapToDdVarsOrig[Counter] = dd->invperm[i];
88 p->pMapToDdVarsFinal[Counter] = dd->invperm[i];
90 p->pMapToDdVarsFinal[Counter] = dd->invperm[Counter];
91 p->pOrderInt[Counter] = Counter;
101 for ( i = 0; i < nFuncs; i++ )
103 assert(
p->nNodesBeg ==
p->nNodesCur );
105 if ( !
p->fThisIsAdd &&
p->fMinWidth )
107 printf(
"An important message from the REO reordering engine:\n" );
108 printf(
"The BDD given to the engine for reordering contains complemented edges.\n" );
109 printf(
"Currently, such BDDs cannot be reordered for the minimum width.\n" );
110 printf(
"Therefore, minimization for the number of BDD nodes is performed.\n" );
118 else if (
p->fMinApl )
125 printf(
"INITIAL:\n" );
128 else if (
p->fMinApl )
138 for ( i = 0; i <
p->nIters; i++ )
144 printf(
"ITER #%d:\n", i+1 );
147 else if (
p->fMinApl )
155 p->nWidthEnd =
p->nWidthCur;
156 assert(
p->nWidthEnd <=
p->nWidthBeg );
157 if (
p->nWidthEnd ==
p->nWidthBeg )
160 else if (
p->fMinApl )
162 p->nAplEnd =
p->nAplCur;
164 if (
p->nAplEnd ==
p->nAplBeg )
169 p->nNodesEnd =
p->nNodesCur;
170 assert(
p->nNodesEnd <=
p->nNodesBeg );
171 if (
p->nNodesEnd ==
p->nNodesBeg )
186 for ( i = 0; i < nFuncs; i++ )
191 for ( i = 0; i <
p->nRefNodes; i++ )
192 Cudd_RecursiveDeref( dd,
p->pRefNodes[i] );
194 for ( i = 0; i < nFuncs; i++ )
196 assert( reoRecursiveDeref(
p->pTops[i] ) );
198 assert( reoCheckZeroRefs( &(
p->pPlanes[
p->nSupp]) ) );
209 for ( i = 0; i <
p->nSupp; i++ )
210 p->pOrder[
p->pMapToDdVarsFinal[i] ] =
p->pMapToDdVarsOrig[
p->pOrderInt[i] ];
216 DdNode * FuncRemapped;
219 if (
p->pOrder == NULL )
222 for ( i = 0; i <
p->nSupp; i++ )
223 pOrder[
p->pMapToDdVarsFinal[i] ] =
p->pMapToDdVarsOrig[
p->pOrderInt[i] ];
229 for ( i = 0; i < nFuncs; i++ )
233 FuncRemapped = Cudd_addPermute( dd, FuncsRes[i], pOrder );
235 FuncRemapped = Cudd_bddPermute( dd, FuncsRes[i], pOrder );
236 Cudd_Ref( FuncRemapped );
238 if ( FuncRemapped != Funcs[i] )
241 printf(
"REO: Internal verification has failed!\n" );
244 Cudd_RecursiveDeref( dd, FuncRemapped );
247 printf(
"REO: Internal verification is okay!\n" );
249 if (
p->pOrder == NULL )
254 for ( i = 0; i <=
p->nSupp; i++ )
272 if (
p->nSuppAlloc == 0 )
275 p->pOrderInt =
ABC_ALLOC(
int, nDdVarsMax + 1 );
276 p->pMapToPlanes =
ABC_ALLOC(
int, nDdVarsMax + 1 );
277 p->pMapToDdVarsOrig =
ABC_ALLOC(
int, nDdVarsMax + 1 );
278 p->pMapToDdVarsFinal =
ABC_ALLOC(
int, nDdVarsMax + 1 );
280 p->pVarCosts =
ABC_ALLOC(
double, nDdVarsMax + 1 );
281 p->pLevelOrder =
ABC_ALLOC(
int, nDdVarsMax + 1 );
282 p->nSuppAlloc = nDdVarsMax + 1;
284 else if (
p->nSuppAlloc < nDdVarsMax )
296 p->pOrderInt =
ABC_ALLOC(
int, nDdVarsMax + 1 );
297 p->pMapToPlanes =
ABC_ALLOC(
int, nDdVarsMax + 1 );
298 p->pMapToDdVarsOrig =
ABC_ALLOC(
int, nDdVarsMax + 1 );
299 p->pMapToDdVarsFinal =
ABC_ALLOC(
int, nDdVarsMax + 1 );
301 p->pVarCosts =
ABC_ALLOC(
double, nDdVarsMax + 1 );
302 p->pLevelOrder =
ABC_ALLOC(
int, nDdVarsMax + 1 );
303 p->nSuppAlloc = nDdVarsMax + 1;
307 if (
p->nRefNodesAlloc == 0 )
309 p->nNodesMaxAlloc = nNodesMax;
310 p->nTableSize = 3*nNodesMax + 1;
311 p->nRefNodesAlloc = 3*nNodesMax + 1;
315 p->pRefNodes =
ABC_ALLOC( DdNode *,
p->nRefNodesAlloc );
319 else if (
p->nNodesMaxAlloc < nNodesMax )
322 int nMemChunksAllocPrev =
p->nMemChunksAlloc;
324 p->nNodesMaxAlloc = nNodesMax;
325 p->nTableSize = 3*nNodesMax + 1;
326 p->nRefNodesAlloc = 3*nNodesMax + 1;
333 p->pRefNodes =
ABC_ALLOC( DdNode *,
p->nRefNodesAlloc );
339 p->pMemChunks = pTemp;
343 if (
p->nTopsAlloc == 0 )
346 p->nTopsAlloc = nFuncs;
348 else if (
p->nTopsAlloc < nFuncs )
352 p->nTopsAlloc = nFuncs;
void reoReorderArray(reo_man *p, DdManager *dd, DdNode *Funcs[], DdNode *FuncsRes[], int nFuncs, int *pOrder)
FUNCTION DEFINITIONS ///.