204{
211 float tDelta, tArrival;
212 int i, k, k2, Counter, CounterRes, nTimeCris;
213 unsigned * puTCEdges;
214
215 if ( !fUseLutLib )
216 {
219 {
222 }
223 }
225 tDelta = fUseLutLib ? tArrival*Percentage/100.0 : 1.0;
226 if ( fVerbose )
227 {
228 printf( "Max delay = %.2f. Delta = %.2f. ", tArrival, tDelta );
229 printf( "Using %s model. ", fUseLutLib? "LUT library" : "unit-delay" );
230 if ( fUseLutLib )
231 printf( "Percentage = %d. ", Percentage );
232 printf( "\n" );
233 }
234
235 puTCEdges =
ABC_ALLOC(
unsigned, Nwk_ManObjNumMax(pNtk) );
236 memset( puTCEdges, 0,
sizeof(
unsigned) * Nwk_ManObjNumMax(pNtk) );
238 {
239 if ( Nwk_ObjSlack(pNode) >= tDelta )
240 continue;
242 }
243 if ( fVerbose )
244 {
245 Counter = CounterRes = 0;
247 {
249 if ( !Nwk_ObjIsCi(pFanin) && Nwk_ObjSlack(pFanin) < tDelta )
250 Counter++;
251 CounterRes += Aig_WordCountOnes( puTCEdges[pNode->Id] );
252 }
253 printf( "Edges: Total = %7d. 0-slack = %7d. Critical = %7d. Ratio = %4.2f\n",
255 }
256
259 memset( pAig->pEquivs, 0,
sizeof(
Aig_Obj_t *) * 3 * Aig_ManObjNumMax(pAig) );
260
261
262 Counter = CounterRes = 0;
263 vTimeCries = Vec_PtrAlloc( 16 );
264 vTimeFanins = Vec_PtrAlloc( 16 );
266 {
267 if ( Nwk_ObjSlack(pNode) >= tDelta )
268 continue;
269
270 nTimeCris = 0;
272 if ( !Nwk_ObjIsCi(pFanin) && (puTCEdges[pNode->Id] & (1<<k)) )
273 nTimeCris++;
274 if ( !fVeryVerbose && nTimeCris == 0 )
275 continue;
276 Counter++;
277
278 Vec_PtrClear( vTimeCries );
279 if ( nTimeCris )
280 {
282 if ( !Nwk_ObjIsCi(pFanin) && (puTCEdges[pNode->Id] & (1<<k)) )
284 if ( puTCEdges[pFanin->Id] & (1<<k2) )
285 Vec_PtrPushUnique( vTimeCries, pFanin2 );
286 }
287
288 if ( (Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree) )
289 continue;
290 CounterRes++;
291
292 Vec_PtrClear( vTimeFanins );
294 {
295 if ( Nwk_ObjIsCi(pFanin) )
296 Vec_PtrPushUnique( vTimeFanins, pFanin );
297 else
299 Vec_PtrPushUnique( vTimeFanins, pFanin2 );
300 }
301
302 if ( fVeryVerbose )
303 {
304 printf( "%5d Node %5d : %d %2d %2d ", Counter, pNode->Id,
305 nTimeCris, Vec_PtrSize(vTimeCries), Vec_PtrSize(vTimeFanins) );
307 printf( "%d(%.2f)%s ", pFanin->Id, Nwk_ObjSlack(pFanin), (puTCEdges[pNode->Id] & (1<<k))? "*":"" );
308 printf( "\n" );
309 }
310
311 if ( Vec_PtrSize(vTimeCries) == 0 || Vec_PtrSize(vTimeCries) > Degree )
312 continue;
313
314 if ( Vec_PtrSize(vTimeCries) > 1 )
315 {
316 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
317 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
318 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
319 {
320 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
321 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
322 }
323 }
324 if ( Vec_PtrSize(vTimeCries) > 2 )
325 {
326 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
327 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 2 );
328 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
329 {
330 Vec_PtrWriteEntry( vTimeCries, 1, pFanin2 );
331 Vec_PtrWriteEntry( vTimeCries, 2, pFanin );
332 }
333 pFanin = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 0 );
334 pFanin2 = (
Nwk_Obj_t *)Vec_PtrEntry( vTimeCries, 1 );
335 if ( Nwk_ObjSlack(pFanin) < Nwk_ObjSlack(pFanin2) )
336 {
337 Vec_PtrWriteEntry( vTimeCries, 0, pFanin2 );
338 Vec_PtrWriteEntry( vTimeCries, 1, pFanin );
339 }
340 }
341
343 }
344 Vec_PtrFree( vTimeCries );
345 Vec_PtrFree( vTimeFanins );
347 if ( fVerbose )
348 printf( "Nodes: Total = %7d. 0-slack = %7d. Workable = %7d. Ratio = %4.2f\n",
349 Nwk_ManNodeNum(pNtk), Counter, CounterRes, Counter? 1.0*CounterRes/Counter : 0.0 );
350
351
353 if ( Aig_ObjEquiv(pAig, pAnd) )
354 {
355 if ( Aig_ObjRefs(Aig_ObjEquiv(pAig, pAnd)) > 0 )
356 pAig->pEquivs[pAnd->
Id] = NULL;
357 }
358
359
360 if ( !fUseLutLib )
362 if ( pTempTim )
363 {
366 }
367
368
371
373 return pAig;
374}
#define ABC_ALLOC(type, num)
Aig_Man_t * Aig_ManDupDfs(Aig_Man_t *p)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManChoiceLevel(Aig_Man_t *p)
ABC_DLL Aig_Man_t * Nwk_ManStrash(Nwk_Man_t *p)
unsigned Nwk_ManDelayTraceTCEdges(Nwk_Man_t *pNtk, Nwk_Obj_t *pNode, float tDelta, int fUseLutLib)
void Aig_ManSpeedupNode(Nwk_Man_t *pNtk, Aig_Man_t *pAig, Nwk_Obj_t *pNode, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vTimes)
#define Nwk_ManForEachNode(p, pObj, i)
ABC_DLL float Nwk_ManDelayTraceLut(Nwk_Man_t *pNtk)
ABC_DLL int Nwk_ManGetTotalFanins(Nwk_Man_t *pNtk)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManStop(Tim_Man_t *p)
Tim_Man_t * Tim_ManDup(Tim_Man_t *p, int fUnitDelay)