summaryrefslogtreecommitdiffstats
path: root/src/aig/ntl/ntlSweep.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2008-04-10 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2008-04-10 08:01:00 -0700
commitc645bac3663c265470024b44ed91b0afdbe59b88 (patch)
treef213e6bff5697e1ffae3cc95b874b924dfad6ffb /src/aig/ntl/ntlSweep.c
parent9d6b12ddfdeda36038441520af66e0c20297bcb7 (diff)
downloadabc-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.c165
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 ///
+////////////////////////////////////////////////////////////////////////
+
+