From 0dcdbc2a6a4828a290f50679db16d138468bde05 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Thu, 19 Feb 2015 14:46:06 -0800 Subject: Performance bug fix in 'clp' (different way of removing redundant fanins). --- src/base/abci/abcCollapse.c | 69 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'src/base/abci/abcCollapse.c') 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,10 +31,77 @@ 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.] @@ -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 ); -- cgit v1.2.3