diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2013-11-21 12:58:13 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2013-11-21 12:58:13 -0800 |
commit | 00efa6805380739f36ca9cc73623aefe25eeb9b5 (patch) | |
tree | 57a55224c99f1fc2e4d711e3bdef16e4c54dc844 /src/map/scl | |
parent | 962ad3b0b106accb74bd9160951d4ca65533073b (diff) | |
download | abc-00efa6805380739f36ca9cc73623aefe25eeb9b5.tar.gz abc-00efa6805380739f36ca9cc73623aefe25eeb9b5.tar.bz2 abc-00efa6805380739f36ca9cc73623aefe25eeb9b5.zip |
Several changes to allow Liberty files without delay info.
Diffstat (limited to 'src/map/scl')
-rw-r--r-- | src/map/scl/scl.c | 22 | ||||
-rw-r--r-- | src/map/scl/sclLib.h | 3 | ||||
-rw-r--r-- | src/map/scl/sclLibUtil.c | 56 |
3 files changed, 64 insertions, 17 deletions
diff --git a/src/map/scl/scl.c b/src/map/scl/scl.c index b3175dbb..ac490c73 100644 --- a/src/map/scl/scl.c +++ b/src/map/scl/scl.c @@ -958,6 +958,11 @@ int Scl_CommandBuffer( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Fanin phase information is not avaiable.\n" ); return 1; } + if ( !pAbc->pLibScl || !Abc_SclHasDelayInfo(pAbc->pLibScl) ) + { + Abc_Print( -1, "Library delay info is not available.\n" ); + return 1; + } // modify the current network pNtkRes = Abc_SclBufferingPerform( pNtk, (SC_Lib *)pAbc->pLibScl, pPars ); if ( pNtkRes == NULL ) @@ -1089,6 +1094,11 @@ int Scl_CommandBufferOld( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Fanin phase information is not avaiable.\n" ); return 1; } + if ( !pAbc->pLibScl || !Abc_SclHasDelayInfo(pAbc->pLibScl) ) + { + Abc_Print( -1, "Library delay info is not available.\n" ); + return 1; + } // modify the current network if ( fAddInvs ) @@ -1428,9 +1438,9 @@ int Scl_CommandUpsize( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pAbc->Err, "The current network is not in a topo order (run \"topo\").\n" ); return 1; } - if ( pAbc->pLibScl == NULL ) + if ( !pAbc->pLibScl || !Abc_SclHasDelayInfo(pAbc->pLibScl) ) { - fprintf( pAbc->Err, "There is no Liberty library available.\n" ); + Abc_Print( -1, "Library delay info is not available.\n" ); return 1; } @@ -1605,9 +1615,9 @@ int Scl_CommandDnsize( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pAbc->Err, "The current network is not in a topo order (run \"topo\").\n" ); return 1; } - if ( pAbc->pLibScl == NULL ) + if ( !pAbc->pLibScl || !Abc_SclHasDelayInfo(pAbc->pLibScl) ) { - fprintf( pAbc->Err, "There is no Liberty library available.\n" ); + Abc_Print( -1, "Library delay info is not available.\n" ); return 1; } @@ -1678,9 +1688,9 @@ int Scl_CommandPrintBuf( Abc_Frame_t * pAbc, int argc, char **argv ) fprintf( pAbc->Err, "The current network is not in a topo order (run \"topo\").\n" ); return 1; } - if ( pAbc->pLibScl == NULL ) + if ( !pAbc->pLibScl || !Abc_SclHasDelayInfo(pAbc->pLibScl) ) { - fprintf( pAbc->Err, "There is no Liberty library available.\n" ); + Abc_Print( -1, "Library delay info is not available.\n" ); return 1; } diff --git a/src/map/scl/sclLib.h b/src/map/scl/sclLib.h index b8ac624a..18335085 100644 --- a/src/map/scl/sclLib.h +++ b/src/map/scl/sclLib.h @@ -559,6 +559,8 @@ static inline SC_Timing * Scl_CellPinTime( SC_Cell * pCell, int iPin ) pPin = SC_CellPin( pCell, pCell->n_inputs ); assert( Vec_PtrSize(pPin->vRTimings) == pCell->n_inputs ); pRTime = (SC_Timings *)Vec_PtrEntry( pPin->vRTimings, iPin ); + if ( Vec_PtrSize(pRTime->vTimings) == 0 ) + return NULL; assert( Vec_PtrSize(pRTime->vTimings) == 1 ); return (SC_Timing *)Vec_PtrEntry( pRTime->vTimings, 0 ); } @@ -610,6 +612,7 @@ extern SC_Cell * Abc_SclFindInvertor( SC_Lib * p, int fFindBuff ); extern SC_Cell * Abc_SclFindSmallestGate( SC_Cell * p, float CinMin ); extern SC_WireLoad * Abc_SclFindWireLoadModel( SC_Lib * p, float Area ); extern SC_WireLoad * Abc_SclFetchWireLoadModel( SC_Lib * p, char * pName ); +extern int Abc_SclHasDelayInfo( void * pScl ); extern float Abc_SclComputeAverageSlew( SC_Lib * p ); extern void Abc_SclDumpGenlib( char * pFileName, SC_Lib * p, float Slew, float Gain, int nGatesMin ); extern void Abc_SclInstallGenlib( void * pScl, float Slew, float Gain, int nGatesMin ); diff --git a/src/map/scl/sclLibUtil.c b/src/map/scl/sclLibUtil.c index c078e4e3..8f4bcd61 100644 --- a/src/map/scl/sclLibUtil.c +++ b/src/map/scl/sclLibUtil.c @@ -280,6 +280,31 @@ SC_WireLoad * Abc_SclFindWireLoadModel( SC_Lib * p, float Area ) /**Function************************************************************* + Synopsis [Returns 1 if the library has delay info.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_SclHasDelayInfo( void * pScl ) +{ + SC_Lib * p = (SC_Lib *)pScl; + SC_Cell * pCell; + SC_Timing * pTime; + pCell = Abc_SclFindInvertor(p, 0); + if ( pCell == NULL ) + return 0; + pTime = Scl_CellPinTime( pCell, 0 ); + if ( pTime == NULL ) + return 0; + return 1; +} + +/**Function************************************************************* + Synopsis [Returns "average" slew.] Description [] @@ -298,6 +323,8 @@ float Abc_SclComputeAverageSlew( SC_Lib * p ) if ( pCell == NULL ) return 0; pTime = Scl_CellPinTime( pCell, 0 ); + if ( pTime == NULL ) + return 0; vIndex = pTime->pCellRise->vIndex0; // slew return Vec_FltEntry( vIndex, Vec_FltSize(vIndex)/3 ); } @@ -313,7 +340,7 @@ float Abc_SclComputeAverageSlew( SC_Lib * p ) SeeAlso [] ***********************************************************************/ -void Abc_SclComputeParametersPin( SC_Lib * p, SC_Cell * pCell, int iPin, float Slew, float * pLD, float * pPD ) +int Abc_SclComputeParametersPin( SC_Lib * p, SC_Cell * pCell, int iPin, float Slew, float * pLD, float * pPD ) { SC_Pair Load0, Load1, Load2; SC_Pair ArrIn = { 0.0, 0.0 }; @@ -323,7 +350,9 @@ void Abc_SclComputeParametersPin( SC_Lib * p, SC_Cell * pCell, int iPin, float S SC_Pair ArrOut2 = { 0.0, 0.0 }; SC_Pair SlewOut = { 0.0, 0.0 }; SC_Timing * pTime = Scl_CellPinTime( pCell, iPin ); - Vec_Flt_t * vIndex = pTime->pCellRise->vIndex1; // capacitance + Vec_Flt_t * vIndex = pTime ? pTime->pCellRise->vIndex1 : NULL; // capacitance + if ( vIndex == NULL ) + return 0; // get load points Load0.rise = Load0.fall = 0.0; Load1.rise = Load1.fall = Vec_FltEntry( vIndex, 0 ); @@ -339,8 +368,9 @@ void Abc_SclComputeParametersPin( SC_Lib * p, SC_Cell * pCell, int iPin, float S *pLD = (ArrOut2.rise - ArrOut1.rise) / ((Load2.rise - Load1.rise) / SC_CellPinCap(pCell, iPin)); // get constant *pPD = ArrOut0.rise; + return 1; } -void Abc_SclComputeParametersCell( SC_Lib * p, SC_Cell * pCell, float Slew, float * pLD, float * pPD ) +int Abc_SclComputeParametersCell( SC_Lib * p, SC_Cell * pCell, float Slew, float * pLD, float * pPD ) { SC_Pin * pPin; float LD, PD, ld, pd; @@ -348,11 +378,13 @@ void Abc_SclComputeParametersCell( SC_Lib * p, SC_Cell * pCell, float Slew, floa LD = PD = ld = pd = 0; SC_CellForEachPinIn( pCell, pPin, i ) { - Abc_SclComputeParametersPin( p, pCell, i, Slew, &ld, &pd ); + if ( !Abc_SclComputeParametersPin( p, pCell, i, Slew, &ld, &pd ) ) + return 0; LD += ld; PD += pd; } *pLD = LD / Abc_MaxInt(1, pCell->n_inputs); *pPD = PD / Abc_MaxInt(1, pCell->n_inputs); + return 1; } void Abc_SclComputeParametersClass( SC_Lib * p, SC_Cell * pRepr, float Slew, float * pLD, float * pPD ) { @@ -513,13 +545,15 @@ void Abc_SclPrintCells( SC_Lib * p, float SlewInit, float Gain, int fInvOnly, in printf( "A =%8.2f ", pCell->area ); if ( pCell->n_outputs == 1 ) { - Abc_SclComputeParametersCell( p, pCell, Slew, &LD, &PD ); - printf( "D =%6.1f ps ", 0.01 * Gain * LD + PD ); - printf( "LD =%6.1f ps ", LD ); - printf( "PD =%6.1f ps ", PD ); - printf( "C =%5.1f ff ", SC_CellPinCapAve(pCell) ); - printf( "Cm =%5.0f ff ", SC_CellPin(pCell, pCell->n_inputs)->max_out_cap ); - printf( "Sm =%5.1f ps ", SC_CellPin(pCell, pCell->n_inputs)->max_out_slew ); + if ( Abc_SclComputeParametersCell( p, pCell, Slew, &LD, &PD ) ) + { + printf( "D =%6.1f ps ", 0.01 * Gain * LD + PD ); + printf( "LD =%6.1f ps ", LD ); + printf( "PD =%6.1f ps ", PD ); + printf( "C =%5.1f ff ", SC_CellPinCapAve(pCell) ); + printf( "Cm =%5.0f ff ", SC_CellPin(pCell, pCell->n_inputs)->max_out_cap ); + printf( "Sm =%5.1f ps ", SC_CellPin(pCell, pCell->n_inputs)->max_out_slew ); + } } printf( "\n" ); } |