diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2019-04-18 18:45:15 -0700 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2019-04-18 18:45:15 -0700 | 
| commit | f070d35051afbf068d0b034d42ab67c46c0ef3f6 (patch) | |
| tree | c7e0395a1a5626f056c18d04155c19850e3613ce | |
| parent | a3620fe67700ed538f944c9cd1e0184bed71e80e (diff) | |
| download | abc-f070d35051afbf068d0b034d42ab67c46c0ef3f6.tar.gz abc-f070d35051afbf068d0b034d42ab67c46c0ef3f6.tar.bz2 abc-f070d35051afbf068d0b034d42ab67c46c0ef3f6.zip | |
Improvements to the retiming algorithm.
| -rw-r--r-- | src/base/wln/wlnRetime.c | 85 | 
1 files changed, 63 insertions, 22 deletions
| diff --git a/src/base/wln/wlnRetime.c b/src/base/wln/wlnRetime.c index 0a4fb6a7..3c331991 100644 --- a/src/base/wln/wlnRetime.c +++ b/src/base/wln/wlnRetime.c @@ -89,9 +89,27 @@ void Wln_RetPrintObj( Wln_Ret_t * p, int iObj )      }      printf( "\n" );  } -void Wln_RetPrint( Wln_Ret_t * p ) +void Wln_RetPrint( Wln_Ret_t * p, int fVerbose )  { -    int iObj; +    int iObj, nCount = 0; +    Wln_NtkForEachObj( p->pNtk, iObj ) +        if ( Wln_ObjInstId(p->pNtk, iObj) > 1 ) +            nCount++; +    printf( "Total number of objects = %d.  Objects with non-trivial delay = %d.\n", Wln_NtkObjNum(p->pNtk), nCount ); +    if ( !fVerbose ) +    { +        int nCount = 0, nPrints = 0, nLimit = 5; +        printf( "The following %d objects have non-trivial delays:\n", nLimit ); +        Wln_NtkForEachObj( p->pNtk, iObj ) +        { +            if ( Wln_ObjInstId(p->pNtk, iObj) <= 1 ) +                continue; +            Wln_RetPrintObj( p, iObj ); +            if ( ++nPrints == nLimit ) +                break; +        } +        return; +    }      printf( "Printing %d objects of network \"%s\":\n", Wln_NtkObjNum(p->pNtk), p->pNtk->pName );      Wln_NtkForEachObj( p->pNtk, iObj )          Wln_RetPrintObj( p, iObj ); @@ -125,7 +143,7 @@ int Wln_RetComputeFfClasses( Wln_Ntk_t * pNtk, Vec_Int_t * vClasses )      nClasses = Hsh_VecSize( p );      Hsh_VecManStop( p );      Vec_IntFree( vFlop ); -    printf( "Detected %d flop classes.\n", nClasses ); +    printf( "Detected %d flops and %d flop classes.\n", Wln_NtkFfNum(pNtk), nClasses );      return nClasses;  }  Wln_Ret_t * Wln_RetAlloc( Wln_Ntk_t * pNtk ) @@ -467,24 +485,27 @@ void Wln_RetRetimeBackward( Wln_Ret_t * p, Vec_Int_t * vSet )          Wln_RetInsertOneFanin( p, iObj, iFlop );      }  } -void Wln_RetAddToMoves( Wln_Ret_t * p, Vec_Int_t * vSet, int Delay, int fForward ) +void Wln_RetAddToMoves( Wln_Ret_t * p, Vec_Int_t * vSet, int Delay, int fForward, int nMoves, int fVerbose )  {      int i, iObj;      if ( vSet == NULL )      { -        printf( "*** Recording initial state (delay = %d)\n", Delay ); +        printf( "Move %4d : Recording initial state     (delay = %6d)\n", nMoves, Delay );          Vec_IntPushTwo( &p->vMoves, Delay, 0 );          return;      } -    printf( "*** Recording %s retiming (delay = %d):", fForward ? "forward" : "backward", Delay ); +    printf( "Move %4d : Recording %s retiming (delay = %6d) :", nMoves, fForward ? "forward " : "backward", Delay );      Vec_IntPush( &p->vMoves, Delay );      Vec_IntForEachEntry( vSet, iObj, i )      {          int NameId = Vec_IntEntry( &p->pNtk->vNameIds, iObj );          Vec_IntPush( &p->vMoves, fForward ? -NameId : NameId ); -        printf( " %d (NameID = %d)  ", fForward ? -iObj : iObj, fForward ? -NameId : NameId ); +        if ( fVerbose ) +            printf( " %d (NameID = %d)  ", fForward ? -iObj : iObj, fForward ? -NameId : NameId );      }      Vec_IntPush( &p->vMoves, 0 ); +    if ( !fVerbose ) +        printf( " %3d retimed objects", Vec_IntSize(vSet) );      printf( "\n" );  } @@ -501,9 +522,11 @@ void Wln_RetAddToMoves( Wln_Ret_t * p, Vec_Int_t * vSet, int Delay, int fForward  ***********************************************************************/  void Wln_NtkRetimeCreateDelayInfo( Wln_Ntk_t * pNtk )  { +//    if ( Wln_NtkHasInstId(pNtk) ) +//        Vec_IntErase( &pNtk->vInstIds );      if ( Wln_NtkHasInstId(pNtk) ) -        Vec_IntErase( &pNtk->vInstIds ); -    if ( !Wln_NtkHasInstId(pNtk) ) +        printf( "Using delays given by the user in the input file.\n" ); +    else      {          int i, iObj;          printf( "The design has no delay information.\n" ); @@ -520,7 +543,7 @@ void Wln_NtkRetimeCreateDelayInfo( Wln_Ntk_t * pNtk )              if ( Wln_ObjType(pNtk, Wln_ObjFanin0(pNtk, iObj)) != ABC_OPER_LUT )                  Wln_ObjSetInstId( pNtk, Wln_ObjFanin0(pNtk, iObj), 1 );          } -        printf( "Assuming user-specified delays for internal nodes.\n" ); +        printf( "Assuming default delays: 10 units for most nodes and 1 unit for bit-slice, concat, and buffers driving COs.\n" );      }  }  Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose ) @@ -530,12 +553,13 @@ Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose )      Vec_Int_t * vSinks   = &p->vSinks;      Vec_Int_t * vFront   = &p->vFront;      Vec_Int_t * vMoves   = Vec_IntAlloc(0); -    if ( fVerbose ) -        Wln_RetPrint( p ); +    int nMoves = 0, fPrevFwd = 0, fPrevBwd = 0, nCountIncrease = 0; +    int DelayInit = 0, DelayBest = 0; +    Wln_RetPrint( p, fVerbose );      Wln_RetMarkChanges( p, NULL ); -    p->DelayMax = Wln_RetPropDelay( p ); +    p->DelayMax = DelayInit = DelayBest = Wln_RetPropDelay( p );      Wln_RetFindSources( p ); -    Wln_RetAddToMoves( p, NULL, p->DelayMax, 0 ); +    Wln_RetAddToMoves( p, NULL, p->DelayMax, 0, nMoves, fVerbose );      while ( Vec_IntSize(vSources) || Vec_IntSize(vSinks) )      {          int DelayMaxPrev = p->DelayMax; @@ -544,12 +568,6 @@ Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose )          Vec_IntSort( vSources, 0 );          Vec_IntSort( vSinks, 0 ); -        printf( "\nSinks: " ); -        Vec_IntPrint( &p->vSinks ); - -        printf( "Sources: " ); -        Vec_IntPrint( &p->vSources ); -          if ( !fForward && !fBackward )          {              printf( "Cannot retime forward and backward.\n" ); @@ -560,14 +578,16 @@ Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose )              printf( "Cannot reduce delay by retiming.\n" );              break;          } +        nMoves++;          Vec_IntClear( vFront ); -        if ( (fForward && !fBackward) || (fForward && fBackward && Vec_IntSize(vSources) < Vec_IntSize(vSinks)) ) +        if ( (fPrevFwd && fForward) || (!(fPrevBwd && fBackward) && ((fForward && !fBackward) || (fForward && fBackward && Vec_IntSize(vSources) < Vec_IntSize(vSinks)))) )          {              Vec_IntAppend( vFront, vSources );              Wln_RetMarkChanges( p, vFront );              Wln_RetRetimeForward( p, vFront );              p->DelayMax = Wln_RetPropDelay( p );              fForward = 1, fBackward = 0; +            fPrevFwd = 1;          }          else          { @@ -576,10 +596,25 @@ Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose )              Wln_RetMarkChanges( p, vFront );              p->DelayMax = Wln_RetPropDelay( p );              fForward = 0, fBackward = 1; +            fPrevBwd = 1;          } +        DelayBest = Abc_MinInt( DelayBest, p->DelayMax );          //Wln_RetPrint( p ); -        Wln_RetAddToMoves( p, vFront, p->DelayMax, fForward ); +        if ( fVerbose ) +            printf( "\n" ); +        Wln_RetAddToMoves( p, vFront, p->DelayMax, fForward, nMoves, fVerbose ); +        if ( fVerbose ) +        { +            printf( "Sinks: " ); +            Vec_IntPrint( &p->vSinks ); +            printf( "Sources: " ); +            Vec_IntPrint( &p->vSources ); +        }          if ( p->DelayMax >= DelayMaxPrev ) +            nCountIncrease++; +        else +            nCountIncrease = 0; +        if ( nCountIncrease > 3 )              break;          Wln_RetFindSources( p );          if ( 2*Vec_IntSize(&p->vEdgeLinks) > Vec_IntCap(&p->vEdgeLinks) ) @@ -592,6 +627,12 @@ Vec_Int_t * Wln_NtkRetime( Wln_Ntk_t * pNtk, int fVerbose )          printf( "\nThe resulting moves recorded in terms of name IDs of the NDR nodes:\n" );          Vec_IntPrint( vMoves );      } +    else +    { +        printf( "Retiming instruction contains %d moves and %d total retimed objects.\n", nMoves, Vec_IntSize(vMoves)-2*nMoves-2 ); +        printf( "Initial delay = %d.  The best delay achieved = %d.  Improvement = %d. (%6.2f %%)\n",  +            DelayInit, DelayBest, DelayInit - DelayBest, 100.0 * (DelayInit - DelayBest) / DelayInit ); +    }      return vMoves;  } | 
