diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2015-08-24 17:40:20 -0700 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2015-08-24 17:40:20 -0700 | 
| commit | 5bf0f864505d97ea7d6a349f100dd1849f74b7a6 (patch) | |
| tree | 3b040e0d6d3173c027944b8abcf2d933ea8196e8 | |
| parent | 73bfe00f82b3e73b691b9774b888465f29e93d7d (diff) | |
| download | abc-5bf0f864505d97ea7d6a349f100dd1849f74b7a6.tar.gz abc-5bf0f864505d97ea7d6a349f100dd1849f74b7a6.tar.bz2 abc-5bf0f864505d97ea7d6a349f100dd1849f74b7a6.zip  | |
New switch in 'read_lib' to replace gate/pin names by short strings.
| -rw-r--r-- | src/map/scl/scl.c | 12 | ||||
| -rw-r--r-- | src/map/scl/sclLib.h | 1 | ||||
| -rw-r--r-- | src/map/scl/sclLibUtil.c | 94 | 
3 files changed, 105 insertions, 2 deletions
diff --git a/src/map/scl/scl.c b/src/map/scl/scl.c index 53672073..bd917ca3 100644 --- a/src/map/scl/scl.c +++ b/src/map/scl/scl.c @@ -139,11 +139,12 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv )      float Slew = 0;      float Gain = 0;      int nGatesMin = 0; +    int fShortNames = 0;      int fVerbose = 1;      int fVeryVerbose = 0;      Extra_UtilGetoptReset(); -    while ( ( c = Extra_UtilGetopt( argc, argv, "SGMdvwh" ) ) != EOF ) +    while ( ( c = Extra_UtilGetopt( argc, argv, "SGMdnvwh" ) ) != EOF )      {          switch ( c )          { @@ -183,6 +184,9 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv )          case 'd':              fDump ^= 1;              break; +        case 'n': +            fShortNames ^= 1; +            break;          case 'v':              fVerbose ^= 1;              break; @@ -219,6 +223,9 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv )          return 0;      }      Abc_SclLoad( pLib, (SC_Lib **)&pAbc->pLibScl ); +    // convert the library if needed +    if ( fShortNames ) +        Abc_SclShortNames( pLib );      // dump the resulting library      if ( fDump && pAbc->pLibScl )          Abc_SclWriteLiberty( Extra_FileNameGenericAppend(pFileName, "_temp.lib"), (SC_Lib *)pAbc->pLibScl ); @@ -228,12 +235,13 @@ int Scl_CommandReadLib( Abc_Frame_t * pAbc, int argc, char ** argv )      return 0;  usage: -    fprintf( pAbc->Err, "usage: read_lib [-SG float] [-M num] [-dvwh] <file>\n" ); +    fprintf( pAbc->Err, "usage: read_lib [-SG float] [-M num] [-dnvwh] <file>\n" );      fprintf( pAbc->Err, "\t           reads Liberty library from file\n" );      fprintf( pAbc->Err, "\t-S float : the slew parameter used to generate the library [default = %.2f]\n", Slew );      fprintf( pAbc->Err, "\t-G float : the gain parameter used to generate the library [default = %.2f]\n", Gain );      fprintf( pAbc->Err, "\t-M num   : skip gate classes whose size is less than this [default = %d]\n", nGatesMin );      fprintf( pAbc->Err, "\t-d       : toggle dumping the parsed library into file \"*_temp.lib\" [default = %s]\n", fDump? "yes": "no" ); +    fprintf( pAbc->Err, "\t-n       : toggle replacing gate/pin names by short strings [default = %s]\n", fShortNames? "yes": "no" );      fprintf( pAbc->Err, "\t-v       : toggle writing verbose information [default = %s]\n", fVerbose? "yes": "no" );      fprintf( pAbc->Err, "\t-v       : toggle writing information about skipped gates [default = %s]\n", fVeryVerbose? "yes": "no" );      fprintf( pAbc->Err, "\t-h       : prints the command summary\n" ); diff --git a/src/map/scl/sclLib.h b/src/map/scl/sclLib.h index 44cff1ce..4dc80758 100644 --- a/src/map/scl/sclLib.h +++ b/src/map/scl/sclLib.h @@ -615,6 +615,7 @@ extern void          Abc_SclWriteLiberty( char * pFileName, SC_Lib * p );  extern void          Abc_SclHashCells( SC_Lib * p );  extern int           Abc_SclCellFind( SC_Lib * p, char * pName );  extern int           Abc_SclClassCellNum( SC_Cell * pClass ); +extern void          Abc_SclShortNames( SC_Lib * p );  extern int           Abc_SclLibClassNum( SC_Lib * pLib );  extern void          Abc_SclLinkCells( SC_Lib * p );  extern void          Abc_SclPrintCells( SC_Lib * p, float Slew, float Gain, int fInvOnly, int fShort ); diff --git a/src/map/scl/sclLibUtil.c b/src/map/scl/sclLibUtil.c index bb70ee9b..b5ccacdf 100644 --- a/src/map/scl/sclLibUtil.c +++ b/src/map/scl/sclLibUtil.c @@ -101,6 +101,100 @@ int Abc_SclLibClassNum( SC_Lib * pLib )  /**Function************************************************************* +  Synopsis    [Change cell names and pin names.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +static inline int Abc_SclIsChar( char c ) +{ +    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; +} +static inline int Abc_SclIsName( char c ) +{ +    return Abc_SclIsChar(c) || (c >= '0' && c <= '9'); +} +static inline char * Abc_SclFindLimit( char * pName ) +{ +    assert( Abc_SclIsChar(*pName) ); +    while ( Abc_SclIsName(*pName) ) +        pName++; +    return pName; +} +static inline int Abc_SclAreEqual( char * pBase, char * pName, char * pLimit ) +{ +    return !strncmp( pBase, pName, pLimit - pName ); +} +void Abc_SclShortFormula( SC_Cell * pCell, char * pForm, char * pBuffer ) +{ +    SC_Pin * pPin; int i; +    char * pTemp, * pLimit; +    for ( pTemp = pForm; *pTemp; ) +    { +        if ( !Abc_SclIsChar(*pTemp) ) +        { +            *pBuffer++ = *pTemp++; +            continue; +        } +        pLimit = Abc_SclFindLimit( pTemp ); +        SC_CellForEachPinIn( pCell, pPin, i ) +            if ( Abc_SclAreEqual( pPin->pName, pTemp, pLimit ) ) +            { +                *pBuffer++ = 'a' + i; +                break; +            } +        assert( i < pCell->n_inputs ); +        pTemp = pLimit; +    } +    *pBuffer++ = 0; +} +void Abc_SclShortNames( SC_Lib * p ) +{ +    char Buffer[10000]; +    SC_Cell * pClass, * pCell; SC_Pin * pPin; +    int i, k, n, nClasses = Abc_SclLibClassNum(p); +    int nDigits = Abc_Base10Log( nClasses ); +    // itereate through classes +    SC_LibForEachCellClass( p, pClass, i ) +    { +        int nDigits2 = Abc_Base10Log( Abc_SclClassCellNum(pClass) ); +        SC_RingForEachCell( pClass, pCell, k ) +        { +            ABC_FREE( pCell->pName ); +            sprintf( Buffer, "g%0*d_%0*d", nDigits, i, nDigits2, k ); +            pCell->pName = Abc_UtilStrsav( Buffer ); +            // formula +            SC_CellForEachPinOut( pCell, pPin, n ) +            { +                Abc_SclShortFormula( pCell, pPin->func_text, Buffer ); +                ABC_FREE( pPin->func_text ); +                pPin->func_text = Abc_UtilStrsav( Buffer ); +            } +            // pin names +            SC_CellForEachPinIn( pCell, pPin, n ) +            { +                ABC_FREE( pPin->pName ); +                sprintf( Buffer, "%c", 'a'+n ); +                pPin->pName = Abc_UtilStrsav( Buffer ); +            } +            SC_CellForEachPinOut( pCell, pPin, n ) +            { +                ABC_FREE( pPin->pName ); +                sprintf( Buffer, "%c", 'z'-n+pCell->n_inputs ); +                pPin->pName = Abc_UtilStrsav( Buffer ); +            } +        } +    } +    p->nBins = 0; +    ABC_FREE( p->pBins ); +    Abc_SclHashCells( p ); +} +/**Function************************************************************* +    Synopsis    [Links equal gates into rings while sorting them by area.]    Description []  | 
