314{
316 int i, Counter;
317 float reqTime;
318
319
320
322 if (
p->pManTim == NULL )
323 {
324
326
327
328 if (
p->pPars->pTimesReq && !
p->pPars->fAreaOnly )
329 {
330
331 Counter = 0;
333 {
334 if ( If_ObjArrTime(If_ObjFanin0(pObj)) >
p->pPars->pTimesReq[i] +
p->fEpsilon )
335 {
336 If_ObjFanin0(pObj)->Required = If_ObjArrTime(If_ObjFanin0(pObj));
337 Counter++;
338
339
340 }
341 else
342 If_ObjFanin0(pObj)->Required =
p->pPars->pTimesReq[i];
343 }
344 if ( Counter && !
p->fReqTimeWarn )
345 {
346 Abc_Print( 0, "Required times are exceeded at %d output%s. The earliest arrival times are used.\n", Counter, Counter > 1 ? "s":"" );
348 }
349 }
350 else
351 {
352
353 if (
p->pPars->nRelaxRatio &&
p->pPars->DelayTargetNew == 0 )
354 p->pPars->DelayTargetNew =
p->RequiredGlo * (100.0 +
p->pPars->nRelaxRatio) / 100.0;
355
356
357 if (
p->pPars->DelayTarget != -1 )
358 {
359 if (
p->RequiredGlo >
p->pPars->DelayTarget +
p->fEpsilon )
360 {
361 if (
p->fNextRound == 0 )
362 {
364 Abc_Print( 0,
"Cannot meet the target required times (%4.2f). Mapping continues anyway.\n",
p->pPars->DelayTarget );
365 }
366 }
367 else if (
p->RequiredGlo <
p->pPars->DelayTarget -
p->fEpsilon )
368 {
369 if (
p->fNextRound == 0 )
370 {
372
373 }
374 p->RequiredGlo =
p->pPars->DelayTarget;
375 }
376 }
377 else if (
p->pPars->DelayTargetNew > 0 )
378 p->RequiredGlo =
p->pPars->DelayTargetNew;
379
380 if (
p->pPars->fAreaOnly )
381 return;
382
383 if (
p->pPars->fDoAverage )
384 {
385 if (
p->pPars->nRelaxRatio )
386 {
388 If_ObjFanin0(pObj)->Required = If_ObjArrTime(If_ObjFanin0(pObj)) * (100.0 +
p->pPars->nRelaxRatio) / 100.0;
389 }
390 else
391 {
393 If_ObjFanin0(pObj)->Required = If_ObjArrTime(If_ObjFanin0(pObj));
394 }
395 }
396 else if (
p->pPars->fLatchPaths )
397 {
399 If_ObjFanin0(pObj)->Required =
p->RequiredGlo;
400 }
401 else
402 {
404 If_ObjFanin0(pObj)->Required =
p->RequiredGlo;
405 }
406 }
407
408
409
411 {
412 if ( pObj->
nRefs == 0 )
413 continue;
415 }
416 }
417 else
418 {
419
421
422
423 if (
p->pPars->nRelaxRatio &&
p->pPars->DelayTargetNew == 0 )
424 p->pPars->DelayTargetNew =
p->RequiredGlo * (100.0 +
p->pPars->nRelaxRatio) / 100.0;
425
426
427 if (
p->pPars->DelayTarget != -1 )
428 {
429 if (
p->RequiredGlo >
p->pPars->DelayTarget +
p->fEpsilon )
430 {
431 if (
p->fNextRound == 0 )
432 {
434 Abc_Print( 0,
"Cannot meet the target required times (%4.2f). Mapping continues anyway.\n",
p->pPars->DelayTarget );
435 }
436 }
437 else if (
p->RequiredGlo <
p->pPars->DelayTarget -
p->fEpsilon )
438 {
439 if (
p->fNextRound == 0 )
440 {
442
443 }
444 p->RequiredGlo =
p->pPars->DelayTarget;
445 }
446 }
447 else if (
p->pPars->DelayTargetNew > 0 )
448 p->RequiredGlo =
p->pPars->DelayTargetNew;
449
450
451 if (
p->pPars->fAreaOnly )
452 return;
453
456 {
457 assert( If_ManCoNum(
p) == Vec_IntSize(
p->vCoAttrs) );
459 {
460 if ( Vec_IntEntry(
p->vCoAttrs, i) == -1 )
461 continue;
462 if ( Vec_IntEntry(
p->vCoAttrs, i) == 0 )
464 else if ( Vec_IntEntry(
p->vCoAttrs, i) == 1 )
466 else if ( Vec_IntEntry(
p->vCoAttrs, i) == 2 )
469 }
470 }
471 else if (
p->pPars->fDoAverage )
472 {
473 if (
p->pPars->nRelaxRatio )
474 {
476 Tim_ManSetCoRequired(
p->pManTim, i, If_ObjArrTime(If_ObjFanin0(pObj)) * (100.0 +
p->pPars->nRelaxRatio) / 100.0 );
477 }
478 else
479 {
482 }
483 }
484 else if (
p->pPars->fLatchPaths )
485 {
490 }
491 else
492 {
494
495
496 }
497
499 {
500 if ( If_ObjIsAnd(pObj) )
501 {
502 if ( pObj->
nRefs == 0 )
503 continue;
505 }
506 else if ( If_ObjIsCi(pObj) )
507 {
510 }
511 else if ( If_ObjIsCo(pObj) )
512 {
514 If_ObjFanin0(pObj)->Required =
IF_MIN( reqTime, If_ObjFanin0(pObj)->Required );
515 }
516 else if ( If_ObjIsConst1(pObj) )
517 {
518 }
519 else
521 }
522 }
523}
float If_ManDelayMax(If_Man_t *p, int fSeq)
void If_CutPropagateRequired(If_Man_t *p, If_Obj_t *pObj, If_Cut_t *pCut, float ObjRequired)
#define If_ManForEachCo(p, pObj, i)
void If_ManMarkMapping(If_Man_t *p)
#define If_ManForEachObjReverse(p, pObj, i)
#define If_ManForEachLatchInput(p, pObj, i)
#define If_ManForEachPo(p, pObj, i)
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
void Tim_ManSetCiRequired(Tim_Man_t *p, int iCi, float Delay)
void Tim_ManInitPoRequiredAll(Tim_Man_t *p, float Delay)
void Tim_ManSetCoRequired(Tim_Man_t *p, int iCo, float Delay)
float Tim_ManGetCoRequired(Tim_Man_t *p, int iCo)