diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2011-11-12 16:56:41 -0800 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2011-11-12 16:56:41 -0800 | 
| commit | c1ac6b9b3e9fb87a209692ae9d513520ca5918ba (patch) | |
| tree | c558cbbc28b4d32cfee738862dc1abbce6be1239 /src | |
| parent | b38df9feec7d5858e978a0243d98f362337ac8f1 (diff) | |
| download | abc-c1ac6b9b3e9fb87a209692ae9d513520ca5918ba.tar.gz abc-c1ac6b9b3e9fb87a209692ae9d513520ca5918ba.tar.bz2 abc-c1ac6b9b3e9fb87a209692ae9d513520ca5918ba.zip  | |
Dump inductive invariant or last interpolant after interpolation.
Diffstat (limited to 'src')
| -rw-r--r-- | src/aig/aig/aig.h | 1 | ||||
| -rw-r--r-- | src/aig/aig/aigDup.c | 47 | ||||
| -rw-r--r-- | src/aig/int/int.h | 1 | ||||
| -rw-r--r-- | src/aig/int/intCore.c | 16 | ||||
| -rw-r--r-- | src/aig/int/intInt.h | 2 | ||||
| -rw-r--r-- | src/aig/int/intMan.c | 54 | ||||
| -rw-r--r-- | src/base/abci/abc.c | 8 | 
7 files changed, 108 insertions, 21 deletions
diff --git a/src/aig/aig/aig.h b/src/aig/aig/aig.h index 731f7c84..40d7a90c 100644 --- a/src/aig/aig/aig.h +++ b/src/aig/aig/aig.h @@ -522,6 +522,7 @@ extern Aig_Man_t *     Aig_ManCreateMiter( Aig_Man_t * p1, Aig_Man_t * p2, int f  extern Aig_Man_t *     Aig_ManDupOrpos( Aig_Man_t * p, int fAddRegs );  extern Aig_Man_t *     Aig_ManDupOneOutput( Aig_Man_t * p, int iPoNum, int fAddRegs );  extern Aig_Man_t *     Aig_ManDupUnsolvedOutputs( Aig_Man_t * p, int fAddRegs ); +extern Aig_Man_t *     Aig_ManDupArray( Vec_Ptr_t * vArray );  /*=== aigFanout.c ==========================================================*/  extern void            Aig_ObjAddFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout );  extern void            Aig_ObjRemoveFanout( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pFanout ); diff --git a/src/aig/aig/aigDup.c b/src/aig/aig/aigDup.c index dcd2e477..4c3b2840 100644 --- a/src/aig/aig/aigDup.c +++ b/src/aig/aig/aigDup.c @@ -1295,6 +1295,53 @@ Aig_Man_t * Aig_ManDupUnsolvedOutputs( Aig_Man_t * p, int fAddRegs )      return pNew;  } +/**Function************************************************************* + +  Synopsis    [Duplicates AIG with only one primary output.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Aig_Man_t * Aig_ManDupArray( Vec_Ptr_t * vArray ) +{ +    Aig_Man_t * p, * pNew; +    Aig_Obj_t * pObj; +    int i, k; +    if ( Vec_PtrSize(vArray) == 0 ) +        return NULL; +    p = Vec_PtrEntry( vArray, 0 ); +    Vec_PtrForEachEntry( Aig_Man_t *, vArray, pNew, k ) +    { +        assert( Aig_ManRegNum(pNew) == 0 ); +        assert( Aig_ManPiNum(pNew) == Aig_ManPiNum(p) ); +    } +    // create the new manager +    pNew = Aig_ManStart( 10000 ); +    pNew->pName = Aig_UtilStrsav( p->pName ); +    Aig_ManForEachPi( p, pObj, i ) +        Aig_ObjCreatePi(pNew); +    // create the PIs +    Vec_PtrForEachEntry( Aig_Man_t *, vArray, p, k ) +    { +        Aig_ManConst1(p)->pData = Aig_ManConst1(pNew); +        Aig_ManForEachPi( p, pObj, i ) +            pObj->pData = Aig_ManPi( pNew, i ); +        Aig_ManForEachNode( p, pObj, i ) +            pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); +        Aig_ManForEachPo( p, pObj, i ) +            Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) ); +    } +    Aig_ManSetRegNum( pNew, Aig_ManRegNum(p) ); +    // check the resulting network +    if ( !Aig_ManCheck(pNew) ) +        printf( "Aig_ManDupSimple(): The check has failed.\n" ); +    return pNew; +} +  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                /// diff --git a/src/aig/int/int.h b/src/aig/int/int.h index 907691ed..4b8d78bb 100644 --- a/src/aig/int/int.h +++ b/src/aig/int/int.h @@ -62,6 +62,7 @@ struct Inter_ManParams_t_      int  fUseBackward;  // perform backward interpolation      int  fUseSeparate;  // solve each output separately      int  fDropSatOuts;  // replace by 1 the solved outputs +    int  fDropInvar;    // dump inductive invariant into file      int  fVerbose;      // print verbose statistics      int  iFrameMax;     // the time frame reached  }; diff --git a/src/aig/int/intCore.c b/src/aig/int/intCore.c index 0cd5eb36..3bd111be 100644 --- a/src/aig/int/intCore.c +++ b/src/aig/int/intCore.c @@ -179,6 +179,8 @@ p->timeCnf += clock() - clk;              RetValue = Inter_CheckPerform( pCheck, pCnfInter2, nTimeNewOut );  //            assert( RetValue == 0 );              Cnf_DataFree( pCnfInter2 ); +            if ( p->vInters ) +                Vec_PtrPush( p->vInters, Aig_ManDupSimple(p->pInter) );          }          ////////////////////////////////////////// @@ -190,7 +192,7 @@ p->timeCnf += clock() - clk;                  if ( pPars->fVerbose )                      printf( "Reached limit (%d) on the number of timeframes.\n", pPars->nFramesMax );                  p->timeTotal = clock() - clkTotal; -                Inter_ManStop( p ); +                Inter_ManStop( p, 0 );                  Inter_CheckStop( pCheck );                  return -1;              } @@ -237,7 +239,7 @@ p->timeCnf += clock() - clk;                          else if ( RetValue == -1 )                              printf( "Error: The problem timed out.\n" );                      } -                    Inter_ManStop( p ); +                    Inter_ManStop( p, 0 );                      Inter_CheckStop( pCheck );                      return 0;                  } @@ -260,7 +262,7 @@ p->timeCnf += clock() - clk;                          printf( "Reached limit (%d) on the number of conflicts.\n", p->nConfLimit );                  }                  p->timeTotal = clock() - clkTotal; -                Inter_ManStop( p ); +                Inter_ManStop( p, 0 );                  Inter_CheckStop( pCheck );                  return -1;              } @@ -283,7 +285,7 @@ p->timeRwr += clock() - clk;                  if ( pPars->fVerbose )                      printf( "The problem is trivially true for all states.\n" );                  p->timeTotal = clock() - clkTotal; -                Inter_ManStop( p ); +                Inter_ManStop( p, 1 );                  Inter_CheckStop( pCheck );                  return 1;              } @@ -305,6 +307,8 @@ timeTemp = clock() - clk2;                          Status = Inter_CheckPerform( pCheck, pCnfInter2, nTimeNewOut );                          Cnf_DataFree( pCnfInter2 ); +                        if ( p->vInters ) +                            Vec_PtrPush( p->vInters, Aig_ManDupSimple(p->pInterNew) );                      }                  }                  else @@ -323,7 +327,7 @@ p->timeEqu += clock() - clk - timeTemp;                  if ( pPars->fVerbose )                      printf( "Proved containment of interpolants.\n" );                  p->timeTotal = clock() - clkTotal; -                Inter_ManStop( p ); +                Inter_ManStop( p, 1 );                  Inter_CheckStop( pCheck );                  return 1;              } @@ -331,7 +335,7 @@ p->timeEqu += clock() - clk - timeTemp;              {                  printf( "Reached timeout (%d seconds).\n",  pPars->nSecLimit );                  p->timeTotal = clock() - clkTotal; -                Inter_ManStop( p ); +                Inter_ManStop( p, 1 );                  Inter_CheckStop( pCheck );                  return -1;              } diff --git a/src/aig/int/intInt.h b/src/aig/int/intInt.h index 3eab7883..66ff9578 100644 --- a/src/aig/int/intInt.h +++ b/src/aig/int/intInt.h @@ -114,7 +114,7 @@ extern Aig_Man_t *     Inter_ManFramesInter( Aig_Man_t * pAig, int nFrames, int  /*=== intMan.c ============================================================*/  extern Inter_Man_t *   Inter_ManCreate( Aig_Man_t * pAig, Inter_ManParams_t * pPars );  extern void            Inter_ManClean( Inter_Man_t * p ); -extern void            Inter_ManStop( Inter_Man_t * p ); +extern void            Inter_ManStop( Inter_Man_t * p, int fProved );  /*=== intM114.c ============================================================*/  extern int             Inter_ManPerformOneStep( Inter_Man_t * p, int fUseBias, int fUseBackward, int nTimeNewOut ); diff --git a/src/aig/int/intMan.c b/src/aig/int/intMan.c index 2faef198..d6219f6b 100644 --- a/src/aig/int/intMan.c +++ b/src/aig/int/intMan.c @@ -19,6 +19,7 @@  ***********************************************************************/  #include "intInt.h" +#include "ioa.h"  ABC_NAMESPACE_IMPL_START @@ -51,7 +52,9 @@ Inter_Man_t * Inter_ManCreate( Aig_Man_t * pAig, Inter_ManParams_t * pPars )      p->vVarsAB = Vec_IntAlloc( Aig_ManRegNum(pAig) );      p->nConfLimit = pPars->nBTLimit;      p->fVerbose = pPars->fVerbose; -    p->pAig = pAig;    +    p->pAig = pAig; +    if ( pPars->fDropInvar ) +        p->vInters = Vec_PtrAlloc( 100 );      return p;  } @@ -68,6 +71,14 @@ Inter_Man_t * Inter_ManCreate( Aig_Man_t * pAig, Inter_ManParams_t * pPars )  ***********************************************************************/  void Inter_ManClean( Inter_Man_t * p )  { +    if ( p->vInters ) +    { +        Aig_Man_t * pMan; +        int i; +        Vec_PtrForEachEntry( Aig_Man_t *, p->vInters, pMan, i ) +            Aig_ManStop( pMan ); +        Vec_PtrClear( p->vInters ); +    }      if ( p->pCnfInter )          Cnf_DataFree( p->pCnfInter );      if ( p->pCnfFrames ) @@ -80,6 +91,29 @@ void Inter_ManClean( Inter_Man_t * p )  /**Function************************************************************* +  Synopsis    [Writes interpolant into a file.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Inter_ManInterDump( Inter_Man_t * p, int fProved ) +{ +    Aig_Man_t * pMan; +    pMan = Aig_ManDupArray( p->vInters ); +    Ioa_WriteAiger( pMan, "invar.aig", 0, 0 ); +    Aig_ManStop( pMan ); +    if ( fProved ) +        printf( "Inductive invariant is dumped into file \"invar.aig\".\n" ); +    else +        printf( "Interpolants are dumped into file \"inter.aig\".\n" ); +} + +/**Function************************************************************* +    Synopsis    [Frees the interpolation manager.]    Description [] @@ -89,7 +123,7 @@ void Inter_ManClean( Inter_Man_t * p )    SeeAlso     []  ***********************************************************************/ -void Inter_ManStop( Inter_Man_t * p ) +void Inter_ManStop( Inter_Man_t * p, int fProved )  {      if ( p->fVerbose )      { @@ -104,26 +138,22 @@ void Inter_ManStop( Inter_Man_t * p )          ABC_PRTP( "TOTAL      ", p->timeTotal, p->timeTotal );      } +    if ( p->vInters ) +        Inter_ManInterDump( p, fProved ); +      if ( p->pCnfAig )          Cnf_DataFree( p->pCnfAig ); -    if ( p->pCnfFrames ) -        Cnf_DataFree( p->pCnfFrames ); -    if ( p->pCnfInter ) -        Cnf_DataFree( p->pCnfInter ); -    Vec_IntFree( p->vVarsAB );      if ( p->pAigTrans )          Aig_ManStop( p->pAigTrans ); -    if ( p->pFrames ) -        Aig_ManStop( p->pFrames ); -    if ( p->pInter ) -        Aig_ManStop( p->pInter );      if ( p->pInterNew )          Aig_ManStop( p->pInterNew ); +    Inter_ManClean( p ); +    Vec_PtrFreeP( &p->vInters ); +    Vec_IntFreeP( &p->vVarsAB );      ABC_FREE( p );  } -  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index a1d32f5b..ed40fee0 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -19316,7 +19316,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )      // set defaults      Inter_ManSetDefaultParams( pPars );      Extra_UtilGetoptReset(); -    while ( ( c = Extra_UtilGetopt( argc, argv, "CFTKLrtpomcgbkdvh" ) ) != EOF ) +    while ( ( c = Extra_UtilGetopt( argc, argv, "CFTKLrtpomcgbkdfvh" ) ) != EOF )      {          switch ( c )          { @@ -19403,6 +19403,9 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )          case 'd':              pPars->fDropSatOuts ^= 1;              break; +        case 'f': +            pPars->fDropInvar ^= 1; +            break;          case 'v':              pPars->fVerbose ^= 1;              break; @@ -19473,7 +19476,7 @@ int Abc_CommandBmcInter( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  usage: -    Abc_Print( -2, "usage: int [-CFTK num] [-L file] [-rtpomcgbkdvh]\n" ); +    Abc_Print( -2, "usage: int [-CFTK num] [-L file] [-rtpomcgbkdfvh]\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-F num : the limit on number of frames to unroll [default = %d]\n", pPars->nFramesMax ); @@ -19491,6 +19494,7 @@ usage:      Abc_Print( -2, "\t-b     : toggle using backward interpolation (works with -t) [default = %s]\n", pPars->fUseBackward? "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-f     : toggle dumping inductive invariant into a file [default = %s]\n", pPars->fDropInvar? "yes": "no" );      Abc_Print( -2, "\t-v     : toggle verbose output [default = %s]\n", pPars->fVerbose? "yes": "no" );      Abc_Print( -2, "\t-h     : print the command usage\n");      return 1;  | 
