| /**CFile**************************************************************** |
| |
| FileName [int2Refine.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: int2Refine.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 [] |
| |
| ***********************************************************************/ |
| void Int2_ManJustify_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vSelect ) |
| { |
| if ( pObj->fMark1 ) |
| return; |
| pObj->fMark1 = 1; |
| if ( Gia_ObjIsPi(p, pObj) ) |
| return; |
| if ( Gia_ObjIsCo(pObj) ) |
| { |
| Vec_IntPush( vSelect, Gia_ObjCioId(pObj) ); |
| return; |
| } |
| assert( Gia_ObjIsAnd(pObj) ); |
| if ( pObj->Value == 1 ) |
| { |
| if ( Gia_ObjFanin0(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin0(pObj), vSelect ); |
| if ( Gia_ObjFanin1(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin1(pObj), vSelect ); |
| return; |
| } |
| if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 && (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) == 0 ) |
| { |
| if ( Gia_ObjFanin0(pObj)->fMark0 <= Gia_ObjFanin1(pObj)->fMark0 ) // choice |
| { |
| if ( Gia_ObjFanin0(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin0(pObj), vSelect ); |
| } |
| else |
| { |
| if ( Gia_ObjFanin1(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin1(pObj), vSelect ); |
| } |
| } |
| else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 ) |
| { |
| if ( Gia_ObjFanin0(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin0(pObj), vSelect ); |
| } |
| else if ( (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) == 0 ) |
| { |
| if ( Gia_ObjFanin1(pObj)->Value < ABC_INFINITY ) |
| Int2_ManJustify_rec( p, Gia_ObjFanin1(pObj), vSelect ); |
| } |
| else assert( 0 ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Computes the reduced set of flop variables.] |
| |
| Description [Given is a single-output seq AIG manager and an assignment |
| of its CIs. Returned is a subset of flops that justifies the output.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Vec_Int_t * Int2_ManRefineCube( Gia_Man_t * p, Vec_Int_t * vAssign, Vec_Int_t * vPrio ) |
| { |
| Vec_Int_t * vSubset; |
| Gia_Obj_t * pObj; |
| int i; |
| // set values and prios |
| assert( Gia_ManRegNum(p) > 0 ); |
| assert( Vec_IntSize(vAssign) == Vec_IntSize(vPrio) ); |
| Gia_ManConst0(p)->fMark0 = 0; |
| Gia_ManConst0(p)->fMark1 = 0; |
| Gia_ManConst0(p)->Value = ABC_INFINITY; |
| Gia_ManForEachCi( p, pObj, i ) |
| { |
| pObj->fMark0 = Vec_IntEntry(vAssign, i); |
| pObj->fMark1 = 0; |
| pObj->Value = Vec_IntEntry(vPrio, i); |
| } |
| Gia_ManForEachAnd( p, pObj, i ) |
| { |
| pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)); |
| pObj->fMark1 = 0; |
| if ( pObj->fMark0 == 1 ) |
| pObj->Value = Abc_MaxInt( Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value ); |
| else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 && (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj)) == 0 ) |
| pObj->Value = Abc_MinInt( Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value ); // choice |
| else if ( (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) == 0 ) |
| pObj->Value = Gia_ObjFanin0(pObj)->Value; |
| else |
| pObj->Value = Gia_ObjFanin1(pObj)->Value; |
| } |
| pObj = Gia_ManPo( p, 0 ); |
| pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)); |
| pObj->fMark1 = 0; |
| pObj->Value = Gia_ObjFanin0(pObj)->Value; |
| assert( pObj->fMark0 == 1 ); |
| assert( pObj->Value < ABC_INFINITY ); |
| // select subset |
| vSubset = Vec_IntAlloc( 100 ); |
| Int2_ManJustify_rec( p, Gia_ObjFanin0(pObj), vSubset ); |
| return vSubset; |
| } |
| |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |