diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/aig/ivy/ivyFraig.c | 4 | ||||
| -rw-r--r-- | src/base/abci/abc.c | 80 | ||||
| -rw-r--r-- | src/base/abci/abcIvy.c | 22 | 
3 files changed, 96 insertions, 10 deletions
diff --git a/src/aig/ivy/ivyFraig.c b/src/aig/ivy/ivyFraig.c index 77b64700..7310d4cb 100644 --- a/src/aig/ivy/ivyFraig.c +++ b/src/aig/ivy/ivyFraig.c @@ -356,7 +356,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars )              return -1;          }      }     - +/*      if ( RetValue < 0 )      {          if ( pParams->fVerbose ) @@ -385,7 +385,7 @@ int Ivy_FraigProve( Ivy_Man_t ** ppManAig, void * pPars )              exit(1);          }      } - +*/      // assign the model if it was proved by rewriting (const 1 miter)      if ( RetValue == 0 && pManAig->pData == NULL )      { diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 4b95b900..5a83936f 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -10420,13 +10420,74 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv )      pParams->fUseRewriting = 1;      pParams->fVerbose      = 0;      Extra_UtilGetoptReset(); -    while ( ( c = Extra_UtilGetopt( argc, argv, "rvh" ) ) != EOF ) +    while ( ( c = Extra_UtilGetopt( argc, argv, "NCFLIrfbvh" ) ) != EOF )      {          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':              pParams->fUseRewriting ^= 1;              break; +        case 'f': +            pParams->fUseFraiging ^= 1; +            break; +        case 'b': +            pParams->fUseBdds ^= 1; +            break;          case 'v':              pParams->fVerbose ^= 1;              break; @@ -10488,10 +10549,17 @@ int Abc_CommandIProve( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  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-r     : toggle AIG rewriting [default = %s]\n", pParams->fUseRewriting? "yes": "no" ); -    Abc_Print( -2, "\t-v     : toggle verbose printout [default = %s]\n", pParams->fVerbose? "yes": "no" ); +    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-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");      return 1;  } @@ -17910,10 +17978,10 @@ int Abc_CommandProve( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  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         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-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 ); diff --git a/src/base/abci/abcIvy.c b/src/base/abci/abcIvy.c index 979b2a4a..092350ca 100644 --- a/src/base/abci/abcIvy.c +++ b/src/base/abci/abcIvy.c @@ -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 )  { -      Prove_Params_t * pParams = (Prove_Params_t *)pPars;      Abc_Ntk_t * pNtk = *ppNtk, * pNtkTemp;      Abc_Obj_t * pObj, * pFanin; @@ -563,6 +562,8 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars )      // solve the CEC problem      RetValue = Ivy_FraigProve( &pMan, pParams ); +//    RetValue = -1; +      // convert IVY network into ABC network          pNtk = Abc_NtkIvyAfter( pNtkTemp = pNtk, pMan, 0, 0 );      Abc_NtkDelete( pNtkTemp ); @@ -570,7 +571,24 @@ int Abc_NtkIvyProve( Abc_Ntk_t ** ppNtk, void * pPars )      pNtk->pModel = (int *)pMan->pData; pMan->pData = NULL;      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 ( pParams->fVerbose )  | 
