Skip to content

Commit aa8aa10

Browse files
authored
Merge pull request #7876 from The-OpenROAD-Project-staging/rsz-rebuffer-hotfix
rsz: Apply hotfix for rebuffer fatal
2 parents d9da99e + c81d5ba commit aa8aa10

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

src/rsz/src/BufferedNet.cc

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,33 @@ using std::max;
3737
using std::min;
3838
using utl::RSZ;
3939

40-
const FixedDelay FixedDelay::INF = FixedDelay(100.0f);
41-
const FixedDelay FixedDelay::ZERO = FixedDelay(0.0f);
42-
4340
static const char* to_string(BufferedNetType type);
4441

4542
////////////////////////////////////////////////////////////////
4643

44+
const FixedDelay FixedDelay::INF = FixedDelay(100.0f, nullptr);
45+
const FixedDelay FixedDelay::ZERO = FixedDelay(0.0f, nullptr);
46+
47+
FixedDelay::FixedDelay() : value_fs_(0)
48+
{
49+
}
50+
51+
FixedDelay::FixedDelay(sta::Delay float_value, Resizer* resizer)
52+
{
53+
if (resizer
54+
&& (float_value > (FixedDelay::INF).toSeconds()
55+
|| float_value < (-FixedDelay::INF).toSeconds())) {
56+
resizer->logger()->error(RSZ,
57+
1008,
58+
"FixedDelay conversion out of range: {}",
59+
delayAsString(float_value, resizer));
60+
}
61+
62+
value_fs_ = float_value * second_;
63+
}
64+
65+
////////////////////////////////////////////////////////////////
66+
4767
// load
4868
BufferedNet::BufferedNet(const BufferedNetType type,
4969
const Point& location,

src/rsz/src/BufferedNet.hh

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,9 @@ using Requireds = std::array<Required, RiseFall::index_count>;
4444
class FixedDelay
4545
{
4646
public:
47-
explicit FixedDelay(sta::Delay float_value)
48-
{
49-
value_fs_ = float_value * second_;
50-
}
51-
52-
sta::Delay toSeconds() { return ((float) value_fs_) / second_; }
47+
FixedDelay();
48+
explicit FixedDelay(sta::Delay float_value, Resizer* resizer);
49+
sta::Delay toSeconds() const { return ((float) value_fs_) / second_; }
5350

5451
// 100 seconds
5552
static const FixedDelay INF;
@@ -94,7 +91,7 @@ class FixedDelay
9491
private:
9592
static FixedDelay fromFs(int64_t v)
9693
{
97-
FixedDelay ret(0);
94+
FixedDelay ret;
9895
ret.value_fs_ = v;
9996
return ret;
10097
}

src/rsz/src/Rebuffer.cc

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

285285
std::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

Comments
 (0)