diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2015-02-19 14:46:06 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2015-02-19 14:46:06 -0800 |
commit | 0dcdbc2a6a4828a290f50679db16d138468bde05 (patch) | |
tree | 2325dc2ac13a73fa36c25e146998d77ea7d2bb26 /src | |
parent | e3f87e189c880251c579b9fd22c04ca70b80f63d (diff) | |
download | abc-0dcdbc2a6a4828a290f50679db16d138468bde05.tar.gz abc-0dcdbc2a6a4828a290f50679db16d138468bde05.tar.bz2 abc-0dcdbc2a6a4828a290f50679db16d138468bde05.zip |
Performance bug fix in 'clp' (different way of removing redundant fanins).
Diffstat (limited to 'src')
-rw-r--r-- | src/base/abc/abcMinBase.c | 2 | ||||
-rw-r--r-- | src/base/abci/abcCollapse.c | 69 |
2 files changed, 69 insertions, 2 deletions
diff --git a/src/base/abc/abcMinBase.c b/src/base/abc/abcMinBase.c index 3c532611..b6a32885 100644 --- a/src/base/abc/abcMinBase.c +++ b/src/base/abc/abcMinBase.c @@ -28,7 +28,7 @@ ABC_NAMESPACE_IMPL_START /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -static int Abc_NodeSupport( DdNode * bFunc, Vec_Str_t * vSupport, int nVars ); +extern int Abc_NodeSupport( DdNode * bFunc, Vec_Str_t * vSupport, int nVars ); //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// diff --git a/src/base/abci/abcCollapse.c b/src/base/abci/abcCollapse.c index 76a6f009..dada7765 100644 --- a/src/base/abci/abcCollapse.c +++ b/src/base/abci/abcCollapse.c @@ -31,12 +31,79 @@ ABC_NAMESPACE_IMPL_START static Abc_Ntk_t * Abc_NtkFromGlobalBdds( Abc_Ntk_t * pNtk ); static Abc_Obj_t * Abc_NodeFromGlobalBdds( Abc_Ntk_t * pNtkNew, DdManager * dd, DdNode * bFunc ); +extern int Abc_NodeSupport( DdNode * bFunc, Vec_Str_t * vSupport, int nVars ); + //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* + Synopsis [Makes nodes minimum base.] + + Description [Returns the number of changed nodes.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_NodeMinimumBase2( Abc_Obj_t * pNode ) +{ + Vec_Str_t * vSupport; + Vec_Ptr_t * vFanins; + DdNode * bTemp; + int i, nVars; + + assert( Abc_NtkIsBddLogic(pNode->pNtk) ); + assert( Abc_ObjIsNode(pNode) ); + + // compute support + vSupport = Vec_StrAlloc( 10 ); + nVars = Abc_NodeSupport( Cudd_Regular(pNode->pData), vSupport, Abc_ObjFaninNum(pNode) ); + if ( nVars == Abc_ObjFaninNum(pNode) ) + { + Vec_StrFree( vSupport ); + return 0; + } + + // add fanins + vFanins = Vec_PtrAlloc( Abc_ObjFaninNum(pNode) ); + Abc_NodeCollectFanins( pNode, vFanins ); + Vec_IntClear( &pNode->vFanins ); + for ( i = 0; i < vFanins->nSize; i++ ) + if ( vSupport->pArray[i] != 0 ) // useful + Vec_IntPush( &pNode->vFanins, Abc_ObjId((Abc_Obj_t *)vFanins->pArray[i]) ); + assert( nVars == Abc_ObjFaninNum(pNode) ); + + // update the function of the node + pNode->pData = Extra_bddRemapUp( (DdManager *)pNode->pNtk->pManFunc, bTemp = (DdNode *)pNode->pData ); Cudd_Ref( (DdNode *)pNode->pData ); + Cudd_RecursiveDeref( (DdManager *)pNode->pNtk->pManFunc, bTemp ); + Vec_PtrFree( vFanins ); + Vec_StrFree( vSupport ); + return 1; +} +int Abc_NtkMinimumBase2( Abc_Ntk_t * pNtk ) +{ + Abc_Obj_t * pNode, * pFanin; + int i, k, Counter; + assert( Abc_NtkIsBddLogic(pNtk) ); + // remove all fanouts + Abc_NtkForEachObj( pNtk, pNode, i ) + Vec_IntClear( &pNode->vFanouts ); + // add useful fanins + Counter = 0; + Abc_NtkForEachNode( pNtk, pNode, i ) + Counter += Abc_NodeMinimumBase2( pNode ); + // add fanouts + Abc_NtkForEachObj( pNtk, pNode, i ) + Abc_ObjForEachFanin( pNode, pFanin, k ) + Vec_IntPush( &pFanin->vFanouts, Abc_ObjId(pNode) ); + return Counter; +} + +/**Function************************************************************* + Synopsis [Collapses the network.] Description [] @@ -76,7 +143,7 @@ Abc_Ntk_t * Abc_NtkCollapse( Abc_Ntk_t * pNtk, int fBddSizeMax, int fDualRail, i // pNtk->pManGlob = NULL; // make the network minimum base - Abc_NtkMinimumBase( pNtkNew ); + Abc_NtkMinimumBase2( pNtkNew ); if ( pNtk->pExdc ) pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc ); |