summaryrefslogtreecommitdiffstats
path: root/src/proof/int2/int2Refine.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2014-01-28 17:46:11 +0800
committerAlan Mishchenko <alanmi@berkeley.edu>2014-01-28 17:46:11 +0800
commitb910cba3e2e065d444d4a7b1bcbf81227417fc11 (patch)
tree59ac0cf4d9c543852168420e4d924f83585d437b /src/proof/int2/int2Refine.c
parentd9bbcb5dc9acba57ac39a9700f531add29dd761f (diff)
downloadabc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.tar.gz
abc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.tar.bz2
abc-b910cba3e2e065d444d4a7b1bcbf81227417fc11.zip
Initial new interpolation code.
Diffstat (limited to 'src/proof/int2/int2Refine.c')
-rw-r--r--src/proof/int2/int2Refine.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/proof/int2/int2Refine.c b/src/proof/int2/int2Refine.c
new file mode 100644
index 00000000..91008ac6
--- /dev/null
+++ b/src/proof/int2/int2Refine.c
@@ -0,0 +1,154 @@
+/**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
+