32 return (Vec_IntEntry(vEdge1, iObj) > 0) + (Vec_IntEntry(vEdge2, iObj) > 0);
34static inline int Gia_ObjEdgeAdd(
int iObj,
int iNext,
Vec_Int_t * vEdge1,
Vec_Int_t * vEdge2 )
37 if ( Vec_IntEntry(vEdge1, iObj) == 0 )
38 Vec_IntWriteEntry(vEdge1, iObj, iNext);
39 else if ( Vec_IntEntry(vEdge2, iObj) == 0 )
40 Vec_IntWriteEntry(vEdge2, iObj, iNext);
44static inline void Gia_ObjEdgeRemove(
int iObj,
int iNext,
Vec_Int_t * vEdge1,
Vec_Int_t * vEdge2 )
46 assert( Vec_IntEntry(vEdge1, iObj) == iNext || Vec_IntEntry(vEdge2, iObj) == iNext );
47 if ( Vec_IntEntry(vEdge1, iObj) == iNext )
48 Vec_IntWriteEntry( vEdge1, iObj, Vec_IntEntry(vEdge2, iObj) );
49 Vec_IntWriteEntry( vEdge2, iObj, 0 );
53 Vec_IntWriteEntry( vEdge1, iObj, 0 );
54 Vec_IntWriteEntry( vEdge2, iObj, 0 );
74 int i, iObj1, iObj2, Count = 0;
75 Vec_IntFreeP( &
p->vEdge1 );
76 Vec_IntFreeP( &
p->vEdge2 );
77 p->vEdge1 = Vec_IntStart( Gia_ManObjNum(
p) );
78 p->vEdge2 = Vec_IntStart( Gia_ManObjNum(
p) );
82 Count += Gia_ObjEdgeAdd( iObj1, iObj2,
p->vEdge1,
p->vEdge2 );
83 Count += Gia_ObjEdgeAdd( iObj2, iObj1,
p->vEdge1,
p->vEdge2 );
86 printf(
"Found %d violations during edge conversion.\n", Count );
91 Vec_Int_t * vArray = Vec_IntAlloc( 1000 );
93 assert( Vec_IntSize(
p->vEdge1) == Gia_ManObjNum(
p) );
94 assert( Vec_IntSize(
p->vEdge2) == Gia_ManObjNum(
p) );
95 for ( iObj = 0; iObj < Gia_ManObjNum(
p); iObj++ )
97 iFanin = Vec_IntEntry(
p->vEdge1, iObj );
98 if ( iFanin && iFanin < iObj )
99 Vec_IntPushTwo( vArray, iFanin, iObj );
100 iFanin = Vec_IntEntry(
p->vEdge2, iObj );
101 if ( iFanin && iFanin < iObj )
102 Vec_IntPushTwo( vArray, iFanin, iObj );
120 int i, k, Entry, nEntries, nEntries2, nNodes[4], Count = 0;
121 if (
p->vPacking == NULL )
123 Vec_IntFreeP( &
p->vEdge1 );
124 Vec_IntFreeP( &
p->vEdge2 );
125 p->vEdge1 = Vec_IntStart( Gia_ManObjNum(
p) );
126 p->vEdge2 = Vec_IntStart( Gia_ManObjNum(
p) );
128 nEntries = Vec_IntEntry(
p->vPacking, 0 );
132 assert( Entry > 0 && Entry < 4 );
134 for ( k = 0; k < Entry; k++, i++ )
135 nNodes[k] = Vec_IntEntry(
p->vPacking, i);
141 Count += Gia_ObjEdgeAdd( nNodes[0], nNodes[1],
p->vEdge1,
p->vEdge2 );
142 Count += Gia_ObjEdgeAdd( nNodes[1], nNodes[0],
p->vEdge1,
p->vEdge2 );
144 else if ( Entry == 3 )
146 Count += Gia_ObjEdgeAdd( nNodes[0], nNodes[2],
p->vEdge1,
p->vEdge2 );
147 Count += Gia_ObjEdgeAdd( nNodes[2], nNodes[0],
p->vEdge1,
p->vEdge2 );
148 Count += Gia_ObjEdgeAdd( nNodes[1], nNodes[2],
p->vEdge1,
p->vEdge2 );
149 Count += Gia_ObjEdgeAdd( nNodes[2], nNodes[1],
p->vEdge1,
p->vEdge2 );
152 assert( nEntries == nEntries2 );
154 printf(
"Skipped %d illegal edges.\n", Count );
168static inline int Gia_ObjHaveEdge(
Gia_Man_t *
p,
int iObj,
int iNext )
170 return Vec_IntEntry(
p->vEdge1, iObj) == iNext || Vec_IntEntry(
p->vEdge2, iObj) == iNext;
174 return Gia_ObjHaveEdge(
p, iObj, iNext );
179 int i, iFan, Delay, DelayMax = 0;
180 if ( Gia_ManHasMapping(
p) && Gia_ObjIsLut(
p, iObj) )
182 assert( Gia_ObjLutSize(
p, iObj) <= 4 );
185 Delay = Vec_IntEntry(vDelay, iFan) + (Gia_ObjHaveEdge(
p, iObj, iFan) ? nEdgeDelay : 10);
186 DelayMax = Abc_MaxInt( DelayMax, Delay );
189 else if ( Gia_ObjIsLut2(
p, iObj) )
191 assert( Gia_ObjLutSize2(
p, iObj) <= 4 );
194 Delay = Vec_IntEntry(vDelay, iFan) + (Gia_ObjHaveEdge(
p, iObj, iFan) ? nEdgeDelay : 10);
195 DelayMax = Abc_MaxInt( DelayMax, Delay );
203 int k, iLut, DelayMax = 0;
205 Vec_IntFreeP( &
p->vEdgeDelay );
206 p->vEdgeDelay = Vec_IntStart( Gia_ManObjNum(
p) );
207 if ( Gia_ManHasMapping(
p) )
216 iLut = Gia_ObjId(
p, pObj );
217 if ( Gia_ObjIsAnd(pObj) )
219 if ( Gia_ObjIsLut(
p, iLut) )
220 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, Gia_ObjEvalEdgeDelay(
p, iLut,
p->vEdgeDelay) );
222 else if ( Gia_ObjIsCi(pObj) )
225 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, arrTime );
227 else if ( Gia_ObjIsCo(pObj) )
229 int arrTime = Vec_IntEntry(
p->vEdgeDelay, Gia_ObjFaninId0(pObj, iLut) );
232 else if ( !Gia_ObjIsConst0(pObj) )
235 Vec_IntFree( vNodes );
240 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, Gia_ObjEvalEdgeDelay(
p, iLut,
p->vEdgeDelay) );
243 else if ( Gia_ManHasMapping2(
p) )
252 iLut = Gia_ObjId(
p, pObj );
253 if ( Gia_ObjIsAnd(pObj) )
255 if ( Gia_ObjIsLut2(
p, iLut) )
256 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, Gia_ObjEvalEdgeDelay(
p, iLut,
p->vEdgeDelay) );
258 else if ( Gia_ObjIsCi(pObj) )
261 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, arrTime );
263 else if ( Gia_ObjIsCo(pObj) )
265 int arrTime = Vec_IntEntry(
p->vEdgeDelay, Gia_ObjFaninId0(pObj, iLut) );
268 else if ( !Gia_ObjIsConst0(pObj) )
271 Vec_IntFree( vNodes );
276 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, Gia_ObjEvalEdgeDelay(
p, iLut,
p->vEdgeDelay) );
281 DelayMax = Abc_MaxInt( DelayMax, Vec_IntEntry(
p->vEdgeDelay, iLut) );
286 return (Vec_IntCountPositive(
p->vEdge1) + Vec_IntCountPositive(
p->vEdge2))/2;
303 int i, iFan, Delay, Status1, Status2;
304 int DelayMax = 0, DelayMax2 = 0, nCountMax = 0;
305 int iFanMax1 = -1, iFanMax2 = -1;
306 Vec_IntWriteEntry(vEdge1, iObj, 0);
307 Vec_IntWriteEntry(vEdge2, iObj, 0);
308 if ( Gia_ManHasMapping(
p) && Gia_ObjIsLut(
p, iObj) )
310 assert( Gia_ObjLutSize(
p, iObj) <= 4 );
313 Delay = Vec_IntEntry( vDelay, iFan ) + 10;
314 if ( DelayMax < Delay )
316 DelayMax2 = DelayMax;
321 else if ( DelayMax == Delay )
326 DelayMax2 = DelayMax;
329 DelayMax2 = Abc_MaxInt( DelayMax2, Delay );
332 else if ( Gia_ObjIsLut2(
p, iObj) )
334 assert( Gia_ObjLutSize2(
p, iObj) <= 4 );
337 Delay = Vec_IntEntry( vDelay, iFan ) + 10;
338 if ( DelayMax < Delay )
340 DelayMax2 = DelayMax;
345 else if ( DelayMax == Delay )
350 DelayMax2 = DelayMax;
353 DelayMax2 = Abc_MaxInt( DelayMax2, Delay );
358 if ( DelayMax <= 10 )
360 else if ( nCountMax == 1 )
362 Status1 = Gia_ObjEdgeCount( iFanMax1, vEdge1, vEdge2 );
365 Gia_ObjEdgeAdd( iFanMax1, iObj, vEdge1, vEdge2 );
366 Gia_ObjEdgeAdd( iObj, iFanMax1, vEdge1, vEdge2 );
367 DelayMax = Abc_MaxInt( DelayMax2, DelayMax - 8 );
368 Vec_IntWriteEntry( vDelay, iObj, DelayMax );
372 else if ( fUseTwo && nCountMax == 2 )
374 Status1 = Gia_ObjEdgeCount( iFanMax1, vEdge1, vEdge2 );
375 Status2 = Gia_ObjEdgeCount( iFanMax2, vEdge1, vEdge2 );
376 if ( Status1 <= 1 && Status2 <= 1 )
378 Gia_ObjEdgeAdd( iFanMax1, iObj, vEdge1, vEdge2 );
379 Gia_ObjEdgeAdd( iFanMax2, iObj, vEdge1, vEdge2 );
380 Gia_ObjEdgeAdd( iObj, iFanMax1, vEdge1, vEdge2 );
381 Gia_ObjEdgeAdd( iObj, iFanMax2, vEdge1, vEdge2 );
382 DelayMax = Abc_MaxInt( DelayMax2, DelayMax - 8 );
383 Vec_IntWriteEntry( vDelay, iObj, DelayMax );
387 Vec_IntWriteEntry( vDelay, iObj, DelayMax );
392 int k, iLut, DelayMax = 0;
393 Vec_IntFreeP( &
p->vEdgeDelay );
394 Vec_IntFreeP( &
p->vEdge1 );
395 Vec_IntFreeP( &
p->vEdge2 );
396 p->vEdge1 = Vec_IntStart( Gia_ManObjNum(
p) );
397 p->vEdge2 = Vec_IntStart( Gia_ManObjNum(
p) );
398 p->vEdgeDelay = Vec_IntStart( Gia_ManObjNum(
p) );
399 if ( Gia_ManHasMapping(
p) )
408 iLut = Gia_ObjId(
p, pObj );
409 if ( Gia_ObjIsAnd(pObj) )
411 if ( Gia_ObjIsLut(
p, iLut) )
414 else if ( Gia_ObjIsCi(pObj) )
417 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, arrTime );
419 else if ( Gia_ObjIsCo(pObj) )
421 int arrTime = Vec_IntEntry(
p->vEdgeDelay, Gia_ObjFaninId0(pObj, iLut) );
424 else if ( !Gia_ObjIsConst0(pObj) )
427 Vec_IntFree( vNodes );
435 else if ( Gia_ManHasMapping2(
p) )
444 iLut = Gia_ObjId(
p, pObj );
445 if ( Gia_ObjIsAnd(pObj) )
447 if ( Gia_ObjIsLut2(
p, iLut) )
450 else if ( Gia_ObjIsCi(pObj) )
453 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, arrTime );
455 else if ( Gia_ObjIsCo(pObj) )
457 int arrTime = Vec_IntEntry(
p->vEdgeDelay, Gia_ObjFaninId0(pObj, iLut) );
460 else if ( !Gia_ObjIsConst0(pObj) )
463 Vec_IntFree( vNodes );
473 DelayMax = Abc_MaxInt( DelayMax, Vec_IntEntry(
p->vEdgeDelay, iLut) );
491 int i, iFan, DelayFanin, Status1, Status2;
492 int DelayMax = 0, nCountMax = 0;
493 int iFanMax1 = -1, iFanMax2 = -1;
494 Vec_IntWriteEntry(vEdge1, iObj, 0);
495 Vec_IntWriteEntry(vEdge2, iObj, 0);
497 DelayMax = Vec_IntEntry( vDelay, iObj );
498 nCountMax = Vec_IntEntry( vCountMax, iObj );
501 else if ( nCountMax == 1 )
503 iFanMax1 = Vec_IntEntry( vFanMax1, iObj );
504 Status1 = Gia_ObjEdgeCount( iFanMax1, vEdge1, vEdge2 );
507 Gia_ObjEdgeAdd( iFanMax1, iObj, vEdge1, vEdge2 );
508 Gia_ObjEdgeAdd( iObj, iFanMax1, vEdge1, vEdge2 );
512 else if ( nCountMax == 2 )
514 iFanMax1 = Vec_IntEntry( vFanMax1, iObj );
515 iFanMax2 = Vec_IntEntry( vFanMax2, iObj );
516 Status1 = Gia_ObjEdgeCount( iFanMax1, vEdge1, vEdge2 );
517 Status2 = Gia_ObjEdgeCount( iFanMax2, vEdge1, vEdge2 );
518 if ( Status1 <= 1 && Status2 <= 1 )
520 Gia_ObjEdgeAdd( iFanMax1, iObj, vEdge1, vEdge2 );
521 Gia_ObjEdgeAdd( iFanMax2, iObj, vEdge1, vEdge2 );
522 Gia_ObjEdgeAdd( iObj, iFanMax1, vEdge1, vEdge2 );
523 Gia_ObjEdgeAdd( iObj, iFanMax2, vEdge1, vEdge2 );
527 Vec_IntWriteEntry( vDelay, iObj, DelayMax );
529 if ( Gia_ManHasMapping(
p) && Gia_ObjIsLut(
p, iObj) )
533 DelayFanin = Vec_IntEntry( vDelay, iFan );
534 if ( DelayFanin < DelayMax + 1 )
536 Vec_IntWriteEntry( vDelay, iFan, DelayMax + 1 );
537 Vec_IntWriteEntry( vFanMax1, iFan, iObj );
538 Vec_IntWriteEntry( vCountMax, iFan, 1 );
540 else if ( DelayFanin == DelayMax + 1 )
542 Vec_IntWriteEntry( vFanMax2, iFan, iObj );
543 Vec_IntAddToEntry( vCountMax, iFan, 1 );
547 else if ( Gia_ObjIsLut2(
p, iObj) )
551 DelayFanin = Vec_IntEntry( vDelay, iFan );
552 if ( DelayFanin < DelayMax + 1 )
554 Vec_IntWriteEntry( vDelay, iFan, DelayMax + 1 );
555 Vec_IntWriteEntry( vFanMax1, iFan, iObj );
556 Vec_IntWriteEntry( vCountMax, iFan, 1 );
558 else if ( DelayFanin == DelayMax + 1 )
560 Vec_IntWriteEntry( vFanMax2, iFan, iObj );
561 Vec_IntAddToEntry( vCountMax, iFan, 1 );
570 int k, iLut, DelayMax = 0;
571 Vec_Int_t * vFanMax1 = Vec_IntStart( Gia_ManObjNum(
p) );
572 Vec_Int_t * vFanMax2 = Vec_IntStart( Gia_ManObjNum(
p) );
573 Vec_Int_t * vCountMax = Vec_IntStart( Gia_ManObjNum(
p) );
575 Vec_IntFreeP( &
p->vEdgeDelay );
576 Vec_IntFreeP( &
p->vEdge1 );
577 Vec_IntFreeP( &
p->vEdge2 );
578 p->vEdgeDelay = Vec_IntStart( Gia_ManObjNum(
p) );
579 p->vEdge1 = Vec_IntStart( Gia_ManObjNum(
p) );
580 p->vEdge2 = Vec_IntStart( Gia_ManObjNum(
p) );
583 if ( Gia_ManHasMapping(
p) )
586 else if ( Gia_ManHasMapping2(
p) )
591 DelayMax = Abc_MaxInt( DelayMax, Vec_IntEntry(
p->vEdgeDelay, iLut) );
592 Vec_IntFree( vFanMax1 );
593 Vec_IntFree( vFanMax2 );
594 Vec_IntFree( vCountMax );
618 int i, iLut, Delay, DelayMax = 0;
619 assert( Vec_IntSize(vNodes) == Vec_WecSize(vWin) );
622 Vec_IntReverseOrder( vTemp );
625 if ( !Gia_ObjIsLut(
p, iLut) )
628 DelayMax = Abc_MaxInt( DelayMax, Delay );
636 assert( Vec_IntSize(vNodes) == Vec_WecSize(vWin) );
660 assert( Gia_ManHasMapping(
p) );
661 Vec_WecFreeP( &
p->vMapping2 );
662 Vec_WecFreeP( &
p->vFanouts2 );
663 p->vMapping2 = Vec_WecStart( Gia_ManObjNum(
p) );
664 p->vFanouts2 = Vec_WecStart( Gia_ManObjNum(
p) );
667 assert( Gia_ObjLutSize(
p, iObj) <= 4 );
670 Vec_WecPush(
p->vMapping2, iObj, iFanin );
671 Vec_WecPush(
p->vFanouts2, iFanin, iObj );
691 int i, iFan, Delay, DelayMax = 0;
692 assert( Gia_ObjIsLut2(
p, iObj) );
695 Delay = Vec_IntEntry(vDelay, iFan) + (Gia_ObjHaveEdge(
p, iObj, iFan) ? DelayEdge : DelayNoEdge);
696 DelayMax = Abc_MaxInt( DelayMax, Delay );
703 int iLut, Delay, DelayMax = 0;
705 if (
p->vEdgeDelay == NULL )
706 p->vEdgeDelay = Vec_IntStart( Gia_ManObjNum(
p) );
708 Vec_IntFill(
p->vEdgeDelay, Gia_ManObjNum(
p), 0 );
711 Delay = Edg_ObjEvalEdgeDelay(
p, iLut,
p->vEdgeDelay);
712 Vec_IntWriteEntry(
p->vEdgeDelay, iLut, Delay );
713 DelayMax = Abc_MaxInt( DelayMax, Delay );
722 int i, iFan, Delay, DelayMax = 0;
723 assert( Gia_ObjIsLut2(
p, iObj) );
726 Delay = Vec_IntEntry(vDelay, iFan) + (Gia_ObjHaveEdge(
p, iObj, iFan) ? DelayEdge : DelayNoEdge);
727 DelayMax = Abc_MaxInt( DelayMax, Delay );
735 int iLut, Delay, DelayMax = 0;
737 if (
p->vEdgeDelayR == NULL )
738 p->vEdgeDelayR = Vec_IntStart( Gia_ManObjNum(
p) );
740 Vec_IntFill(
p->vEdgeDelayR, Gia_ManObjNum(
p), 0 );
745 Delay = Edg_ObjEvalEdgeDelayR(
p, iLut,
p->vEdgeDelayR);
746 Vec_IntWriteEntry(
p->vEdgeDelayR, iLut, Delay );
747 DelayMax = Abc_MaxInt( DelayMax, Delay );
755 int k, iLut, Delay1, Delay2;
757 Vec_WecClear( vEdges );
758 Vec_WecInit( vEdges, DelayMax + 1 );
761 Delay1 = Vec_IntEntry(
p->vEdgeDelay, iLut );
762 Delay2 = Vec_IntEntry(
p->vEdgeDelayR, iLut );
763 assert( Delay1 + Delay2 <= DelayMax );
764 if ( Delay1 + Delay2 == DelayMax )
765 Vec_WecPush( vEdges, Delay1, iLut );
770 assert( Vec_IntSize(vLevel) > 0 );
787 int nFaninsC = 0, nFanoutsC = 0;
788 int nFaninsEC = 0, nFanoutsEC = 0;
789 int nFaninsENC = 0, nFanoutsENC = 0;
790 int pFanins[4], pFanouts[4];
791 int nEdgeDiff, nEdges = 0, Count = 0;
792 int i, iNext, Delay1, Delay2;
794 Delay1 = Vec_IntEntry(
p->vEdgeDelayR, iObj );
798 if ( !Gia_ObjIsAnd(Gia_ManObj(
p, iNext)) )
800 Delay2 = Vec_IntEntry(
p->vEdgeDelay, iNext );
801 if ( Gia_ObjHaveEdge(
p, iObj, iNext) )
804 assert( Delay1 + Delay2 <= DelayMax );
805 if ( Delay1 + Delay2 == DelayMax )
812 assert( Delay1 + Delay2 + 1 <= DelayMax );
813 if ( Delay1 + Delay2 + 1 == DelayMax )
814 pFanins[nFaninsC++] = iNext;
818 Delay1 = Vec_IntEntry(
p->vEdgeDelay, iObj );
824 assert( Gia_ObjIsAnd(Gia_ManObj(
p, iNext)) );
825 Delay2 = Vec_IntEntry(
p->vEdgeDelayR, iNext );
826 if ( Gia_ObjHaveEdge(
p, iObj, iNext) )
829 assert( Delay1 + Delay2 <= DelayMax );
830 if ( Delay1 + Delay2 == DelayMax )
837 assert( Delay1 + Delay2 + 1 <= DelayMax );
838 if ( Delay1 + Delay2 + 1 == DelayMax )
840 if ( nFanoutsC < nEdgeLimit )
841 pFanouts[nFanoutsC] = iNext;
848 printf(
"%8d : ", iObj );
849 printf(
"Edges = %d ", nEdges );
850 printf(
"Fanins (all %d EC %d ENC %d C %d) ",
851 Gia_ObjLutSize2(
p, iObj), nFaninsEC, nFaninsENC, nFaninsC );
852 printf(
"Fanouts (all %d EC %d ENC %d C %d) ",
853 Gia_ObjLutFanoutNum2(
p, iObj), nFanoutsEC, nFanoutsENC, nFanoutsC );
856 assert( nEdges <= nEdgeLimit );
857 if ( nEdges == nEdgeLimit )
863 nEdgeDiff = nEdgeLimit - nEdges;
865 if ( nFaninsEC == 0 && nFaninsC && nFaninsC <= nEdgeDiff )
867 for ( i = 0; i < nFaninsC; i++ )
868 if ( Gia_ObjEdgeCount(pFanins[i],
p->vEdge1,
p->vEdge2) == nEdgeLimit )
872 for ( i = 0; i < nFaninsC; i++ )
874 Count += Gia_ObjEdgeAdd( iObj, pFanins[i],
p->vEdge1,
p->vEdge2 );
875 Count += Gia_ObjEdgeAdd( pFanins[i], iObj,
p->vEdge1,
p->vEdge2 );
878 printf(
"Wrong number of edges.\n" );
880 printf(
"Fixed %d critical fanins\n", nFaninsC );
884 if ( nFanoutsEC == 0 && nFanoutsC && nFanoutsC <= nEdgeDiff )
886 for ( i = 0; i < nFanoutsC; i++ )
887 if ( Gia_ObjEdgeCount(pFanouts[i],
p->vEdge1,
p->vEdge2) == nEdgeLimit )
889 if ( i == nFanoutsC )
891 for ( i = 0; i < nFanoutsC; i++ )
893 Count += Gia_ObjEdgeAdd( iObj, pFanouts[i],
p->vEdge1,
p->vEdge2 );
894 Count += Gia_ObjEdgeAdd( pFanouts[i], iObj,
p->vEdge1,
p->vEdge2 );
897 printf(
"Wrong number of edges.\n" );
899 printf(
"Fixed %d critical fanouts\n", nFanoutsC );
904 printf(
"Cannot fix\n" );
922 int fLevelVerbose = 0;
925 Vec_Int_t * vEdge1 = NULL, * vEdge2 = NULL;
927 int k, j, i, iLast = -1, iObj;
929 printf(
"Running edge assignment with E = %d.\n", nEdges );
933 Vec_IntFreeP( &
p->vEdge1 );
934 Vec_IntFreeP( &
p->vEdge2 );
935 p->vEdge1 = Vec_IntStart( Gia_ManObjNum(
p) );
936 p->vEdge2 = Vec_IntStart( Gia_ManObjNum(
p) );
938 for ( i = 0; i < 10000; i++ )
941 if ( i > iLast + 50 )
946 assert( DelayD == DelayR + DelayNoEdge );
947 if ( DelayPrev > DelayD )
950 Vec_IntFreeP( &vEdge1 ); vEdge1 = Vec_IntDup(
p->vEdge1 );
951 Vec_IntFreeP( &vEdge2 ); vEdge2 = Vec_IntDup(
p->vEdge2 );
956 printf(
"\nIter %4d : Delay = %4d\n", i, DelayD );
963 Vec_IntPush( vLevel, k );
965 Vec_WecSort( vEdges, 0 );
970 int Level = Vec_IntPop( vLevel );
971 printf(
"%d: Level %2d : ", k, Level );
972 Vec_IntPrint( vLevel );
980 if ( j < Vec_IntSize(vLevel) )
983 if ( k == Vec_WecSize(vEdges) )
986 Vec_WecFree( vEdges );
988 Vec_IntFreeP( &
p->vEdge1 );
p->vEdge1 = vEdge1;
989 Vec_IntFreeP( &
p->vEdge2 );
p->vEdge2 = vEdge2;
#define ABC_SWAP(Type, a, b)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Gia_ManEvalWindow(Gia_Man_t *p, Vec_Int_t *vLeaves, Vec_Int_t *vNodes, Vec_Wec_t *vWin, Vec_Int_t *vTemp, int fUseTwo)
void Edg_ManToMapping(Gia_Man_t *p)
void Gia_ManConvertPackingToEdges(Gia_Man_t *p)
int Edg_ManAssignEdgeNew(Gia_Man_t *p, int nEdges, int fVerbose)
Vec_Int_t * Gia_ManEdgeToArray(Gia_Man_t *p)
void Edg_ManCollectCritEdges(Gia_Man_t *p, Vec_Wec_t *vEdges, int DelayMax)
int Edg_ObjImprove(Gia_Man_t *p, int iObj, int nEdgeLimit, int DelayMax, int fVerbose)
int Gia_ManEvalEdgeCount(Gia_Man_t *p)
int Edg_ManEvalEdgeDelay(Gia_Man_t *p)
int Gia_ManComputeEdgeDelay(Gia_Man_t *p, int fUseTwo)
int Gia_ManEvalWindowInc(Gia_Man_t *p, Vec_Int_t *vLeaves, Vec_Int_t *vNodes, Vec_Wec_t *vWin, Vec_Int_t *vTemp, int fUseTwo)
int Edg_ManEvalEdgeDelayR(Gia_Man_t *p)
void Gia_ManUpdateMapping(Gia_Man_t *p, Vec_Int_t *vNodes, Vec_Wec_t *vWin)
int Gia_ManEvalEdgeDelay(Gia_Man_t *p)
int Gia_ObjCheckEdge(Gia_Man_t *p, int iObj, int iNext)
void Gia_ManEdgeFromArray(Gia_Man_t *p, Vec_Int_t *vArray)
FUNCTION DEFINITIONS ///.
int Gia_ObjComputeEdgeDelay2(Gia_Man_t *p, int iObj, Vec_Int_t *vDelay, Vec_Int_t *vEdge1, Vec_Int_t *vEdge2, Vec_Int_t *vFanMax1, Vec_Int_t *vFanMax2, Vec_Int_t *vCountMax)
int Gia_ManComputeEdgeDelay2(Gia_Man_t *p)
int Gia_ObjComputeEdgeDelay(Gia_Man_t *p, int iObj, Vec_Int_t *vDelay, Vec_Int_t *vEdge1, Vec_Int_t *vEdge2, int fUseTwo)
#define Gia_ManForEachLut2Reverse(p, i)
#define Gia_ManForEachLutReverse(p, i)
#define Gia_ManForEachLut2(p, i)
#define Gia_LutForEachFanin2(p, i, iFan, k)
#define Gia_ManForEachCoDriverId(p, DriverId, i)
void Gia_ManCollectTfo(Gia_Man_t *p, Vec_Int_t *vRoots, Vec_Int_t *vNodes)
#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)
#define Gia_LutForEachFanout2(p, i, iFan, k)
Vec_Int_t * Gia_ManOrderWithBoxes(Gia_Man_t *p)
#define Gia_ManForEachCiId(p, Id, i)
void Tim_ManSetCoArrival(Tim_Man_t *p, int iCo, float Delay)
int Tim_ManBoxNum(Tim_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
float Tim_ManGetCiArrival(Tim_Man_t *p, int iCi)
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelStart(vGlob, vVec, i, LevelStart)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.