37static Abc_Ntk_t * Abc_NtkDsdInternal(
Abc_Ntk_t * pNtk,
int fVerbose,
int fPrint,
int fShort );
43static int Abc_NodeIsForDsd(
Abc_Obj_t * pNode );
44static int Abc_NodeFindMuxVar( DdManager * dd, DdNode * bFunc,
int nVars );
69 assert( Abc_NtkIsStrash(pNtk) );
74 printf(
"Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
76 pNtkNew = Abc_NtkDsdInternal( pNtk, fVerbose, fPrint, fShort );
78 if ( pNtkNew == NULL )
85 printf(
"Abc_NtkDsdGlobal: The network check has failed.\n" );
103Abc_Ntk_t * Abc_NtkDsdInternal(
Abc_Ntk_t * pNtk,
int fVerbose,
int fPrint,
int fShort )
105 char ** ppNamesCi, ** ppNamesCo;
114 vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
116 Vec_PtrPush( vFuncsGlob, Cudd_NotCond(Abc_ObjGlobalBdd(pObj), Abc_ObjFaninC0(pObj)) );
119 dd = (DdManager *)Abc_NtkGlobalBddMan(pNtk);
121 if ( pManDsd == NULL )
123 Vec_PtrFree( vFuncsGlob );
127 Dsd_Decompose( pManDsd, (DdNode **)vFuncsGlob->pArray, Abc_NtkCoNum(pNtk) );
128 Vec_PtrFree( vFuncsGlob );
134 Cudd_bddIthVar( (DdManager *)pNtkNew->
pManFunc, dd->size-1 );
136 Abc_NtkDsdConstruct( pManDsd, pNtk, pNtkNew );
146 Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, fShort, -1, 0 );
173 Abc_Obj_t * pNode, * pNodeNew, * pDriver;
187 for ( i = 0; i < nNodesDsd; i++ )
188 Abc_NtkDsdConstructNode( pManDsd, ppNodesDsd[i], pNtkNew, NULL );
194 pDriver = Abc_ObjFanin0( pNode );
195 if ( !Abc_ObjIsNode(pDriver) )
197 if ( !Abc_AigNodeIsAnd(pDriver) )
201 assert( !Abc_ObjIsComplement(pNodeNew) );
220 DdManager * ddNew = (DdManager *)pNtkNew->
pManFunc;
223 DdNode * bLocal = NULL, * bTemp, * bVar;
228 pNodeNew = Abc_NtkCreateNode( pNtkNew );
233 for ( i = 0; i < nDecs; i++ )
242 ddNew = (DdManager *)pNtkNew->
pManFunc;
247 bLocal = ddNew->one; Cudd_Ref( bLocal );
252 bLocal = Cudd_Not(ddNew->one); Cudd_Ref( bLocal );
253 for ( i = 0; i < nDecs; i++ )
257 bLocal = Cudd_bddOr( ddNew, bTemp = bLocal, bVar ); Cudd_Ref( bLocal );
258 Cudd_RecursiveDeref( ddNew, bTemp );
264 bLocal = Cudd_Not(ddNew->one); Cudd_Ref( bLocal );
265 for ( i = 0; i < nDecs; i++ )
267 bLocal = Cudd_bddXor( ddNew, bTemp = bLocal, ddNew->vars[i] ); Cudd_Ref( bLocal );
268 Cudd_RecursiveDeref( ddNew, bTemp );
290 Cudd_RecursiveDeref( ddDsd, bTemp );
300 pNodeNew->
pData = bLocal;
324 DdManager * dd = (DdManager *)pNtk->
pManFunc;
327 int pCounters[11] = {0};
329 assert( Abc_NtkIsBddLogic(pNtk) );
338 vNodes = Abc_NtkCollectNodesForDsd( pNtk );
339 for ( i = 0; i < vNodes->nSize; i++ )
340 Abc_NodeDecompDsdAndMux( (
Abc_Obj_t *)vNodes->pArray[i], vNodes, pManDsd, fRecursive, pCounters );
341 Vec_PtrFree( vNodes );
345 printf(
"Number of non-decomposable functions:\n" );
346 for ( i = 3; i < 10; i++ )
347 printf(
"Inputs = %d. Functions = %6d.\n", i, pCounters[i] );
348 printf(
"Inputs > %d. Functions = %6d.\n", 9, pCounters[10] );
357 printf(
"Abc_NtkDsdRecursive: The network check has failed.\n" );
380 vNodes = Vec_PtrAlloc( 100 );
383 if ( Abc_NodeIsForDsd(pNode) )
384 Vec_PtrPush( vNodes, pNode );
403 Abc_Obj_t * pRoot = NULL, * pFanin, * pNode1, * pNode2, * pNodeC;
404 Dsd_Node_t ** ppNodesDsd, * pNodeDsd, * pFaninDsd;
405 int i, nNodesDsd, iVar, fCompl;
425 for ( i = 0; i < nNodesDsd; i++ )
427 pRoot = Abc_NtkDsdConstructNode( pManDsd, ppNodesDsd[i], pNode->
pNtk, pCounters );
428 if ( Abc_NodeIsForDsd(pRoot) && fRecursive )
429 Vec_PtrPush( vNodes, pRoot );
439 Cudd_RecursiveDeref( dd, (DdNode *)pNode->
pData );
440 pNode->
pData = Cudd_NotCond( (DdNode *)dd->vars[0], fCompl ); Cudd_Ref( (DdNode *)pNode->
pData );
445 iVar = Abc_NodeFindMuxVar( dd, (DdNode *)pNode->
pData, Abc_ObjFaninNum(pNode) );
446 pNodeC = Abc_ObjFanin( pNode, iVar );
450 pNode1->pData = Cudd_Cofactor( dd, (DdNode *)pNode->
pData, Cudd_Not(dd->vars[iVar]) ); Cudd_Ref( (DdNode *)pNode1->pData );
452 if ( Abc_NodeIsForDsd(pNode1) )
453 Vec_PtrPush( vNodes, pNode1 );
457 pNode2->pData = Cudd_Cofactor( dd, (DdNode *)pNode->
pData, dd->vars[iVar] ); Cudd_Ref( (DdNode *)pNode2->pData );
459 if ( Abc_NodeIsForDsd(pNode2) )
460 Vec_PtrPush( vNodes, pNode2 );
469 Cudd_RecursiveDeref( dd, (DdNode *)pNode->
pData );
470 pNode->
pData = Cudd_bddIte( dd, dd->vars[0], dd->vars[1], dd->vars[2] ); Cudd_Ref( (DdNode *)pNode->
pData );
489 assert( Abc_ObjIsNode(pNode) );
508 if ( Abc_ObjFaninNum(pNode) > 2 )
524int Abc_NodeFindMuxVar( DdManager * dd, DdNode * bFunc,
int nVars )
526 DdNode * bVar, * bCof0, * bCof1;
527 int SuppSumMin = 1000000;
528 int i, nSSD, nSSQ, iVar;
532 for ( i = 0; i < nVars; i++ )
536 bCof0 = Cudd_Cofactor( dd, bFunc, Cudd_Not(bVar) ); Cudd_Ref( bCof0 );
537 bCof1 = Cudd_Cofactor( dd, bFunc, bVar ); Cudd_Ref( bCof1 );
544 nSSD = Cudd_SupportSize( dd, bCof0 );
545 nSSQ = Cudd_SupportSize( dd, bCof1 );
552 Cudd_RecursiveDeref( dd, bCof0 );
553 Cudd_RecursiveDeref( dd, bCof1 );
555 if ( SuppSumMin > nSSD + nSSQ )
557 SuppSumMin = nSSD + nSSQ;
576DdNode * Extra_bddComputeSum( DdManager * dd, DdNode ** pbCubes,
int nCubes )
578 DdNode * bRes, * bTemp;
580 bRes =
b0; Cudd_Ref( bRes );
581 for ( i = 0; i < nCubes; i++ )
583 bRes = Cudd_bddOr( dd, bTemp = bRes, pbCubes[i] ); Cudd_Ref( bRes );
584 Cudd_RecursiveDeref( dd, bTemp );
601DdNode * Abc_NtkSparsifyInternalOne( DdManager * ddNew, DdNode * bFunc,
int nFanins,
int nPerc )
603 int nSpace = (int)Cudd_CountMinterm( ddNew, bFunc, nFanins );
604 int i, nMints = Abc_MaxInt( 1, (
int)(0.01 * nPerc * nSpace) );
605 DdNode ** pbMints = Cudd_bddPickArbitraryMinterms( ddNew, bFunc, ddNew->vars, nFanins, nMints );
607 for ( i = 0; i < nMints; i++ )
608 Cudd_Ref( pbMints[i] );
609 bRes = Extra_bddComputeSum( ddNew, pbMints, nMints ); Cudd_Ref( bRes );
610 for ( i = 0; i < nMints; i++ )
611 Cudd_RecursiveDeref( ddNew, pbMints[i] );
620 DdNode * bFunc, * bFuncOld;
631 ddNew = (DdManager *)pNtkNew->
pManFunc;
632 Cudd_bddIthVar( ddNew, Abc_NtkCiNum(pNtk)-1 );
636 pDriver = Abc_ObjFanin0( pObj );
637 if ( Abc_ObjIsCi(pDriver) )
648 if ( Abc_ObjFaninNum(pDriver) == 0 )
659 assert( Abc_ObjFaninNum(pObj) > 0 );
661 for ( c = 0; c < 2; c++ )
667 bFuncOld = Cudd_NotCond( (DdNode *)pDriver->
pCopy->
pData, c );
668 bFunc = Abc_NtkSparsifyInternalOne( ddNew, bFuncOld, Abc_ObjFaninNum(pDriver), nPerc ); Cudd_Ref( bFunc );
669 Cudd_RecursiveDeref( ddNew, bFuncOld );
682 assert( Abc_NtkIsComb(pNtk) );
683 assert( Abc_NtkIsBddLogic(pNtk) );
684 pNtkNew = Abc_NtkSparsifyInternal( pNtk, nPerc, fVerbose );
685 if ( pNtkNew == NULL )
689 printf(
"Abc_NtkSparsify: The network check has failed.\n" );
Abc_Ntk_t * Abc_NtkDsdGlobal(Abc_Ntk_t *pNtk, int fVerbose, int fPrint, int fShort)
ABC_NAMESPACE_IMPL_START Abc_Ntk_t * Abc_NtkSparsify(Abc_Ntk_t *pNtk, int nPerc, int fVerbose)
DECLARATIONS ///.
int Abc_NtkDsdLocal(Abc_Ntk_t *pNtk, int fVerbose, int fRecursive)
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL Abc_Ntk_t * Abc_NtkAlloc(Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan)
DECLARATIONS ///.
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
ABC_DLL Abc_Obj_t * Abc_NtkCreateNodeConst1(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Obj_t * Abc_NtkDupObj(Abc_Ntk_t *pNtkNew, Abc_Obj_t *pObj, int fCopyName)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
ABC_DLL Abc_Obj_t * Abc_NtkCreateNodeConst0(Abc_Ntk_t *pNtk)
#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 char * Abc_ObjAssignName(Abc_Obj_t *pObj, char *pName, char *pSuffix)
ABC_DLL void Abc_NtkFinalize(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkNew)
ABC_DLL void * Abc_NtkFreeGlobalBdds(Abc_Ntk_t *pNtk, int fFreeMan)
ABC_DLL int Abc_NtkLogicMakeSimpleCos(Abc_Ntk_t *pNtk, int fDuplicate)
ABC_DLL void * Abc_NtkBuildGlobalBdds(Abc_Ntk_t *pNtk, int fBddSizeMax, int fDropInternal, int fReorder, int fReverse, int fVerbose)
ABC_DLL char ** Abc_NtkCollectCioNames(Abc_Ntk_t *pNtk, int fCollectCos)
ABC_DLL int Abc_NtkMinimumBase(Abc_Ntk_t *pNtk)
DECLARATIONS ///.
ABC_DLL void Abc_ObjRemoveFanins(Abc_Obj_t *pObj)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Obj_t * Abc_NtkCloneObj(Abc_Obj_t *pNode)
ABC_DLL Abc_Ntk_t * Abc_NtkStartFrom(Abc_Ntk_t *pNtk, Abc_NtkType_t Type, Abc_NtkFunc_t Func)
ABC_DLL Abc_Ntk_t * Abc_NtkDup(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Obj_t * Abc_AigConst1(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachNode(pNtk, pNode, i)
ABC_DLL int Abc_NodeMinimumBase(Abc_Obj_t *pNode)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Dsd_Manager_t * Dsd_ManagerStart(DdManager *dd, int nSuppMax, int fVerbose)
FUNCTION DECLARATIONS ///.
Dsd_Node_t ** Dsd_TreeCollectNodesDfsOne(Dsd_Manager_t *pDsdMan, Dsd_Node_t *pNode, int *pnNodes)
void Dsd_NodeSetMark(Dsd_Node_t *p, word Mark)
void Dsd_TreePrint(FILE *pFile, Dsd_Manager_t *dMan, char *pInputNames[], char *pOutputNames[], int fShortNames, int Output, int OffSet)
Dsd_Node_t * Dsd_ManagerReadConst1(Dsd_Manager_t *pMan)
Dsd_Node_t * Dsd_NodeReadDec(Dsd_Node_t *p, int i)
enum Dsd_Type_t_ Dsd_Type_t
struct Dsd_Manager_t_ Dsd_Manager_t
TYPEDEF DEFINITIONS ///.
word Dsd_NodeReadMark(Dsd_Node_t *p)
Dsd_Node_t * Dsd_ManagerReadRoot(Dsd_Manager_t *pMan, int i)
void Dsd_TreePrint2(FILE *pFile, Dsd_Manager_t *dMan, char *pInputNames[], char *pOutputNames[], int Output)
Dsd_Node_t * Dsd_DecomposeOne(Dsd_Manager_t *pDsdMan, DdNode *bFunc)
void Dsd_ManagerStop(Dsd_Manager_t *dMan)
struct Dsd_Node_t_ Dsd_Node_t
DdNode * Dsd_TreeGetPrimeFunction(DdManager *dd, Dsd_Node_t *pNode)
FUNCTION DEFINITIONS ///.
DdManager * Dsd_ManagerReadDd(Dsd_Manager_t *pMan)
Dsd_Node_t * Dsd_ManagerReadInput(Dsd_Manager_t *pMan, int i)
int Dsd_NodeReadDecsNum(Dsd_Node_t *p)
Dsd_Node_t ** Dsd_TreeCollectNodesDfs(Dsd_Manager_t *dMan, int *pnNodes)
Dsd_Type_t Dsd_NodeReadType(Dsd_Node_t *p)
FUNCTION DEFINITIONS ///.
#define Dsd_IsComplement(p)
MACRO DEFINITIONS ///.
void Dsd_Decompose(Dsd_Manager_t *dMan, DdNode **pbFuncs, int nFuncs)
DECOMPOSITION FUNCTIONS ///.
unsigned __int64 word
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.