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/base/wlc/wlcAbs.c | |
| 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/base/wlc/wlcAbs.c')
| -rw-r--r-- | src/base/wlc/wlcAbs.c | 128 | 
1 files changed, 100 insertions, 28 deletions
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 );  | 
