48 float EntryPrev, EntryCur, Slope;
49 int i, iPrev, k, Entry, EntryMax;
54 EntryMax = Abc_MaxInt( EntryMax, Entry );
56 vCaps = Vec_FltStart( Abc_MaxInt(nFanoutMax, EntryMax) + 1 );
58 Vec_FltWriteEntry( vCaps, Entry, Vec_FltEntry(&pWL->
vLen, i) * pWL->
cap );
59 if ( Vec_FltEntry(vCaps, 1) == 0 )
62 assert( Vec_FltEntry(vCaps, 1) != 0 );
64 EntryPrev = Vec_FltEntry(vCaps, 1);
69 Slope = (EntryCur - EntryPrev) / (i - iPrev);
70 for ( k = iPrev + 1; k < i; k++ )
71 Vec_FltWriteEntry( vCaps, k, EntryPrev + Slope * (k - iPrev) );
77 for ( k = iPrev + 1; k < i; k++ )
78 Vec_FltWriteEntry( vCaps, k, EntryPrev + Slope * (k - iPrev) );
98 if ( vWireCaps == NULL )
100 return Vec_FltEntry( vWireCaps, Abc_MinInt(nFans, Vec_FltSize(vWireCaps)-1) );
105 Abc_SclObjLoad(
p, pObj)->rise += fSubtr ? -Load : Load;
106 Abc_SclObjLoad(
p, pObj)->fall += fSubtr ? -Load : Load;
115 SC_Pair * pLoad = Abc_SclObjLoad(
p, pObj );
116 if ( !Abc_ObjIsPo(pObj) )
122 SC_Cell * pCell = Abc_SclObjCell( pObj );
125 SC_Pair * pLoad = Abc_SclObjLoad(
p, pFanin );
126 SC_Pin * pPin = SC_CellPin( pCell, k );
134 SC_Pair * pLoadPo = Abc_SclObjLoad(
p, pObj );
135 SC_Pair * pLoad = Abc_SclObjLoad(
p, Abc_ObjFanin0(pObj) );
140 if (
p->pWLoadUsed != NULL )
142 if (
p->vWireCaps == NULL )
150 if (
p->vInDrive != NULL )
154 SC_Pair * pLoad = Abc_SclObjLoad(
p, pObj );
155 if ( Abc_SclObjInDrive(
p, pObj) != 0 && (pLoad->
rise > Abc_SclObjInDrive(
p, pObj) || pLoad->
fall > Abc_SclObjInDrive(
p, pObj)) )
156 printf(
"Maximum input drive strength is exceeded at primary input %d.\n", i );
171 double TotalLoad = 0;
175 SC_Pair * pLoad = Abc_SclObjLoad(
p, pObj );
176 TotalLoad += 0.5 * pLoad->
fall + 0.5 * pLoad->
rise;
181 SC_Pair * pLoad = Abc_SclObjLoad(
p, pObj );
182 TotalLoad += 0.5 * pLoad->
fall + 0.5 * pLoad->
rise;
185 p->EstLoadAve = (float)(TotalLoad / nObjs);
207 SC_Pair * pLoad = Abc_SclObjLoad(
p, pFanin );
208 SC_Pin * pPinOld = SC_CellPin( pOld, k );
209 SC_Pin * pPinNew = SC_CellPin( pNew, k );
220 assert( Abc_ObjFaninNum(pBuffer) == 1 );
221 pPin = SC_CellPin( Abc_SclObjCell(pFanout), iFanin );
223 pLoad = Abc_SclObjLoad(
p, pBuffer );
227 pLoad = Abc_SclObjLoad(
p, Abc_ObjFanin0(pBuffer) );
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
#define Abc_ObjForEachFanin(pObj, pFanin, i)
#define Abc_NtkForEachPi(pNtk, pPi, i)
ABC_DLL int Abc_NtkGetFanoutMax(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachNode1(pNtk, pNode, i)
ABC_DLL int Abc_NodeFindFanin(Abc_Obj_t *pNode, Abc_Obj_t *pFanin)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct SC_WireLoad_ SC_WireLoad
STRUCTURE DEFINITIONS ///.
float Abc_SclFindWireLoad(Vec_Flt_t *vWireCaps, int nFans)
void Abc_SclUpdateLoad(SC_Man *p, Abc_Obj_t *pObj, SC_Cell *pOld, SC_Cell *pNew)
ABC_NAMESPACE_IMPL_START Vec_Flt_t * Abc_SclFindWireCaps(SC_WireLoad *pWL, int nFanoutMax)
DECLARATIONS ///.
void Abc_SclComputeLoad(SC_Man *p)
void Abc_SclAddWireLoad(SC_Man *p, Abc_Obj_t *pObj, int fSubtr)
void Abc_SclUpdateLoadSplit(SC_Man *p, Abc_Obj_t *pBuffer, Abc_Obj_t *pFanout)
typedefABC_NAMESPACE_HEADER_START struct SC_Man_ SC_Man
INCLUDES ///.
#define Vec_FltForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.