summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-07-22 11:16:07 +0700
committerAlan Mishchenko <alanmi@berkeley.edu>2017-07-22 11:16:07 +0700
commit66af4ae6d16d818f8a12a4b19d2a28aef1a708a7 (patch)
tree72ec2d24ea3cdb811696cdd6a31edd00503cdcb2
parent55771ee01434067e90878ada331656f614894c4e (diff)
downloadabc-66af4ae6d16d818f8a12a4b19d2a28aef1a708a7.tar.gz
abc-66af4ae6d16d818f8a12a4b19d2a28aef1a708a7.tar.bz2
abc-66af4ae6d16d818f8a12a4b19d2a28aef1a708a7.zip
Experiments with BMC.
-rw-r--r--src/sat/bmc/bmcBmcS.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/sat/bmc/bmcBmcS.c b/src/sat/bmc/bmcBmcS.c
new file mode 100644
index 00000000..b1754361
--- /dev/null
+++ b/src/sat/bmc/bmcBmcS.c
@@ -0,0 +1,185 @@
+/**CFile****************************************************************
+
+ FileName [bmcBmcS.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [SAT-based bounded model checking.]
+
+ Synopsis [New BMC package.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - July 20, 2017.]
+
+ Revision [$Id: bmcBmcS.c,v 1.00 2017/07/20 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "sat/cnf/cnf.h"
+#include "sat/bsat/satStore.h"
+#include "bmc.h"
+
+ABC_NAMESPACE_IMPL_START
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Incremental unfolding.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Bmc_SuperBuildTents_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vIns, Vec_Int_t * vCuts, Vec_Int_t * vFlops, Vec_Int_t * vObjs, Vec_Int_t * vRankIns, Vec_Int_t * vRankCuts, int Rank )
+{
+ Gia_Obj_t * pObj;
+ if ( iObj == 0 )
+ return;
+ if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
+ return;
+ Gia_ObjSetTravIdCurrentId(p, iObj);
+ pObj = Gia_ManObj( p, iObj );
+ if ( pObj->fMark0 )
+ {
+ if ( !pObj->fMark1 )
+ return;
+ Vec_IntPush( vCuts, iObj );
+ Vec_IntPush( vRankCuts, Rank );
+ pObj->fMark1 = 1;
+ return;
+ }
+ pObj->fMark0 = 1;
+ if ( Gia_ObjIsPi(p, pObj) )
+ {
+ Vec_IntPush( vIns, iObj );
+ Vec_IntPush( vRankIns, Rank );
+ pObj->fMark1 = 1;
+ return;
+ }
+ if ( Gia_ObjIsCi(pObj) )
+ {
+ Vec_IntPush( vFlops, iObj );
+ return;
+ }
+ assert( Gia_ObjIsAnd(pObj) );
+ Bmc_SuperBuildTents_rec( p, Gia_ObjFaninId0(pObj, iObj), vIns, vCuts, vFlops, vObjs, vRankIns, vRankCuts, Rank );
+ Bmc_SuperBuildTents_rec( p, Gia_ObjFaninId1(pObj, iObj), vIns, vCuts, vFlops, vObjs, vRankIns, vRankCuts, Rank );
+ Vec_IntPush( vObjs, iObj );
+}
+Gia_Man_t * Bmc_SuperBuildTents( Gia_Man_t * p, Vec_Int_t ** pvMap )
+{
+ Vec_Int_t * vIns = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vCuts = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vFlops = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vObjs = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vLimIns = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vLimCuts = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vLimFlops = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vLimObjs = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vRankIns = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vRankCuts = Vec_IntAlloc( 1000 );
+ Vec_Int_t * vMap = Vec_IntAlloc( 1000 );
+ Gia_Man_t * pNew, * pTemp;
+ Gia_Obj_t * pObj;
+ int i, r, Entry, Rank, iPrev, iThis = 0;
+ // collect internal nodes
+ Gia_ManForEachPo( p, pObj, i )
+ Vec_IntPush( vFlops, Gia_ObjId(p, pObj) );
+ Gia_ManCleanMark01( p );
+ for ( Rank = 0; iThis < Vec_IntEntryLast(vFlops); Rank++ )
+ {
+ Vec_IntPush( vLimIns, Vec_IntSize(vIns) );
+ Vec_IntPush( vLimCuts, Vec_IntSize(vCuts) );
+ Vec_IntPush( vLimFlops, Vec_IntSize(vFlops) );
+ Vec_IntPush( vLimObjs, Vec_IntSize(vObjs) );
+ iPrev = iThis;
+ iThis = Vec_IntEntryLast(vFlops);
+ Vec_IntForEachEntryStartStop( vFlops, Entry, i, iPrev, iThis )
+ {
+ Gia_ManIncrementTravId( p );
+ Bmc_SuperBuildTents_rec( p, Gia_ObjFaninId0(Gia_ManObj(p, iPrev), iPrev), vIns, vCuts, vFlops, vObjs, vRankIns, vRankCuts, Rank );
+ }
+ }
+ Gia_ManCleanMark01( p );
+ Vec_IntPush( vLimIns, Vec_IntSize(vIns) );
+ Vec_IntPush( vLimCuts, Vec_IntSize(vCuts) );
+ Vec_IntPush( vLimFlops, Vec_IntSize(vFlops) );
+ Vec_IntPush( vLimObjs, Vec_IntSize(vObjs) );
+ // create new GIA
+ pNew = Gia_ManStart( Gia_ManObjNum(p) );
+ pNew->pName = Abc_UtilStrsav( p->pName );
+ pNew->pSpec = Abc_UtilStrsav( p->pSpec );
+ Gia_ManFillValue( p );
+ Gia_ManConst0(p)->Value = 0;
+ Gia_ManForEachObjVec( vIns, p, pObj, i )
+ pObj->Value = Gia_ManAppendCi(pNew);
+ Gia_ManForEachObjVec( vCuts, p, pObj, i )
+ pObj->Value = Gia_ManAppendCi(pNew);
+ for ( r = Rank; r >= 0; r-- )
+ {
+ Vec_IntForEachEntryStartStop( vFlops, Entry, i, Vec_IntEntry(vLimFlops, r), Vec_IntEntry(vLimFlops, r+1) )
+ {
+ pObj = Gia_ManObj(p, Entry);
+ pObj->Value = Gia_ObjFanin0Copy(pObj);
+ }
+ Vec_IntForEachEntryStartStop( vObjs, Entry, i, Vec_IntEntry(vLimObjs, r), Vec_IntEntry(vLimObjs, r+1) )
+ {
+ pObj = Gia_ManObj(p, Entry);
+ pObj->Value = Gia_ObjFanin0Copy(pObj);
+ }
+ }
+ Gia_ManForEachPo( p, pObj, i )
+ Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
+ Gia_ManForEachObjVec( vCuts, p, pObj, i )
+ Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
+ Gia_ManSetRegNum( pNew, Vec_IntSize(vCuts) );
+
+ // create map
+ Vec_IntForEachEntryTwo( vIns, vRankIns, Entry, Rank, i )
+ Vec_IntPushTwo( vMap, Entry, Rank );
+ Vec_IntForEachEntryTwo( vCuts, vRankCuts, Entry, Rank, i )
+ Vec_IntPushTwo( vMap, Entry, Rank );
+
+ Vec_IntFree( vIns );
+ Vec_IntFree( vCuts );
+ Vec_IntFree( vFlops );
+ Vec_IntFree( vObjs );
+
+ Vec_IntFree( vLimIns );
+ Vec_IntFree( vLimCuts );
+ Vec_IntFree( vLimFlops );
+ Vec_IntFree( vLimObjs );
+
+ Vec_IntFree( vRankIns );
+ Vec_IntFree( vRankCuts );
+
+ if ( pvMap )
+ *pvMap = vMap;
+ else
+ Vec_IntFree( vMap );
+
+ pNew = Gia_ManCleanup( pTemp = pNew );
+ Gia_ManStop( pTemp );
+ return pNew;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+