104 float pPinDelays[32];
108 float tArrival, tRequired, tSlack, * pDelays;
111 assert( Abc_NtkIsLogic(pNtk) );
116 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
124 for ( i = 0; i < Abc_NtkObjNumMax(pNtk); i++ )
135 if ( pLutLib == NULL )
138 if ( tArrival < Abc_ObjArrival(pFanin) + 1.0 )
139 tArrival = Abc_ObjArrival(pFanin) + 1.0;
143 pDelays = pLutLib->
pLutDelays[Abc_ObjFaninNum(pNode)];
145 if ( tArrival < Abc_ObjArrival(pFanin) + pDelays[0] )
146 tArrival = Abc_ObjArrival(pFanin) + pDelays[0];
150 pDelays = pLutLib->
pLutDelays[Abc_ObjFaninNum(pNode)];
155 if ( tArrival < Abc_ObjArrival(Abc_ObjFanin(pNode,pPinPerm[k])) + pDelays[k] )
156 tArrival = Abc_ObjArrival(Abc_ObjFanin(pNode,pPinPerm[k])) + pDelays[k];
161 if ( tArrival < Abc_ObjArrival(pFanin) + pDelays[k] )
162 tArrival = Abc_ObjArrival(pFanin) + pDelays[k];
165 if ( Abc_ObjFaninNum(pNode) == 0 )
167 Abc_ObjSetArrival( pNode, tArrival );
169 Vec_PtrFree( vNodes );
174 if ( tArrival < Abc_ObjArrival(Abc_ObjFanin0(pNode)) )
175 tArrival = Abc_ObjArrival(Abc_ObjFanin0(pNode));
179 if ( Abc_ObjRequired(Abc_ObjFanin0(pNode)) > tArrival )
180 Abc_ObjSetRequired( Abc_ObjFanin0(pNode), tArrival );
186 if ( pLutLib == NULL )
188 tRequired = Abc_ObjRequired(pNode) - (float)1.0;
190 if ( Abc_ObjRequired(pFanin) > tRequired )
191 Abc_ObjSetRequired( pFanin, tRequired );
195 pDelays = pLutLib->
pLutDelays[Abc_ObjFaninNum(pNode)];
196 tRequired = Abc_ObjRequired(pNode) - pDelays[0];
198 if ( Abc_ObjRequired(pFanin) > tRequired )
199 Abc_ObjSetRequired( pFanin, tRequired );
203 pDelays = pLutLib->
pLutDelays[Abc_ObjFaninNum(pNode)];
209 tRequired = Abc_ObjRequired(pNode) - pDelays[k];
210 if ( Abc_ObjRequired(Abc_ObjFanin(pNode,pPinPerm[k])) > tRequired )
211 Abc_ObjSetRequired( Abc_ObjFanin(pNode,pPinPerm[k]), tRequired );
218 tRequired = Abc_ObjRequired(pNode) - pDelays[k];
219 if ( Abc_ObjRequired(pFanin) > tRequired )
220 Abc_ObjSetRequired( pFanin, tRequired );
225 tSlack = Abc_ObjRequired(pNode) - Abc_ObjArrival(pNode);
226 assert( tSlack + 0.001 > 0.0 );
227 Abc_ObjSetSlack( pNode, tSlack < 0.0 ? 0.0 : tSlack );
229 Vec_PtrFree( vNodes );
248 int i, Nodes, * pCounters;
249 float tArrival, tDelta, nSteps, Num;
254 printf(
"The max LUT size (%d) is less than the max fanin count (%d).\n",
260 pCounters =
ABC_ALLOC(
int, nSteps + 1 );
261 memset( pCounters, 0,
sizeof(
int)*(nSteps + 1) );
264 tDelta = tArrival / nSteps;
268 if ( Abc_ObjFaninNum(pNode) == 0 )
270 Num = Abc_ObjSlack(pNode) / tDelta;
271 assert( Num >=0 && Num <= nSteps );
272 pCounters[(int)Num]++;
275 printf(
"Max delay = %6.2f. Delay trace using %s model:\n", tArrival, fUseLutLib?
"LUT library" :
"unit-delay" );
277 for ( i = 0; i < nSteps; i++ )
279 Nodes += pCounters[i];
280 printf(
"%3d %s : %5d (%6.2f %%)\n", fUseLutLib? 5*(i+1) : i+1,
281 fUseLutLib?
"%":
"lev", Nodes, 100.0*Nodes/Abc_NtkNodeNum(pNtk) );
381 int nCofs, i, k, nSkip;
386 if ( i != k && Abc_ObjRegular(pObj->
pCopy) == Abc_ObjRegular(pObj2->
pCopy) )
393 vNodes = Vec_PtrAlloc( 100 );
394 Abc_NtkIncrementTravId( pAig );
399 Abc_NodeSetTravIdCurrent( Abc_ObjRegular(pAnd) );
406 Vec_PtrFree( vNodes );
411 nCofs = (1 << Vec_PtrSize(vTimes));
412 for ( i = 0; i < nCofs; i++ )
417 Abc_ObjRegular(pAnd)->
pCopy = Abc_ObjRegular(pAnd);
422 Abc_ObjRegular(pAnd)->
pCopy = Abc_ObjNotCond(
Abc_AigConst1(pAig), ((i & (1<<k)) == 0) );
428 ppCofs[i] = Abc_ObjNotCond( Abc_ObjRegular(pAnd)->pCopy, Abc_ObjIsComplement(pAnd) );
430 Vec_PtrFree( vNodes );
437 for ( nSkip = (1<<k), i = 0; i < nCofs; i += 2*nSkip )
445 pAnd = Abc_ObjRegular(pNode->
pCopy);
446 pObj = Abc_ObjRegular(ppCofs[0]);
517 float tDelta, tArrival;
518 int i, k, k2, Counter, CounterRes, nTimeCris;
519 unsigned * puTCEdges;
522 tDelta = fUseLutLib ? tArrival*Percentage/100.0 : 1.0;
525 printf(
"Max delay = %.2f. Delta = %.2f. ", tArrival, tDelta );
526 printf(
"Using %s model. ", fUseLutLib?
"LUT library" :
"unit-delay" );
528 printf(
"Percentage = %d. ", Percentage );
532 puTCEdges =
ABC_ALLOC(
unsigned, Abc_NtkObjNumMax(pNtk) );
533 memset( puTCEdges, 0,
sizeof(
unsigned) * Abc_NtkObjNumMax(pNtk) );
536 if ( Abc_ObjSlack(pNode) >= tDelta )
542 Counter = CounterRes = 0;
546 if ( !Abc_ObjIsCi(pFanin) && Abc_ObjSlack(pFanin) < tDelta )
548 CounterRes += Extra_WordCountOnes( puTCEdges[pNode->
Id] );
550 printf(
"Edges: Total = %7d. 0-slack = %7d. Critical = %7d. Ratio = %4.2f\n",
557 Counter = CounterRes = 0;
558 vTimeCries = Vec_PtrAlloc( 16 );
559 vTimeFanins = Vec_PtrAlloc( 16 );
562 if ( Abc_ObjSlack(pNode) >= tDelta )
567 if ( !Abc_ObjIsCi(pFanin) && (puTCEdges[pNode->
Id] & (1<<k)) )
569 if ( !fVeryVerbose && nTimeCris == 0 )
573 Vec_PtrClear( vTimeCries );
577 if ( !Abc_ObjIsCi(pFanin) && (puTCEdges[pNode->
Id] & (1<<k)) )
579 if ( puTCEdges[pFanin->
Id] & (1<<k2) )
580 Vec_PtrPushUnique( vTimeCries, pFanin2 );
583 if ( (Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree) )
587 Vec_PtrClear( vTimeFanins );
590 if ( Abc_ObjIsCi(pFanin) )
591 Vec_PtrPushUnique( vTimeFanins, pFanin );
594 Vec_PtrPushUnique( vTimeFanins, pFanin2 );
599 printf(
"%5d Node %5d : %d %2d %2d ", Counter, pNode->
Id,
600 nTimeCris, Vec_PtrSize(vTimeCries), Vec_PtrSize(vTimeFanins) );
602 printf(
"%d(%.2f)%s ", pFanin->
Id, Abc_ObjSlack(pFanin), (puTCEdges[pNode->
Id] & (1<<k))?
"*":
"" );
606 if ( Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree )
609 if ( Vec_PtrSize(vTimeCries) > 1 )
611 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
612 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
613 if ( Abc_ObjSlack(pFanin) < Abc_ObjSlack(pFanin2) )
615 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
616 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
619 if ( Vec_PtrSize(vTimeCries) > 2 )
621 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
622 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 2 );
623 if ( Abc_ObjSlack(pFanin) < Abc_ObjSlack(pFanin2) )
625 Vec_PtrWriteEntry( vTimeCries, 1, pFanin2 );
626 Vec_PtrWriteEntry( vTimeCries, 2, pFanin );
628 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
629 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
630 if ( Abc_ObjSlack(pFanin) < Abc_ObjSlack(pFanin2) )
632 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
633 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
639 Vec_PtrFree( vTimeCries );
640 Vec_PtrFree( vTimeFanins );
643 printf(
"Nodes: Total = %7d. 0-slack = %7d. Workable = %7d. Ratio = %4.2f\n",
644 Abc_NtkNodeNum(pNtk), Counter, CounterRes, 1.0*CounterRes/Counter );
719 float * pProb, TotalProb = 0.0, ProbThis, Probs[6] = {0.0};
720 int i, nNodes = 0, nEdges = 0, Counter[6] = {0};
721 pProb = (
float *)vProbs->pArray;
722 assert( Vec_IntSize(vProbs) >= Abc_NtkObjNumMax(pNtk) );
725 if ( !Abc_ObjIsNode(pObj) && !Abc_ObjIsPi(pObj) )
728 nEdges += Abc_ObjFanoutNum(pObj);
729 ProbThis = pProb[i] * Abc_ObjFanoutNum(pObj);
730 TotalProb += ProbThis;
731 assert( pProb[i] >= 0.0 && pProb[i] <= 1.0 );
732 if ( pProb[i] >= 0.5 )
735 Probs[5] += ProbThis;
737 else if ( pProb[i] >= 0.4 )
740 Probs[4] += ProbThis;
742 else if ( pProb[i] >= 0.3 )
745 Probs[3] += ProbThis;
747 else if ( pProb[i] >= 0.2 )
750 Probs[2] += ProbThis;
752 else if ( pProb[i] >= 0.1 )
755 Probs[1] += ProbThis;
760 Probs[0] += ProbThis;
763 printf(
"Node distribution: " );
764 for ( i = 0; i < 6; i++ )
765 printf(
"n%d%d = %6.2f%% ", i, i+1, 100.0 * Counter[i]/nNodes );
767 printf(
"Power distribution: " );
768 for ( i = 0; i < 6; i++ )
769 printf(
"p%d%d = %6.2f%% ", i, i+1, 100.0 * Probs[i]/TotalProb );
771 printf(
"Total probs = %7.2f. ", TotalProb );
772 printf(
"Total edges = %d. ", nEdges );
773 printf(
"Average = %7.2f. ", TotalProb / nEdges );
817 float * pProb, Limit;
818 int i, k, k2, Counter, CounterRes, nTimeCris;
819 unsigned * puPCEdges;
821 Limit = 0.5 - (1.0 * Percentage / 100);
824 pProb = (
float *)vProbs->pArray;
829 puPCEdges =
ABC_ALLOC(
unsigned, Abc_NtkObjNumMax(pNtk) );
830 memset( puPCEdges, 0,
sizeof(
unsigned) * Abc_NtkObjNumMax(pNtk) );
833 if ( pProb[pNode->
Id] < Limit )
854 Counter = CounterRes = 0;
855 vTimeCries = Vec_PtrAlloc( 16 );
856 vTimeFanins = Vec_PtrAlloc( 16 );
864 if ( !Abc_ObjIsCi(pFanin) && (puPCEdges[pNode->
Id] & (1<<k)) )
866 if ( !fVeryVerbose && nTimeCris == 0 )
870 Vec_PtrClear( vTimeCries );
874 if ( !Abc_ObjIsCi(pFanin) && (puPCEdges[pNode->
Id] & (1<<k)) )
876 if ( puPCEdges[pFanin->
Id] & (1<<k2) )
877 Vec_PtrPushUnique( vTimeCries, pFanin2 );
880 if ( (Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree) )
884 Vec_PtrClear( vTimeFanins );
887 if ( Abc_ObjIsCi(pFanin) )
888 Vec_PtrPushUnique( vTimeFanins, pFanin );
891 Vec_PtrPushUnique( vTimeFanins, pFanin2 );
896 printf(
"%5d Node %5d : %d %2d %2d ", Counter, pNode->
Id,
897 nTimeCris, Vec_PtrSize(vTimeCries), Vec_PtrSize(vTimeFanins) );
899 printf(
"%d(%.2f)%s ", pFanin->
Id, pProb[pFanin->
Id], (puPCEdges[pNode->
Id] & (1<<k))?
"*":
"" );
903 if ( Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree )
906 if ( Vec_PtrSize(vTimeCries) > 1 )
908 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
909 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
911 if ( pProb[pFanin->
Id] > pProb[pFanin2->
Id] )
913 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
914 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
917 if ( Vec_PtrSize(vTimeCries) > 2 )
919 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
920 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 2 );
922 if ( pProb[pFanin->
Id] > pProb[pFanin2->
Id] )
924 Vec_PtrWriteEntry( vTimeCries, 1, pFanin2 );
925 Vec_PtrWriteEntry( vTimeCries, 2, pFanin );
927 pFanin = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
928 pFanin2 = (
Abc_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
930 if ( pProb[pFanin->
Id] > pProb[pFanin2->
Id] )
932 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
933 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
939 Vec_PtrFree( vTimeCries );
940 Vec_PtrFree( vTimeFanins );
943 printf(
"Nodes: Total = %7d. Power-critical = %7d. Workable = %7d. Ratio = %4.2f\n",
944 Abc_NtkNodeNum(pNtk), Counter, CounterRes, 1.0*CounterRes/Counter );
955 Vec_IntFree( vProbs );
ABC_DLL void * Abc_FrameReadLibLut()