46 DdNode * Temp, * Temp1;
52 Temp =
Extra_Reorder( pReo, dd, Func, pOrder ); Cudd_Ref( Temp );
56printf(
"Initial = %d. Final = %d. Cudd = %d.\n", Cudd_DagSize(Func), Cudd_DagSize(Temp), Cudd_DagSize(Temp1) );
57 Cudd_RecursiveDeref( dd, Temp1 );
58 Cudd_RecursiveDeref( dd, Temp );
78 DdNode * FuncsRes[1000];
86printf(
"Initial = %d. Final = %d.\n", Cudd_SharingSize(Funcs,nFuncs), Cudd_SharingSize(FuncsRes,nFuncs) );
88 for ( i = 0; i < nFuncs; i++ )
89 Cudd_RecursiveDeref( dd, FuncsRes[i] );
111 static DdManager * ddReorder = NULL;
112 static int * Permute = NULL;
113 static int * PermuteReo1 = NULL;
114 static int * PermuteReo2 = NULL;
115 DdNode * aFuncReorder, * aFuncNew;
119 if ( ddReorder == NULL )
122 PermuteReo1 =
ABC_ALLOC(
int, dd->size );
123 PermuteReo2 =
ABC_ALLOC(
int, dd->size );
124 ddReorder = Cudd_Init( dd->size, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
125 Cudd_AutodynDisable(ddReorder);
130 for ( lev = 0; lev < dd->size; lev++ )
132 Permute[ dd->invperm[lev] ] = ddReorder->invperm[lev];
133 PermuteReo1[ ddReorder->invperm[lev] ] = dd->invperm[lev];
140printf(
"Nodes before = %d.\n", Cudd_DagSize(aFuncReorder) );
141 Cudd_ReduceHeap( ddReorder, CUDD_REORDER_SYMM_SIFT, 1 );
142printf(
"Nodes before = %d.\n", Cudd_DagSize(aFuncReorder) );
145 for ( lev = 0; lev < dd->size; lev++ )
147 Permute[ ddReorder->invperm[lev] ] = dd->invperm[lev];
148 PermuteReo2[ dd->invperm[lev] ] = ddReorder->invperm[lev];
154 Cudd_RecursiveDeref( ddReorder, aFuncReorder );
158 for ( var = 0; var < dd->size; var++ )
159 pPermuteReo[var] = PermuteReo1[ PermuteReo2[var] ];
161 Cudd_Deref( aFuncNew );
182 static DdManager * s_ddmin;
187 if ( s_ddmin == NULL )
188 s_ddmin = Cudd_Init( dd->size, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0);
193 bFmin = Cudd_bddTransfer( dd, s_ddmin, bF ); Cudd_Ref( bFmin );
194 Cudd_ReduceHeap(s_ddmin,CUDD_REORDER_SIFT,1);
196 nNodes = Cudd_DagSize( bFmin );
197 Cudd_RecursiveDeref( s_ddmin, bFmin );
219 static DdManager * s_ddmin;
227 if ( s_ddmin == NULL )
228 s_ddmin = Cudd_Init( dd->size, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0);
233 bF = Cudd_addBddPattern( dd, aF ); Cudd_Ref( bF );
234 bFmin = Cudd_bddTransfer( dd, s_ddmin, bF ); Cudd_Ref( bFmin );
235 Cudd_RecursiveDeref( dd, bF );
236 aFmin = Cudd_BddToAdd( s_ddmin, bFmin ); Cudd_Ref( aFmin );
237 Cudd_RecursiveDeref( s_ddmin, bFmin );
239 nNodesBeg = Cudd_DagSize( aFmin );
240 Cudd_ReduceHeap(s_ddmin,CUDD_REORDER_SIFT,1);
242 nNodesEnd = Cudd_DagSize( aFmin );
243 Cudd_RecursiveDeref( s_ddmin, aFmin );
245 printf(
"Classical reordering of ADDs: Before = %d. After = %d.\n", nNodesBeg, nNodesEnd );
246 printf(
"Classical variable reordering time = %.2f sec\n", (
float)(Abc_Clock() - clk1)/(
float)(CLOCKS_PER_SEC) );
void Extra_ReorderArray(reo_man *p, DdManager *dd, DdNode *Funcs[], DdNode *FuncsRes[], int nFuncs, int *pOrder)