diff options
Diffstat (limited to 'src/aig/ntl/ntlUtil.c')
-rw-r--r-- | src/aig/ntl/ntlUtil.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/aig/ntl/ntlUtil.c b/src/aig/ntl/ntlUtil.c new file mode 100644 index 00000000..b13dd3a7 --- /dev/null +++ b/src/aig/ntl/ntlUtil.c @@ -0,0 +1,165 @@ +/**CFile**************************************************************** + + FileName [ntlUtil.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Netlist representation.] + + Synopsis [Various utilities.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: ntlUtil.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "ntl.h" + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Returns 1 if netlist was written by ABC with added bufs/invs.] + + Description [Should be called immediately after reading from file.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Ntl_ManTransformCoDrivers( Ntl_Man_t * p ) +{ + Vec_Ptr_t * vCoNets; + Ntl_Net_t * pNetCo, * pNetFanin; + Ntl_Obj_t * pObj; + Ntl_Mod_t * pRoot; + int i, k, Counter; + pRoot = Ntl_ManRootModel( p ); + // collect the nets of the root model + vCoNets = Vec_PtrAlloc( 1000 ); + Ntl_ModelForEachPo( pRoot, pObj, i ) + if ( !Ntl_ObjFanin0(pObj)->fMark ) + { + Ntl_ObjFanin0(pObj)->fMark = 1; + Vec_PtrPush( vCoNets, Ntl_ObjFanin0(pObj) ); + } + Ntl_ModelForEachLatch( pRoot, pObj, i ) + if ( !Ntl_ObjFanin0(pObj)->fMark ) + { + Ntl_ObjFanin0(pObj)->fMark = 1; + Vec_PtrPush( vCoNets, Ntl_ObjFanin0(pObj) ); + } + Ntl_ModelForEachBox( pRoot, pObj, k ) + Ntl_ObjForEachFanin( pObj, pNetCo, i ) + if ( !pNetCo->fMark ) + { + pNetCo->fMark = 1; + Vec_PtrPush( vCoNets, pNetCo ); + } + // check the nets + Vec_PtrForEachEntry( vCoNets, pNetCo, i ) + { + if ( !Ntl_ObjIsNode(pNetCo->pDriver) ) + continue; + if ( Ntl_ObjFaninNum(pNetCo->pDriver) != 1 ) + break; + pNetFanin = Ntl_ObjFanin0(pNetCo->pDriver); + if ( !Ntl_ObjIsNode(pNetFanin->pDriver) ) + break; + } + if ( i < Vec_PtrSize(vCoNets) ) + { + Vec_PtrFree( vCoNets ); + return 0; + } + + + // remove the buffers/inverters + Counter = 0; + Vec_PtrForEachEntry( vCoNets, pNetCo, i ) + { + pNetCo->fMark = 0; + if ( !Ntl_ObjIsNode(pNetCo->pDriver) ) + continue; + // if this net is driven by an interver + // set the complemented attribute of the CO + assert( Ntl_ObjFaninNum(pNetCo->pDriver) == 1 ); + pNetCo->fCompl = (int)(pNetCo->pDriver->pSop[0] == '0'); + // remove the driver + Vec_PtrWriteEntry( pRoot->vObjs, pNetCo->pDriver->Id, NULL ); + // remove the net + pNetFanin = Ntl_ObjFanin0(pNetCo->pDriver); + Ntl_ModelDeleteNet( pRoot, pNetFanin ); + // make the CO net point to the new driver + assert( Ntl_ObjIsNode(pNetFanin->pDriver) ); + pNetCo->pDriver = NULL; + pNetFanin->pDriver->pFanio[pNetFanin->pDriver->nFanins] = NULL; + Ntl_ModelSetNetDriver( pNetFanin->pDriver, pNetCo ); + Counter++; + } + Vec_PtrFree( vCoNets ); + pRoot->nObjs[NTL_OBJ_NODE] -= Counter; + return Counter; +} + +/**Function************************************************************* + + Synopsis [Derives the array of CI names.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Ptr_t * Ntl_ManCollectCiNames( Ntl_Man_t * p ) +{ + Vec_Ptr_t * vNames; + Ntl_Net_t * pNet; + int i; + vNames = Vec_PtrAlloc( 1000 ); + Ntl_ManForEachCiNet( p, pNet, i ) + Vec_PtrPush( vNames, pNet->pName ); + return vNames; +} + +/**Function************************************************************* + + Synopsis [Derives the array of CI names.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Ptr_t * Ntl_ManCollectCoNames( Ntl_Man_t * p ) +{ + Vec_Ptr_t * vNames; + Ntl_Net_t * pNet; + int i; + vNames = Vec_PtrAlloc( 1000 ); + Ntl_ManForEachCoNet( p, pNet, i ) + Vec_PtrPush( vNames, pNet->pName ); + return vNames; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + |