diff options
| author | Yen-Sheng Ho <ysho@berkeley.edu> | 2017-02-27 14:31:59 -0800 | 
|---|---|---|
| committer | Yen-Sheng Ho <ysho@berkeley.edu> | 2017-02-27 14:31:59 -0800 | 
| commit | 9195192f65bed0c5f3ca2fd8f8b51b34b94f47b3 (patch) | |
| tree | fa502294f5db24538c5983734592cffd9003a958 /src | |
| parent | bb3eacf480360a51ea2c131bb4b4feff213d3170 (diff) | |
| download | abc-9195192f65bed0c5f3ca2fd8f8b51b34b94f47b3.tar.gz abc-9195192f65bed0c5f3ca2fd8f8b51b34b94f47b3.tar.bz2 abc-9195192f65bed0c5f3ca2fd8f8b51b34b94f47b3.zip  | |
%pdra -L: now applies to all types
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/wlc/wlc.h | 2 | ||||
| -rw-r--r-- | src/base/wlc/wlcAbs.c | 128 | ||||
| -rw-r--r-- | src/base/wlc/wlcCom.c | 6 | ||||
| -rw-r--r-- | src/base/wlc/wlcNtk.c | 2 | 
4 files changed, 105 insertions, 33 deletions
diff --git a/src/base/wlc/wlc.h b/src/base/wlc/wlc.h index 49ad5bf0..1a2bc505 100644 --- a/src/base/wlc/wlc.h +++ b/src/base/wlc/wlc.h @@ -169,7 +169,7 @@ struct Wlc_Par_t_      int                    nBitsMux;           // MUX bit-width      int                    nBitsFlop;          // flop bit-width      int                    nIterMax;           // the max number of iterations -    int                    nMuxLimit;          // the max number of muxes +    int                    nLimit;             // the max number of signals      int                    fXorOutput;         // XOR outputs of word-level miter      int                    fCheckClauses;      // Check clauses in the reloaded trace                          int                    fPushClauses;       // Push clauses in the reloaded trace                     diff --git a/src/base/wlc/wlcAbs.c b/src/base/wlc/wlcAbs.c index 333c3a48..c599b9a0 100644 --- a/src/base/wlc/wlcAbs.c +++ b/src/base/wlc/wlcAbs.c @@ -465,21 +465,45 @@ static int Wlc_NtkUpdateBlacks( Wlc_Ntk_t * p, Wlc_Par_t * pPars, Vec_Int_t ** p      return 0;  } -static Vec_Bit_t * Wlc_NtkMarkMuxes( Wlc_Ntk_t * p, Wlc_Par_t * pPars ) +static Vec_Bit_t * Wlc_NtkMarkLimit( Wlc_Ntk_t * p, Wlc_Par_t * pPars )  { -    Vec_Bit_t * vMuxMark = NULL; +    Vec_Bit_t * vMarks = NULL; +    Vec_Ptr_t * vAdds  = Vec_PtrAlloc( 1000 );      Vec_Ptr_t * vMuxes = Vec_PtrAlloc( 1000 ); +    Vec_Ptr_t * vMults = Vec_PtrAlloc( 1000 ); +    Vec_Ptr_t * vFlops = Vec_PtrAlloc( 1000 );      Wlc_Obj_t * pObj; int i;      Int_Pair_t * pPair; -    if ( pPars->nMuxLimit == ABC_INFINITY ) +    if ( pPars->nLimit == ABC_INFINITY )          return NULL; -    vMuxMark = Vec_BitStart( Wlc_NtkObjNumMax( p ) ); +    vMarks = Vec_BitStart( Wlc_NtkObjNumMax( p ) );      Wlc_NtkForEachObj( p, pObj, i )      { -        if ( pObj->Type == WLC_OBJ_MUX ) { +        if ( pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB || pObj->Type == WLC_OBJ_ARI_MINUS ) +        { +            if ( Wlc_ObjRange(pObj) >= pPars->nBitsAdd ) +            { +                pPair = ABC_ALLOC( Int_Pair_t, 1 ); +                pPair->first = i; +                pPair->second = Wlc_ObjRange( pObj ); +                Vec_PtrPush( vAdds, pPair ); +            } +        } +        else if ( pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_DIVIDE || pObj->Type == WLC_OBJ_ARI_REM || pObj->Type == WLC_OBJ_ARI_MODULUS ) +        { +            if ( Wlc_ObjRange(pObj) >= pPars->nBitsMul ) +            { +                pPair = ABC_ALLOC( Int_Pair_t, 1 ); +                pPair->first = i; +                pPair->second = Wlc_ObjRange( pObj ); +                Vec_PtrPush( vMults, pPair ); +            } +        } +        else if ( pObj->Type == WLC_OBJ_MUX )  +        {              if ( Wlc_ObjRange(pObj) >= pPars->nBitsMux )              {                  pPair = ABC_ALLOC( Int_Pair_t, 1 ); @@ -488,60 +512,103 @@ static Vec_Bit_t * Wlc_NtkMarkMuxes( Wlc_Ntk_t * p, Wlc_Par_t * pPars )                  Vec_PtrPush( vMuxes, pPair );              }          } +        else if ( Wlc_ObjIsCi(pObj) && !Wlc_ObjIsPi(pObj) ) +        { +            if ( Wlc_ObjRange(pObj) >= pPars->nBitsFlop ) +            { +                pPair = ABC_ALLOC( Int_Pair_t, 1 ); +                pPair->first = i; +                pPair->second = Wlc_ObjRange( pObj ); +                Vec_PtrPush( vFlops, pPair ); +            } +        }      } +    Vec_PtrSort( vAdds,  (int (*)(void))IntPairPtrCompare ) ; +    Vec_PtrSort( vMults, (int (*)(void))IntPairPtrCompare ) ;      Vec_PtrSort( vMuxes, (int (*)(void))IntPairPtrCompare ) ; +    Vec_PtrSort( vFlops, (int (*)(void))IntPairPtrCompare ) ; -    Vec_PtrForEachEntry( Int_Pair_t *, vMuxes, pPair, i ) +    Vec_PtrForEachEntry( Int_Pair_t *, vAdds, pPair, i )      { -        if ( i >= pPars->nMuxLimit ) -           break; -         -        Vec_BitWriteEntry( vMuxMark, pPair->first, 1 );  +        if ( i >= pPars->nLimit ) break; +        Vec_BitWriteEntry( vMarks, pPair->first, 1 );       } +    if ( i && pPars->fVerbose ) Abc_Print( 1, "%%PDRA: %d-th ADD has width = %d\n", i, pPair->second ); -    if ( i && pPars->fVerbose ) -        Abc_Print( 1, "%%PDRA: %d-th MUX has width = %d\n", i, pPair->second ); +    Vec_PtrForEachEntry( Int_Pair_t *, vMults, pPair, i ) +    { +        if ( i >= pPars->nLimit ) break; +        Vec_BitWriteEntry( vMarks, pPair->first, 1 );  +    } +    if ( i && pPars->fVerbose ) Abc_Print( 1, "%%PDRA: %d-th MUL has width = %d\n", i, pPair->second );      Vec_PtrForEachEntry( Int_Pair_t *, vMuxes, pPair, i ) -        ABC_FREE( pPair ); +    { +        if ( i >= pPars->nLimit ) break;  +        Vec_BitWriteEntry( vMarks, pPair->first, 1 );  +    } +    if ( i && pPars->fVerbose ) Abc_Print( 1, "%%PDRA: %d-th MUX has width = %d\n", i, pPair->second ); + +    Vec_PtrForEachEntry( Int_Pair_t *, vFlops, pPair, i ) +    { +        if ( i >= pPars->nLimit ) break; +        Vec_BitWriteEntry( vMarks, pPair->first, 1 );  +    } +    if ( i && pPars->fVerbose ) Abc_Print( 1, "%%PDRA: %d-th FF has width = %d\n", i, pPair->second ); + + +    Vec_PtrForEachEntry( Int_Pair_t *, vAdds,  pPair, i ) ABC_FREE( pPair ); +    Vec_PtrForEachEntry( Int_Pair_t *, vMults, pPair, i ) ABC_FREE( pPair ); +    Vec_PtrForEachEntry( Int_Pair_t *, vMuxes, pPair, i ) ABC_FREE( pPair ); +    Vec_PtrForEachEntry( Int_Pair_t *, vFlops, pPair, i ) ABC_FREE( pPair ); +    Vec_PtrFree( vAdds ); +    Vec_PtrFree( vMults );      Vec_PtrFree( vMuxes ); +    Vec_PtrFree( vFlops ); -    return vMuxMark; +    return vMarks;  } -static Vec_Int_t * Wlc_NtkGetBlacks( Wlc_Ntk_t * p, Wlc_Par_t * pPars, Vec_Bit_t * vUnmark ) +static Vec_Int_t * Wlc_NtkGetBlacks( Wlc_Ntk_t * p, Wlc_Par_t * pPars )  {      Vec_Int_t * vBlacks = Vec_IntAlloc( 100 ) ;      Wlc_Obj_t * pObj; int i, Count[4] = {0}; -    Vec_Bit_t * vMuxMark = NULL; +    Vec_Bit_t * vMarks = NULL; -    vMuxMark = Wlc_NtkMarkMuxes( p, pPars ) ;  +    vMarks = Wlc_NtkMarkLimit( p, pPars ) ;       Wlc_NtkForEachObj( p, pObj, i )      { -        if ( vUnmark && Vec_BitEntry(vUnmark, i) ) // not allow this object to be abstracted away -            continue; -          if ( pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB || pObj->Type == WLC_OBJ_ARI_MINUS )          {              if ( Wlc_ObjRange(pObj) >= pPars->nBitsAdd ) -                Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[0]++; +            { +                if ( vMarks == NULL ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[0]++; +                else if ( Vec_BitEntry( vMarks, i ) ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[0]++; +            }              continue;          }          if ( pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_DIVIDE || pObj->Type == WLC_OBJ_ARI_REM || pObj->Type == WLC_OBJ_ARI_MODULUS )          {              if ( Wlc_ObjRange(pObj) >= pPars->nBitsMul ) -                Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[1]++; +            { +                if ( vMarks == NULL ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[1]++; +                else if ( Vec_BitEntry( vMarks, i ) ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[1]++; +            }              continue;          }          if ( pObj->Type == WLC_OBJ_MUX )          {              if ( Wlc_ObjRange(pObj) >= pPars->nBitsMux )              { -                if ( vMuxMark == NULL ) +                if ( vMarks == NULL )                      Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[2]++; -                else if ( Vec_BitEntry( vMuxMark, i ) ) +                else if ( Vec_BitEntry( vMarks, i ) )                      Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId(p, pObj) ), Count[2]++;              }              continue; @@ -549,12 +616,17 @@ static Vec_Int_t * Wlc_NtkGetBlacks( Wlc_Ntk_t * p, Wlc_Par_t * pPars, Vec_Bit_t          if ( Wlc_ObjIsCi(pObj) && !Wlc_ObjIsPi(pObj) )          {              if ( Wlc_ObjRange(pObj) >= pPars->nBitsFlop ) -                Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId( p, Wlc_ObjFo2Fi( p, pObj ) ) ), Count[3]++; +            { +                if ( vMarks == NULL ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId( p, Wlc_ObjFo2Fi( p, pObj ) ) ), Count[3]++; +                else if ( Vec_BitEntry( vMarks, i ) ) +                    Vec_IntPushUniqueOrder( vBlacks, Wlc_ObjId( p, Wlc_ObjFo2Fi( p, pObj ) ) ), Count[3]++; +            }              continue;          }      } -    if ( vMuxMark ) -        Vec_BitFree( vMuxMark ); +    if ( vMarks ) +        Vec_BitFree( vMarks );      if ( pPars->fVerbose )          printf( "Abstraction engine marked %d adds/subs, %d muls/divs, %d muxes, and %d flops to be abstracted away.\n", Count[0], Count[1], Count[2], Count[3] );      return vBlacks; @@ -939,7 +1011,7 @@ int Wlc_NtkPdrAbs( Wlc_Ntk_t * p, Wlc_Par_t * pPars )          if ( pPars->fProofRefine )          {              if ( vBlacks == NULL ) -                vBlacks = Wlc_NtkGetBlacks( p, pPars, vUnmark ); +                vBlacks = Wlc_NtkGetBlacks( p, pPars );              else                  Wlc_NtkUpdateBlacks( p, pPars, &vBlacks, vUnmark );              pAbs = Wlc_NtkAbs2( p, vBlacks, &vFfNew ); diff --git a/src/base/wlc/wlcCom.c b/src/base/wlc/wlcCom.c index 0528b4c4..0bad60bf 100644 --- a/src/base/wlc/wlcCom.c +++ b/src/base/wlc/wlcCom.c @@ -527,9 +527,9 @@ int Abc_CommandPdrAbs( Abc_Frame_t * pAbc, int argc, char ** argv )                  Abc_Print( -1, "Command line switch \"-L\" should be followed by an integer.\n" );                  goto usage;              } -            pPars->nMuxLimit = atoi(argv[globalUtilOptind]); +            pPars->nLimit = atoi(argv[globalUtilOptind]);              globalUtilOptind++; -            if ( pPars->nMuxLimit < 0 ) +            if ( pPars->nLimit < 0 )                  goto usage;              break;          case 'a': @@ -577,7 +577,7 @@ usage:      Abc_Print( -2, "\t-X num : minimum bit-width of a MUX operator to abstract [default = %d]\n",      pPars->nBitsMux );      Abc_Print( -2, "\t-F num : minimum bit-width of a flip-flop to abstract [default = %d]\n",         pPars->nBitsFlop );      Abc_Print( -2, "\t-I num : maximum number of CEGAR iterations [default = %d]\n",                   pPars->nIterMax ); -    Abc_Print( -2, "\t-L num : maximum number of muxes [default = %d]\n",                              pPars->nMuxLimit ); +    Abc_Print( -2, "\t-L num : maximum number of each type of signals [default = %d]\n",               pPars->nLimit );      Abc_Print( -2, "\t-x     : toggle XORing outputs of word-level miter [default = %s]\n",            pPars->fXorOutput? "yes": "no" );      Abc_Print( -2, "\t-a     : toggle running pdr with -nct [default = %s]\n",                         pPars->fPdra? "yes": "no" );      Abc_Print( -2, "\t-b     : toggle using proof-based refinement [default = %s]\n",                  pPars->fProofRefine? "yes": "no" ); diff --git a/src/base/wlc/wlcNtk.c b/src/base/wlc/wlcNtk.c index 9605ce7a..02af1a16 100644 --- a/src/base/wlc/wlcNtk.c +++ b/src/base/wlc/wlcNtk.c @@ -113,7 +113,7 @@ void Wlc_ManSetDefaultParams( Wlc_Par_t * pPars )      pPars->nBitsMux      = ABC_INFINITY;   // MUX bit-width      pPars->nBitsFlop     = ABC_INFINITY;   // flop bit-width      pPars->nIterMax      =         1000;   // the max number of iterations -    pPars->nMuxLimit     = ABC_INFINITY;   // the max number of muxes +    pPars->nLimit        = ABC_INFINITY;   // the max number of signals      pPars->fXorOutput    =            1;   // XOR outputs of word-level miter      pPars->fCheckClauses =            1;   // Check clauses in the reloaded trace                          pPars->fPushClauses  =            0;   // Push clauses in the reloaded trace                      | 
