/**CFile**************************************************************** FileName [int2Util.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Interpolation engine.] Synopsis [Various utilities.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - Dec 1, 2013.] Revision [$Id: int2Util.c,v 1.00 2013/12/01 00:00:00 alanmi Exp $] ***********************************************************************/ #include "int2Int.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Int2_ManComputeCoPres( Vec_Int_t * vSop, int nRegs ) { Vec_Int_t * vCoPres, * vMap; vCoPres = Vec_IntAlloc( 100 ); if ( vSop == NULL ) Vec_IntPush( vCoPres, 0 ); else { int i, k, Limit; vMap = Vec_IntStart( nRegs ); Vec_IntForEachEntryStart( vSop, Limit, i, 1 ) { for ( k = 0; k < Limit; k++ ) { i++; assert( Vec_IntEntry(vSop, i + k) < 2 * nRegs ); Vec_IntWriteEntry( vMap, Abc_Lit2Var(Vec_IntEntry(vSop, i + k)), 1 ); } } Vec_IntForEachEntry( vMap, Limit, i ) if ( Limit ) Vec_IntPush( vCoPres, i+1 ); Vec_IntFree( vMap ); } return vCoPres; } void Int2_ManCollectInternal_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vNodes ) { if ( Gia_ObjIsTravIdCurrent(p, pObj) ) return; Gia_ObjSetTravIdCurrent(p, pObj); if ( Gia_ObjIsCi(pObj) ) return; assert( Gia_ObjIsAnd(pObj) ); Int2_ManCollectInternal_rec( p, Gia_ObjFanin0(pObj), vNodes ); Int2_ManCollectInternal_rec( p, Gia_ObjFanin1(pObj), vNodes ); Vec_IntPush( vNodes, Gia_ObjId(p, pObj) ); } Vec_Int_t * Int2_ManCollectInternal( Gia_Man_t * p, Vec_Int_t * vCoPres ) { Vec_Int_t * vNodes; Gia_Obj_t * pObj; int i, Entry; Gia_ManIncrementTravId( p ); Gia_ObjSetTravIdCurrent(p, Gia_ManConst0(p)); Gia_ManForEachCi( p, pObj, i ) Gia_ObjSetTravIdCurrent(p, pObj); vNodes = Vec_IntAlloc( 1000 ); Vec_IntForEachEntry( vCoPres, Entry, i ) Int2_ManCollectInternal_rec( p, Gia_ObjFanin0(Gia_ManCo(p, Entry)), vNodes ); return vNodes; } Gia_Man_t * Int2_ManProbToGia( Gia_Man_t * p, Vec_Int_t * vSop ) { Vec_Int_t * vCoPres, * vNodes; Gia_Man_t * pNew, * pTemp; Gia_Obj_t * pObj; int i, k, Entry, Limit; int Lit, Cube, Sop; assert( Gia_ManPoNum(p) == 1 ); // collect COs and ANDs vCoPres = Int2_ManComputeCoPres( vSop, Gia_ManRegNum(p) ); vNodes = Int2_ManCollectInternal( p, vCoPres ); // create new manager pNew = Gia_ManStart( Gia_ManObjNum(p) ); pNew->pName = Abc_UtilStrsav( p->pName ); pNew->pSpec = Abc_UtilStrsav( p->pSpec ); Gia_ManConst0(p)->Value = 0; Gia_ManForEachCi( p, pObj, i ) pObj->Value = Gia_ManAppendCi(pNew); Gia_ManHashAlloc( pNew ); Gia_ManForEachObjVec( vNodes, p, pObj, i ) pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); Vec_IntForEachEntry( vCoPres, Entry, i ) { pObj = Gia_ManCo(p, Entry); pObj->Value = Gia_ObjFanin0Copy( pObj ); } // create additional cubes Sop = 0; Vec_IntForEachEntryStart( vSop, Limit, i, 1 ) { Cube = 1; for ( k = 0; k < Limit; k++ ) { i++; Lit = Vec_IntEntry( vSop, i + k ); pObj = Gia_ManRi( p, Abc_Lit2Var(Lit) ); Cube = Gia_ManHashAnd( pNew, Cube, Abc_LitNotCond(pObj->Value, Abc_LitIsCompl(Lit)) ); } Sop = Gia_ManHashOr( pNew, Sop, Cube ); } Gia_ManAppendCo( pNew, Sop ); Gia_ManHashStop( pNew ); // cleanup pNew = Gia_ManCleanup( pTemp = pNew ); Gia_ManStop( pTemp ); return pNew; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END