39static DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd,
Abc_Obj_t * pNodeOld,
Vec_Ptr_t * vFanins );
40static DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd,
Abc_Obj_t * pNodeOld,
Vec_Ptr_t * vFaninsOld );
42static void Abc_NtkMultiSetBounds(
Abc_Ntk_t * pNtk,
int nThresh,
int nFaninMax );
43static void Abc_NtkMultiSetBoundsCnf(
Abc_Ntk_t * pNtk );
44static void Abc_NtkMultiSetBoundsMulti(
Abc_Ntk_t * pNtk,
int nThresh );
45static void Abc_NtkMultiSetBoundsSimple(
Abc_Ntk_t * pNtk );
46static void Abc_NtkMultiSetBoundsFactor(
Abc_Ntk_t * pNtk );
68 assert( Abc_NtkIsStrash(pNtk) );
74 printf(
"Warning: The choice nodes in the AIG are removed by renoding.\n" );
78 Abc_NtkMultiSetBoundsCnf( pNtk );
80 Abc_NtkMultiSetBoundsMulti( pNtk, nThresh );
82 Abc_NtkMultiSetBoundsSimple( pNtk );
84 Abc_NtkMultiSetBoundsFactor( pNtk );
86 Abc_NtkMultiSetBounds( pNtk, nThresh, nFaninMax );
90 Abc_NtkMultiInt( pNtk, pNtkNew );
112 printf(
"Abc_NtkMulti: The network check has failed.\n" );
133 Abc_Obj_t * pNode, * pConst1, * pNodeNew;
138 if ( Abc_ObjFanoutNum(pConst1) > 0 )
140 pNodeNew = Abc_NtkCreateNode( pNtkNew );
141 pNodeNew->
pData = Cudd_ReadOne( (DdManager *)pNtkNew->
pManFunc ); Cudd_Ref( (DdNode *)pNodeNew->
pData );
142 pConst1->
pCopy = pNodeNew;
149 Extra_ProgressBarUpdate( pProgress, i, NULL );
150 if ( Abc_ObjIsCi(Abc_ObjFanin0(pNode)) )
152 Abc_NtkMulti_rec( pNtkNew, Abc_ObjFanin0(pNode) );
181 assert( !Abc_ObjIsComplement(pNodeOld) );
183 if ( pNodeOld->
pCopy )
184 return pNodeOld->
pCopy;
185 assert( Abc_ObjIsNode(pNodeOld) );
186 assert( !Abc_AigNodeIsConst(pNodeOld) );
192 vCone = Vec_PtrAlloc( 10 );
193 Abc_NtkMultiCone( pNodeOld, vCone );
196 pNodeNew = Abc_NtkCreateNode( pNtkNew );
197 for ( i = 0; i < vCone->nSize; i++ )
201 pNodeNew->
pData = Abc_NtkMultiDeriveBdd( (DdManager *)pNtkNew->
pManFunc, pNodeOld, vCone );
202 Cudd_Ref( (DdNode *)pNodeNew->
pData );
203 Vec_PtrFree( vCone );
206 pNodeOld->
pCopy = pNodeNew;
207 return pNodeOld->
pCopy;
222DdNode * Abc_NtkMultiDeriveBdd( DdManager * dd,
Abc_Obj_t * pNodeOld,
Vec_Ptr_t * vFaninsOld )
227 assert( !Abc_AigNodeIsConst(pNodeOld) );
228 assert( Abc_ObjIsNode(pNodeOld) );
230 for ( i = 0; i < vFaninsOld->nSize; i++ )
232 pFaninOld = (
Abc_Obj_t *)vFaninsOld->pArray[i];
233 pFaninOld->
pData = Cudd_bddIthVar( dd, i ); Cudd_Ref( (DdNode *)pFaninOld->
pData );
237 bFunc = Abc_NtkMultiDeriveBdd_rec( dd, pNodeOld, vFaninsOld ); Cudd_Ref( bFunc );
239 for ( i = 0; i < vFaninsOld->nSize; i++ )
241 pFaninOld = (
Abc_Obj_t *)vFaninsOld->pArray[i];
242 Cudd_RecursiveDeref( dd, (DdNode *)pFaninOld->
pData );
260DdNode * Abc_NtkMultiDeriveBdd_rec( DdManager * dd,
Abc_Obj_t * pNode,
Vec_Ptr_t * vFanins )
262 DdNode * bFunc, * bFunc0, * bFunc1;
263 assert( !Abc_ObjIsComplement(pNode) );
268 return (DdNode *)pNode->
pData;
272 Vec_PtrPush( vFanins, pNode );
274 bFunc0 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,0), vFanins ); Cudd_Ref( bFunc0 );
275 bFunc1 = Abc_NtkMultiDeriveBdd_rec( dd, Abc_ObjFanin(pNode,1), vFanins ); Cudd_Ref( bFunc1 );
276 bFunc0 = Cudd_NotCond( bFunc0, (
long)Abc_ObjFaninC0(pNode) );
277 bFunc1 = Cudd_NotCond( bFunc1, (
long)Abc_ObjFaninC1(pNode) );
279 bFunc = Cudd_bddAnd( dd, bFunc0, bFunc1 ); Cudd_Ref( bFunc );
280 Cudd_RecursiveDeref( dd, bFunc0 );
281 Cudd_RecursiveDeref( dd, bFunc1 );
283 pNode->
pData = bFunc;
301int Abc_NtkMultiLimit_rec(
Abc_Obj_t * pNode,
Vec_Ptr_t * vCone,
int nFaninMax,
int fCanStop,
int fFirst )
303 int nNodes0, nNodes1;
304 assert( !Abc_ObjIsComplement(pNode) );
306 if ( !fFirst && (pNode->
fMarkA || !Abc_ObjIsNode(pNode)) )
308 Vec_PtrPushUnique( vCone, pNode );
314 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 0, 0 );
315 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
319 assert( vCone->nSize == 0 );
320 if ( Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,0), vCone, nFaninMax, 1, 0 ) )
323 nNodes0 = vCone->nSize;
324 assert( nNodes0 <= nFaninMax );
325 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
327 if ( vCone->nSize <= nFaninMax )
333 Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 0, 0 );
335 if ( vCone->nSize > nFaninMax )
339 RetValue = Abc_NtkMultiLimit_rec( Abc_ObjFanin(pNode,1), vCone, nFaninMax, 1, 0 );
344 nNodes1 = vCone->nSize;
345 assert( nNodes1 <= nFaninMax );
346 if ( nNodes0 >= nNodes1 )
348 assert( Abc_ObjFanin(pNode,0)->fMarkA == 0 );
349 Abc_ObjFanin(pNode,0)->fMarkA = 1;
353 assert( Abc_ObjFanin(pNode,1)->fMarkA == 0 );
354 Abc_ObjFanin(pNode,1)->fMarkA = 1;
373 return Abc_NtkMultiLimit_rec( pNode, vCone, nFaninMax, 1, 1 );
388void Abc_NtkMultiSetBounds(
Abc_Ntk_t * pNtk,
int nThresh,
int nFaninMax )
392 int i, nFanouts, nConeSize;
405 nFanouts = Abc_ObjFanoutNum(pNode);
407 if ( (nFanouts - 1) * nConeSize > nThresh )
413 Abc_ObjFanin0(pNode)->fMarkA = 1;
424 while ( Abc_NtkMultiLimit(pNode, vCone, nFaninMax) );
425 assert( vCone->nSize <= nFaninMax );
455void Abc_NtkMultiSetBoundsCnf(
Abc_Ntk_t * pNtk )
471 if ( Abc_ObjFanoutNum(pNode) > 1 )
477 Abc_ObjFanin0( Abc_ObjFanin0(pNode) )->fMarkA = 1;
478 Abc_ObjFanin0( Abc_ObjFanin1(pNode) )->fMarkA = 1;
479 Abc_ObjFanin1( Abc_ObjFanin0(pNode) )->fMarkA = 1;
480 Abc_ObjFanin1( Abc_ObjFanin1(pNode) )->fMarkA = 1;
484 if ( Abc_ObjFaninC0(pNode) )
485 Abc_ObjFanin0(pNode)->fMarkA = 1;
486 if ( Abc_ObjFaninC1(pNode) )
487 Abc_ObjFanin1(pNode)->fMarkA = 1;
493 Abc_ObjFanin0(pNode)->fMarkA = 1;
503 Abc_ObjFanin0(pNode)->fMarkA == 0 &&
504 Abc_ObjFanin1(pNode)->fMarkA == 0 )
521void Abc_NtkMultiSetBoundsMulti(
Abc_Ntk_t * pNtk,
int nThresh )
524 int i, nFanouts, nConeSize;
540 nFanouts = Abc_ObjFanoutNum(pNode);
542 if ( (nFanouts - 1) * nConeSize > nThresh )
545 if ( Abc_ObjFaninC0(pNode) )
546 Abc_ObjFanin0(pNode)->fMarkA = 1;
547 if ( Abc_ObjFaninC1(pNode) )
548 Abc_ObjFanin1(pNode)->fMarkA = 1;
553 Abc_ObjFanin0(pNode)->fMarkA = 1;
567void Abc_NtkMultiSetBoundsSimple(
Abc_Ntk_t * pNtk )
590void Abc_NtkMultiSetBoundsFactor(
Abc_Ntk_t * pNtk )
602 Abc_ObjFanin0(pNode)->fMarkA = 1;
618 assert( !Abc_ObjIsComplement(pNode) );
619 if ( pNode->
fMarkA || !Abc_ObjIsNode(pNode) )
621 Vec_PtrPushUnique( vCone, pNode );
624 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone );
625 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone );
641 assert( !Abc_ObjIsComplement(pNode) );
642 assert( Abc_ObjIsNode(pNode) );
644 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,0), vCone );
645 Abc_NtkMultiCone_rec( Abc_ObjFanin(pNode,1), vCone );
ABC_NAMESPACE_IMPL_START Abc_Ntk_t * Abc_NtkMulti(Abc_Ntk_t *pNtk, int nThresh, int nFaninMax, int fCnf, int fMulti, int fSimple, int fFactor)
DECLARATIONS ///.
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
ABC_DLL int Abc_NodeMffcSize(Abc_Obj_t *pNode)
FUNCTION DEFINITIONS ///.
ABC_DLL int Abc_NodeMffcSizeStop(Abc_Obj_t *pNode)
ABC_DLL int Abc_NtkGetChoiceNum(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_NtkFinalize(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkNew)
ABC_DLL int Abc_NodeIsMuxControlType(Abc_Obj_t *pNode)
ABC_DLL int Abc_NtkLogicMakeSimpleCos(Abc_Ntk_t *pNtk, int fDuplicate)
ABC_DLL int Abc_NtkMinimumBase(Abc_Ntk_t *pNtk)
DECLARATIONS ///.
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NodeIsMuxType(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)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.