108int CreateDecomposedNetwork( DdManager * dd, DdNode * aFunc,
char ** pNames,
int nNames,
char * FileName,
int nLutSize,
int fCheck,
int fVerbose )
129 int nLutOutputsOrig = 0;
133 s_LutSize = nLutSize;
135 s_nFuncVars = nNames;
159 if ( nVarsRem + PrevMulti <= s_LutSize )
161 p->nIns = nVarsRem + PrevMulti;
162 p->nInsP = PrevMulti;
165 p->Level = nNames-nVarsRem;
175 p->nInsP = PrevMulti;
176 p->nCols = Profile[nNames-(nVarsRem-(s_LutSize-PrevMulti))];
177 p->nMulti = Abc_Base2Log(
p->nCols);
178 p->Level = nNames-nVarsRem;
180 nVarsRem = nVarsRem-(s_LutSize-PrevMulti);
181 PrevMulti =
p->nMulti;
184 if (
p->nMulti >= s_LutSize )
186 printf(
"The LUT size is too small\n" );
190 nLutOutputsOrig +=
p->nMulti;
199 p->pbCols = (DdNode **)
ABC_ALLOC(
char,
p->nCols *
sizeof(DdNode *) );
200 p->pbCodes = (DdNode **)
ABC_ALLOC(
char,
p->nCols *
sizeof(DdNode *) );
201 p->paNodes = (DdNode **)
ABC_ALLOC(
char,
p->nCols *
sizeof(DdNode *) );
217 for ( i = 0; i < s_LutSize; i++ )
218 bCVars[i] = Cudd_bddNewVar(dd);
222 for ( i = 0; i < nLuts; i++ )
227 DdNode * bVarsInCube;
237 CutLevel =
p->Level +
p->nIns -
p->nInsP;
240 dd, &aFunc, &(
b1), 1,
241 p->paNodes,
p->pbCols, CutLevel );
244 dd, pLuts[i-1]->paNodes, pLuts[i-1]->pbCodes, pLuts[i-1]->nCols,
245 p->paNodes,
p->pbCols, CutLevel );
246 assert( RetValue ==
p->nCols );
258 for ( v = 0; v < nVars; v++ )
259 bVars[v] = dd->vars[ dd->invperm[v] ];
260 bVarsCCube =
Extra_bddBitsToCube( dd, (1<<nVars)-1, nVars, bVars, 1 ); Cudd_Ref( bVarsCCube );
263 nVars =
p->nIns -
p->nInsP;
264 for ( v = 0; v < nVars; v++ )
265 bVars[v] = dd->vars[ dd->invperm[
p->Level+v] ];
266 bVarsInCube =
Extra_bddBitsToCube( dd, (1<<nVars)-1, nVars, bVars, 1 ); Cudd_Ref( bVarsInCube );
269 bVarsCube = Cudd_bddAnd( dd, bVarsInCube, bVarsCCube ); Cudd_Ref( bVarsCube );
270 Cudd_RecursiveDeref( dd, bVarsInCube );
271 Cudd_RecursiveDeref( dd, bVarsCCube );
279 assert( Cudd_IsConstant(
p->paNodes[0] ) );
280 assert( Cudd_IsConstant(
p->paNodes[1] ) );
282 bVar = (
p->paNodes[0] ==
a1 )? bCVars[0]: Cudd_Not( bCVars[0] );
283 p->bRelation = Cudd_bddIte( dd, bVar,
p->pbCols[0],
p->pbCols[1] ); Cudd_Ref(
p->bRelation );
294 nLutOutputs += (
p->nMulti -
p->nSimple);
295 nLutsTotal +=
p->nMulti;
301printf(
"Stage %3d: In = %3d InP = %3d Cols = %5d Multi = %2d Simple = %2d Level = %3d\n",
302 i+1,
p->nIns,
p->nInsP,
p->nCols,
p->nMulti,
p->nSimple,
p->Level );
307 for ( c = 0; c <
p->nCols; c++ )
309 p->pbCodes[c] = Cudd_bddAndAbstract( dd,
p->bRelation,
p->pbCols[c], bVarsCube ); Cudd_Ref(
p->pbCodes[c] );
313 Cudd_RecursiveDeref( dd, bVarsCube );
321 pbTemp = (DdNode **)
ABC_ALLOC(
char,
p->nCols *
sizeof(DdNode *) );
324 for ( v = 0; v < dd->size; v++ )
329 for ( v = 0; v <
p->nMulti; v++ )
330 Permute[bCVars[v]->index] = dd->invperm[v];
336 for ( k = 0; k <
p->nCols; k++ )
338 Cudd_RecursiveDeref( dd,
p->pbCodes[k] );
339 p->pbCodes[k] = pbTemp[k];
345 printf(
"LUTs: Total = %5d. Final = %5d. Simple = %5d. (%6.2f %%) ",
346 nLutsTotal, nLutOutputs, nLutsTotal-nLutOutputs, 100.0*(nLutsTotal-nLutOutputs)/nLutsTotal );
348 printf(
"Memory = %6.2f MB\n", 1.0*nLutOutputs*(1<<nLutSize)/(1<<20) );
356 printf(
"Pure decomposition time = %.2f sec\n", (
float)(Abc_Clock() - clk1 -
s_EncodingTime)/(
float)(CLOCKS_PER_SEC) );
357 printf(
"Encoding time = %.2f sec\n", (
float)(
s_EncodingTime)/(
float)(CLOCKS_PER_SEC) );
375 pFile = fopen( FileName,
"w" );
376 fprintf( pFile,
".model %s\n", FileName );
378 fprintf( pFile,
".inputs" );
379 for ( i = 0; i < nNames; i++ )
380 fprintf( pFile,
" %s", pNames[i] );
381 fprintf( pFile,
"\n" );
382 fprintf( pFile,
".outputs F" );
383 fprintf( pFile,
"\n" );
388 fprintf( pFile,
".end\n" );
391 printf(
"Output file writing time = %.2f sec\n", (
float)(Abc_Clock() - clk1)/(
float)(CLOCKS_PER_SEC) );
396 for ( i = 0; i < nLuts; i++ )
399 for ( v = 0; v <
p->nCols; v++ )
401 Cudd_RecursiveDeref( dd,
p->pbCols[v] );
402 Cudd_RecursiveDeref( dd,
p->pbCodes[v] );
403 Cudd_RecursiveDeref( dd,
p->paNodes[v] );
405 Cudd_RecursiveDeref( dd,
p->bRelation );
416void WriteLUTSintoBLIFfile( FILE * pFile, DdManager * dd,
LUT ** pLuts,
int nLuts, DdNode ** bCVars,
char ** pNames,
int nNames,
char * FileName )
421 static char Buffer[100];
422 DdNode * bCube, * bCof, * bFunc;
426 for ( i = 0; i < nLuts; i++ )
437 fprintf( pFile,
"#----------------- LUT #%d ----------------------\n", i );
444 for ( v = 0; v <
p->nInsP; v++ )
446 sprintf( Buffer,
"LUT%02d_%02d", i-1, v );
450 for ( v = 0; v <
p->nIns -
p->nInsP; v++ )
451 pNamesLocalIn[dd->invperm[
p->Level+v]] =
Extra_UtilStrsav( pNames[dd->invperm[
p->Level+v]] );
453 for ( v = 0; v <
p->nMulti; v++ )
455 sprintf( Buffer,
"LUT%02d_%02d", i, v );
456 if ( i != nLuts - 1 )
466 sprintf( Buffer,
"L%02d_", i );
472 for ( o = 0; o <
p->nMulti; o++ )
475 bCof = Cudd_Cofactor( dd,
p->bRelation, bCVars[o] ); Cudd_Ref( bCof );
477 bFunc = Cudd_bddExistAbstract( dd, bCof, bCube ); Cudd_Ref( bFunc );
478 Cudd_RecursiveDeref( dd, bCof );
481 sprintf( Buffer,
"L%02d_%02d_", i, o );
487 Cudd_RecursiveDeref( dd, bFunc );
489 Cudd_RecursiveDeref( dd, bCube );
492 for ( v = 0; v < dd->size; v++ )
494 if ( pNamesLocalIn[v] )
496 pNamesLocalIn[v] = NULL;
498 for ( v = 0; v <
p->nMulti; v++ )
void WriteLUTSintoBLIFfile(FILE *pFile, DdManager *dd, LUT **pLuts, int nLuts, DdNode **bCVars, char **pNames, int nNames, char *FileName)
static functions ///
int CreateDecomposedNetwork(DdManager *dd, DdNode *aFunc, char **pNames, int nNames, char *FileName, int nLutSize, int fCheck, int fVerbose)
EXTERNAL FUNCTIONS ///.