54 if ( !Gia_ObjIsAnd(pObj) )
56 Id = Gia_ObjId(
p, pObj );
58 if ( Gia_ObjIsTravIdCurrentId(
p, Id) )
60 Gia_ObjSetTravIdCurrentId(
p, Id);
61 Vec_IntPush( vOrder, Id );
67 if ( !Gia_ObjIsAnd(Gia_ManObj(
p, iFan)) )
69 assert( Gia_ObjIsLut(
p, iFan) );
70 if ( Gia_ObjIsTravIdCurrentId(
p, iFan) )
72 Gia_ObjSetTravIdCurrentId(
p, iFan);
73 Vec_IntPush( vOrder, iFan );
76 assert( Vec_IntCap(vOrder) == 16 || Vec_IntSize(vOrder) == Vec_IntCap(vOrder) );
77 Vec_IntReverseOrder( vOrder );
83 int i, k, Id, iFan, * pPerm;
85 vLuts = Vec_IntAlloc( Gia_ManAndNum(
p) );
87 Vec_IntPush( vLuts, Id );
89 vDist = Vec_IntStart( Gia_ManObjNum(
p) );
91 Vec_IntWriteEntry( vDist, Id, 1 );
94 int Dist = 1 + Vec_IntEntry(vDist, Id);
96 Vec_IntUpdateEntry( vDist, iFan,
Dist );
101 Vec_IntWriteEntry( vDist, k++, -Vec_IntEntry(vDist, Id) );
102 Vec_IntShrink( vDist, k );
105 vOrder = Vec_IntAlloc( Vec_IntSize(vLuts) );
106 for ( i = 0; i < Vec_IntSize(vLuts); i++ )
107 Vec_IntPush( vOrder, Vec_IntEntry(vLuts, pPerm[i]) );
108 Vec_IntFree( vDist );
109 Vec_IntFree( vLuts );
127 int Delays[32], Perm[32];
130 Vec_Int_t * vDelay = Vec_IntStart( Gia_ManObjNum(
p) );
131 Vec_Int_t * vBlock = Vec_IntStart( Gia_ManObjNum(
p) );
132 Vec_Int_t * vBSize = Vec_IntAlloc( 2 * Vec_IntSize(vOrder) / nBlockSize );
133 int i, k, Id, iFan, nSize, iBlock, Delay, DelayMax = 0;
137 nSize = Gia_ObjLutSize(
p, Id );
141 Delays[k] = Vec_IntEntry(vDelay, iFan);
144 Vec_IntSelectSortCost2Reverse( Perm, nSize, Delays );
145 assert( nSize < 2 || Delays[0] >= Delays[nSize-1] );
146 assert( Delays[0] >= 0 && Delays[nSize-1] >= 0 );
148 iBlock = Vec_IntEntry( vBlock, Perm[0] );
149 if ( Delays[0] > 0 && Delays[0] > Delays[1] && Vec_IntEntry(vBSize, iBlock) < nBlockSize )
151 Delay = Delays[0] + DelayDir;
152 Vec_IntWriteEntry( vBlock, Id, iBlock );
153 Vec_IntAddToEntry( vBSize, iBlock, 1 );
157 Delay = Delays[0] + DelayRoute;
158 Vec_IntWriteEntry( vBlock, Id, Vec_IntSize(vBSize) );
159 Vec_IntPush( vBSize, 1 );
162 for ( k = 1; k < nSize; k++ )
163 Delay = Abc_MaxInt( Delay, Delays[k] + DelayRoute );
164 Vec_IntWriteEntry( vDelay, Id, Delay );
165 DelayMax = Abc_MaxInt( DelayMax, Delay );
167 assert( Vec_IntSum(vBSize) == Vec_IntSize(vOrder) );
169 vPacking = Vec_IntAlloc( Vec_IntSize(vBSize) + Vec_IntSize(vOrder) + 1 );
170 Vec_IntPush( vPacking, Vec_IntSize(vBSize) );
172 vStarts = Vec_IntAlloc( Vec_IntSize(vBSize) );
175 Vec_IntPush( vPacking, nSize );
176 Vec_IntPush( vStarts, Vec_IntSize(vPacking) );
177 Vec_IntFillExtra( vPacking, Vec_IntSize(vPacking) + nSize, -1 );
179 assert( Vec_IntCap(vPacking) == 16 || Vec_IntSize(vPacking) == Vec_IntCap(vPacking) );
183 int Block = Vec_IntEntry( vBlock, Id );
184 int Start = Vec_IntEntry( vStarts, Block );
185 assert( Vec_IntEntry(vPacking, Start) == -1 );
186 Vec_IntWriteEntry( vPacking, Start, Id );
187 Vec_IntAddToEntry( vStarts, Block, 1 );
189 assert( Vec_IntCountEntry(vPacking, -1) == 0 );
191 Vec_IntFree( vOrder );
192 Vec_IntFree( vDelay );
193 Vec_IntFree( vBlock );
194 Vec_IntFree( vBSize );
195 Vec_IntFree( vStarts );
196 Vec_IntFreeP( &
p->vPacking );
197 p->vPacking = vPacking;
198 printf(
"Global delay = %d.\n", DelayMax );