summaryrefslogtreecommitdiffstats
path: root/src/proof/ssc/sscSat.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-04-27 22:38:01 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-04-27 22:38:01 -0700
commit17a0d944b305cbadeb2bbbcdd7ef3c82b50c3c7a (patch)
tree4b2335e0e9e2cc797e18b86d9cde2d8efa6483b6 /src/proof/ssc/sscSat.c
parent613e8b2ad6b24369467179b15c2ab2638f9b8672 (diff)
downloadabc-17a0d944b305cbadeb2bbbcdd7ef3c82b50c3c7a.tar.gz
abc-17a0d944b305cbadeb2bbbcdd7ef3c82b50c3c7a.tar.bz2
abc-17a0d944b305cbadeb2bbbcdd7ef3c82b50c3c7a.zip
SAT sweeping under constraints.
Diffstat (limited to 'src/proof/ssc/sscSat.c')
-rw-r--r--src/proof/ssc/sscSat.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/src/proof/ssc/sscSat.c b/src/proof/ssc/sscSat.c
index ea9c599f..f6d5e9af 100644
--- a/src/proof/ssc/sscSat.c
+++ b/src/proof/ssc/sscSat.c
@@ -210,8 +210,9 @@ static void Ssc_ManCnfNodeAddToSolver( Ssc_Man_t * p, int NodeId )
Gia_Obj_t * pNode;
int i, k, Id, Lit;
clock_t clk;
+ assert( NodeId > 0 );
// quit if CNF is ready
- if ( NodeId == 0 || Ssc_ObjSatVar(p, NodeId) )
+ if ( Ssc_ObjSatVar(p, NodeId) )
return;
clk = clock();
// start the frontier
@@ -345,33 +346,24 @@ Vec_Int_t * Ssc_ManFindPivotSat( Ssc_Man_t * p )
int Ssc_ManCheckEquivalence( Ssc_Man_t * p, int iRepr, int iNode, int fCompl )
{
int pLitsSat[2], RetValue;
+ clock_t clk;
+ assert( iRepr < iNode );
// if ( p->nTimeOut )
// sat_solver_set_runtime_limit( p->pSat, p->nTimeOut * CLOCKS_PER_SEC + clock() );
// create CNF
+ if ( iRepr )
Ssc_ManCnfNodeAddToSolver( p, iRepr );
Ssc_ManCnfNodeAddToSolver( p, iNode );
sat_solver_compress( p->pSat );
// order the literals
pLitsSat[0] = Abc_Var2Lit( Ssc_ObjSatVar(p, iRepr), 0 );
- pLitsSat[1] = Abc_Var2Lit( Ssc_ObjSatVar(p, iNode), 0 );
- if ( pLitsSat[0] < pLitsSat[1] )
- ABC_SWAP( int, pLitsSat[0], pLitsSat[1] );
-
- // correct polarity
- pLitsSat[1] = Abc_LitNotCond( pLitsSat[1], !fCompl ); // extra complement!
- if ( !Abc_LitIsCompl(pLitsSat[1]) )
- {
- pLitsSat[0] = Abc_LitNot( pLitsSat[0] );
- pLitsSat[1] = Abc_LitNot( pLitsSat[1] );
- }
- assert( pLitsSat[0] > pLitsSat[1] );
- assert( Abc_LitIsCompl(pLitsSat[1]) );
- assert( pLitsSat[1] != 0 );
+ pLitsSat[1] = Abc_Var2Lit( Ssc_ObjSatVar(p, iNode), fCompl ^ (int)(iRepr > 0) );
// solve under assumptions
- // A = 1; B = 0 OR A = 1; B = 1
+ // A = 1; B = 0
+ clk = clock();
RetValue = sat_solver_solve( p->pSat, pLitsSat, pLitsSat + 2, (ABC_INT64_T)p->pPars->nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
if ( RetValue == l_False )
{
@@ -379,22 +371,27 @@ int Ssc_ManCheckEquivalence( Ssc_Man_t * p, int iRepr, int iNode, int fCompl )
pLitsSat[1] = Abc_LitNot( pLitsSat[1] ); // compl
RetValue = sat_solver_addclause( p->pSat, pLitsSat, pLitsSat + 2 );
assert( RetValue );
+ p->timeSatUnsat += clock() - clk;
}
else if ( RetValue == l_True )
{
Ssc_ManCollectSatPattern( p, p->vPattern );
+ p->timeSatSat += clock() - clk;
return l_True;
}
else // if ( RetValue1 == l_Undef )
+ {
+ p->timeSatUndec += clock() - clk;
return l_Undef;
+ }
// if the old node was constant 0, we already know the answer
- if ( pLitsSat[1] == 0 )
+ if ( iRepr == 0 )
return l_False;
- assert( pLitsSat[1] > 1 );
// solve under assumptions
- // A = 0; B = 1 OR A = 0; B = 0
+ // A = 0; B = 1
+ clk = clock();
RetValue = sat_solver_solve( p->pSat, pLitsSat, pLitsSat + 2, (ABC_INT64_T)p->pPars->nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
if ( RetValue == l_False )
{
@@ -402,14 +399,19 @@ int Ssc_ManCheckEquivalence( Ssc_Man_t * p, int iRepr, int iNode, int fCompl )
pLitsSat[1] = Abc_LitNot( pLitsSat[1] );
RetValue = sat_solver_addclause( p->pSat, pLitsSat, pLitsSat + 2 );
assert( RetValue );
+ p->timeSatUnsat += clock() - clk;
}
else if ( RetValue == l_True )
{
Ssc_ManCollectSatPattern( p, p->vPattern );
+ p->timeSatSat += clock() - clk;
return l_True;
}
else // if ( RetValue1 == l_Undef )
+ {
+ p->timeSatUndec += clock() - clk;
return l_Undef;
+ }
return l_False;
}