Commit 3d8dc121 by Alan Mishchenko

Integrating input driving cell constraint into buffering/sizing.

parent efa6b54b
...@@ -53,7 +53,8 @@ void Abc_SclFindWindow( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int_t ** p ...@@ -53,7 +53,8 @@ void Abc_SclFindWindow( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int_t ** p
// collect fanins, node, and fanouts // collect fanins, node, and fanouts
Vec_IntClear( vNodes ); Vec_IntClear( vNodes );
Abc_ObjForEachFanin( pPivot, pNext, i ) 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(pNext) );
Vec_IntPush( vNodes, Abc_ObjId(pPivot) ); Vec_IntPush( vNodes, Abc_ObjId(pPivot) );
Abc_ObjForEachFanout( pPivot, pNext, i ) Abc_ObjForEachFanout( pPivot, pNext, i )
......
...@@ -225,6 +225,16 @@ static inline float Abc_SclObjLoadValue( SC_Man * p, Abc_Obj_t * pObj ) ...@@ -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); // 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); 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 ) void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept )
{ {
SC_Timing * pTime; SC_Timing * pTime;
...@@ -237,6 +247,12 @@ void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept ) ...@@ -237,6 +247,12 @@ void Abc_SclTimeNode( SC_Man * p, Abc_Obj_t * pObj, int fDept )
float DeptFall = 0; float DeptFall = 0;
float Value = p->EstLoadMax ? Abc_SclObjLoadValue( p, pObj ) : 0; float Value = p->EstLoadMax ? Abc_SclObjLoadValue( p, pObj ) : 0;
Abc_Obj_t * pFanin; Abc_Obj_t * pFanin;
if ( Abc_ObjIsCi(pObj) )
{
assert( !fDept );
Abc_SclTimeCi( p, pObj );
return;
}
if ( Abc_ObjIsCo(pObj) ) if ( Abc_ObjIsCo(pObj) )
{ {
if ( !fDept ) if ( !fDept )
...@@ -319,6 +335,8 @@ void Abc_SclTimeNtkRecompute( SC_Man * p, float * pArea, float * pDelay, int fRe ...@@ -319,6 +335,8 @@ void Abc_SclTimeNtkRecompute( SC_Man * p, float * pArea, float * pDelay, int fRe
Abc_SclComputeLoad( p ); Abc_SclComputeLoad( p );
Abc_SclManCleanTime( p ); Abc_SclManCleanTime( p );
p->nEstNodes = 0; p->nEstNodes = 0;
Abc_NtkForEachCi( p->pNtk, pObj, i )
Abc_SclTimeNode( p, pObj, 0 );
Abc_NtkForEachNode1( p->pNtk, pObj, i ) Abc_NtkForEachNode1( p->pNtk, pObj, i )
Abc_SclTimeNode( p, pObj, 0 ); Abc_SclTimeNode( p, pObj, 0 );
Abc_NtkForEachCo( p->pNtk, pObj, i ) Abc_NtkForEachCo( p->pNtk, pObj, i )
...@@ -376,7 +394,8 @@ static inline void Abc_SclTimeIncAddFanins( SC_Man * p, Abc_Obj_t * pObj ) ...@@ -376,7 +394,8 @@ static inline void Abc_SclTimeIncAddFanins( SC_Man * p, Abc_Obj_t * pObj )
Abc_Obj_t * pFanin; Abc_Obj_t * pFanin;
int i; int i;
Abc_ObjForEachFanin( pObj, pFanin, 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 ); Abc_SclTimeIncAddNode( p, pFanin );
} }
static inline void Abc_SclTimeIncAddFanouts( SC_Man * p, Abc_Obj_t * pObj ) static inline void Abc_SclTimeIncAddFanouts( SC_Man * p, Abc_Obj_t * pObj )
......
...@@ -256,6 +256,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p ) ...@@ -256,6 +256,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p )
memset( p->pTimes, 0, sizeof(SC_Pair) * p->nObjs ); memset( p->pTimes, 0, sizeof(SC_Pair) * p->nObjs );
memset( p->pSlews, 0, sizeof(SC_Pair) * p->nObjs ); memset( p->pSlews, 0, sizeof(SC_Pair) * p->nObjs );
memset( p->pDepts, 0, sizeof(SC_Pair) * p->nObjs ); memset( p->pDepts, 0, sizeof(SC_Pair) * p->nObjs );
/*
if ( p->pPiDrive != NULL ) if ( p->pPiDrive != NULL )
{ {
SC_Pair * pSlew, * pTime, * pLoad; SC_Pair * pSlew, * pTime, * pLoad;
...@@ -269,6 +270,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p ) ...@@ -269,6 +270,7 @@ static inline void Abc_SclManCleanTime( SC_Man * p )
Scl_LibHandleInputDriver( p->pPiDrive, pLoad, pTime, pSlew ); Scl_LibHandleInputDriver( p->pPiDrive, pLoad, pTime, pSlew );
} }
} }
*/
} }
......
...@@ -222,7 +222,8 @@ void Abc_SclFindNodesToUpdate( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int ...@@ -222,7 +222,8 @@ void Abc_SclFindNodesToUpdate( Abc_Obj_t * pPivot, Vec_Int_t ** pvNodes, Vec_Int
// collect fanins, node, and fanouts // collect fanins, node, and fanouts
Vec_IntClear( vNodes ); Vec_IntClear( vNodes );
Abc_ObjForEachFanin( pPivot, pNext, i ) 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(pNext) );
Vec_IntPush( vNodes, Abc_ObjId(pPivot) ); Vec_IntPush( vNodes, Abc_ObjId(pPivot) );
if ( pExtra ) if ( pExtra )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment