diff options
| -rw-r--r-- | src/aig/gia/gia.h | 2 | ||||
| -rw-r--r-- | src/aig/gia/giaIf.c | 37 | ||||
| -rw-r--r-- | src/aig/gia/giaJf.c | 4 | ||||
| -rw-r--r-- | src/aig/gia/giaMan.c | 2 | ||||
| -rw-r--r-- | src/base/abci/abc.c | 8 | 
5 files changed, 50 insertions, 3 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index a2f6aeb1..919c1031 100644 --- a/src/aig/gia/gia.h +++ b/src/aig/gia/gia.h @@ -189,6 +189,7 @@ struct Gps_Par_t_      int            fSwitch;      int            fCut;      int            fNpn; +    int            fLutProf;  };  typedef struct Emb_Par_t_ Emb_Par_t; @@ -1041,6 +1042,7 @@ extern int                 Gia_ManHashAndMulti( Gia_Man_t * p, Vec_Int_t * vLits  /*=== giaIf.c ===========================================================*/  extern void                Gia_ManPrintMappingStats( Gia_Man_t * p );  extern void                Gia_ManPrintPackingStats( Gia_Man_t * p ); +extern void                Gia_ManPrintLutStats( Gia_Man_t * p );  extern int                 Gia_ManLutFaninCount( Gia_Man_t * p );  extern int                 Gia_ManLutSizeMax( Gia_Man_t * p );  extern int                 Gia_ManLutNum( Gia_Man_t * p ); diff --git a/src/aig/gia/giaIf.c b/src/aig/gia/giaIf.c index c4c5fcda..cf4eef5a 100644 --- a/src/aig/gia/giaIf.c +++ b/src/aig/gia/giaIf.c @@ -312,6 +312,43 @@ void Gia_ManPrintPackingStats( Gia_Man_t * p )      Abc_Print( 1, "\n" );  } +/**Function************************************************************* + +  Synopsis    [] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Gia_ManPrintNodeProfile( int * pCounts, int nSizeMax ) +{ +    int i, SizeAll = 0, NodeAll = 0; +    for ( i = 0; i <= nSizeMax; i++ ) +    { +        SizeAll += i * pCounts[i]; +        NodeAll += pCounts[i]; +    } +    Abc_Print( 1, "LUT = %d : ", NodeAll ); +    for ( i = 2; i <= nSizeMax; i++ ) +        Abc_Print( 1, "%d=%d %.1f %%  ", i, pCounts[i], 100.0*pCounts[i]/NodeAll ); +    Abc_Print( 1, "Ave = %.2f\n", 1.0*SizeAll/(NodeAll ? NodeAll : 1) ); +} +void Gia_ManPrintLutStats( Gia_Man_t * p ) +{ +    int i, nSizeMax, pCounts[33] = {0}; +    nSizeMax = Gia_ManLutSizeMax( p ); +    if ( nSizeMax > 32 ) +    { +        Abc_Print( 1, "The max LUT size (%d) is too large.\n", nSizeMax ); +        return; +    } +    Gia_ManForEachLut( p, i ) +        pCounts[ Gia_ObjLutSize(p, i) ]++; +    Gia_ManPrintNodeProfile( pCounts, nSizeMax ); +}  /**Function************************************************************* diff --git a/src/aig/gia/giaJf.c b/src/aig/gia/giaJf.c index 4ee846ab..f66e07f3 100644 --- a/src/aig/gia/giaJf.c +++ b/src/aig/gia/giaJf.c @@ -781,7 +781,8 @@ void Jf_ManDeriveMapping( Jf_Man_t * p )      Vec_Int_t * vMapping;      Gia_Obj_t * pObj;       int i, k, * pCut; -    vMapping = Vec_IntStart( Gia_ManObjNum(p->pGia) ); +    vMapping = Vec_IntAlloc( Gia_ManObjNum(p->pGia) + p->pPars->Edge + p->pPars->Area * 2 ); +    Vec_IntFill( vMapping, Gia_ManObjNum(p->pGia), 0 );      Gia_ManForEachAnd( p->pGia, pObj, i )      {          if ( Gia_ObjIsBuf(pObj) || Gia_ObjRefNum(p->pGia, pObj) == 0 ) @@ -792,6 +793,7 @@ void Jf_ManDeriveMapping( Jf_Man_t * p )              Vec_IntPush( vMapping, pCut[k] );          Vec_IntPush( vMapping, i );      } +    assert( Vec_IntSize(vMapping) == Vec_IntCap(vMapping) );      p->pGia->vMapping = vMapping;  //    Gia_ManMappingVerify( p->pGia );  } diff --git a/src/aig/gia/giaMan.c b/src/aig/gia/giaMan.c index ff48b405..8c5b3d99 100644 --- a/src/aig/gia/giaMan.c +++ b/src/aig/gia/giaMan.c @@ -363,6 +363,8 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )          Gia_ManPrintNpnClasses( p );      if ( p->vPacking )          Gia_ManPrintPackingStats( p ); +    if ( pPars && pPars->fLutProf && Gia_ManHasMapping(p) ) +        Gia_ManPrintLutStats( p );      if ( p->pPlacement )          Gia_ManPrintPlacement( p );      if ( p->pManTime ) diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 9162f548..1b525041 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -25268,7 +25268,7 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv )      int c;      memset( pPars, 0, sizeof(Gps_Par_t) );      Extra_UtilGetoptReset(); -    while ( ( c = Extra_UtilGetopt( argc, argv, "tpcnh" ) ) != EOF ) +    while ( ( c = Extra_UtilGetopt( argc, argv, "tpcnlh" ) ) != EOF )      {          switch ( c )          { @@ -25284,6 +25284,9 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv )          case 'n':              pPars->fNpn ^= 1;              break; +        case 'l': +            pPars->fLutProf ^= 1; +            break;          case 'h':              goto usage;          default: @@ -25299,12 +25302,13 @@ int Abc_CommandAbc9Ps( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  usage: -    Abc_Print( -2, "usage: &ps [-tpcnh]\n" ); +    Abc_Print( -2, "usage: &ps [-tpcnlh]\n" );      Abc_Print( -2, "\t        prints stats of the current AIG\n" );      Abc_Print( -2, "\t-t    : toggle printing BMC tents [default = %s]\n", pPars->fTents? "yes": "no" );      Abc_Print( -2, "\t-p    : toggle printing switching activity [default = %s]\n", pPars->fSwitch? "yes": "no" );      Abc_Print( -2, "\t-c    : toggle printing the size of frontier cut [default = %s]\n", pPars->fCut? "yes": "no" );      Abc_Print( -2, "\t-n    : toggle printing NPN classes of functions [default = %s]\n", pPars->fNpn? "yes": "no" ); +    Abc_Print( -2, "\t-l    : toggle printing LUT size profile [default = %s]\n", pPars->fLutProf? "yes": "no" );      Abc_Print( -2, "\t-h    : print the command usage\n");      return 1;  }  | 
