blob: 91008ac66fc3cfe53e7078195f078c59d85aa854 [file] [log] [blame]
/**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