summaryrefslogtreecommitdiffstats
path: root/src/proof/abs/absRefSelect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/proof/abs/absRefSelect.c')
-rw-r--r--src/proof/abs/absRefSelect.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/proof/abs/absRefSelect.c b/src/proof/abs/absRefSelect.c
new file mode 100644
index 00000000..871eb79b
--- /dev/null
+++ b/src/proof/abs/absRefSelect.c
@@ -0,0 +1,220 @@
+/**CFile****************************************************************
+
+ FileName [absRefSelect.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Abstraction package.]
+
+ Synopsis [Post-processes the set of selected refinement objects.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - June 20, 2005.]
+
+ Revision [$Id: absRefSelect.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "abs.h"
+#include "absRef.h"
+
+ABC_NAMESPACE_IMPL_START
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Rnm_ManPrintSelected( Rnm_Man_t * p, Vec_Int_t * vNewPPis )
+{
+ Gia_Obj_t * pObj;
+ int i, Counter = 0;
+ Gia_ManForEachObjVec( p->vMap, p->pGia, pObj, i )
+ if ( Gia_ObjIsPi(p->pGia, pObj) )
+ printf( "-" );
+ else if ( Vec_IntFind(vNewPPis, Gia_ObjId(p->pGia, pObj)) >= 0 )// this is PPI
+ printf( "1" ), Counter++;
+ else
+ printf( "0" );
+ printf( " %3d\n", Counter );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Perform structural analysis.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Ga2_StructAnalize( Gia_Man_t * p, Vec_Int_t * vFront, Vec_Int_t * vInter, Vec_Int_t * vNewPPis )
+{
+ Vec_Int_t * vLeaves;
+ Gia_Obj_t * pObj, * pFanin;
+ int i, k;
+ // clean labels
+ Gia_ManForEachObj( p, pObj, i )
+ pObj->fMark0 = pObj->fMark1 = 0;
+ // label frontier
+ Gia_ManForEachObjVec( vFront, p, pObj, i )
+ pObj->fMark0 = 1, pObj->fMark1 = 0;
+ // label objects
+ Gia_ManForEachObjVec( vInter, p, pObj, i )
+ pObj->fMark1 = 0, pObj->fMark1 = 1;
+ // label selected
+ Gia_ManForEachObjVec( vNewPPis, p, pObj, i )
+ pObj->fMark1 = 1, pObj->fMark1 = 1;
+ // explore selected
+ Gia_ManForEachObjVec( vNewPPis, p, pObj, i )
+ {
+ printf( "Selected PPI %3d : ", i+1 );
+ printf( "%6d ", Gia_ObjId(p, pObj) );
+ printf( "\n" );
+ vLeaves = Ga2_ObjLeaves( p, pObj );
+ Gia_ManForEachObjVec( vLeaves, p, pFanin, k )
+ {
+ printf( " " );
+ printf( "%6d ", Gia_ObjId(p, pFanin) );
+ if ( pFanin->fMark0 && pFanin->fMark1 )
+ printf( "selected PPI" );
+ else if ( pFanin->fMark0 && !pFanin->fMark1 )
+ printf( "frontier (original PI or PPI)" );
+ else if ( !pFanin->fMark0 && pFanin->fMark1 )
+ printf( "abstracted node" );
+ else if ( !pFanin->fMark0 && !pFanin->fMark1 )
+ printf( "free variable" );
+ printf( "\n" );
+ }
+ }
+}
+
+/**Function*************************************************************
+
+ Synopsis [Postprocessing the set of PPIs using structural analysis.]
+
+ Description [The following sets are used:
+ The set of all PI+PPI is in p->vMap.
+ The set of all abstracted objects is in p->vObjs;
+ The set of important PPIs is in vOldPPis.
+ The new set of selected PPIs is in vNewPPis.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Vec_Int_t * Rnm_ManFilterSelected( Rnm_Man_t * p, Vec_Int_t * vOldPPis )
+{
+ int fVerbose = 0;
+ Vec_Int_t * vNewPPis, * vLeaves;
+ Gia_Obj_t * pObj, * pFanin;
+ int i, k, RetValue, Counters[3] = {0};
+
+ // (0) make sure fanin counters are 0 at the beginning
+// Gia_ManForEachObj( p->pGia, pObj, i )
+// assert( Rnm_ObjCount(p, pObj) == 0 );
+
+ // (1) increment PPI fanin counters
+ Vec_IntClear( p->vFanins );
+ Gia_ManForEachObjVec( vOldPPis, p->pGia, pObj, i )
+ {
+ vLeaves = Ga2_ObjLeaves( p->pGia, pObj );
+ Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k )
+ if ( Rnm_ObjAddToCount(p, pFanin) == 0 ) // fanin counter is 0 -- save it
+ Vec_IntPush( p->vFanins, Gia_ObjId(p->pGia, pFanin) );
+ }
+
+ // (3) select objects with reconvergence, which create potential constraints
+ // - flop objects
+ // - objects whose fanin belongs to the justified area
+ // - objects whose fanins overlap
+ // (these do not guantee reconvergence, but may potentially have it)
+ // (other objects cannot have reconvergence, even if they are added)
+ vNewPPis = Vec_IntAlloc( 100 );
+ Gia_ManForEachObjVec( vOldPPis, p->pGia, pObj, i )
+ {
+ if ( Gia_ObjIsRo(p->pGia, pObj) )
+ {
+ if ( fVerbose )
+ Counters[0]++;
+ Vec_IntPush( vNewPPis, Gia_ObjId(p->pGia, pObj) );
+ continue;
+ }
+ vLeaves = Ga2_ObjLeaves( p->pGia, pObj );
+ Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k )
+ {
+ if ( Rnm_ObjIsJust(p, pFanin) || Rnm_ObjCount(p, pFanin) > 1 )
+ {
+ if ( fVerbose )
+ Counters[1] += Rnm_ObjIsJust(p, pFanin);
+ if ( fVerbose )
+ Counters[2] += (Rnm_ObjCount(p, pFanin) > 1);
+ Vec_IntPush( vNewPPis, Gia_ObjId(p->pGia, pObj) );
+ break;
+ }
+ }
+ }
+ RetValue = Vec_IntUniqify( vNewPPis );
+ assert( RetValue == 0 );
+
+ // (4) clear fanin counters
+ // this is important for counters to be correctly set in the future iterations -- see step (0)
+ Gia_ManForEachObjVec( p->vFanins, p->pGia, pObj, i )
+ Rnm_ObjSetCount( p, pObj, 0 );
+
+ // visualize
+ if ( fVerbose )
+ printf( "*** Refinement %3d : PI+PPI =%4d. Old =%4d. New =%4d. FF =%4d. Just =%4d. Shared =%4d.\n",
+ p->nRefId, Vec_IntSize(p->vMap), Vec_IntSize(vOldPPis), Vec_IntSize(vNewPPis), Counters[0], Counters[1], Counters[2] );
+
+// Rnm_ManPrintSelected( p, vNewPPis );
+// Ga2_StructAnalize( p->pGia, p->vMap, p->vObjs, vNewPPis );
+ return vNewPPis;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Improved postprocessing the set of PPIs.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Vec_Int_t * Rnm_ManFilterSelectedNew( Rnm_Man_t * p, Vec_Int_t * vOldPPis )
+{
+ Vec_Int_t * vNewPPis;
+ vNewPPis = Vec_IntDup( vOldPPis );
+ return vNewPPis;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+