51 pObj->tArrival = pObj->tSlack = 0.0;
70 int i, j, best_i, temp;
75 pPinDelays[i] = Nwk_ObjArrival(pFanin);
79 for ( i = 0; i < Nwk_ObjFaninNum(pNode)-1; i++ )
82 for ( j = i+1; j < Nwk_ObjFaninNum(pNode); j++ )
83 if ( pPinDelays[pPinPerm[j]] > pPinDelays[pPinPerm[best_i]] )
88 pPinPerm[i] = pPinPerm[best_i];
89 pPinPerm[best_i] = temp;
92 assert( Nwk_ObjFaninNum(pNode) == 0 || pPinPerm[0] < Nwk_ObjFaninNum(pNode) );
93 for ( i = 1; i < Nwk_ObjFaninNum(pNode); i++ )
95 assert( pPinPerm[i] < Nwk_ObjFaninNum(pNode) );
96 assert( pPinDelays[pPinPerm[i-1]] >= pPinDelays[pPinPerm[i]] );
114 for ( i = 0; i < Nwk_ObjFaninNum(pFanout); i++ )
115 if ( Nwk_ObjFanin(pFanout, pPinPerm[i]) == pFanin )
135 float pPinDelays[32];
137 float tArrival, * pDelays;
139 assert( Nwk_ObjIsNode(pObj) || Nwk_ObjIsCi(pObj) || Nwk_ObjIsCo(pObj) );
140 if ( Nwk_ObjIsCi(pObj) )
141 return Nwk_ObjArrival(pObj);
142 if ( Nwk_ObjIsCo(pObj) )
143 return Nwk_ObjArrival( Nwk_ObjFanin0(pObj) );
145 if ( pLutLib == NULL )
148 if ( tArrival < Nwk_ObjArrival(pFanin) + 1.0 )
149 tArrival = Nwk_ObjArrival(pFanin) + 1.0;
153 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pObj)];
155 if ( tArrival < Nwk_ObjArrival(pFanin) + pDelays[0] )
156 tArrival = Nwk_ObjArrival(pFanin) + pDelays[0];
160 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pObj)];
165 if ( tArrival < Nwk_ObjArrival(Nwk_ObjFanin(pObj,pPinPerm[k])) + pDelays[k] )
166 tArrival = Nwk_ObjArrival(Nwk_ObjFanin(pObj,pPinPerm[k])) + pDelays[k];
171 if ( tArrival < Nwk_ObjArrival(pFanin) + pDelays[k] )
172 tArrival = Nwk_ObjArrival(pFanin) + pDelays[k];
175 if ( Nwk_ObjFaninNum(pObj) == 0 )
195 float pPinDelays[32];
197 float tRequired, tDelay, * pDelays;
199 assert( Nwk_ObjIsNode(pObj) || Nwk_ObjIsCi(pObj) || Nwk_ObjIsCo(pObj) );
200 if ( Nwk_ObjIsCo(pObj) )
201 return Nwk_ObjRequired(pObj);
203 if ( pLutLib == NULL )
207 tDelay = Nwk_ObjIsCo(pFanout)? 0.0 : 1.0;
208 if ( tRequired > Nwk_ObjRequired(pFanout) - tDelay )
209 tRequired = Nwk_ObjRequired(pFanout) - tDelay;
216 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pFanout)];
217 tDelay = Nwk_ObjIsCo(pFanout)? 0.0 : pDelays[0];
218 if ( tRequired > Nwk_ObjRequired(pFanout) - tDelay )
219 tRequired = Nwk_ObjRequired(pFanout) - tDelay;
228 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pFanout)];
231 assert( Nwk_ObjFanin(pFanout,pPinPerm[iFanin]) == pObj );
232 tDelay = Nwk_ObjIsCo(pFanout)? 0.0 : pDelays[iFanin];
233 if ( tRequired > Nwk_ObjRequired(pFanout) - tDelay )
234 tRequired = Nwk_ObjRequired(pFanout) - tDelay;
241 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pFanout)];
243 assert( Nwk_ObjFanin(pFanout,iFanin) == pObj );
244 tDelay = Nwk_ObjIsCo(pFanout)? 0.0 : pDelays[iFanin];
245 if ( tRequired > Nwk_ObjRequired(pFanout) - tDelay )
246 tRequired = Nwk_ObjRequired(pFanout) - tDelay;
268 float pPinDelays[32];
270 float tRequired = 0.0;
273 assert( Nwk_ObjIsNode(pObj) );
274 if ( pLutLib == NULL )
276 tRequired = Nwk_ObjRequired(pObj) - (float)1.0;
278 if ( Nwk_ObjRequired(pFanin) > tRequired )
279 Nwk_ObjSetRequired( pFanin, tRequired );
283 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pObj)];
284 tRequired = Nwk_ObjRequired(pObj) - pDelays[0];
286 if ( Nwk_ObjRequired(pFanin) > tRequired )
287 Nwk_ObjSetRequired( pFanin, tRequired );
291 pDelays = pLutLib->
pLutDelays[Nwk_ObjFaninNum(pObj)];
297 tRequired = Nwk_ObjRequired(pObj) - pDelays[k];
298 if ( Nwk_ObjRequired(Nwk_ObjFanin(pObj,pPinPerm[k])) > tRequired )
299 Nwk_ObjSetRequired( Nwk_ObjFanin(pObj,pPinPerm[k]), tRequired );
306 tRequired = Nwk_ObjRequired(pObj) - pDelays[k];
307 if ( Nwk_ObjRequired(pFanin) > tRequired )
308 Nwk_ObjSetRequired( pFanin, tRequired );
333 float tArrival, tRequired, tSlack;
339 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
358 if ( Nwk_ObjIsCi(pObj) && pNtk->
pManTime )
360 if ( Nwk_ObjIsCo(pObj) && pNtk->
pManTime )
362 Nwk_ObjSetArrival( pObj, tArrival );
364 Vec_PtrFree( vObjs );
369 if ( tArrival < Nwk_ObjArrival(pObj) )
370 tArrival = Nwk_ObjArrival(pObj);
381 Nwk_ObjSetRequired( pObj, tArrival );
387 if ( Nwk_ObjIsNode(pObj) )
391 else if ( Nwk_ObjIsCi(pObj) )
396 else if ( Nwk_ObjIsCo(pObj) )
401 Nwk_ObjSetRequired( pObj, tRequired );
403 if ( Nwk_ObjRequired(Nwk_ObjFanin0(pObj)) > Nwk_ObjRequired(pObj) )
404 Nwk_ObjSetRequired( Nwk_ObjFanin0(pObj), Nwk_ObjRequired(pObj) );
408 tSlack = Nwk_ObjRequired(pObj) - Nwk_ObjArrival(pObj);
409 assert( tSlack + 0.01 > 0.0 );
410 Nwk_ObjSetSlack( pObj, tSlack < 0.0 ? 0.0 : tSlack );
412 Vec_PtrFree( vNodes );
430 float tArrival, tRequired;
434 if ( Nwk_ObjIsCi(pObj) && Nwk_ObjFanoutNum(pObj) == 0 )
438 if ( !Nwk_ManTimeEqual( tArrival, Nwk_ObjArrival(pObj), (
float)0.01 ) )
439 printf(
"Nwk_ManVerifyTiming(): Object %d has different arrival time (%.2f) from computed (%.2f).\n",
440 pObj->Id, Nwk_ObjArrival(pObj), tArrival );
441 if ( !Nwk_ManTimeEqual( tRequired, Nwk_ObjRequired(pObj), (
float)0.01 ) )
442 printf(
"Nwk_ManVerifyTiming(): Object %d has different required time (%.2f) from computed (%.2f).\n",
443 pObj->Id, Nwk_ObjRequired(pObj), tRequired );
463 int i, Nodes, * pCounters;
464 float tArrival, tDelta, nSteps, Num;
468 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
474 pCounters =
ABC_ALLOC(
int, nSteps + 1 );
475 memset( pCounters, 0,
sizeof(
int)*(nSteps + 1) );
478 tDelta = tArrival / nSteps;
482 if ( Nwk_ObjFaninNum(pNode) == 0 )
484 Num = Nwk_ObjSlack(pNode) / tDelta;
487 assert( Num >=0 && Num <= nSteps );
488 pCounters[(int)Num]++;
491 printf(
"Max delay = %6.2f. Delay trace using %s model:\n", tArrival, pLutLib?
"LUT library" :
"unit-delay" );
493 for ( i = 0; i < nSteps; i++ )
495 Nodes += pCounters[i];
496 printf(
"%3d %s : %5d (%6.2f %%)\n", pLutLib? 5*(i+1) : i+1,
497 pLutLib?
"%":
"lev", Nodes, 100.0*Nodes/Nwk_ManNodeNum(pNtk) );
521 Vec_PtrPush( vQueue, pObj );
522 for ( i = Vec_PtrSize(vQueue) - 1; i > iCurrent + 1; i-- )
525 pTemp2 = (
Nwk_Obj_t *)vQueue->pArray[i-1];
528 if ( Nwk_ObjLevel(pTemp2) <= Nwk_ObjLevel(pTemp1) )
533 if ( Nwk_ObjLevel(pTemp2) >= Nwk_ObjLevel(pTemp1) )
536 vQueue->pArray[i-1] = pTemp1;
537 vQueue->pArray[i] = pTemp2;
540 for ( i = iCurrent + 1; i < Vec_PtrSize(vQueue) - 1; i++ )
543 pTemp2 = (
Nwk_Obj_t *)vQueue->pArray[i+1];
545 assert( Nwk_ObjLevel(pTemp1) <= Nwk_ObjLevel(pTemp2) );
547 assert( Nwk_ObjLevel(pTemp1) >= Nwk_ObjLevel(pTemp2) );
564 Tim_Man_t * pManTime = pObj->pMan->pManTime;
569 int iCur, k, iBox, iTerm1, nTerms;
570 assert( Nwk_ObjIsNode(pObj) );
573 assert( Nwk_ManTimeLess( tArrival, Nwk_ObjRequired(pObj), (
float)0.01 ) );
575 Vec_PtrClear( vQueue );
576 Vec_PtrPush( vQueue, pObj );
585 if ( Nwk_ObjIsCi(pTemp) && pManTime )
587 if ( Nwk_ManTimeEqual( tArrival, Nwk_ObjArrival(pTemp), (
float)0.01 ) )
589 Nwk_ObjSetArrival( pTemp, tArrival );
591 if ( Nwk_ObjIsCo(pTemp) )
606 for ( k = 0; k < nTerms; k++ )
608 pNext = Nwk_ManCi(pNext->pMan, iTerm1 + k);
643 Tim_Man_t * pManTime = pObj->pMan->pManTime;
648 int iCur, k, iBox, iTerm1, nTerms;
649 assert( Nwk_ObjIsNode(pObj) );
652 assert( Nwk_ManTimeEqual( tRequired, Nwk_ObjRequired(pObj), (
float)0.01 ) );
654 Vec_PtrClear( vQueue );
669 if ( Nwk_ObjIsCo(pTemp) && pManTime )
671 if ( Nwk_ManTimeEqual( tRequired, Nwk_ObjRequired(pTemp), (
float)0.01 ) )
673 Nwk_ObjSetRequired( pTemp, tRequired );
675 if ( Nwk_ObjIsCi(pTemp) )
690 for ( k = 0; k < nTerms; k++ )
692 pNext = Nwk_ManCo(pNext->pMan, iTerm1 + k);
727 Tim_Man_t * pManTime = pObj->pMan->pManTime;
729 int i, iBox, iTerm1, nTerms, Level = 0;
730 if ( Nwk_ObjIsCi(pObj) || Nwk_ObjIsLatch(pObj) )
739 for ( i = 0; i < nTerms; i++ )
741 pFanin = Nwk_ManCo(pObj->pMan, iTerm1 + i);
742 Level = Abc_MaxInt( Level, Nwk_ObjLevel(pFanin) );
749 assert( Nwk_ObjIsNode(pObj) || Nwk_ObjIsCo(pObj) );
751 Level = Abc_MaxInt( Level, Nwk_ObjLevel(pFanin) );
752 return Level + (Nwk_ObjIsNode(pObj) && Nwk_ObjFaninNum(pObj) > 0);
768 Tim_Man_t * pManTime = pObj->pMan->pManTime;
772 int LevelNew, iCur, k, iBox, iTerm1, nTerms;
773 assert( Nwk_ObjIsNode(pObj) );
775 Vec_PtrClear( vQueue );
776 Vec_PtrPush( vQueue, pObj );
783 if ( LevelNew == Nwk_ObjLevel(pTemp) )
785 Nwk_ObjSetLevel( pTemp, LevelNew );
787 if ( Nwk_ObjIsCo(pTemp) )
797 for ( k = 0; k < nTerms; k++ )
799 pNext = Nwk_ManCi(pNext->pMan, iTerm1 + k);
838 assert( pObj->MarkA == 0 );
840 if ( Nwk_ObjLevel(pObj) != LevelNew )
842 printf(
"Object %6d: Mismatch betweeh levels: Actual = %d. Correct = %d.\n",
843 i, Nwk_ObjLevel(pObj), LevelNew );
862 assert( pObj->pMan == pObjNew->pMan );
863 assert( pObj != pObjNew );
864 assert( Nwk_ObjFanoutNum(pObj) > 0 );
865 assert( Nwk_ObjIsNode(pObj) && !Nwk_ObjIsCo(pObjNew) );
872 pObjNew->Level = pObj->Level;
873 pObjNew->tArrival = pObj->tArrival;
874 pObjNew->tRequired = pObj->tRequired;
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct If_LibLut_t_ If_LibLut_t
struct Nwk_Man_t_ Nwk_Man_t
void Nwk_NodeUpdateArrival(Nwk_Obj_t *pObj)
ABC_NAMESPACE_IMPL_START void Nwk_ManCleanTiming(Nwk_Man_t *pNtk)
DECLARATIONS ///.
void Nwk_NodeUpdateAddToQueue(Vec_Ptr_t *vQueue, Nwk_Obj_t *pObj, int iCurrent, int fArrival)
void Nwk_NodeUpdateRequired(Nwk_Obj_t *pObj)
int Nwk_ObjLevelNew(Nwk_Obj_t *pObj)
int Nwk_ManVerifyLevel(Nwk_Man_t *pNtk)
int Nwk_ManWhereIsPin(Nwk_Obj_t *pFanout, Nwk_Obj_t *pFanin, int *pPinPerm)
void Nwk_ManDelayTracePrint(Nwk_Man_t *pNtk)
float Nwk_ManDelayTraceLut(Nwk_Man_t *pNtk)
void Nwk_ManUpdate(Nwk_Obj_t *pObj, Nwk_Obj_t *pObjNew, Vec_Vec_t *vLevels)
void Nwk_ManDelayTraceSortPins(Nwk_Obj_t *pNode, int *pPinPerm, float *pPinDelays)
void Nwk_ManUpdateLevel(Nwk_Obj_t *pObj)
int Nwk_ManVerifyTiming(Nwk_Man_t *pNtk)
float Nwk_NodePropagateRequired(Nwk_Obj_t *pObj, int fUseSorting)
float Nwk_NodeComputeRequired(Nwk_Obj_t *pObj, int fUseSorting)
float Nwk_NodeComputeArrival(Nwk_Obj_t *pObj, int fUseSorting)
#define Nwk_ManForEachPo(p, pObj, i)
#define Nwk_ManForEachNode(p, pObj, i)
ABC_DLL void Nwk_ObjTransferFanout(Nwk_Obj_t *pNodeFrom, Nwk_Obj_t *pNodeTo)
typedefABC_NAMESPACE_HEADER_START struct Nwk_Obj_t_ Nwk_Obj_t
INCLUDES ///.
ABC_DLL int Nwk_ManLevelMax(Nwk_Man_t *pNtk)
#define Nwk_ManForEachObj(p, pObj, i)
#define Nwk_ObjForEachFanout(pObj, pFanout, i)
ABC_DLL void Nwk_ManDeleteNode_rec(Nwk_Obj_t *pObj)
ABC_DLL Vec_Ptr_t * Nwk_ManDfsReverse(Nwk_Man_t *pNtk)
#define Nwk_ManForEachCo(p, pObj, i)
ABC_DLL Vec_Ptr_t * Nwk_ManDfs(Nwk_Man_t *pNtk)
#define Nwk_ObjForEachFanin(pObj, pFanin, i)
ABC_DLL int Nwk_ManGetFaninMax(Nwk_Man_t *pNtk)
ABC_DLL int Nwk_ObjFindFanin(Nwk_Obj_t *pObj, Nwk_Obj_t *pFanin)
float pLutDelays[IF_MAX_LUTSIZE+1][IF_MAX_LUTSIZE+1]
int Tim_ManBoxOutputNum(Tim_Man_t *p, int iBox)
void Tim_ManSetCoArrival(Tim_Man_t *p, int iCo, float Delay)
void Tim_ManSetPreviousTravIdBoxInputs(Tim_Man_t *p, int iBox)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
int Tim_ManBoxForCi(Tim_Man_t *p, int iCo)
int Tim_ManBoxForCo(Tim_Man_t *p, int iCi)
int Tim_ManBoxInputFirst(Tim_Man_t *p, int iBox)
void Tim_ManSetPreviousTravIdBoxOutputs(Tim_Man_t *p, int iBox)
int Tim_ManBoxInputNum(Tim_Man_t *p, int iBox)
int Tim_ManIsCoTravIdCurrent(Tim_Man_t *p, int iCo)
void Tim_ManSetCiRequired(Tim_Man_t *p, int iCi, float Delay)
void Tim_ManSetCurrentTravIdBoxInputs(Tim_Man_t *p, int iBox)
void Tim_ManInitPoRequiredAll(Tim_Man_t *p, float Delay)
void Tim_ManSetCurrentTravIdBoxOutputs(Tim_Man_t *p, int iBox)
#define TIM_ETERNITY
MACRO DEFINITIONS ///.
int Tim_ManIsCiTravIdCurrent(Tim_Man_t *p, int iCi)
float Tim_ManGetCiArrival(Tim_Man_t *p, int iCi)
int Tim_ManBoxOutputFirst(Tim_Man_t *p, int iBox)
float Tim_ManGetCoRequired(Tim_Man_t *p, int iCo)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.