/**CFile**************************************************************** FileName [nwkAig.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Netlist representation.] Synopsis [Translating of AIG into the network.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: nwkAig.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "nwk.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Converts AIG into the network.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Nwk_Man_t * Nwk_ManDeriveFromAig( Aig_Man_t * p ) { Nwk_Man_t * pNtk; Aig_Obj_t * pObj; int i; pNtk = Nwk_ManAlloc(); pNtk->nFanioPlus = 0; Hop_ManStop( pNtk->pManHop ); pNtk->pManHop = NULL; pNtk->pName = Abc_UtilStrsav( p->pName ); pNtk->pSpec = Abc_UtilStrsav( p->pSpec ); pObj = Aig_ManConst1(p); pObj->pData = Nwk_ManCreateNode( pNtk, 0, pObj->nRefs ); Aig_ManForEachCi( p, pObj, i ) pObj->pData = Nwk_ManCreateCi( pNtk, pObj->nRefs ); Aig_ManForEachNode( p, pObj, i ) { pObj->pData = Nwk_ManCreateNode( pNtk, 2, pObj->nRefs ); Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin0(pObj)->pData ); Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin1(pObj)->pData ); } Aig_ManForEachCo( p, pObj, i ) { pObj->pData = Nwk_ManCreateCo( pNtk ); Nwk_ObjAddFanin( (Nwk_Obj_t *)pObj->pData, (Nwk_Obj_t *)Aig_ObjFanin0(pObj)->pData ); } return pNtk; } /**Function************************************************************* Synopsis [Converts AIG into the network.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Ptr_t * Nwk_ManDeriveRetimingCut( Aig_Man_t * p, int fForward, int fVerbose ) { Vec_Ptr_t * vNodes; Nwk_Man_t * pNtk; Nwk_Obj_t * pNode; Aig_Obj_t * pObj; int i; pNtk = Nwk_ManDeriveFromAig( p ); if ( fForward ) vNodes = Nwk_ManRetimeCutForward( pNtk, Aig_ManRegNum(p), fVerbose ); else vNodes = Nwk_ManRetimeCutBackward( pNtk, Aig_ManRegNum(p), fVerbose ); Aig_ManForEachObj( p, pObj, i ) ((Nwk_Obj_t *)pObj->pData)->pCopy = pObj; Vec_PtrForEachEntry( Nwk_Obj_t *, vNodes, pNode, i ) Vec_PtrWriteEntry( vNodes, i, pNode->pCopy ); Nwk_ManFree( pNtk ); // assert( Vec_PtrSize(vNodes) <= Aig_ManRegNum(p) ); return vNodes; } ABC_NAMESPACE_IMPL_END #include "proof/abs/abs.h" ABC_NAMESPACE_IMPL_START /**Function************************************************************* Synopsis [Collects reachable nodes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Nwk_ManColleacReached_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vNodes, Vec_Int_t * vLeaves ) { if ( Gia_ObjIsTravIdCurrent(p, pObj) ) return; Gia_ObjSetTravIdCurrent(p, pObj); if ( Gia_ObjIsCi(pObj) ) { Vec_IntPush( vLeaves, Gia_ObjId(p, pObj) ); return; } assert( Gia_ObjIsAnd(pObj) ); Nwk_ManColleacReached_rec( p, Gia_ObjFanin0(pObj), vNodes, vLeaves ); Nwk_ManColleacReached_rec( p, Gia_ObjFanin1(pObj), vNodes, vLeaves ); Vec_IntPush( vNodes, Gia_ObjId(p, pObj) ); } /**Function************************************************************* Synopsis [Converts AIG into the network.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Nwk_Man_t * Nwk_ManCreateFromGia( Gia_Man_t * p, Vec_Int_t * vPPis, Vec_Int_t * vNodes, Vec_Int_t * vLeaves, Vec_Int_t ** pvMapInv ) { Nwk_Man_t * pNtk; Nwk_Obj_t ** ppCopies; Gia_Obj_t * pObj; Vec_Int_t * vMaps; int i; // assert( Vec_IntSize(vLeaves) >= Vec_IntSize(vPPis) ); Gia_ManCreateRefs( p ); pNtk = Nwk_ManAlloc(); pNtk->pName = Abc_UtilStrsav( p->pName ); pNtk->nFanioPlus = 0; Hop_ManStop( pNtk->pManHop ); pNtk->pManHop = NULL; // allocate vMaps = Vec_IntAlloc( Vec_IntSize(vNodes) + Abc_MaxInt(Vec_IntSize(vPPis), Vec_IntSize(vLeaves)) + 1 ); ppCopies = ABC_ALLOC( Nwk_Obj_t *, Gia_ManObjNum(p) ); // copy objects pObj = Gia_ManConst0(p); // ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 0, Gia_ObjRefNum(p,pObj) ); ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 0, Gia_ObjRefNum(p,pObj) + (Vec_IntSize(vLeaves) > Vec_IntSize(vPPis) ? Vec_IntSize(vLeaves) - Vec_IntSize(vPPis) : 0) ); Vec_IntPush( vMaps, Gia_ObjId(p,pObj) ); Gia_ManForEachObjVec( vLeaves, p, pObj, i ) { ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateCi( pNtk, Gia_ObjRefNum(p,pObj) ); assert( Vec_IntSize(vMaps) == Nwk_ObjId(ppCopies[Gia_ObjId(p,pObj)]) ); Vec_IntPush( vMaps, Gia_ObjId(p,pObj) ); } for ( i = Vec_IntSize(vLeaves); i < Vec_IntSize(vPPis); i++ ) { Nwk_ManCreateCi( pNtk, 0 ); Vec_IntPush( vMaps, -1 ); } Gia_ManForEachObjVec( vNodes, p, pObj, i ) { ppCopies[Gia_ObjId(p,pObj)] = Nwk_ManCreateNode( pNtk, 2, Gia_ObjRefNum(p,pObj) ); Nwk_ObjAddFanin( ppCopies[Gia_ObjId(p,pObj)], ppCopies[Gia_ObjFaninId0p(p,pObj)] ); Nwk_ObjAddFanin( ppCopies[Gia_ObjId(p,pObj)], ppCopies[Gia_ObjFaninId1p(p,pObj)] ); assert( Vec_IntSize(vMaps) == Nwk_ObjId(ppCopies[Gia_ObjId(p,pObj)]) ); Vec_IntPush( vMaps, Gia_ObjId(p,pObj) ); } Gia_ManForEachObjVec( vPPis, p, pObj, i ) { assert( ppCopies[Gia_ObjId(p,pObj)] != NULL ); Nwk_ObjAddFanin( Nwk_ManCreateCo(pNtk), ppCopies[Gia_ObjId(p,pObj)] ); } for ( i = Vec_IntSize(vPPis); i < Vec_IntSize(vLeaves); i++ ) Nwk_ObjAddFanin( Nwk_ManCreateCo(pNtk), ppCopies[0] ); assert( Vec_IntSize(vMaps) == Vec_IntSize(vNodes) + Abc_MaxInt(Vec_IntSize(vPPis), Vec_IntSize(vLeaves)) + 1 ); ABC_FREE( ppCopies ); *pvMapInv = vMaps; return pNtk; } /**Function************************************************************* Synopsis [Returns min-cut in the AIG.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Nwk_ManDeriveMinCut( Gia_Man_t * p, int fVerbose ) { Nwk_Man_t * pNtk; Nwk_Obj_t * pNode; Vec_Ptr_t * vMinCut; Vec_Int_t * vPPis, * vNodes, * vLeaves, * vNodes2, * vLeaves2, * vMapInv; Vec_Int_t * vCommon, * vDiff0, * vDiff1; Gia_Obj_t * pObj; int i, iObjId; // get inputs Gia_ManGlaCollect( p, p->vGateClasses, NULL, &vPPis, NULL, NULL ); // collect nodes rechable from PPIs vNodes = Vec_IntAlloc( 100 ); vLeaves = Vec_IntAlloc( 100 ); Gia_ManIncrementTravId( p ); Gia_ManForEachObjVec( vPPis, p, pObj, i ) Nwk_ManColleacReached_rec( p, pObj, vNodes, vLeaves ); // derive the new network pNtk = Nwk_ManCreateFromGia( p, vPPis, vNodes, vLeaves, &vMapInv ); assert( Nwk_ManPiNum(pNtk) == Nwk_ManPoNum(pNtk) ); // create min-cut vMinCut = Nwk_ManRetimeCutBackward( pNtk, Nwk_ManPiNum(pNtk), fVerbose ); // copy from the GIA back // Aig_ManForEachObj( p, pObj, i ) // ((Nwk_Obj_t *)pObj->pData)->pCopy = pObj; // mark min-cut nodes vNodes2 = Vec_IntAlloc( 100 ); vLeaves2 = Vec_IntAlloc( 100 ); Gia_ManIncrementTravId( p ); Vec_PtrForEachEntry( Nwk_Obj_t *, vMinCut, pNode, i ) { pObj = Gia_ManObj( p, Vec_IntEntry(vMapInv, Nwk_ObjId(pNode)) ); if ( Gia_ObjIsConst0(pObj) ) continue; Nwk_ManColleacReached_rec( p, pObj, vNodes2, vLeaves2 ); } if ( fVerbose ) printf( "Min-cut: %d -> %d. Nodes %d -> %d. ", Vec_IntSize(vPPis)+1, Vec_PtrSize(vMinCut), Vec_IntSize(vNodes), Vec_IntSize(vNodes2) ); Vec_IntFree( vPPis ); Vec_PtrFree( vMinCut ); Vec_IntFree( vMapInv ); Nwk_ManFree( pNtk ); // sort the results Vec_IntSort( vNodes, 0 ); Vec_IntSort( vNodes2, 0 ); vCommon = Vec_IntAlloc( Vec_IntSize(vNodes) ); vDiff0 = Vec_IntAlloc( 100 ); vDiff1 = Vec_IntAlloc( 100 ); Vec_IntTwoSplit( vNodes, vNodes2, vCommon, vDiff0, vDiff1 ); if ( fVerbose ) printf( "Common = %d. Diff0 = %d. Diff1 = %d.\n", Vec_IntSize(vCommon), Vec_IntSize(vDiff0), Vec_IntSize(vDiff1) ); // fill in Vec_IntForEachEntry( vDiff0, iObjId, i ) Vec_IntWriteEntry( p->vGateClasses, iObjId, 1 ); Vec_IntFree( vLeaves ); Vec_IntFree( vNodes ); Vec_IntFree( vLeaves2 ); Vec_IntFree( vNodes2 ); Vec_IntFree( vCommon ); Vec_IntFree( vDiff0 ); Vec_IntFree( vDiff1 ); // check abstraction Gia_ManForEachObj( p, pObj, i ) { if ( Vec_IntEntry( p->vGateClasses, i ) == 0 ) continue; assert( Gia_ObjIsConst0(pObj) || Gia_ObjIsRo(p, pObj) || Gia_ObjIsAnd(pObj) ); } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END