diff options
Diffstat (limited to 'src/opt/nwk/nwkStrash.c')
-rw-r--r-- | src/opt/nwk/nwkStrash.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/opt/nwk/nwkStrash.c b/src/opt/nwk/nwkStrash.c new file mode 100644 index 00000000..74fc4d56 --- /dev/null +++ b/src/opt/nwk/nwkStrash.c @@ -0,0 +1,149 @@ +/**CFile**************************************************************** + + FileName [nwkStrash.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Logic network representation.] + + Synopsis [Performs structural hashing for the network.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: nwkStrash.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "nwk.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Derives AIG from the local functions of the node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Nwk_ManStrashNode_rec( Aig_Man_t * p, Hop_Obj_t * pObj ) +{ + assert( !Hop_IsComplement(pObj) ); + if ( !Hop_ObjIsNode(pObj) || Hop_ObjIsMarkA(pObj) ) + return; + Nwk_ManStrashNode_rec( p, Hop_ObjFanin0(pObj) ); + Nwk_ManStrashNode_rec( p, Hop_ObjFanin1(pObj) ); + pObj->pData = Aig_And( p, (Aig_Obj_t *)Hop_ObjChild0Copy(pObj), (Aig_Obj_t *)Hop_ObjChild1Copy(pObj) ); + assert( !Hop_ObjIsMarkA(pObj) ); // loop detection + Hop_ObjSetMarkA( pObj ); +} + +/**Function************************************************************* + + Synopsis [Derives AIG from the local functions of the node.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Aig_Obj_t * Nwk_ManStrashNode( Aig_Man_t * p, Nwk_Obj_t * pObj ) +{ + Hop_Man_t * pMan = pObj->pMan->pManHop; + Hop_Obj_t * pRoot = pObj->pFunc; + Nwk_Obj_t * pFanin; + int i; + assert( Nwk_ObjIsNode(pObj) ); + // check the constant case + if ( Hop_Regular(pRoot) == Hop_ManConst1(pMan) ) + return Aig_NotCond( Aig_ManConst1(p), Hop_IsComplement(pRoot) ); + // set elementary variables + Nwk_ObjForEachFanin( pObj, pFanin, i ) + Hop_IthVar(pMan, i)->pData = pFanin->pCopy; + // strash the AIG of this node + Nwk_ManStrashNode_rec( p, Hop_Regular(pRoot) ); + Hop_ConeUnmark_rec( Hop_Regular(pRoot) ); + // return the final node + return Aig_NotCond( (Aig_Obj_t *)Hop_Regular(pRoot)->pData, Hop_IsComplement(pRoot) ); +} + +/**Function************************************************************* + + Synopsis [Derives AIG from the logic network.] + + Description [Assumes topological ordering of nodes.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Aig_Man_t * Nwk_ManStrash( Nwk_Man_t * pNtk ) +{ + Vec_Ptr_t * vObjs; + Aig_Man_t * pMan; + Aig_Obj_t * pObjNew; + Nwk_Obj_t * pObj; + int i, Level; + pMan = Aig_ManStart( Nwk_ManGetAigNodeNum(pNtk) ); + pMan->pName = Abc_UtilStrsav( pNtk->pName ); + pMan->pSpec = Abc_UtilStrsav( pNtk->pSpec ); + pMan->pManTime = Tim_ManDup( (Tim_Man_t *)pNtk->pManTime, 1 ); + Tim_ManIncrementTravId( (Tim_Man_t *)pMan->pManTime ); + Nwk_ManForEachObj( pNtk, pObj, i ) + pObj->pCopy = NULL; +// Nwk_ManForEachObj( pNtk, pObj, i ) + vObjs = Nwk_ManDfs( pNtk ); + Vec_PtrForEachEntry( Nwk_Obj_t *, vObjs, pObj, i ) + { + if ( Nwk_ObjIsCi(pObj) ) + { + pObjNew = Aig_ObjCreatePi(pMan); + Level = Tim_ManGetCiArrival( (Tim_Man_t *)pMan->pManTime, pObj->PioId ); + Aig_ObjSetLevel( pObjNew, Level ); + } + else if ( Nwk_ObjIsCo(pObj) ) + { + pObjNew = Aig_ObjCreatePo( pMan, Aig_NotCond((Aig_Obj_t *)Nwk_ObjFanin0(pObj)->pCopy, pObj->fInvert) ); + Level = Aig_ObjLevel( pObjNew ); + Tim_ManSetCoArrival( (Tim_Man_t *)pMan->pManTime, pObj->PioId, (float)Level ); + } + else if ( Nwk_ObjIsNode(pObj) ) + { + pObjNew = Nwk_ManStrashNode( pMan, pObj ); + } + else + assert( 0 ); + pObj->pCopy = pObjNew; + } + Vec_PtrFree( vObjs ); + Aig_ManCleanup( pMan ); + Aig_ManSetRegNum( pMan, 0 ); + return pMan; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |