From 3d8dc1217c3634963e36f793d475cb73622d8719 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Tue, 17 Sep 2013 23:00:59 -0700 Subject: Integrating input driving cell constraint into buffering/sizing. --- src/map/scl/sclDnsize.c | 3 ++- src/map/scl/sclSize.c | 21 ++++++++++++++++++++- src/map/scl/sclSize.h | 2 ++ src/map/scl/sclUpsize.c | 3 ++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/map/scl/sclDnsize.c b/src/map/scl/sclDnsize.c index 4bc21d28..b81b640f 100644 --- a/src/map/scl/sclDnsize.c +++ b/src/map/scl/sclDnsize.c @@ -53,7 +53,8 @@ void Abc_SclFindWindow( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int_t ** p // collect fanins, node, and fanouts Vec_IntClear( vNodes ); Abc_ObjForEachFanin( pPivot, pNext, i ) - if ( Abc_ObjIsNode(pNext) && Abc_ObjFaninNum(pNext) > 0 ) +// if ( Abc_ObjIsNode(pNext) && Abc_ObjFaninNum(pNext) > 0 ) + if ( Abc_ObjIsCi(pNext) || Abc_ObjFaninNum(pNext) > 0 ) Vec_IntPush( vNodes, Abc_ObjId(pNext) ); Vec_IntPush( vNodes, Abc_ObjId(pPivot) ); Abc_ObjForEachFanout( pPivot, pNext, i ) diff --git a/src/map/scl/sclSize.c b/src/map/scl/sclSize.c index 0cc282a9..33b7474a 100644 --- a/src/map/scl/sclSize.c +++ b/src/map/scl/sclSize.c @@ -225,6 +225,16 @@ static inline float Abc_SclObjLoadValue( SC_Man * p, Abc_Obj_t * pObj ) // float Value = Abc_MaxFloat(pLoad->fall, pLoad->rise) / (p->EstLoadAve * p->EstLoadMax); return (0.5 * Abc_SclObjLoad(p, pObj)->fall + 0.5 * Abc_SclObjLoad(p, pObj)->rise) / (p->EstLoadAve * p->EstLoadMax); } +static inline void Abc_SclTimeCi( SC_Man * p, Abc_Obj_t * pObj ) +{ + if ( p->pPiDrive != NULL ) + { + SC_Pair * pLoad = Abc_SclObjLoad( p, pObj ); + SC_Pair * pTime = Abc_SclObjTime( p, pObj ); + SC_Pair * pSlew = Abc_SclObjSlew( p, pObj ); + Scl_LibHandleInputDriver( p->pPiDrive, pLoad, pTime, pSlew ); + } +} void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept ) { SC_Timing * pTime; @@ -237,6 +247,12 @@ void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept ) float DeptFall = 0; float Value = p->EstLoadMax ? Abc_SclObjLoadValue( p, pObj ) : 0; Abc_Obj_t * pFanin; + if ( Abc_ObjIsCi(pObj) ) + { + assert( !fDept ); + Abc_SclTimeCi( p, pObj ); + return; + } if ( Abc_ObjIsCo(pObj) ) { if ( !fDept ) @@ -319,6 +335,8 @@ void Abc_SclTimeNtkRecompute( SC_Man * p, float * pArea, float * pDelay, int fRe Abc_SclComputeLoad( p ); Abc_SclManCleanTime( p ); p->nEstNodes = 0; + Abc_NtkForEachCi( p->pNtk, pObj, i ) + Abc_SclTimeNode( p, pObj, 0 ); Abc_NtkForEachNode1( p->pNtk, pObj, i ) Abc_SclTimeNode( p, pObj, 0 ); Abc_NtkForEachCo( p->pNtk, pObj, i ) @@ -376,7 +394,8 @@ static inline void Abc_SclTimeIncAddFanins( SC_Man * p, Abc_Obj_t * pObj ) Abc_Obj_t * pFanin; int i; Abc_ObjForEachFanin( pObj, pFanin, i ) - if ( !pFanin->fMarkC && Abc_ObjIsNode(pFanin) ) +// if ( !pFanin->fMarkC && Abc_ObjIsNode(pFanin) ) + if ( !pFanin->fMarkC ) Abc_SclTimeIncAddNode( p, pFanin ); } static inline void Abc_SclTimeIncAddFanouts( SC_Man * p, Abc_Obj_t * pObj ) diff --git a/src/map/scl/sclSize.h b/src/map/scl/sclSize.h index 86008e54..cee260ab 100644 --- a/src/map/scl/sclSize.h +++ b/src/map/scl/sclSize.h @@ -256,6 +256,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p ) memset( p->pTimes, 0, sizeof(SC_Pair) * p->nObjs ); memset( p->pSlews, 0, sizeof(SC_Pair) * p->nObjs ); memset( p->pDepts, 0, sizeof(SC_Pair) * p->nObjs ); +/* if ( p->pPiDrive != NULL ) { SC_Pair * pSlew, * pTime, * pLoad; @@ -269,6 +270,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p ) Scl_LibHandleInputDriver( p->pPiDrive, pLoad, pTime, pSlew ); } } +*/ } diff --git a/src/map/scl/sclUpsize.c b/src/map/scl/sclUpsize.c index 09eadfa0..d7196216 100644 --- a/src/map/scl/sclUpsize.c +++ b/src/map/scl/sclUpsize.c @@ -222,7 +222,8 @@ void Abc_SclFindNodesToUpdate( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int // collect fanins, node, and fanouts Vec_IntClear( vNodes ); Abc_ObjForEachFanin( pPivot, pNext, i ) - if ( Abc_ObjIsNode(pNext) && Abc_ObjFaninNum(pNext) > 0 ) +// if ( Abc_ObjIsNode(pNext) && Abc_ObjFaninNum(pNext) > 0 ) + if ( Abc_ObjIsCi(pNext) || Abc_ObjFaninNum(pNext) > 0 ) Vec_IntPush( vNodes, Abc_ObjId(pNext) ); Vec_IntPush( vNodes, Abc_ObjId(pPivot) ); if ( pExtra ) -- cgit v1.2.3