diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-01-28 17:46:11 +0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-01-28 17:46:11 +0800 |
commit | b910cba3e2e065d444d4a7b1bcbf81227417fc11 (patch) | |
tree | 59ac0cf4d9c543852168420e4d924f83585d437b /src/proof/int2/int2Util.c | |
parent | d9bbcb5dc9acba57ac39a9700f531add29dd761f (diff) | |
download | abc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.tar.gz abc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.tar.bz2 abc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.zip |
Initial new interpolation code.
Diffstat (limited to 'src/proof/int2/int2Util.c')
-rw-r--r-- | src/proof/int2/int2Util.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/proof/int2/int2Util.c b/src/proof/int2/int2Util.c new file mode 100644 index 00000000..f675d0b9 --- /dev/null +++ b/src/proof/int2/int2Util.c @@ -0,0 +1,152 @@ +/**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 + |