@@ -125,8 +125,8 @@ void Rebuffer::annotateLoadSlacks(BnetPtr& tree, Vertex* root_vertex)
125125 } else {
126126 const RiseFall* rf = req_path->transition (sta_);
127127 node->setSlackTransition (rf->asRiseFallBoth ());
128- node->setSlack (
129- FixedDelay ( req_path->required () - arrival_path->arrival ()));
128+ node->setSlack (FixedDelay (
129+ req_path->required () - arrival_path->arrival (), resizer_ ));
130130
131131 if (arrival_paths_[rf->index ()] == nullptr ) {
132132 arrival_paths_[rf->index ()] = arrival_path;
@@ -279,7 +279,7 @@ FixedDelay Rebuffer::slackAtDriverPin(const BufferedNetPtr& bnet)
279279{
280280 Delay correction;
281281 std::tie (std::ignore, correction, std::ignore) = drvrPinTiming (bnet);
282- return bnet->slack () + FixedDelay (correction);
282+ return bnet->slack () + FixedDelay (correction, resizer_ );
283283}
284284
285285std::optional<FixedDelay> Rebuffer::evaluateOption (const BnetPtr& option,
@@ -289,7 +289,7 @@ std::optional<FixedDelay> Rebuffer::evaluateOption(const BnetPtr& option,
289289 Delay correction;
290290 Slew slew;
291291 std::tie (std::ignore, correction, slew) = drvrPinTiming (option);
292- FixedDelay slack = option->slack () + FixedDelay (correction);
292+ FixedDelay slack = option->slack () + FixedDelay (correction, resizer_ );
293293
294294 if (!loadSlewSatisfactory (drvr_port_, option)) {
295295 return {};
@@ -298,7 +298,7 @@ std::optional<FixedDelay> Rebuffer::evaluateOption(const BnetPtr& option,
298298 // Refuse buffering option if we are violating max slew on the driver pin.
299299 // There's one exception: If we previously observed satisfactory slew with
300300 // an even higher load, ficticiously assume this load satisfies max slew.
301- // This is a precaution against non-mononotic slew vs load data which would
301+ // This is a precaution against non-monotonic slew vs load data which would
302302 // cause inconsistencies in the algorithm.
303303 if (slew > drvr_pin_max_slew_ && option->cap () > drvr_load_high_water_mark_) {
304304 return {};
@@ -937,7 +937,7 @@ BufferedNetPtr Rebuffer::recoverArea(const BufferedNetPtr& root,
937937 return 0 ;
938938 },
939939 root,
940- -FixedDelay (slack_correction));
940+ -FixedDelay (slack_correction, resizer_ ));
941941
942942 BnetSeq top_opts = visitTree (
943943 [&](auto & recurse, int level, const BnetPtr& node, int upstream_wl)
@@ -1124,7 +1124,7 @@ void Rebuffer::annotateTiming(const BnetPtr& tree)
11241124 double wire_res = wire_length * layer_res;
11251125 double wire_cap = wire_length * layer_cap;
11261126 FixedDelay wire_delay
1127- = FixedDelay (wire_res * (wire_cap / 2 + p->cap ()));
1127+ = FixedDelay (wire_res * (wire_cap / 2 + p->cap ()), resizer_ );
11281128 if (bnet->length () == 0 ) {
11291129 wire_res = 0 ;
11301130 wire_cap = 0 ;
@@ -1171,8 +1171,8 @@ FixedDelay Rebuffer::bufferDelay(LibertyCell* cell,
11711171 ArcDelay gate_delays[RiseFall::index_count];
11721172 Slew slews[RiseFall::index_count];
11731173 resizer_->gateDelays (output, load_cap, dcalc_ap, gate_delays, slews);
1174- delay
1175- = std::max<FixedDelay>( delay, FixedDelay (gate_delays[rf1->index ()]));
1174+ delay = std::max<FixedDelay>(
1175+ delay, FixedDelay (gate_delays[rf1->index ()], resizer_ ));
11761176 }
11771177 }
11781178
@@ -1192,7 +1192,8 @@ BnetPtr Rebuffer::addWire(const BnetPtr& p,
11921192 double wire_length = resizer_->dbuToMeters (z->length ());
11931193 double wire_res = wire_length * layer_res;
11941194 double wire_cap = wire_length * layer_cap;
1195- FixedDelay wire_delay = FixedDelay (wire_res * (wire_cap / 2 + p->cap ()));
1195+ FixedDelay wire_delay
1196+ = FixedDelay (wire_res * (wire_cap / 2 + p->cap ()), resizer_);
11961197
11971198 // account for wire delay
11981199 z->setDelay (wire_delay);
@@ -1435,7 +1436,7 @@ void Rebuffer::init()
14351436 cell->bufferPorts (in, out);
14361437 buffer_sizes_.push_back (BufferSize{
14371438 cell,
1438- FixedDelay (out->intrinsicDelay (sta_)),
1439+ FixedDelay (out->intrinsicDelay (sta_), resizer_ ),
14391440 /* margined_max_cap=*/ 0 .0f ,
14401441 out->driveResistance (),
14411442 });
@@ -2248,23 +2249,29 @@ void Rebuffer::fullyRebuffer(Pin* user_pin)
22482249 // computation of wire load, we are using pin position for the existing
22492250 // buffer, but instance position for the new buffer.)
22502251 //
2251- Delay relaxation
2252- = std::max<float >(0 .0f ,
2253- ((slackAtDriverPin (timing_tree).toSeconds ())
2254- - std::min (original_tree_slack_error, 0 .0f )))
2255- / 4 .0f
2256- + (std::max (drvr_gate_delay, 0 .0f )
2257- + criticalPathDelay (logger_, timing_tree).toSeconds ())
2258- * relaxation_factor_;
22592252
2260- FixedDelay target = slackAtDriverPin (timing_tree) - FixedDelay (relaxation);
2253+ FixedDelay target_slack = -FixedDelay::INF;
2254+
2255+ // Check the tree isn't fully unconstrained
2256+ if (timing_tree->slackTransition () != nullptr ) {
2257+ Delay relaxation
2258+ = std::max<float >(0 .0f ,
2259+ ((slackAtDriverPin (timing_tree).toSeconds ())
2260+ - std::min (original_tree_slack_error, 0 .0f )))
2261+ / 4 .0f
2262+ + (std::max (drvr_gate_delay, 0 .0f )
2263+ + criticalPathDelay (logger_, timing_tree).toSeconds ())
2264+ * relaxation_factor_;
2265+ target_slack
2266+ = slackAtDriverPin (timing_tree) - FixedDelay (relaxation, resizer_);
2267+ }
22612268
22622269 BnetPtr area_opt_tree = timing_tree;
22632270 {
22642271 ScopedTimer timer (logger_, ra_runtime);
22652272 for (int i = 0 ; i < 5 && area_opt_tree; i++) {
22662273 area_opt_tree
2267- = recoverArea (area_opt_tree, target , ((float ) (1 + i)) / 5 );
2274+ = recoverArea (area_opt_tree, target_slack , ((float ) (1 + i)) / 5 );
22682275 }
22692276 }
22702277
@@ -2459,7 +2466,8 @@ int Rebuffer::rebufferPin(const Pin* drvr_pin)
24592466 + criticalPathDelay (logger_, bnet).toSeconds ())
24602467 * relaxation_factor_;
24612468
2462- FixedDelay target = slackAtDriverPin (bnet) - FixedDelay (relaxation);
2469+ FixedDelay target
2470+ = slackAtDriverPin (bnet) - FixedDelay (relaxation, resizer_);
24632471
24642472 for (int i = 0 ; i < 5 && bnet; i++) {
24652473 bnet = recoverArea (bnet, target, ((float ) (1 + i)) / 5 );
0 commit comments