mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-05 21:53:24 +00:00
sta: more graceful when maxbit is not an endpoint, will still print path
This commit is contained in:
parent
72d73fe4d0
commit
cf6b60f79c
2 changed files with 32 additions and 17 deletions
|
@ -171,10 +171,10 @@ struct StaWorker
|
||||||
|
|
||||||
data[dst_bit].backtrack = b;
|
data[dst_bit].backtrack = b;
|
||||||
data[dst_bit].src_port = std::get<2>(d);
|
data[dst_bit].src_port = std::get<2>(d);
|
||||||
}
|
|
||||||
auto it = endpoints.find(dst_bit);
|
auto it = endpoints.find(dst_bit);
|
||||||
if (it != endpoints.end()) {
|
if (it != endpoints.end())
|
||||||
new_arrival += it->second.required;
|
new_arrival += it->second.required;
|
||||||
if (new_arrival > maxarrival) {
|
if (new_arrival > maxarrival) {
|
||||||
maxarrival = new_arrival;
|
maxarrival = new_arrival;
|
||||||
maxbit = dst_bit;
|
maxbit = dst_bit;
|
||||||
|
@ -185,26 +185,26 @@ struct StaWorker
|
||||||
|
|
||||||
log("Latest arrival time in '%s' is %d:\n", log_id(module), maxarrival);
|
log("Latest arrival time in '%s' is %d:\n", log_id(module), maxarrival);
|
||||||
auto b = maxbit;
|
auto b = maxbit;
|
||||||
const auto &e = endpoints.at(maxbit);
|
auto it = endpoints.find(maxbit);
|
||||||
if (e.sink)
|
if (it != endpoints.end() && it->second.sink)
|
||||||
log(" %6d %s (%s.%s)\n", maxarrival, log_id(e.sink), log_id(e.sink->type), log_id(e.port));
|
log(" %6d %s (%s.%s)\n", maxarrival, log_id(it->second.sink), log_id(it->second.sink->type), log_id(it->second.port));
|
||||||
else if (b.wire->port_output)
|
else {
|
||||||
log(" %6d (%s)\n", maxarrival, "<primary output>");
|
log(" %6d (%s)\n", maxarrival, b.wire->port_output ? "<primary output>" : "<unknown>");
|
||||||
else
|
log_warning("Critical-path does not terminate in a recognised endpoint.\n");
|
||||||
log_abort();
|
}
|
||||||
auto it = data.find(b);
|
auto jt = data.find(b);
|
||||||
while (it != data.end()) {
|
while (jt != data.end()) {
|
||||||
int arrival = b.wire->get_intvec_attribute(ID(sta_arrival))[b.offset];
|
int arrival = b.wire->get_intvec_attribute(ID(sta_arrival))[b.offset];
|
||||||
if (it->second.driver) {
|
if (jt->second.driver) {
|
||||||
log(" %s\n", log_signal(b));
|
log(" %s\n", log_signal(b));
|
||||||
log(" %6d %s (%s.%s->%s)\n", arrival, log_id(it->second.driver), log_id(it->second.driver->type), log_id(it->second.src_port), log_id(it->second.dst_port));
|
log(" %6d %s (%s.%s->%s)\n", arrival, log_id(jt->second.driver), log_id(jt->second.driver->type), log_id(jt->second.src_port), log_id(jt->second.dst_port));
|
||||||
}
|
}
|
||||||
else if (b.wire->port_input)
|
else if (b.wire->port_input)
|
||||||
log(" %6d %s (%s)\n", arrival, log_signal(b), "<primary input>");
|
log(" %6d %s (%s)\n", arrival, log_signal(b), "<primary input>");
|
||||||
else
|
else
|
||||||
log_abort();
|
log_abort();
|
||||||
b = it->second.backtrack;
|
b = jt->second.backtrack;
|
||||||
it = data.find(b);
|
jt = data.find(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, unsigned> arrival_histogram;
|
std::map<int, unsigned> arrival_histogram;
|
||||||
|
|
15
tests/various/sta.ys
Normal file
15
tests/various/sta.ys
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
read_verilog -specify <<EOT
|
||||||
|
module buffer(input i, output o);
|
||||||
|
specify
|
||||||
|
(i => o) = 10;
|
||||||
|
endspecify
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module top(input i);
|
||||||
|
wire w;
|
||||||
|
buffer b(.i(i), .o(w));
|
||||||
|
endmodule
|
||||||
|
EOT
|
||||||
|
|
||||||
|
logger -expect warning "Critical-path does not terminate in a recognised endpoint\." 1
|
||||||
|
sta
|
Loading…
Add table
Add a link
Reference in a new issue