diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-09-20 12:01:04 -0700 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-09-20 12:01:04 -0700 | 
| commit | fdfb083c5c4f789c74aa573144b0aec45d1aaa76 (patch) | |
| tree | f7bb6bf40a25430337dc3accb3fb81881e934af5 /src | |
| parent | f59de3decc1daad5c2d27c8b9d8b680db9dbd574 (diff) | |
| download | abc-fdfb083c5c4f789c74aa573144b0aec45d1aaa76.tar.gz abc-fdfb083c5c4f789c74aa573144b0aec45d1aaa76.tar.bz2 abc-fdfb083c5c4f789c74aa573144b0aec45d1aaa76.zip  | |
Added command 'minsize' to reduce all gates to their minimum size in the library.
Diffstat (limited to 'src')
| -rw-r--r-- | src/map/scl/scl.c | 100 | ||||
| -rw-r--r-- | src/map/scl/sclInt.h | 2 | ||||
| -rw-r--r-- | src/map/scl/sclUtil.c | 38 | 
3 files changed, 121 insertions, 19 deletions
diff --git a/src/map/scl/scl.c b/src/map/scl/scl.c index ba418a20..ee474c7d 100644 --- a/src/map/scl/scl.c +++ b/src/map/scl/scl.c @@ -28,15 +28,16 @@ ABC_NAMESPACE_IMPL_START  ///                        DECLARATIONS                              ///  //////////////////////////////////////////////////////////////////////// -static int Scl_CommandRead   ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandWrite  ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandPrint  ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandPrintGS( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandStime  ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandTopo   ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandBuffer ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandGsize  ( Abc_Frame_t * pAbc, int argc, char **argv ); -static int Scl_CommandUpsize ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandRead    ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandWrite   ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandPrint   ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandPrintGS ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandStime   ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandTopo    ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandBuffer  ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandGsize   ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandUpsize  ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int Scl_CommandMinsize ( Abc_Frame_t * pAbc, int argc, char **argv );  ////////////////////////////////////////////////////////////////////////  ///                     FUNCTION DEFINITIONS                         /// @@ -55,15 +56,16 @@ static int Scl_CommandUpsize ( Abc_Frame_t * pAbc, int argc, char **argv );  ***********************************************************************/  void Scl_Init( Abc_Frame_t * pAbc )  { -    Cmd_CommandAdd( pAbc, "SCL mapping",  "read_scl",   Scl_CommandRead,    0 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "write_scl",  Scl_CommandWrite,   0 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "print_scl",  Scl_CommandPrint,   0 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "print_gs",   Scl_CommandPrintGS, 0 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "stime",      Scl_CommandStime,   0 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "topo",       Scl_CommandTopo,    1 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "buffer",     Scl_CommandBuffer,  1 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "gsize",      Scl_CommandGsize,   1 );  -    Cmd_CommandAdd( pAbc, "SCL mapping",  "upsize",     Scl_CommandUpsize,  1 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "read_scl",   Scl_CommandRead,     0 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "write_scl",  Scl_CommandWrite,    0 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "print_scl",  Scl_CommandPrint,    0 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "print_gs",   Scl_CommandPrintGS,  0 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "stime",      Scl_CommandStime,    0 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "topo",       Scl_CommandTopo,     1 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "buffer",     Scl_CommandBuffer,   1 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "gsize",      Scl_CommandGsize,    1 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "upsize",     Scl_CommandUpsize,   1 );  +    Cmd_CommandAdd( pAbc, "SCL mapping",  "minsize",    Scl_CommandMinsize,  1 );   }  void Scl_End( Abc_Frame_t * pAbc )  { @@ -729,6 +731,68 @@ usage:      return 1;  } +/**Function************************************************************* + +  Synopsis    [] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +int Scl_CommandMinsize( Abc_Frame_t * pAbc, int argc, char **argv ) +{ +    Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc); +    int c, fVerbose = 0; +    Extra_UtilGetoptReset(); +    while ( ( c = Extra_UtilGetopt( argc, argv, "vh" ) ) != EOF ) +    { +        switch ( c ) +        { +        case 'v': +            fVerbose ^= 1; +            break; +        case 'h': +            goto usage; +        default: +            goto usage; +        } +    } + +    if ( Abc_FrameReadNtk(pAbc) == NULL ) +    { +        fprintf( pAbc->Err, "There is no current network.\n" ); +        return 1; +    } +    if ( !Abc_NtkHasMapping(Abc_FrameReadNtk(pAbc)) ) +    { +        fprintf( pAbc->Err, "The current network is not mapped.\n" ); +        return 1; +    } +    if ( !Abc_SclCheckNtk(Abc_FrameReadNtk(pAbc), 0) ) +    { +        fprintf( pAbc->Err, "The current networks is not in a topo order (run \"topo\").\n" ); +        return 1; +    } +    if ( pAbc->pLibScl == NULL ) +    { +        fprintf( pAbc->Err, "There is no Liberty library available.\n" ); +        return 1; +    } + +    Abc_SclMinsizePerform( pAbc->pLibScl, pNtk, fVerbose ); +    return 0; + +usage: +    fprintf( pAbc->Err, "usage: minsize [-vh]\n" ); +    fprintf( pAbc->Err, "\t           downsized all gates to their minimum size\n" ); +    fprintf( pAbc->Err, "\t-v       : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); +    fprintf( pAbc->Err, "\t-h       : print the command usage\n"); +    return 1; +} +  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  //////////////////////////////////////////////////////////////////////// diff --git a/src/map/scl/sclInt.h b/src/map/scl/sclInt.h index e2efec94..bf2ee0f5 100644 --- a/src/map/scl/sclInt.h +++ b/src/map/scl/sclInt.h @@ -446,7 +446,7 @@ extern void        Abc_SclPrintCells( SC_Lib * p );  extern Vec_Int_t * Abc_SclManFindGates( SC_Lib * pLib, Abc_Ntk_t * p );  extern void        Abc_SclManSetGates( SC_Lib * pLib, Abc_Ntk_t * p, Vec_Int_t * vGates );  extern void        Abc_SclPrintGateSizes( SC_Lib * pLib, Abc_Ntk_t * p ); - +extern void        Abc_SclMinsizePerform( SC_Lib * pLib, Abc_Ntk_t * p, int fVerbose );  ABC_NAMESPACE_HEADER_END diff --git a/src/map/scl/sclUtil.c b/src/map/scl/sclUtil.c index dc513d56..f3a88e72 100644 --- a/src/map/scl/sclUtil.c +++ b/src/map/scl/sclUtil.c @@ -284,6 +284,44 @@ void Abc_SclPrintGateSizes( SC_Lib * pLib, Abc_Ntk_t * p )      Vec_IntFree( vGates );  } +/**Function************************************************************* + +  Synopsis    [Downsizes each gate to its minimium size.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Abc_SclMinsizePerform( SC_Lib * pLib, Abc_Ntk_t * p, int fVerbose ) +{ +    Vec_Int_t * vMinCells, * vGates; +    SC_Cell * pCell, * pRepr = NULL; +    Abc_Obj_t * pObj; +    int i, k, gateId; +    // map each gate in the library into its min-size prototype +    vMinCells = Vec_IntStartFull( Vec_PtrSize(pLib->vCells) ); +    SC_LibForEachCellClass( pLib, pRepr, i ) +        SC_RingForEachCell( pRepr, pCell, k ) +            Vec_IntWriteEntry( vMinCells, pCell->Id, pRepr->Id ); +    // update each cell +    vGates = Abc_SclManFindGates( pLib, p ); +    Abc_NtkForEachNode1( p, pObj, i ) +    { +        gateId = Vec_IntEntry( vGates, i ); +        assert( gateId >= 0 && gateId < Vec_PtrSize(pLib->vCells) ); +        gateId = Vec_IntEntry( vMinCells, gateId ); +        assert( gateId >= 0 && gateId < Vec_PtrSize(pLib->vCells) ); +        Vec_IntWriteEntry( vGates, i, gateId ); +    } +    Abc_SclManSetGates( pLib, p, vGates ); +    Vec_IntFree( vMinCells ); +    Vec_IntFree( vGates ); +} + +  ////////////////////////////////////////////////////////////////////////  ///                       END OF FILE                                ///  ////////////////////////////////////////////////////////////////////////  | 
