diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-10-09 23:25:03 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-10-09 23:25:03 -0700 |
commit | c9fbac5f2e72b8259c28e135dafb6b21a3819c54 (patch) | |
tree | 2e63519b1fec875055635dc10a9fbdc6b510f8e9 | |
parent | 1e7ea2ca459184461c1461fb13e7fd54e0a467b8 (diff) | |
download | abc-c9fbac5f2e72b8259c28e135dafb6b21a3819c54.tar.gz abc-c9fbac5f2e72b8259c28e135dafb6b21a3819c54.tar.bz2 abc-c9fbac5f2e72b8259c28e135dafb6b21a3819c54.zip |
Improvements to gate sizing.
-rw-r--r-- | src/map/scl/sclMan.h | 3 | ||||
-rw-r--r-- | src/map/scl/sclSize.c | 23 | ||||
-rw-r--r-- | src/map/scl/sclTime.c | 61 |
3 files changed, 46 insertions, 41 deletions
diff --git a/src/map/scl/sclMan.h b/src/map/scl/sclMan.h index 155dccc4..3a2daff7 100644 --- a/src/map/scl/sclMan.h +++ b/src/map/scl/sclMan.h @@ -108,7 +108,8 @@ static inline SC_Pair * Abc_SclObjSlew2( SC_Man * p, Abc_Obj_t * pObj ) static inline float Abc_SclObjTimeMax( SC_Man * p, Abc_Obj_t * pObj ) { return Abc_MaxFloat(Abc_SclObjTime(p, pObj)->rise, Abc_SclObjTime(p, pObj)->fall); } static inline float Abc_SclObjDepthMax( SC_Man * p, Abc_Obj_t * pObj ) { return Abc_MaxFloat(Abc_SclObjDept(p, pObj)->rise, Abc_SclObjDept(p, pObj)->fall); } -static inline float Abc_SclObjSlack( SC_Man * p, Abc_Obj_t * pObj, float D ) { return D - Abc_MaxFloat(Abc_SclObjTime(p, pObj)->rise + Abc_SclObjDept(p, pObj)->rise, Abc_SclObjTime(p, pObj)->fall + Abc_SclObjDept(p, pObj)->fall); } +static inline float Abc_SclObjGetSlack( SC_Man * p, Abc_Obj_t * pObj, float D ) { return D - Abc_MaxFloat(Abc_SclObjTime(p, pObj)->rise + Abc_SclObjDept(p, pObj)->rise, Abc_SclObjTime(p, pObj)->fall + Abc_SclObjDept(p, pObj)->fall); } +static inline float Abc_SclObjSlack( SC_Man * p, Abc_Obj_t * pObj ) { return p->pSlack[Abc_ObjId(pObj)]; } static inline void Abc_SclObjDupFanin( SC_Man * p, Abc_Obj_t * pObj ) { assert( Abc_ObjIsCo(pObj) ); *Abc_SclObjTime(p, pObj) = *Abc_SclObjTime(p, Abc_ObjFanin0(pObj)); } static inline float Abc_SclObjGain( SC_Man * p, Abc_Obj_t * pObj ) { return (Abc_SclObjTime2(p, pObj)->rise - Abc_SclObjTime(p, pObj)->rise) + (Abc_SclObjTime2(p, pObj)->fall - Abc_SclObjTime(p, pObj)->fall); } diff --git a/src/map/scl/sclSize.c b/src/map/scl/sclSize.c index f7bb9371..59c76754 100644 --- a/src/map/scl/sclSize.c +++ b/src/map/scl/sclSize.c @@ -138,29 +138,6 @@ Vec_Int_t * Abc_SclFindCriticalCone( SC_Man * p, int Range, int RangeF, Vec_Int_ SeeAlso [] ***********************************************************************/ -Vec_Int_t * Abc_SclFindCriticalPath2( SC_Man * p, int Range, Vec_Int_t ** pvPivots ) -{ - Vec_Int_t * vPivots = Abc_SclFindCriticalCoRange( p, Range ); - Vec_Int_t * vPath = Vec_IntAlloc( 100 ); - Abc_Obj_t * pObj; - int i, fRise = 0; - //Vec_IntShrink( vPivots, 1 ); - Abc_NtkForEachObjVec( vPivots, p->pNtk, pObj, i ) - { - pObj = Abc_ObjFanin0(pObj); - while ( pObj && Abc_ObjIsNode(pObj) ) - { - Vec_IntPush( vPath, Abc_ObjId(pObj) ); - pObj = Abc_SclFindMostCriticalFanin( p, &fRise, pObj ); - } - } - Vec_IntUniqify( vPath ); - if ( pvPivots ) - *pvPivots = vPivots; - else - Vec_IntFree( vPivots ); - return vPath; -} Vec_Int_t * Abc_SclFindCriticalPath( SC_Man * p, int Range, Vec_Int_t ** pvPivots ) { return Abc_SclFindCriticalCone( p, Range, 1, pvPivots ); diff --git a/src/map/scl/sclTime.c b/src/map/scl/sclTime.c index ad0f7446..66a28b51 100644 --- a/src/map/scl/sclTime.c +++ b/src/map/scl/sclTime.c @@ -34,7 +34,7 @@ ABC_NAMESPACE_IMPL_START /**Function************************************************************* - Synopsis [Finding most critical nodes/fanins/path.] + Synopsis [Finding most critical objects.] Description [] @@ -57,19 +57,42 @@ Abc_Obj_t * Abc_SclFindCriticalCo( SC_Man * p, int * pfRise ) assert( pPivot != NULL ); return pPivot; } -Abc_Obj_t * Abc_SclFindMostCriticalFanin( SC_Man * p, int * pfRise, Abc_Obj_t * pNode ) +// assumes that slacks are not available (uses arrival times) +Abc_Obj_t * Abc_SclFindMostCriticalFanin2( SC_Man * p, int * pfRise, Abc_Obj_t * pNode ) { - Abc_Obj_t * pObj, * pPivot = NULL; + Abc_Obj_t * pFanin, * pPivot = NULL; float fMaxArr = 0; int i; - Abc_ObjForEachFanin( pNode, pObj, i ) + Abc_ObjForEachFanin( pNode, pFanin, i ) { - SC_Pair * pArr = Abc_SclObjTime( p, pObj ); - if ( fMaxArr < pArr->rise ) fMaxArr = pArr->rise, *pfRise = 1, pPivot = pObj; - if ( fMaxArr < pArr->fall ) fMaxArr = pArr->fall, *pfRise = 0, pPivot = pObj; + SC_Pair * pArr = Abc_SclObjTime( p, pFanin ); + if ( fMaxArr < pArr->rise ) fMaxArr = pArr->rise, *pfRise = 1, pPivot = pFanin; + if ( fMaxArr < pArr->fall ) fMaxArr = pArr->fall, *pfRise = 0, pPivot = pFanin; } return pPivot; } +// assumes that slack are available +Abc_Obj_t * Abc_SclFindMostCriticalFanin( SC_Man * p, int * pfRise, Abc_Obj_t * pNode ) +{ + Abc_Obj_t * pFanin, * pPivot = NULL; + float fMinSlack = ABC_INFINITY; + SC_Pair * pArr; + int i; + *pfRise = 0; + // find min-slack node + Abc_ObjForEachFanin( pNode, pFanin, i ) + if ( fMinSlack > Abc_SclObjSlack( p, pFanin ) ) + { + fMinSlack = Abc_SclObjSlack( p, pFanin ); + pPivot = pFanin; + } + if ( pPivot == NULL ) + return NULL; + // find its leading phase + pArr = Abc_SclObjTime( p, pPivot ); + *pfRise = (pArr->rise >= pArr->fall); + return pPivot; +} /**Function************************************************************* @@ -92,9 +115,9 @@ static inline void Abc_SclTimeNodePrint( SC_Man * p, Abc_Obj_t * pObj, int fRise printf( "delay = (" ); printf( "%8.2f ps ", Abc_SclObjTimePs(p, pObj, 1) ); printf( "%8.2f ps ) ", Abc_SclObjTimePs(p, pObj, 0) ); - printf( "load =%6.2f ff ", Abc_SclObjLoadFf(p, pObj, fRise >= 0 ? fRise : 0 ) ); - printf( "slew =%6.1f ps ", Abc_SclObjSlewPs(p, pObj, fRise >= 0 ? fRise : 0 ) ); - printf( "slack =%6.1f ps", Abc_SclObjSlack(p, pObj, maxDelay) ); + printf( "load =%7.2f ff ", Abc_SclObjLoadFf(p, pObj, fRise >= 0 ? fRise : 0 ) ); + printf( "slew =%7.2f ps ", Abc_SclObjSlewPs(p, pObj, fRise >= 0 ? fRise : 0 ) ); + printf( "slack =%6.2f ps", Abc_SclObjSlack(p, pObj) ); printf( "\n" ); } void Abc_SclTimeNtkPrint( SC_Man * p, int fShowAll, int fShort ) @@ -127,8 +150,10 @@ void Abc_SclTimeNtkPrint( SC_Man * p, int fShowAll, int fShort ) // printf( "Critical path: \n" ); // find the longest cell name pObj = Abc_ObjFanin0(pPivot); + i = 0; while ( pObj && Abc_ObjIsNode(pObj) ) { + i++; nLength = Abc_MaxInt( nLength, strlen(Abc_SclObjCell(p, pObj)->pName) ); pObj = Abc_SclFindMostCriticalFanin( p, &fRise, pObj ); } @@ -136,7 +161,7 @@ void Abc_SclTimeNtkPrint( SC_Man * p, int fShowAll, int fShort ) pObj = Abc_ObjFanin0(pPivot); while ( pObj && Abc_ObjIsNode(pObj) ) { - printf( "Critical path -- " ); + printf( "C-path %2d -- ", i-- ); Abc_SclTimeNodePrint( p, pObj, fRise, nLength, maxDelay ); pObj = Abc_SclFindMostCriticalFanin( p, &fRise, pObj ); } @@ -226,7 +251,7 @@ void Abc_SclDeptFanin( SC_Man * p, SC_Timing * pTime, Abc_Obj_t * pObj, Abc_Obj_ pDepIn->rise = Abc_MaxFloat( pDepIn->rise, pDepOut->fall + Abc_SclLookup(pTime->pCellFall, pSlewIn->rise, pLoad->fall) ); } } -void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept, float D ) +void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept ) { SC_Timings * pRTime; SC_Timing * pTime; @@ -256,8 +281,6 @@ void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept, float D ) else Abc_SclTimeFanin( p, pTime, pObj, Abc_ObjFanin(pObj, k) ); } - if ( fDept ) - p->pSlack[Abc_ObjId(pObj)] = Abc_MaxFloat( 0.0, Abc_SclObjSlack(p, pObj, D) ); } void Abc_SclTimeCone( SC_Man * p, Vec_Int_t * vCone ) { @@ -271,7 +294,7 @@ void Abc_SclTimeCone( SC_Man * p, Vec_Int_t * vCone ) printf( " Updating node %d with gate %s\n", Abc_ObjId(pObj), Abc_SclObjCell(p, pObj)->pName ); if ( fVerbose && Abc_ObjIsNode(pObj) ) printf( " before (%6.1f ps %6.1f ps) ", Abc_SclObjTimePs(p, pObj, 1), Abc_SclObjTimePs(p, pObj, 0) ); - Abc_SclTimeNode( p, pObj, 0, 0 ); + Abc_SclTimeNode( p, pObj, 0 ); if ( fVerbose && Abc_ObjIsNode(pObj) ) printf( "after (%6.1f ps %6.1f ps)\n", Abc_SclObjTimePs(p, pObj, 1), Abc_SclObjTimePs(p, pObj, 0) ); } @@ -284,7 +307,7 @@ void Abc_SclTimeNtkRecompute( SC_Man * p, float * pArea, float * pDelay, int fRe Abc_SclComputeLoad( p ); Abc_SclManCleanTime( p ); Abc_NtkForEachNode1( p->pNtk, pObj, i ) - Abc_SclTimeNode( p, pObj, 0, 0 ); + Abc_SclTimeNode( p, pObj, 0 ); Abc_NtkForEachCo( p->pNtk, pObj, i ) { Abc_SclObjDupFanin( p, pObj ); @@ -297,8 +320,12 @@ void Abc_SclTimeNtkRecompute( SC_Man * p, float * pArea, float * pDelay, int fRe if ( pDelay ) *pDelay = D; if ( fReverse ) + { Abc_NtkForEachNodeReverse1( p->pNtk, pObj, i ) - Abc_SclTimeNode( p, pObj, 1, D ); + Abc_SclTimeNode( p, pObj, 1 ); + Abc_NtkForEachObj( p->pNtk, pObj, i ) + p->pSlack[i] = Abc_MaxFloat( 0.0, Abc_SclObjGetSlack(p, pObj, D) ); + } } /**Function************************************************************* |