Commit c7ebd932 by Alan Mishchenko

Improvements to CEC command iprove.

parent 06ae1644
...@@ -356,7 +356,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars ) ...@@ -356,7 +356,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars )
return -1; return -1;
} }
} }
/*
if ( RetValue < 0 ) if ( RetValue < 0 )
{ {
if ( pParams->fVerbose ) if ( pParams->fVerbose )
...@@ -385,7 +385,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars ) ...@@ -385,7 +385,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars )
exit(1); exit(1);
} }
} }
*/
// assign the model if it was proved by rewriting (const 1 miter) // assign the model if it was proved by rewriting (const 1 miter)
if ( RetValue == 0 && pManAig->pData == NULL ) if ( RetValue == 0 && pManAig->pData == NULL )
{ {
......
...@@ -10420,13 +10420,74 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -10420,13 +10420,74 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv )
pParams->fUseRewriting = 1; pParams->fUseRewriting = 1;
pParams->fVerbose = 0; pParams->fVerbose = 0;
Extra_UtilGetoptReset(); Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "rvh" ) ) != EOF ) while ( ( c = Extra_UtilGetopt( argc, argv, "NCFLIrfbvh" ) ) != EOF )
{ {
switch ( c ) switch ( c )
{ {
case 'N':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-N\" should be followed by an integer.\n" );
goto usage;
}
pParams->nItersMax = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( pParams->nItersMax < 0 )
goto usage;
break;
case 'C':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-C\" should be followed by an integer.\n" );
goto usage;
}
pParams->nMiteringLimitStart = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( pParams->nMiteringLimitStart < 0 )
goto usage;
break;
case 'F':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-F\" should be followed by an integer.\n" );
goto usage;
}
pParams->nFraigingLimitStart = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( pParams->nFraigingLimitStart < 0 )
goto usage;
break;
case 'L':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-L\" should be followed by an integer.\n" );
goto usage;
}
pParams->nMiteringLimitLast = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( pParams->nMiteringLimitLast < 0 )
goto usage;
break;
case 'I':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-I\" should be followed by an integer.\n" );
goto usage;
}
pParams->nTotalInspectLimit = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( pParams->nTotalInspectLimit < 0 )
goto usage;
break;
case 'r': case 'r':
pParams->fUseRewriting ^= 1; pParams->fUseRewriting ^= 1;
break; break;
case 'f':
pParams->fUseFraiging ^= 1;
break;
case 'b':
pParams->fUseBdds ^= 1;
break;
case 'v': case 'v':
pParams->fVerbose ^= 1; pParams->fVerbose ^= 1;
break; break;
...@@ -10488,10 +10549,17 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -10488,10 +10549,17 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: iprove [-rvh]\n" ); Abc_Print( -2, "usage: iprove [-NCFLI num] [-rfbvh]\n" );
Abc_Print( -2, "\t performs CEC using a new method\n" ); Abc_Print( -2, "\t performs CEC using a new method\n" );
Abc_Print( -2, "\t-r : toggle AIG rewriting [default = %s]\n", pParams->fUseRewriting? "yes": "no" ); Abc_Print( -2, "\t-N num : max number of iterations [default = %d]\n", pParams->nItersMax );
Abc_Print( -2, "\t-v : toggle verbose printout [default = %s]\n", pParams->fVerbose? "yes": "no" ); Abc_Print( -2, "\t-C num : max starting number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitStart );
Abc_Print( -2, "\t-F num : max starting number of conflicts in fraiging [default = %d]\n", pParams->nFraigingLimitStart );
Abc_Print( -2, "\t-L num : max last-gasp number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitLast );
Abc_Print( -2, "\t-I num : max number of clause inspections in all SAT calls [default = %d]\n", (int)pParams->nTotalInspectLimit );
Abc_Print( -2, "\t-r : toggle the use of rewriting [default = %s]\n", pParams->fUseRewriting? "yes": "no" );
Abc_Print( -2, "\t-f : toggle the use of FRAIGing [default = %s]\n", pParams->fUseFraiging? "yes": "no" );
Abc_Print( -2, "\t-b : toggle the use of BDDs [default = %s]\n", pParams->fUseBdds? "yes": "no" );
Abc_Print( -2, "\t-v : prints verbose information [default = %s]\n", pParams->fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n"); Abc_Print( -2, "\t-h : print the command usage\n");
return 1; return 1;
} }
...@@ -17910,10 +17978,10 @@ int Abc_CommandProve( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -17910,10 +17978,10 @@ int Abc_CommandProve( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0; return 0;
usage: usage:
Abc_Print( -2, "usage: prove [-N num] [-C num] [-F num] [-L num] [-I num] [-rfbvh]\n" ); Abc_Print( -2, "usage: prove [-NCFLI num] [-rfbvh]\n" );
Abc_Print( -2, "\t solves combinational miter by rewriting, FRAIGing, and SAT\n" ); Abc_Print( -2, "\t solves combinational miter by rewriting, FRAIGing, and SAT\n" );
Abc_Print( -2, "\t replaces the current network by the cone modified by rewriting\n" ); Abc_Print( -2, "\t replaces the current network by the cone modified by rewriting\n" );
Abc_Print( -2, "\t (there are also newer CEC commands, \"iprove\" and \"dprove\")\n" ); Abc_Print( -2, "\t (there is also newer CEC command \"iprove\")\n" );
Abc_Print( -2, "\t-N num : max number of iterations [default = %d]\n", pParams->nItersMax ); Abc_Print( -2, "\t-N num : max number of iterations [default = %d]\n", pParams->nItersMax );
Abc_Print( -2, "\t-C num : max starting number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitStart ); Abc_Print( -2, "\t-C num : max starting number of conflicts in mitering [default = %d]\n", pParams->nMiteringLimitStart );
Abc_Print( -2, "\t-F num : max starting number of conflicts in fraiging [default = %d]\n", pParams->nFraigingLimitStart ); Abc_Print( -2, "\t-F num : max starting number of conflicts in fraiging [default = %d]\n", pParams->nFraigingLimitStart );
......
...@@ -496,7 +496,6 @@ Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, in ...@@ -496,7 +496,6 @@ Abc_Ntk_t * Abc_NtkIvyFraig( Abc_Ntk_t * pNtk, int nConfLimit, int fDoSparse, in
***********************************************************************/ ***********************************************************************/
int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars ) int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars )
{ {
Prove_Params_t * pParams = (Prove_Params_t *)pPars; Prove_Params_t * pParams = (Prove_Params_t *)pPars;
Abc_Ntk_t * pNtk = *ppNtk, * pNtkTemp; Abc_Ntk_t * pNtk = *ppNtk, * pNtkTemp;
Abc_Obj_t * pObj, * pFanin; Abc_Obj_t * pObj, * pFanin;
...@@ -563,6 +562,8 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars ) ...@@ -563,6 +562,8 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars )
// solve the CEC problem // solve the CEC problem
RetValue = Ivy_FraigProve( &pMan, pParams ); RetValue = Ivy_FraigProve( &pMan, pParams );
// RetValue = -1;
// convert IVY network into ABC network // convert IVY network into ABC network
pNtk = Abc_NtkIvyAfter( pNtkTemp = pNtk, pMan, 0, 0 ); pNtk = Abc_NtkIvyAfter( pNtkTemp = pNtk, pMan, 0, 0 );
Abc_NtkDelete( pNtkTemp ); Abc_NtkDelete( pNtkTemp );
...@@ -570,7 +571,24 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars ) ...@@ -570,7 +571,24 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars )
pNtk->pModel = (int *)pMan->pData; pMan->pData = NULL; pNtk->pModel = (int *)pMan->pData; pMan->pData = NULL;
Ivy_ManStop( pMan ); Ivy_ManStop( pMan );
// try to prove it using brute force SAT // try to prove it using brute force SAT with good CNF encoding
if ( RetValue < 0 )
{
pMan2 = Abc_NtkToDar( pNtk, 0, 0 );
// dump the miter before entering high-effort solving
if ( pParams->fVerbose )
{
char pFileName[100];
sprintf( pFileName, "cecmiter.aig" );
Ioa_WriteAiger( pMan2, pFileName, 0, 0 );
printf( "Intermediate reduced miter is written into file \"%s\".\n", pFileName );
}
RetValue = Fra_FraigSat( pMan2, pParams->nMiteringLimitLast, 0, 0, 0, pParams->fVerbose );
pNtk->pModel = (int *)pMan2->pData, pMan2->pData = NULL;
Aig_ManStop( pMan2 );
}
// try to prove it using brute force BDDs
if ( RetValue < 0 && pParams->fUseBdds ) if ( RetValue < 0 && pParams->fUseBdds )
{ {
if ( pParams->fVerbose ) if ( pParams->fVerbose )
......
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