diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-24 12:46:35 -0400 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-24 12:46:35 -0400 | 
| commit | 4db5e3c02de327d26a19a1886982cb79db170cce (patch) | |
| tree | 106f8bdbe6ee53a873bc350d03a37ff5c2f8ea15 /src | |
| parent | ffaad9ba10810b8076a5b56029a7864bf5a327d0 (diff) | |
| download | abc-4db5e3c02de327d26a19a1886982cb79db170cce.tar.gz abc-4db5e3c02de327d26a19a1886982cb79db170cce.tar.bz2 abc-4db5e3c02de327d26a19a1886982cb79db170cce.zip  | |
Printing node type statistics.
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/wlc/wlc.h | 2 | ||||
| -rw-r--r-- | src/base/wlc/wlcNtk.c | 106 | 
2 files changed, 106 insertions, 2 deletions
diff --git a/src/base/wlc/wlc.h b/src/base/wlc/wlc.h index a6d4553d..ae31933e 100644 --- a/src/base/wlc/wlc.h +++ b/src/base/wlc/wlc.h @@ -163,6 +163,8 @@ static inline Wlc_Obj_t *  Wlc_ObjFanin2( Wlc_Ntk_t * p, Wlc_Obj_t * pObj )  static inline int          Wlc_ObjRange( Wlc_Obj_t * p )                          { return p->End - p->Beg + 1;                                           }  static inline int          Wlc_ObjRangeEnd( Wlc_Obj_t * p )                       { assert(p->Type == WLC_OBJ_BIT_SELECT); return p->Fanins[1] >> 16;     }  static inline int          Wlc_ObjRangeBeg( Wlc_Obj_t * p )                       { assert(p->Type == WLC_OBJ_BIT_SELECT); return p->Fanins[1] & 0xFFFF;  } +static inline int          Wlc_ObjSigned( Wlc_Obj_t * p )                         { return p->Signed;                                                     } +static inline int          Wlc_ObjSign( Wlc_Obj_t * p )                           { return Abc_Var2Lit( Wlc_ObjRange(p), Wlc_ObjSigned(p) );              }  static inline int *        Wlc_ObjConstValue( Wlc_Obj_t * p )                     { assert(p->Type == WLC_OBJ_CONST);      return Wlc_ObjFanins(p);       }  static inline int          Wlc_ObjTableId( Wlc_Obj_t * p )                        { assert(p->Type == WLC_OBJ_TABLE);      return p->Fanins[1];           }  static inline word *       Wlc_ObjTable( Wlc_Ntk_t * p, Wlc_Obj_t * pObj )        { return (word *)Vec_PtrEntry( p->vTables, Wlc_ObjTableId(pObj) );      } diff --git a/src/base/wlc/wlcNtk.c b/src/base/wlc/wlcNtk.c index 890432e3..ce48a562 100644 --- a/src/base/wlc/wlcNtk.c +++ b/src/base/wlc/wlcNtk.c @@ -19,6 +19,7 @@  ***********************************************************************/  #include "wlc.h" +#include "misc/vec/vecWec.h"  ABC_NAMESPACE_IMPL_START @@ -68,7 +69,7 @@ static char * Wlc_Names[WLC_OBJ_NUMBER+1] = {      "-",                   // 36: arithmetic subtraction      "*",                   // 37: arithmetic multiplier      "//",                  // 38: arithmetic division -    "%%",                  // 39: arithmetic modulus +    "%",                   // 39: arithmetic modulus      "**",                  // 40: arithmetic power      "-",                   // 41: arithmetic minus      "table",               // 42: bit table @@ -145,6 +146,8 @@ void Wlc_ObjUpdateType( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, int Type )  {      if ( pObj->Type == WLC_OBJ_PO )      { +        if ( Type != WLC_OBJ_BUF ) +            printf( "Primary outputs should be driven by buffers.\n" );          assert( Type == WLC_OBJ_BUF );          return;      } @@ -199,6 +202,104 @@ int Wlc_NtkMemUsage( Wlc_Ntk_t * p )      Mem += Mem_FlexReadMemUsage(p->pMemFanin);      return Mem;  } + +/**Function************************************************************* + +  Synopsis    [Prints distribution of operator types.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +static inline int Wlc_NtkPrintDistribMakeSign( int s, int s0, int s1 ) +{ +    if ( s0 & 1 ) +    { +        int s = 9; +    } +    return (s1 << 20) | (s0 << 10) | s; +} +static inline void Wlc_NtkPrintDistribFromSign( int sss, int * s, int * s0, int * s1 ) +{ +    *s1 =  sss >> 20;  *s0 = (sss >> 10) & 0x3FF;  *s  =  sss & 0x3FF; +} +static inline void Wlc_NtkPrintDistribAddOne( Vec_Wec_t * vTypes, Vec_Wec_t * vOccurs, int Type, int Sign ) +{ +    Vec_Int_t * vType  = Vec_WecEntry( vTypes, Type ); +    Vec_Int_t * vOccur = Vec_WecEntry( vOccurs, Type ); +    int i, Entry; +    Vec_IntForEachEntry( vType, Entry, i ) +        if ( Entry == Sign ) +        { +            Vec_IntAddToEntry( vOccur, i, 1 ); +            return; +        } +    Vec_IntPush( vType, Sign ); +    Vec_IntPush( vOccur, 1 ); +} +void Wlc_NtkPrintDistribSortOne( Vec_Wec_t * vTypes, Vec_Wec_t * vOccurs, int Type ) +{ +    Vec_Int_t * vType  = Vec_WecEntry( vTypes,  Type ); +    Vec_Int_t * vOccur = Vec_WecEntry( vOccurs, Type ); +    Vec_IntSelectSortCost2( Vec_IntArray(vType), Vec_IntSize(vType), Vec_IntArray(vOccur) ); +    Vec_IntReverseOrder( vType ); +    Vec_IntReverseOrder( vOccur ); +} +void Wlc_NtkPrintDistrib( Wlc_Ntk_t * p, int fVerbose ) +{ +    Wlc_Obj_t * pObj;  +    int i, k, Sign, s, s0, s1; +    Vec_Wec_t * vTypes, * vOccurs; +    vTypes  = Vec_WecStart( WLC_OBJ_NUMBER ); +    vOccurs = Vec_WecStart( WLC_OBJ_NUMBER ); +    Wlc_NtkForEachObj( p, pObj, i ) +    { +//        char * pName = Wlc_ObjName(p, i); +//        if ( pObj->Type == WLC_OBJ_ARI_MULTI ) +       // 0-input types +        if ( pObj->Type == WLC_OBJ_PI || pObj->Type == WLC_OBJ_CONST || pObj->Type == WLC_OBJ_BIT_CONCAT ) +            Sign = Wlc_NtkPrintDistribMakeSign( Wlc_ObjSign(pObj), 0, 0 ); +        // 1-input types +        else if ( pObj->Type == WLC_OBJ_BUF    || pObj->Type == WLC_OBJ_PO          || pObj->Type == WLC_OBJ_BI || +             pObj->Type == WLC_OBJ_BIT_ZEROPAD || pObj->Type == WLC_OBJ_BIT_SIGNEXT ||  +             pObj->Type == WLC_OBJ_BIT_NOT     || pObj->Type == WLC_OBJ_LOGIC_NOT   || pObj->Type == WLC_OBJ_ARI_MINUS ||  +             pObj->Type == WLC_OBJ_BIT_SELECT  || pObj->Type == WLC_OBJ_TABLE ) +            Sign = Wlc_NtkPrintDistribMakeSign( Wlc_ObjSign(pObj), Wlc_ObjSign(Wlc_ObjFanin0(p, pObj)), 0 ); +        // 2-input types (including MUX) +        else  +            Sign = Wlc_NtkPrintDistribMakeSign( Wlc_ObjSign(pObj), Wlc_ObjSign(Wlc_ObjFanin0(p, pObj)), Wlc_ObjSign(Wlc_ObjFanin1(p, pObj)) ); +        // add to storage +        Wlc_NtkPrintDistribAddOne( vTypes, vOccurs, pObj->Type, Sign ); +    } +    // print by occurrence +    for ( i = 0; i < WLC_OBJ_NUMBER; i++ ) +    { +        Vec_Int_t * vType  = Vec_WecEntry( vTypes, i ); +        Vec_Int_t * vOccur = Vec_WecEntry( vOccurs, i ); +        if ( p->nObjs[i] == 0 ) +            continue; +        printf( "%2d  :  %6d  %-8s      ", i, p->nObjs[i], Wlc_Names[i] ); +        // sort by occurence +        Wlc_NtkPrintDistribSortOne( vTypes, vOccurs, i ); +        Vec_IntForEachEntry( vType, Sign, k ) +        { +            Wlc_NtkPrintDistribFromSign( Sign, &s, &s0, &s1 ); +            printf( "(%d) ", Vec_IntEntry( vOccur, k ) ); +            printf( "%s%d ",       Abc_LitIsCompl(s)?"-":"",  Abc_Lit2Var(s) ); +            if ( s0 ) +                printf( "= %s%d ", Abc_LitIsCompl(s0)?"-":"", Abc_Lit2Var(s0) ); +            if ( s1 ) +                printf( " %s%d ",  Abc_LitIsCompl(s1)?"-":"", Abc_Lit2Var(s1) ); +            printf( " " ); +        } +        printf( "\n" ); +    } +    Vec_WecFree( vTypes ); +    Vec_WecFree( vOccurs ); +}  void Wlc_NtkPrintNodes( Wlc_Ntk_t * p, int Type )  {      Wlc_Obj_t * pObj;  @@ -233,10 +334,11 @@ void Wlc_NtkPrintStats( Wlc_Ntk_t * p, int fVerbose )      if ( !fVerbose )          return;      printf( "Node type statisticts:\n" ); +    Wlc_NtkPrintDistrib( p, fVerbose ); +    return;      for ( i = 0; i < WLC_OBJ_NUMBER; i++ )          if ( p->nObjs[i] )              printf( "%2d  :  %6d  %-8s\n", i, p->nObjs[i], Wlc_Names[i] ); -//    Wlc_NtkPrintNodes( p, WLC_OBJ_ARI_MULTI );  }  /**Function*************************************************************  | 
