48#define TOLERANCE 0.001
50static inline int Abc_FloatEqual(
float x,
float y ) {
return fabs(x-y) <
TOLERANCE; }
54static void Abc_ManTimeExpand(
Abc_ManTime_t *
p,
int nSize,
int fProgressive );
88 return Abc_NodeArrival(pNode);
93 return Abc_NodeRequired(pNode);
105 return 0.5 * Abc_NodeArrival(pNode)->Rise + 0.5 * Abc_NodeArrival(pNode)->Fall;
113 return Abc_MaxFloat( Abc_NodeArrival(pNode)->Rise, Abc_NodeArrival(pNode)->Fall );
177 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
188 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
214 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
215 Abc_ManTimeExpand( pNtk->
pManTime, ObjId + 1, 1 );
229 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
230 Abc_ManTimeExpand( pNtk->
pManTime, ObjId + 1, 1 );
254 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
260 for ( i = 0; i < Abc_NtkCiNum(pNtk); i++ )
270 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
276 for ( i = 0; i < Abc_NtkCoNum(pNtk); i++ )
296 assert( PiNum >= 0 && PiNum < Abc_NtkCiNum(pNtk) );
298 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
305 for ( i = 0; i < Abc_NtkCiNum(pNtk); i++ )
315 assert( PoNum >= 0 && PoNum < Abc_NtkCoNum(pNtk) );
317 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
324 for ( i = 0; i < Abc_NtkCoNum(pNtk); i++ )
349 assert( pNtkOld == NULL || Abc_NtkCiNum(pNtk) == Abc_NtkCiNum(pNtkOld) );
350 assert( pNtkOld == NULL || Abc_NtkCoNum(pNtk) == Abc_NtkCoNum(pNtkOld) );
354 Abc_ManTimeExpand( pNtk->
pManTime, Abc_NtkObjNumMax(pNtk), 0 );
399 pTime = ppTimes[pObj->
Id];
400 pTime->
Fall *= Scale;
401 pTime->
Rise *= Scale;
407 pTime = ppTimes[pObj->
Id];
408 pTime->
Fall *= Scale;
409 pTime->
Rise *= Scale;
432 pNtk->
pManTime = Abc_ManTimeStart(pNtk);
437 Abc_ManTimeExpand( pNtk->
pManTime, Abc_NtkObjNumMax(pNtk), 0 );
442 pTime = ppTimes[pObj->
Id];
447 pTime = ppTimes[pObj->
Id];
454 pTime = ppTimes[pObj->
Id];
459 pTime = ppTimes[pObj->
Id];
480 int fUseZeroDefaultOutputRequired = 1;
486 p->vArrs = Vec_PtrAlloc( 0 );
487 p->vReqs = Vec_PtrAlloc( 0 );
492 Abc_ManTimeExpand(
p, Abc_NtkObjNumMax(pNtk) + 1, 0 );
499 pTime = (
Abc_Time_t *)vTimes->pArray[Abc_ObjId(pObj)];
506 p->tArrDef.Fall = pTime -> Fall;
507 p->tArrDef.Rise = pTime -> Rise;
521 pTime = (
Abc_Time_t *)vTimes->pArray[Abc_ObjId(pObj)];
523 p->tReqDef.Fall = pTime -> Fall;
524 p->tReqDef.Rise = pTime -> Rise;
528 p->tReqDef.Rise = fUseZeroDefaultOutputRequired ? 0 :
ABC_INFINITY;
529 p->tReqDef.Fall = fUseZeroDefaultOutputRequired ? 0 :
ABC_INFINITY;
553 if ( Vec_PtrSize(
p->vArrs) > 0 )
555 Vec_PtrFree(
p->vArrs );
556 if ( Vec_PtrSize(
p->vReqs) > 0 )
558 Vec_PtrFree(
p->vReqs );
582 assert( Abc_NtkCiNum(pNtkOld) == Abc_NtkCiNum(pNtkNew) );
583 assert( Abc_NtkCoNum(pNtkOld) == Abc_NtkCoNum(pNtkNew) );
584 assert( Abc_NtkLatchNum(pNtkOld) == Abc_NtkLatchNum(pNtkNew) );
586 pNtkNew->
pManTime = Abc_ManTimeStart(pNtkNew);
587 Abc_ManTimeExpand( pNtkNew->
pManTime, Abc_NtkObjNumMax(pNtkNew), 0 );
595 *ppTimesNew[ Abc_NtkCi(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->
Id ];
600 *ppTimesNew[ Abc_NtkCo(pNtkNew,i)->Id ] = *ppTimesOld[ pObj->
Id ];
632 printf(
"There is no timing manager\n" );
638 printf(
"Inputs (%d):\n", Abc_NtkCiNum(pNtk) );
640 printf(
"%20s arrival = %8f required = %8f\n",
644 printf(
"Outputs (%d):\n", Abc_NtkCoNum(pNtk) );
646 printf(
"%20s arrival = %8f required = %8f\n",
664void Abc_ManTimeExpand(
Abc_ManTime_t *
p,
int nSize,
int fProgressive )
668 int nSizeOld, nSizeNew, i;
670 nSizeOld =
p->vArrs->nSize;
671 if ( nSizeOld >= nSize )
673 nSizeNew = fProgressive? 2 * nSize : nSize;
674 if ( nSizeNew < 100 )
678 Vec_PtrGrow( vTimes, nSizeNew );
679 vTimes->nSize = nSizeNew;
680 ppTimesOld = ( nSizeOld == 0 )? NULL : (
Abc_Time_t *)vTimes->pArray[0];
682 for ( i = 0; i < nSizeNew; i++ )
683 vTimes->pArray[i] = ppTimes + i;
684 for ( i = nSizeOld; i < nSizeNew; i++ )
692 Vec_PtrGrow( vTimes, nSizeNew );
693 vTimes->nSize = nSizeNew;
694 ppTimesOld = ( nSizeOld == 0 )? NULL : (
Abc_Time_t *)vTimes->pArray[0];
696 for ( i = 0; i < nSizeNew; i++ )
697 vTimes->pArray[i] = ppTimes + i;
698 for ( i = nSizeOld; i < nSizeNew; i++ )
734 pNodeNew = pNodeOld->
pCopy;
760 p[i] = *Abc_NodeArrival(pNode);
773 p[i] = *Abc_NodeRequired(pNode);
834 Vec_IntFill( vSlacks, Abc_NtkObjNumMax(pNtk), -1 );
837 Vec_IntWriteEntry( vSlacks, i, Vec_IntSize(vSlacks) );
838 for ( k = 0; k < Abc_ObjFaninNum(pObj); k++ )
839 Vec_IntPush( vSlacks, -1 );
856static inline float Abc_NtkDelayTraceSlack(
Vec_Int_t * vSlacks,
Abc_Obj_t * pObj,
int iFanin )
858 return Abc_Int2Float( Vec_IntEntry( vSlacks, Vec_IntEntry(vSlacks, Abc_ObjId(pObj)) + iFanin ) );
860static inline void Abc_NtkDelayTraceSetSlack(
Vec_Int_t * vSlacks,
Abc_Obj_t * pObj,
int iFanin,
float Num )
862 Vec_IntWriteEntry( vSlacks, Vec_IntEntry(vSlacks, Abc_ObjId(pObj)) + iFanin, Abc_Float2Int(Num) );
881 if ( Abc_ObjIsCi(pNode) )
882 return (pLeaf == NULL || pLeaf == pNode);
883 assert( Abc_ObjIsNode(pNode) );
885 if ( Abc_NodeIsTravIdCurrent( pNode ) )
886 return Vec_IntEntry(vBest, Abc_ObjId(pNode)) >= 0;
887 Abc_NodeSetTravIdCurrent( pNode );
889 assert( Abc_ObjIsNode(pNode) );
894 if ( pFaninBest == NULL || SlackMin > Abc_NtkDelayTraceSlack(vSlacks, pNode, i) )
897 SlackMin = Abc_NtkDelayTraceSlack(vSlacks, pNode, i);
900 if ( pFaninBest != NULL )
901 Vec_IntWriteEntry( vBest, Abc_ObjId(pNode),
Abc_NodeFindFanin(pNode, pFaninBest) );
902 return (pFaninBest != NULL);
918 assert( Abc_ObjIsCi(pNode) || Abc_ObjIsNode(pNode) );
919 if ( Abc_ObjIsNode(pNode) )
921 int iFanin = Vec_IntEntry( vBest, Abc_ObjId(pNode) );
925 Vec_PtrPush( vPath, pNode );
943 float tDelayBlockRise, tDelayBlockFall;
949 pTimeOut = Abc_NodeArrival(pNode);
952 if ( Abc_ObjIsBarBuf(pNode) )
954 pTimeIn = Abc_NodeArrival(Abc_ObjFanin0(pNode));
955 *pTimeOut = *pTimeIn;
962 pTimeIn = Abc_NodeArrival(pFanin);
970 if ( pTimeOut->
Rise < pTimeIn->
Rise + tDelayBlockRise )
971 pTimeOut->
Rise = pTimeIn->
Rise + tDelayBlockRise;
972 if ( pTimeOut->
Fall < pTimeIn->
Fall + tDelayBlockFall )
973 pTimeOut->
Fall = pTimeIn->
Fall + tDelayBlockFall;
977 if ( pTimeOut->
Rise < pTimeIn->
Fall + tDelayBlockRise )
978 pTimeOut->
Rise = pTimeIn->
Fall + tDelayBlockRise;
979 if ( pTimeOut->
Fall < pTimeIn->
Rise + tDelayBlockFall )
980 pTimeOut->
Fall = pTimeIn->
Rise + tDelayBlockFall;
993 pTimeIn = Abc_NodeArrival(pFanin);
1002 Slack = Abc_MinFloat( Slack, Abc_AbsFloat(pTimeIn->
Rise + tDelayBlockRise - pTimeOut->
Rise) );
1003 Slack = Abc_MinFloat( Slack, Abc_AbsFloat(pTimeIn->
Fall + tDelayBlockFall - pTimeOut->
Fall) );
1007 Slack = Abc_MinFloat( Slack, Abc_AbsFloat(pTimeIn->
Fall + tDelayBlockRise - pTimeOut->
Rise) );
1008 Slack = Abc_MinFloat( Slack, Abc_AbsFloat(pTimeIn->
Rise + tDelayBlockFall - pTimeOut->
Fall) );
1011 Abc_NtkDelayTraceSetSlack( vSlacks, pNode, i, Slack );
1040 assert( Abc_NtkIsMappedLogic(pNtk) );
1041 assert( pOut == NULL || Abc_ObjIsCo(pOut) );
1042 assert( pIn == NULL || Abc_ObjIsCi(pIn) );
1045 if ( pOut || pIn || fPrint )
1053 Vec_PtrFree( vNodes );
1059 pDriver = Abc_ObjFanin0(pNode);
1060 pTime = Abc_NodeArrival(pDriver);
1061 if ( tArrivalMax < Abc_MaxFloat(pTime->
Fall, pTime->
Rise) )
1062 tArrivalMax = Abc_MaxFloat(pTime->
Fall, pTime->
Rise);
1066 if ( fPrint && pOut == NULL )
1070 pDriver = Abc_ObjFanin0(pNode);
1071 pTime = Abc_NodeArrival(pDriver);
1072 if ( tArrivalMax == Abc_MaxFloat(pTime->
Fall, pTime->
Rise) )
1080 Vec_Ptr_t * vPath = Vec_PtrAlloc( 100 );
1081 Vec_Int_t * vBest = Vec_IntStartFull( Abc_NtkObjNumMax(pNtk) );
1083 Abc_NtkIncrementTravId( pNtk );
1087 printf(
"The logic cone of PO \"%s\" has no primary inputs.\n",
Abc_ObjName(pOut) );
1089 printf(
"There is no combinational path between PI \"%s\" and PO \"%s\".\n",
Abc_ObjName(pIn),
Abc_ObjName(pOut) );
1093 float Slack = 0.0, SlackAdd;
1094 int k, iFanin, Length = 0;
1101 pIn = (
Abc_Obj_t *)Vec_PtrEntry( vPath, 0 );
1104 if ( Abc_ObjIsNode(pNode) )
1111 printf(
"Level %3d : ", Abc_ObjLevel(pNode) );
1112 if ( Abc_ObjIsCi(pNode) )
1114 printf(
"Primary input \"%s\". ",
Abc_ObjName(pNode) );
1119 if ( Abc_ObjIsCo(pNode) )
1121 printf(
"Primary output \"%s\". ",
Abc_ObjName(pNode) );
1126 assert( Abc_ObjIsNode(pNode) );
1128 Slack = Abc_NtkDelayTraceSlack(vSlacks, pNode, iFanin);
1136 printf(
"I/O times: (" );
1144 printf(
"Level %3d : ", Abc_ObjLevel(Abc_ObjFanin0(pOut)) + 1 );
1145 printf(
"Primary output \"%s\". ",
Abc_ObjName(pOut) );
1147 printf(
"Path slack = %6.1f.\n", SlackAdd );
1149 Vec_PtrFree( vPath );
1150 Vec_IntFree( vBest );
1153 Vec_IntFreeP( &vSlacks );
1175 Level = Abc_MaxFloat( Level, Abc_ObjLevel(pFanin) );
1176 return Level + (int)(Abc_ObjFaninNum(pObj) > 0);
1193 int i, LevelCur, Level = 0;
1197 Level = Abc_MaxFloat( Level, LevelCur );
1237 Vec_IntFillExtra( pNtk->
vLevelsR, pObj->
Id + 1, 0 );
1238 return Vec_IntEntry(pNtk->
vLevelsR, pObj->
Id);
1257 Vec_IntFillExtra( pNtk->
vLevelsR, pObj->
Id + 1, 0 );
1258 Vec_IntWriteEntry( pNtk->
vLevelsR, pObj->
Id, LevelR );
1282 pNtk->
vLevelsR = Vec_IntAlloc( 0 );
1283 Vec_IntFill( pNtk->
vLevelsR, 1 + Abc_NtkObjNumMax(pNtk), 0 );
1288 Vec_PtrFree( vNodes );
1325 int LevelOld, Lev, k, m;
1328 LevelOld = Abc_ObjLevel(pObjNew);
1334 Vec_VecClear( vLevels );
1335 Vec_VecPush( vLevels, LevelOld, pObjNew );
1342 assert( Abc_ObjLevel(pTemp) == Lev );
1345 if ( Abc_ObjLevel(pTemp) == Lev )
1350 if ( !Abc_ObjIsCo(pFanout) && !pFanout->
fMarkA )
1352 assert( Abc_ObjLevel(pFanout) >= Lev );
1353 Vec_VecPush( vLevels, Abc_ObjLevel(pFanout), pFanout );
1377 int LevelOld, LevFanin, Lev, k, m;
1385 Vec_VecClear( vLevels );
1386 Vec_VecPush( vLevels, LevelOld, pObjNew );
1393 assert( LevelOld == Lev );
1401 if ( !Abc_ObjIsCi(pFanin) && !pFanin->
fMarkA )
1404 assert( LevFanin >= Lev );
1405 Vec_VecPush( vLevels, LevFanin, pFanin );
void Abc_NtkTimeSetDefaultRequired(Abc_Ntk_t *pNtk, float Rise, float Fall)
float Abc_NodeReadArrivalWorst(Abc_Obj_t *pNode)
Abc_Time_t * Abc_NtkReadDefaultRequired(Abc_Ntk_t *pNtk)
void Abc_NtkTimePrint(Abc_Ntk_t *pNtk)
void Abc_ManTimeStop(Abc_ManTime_t *p)
Abc_Time_t * Abc_NtkReadDefaultInputDrive(Abc_Ntk_t *pNtk)
void Abc_NtkTimeSetDefaultArrival(Abc_Ntk_t *pNtk, float Rise, float Fall)
void Abc_NtkDelayTraceCritPathCollect_rec(Vec_Int_t *vSlacks, Abc_Obj_t *pNode, Vec_Int_t *vBest, Vec_Ptr_t *vPath)
void Abc_NtkTimeSetRequired(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
void Abc_NtkUpdate(Abc_Obj_t *pObj, Abc_Obj_t *pObjNew, Vec_Vec_t *vLevels)
int Abc_ObjRequiredLevel(Abc_Obj_t *pObj)
void Abc_ObjSetReverseLevel(Abc_Obj_t *pObj, int LevelR)
void Abc_NtkTimeSetDefaultInputDrive(Abc_Ntk_t *pNtk, float Rise, float Fall)
Vec_Int_t * Abc_NtkDelayTraceSlackStart(Abc_Ntk_t *pNtk)
int Abc_ObjLevelNew(Abc_Obj_t *pObj)
float Abc_NodeReadOutputLoadWorst(Abc_Ntk_t *pNtk, int iPo)
void Abc_NtkSetNodeLevelsArrival(Abc_Ntk_t *pNtkOld)
float * Abc_NtkGetCoRequiredFloats(Abc_Ntk_t *pNtk)
void Abc_NtkUpdateLevel(Abc_Obj_t *pObjNew, Vec_Vec_t *vLevels)
int Abc_NtkDelayTraceCritPath_rec(Vec_Int_t *vSlacks, Abc_Obj_t *pNode, Abc_Obj_t *pLeaf, Vec_Int_t *vBest)
float Abc_NodeReadArrivalAve(Abc_Obj_t *pNode)
void Abc_ManTimeDup(Abc_Ntk_t *pNtkOld, Abc_Ntk_t *pNtkNew)
float * Abc_NtkGetCiArrivalFloats(Abc_Ntk_t *pNtk)
void Abc_NtkTimeSetInputDrive(Abc_Ntk_t *pNtk, int PiNum, float Rise, float Fall)
int Abc_ObjReverseLevel(Abc_Obj_t *pObj)
float Abc_NtkReadDefaultRequiredWorst(Abc_Ntk_t *pNtk)
Abc_Time_t * Abc_NodeReadArrival(Abc_Obj_t *pNode)
void Abc_NtkTimeSetOutputLoad(Abc_Ntk_t *pNtk, int PoNum, float Rise, float Fall)
void Abc_NtkTimePrepare(Abc_Ntk_t *pNtk)
float Abc_NodeReadInputDriveWorst(Abc_Ntk_t *pNtk, int iPi)
void Abc_NtkUpdateReverseLevel(Abc_Obj_t *pObjNew, Vec_Vec_t *vLevels)
int Abc_ObjReverseLevelNew(Abc_Obj_t *pObj)
Abc_Time_t * Abc_NodeReadRequired(Abc_Obj_t *pNode)
Abc_Time_t * Abc_NodeReadInputDrive(Abc_Ntk_t *pNtk, int iPi)
Abc_Time_t * Abc_NodeReadOutputLoad(Abc_Ntk_t *pNtk, int iPo)
Abc_Time_t * Abc_NtkReadDefaultArrival(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
float Abc_NtkDelayTrace(Abc_Ntk_t *pNtk, Abc_Obj_t *pOut, Abc_Obj_t *pIn, int fPrint)
float Abc_NtkReadDefaultArrivalWorst(Abc_Ntk_t *pNtk)
void Abc_NtkTimeInitialize(Abc_Ntk_t *pNtk, Abc_Ntk_t *pNtkOld)
void Abc_NodeDelayTraceArrival(Abc_Obj_t *pNode, Vec_Int_t *vSlacks)
Abc_Time_t * Abc_NtkGetCoRequiredTimes(Abc_Ntk_t *pNtk)
void Abc_NtkTimeScale(Abc_Ntk_t *pNtk, float Scale)
void Abc_NtkStopReverseLevels(Abc_Ntk_t *pNtk)
float Abc_NodeReadRequiredWorst(Abc_Obj_t *pNode)
void Abc_NtkTimeSetArrival(Abc_Ntk_t *pNtk, int ObjId, float Rise, float Fall)
Abc_Time_t * Abc_NtkGetCiArrivalTimes(Abc_Ntk_t *pNtk)
float Abc_NodeReadRequiredAve(Abc_Obj_t *pNode)
Abc_Time_t * Abc_NtkReadDefaultOutputLoad(Abc_Ntk_t *pNtk)
void Abc_NtkStartReverseLevels(Abc_Ntk_t *pNtk, int nMaxLevelIncrease)
void Abc_NtkTimeSetDefaultOutputLoad(Abc_Ntk_t *pNtk, float Rise, float Fall)
struct Abc_Obj_t_ Abc_Obj_t
struct Abc_ManTime_t_ Abc_ManTime_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL Vec_Ptr_t * Abc_NtkDfs(Abc_Ntk_t *pNtk, int fCollectAll)
#define Abc_ObjForEachFanin(pObj, pFanin, i)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_ObjReplace(Abc_Obj_t *pObjOld, Abc_Obj_t *pObjNew)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
struct Abc_Time_t_ Abc_Time_t
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL Vec_Ptr_t * Abc_NtkDfsReverse(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NtkGetTotalFanins(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NodeFindFanin(Abc_Obj_t *pNode, Abc_Obj_t *pFanin)
#define Abc_NtkForEachNode(pNtk, pNode, i)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void * Abc_FrameReadLibGen()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Mio_Pin_t * Mio_GateReadPins(Mio_Gate_t *pGate)
double Mio_PinReadDelayBlockFall(Mio_Pin_t *pPin)
Mio_PinPhase_t
INCLUDES ///.
float Mio_LibraryReadDelayNand2Max(Mio_Library_t *pLib)
struct Mio_LibraryStruct_t_ Mio_Library_t
Mio_PinPhase_t Mio_PinReadPhase(Mio_Pin_t *pPin)
char * Mio_GateReadPinName(Mio_Gate_t *pGate, int iPin)
char * Mio_GateReadName(Mio_Gate_t *pGate)
Mio_Gate_t * Mio_LibraryReadNand2(Mio_Library_t *pLib)
Mio_Pin_t * Mio_PinReadNext(Mio_Pin_t *pPin)
struct Mio_PinStruct_t_ Mio_Pin_t
double Mio_PinReadDelayBlockRise(Mio_Pin_t *pPin)
struct Mio_GateStruct_t_ Mio_Gate_t
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachEntryStart(Type, vGlob, pEntry, i, k, LevelStart)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.