53 char * pCubeIn, * pCubeOut, * pCube;
54 int i, k, nProducts, nInputs, nOutputs, nFanins;
59 pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
60 if ( !Abc_ObjIsNode(pDriver) )
75 nInputs = Abc_NtkCiNum(pNtk);
76 nOutputs = Abc_NtkCoNum(pNtk);
78 pCubeOut =
ABC_ALLOC(
char, nOutputs + 1 );
79 memset( pCubeIn,
'-', (
size_t)nInputs ); pCubeIn[nInputs] = 0;
80 memset( pCubeOut,
'0', (
size_t)nOutputs ); pCubeOut[nOutputs] = 0;
83 fprintf( pFile,
".i %d\n", nInputs );
84 fprintf( pFile,
".o %d\n", nOutputs );
85 fprintf( pFile,
".ilb" );
87 fprintf( pFile,
" %s",
Abc_ObjName(Abc_ObjFanout0(pNode)) );
88 fprintf( pFile,
"\n" );
89 fprintf( pFile,
".ob" );
91 fprintf( pFile,
" %s",
Abc_ObjName(Abc_ObjFanin0(pNode)) );
92 fprintf( pFile,
"\n" );
93 fprintf( pFile,
".p %d\n", nProducts );
109 pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
110 if ( !Abc_ObjIsNode(pDriver) )
112 assert( Abc_ObjIsCi(pDriver) );
113 pCubeIn[(int)(ABC_PTRUINT_T)pDriver->
pCopy] =
'1' - Abc_ObjFaninC0(pNode);
114 fprintf( pFile,
"%s %s\n", pCubeIn, pCubeOut );
115 pCubeIn[(int)(ABC_PTRUINT_T)pDriver->
pCopy] =
'-';
121 fprintf( pFile,
"%s %s\n", pCubeIn, pCubeOut );
129 nFanins = Abc_ObjFaninNum(pDriver);
134 pFanin = Abc_ObjFanin0Ntk(pFanin);
135 assert( (
int)(ABC_PTRUINT_T)pFanin->
pCopy < nInputs );
136 pCubeIn[(int)(ABC_PTRUINT_T)pFanin->
pCopy] = pCube[k];
138 fprintf( pFile,
"%s %s\n", pCubeIn, pCubeOut );
143 pFanin = Abc_ObjFanin0Ntk(pFanin);
144 assert( Abc_ObjIsCi(pFanin) );
145 pCubeIn[(int)(ABC_PTRUINT_T)pFanin->
pCopy] =
'-';
147 Extra_ProgressBarUpdate( pProgress, i, NULL );
150 fprintf( pFile,
".e\n" );
176 assert( Abc_NtkIsSopNetlist(pNtk) );
179 pFile = fopen( pFileName,
"w" );
182 fprintf( stdout,
"Io_WritePla(): Cannot open the output file.\n" );
189 pExdc = Abc_NtkExdc( pNtk );
191 printf(
"Io_WritePla: EXDC is not written (warning).\n" );
210int Io_WriteMoPlaOneInt( FILE * pFile,
Abc_Ntk_t * pNtk, DdManager * dd,
Vec_Ptr_t * vFuncs )
213 DdNode * bOnset, * bOffset, * bCube, * bFunc, * bTemp, * zCover;
214 int i, k, nInputs, nOutputs;
217 assert( Vec_PtrSize(vFuncs) == Abc_NtkCoNum(pNtk) );
218 assert( dd->size == Abc_NtkCiNum(pNtk) );
219 assert( dd->size <= 1000 );
222 nInputs = Abc_NtkCiNum(pNtk);
223 nOutputs = Abc_NtkCoNum(pNtk);
227 for ( i = 0; i < nOutputs; i++ )
228 Cudd_bddNewVarAtLevel( dd, i );
229 assert( dd->size == nInputs + nOutputs );
232 bOnset = Cudd_ReadLogicZero( dd ); Cudd_Ref(bOnset);
233 bOffset = Cudd_ReadLogicZero( dd ); Cudd_Ref(bOffset);
234 for ( i = 0; i < nOutputs; i++ )
236 bFunc = (DdNode *)Vec_PtrEntry(vFuncs, i);
238 bCube = Cudd_bddAnd( dd, Cudd_bddIthVar(dd, nInputs+i), bFunc ); Cudd_Ref(bCube);
239 for ( k = 0; k < nOutputs; k++ )
242 bCube = Cudd_bddAnd( dd, bTemp = bCube, Cudd_Not(Cudd_bddIthVar(dd, nInputs+k)) ); Cudd_Ref(bCube);
243 Cudd_RecursiveDeref( dd, bTemp );
245 bOnset = Cudd_bddOr( dd, bTemp = bOnset, bCube ); Cudd_Ref(bOnset);
246 Cudd_RecursiveDeref( dd, bTemp );
247 Cudd_RecursiveDeref( dd, bCube );
249 bCube = Cudd_bddAnd( dd, Cudd_bddIthVar(dd, nInputs+i), Cudd_Not(bFunc) ); Cudd_Ref(bCube);
250 bOffset = Cudd_bddOr( dd, bTemp = bOffset, bCube ); Cudd_Ref(bOffset);
251 Cudd_RecursiveDeref( dd, bTemp );
252 Cudd_RecursiveDeref( dd, bCube );
254 printf(
"Trying %d output.\n", i );
255 printf(
"Onset = %d nodes.\n", Cudd_DagSize(bOnset) );
256 printf(
"Offset = %d nodes.\n", Cudd_DagSize(bOffset) );
259 Cudd_zddVarsFromBddVars( dd, 2 );
263 extern int Abc_CountZddCubes( DdManager * dd, DdNode * zCover );
264 DdNode * bCover, * zCover0, * zCover1;
265 int nCubes0, nCubes1;
267 bCover = Cudd_zddIsop( dd, bOffset, Cudd_Not(bOnset), &zCover0 );
270 Cudd_RecursiveDeref( dd, bCover );
271 nCubes0 = Abc_CountZddCubes( dd, zCover0 );
274 bCover = Cudd_zddIsop( dd, bOnset, Cudd_Not(bOffset), &zCover1 );
277 Cudd_RecursiveDeref( dd, bCover );
278 nCubes1 = Abc_CountZddCubes( dd, zCover1 );
281 if ( nCubes1 <= nCubes0 )
285 Cudd_RecursiveDerefZdd( dd, zCover0 );
292 Cudd_RecursiveDerefZdd( dd, zCover1 );
296 Cudd_RecursiveDeref( dd, bOnset );
297 Cudd_RecursiveDeref( dd, bOffset );
298 Cudd_RecursiveDerefZdd( dd, zCover );
299 printf(
"Cover = %d nodes.\n", Cudd_DagSize(zCover) );
300 printf(
"ISOP = %d\n", nCubes );
303 fprintf( pFile,
".i %d\n", nInputs );
304 fprintf( pFile,
".o %d\n", nOutputs );
305 fprintf( pFile,
".ilb" );
308 fprintf( pFile,
"\n" );
309 fprintf( pFile,
".ob" );
312 fprintf( pFile,
"\n" );
313 fprintf( pFile,
".p %d\n", nCubes );
316 fprintf( pFile,
".e\n" );
331int Io_WriteMoPlaOneIntMinterms( FILE * pFile,
Abc_Ntk_t * pNtk, DdManager * dd,
Vec_Ptr_t * vFuncs )
335 int i, k, nProducts, nInputs, nOutputs;
336 assert( Vec_PtrSize(vFuncs) == Abc_NtkCoNum(pNtk) );
337 assert( dd->size == Abc_NtkCiNum(pNtk) );
338 assert( dd->size <= 1000 );
341 nInputs = Abc_NtkCiNum(pNtk);
342 nOutputs = Abc_NtkCoNum(pNtk);
343 nProducts = (1 << nInputs);
346 fprintf( pFile,
".i %d\n", nInputs );
347 fprintf( pFile,
".o %d\n", nOutputs );
348 fprintf( pFile,
".ilb" );
351 fprintf( pFile,
"\n" );
352 fprintf( pFile,
".ob" );
355 fprintf( pFile,
"\n" );
356 fprintf( pFile,
".p %d\n", nProducts );
359 for ( k = 0; k < nProducts; k++ )
361 for ( i = 0; i < nInputs; i++ )
362 fprintf( pFile,
"%c",
'0' + (pValues[i] = ((k >> i) & 1)) );
363 fprintf( pFile,
" " );
364 for ( i = 0; i < nOutputs; i++ )
365 fprintf( pFile,
"%c",
'0' + (Cudd_ReadOne(dd) == Cudd_Eval(dd, (DdNode *)Vec_PtrEntry(vFuncs, i), pValues)) );
366 fprintf( pFile,
"\n" );
369 fprintf( pFile,
".e\n" );
384int Io_WriteMoPlaOne( FILE * pFile,
Abc_Ntk_t * pNtk )
392 assert( Abc_NtkIsStrash(pNtk) );
397 printf(
"Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
400 vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
402 Vec_PtrPush( vFuncsGlob, Abc_ObjGlobalBdd(pObj) );
405 Io_WriteMoPlaOneIntMinterms( pFile, pNtk, dd, vFuncsGlob );
410 Cudd_RecursiveDeref( dd, bFunc );
411 Vec_PtrFree( vFuncsGlob );
430 assert( Abc_NtkIsStrash(pNtk) );
431 if ( Abc_NtkCiNum(pNtk) > 16 )
433 printf(
"Cannot write multi-output PLA for more than 16 inputs.\n" );
436 pFile = fopen( pFileName,
"w" );
439 fprintf( stdout,
"Io_WritePla(): Cannot open the output file.\n" );
443 Io_WriteMoPlaOne( pFile, pNtk );
461int Io_WriteMoPlaOneIntMintermsM( FILE * pFile,
Abc_Ntk_t * pNtk, DdManager * dd, DdNode * bFunc,
int nMints )
465 DdNode ** pbMints = Cudd_bddPickArbitraryMinterms( dd, bFunc, dd->vars, dd->size, nMints );
466 int i, k, nInputs = Abc_NtkCiNum(pNtk);
467 assert( dd->size == Abc_NtkCiNum(pNtk) );
470 fprintf( pFile,
".i %d\n", nInputs );
471 fprintf( pFile,
".o %d\n", 1 );
472 fprintf( pFile,
".ilb" );
475 fprintf( pFile,
"\n" );
476 fprintf( pFile,
".ob" );
477 fprintf( pFile,
" %s",
Abc_ObjName(Abc_NtkCo(pNtk, 0)) );
478 fprintf( pFile,
"\n" );
479 fprintf( pFile,
".p %d\n", nMints );
482 for ( k = 0; k < nMints; k++ )
484 Cudd_BddToCubeArray( dd, pbMints[k], pArray );
485 for ( i = 0; i < Abc_NtkCiNum(pNtk); i++ )
486 if ( pArray[i] == 0 )
487 fprintf( pFile,
"%c",
'0' );
488 else if ( pArray[i] == 1 )
489 fprintf( pFile,
"%c",
'1' );
490 else if ( pArray[i] == 2 )
491 fprintf( pFile,
"%c",
'-' );
492 fprintf( pFile,
" " );
493 fprintf( pFile,
"%c",
'1' );
494 fprintf( pFile,
"\n" );
496 fprintf( pFile,
".e\n" );
504int Io_WriteMoPlaOneM( FILE * pFile,
Abc_Ntk_t * pNtk,
int nMints )
512 if ( Abc_NtkIsStrash(pNtk) )
514 assert( Abc_NtkIsStrash(pNtk) );
519 printf(
"Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
522 vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
524 Vec_PtrPush( vFuncsGlob, Abc_ObjGlobalBdd(pObj) );
527 bFunc = (DdNode *)Vec_PtrEntry(vFuncsGlob, 0);
528 if ( bFunc == Cudd_ReadOne(dd) )
529 printf(
"First primary output has constant 1 function.\n" );
530 else if ( Cudd_Not(bFunc) == Cudd_ReadOne(dd) )
531 printf(
"First primary output has constant 0 function.\n" );
533 Io_WriteMoPlaOneIntMintermsM( pFile, pNtk, dd, bFunc, nMints );
538 Cudd_RecursiveDeref( dd, bFunc );
539 Vec_PtrFree( vFuncsGlob );
543 else if ( Abc_NtkIsBddLogic(pNtk) )
545 DdNode * bFunc = (DdNode *)Abc_ObjFanin0(Abc_NtkCo(pNtk, 0))->pData;
547 if ( dd->size == Abc_NtkCiNum(pNtk) )
548 Io_WriteMoPlaOneIntMintermsM( pFile, pNtk, dd, bFunc, nMints );
551 printf(
"Cannot write minterms because the size of the manager for local BDDs is not equal to\n" );
552 printf(
"the number of primary inputs. (It is likely that the current network is not collapsed.)\n" );
560 assert( Abc_NtkIsStrash(pNtk) || Abc_NtkIsBddLogic(pNtk) );
561 pFile = fopen( pFileName,
"w" );
564 fprintf( stdout,
"Io_WriteMoPlaM(): Cannot open the output file.\n" );
568 Io_WriteMoPlaOneM( pFile, pNtk, nMints );
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
#define Abc_ObjForEachFanin(pObj, pFanin, i)
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void * Abc_NtkFreeGlobalBdds(Abc_Ntk_t *pNtk, int fFreeMan)
ABC_DLL int Abc_NodeIsConst(Abc_Obj_t *pNode)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
#define Abc_SopForEachCube(pSop, nFanins, pCube)
ABC_DLL void * Abc_NtkBuildGlobalBdds(Abc_Ntk_t *pNtk, int fBddSizeMax, int fDropInternal, int fReorder, int fReverse, int fVerbose)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL int Abc_SopIsComplement(char *pSop)
ABC_DLL int Abc_SopGetCubeNum(char *pSop)
ABC_DLL int Abc_NodeIsConst1(Abc_Obj_t *pNode)
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
ABC_NAMESPACE_IMPL_START int Io_WritePlaOne(FILE *pFile, Abc_Ntk_t *pNtk)
DECLARATIONS ///.
int Io_WriteMoPla(Abc_Ntk_t *pNtk, char *pFileName)
int Io_WritePla(Abc_Ntk_t *pNtk, char *pFileName)
int Io_WriteMoPlaM(Abc_Ntk_t *pNtk, char *pFileName, int nMints)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.