diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2008-04-10 08:01:00 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2008-04-10 08:01:00 -0700 |
commit | c645bac3663c265470024b44ed91b0afdbe59b88 (patch) | |
tree | f213e6bff5697e1ffae3cc95b874b924dfad6ffb /src/aig/ntl/ntlSweep.c | |
parent | 9d6b12ddfdeda36038441520af66e0c20297bcb7 (diff) | |
download | abc-c645bac3663c265470024b44ed91b0afdbe59b88.tar.gz abc-c645bac3663c265470024b44ed91b0afdbe59b88.tar.bz2 abc-c645bac3663c265470024b44ed91b0afdbe59b88.zip |
Version abc80410
Diffstat (limited to 'src/aig/ntl/ntlSweep.c')
-rw-r--r-- | src/aig/ntl/ntlSweep.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/aig/ntl/ntlSweep.c b/src/aig/ntl/ntlSweep.c new file mode 100644 index 00000000..3b9cd61f --- /dev/null +++ b/src/aig/ntl/ntlSweep.c @@ -0,0 +1,165 @@ +/**CFile**************************************************************** + + FileName [ntlSweep.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Netlist representation.] + + Synopsis [Performs structural sweep of the netlist.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: ntlSweep.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "ntl.h" + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Detects logic that does not fanout into POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Ntl_ManSweepMark_rec( Ntl_Man_t * p, Ntl_Obj_t * pObj ) +{ + Ntl_Net_t * pNet; + int i; + if ( pObj->fMark ) + return; + pObj->fMark = 1; + Ntl_ObjForEachFanin( pObj, pNet, i ) + Ntl_ManSweepMark_rec( p, pNet->pDriver ); +} + +/**Function************************************************************* + + Synopsis [Detects logic that does not fanout into POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Ntl_ManSweepMark( Ntl_Man_t * p ) +{ + Ntl_Mod_t * pRoot; + Ntl_Obj_t * pObj; + int i; + // get the root model + pRoot = Ntl_ManRootModel( p ); + // clear net visited flags + Ntl_ModelForEachObj( pRoot, pObj, i ) + assert( pObj->fMark == 0 ); + // label the primary inputs + Ntl_ModelForEachPi( pRoot, pObj, i ) + pObj->fMark = 1; + // start from the primary outputs + Ntl_ModelForEachPo( pRoot, pObj, i ) + Ntl_ManSweepMark_rec( p, pObj ); +} + +/**Function************************************************************* + + Synopsis [Derives new netlist by sweeping current netlist with the current AIG.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Ntl_Man_t * Ntl_ManSweep( Ntl_Man_t * p, Aig_Man_t * pAig, int fVerbose ) +{ + int nObjsOld[NTL_OBJ_VOID]; + Ntl_Man_t * pNew; + Ntl_Mod_t * pRoot; + Ntl_Net_t * pNet; + Ntl_Obj_t * pObj; + int i, k, nNetsOld; + + // insert the AIG into the netlist + pNew = Ntl_ManInsertAig( p, pAig ); + if ( pNew == NULL ) + { + printf( "Ntl_ManSweep(): Inserting AIG has failed.\n" ); + return NULL; + } + + // remember the number of objects + pRoot = Ntl_ManRootModel( pNew ); + for ( i = 0; i < NTL_OBJ_VOID; i++ ) + nObjsOld[i] = pRoot->nObjs[i]; + nNetsOld = Ntl_ModelCountNets(pRoot); + + // mark the nets that do not fanout into POs + Ntl_ManSweepMark( pNew ); + + // remove the useless objects and their nets + Ntl_ModelForEachObj( pRoot, pObj, i ) + { + if ( pObj->fMark ) + { + pObj->fMark = 0; + continue; + } + // remove the fanout nets + Ntl_ObjForEachFanout( pObj, pNet, k ) + Ntl_ModelDeleteNet( pRoot, Ntl_ObjFanout0(pObj) ); + // remove the object + if ( Ntl_ObjIsNode(pObj) && Ntl_ObjFaninNum(pObj) == 1 ) + pRoot->nObjs[NTL_OBJ_LUT1]--; + else + pRoot->nObjs[pObj->Type]--; + Vec_PtrWriteEntry( pRoot->vObjs, pObj->Id, NULL ); + pObj->Id = NTL_OBJ_NONE; + } + + // print detailed statistics of sweeping + if ( fVerbose ) + { + printf( "Sweep:" ); + printf( " Node = %d (%4.1f %%)", + nObjsOld[NTL_OBJ_NODE] - pRoot->nObjs[NTL_OBJ_NODE], + !nObjsOld[NTL_OBJ_NODE]? 0.0: 100.0 * (nObjsOld[NTL_OBJ_NODE] - pRoot->nObjs[NTL_OBJ_NODE]) / nObjsOld[NTL_OBJ_NODE] ); + printf( " Buf/Inv = %d (%4.1f %%)", + nObjsOld[NTL_OBJ_LUT1] - pRoot->nObjs[NTL_OBJ_LUT1], + !nObjsOld[NTL_OBJ_LUT1]? 0.0: 100.0 * (nObjsOld[NTL_OBJ_LUT1] - pRoot->nObjs[NTL_OBJ_LUT1]) / nObjsOld[NTL_OBJ_LUT1] ); + printf( " Lat = %d (%4.1f %%)", + nObjsOld[NTL_OBJ_LATCH] - pRoot->nObjs[NTL_OBJ_LATCH], + !nObjsOld[NTL_OBJ_LATCH]? 0.0: 100.0 * (nObjsOld[NTL_OBJ_LATCH] - pRoot->nObjs[NTL_OBJ_LATCH]) / nObjsOld[NTL_OBJ_LATCH] ); + printf( " Box = %d (%4.1f %%)", + nObjsOld[NTL_OBJ_BOX] - pRoot->nObjs[NTL_OBJ_BOX], + !nObjsOld[NTL_OBJ_BOX]? 0.0: 100.0 * (nObjsOld[NTL_OBJ_BOX] - pRoot->nObjs[NTL_OBJ_BOX]) / nObjsOld[NTL_OBJ_BOX] ); + printf( "\n" ); +// printf( "Also, sweep reduced %d nets.\n", nNetsOld - Ntl_ModelCountNets(pRoot) ); + } + return pNew; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + |