Commit dd52905f by Alan Mishchenko

Enabling two-timeframe property check in the interpolation procedure.

parent 24823dce
...@@ -21054,7 +21054,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -21054,7 +21054,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )
// set defaults // set defaults
Inter_ManSetDefaultParams( pPars ); Inter_ManSetDefaultParams( pPars );
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "CFTKLrtpomcgbkdfvh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "CFTKLrtpomcgbqkdfvh" ) ) != EOF )
{ {
switch ( c ) switch ( c )
{ {
...@@ -21135,6 +21135,9 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -21135,6 +21135,9 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )
case 'b': case 'b':
pPars->fUseBackward ^= 1; pPars->fUseBackward ^= 1;
break; break;
case 'q':
pPars->fUseTwoFrames ^= 1;
break;
case 'k': case 'k':
pPars->fUseSeparate ^= 1; pPars->fUseSeparate ^= 1;
break; break;
...@@ -21226,7 +21229,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -21226,7 +21229,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: int [-CFTK num] [-L file] [-rtpomcgbkdfvh]\n" ); Abc_Print( -2, "usage: int [-CFTK num] [-L file] [-rtpomcgbqkdfvh]\n" );
Abc_Print( -2, "\t uses interpolation to prove the property\n" ); Abc_Print( -2, "\t uses interpolation to prove the property\n" );
Abc_Print( -2, "\t-C num : the limit on conflicts for one SAT run [default = %d]\n", pPars->nBTLimit ); Abc_Print( -2, "\t-C num : the limit on conflicts for one SAT run [default = %d]\n", pPars->nBTLimit );
Abc_Print( -2, "\t-F num : the limit on number of frames to unroll [default = %d]\n", pPars->nFramesMax ); Abc_Print( -2, "\t-F num : the limit on number of frames to unroll [default = %d]\n", pPars->nFramesMax );
...@@ -21242,6 +21245,7 @@ usage: ...@@ -21242,6 +21245,7 @@ usage:
Abc_Print( -2, "\t-c : toggle using inductive containment check [default = %s]\n", pPars->fCheckKstep? "yes": "no" ); Abc_Print( -2, "\t-c : toggle using inductive containment check [default = %s]\n", pPars->fCheckKstep? "yes": "no" );
Abc_Print( -2, "\t-g : toggle using bias for global variables using SAT [default = %s]\n", pPars->fUseBias? "yes": "no" ); Abc_Print( -2, "\t-g : toggle using bias for global variables using SAT [default = %s]\n", pPars->fUseBias? "yes": "no" );
Abc_Print( -2, "\t-b : toggle using backward interpolation (works with -t) [default = %s]\n", pPars->fUseBackward? "yes": "no" ); Abc_Print( -2, "\t-b : toggle using backward interpolation (works with -t) [default = %s]\n", pPars->fUseBackward? "yes": "no" );
Abc_Print( -2, "\t-q : toggle using property in two last timeframes [default = %s]\n", pPars->fUseTwoFrames? "yes": "no" );
Abc_Print( -2, "\t-k : toggle solving each output separately [default = %s]\n", pPars->fUseSeparate? "yes": "no" ); Abc_Print( -2, "\t-k : toggle solving each output separately [default = %s]\n", pPars->fUseSeparate? "yes": "no" );
Abc_Print( -2, "\t-d : drops (replaces by 0) sat outputs (with -k is used) [default = %s]\n", pPars->fDropSatOuts? "yes": "no" ); Abc_Print( -2, "\t-d : drops (replaces by 0) sat outputs (with -k is used) [default = %s]\n", pPars->fDropSatOuts? "yes": "no" );
Abc_Print( -2, "\t-f : toggle dumping inductive invariant into a file [default = %s]\n", pPars->fDropInvar? "yes": "no" ); Abc_Print( -2, "\t-f : toggle dumping inductive invariant into a file [default = %s]\n", pPars->fDropInvar? "yes": "no" );
......
...@@ -61,6 +61,7 @@ struct Inter_ManParams_t_ ...@@ -61,6 +61,7 @@ struct Inter_ManParams_t_
int fUseBias; // bias decisions to global variables int fUseBias; // bias decisions to global variables
int fUseBackward; // perform backward interpolation int fUseBackward; // perform backward interpolation
int fUseSeparate; // solve each output separately int fUseSeparate; // solve each output separately
int fUseTwoFrames; // create the OR of two last timeframes
int fDropSatOuts; // replace by 1 the solved outputs int fDropSatOuts; // replace by 1 the solved outputs
int fDropInvar; // dump inductive invariant into file int fDropInvar; // dump inductive invariant into file
int fVerbose; // print verbose statistics int fVerbose; // print verbose statistics
......
...@@ -59,6 +59,7 @@ void Inter_ManSetDefaultParams( Inter_ManParams_t * p ) ...@@ -59,6 +59,7 @@ void Inter_ManSetDefaultParams( Inter_ManParams_t * p )
p->fUseBias = 0; // bias decisions to global variables p->fUseBias = 0; // bias decisions to global variables
p->fUseBackward = 0; // perform backward interpolation p->fUseBackward = 0; // perform backward interpolation
p->fUseSeparate = 0; // solve each output separately p->fUseSeparate = 0; // solve each output separately
p->fUseTwoFrames = 0; // create OR of two last timeframes
p->fDropSatOuts = 0; // replace by 1 the solved outputs p->fDropSatOuts = 0; // replace by 1 the solved outputs
p->fVerbose = 0; // print verbose statistics p->fVerbose = 0; // print verbose statistics
p->iFrameMax =-1; p->iFrameMax =-1;
...@@ -146,7 +147,7 @@ clk = clock(); ...@@ -146,7 +147,7 @@ clk = clock();
p->pCnfInter = Cnf_Derive( p->pInter, 0 ); p->pCnfInter = Cnf_Derive( p->pInter, 0 );
p->timeCnf += clock() - clk; p->timeCnf += clock() - clk;
// timeframes // timeframes
p->pFrames = Inter_ManFramesInter( pAig, p->nFrames, pPars->fUseBackward ); p->pFrames = Inter_ManFramesInter( pAig, p->nFrames, pPars->fUseBackward, pPars->fUseTwoFrames );
clk = clock(); clk = clock();
if ( pPars->fRewrite ) if ( pPars->fRewrite )
{ {
......
...@@ -44,10 +44,11 @@ ABC_NAMESPACE_IMPL_START ...@@ -44,10 +44,11 @@ ABC_NAMESPACE_IMPL_START
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts ) Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts, int fUseTwoFrames )
{ {
Aig_Man_t * pFrames; Aig_Man_t * pFrames;
Aig_Obj_t * pObj, * pObjLi, * pObjLo; Aig_Obj_t * pObj, * pObjLi, * pObjLo;
Aig_Obj_t * pLastPo = NULL;
int i, f; int i, f;
assert( Saig_ManRegNum(pAig) > 0 ); assert( Saig_ManRegNum(pAig) > 0 );
assert( Saig_ManPoNum(pAig)-Saig_ManConstrNum(pAig) == 1 ); assert( Saig_ManPoNum(pAig)-Saig_ManConstrNum(pAig) == 1 );
...@@ -83,6 +84,9 @@ Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts ...@@ -83,6 +84,9 @@ Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts
} }
if ( f == nFrames - 1 ) if ( f == nFrames - 1 )
break; break;
// remember the last PO
pObj = Aig_ManCo( pAig, 0 );
pLastPo = Aig_ObjChild0Copy(pObj);
// save register inputs // save register inputs
Saig_ManForEachLi( pAig, pObj, i ) Saig_ManForEachLi( pAig, pObj, i )
pObj->pData = Aig_ObjChild0Copy(pObj); pObj->pData = Aig_ObjChild0Copy(pObj);
...@@ -100,7 +104,12 @@ Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts ...@@ -100,7 +104,12 @@ Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts
else else
{ {
pObj = Aig_ManCo( pAig, 0 ); pObj = Aig_ManCo( pAig, 0 );
Aig_ObjCreateCo( pFrames, Aig_ObjChild0Copy(pObj) ); // add the last PO
if ( pLastPo == NULL || !fUseTwoFrames )
pLastPo = Aig_ObjChild0Copy(pObj);
else
pLastPo = Aig_Or( pFrames, pLastPo, Aig_ObjChild0Copy(pObj) );
Aig_ObjCreateCo( pFrames, pLastPo );
} }
Aig_ManCleanup( pFrames ); Aig_ManCleanup( pFrames );
return pFrames; return pFrames;
......
...@@ -109,7 +109,7 @@ extern Aig_Man_t * Inter_ManStartDuplicated( Aig_Man_t * p ); ...@@ -109,7 +109,7 @@ extern Aig_Man_t * Inter_ManStartDuplicated( Aig_Man_t * p );
extern Aig_Man_t * Inter_ManStartOneOutput( Aig_Man_t * p, int fAddFirstPo ); extern Aig_Man_t * Inter_ManStartOneOutput( Aig_Man_t * p, int fAddFirstPo );
/*=== intFrames.c ============================================================*/ /*=== intFrames.c ============================================================*/
extern Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts ); extern Aig_Man_t * Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int fAddRegOuts, int fUseTwoFrames );
/*=== intMan.c ============================================================*/ /*=== intMan.c ============================================================*/
extern Inter_Man_t * Inter_ManCreate( Aig_Man_t * pAig, Inter_ManParams_t * pPars ); extern Inter_Man_t * Inter_ManCreate( Aig_Man_t * pAig, Inter_ManParams_t * pPars );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment