48 int iFanin, i, j, best_i, temp;
49 assert( Gia_ObjIsLut(
p, iObj) );
54 pPinDelays[i] = Gia_ObjTimeArrival(
p, iFanin);
58 for ( i = 0; i < Gia_ObjLutSize(
p, iObj)-1; i++ )
61 for ( j = i+1; j < Gia_ObjLutSize(
p, iObj); j++ )
62 if ( pPinDelays[pPinPerm[j]] > pPinDelays[pPinPerm[best_i]] )
67 pPinPerm[i] = pPinPerm[best_i];
68 pPinPerm[best_i] = temp;
71 assert( Gia_ObjLutSize(
p, iObj) == 0 || pPinPerm[0] < Gia_ObjLutSize(
p, iObj) );
72 for ( i = 1; i < Gia_ObjLutSize(
p, iObj); i++ )
74 assert( pPinPerm[i] < Gia_ObjLutSize(
p, iObj) );
75 assert( pPinDelays[pPinPerm[i-1]] >= pPinDelays[pPinPerm[i]] );
93 for ( i = 0; i < Gia_ObjLutSize(
p, iFanout); i++ )
94 if ( Gia_ObjLutFanin(
p, iFanout, pPinPerm[i]) == iFanin )
114 int k, iFanin, pPinPerm[32];
115 float pPinDelays[32];
116 float tArrival, * pDelays;
117 if ( Gia_ObjIsCi(pObj) )
118 return Gia_ObjTimeArrival(
p, iObj);
119 if ( Gia_ObjIsCo(pObj) )
120 return Gia_ObjTimeArrival(
p, Gia_ObjFaninId0p(
p, pObj) );
121 assert( Gia_ObjIsLut(
p, iObj) );
123 if ( pLutLib == NULL )
126 if ( tArrival < Gia_ObjTimeArrival(
p, iFanin) + 1.0 )
127 tArrival = Gia_ObjTimeArrival(
p, iFanin) + 1.0;
131 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
133 if ( tArrival < Gia_ObjTimeArrival(
p, iFanin) + pDelays[0] )
134 tArrival = Gia_ObjTimeArrival(
p, iFanin) + pDelays[0];
138 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
143 if ( tArrival < Gia_ObjTimeArrival(
p, Gia_ObjLutFanin(
p,iObj,pPinPerm[k])) + pDelays[k] )
144 tArrival = Gia_ObjTimeArrival(
p, Gia_ObjLutFanin(
p,iObj,pPinPerm[k])) + pDelays[k];
149 if ( tArrival < Gia_ObjTimeArrival(
p, iFanin) + pDelays[k] )
150 tArrival = Gia_ObjTimeArrival(
p, iFanin) + pDelays[k];
153 if ( Gia_ObjLutSize(
p, iObj) == 0 )
173 int k, iFanin, pPinPerm[32];
174 float pPinDelays[32];
175 float tRequired = 0.0;
177 assert( Gia_ObjIsLut(
p, iObj) );
178 if ( pLutLib == NULL )
180 tRequired = Gia_ObjTimeRequired(
p, iObj) - (float)1.0;
182 if ( Gia_ObjTimeRequired(
p, iFanin) > tRequired )
183 Gia_ObjSetTimeRequired(
p, iFanin, tRequired );
187 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
188 tRequired = Gia_ObjTimeRequired(
p, iObj) - pDelays[0];
190 if ( Gia_ObjTimeRequired(
p, iFanin) > tRequired )
191 Gia_ObjSetTimeRequired(
p, iFanin, tRequired );
195 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
201 tRequired = Gia_ObjTimeRequired(
p, iObj) - pDelays[k];
202 if ( Gia_ObjTimeRequired(
p, Gia_ObjLutFanin(
p, iObj,pPinPerm[k])) > tRequired )
203 Gia_ObjSetTimeRequired(
p, Gia_ObjLutFanin(
p, iObj,pPinPerm[k]), tRequired );
210 tRequired = Gia_ObjTimeRequired(
p, iObj) - pDelays[k];
211 if ( Gia_ObjTimeRequired(
p, iFanin) > tRequired )
212 Gia_ObjSetTimeRequired(
p, iFanin, tRequired );
236 float tArrival, tArrivalCur, tRequired, tSlack;
242 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
248 Gia_ManTimeStart(
p );
256 if ( !Gia_ObjIsCi(pObj) && !Gia_ObjIsCo(pObj) && !Gia_ObjIsLut(
p, i) )
259 if ( Gia_ObjIsCi(pObj) &&
p->pManTime )
264 if ( Gia_ObjIsCo(pObj) &&
p->pManTime )
266 Gia_ObjSetTimeArrival(
p, i, tArrival );
273 tArrivalCur = Gia_ObjTimeArrivalObj(
p, Gia_ObjFanin0(pObj) );
274 Gia_ObjSetTimeArrival(
p, Gia_ObjId(
p,pObj), tArrivalCur );
275 if ( tArrival < tArrivalCur )
276 tArrival = tArrivalCur;
288 Gia_ObjSetTimeRequiredObj(
p, pObj, tArrival );
295 pObj = Gia_ManObj(
p, iObj);
296 if ( Gia_ObjIsLut(
p, iObj) )
300 else if ( Gia_ObjIsCi(pObj) )
305 else if ( Gia_ObjIsCo(pObj) )
310 Gia_ObjSetTimeRequired(
p, iObj, tRequired );
312 if ( Gia_ObjTimeRequired(
p, Gia_ObjFaninId0p(
p, pObj)) > Gia_ObjTimeRequired(
p, iObj) )
313 Gia_ObjSetTimeRequired(
p, Gia_ObjFaninId0p(
p, pObj), Gia_ObjTimeRequired(
p, iObj) );
317 tSlack = Gia_ObjTimeRequired(
p, iObj) - Gia_ObjTimeArrival(
p, iObj);
318 assert( tSlack + 0.01 > 0.0 );
319 Gia_ObjSetTimeSlack(
p, iObj, tSlack < 0.0 ? 0.0 : tSlack );
321 Vec_IntFree( vObjs );
338float Gia_ObjComputeRequired(
Gia_Man_t *
p,
int iObj,
int fUseSorting )
342 float pPinDelays[32];
344 float tRequired, tDelay, * pDelays;
346 if ( Gia_ObjIsCo(iObj) )
347 return Gia_ObjTimeRequired(
p, iObj);
349 if ( pLutLib == NULL )
353 tDelay = Gia_ObjIsCo(pFanout)? 0.0 : 1.0;
354 if ( tRequired > Gia_ObjTimeRequired(
p, pFanout) - tDelay )
355 tRequired = Gia_ObjTimeRequired(
p, pFanout) - tDelay;
362 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, pFanout)];
363 tDelay = Gia_ObjIsCo(pFanout)? 0.0 : pDelays[0];
364 if ( tRequired > Gia_ObjTimeRequired(
p, pFanout) - tDelay )
365 tRequired = Gia_ObjTimeRequired(
p, pFanout) - tDelay;
374 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, pFanout)];
377 assert( Gia_ObjLutFanin(
p, pFanout, pPinPerm[iFanin]) == iObj );
378 tDelay = Gia_ObjIsCo(pFanout)? 0.0 : pDelays[iFanin];
379 if ( tRequired > Gia_ObjTimeRequired(
p, pFanout) - tDelay )
380 tRequired = Gia_ObjTimeRequired(
p, pFanout) - tDelay;
387 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, pFanout)];
388 iFanin = Gia_ObjFindFanin(
p, pFanout, iObj );
389 assert( Gia_ObjLutFanin(
p, pFanout, iFanin) == iObj );
390 tDelay = Gia_ObjIsCo(pFanout)? 0.0 : pDelays[iFanin];
391 if ( tRequired > Gia_ObjTimeRequired(
p, pFanout) - tDelay )
392 tRequired = Gia_ObjTimeRequired(
p, pFanout) - tDelay;
413 float tArrival, tRequired;
415 Gia_LutForEachObj(
p, iObj, i )
417 if ( Gia_ObjIsCi(iObj) && Gia_ObjFanoutNum(iObj) == 0 )
420 tRequired = Gia_ObjComputeRequired(
p, iObj, 1 );
421 if ( !Gia_LutTimeEqual( tArrival, Gia_ObjTimeArrival(
p, iObj), (
float)0.01 ) )
422 printf(
"Gia_LutVerifyTiming(): Object %d has different arrival time (%.2f) from computed (%.2f).\n",
423 iObj->Id, Gia_ObjTimeArrival(
p, iObj), tArrival );
424 if ( !Gia_LutTimeEqual( tRequired, Gia_ObjTimeRequired(
p, iObj), (
float)0.01 ) )
425 printf(
"Gia_LutVerifyTiming(): Object %d has different required time (%.2f) from computed (%.2f).\n",
426 iObj->Id, Gia_ObjTimeRequired(
p, iObj), tRequired );
447 int i, Nodes, * pCounters;
448 float tArrival, tDelta, nSteps, Num;
452 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
458 pCounters =
ABC_ALLOC(
int, nSteps + 1 );
459 memset( pCounters, 0,
sizeof(
int)*(nSteps + 1) );
462 tDelta = tArrival / nSteps;
466 if ( Gia_ObjLutSize(
p, i) == 0 )
468 Num = Gia_ObjTimeSlack(
p, i) / tDelta;
471 assert( Num >=0 && Num <= nSteps );
472 pCounters[(int)Num]++;
477 printf(
"Max delay = %6.2f. Delay trace using %s model:\n", tArrival, pLutLib?
"LUT library" :
"unit-delay" );
479 for ( i = 0; i < nSteps; i++ )
481 Nodes += pCounters[i];
482 printf(
"%3d %s : %5d (%6.2f %%)\n", pLutLib? 5*(i+1) : i+1,
487 Gia_ManTimeStop(
p );
506 float pPinDelays[32];
507 float tRequired, * pDelays;
508 unsigned uResult = 0;
510 tRequired = Gia_ObjTimeRequired(
p, iObj );
511 if ( pLutLib == NULL )
514 if ( tRequired < Gia_ObjTimeArrival(
p, iFanin) + 1.0 + tDelta )
519 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
521 if ( tRequired < Gia_ObjTimeArrival(
p, iFanin) + pDelays[0] + tDelta )
526 pDelays = pLutLib->
pLutDelays[Gia_ObjLutSize(
p, iObj)];
529 if ( tRequired < Gia_ObjTimeArrival(
p, Gia_ObjLutFanin(
p, iObj,pPinPerm[k])) + pDelays[k] + tDelta )
530 uResult |= (1 << pPinPerm[k]);
548 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
550 Gia_ObjSetTravIdCurrent(
p, pObj );
551 if ( Gia_ObjIsCi(pObj) )
553 assert( Gia_ObjIsAnd(pObj) );
558 Vec_IntPush( vNodes, Gia_ObjId(
p, pObj) );
577 int pCofs[32], nCofs, nSkip, i, k, iResult, iObj;
580 Gia_ObjSetTravIdCurrent(
p, Gia_ManConst0(
p) );
582 Gia_ObjSetTravIdCurrent(
p, pTemp );
584 vNodes = Vec_IntAlloc( 100 );
587 printf(
"Bad node!!!\n" );
588 Vec_IntFree( vNodes );
592 nCofs = (1 << Vec_IntSize(vTimes));
593 for ( i = 0; i < nCofs; i++ )
596 pTemp->
Value = Abc_Var2Lit( Gia_ObjId(
p, pTemp), 0 );
598 pTemp->
Value = ((i & (1<<k)) != 0);
601 pCofs[i] = pTemp->
Value;
603 Vec_IntFree( vNodes );
606 for ( nSkip = (1<<k), i = 0; i < nCofs; i += 2*nSkip )
607 pCofs[i] =
Gia_ManHashMux( pNew, Gia_ObjToLit(
p,pTemp), pCofs[i+nSkip], pCofs[i] );
609 iObj = Gia_ObjId(
p, pObj );
610 iResult = Abc_Lit2Var( pCofs[0] );
611 if ( iResult <= iObj )
613 Gia_ObjSetRepr( pNew, iResult, iObj );
614 Gia_ObjSetNext( pNew, iResult, Gia_ObjNext(pNew, iObj) );
615 Gia_ObjSetNext( pNew, iObj, iResult );
633 int iObj, iFanin, iFanin2, nNodesNew;
634 float tDelta, tArrival;
635 int i, k, k2, Counter, CounterRes, nTimeCris;
636 int fUseLutLib = (
p->pLutLib != NULL);
637 void * pTempTim = NULL;
638 unsigned * puTCEdges;
639 assert( Gia_ManHasMapping(
p) );
640 if ( !fUseLutLib &&
p->pManTime )
642 pTempTim =
p->pManTime;
647 tDelta = fUseLutLib ? tArrival*Percentage/100.0 : 1.0;
650 printf(
"Max delay = %.2f. Delta = %.2f. ", tArrival, tDelta );
651 printf(
"Using %s model. ", fUseLutLib ?
"LUT library" :
"unit-delay" );
653 printf(
"Percentage = %d. ", Percentage );
657 puTCEdges =
ABC_CALLOC(
unsigned, Gia_ManObjNum(
p) );
660 if ( Gia_ObjTimeSlack(
p, iObj) >= tDelta )
666 Counter = CounterRes = 0;
670 if ( !Gia_ObjIsCi(Gia_ManObj(
p, iFanin)) && Gia_ObjTimeSlack(
p, iFanin) < tDelta )
672 CounterRes += Gia_WordCountOnes( puTCEdges[iObj] );
674 printf(
"Edges: Total = %7d. 0-slack = %7d. Critical = %7d. Ratio = %4.2f\n",
681 nNodesNew = 1000 + 3 * Gia_ManObjNum(pNew);
684 for ( i = 0; i < nNodesNew; i++ )
685 Gia_ObjSetRepr( pNew, i,
GIA_VOID );
688 Counter = CounterRes = 0;
689 vTimeCries = Vec_IntAlloc( 16 );
690 vTimeFanins = Vec_IntAlloc( 16 );
693 if ( Gia_ObjTimeSlack(
p, iObj) >= tDelta )
698 if ( !Gia_ObjIsCi(Gia_ManObj(
p, iFanin)) && (puTCEdges[iObj] & (1<<k)) )
700 if ( !fVeryVerbose && nTimeCris == 0 )
704 Vec_IntClear( vTimeCries );
708 if ( !Gia_ObjIsCi(Gia_ManObj(
p, iFanin)) && (puTCEdges[iObj] & (1<<k)) )
710 if ( puTCEdges[iFanin] & (1<<k2) )
711 Vec_IntPushUnique( vTimeCries, iFanin2 );
714 if ( (Vec_IntSize(vTimeCries) == 0 || Vec_IntSize(vTimeCries) > Degree) )
718 Vec_IntClear( vTimeFanins );
721 if ( Gia_ObjIsCi(Gia_ManObj(
p, iFanin)) )
722 Vec_IntPushUnique( vTimeFanins, iFanin );
725 Vec_IntPushUnique( vTimeFanins, iFanin2 );
730 printf(
"%5d Node %5d : %d %2d %2d ", Counter, iObj,
731 nTimeCris, Vec_IntSize(vTimeCries), Vec_IntSize(vTimeFanins) );
733 printf(
"%d(%.2f)%s ", iFanin, Gia_ObjTimeSlack(
p, iFanin), (puTCEdges[iObj] & (1<<k))?
"*":
"" );
737 if ( Vec_IntSize(vTimeCries) == 0 || Vec_IntSize(vTimeCries) > Degree )
740 if ( Vec_IntSize(vTimeCries) > 1 )
742 iFanin = Vec_IntEntry( vTimeCries, 0 );
743 iFanin2 = Vec_IntEntry( vTimeCries, 1 );
744 if ( Gia_ObjTimeSlack(
p, iFanin) < Gia_ObjTimeSlack(
p, iFanin2) )
746 Vec_IntWriteEntry( vTimeCries, 0, iFanin2 );
747 Vec_IntWriteEntry( vTimeCries, 1, iFanin );
750 if ( Vec_IntSize(vTimeCries) > 2 )
752 iFanin = Vec_IntEntry( vTimeCries, 1 );
753 iFanin2 = Vec_IntEntry( vTimeCries, 2 );
754 if ( Gia_ObjTimeSlack(
p, iFanin) < Gia_ObjTimeSlack(
p, iFanin2) )
756 Vec_IntWriteEntry( vTimeCries, 1, iFanin2 );
757 Vec_IntWriteEntry( vTimeCries, 2, iFanin );
759 iFanin = Vec_IntEntry( vTimeCries, 0 );
760 iFanin2 = Vec_IntEntry( vTimeCries, 1 );
761 if ( Gia_ObjTimeSlack(
p, iFanin) < Gia_ObjTimeSlack(
p, iFanin2) )
763 Vec_IntWriteEntry( vTimeCries, 0, iFanin2 );
764 Vec_IntWriteEntry( vTimeCries, 1, iFanin );
770 if ( Gia_ManObjNum(pNew) > nNodesNew - 100 )
772 printf(
"Speedup stopped adding choices because there was too many to add.\n" );
776 Gia_ManTimeStop(
p );
777 Vec_IntFree( vTimeCries );
778 Vec_IntFree( vTimeFanins );
781 printf(
"Nodes: Total = %7d. 0-slack = %7d. Workable = %7d. Ratio = %4.2f\n",
782 Gia_ManLutNum(
p), Counter, CounterRes, Counter? 1.0*CounterRes/Counter : 0.0 );
786 p->pManTime = pTempTim;
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ObjForEachFanout(p, pObj, pFanout, iFan, i)
unsigned Gia_LutDelayTraceTCEdges(Gia_Man_t *p, int iObj, float tDelta)
float Gia_ManDelayTraceLutPrint(Gia_Man_t *p, int fVerbose)
float Gia_ManDelayTraceLut(Gia_Man_t *p)
void Gia_ManSpeedupObj(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vLeaves, Vec_Int_t *vTimes)
int Gia_ManSpeedupObj_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vNodes)
Gia_Man_t * Gia_ManSpeedup(Gia_Man_t *p, int Percentage, int Degree, int fVerbose, int fVeryVerbose)
int Gia_LutWhereIsPin(Gia_Man_t *p, int iFanout, int iFanin, int *pPinPerm)
ABC_NAMESPACE_IMPL_START void Gia_LutDelayTraceSortPins(Gia_Man_t *p, int iObj, int *pPinPerm, float *pPinDelays)
DECLARATIONS ///.
float Gia_ObjComputeArrival(Gia_Man_t *p, int iObj, int fUseSorting)
float Gia_ObjPropagateRequired(Gia_Man_t *p, int iObj, int fUseSorting)
struct Gia_Rpr_t_ Gia_Rpr_t
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
int Gia_ManLutFaninCount(Gia_Man_t *p)
void Gia_ManHashStart(Gia_Man_t *p)
int Gia_ManLutLevel(Gia_Man_t *p, int **ppLevels)
#define Gia_ManForEachLut(p, i)
struct Gia_Obj_t_ Gia_Obj_t
#define Gia_LutForEachFanin(p, i, iFan, k)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Vec_Int_t * Gia_ManOrderReverse(Gia_Man_t *p)
int Gia_ManLutSizeMax(Gia_Man_t *p)
Gia_Man_t * Gia_ManEquivToChoices(Gia_Man_t *p, int nSnapshots)
int Gia_ManLutNum(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
int Gia_ManLevelNum(Gia_Man_t *p)
struct If_LibLut_t_ If_LibLut_t
float pLutDelays[IF_MAX_LUTSIZE+1][IF_MAX_LUTSIZE+1]
void Tim_ManSetCoArrival(Tim_Man_t *p, int iCo, float Delay)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
void Tim_ManStop(Tim_Man_t *p)
void Tim_ManSetCiRequired(Tim_Man_t *p, int iCi, float Delay)
void Tim_ManInitPoRequiredAll(Tim_Man_t *p, float Delay)
#define TIM_ETERNITY
MACRO DEFINITIONS ///.
Tim_Man_t * Tim_ManDup(Tim_Man_t *p, int fUnitDelay)
float Tim_ManGetCiArrival(Tim_Man_t *p, int iCi)
float Tim_ManGetCoRequired(Tim_Man_t *p, int iCo)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.