summaryrefslogtreecommitdiffstats
path: root/src/proof/cec
diff options
context:
space:
mode:
authorNiklas Een <niklas@een.se>2012-10-30 12:38:57 -0700
committerNiklas Een <niklas@een.se>2012-10-30 12:38:57 -0700
commite353c4b75cb594d21b9060cbaf26114504513cd8 (patch)
treea0d3119ba2c35f909fc25405fed700c93300922d /src/proof/cec
parentc3168ba661a06022654aae11693f08368ec15acc (diff)
parent9b8d3628541cb30ad99b104f6449d48f3546193a (diff)
downloadabc-e353c4b75cb594d21b9060cbaf26114504513cd8.tar.gz
abc-e353c4b75cb594d21b9060cbaf26114504513cd8.tar.bz2
abc-e353c4b75cb594d21b9060cbaf26114504513cd8.zip
Merge
Diffstat (limited to 'src/proof/cec')
-rw-r--r--src/proof/cec/cec.h1
-rw-r--r--src/proof/cec/cecCorr.c13
2 files changed, 14 insertions, 0 deletions
diff --git a/src/proof/cec/cec.h b/src/proof/cec/cec.h
index 10b06c28..65d2e24e 100644
--- a/src/proof/cec/cec.h
+++ b/src/proof/cec/cec.h
@@ -144,6 +144,7 @@ struct Cec_ParCor_t_
int fUseCSat; // use circuit-based solver
// int fFirstStop; // stop on the first sat output
int fUseSmartCnf; // use smart CNF computation
+ int fStopWhenGone; // quit when PO is not a candidate constant
int fVerboseFlops; // verbose stats
int fVeryVerbose; // verbose stats
int fVerbose; // verbose stats
diff --git a/src/proof/cec/cecCorr.c b/src/proof/cec/cecCorr.c
index f35cd952..f3a84d3a 100644
--- a/src/proof/cec/cecCorr.c
+++ b/src/proof/cec/cecCorr.c
@@ -753,6 +753,7 @@ void Cec_ManRefinedClassPrintStats( Gia_Man_t * p, Vec_Str_t * vStatus, int iIte
nFail++;
}
Abc_Print( 1, "p =%6d d =%6d f =%6d ", nProve, nDispr, nFail );
+ Abc_Print( 1, "%c ", Gia_ObjIsConst( p, Gia_ObjFaninId0p(p, Gia_ManPo(p, 0)) ) ? '+' : '-' );
Abc_PrintTime( 1, "T", Time );
}
@@ -950,6 +951,14 @@ int Cec_ManLSCorrespondenceClasses( Gia_Man_t * pAig, Cec_ParCor_t * pPars )
//Gia_ManEquivPrintClasses( pAig, 1, 0 );
if ( pPars->pFunc )
((int (*)(void *))pPars->pFunc)( pPars->pData );
+ // quit if const is no longer there
+ if ( pPars->fStopWhenGone && Gia_ManPoNum(pAig) == 1 && !Gia_ObjIsConst( pAig, Gia_ObjFaninId0p(pAig, Gia_ManPo(pAig, 0)) ) )
+ {
+ printf( "Iterative refinement is stopped after iteration %d\n", r );
+ printf( "because the property output is no longer a candidate constant.\n" );
+ Cec_ManSimStop( pSim );
+ return 0;
+ }
}
if ( pPars->fVerbose )
Cec_ManRefinedClassPrintStats( pAig, NULL, r+1, clock() - clk );
@@ -1071,7 +1080,11 @@ Gia_Man_t * Cec_ManLSCorrespondence( Gia_Man_t * pAig, Cec_ParCor_t * pPars )
ABC_FREE( pAig->pReprs );
ABC_FREE( pAig->pNexts );
if ( pPars->nPrefix == 0 )
+ {
RetValue = Cec_ManLSCorrespondenceClasses( pAig, pPars );
+ if ( RetValue == 0 )
+ return Gia_ManDup( pAig );
+ }
else
{
// compute the cycles AIG