report: Handle new segment types

timing_log: Use common segment type strings
This commit is contained in:
Rowan Goemans 2024-09-17 16:08:00 +02:00 committed by myrtle
parent 3b7fec8c4f
commit eb0bf9ea9c
4 changed files with 29 additions and 41 deletions

View File

@ -398,7 +398,7 @@ struct CriticalPath
// Segment type // Segment type
enum class Type enum class Type
{ {
CLK2CLK, // Clock to clock delay CLK_TO_CLK, // Clock to clock delay
CLK_SKEW, // Clock skew CLK_SKEW, // Clock skew
CLK_TO_Q, // Clock-to-Q delay CLK_TO_Q, // Clock-to-Q delay
SOURCE, // Delayless source SOURCE, // Delayless source
@ -411,22 +411,22 @@ struct CriticalPath
[[maybe_unused]] static const std::string type_to_str(Type typ) [[maybe_unused]] static const std::string type_to_str(Type typ)
{ {
switch (typ) { switch (typ) {
case Type::CLK2CLK: case Type::CLK_TO_CLK:
return "CLK2CLK"; return "clk-to-clk";
case Type::CLK_SKEW: case Type::CLK_SKEW:
return "CLK_SKEW"; return "clk-skew";
case Type::CLK_TO_Q: case Type::CLK_TO_Q:
return "CLK_TO_Q"; return "clk-to-q";
case Type::SOURCE: case Type::SOURCE:
return "SOURCE"; return "source";
case Type::LOGIC: case Type::LOGIC:
return "LOGIC"; return "logic";
case Type::ROUTING: case Type::ROUTING:
return "ROUTING"; return "routing";
case Type::SETUP: case Type::SETUP:
return "SETUP"; return "setup";
case Type::HOLD: case Type::HOLD:
return "HOLD"; return "hold";
default: default:
log_error("Impossible Segment::Type"); log_error("Impossible Segment::Type");
} }

View File

@ -79,20 +79,8 @@ static Json::array json_report_critical_paths(const Context *ctx)
auto segmentJson = auto segmentJson =
Json::object({{"delay", Json::array({minDelay, maxDelay})}, {"from", fromJson}, {"to", toJson}}); Json::object({{"delay", Json::array({minDelay, maxDelay})}, {"from", fromJson}, {"to", toJson}});
if (segment.type == CriticalPath::Segment::Type::CLK2CLK) { segmentJson["type"] = CriticalPath::Segment::type_to_str(segment.type);
segmentJson["type"] = "clk-to-clk"; if (segment.type == CriticalPath::Segment::Type::ROUTING) {
} else if (segment.type == CriticalPath::Segment::Type::CLK_SKEW) {
segmentJson["type"] = "clk-skew";
} else if (segment.type == CriticalPath::Segment::Type::CLK_TO_Q) {
segmentJson["type"] = "clk-to-q";
} else if (segment.type == CriticalPath::Segment::Type::SOURCE) {
segmentJson["type"] = "source";
} else if (segment.type == CriticalPath::Segment::Type::LOGIC) {
segmentJson["type"] = "logic";
} else if (segment.type == CriticalPath::Segment::Type::SETUP) {
segmentJson["type"] = "setup";
} else if (segment.type == CriticalPath::Segment::Type::ROUTING) {
segmentJson["type"] = "routing";
segmentJson["net"] = segment.net.c_str(ctx); segmentJson["net"] = segment.net.c_str(ctx);
} }

View File

@ -950,7 +950,7 @@ CriticalPath TimingAnalyser::build_critical_path_report(domain_id_t domain_pair,
delay_t clock_delay = clock_delays.at(clock_pair); delay_t clock_delay = clock_delays.at(clock_pair);
if (clock_delay != 0) { if (clock_delay != 0) {
CriticalPath::Segment seg_c2c; CriticalPath::Segment seg_c2c;
seg_c2c.type = CriticalPath::Segment::Type::CLK2CLK; seg_c2c.type = CriticalPath::Segment::Type::CLK_TO_CLK;
seg_c2c.delay = DelayPair(clock_delay); seg_c2c.delay = DelayPair(clock_delay);
seg_c2c.from = std::make_pair(sp_cell->name, sp_clk_info.clock_port); seg_c2c.from = std::make_pair(sp_cell->name, sp_clk_info.clock_port);
seg_c2c.to = std::make_pair(ep_cell->name, ep_clk_info.clock_port); seg_c2c.to = std::make_pair(ep_cell->name, ep_clk_info.clock_port);

View File

@ -94,11 +94,11 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
segment.type == CriticalPath::Segment::Type::HOLD) { segment.type == CriticalPath::Segment::Type::HOLD) {
logic_total += segment.delay; logic_total += segment.delay;
log_info("%8s % 5.2f % 5.2f %s.%s\n", CriticalPath::Segment::type_to_str(segment.type).c_str(), log_info("%10s % 5.2f % 5.2f %s.%s\n", CriticalPath::Segment::type_to_str(segment.type).c_str(),
get_delay_ns(segment.delay), get_delay_ns(total), segment.to.first.c_str(ctx), get_delay_ns(segment.delay), get_delay_ns(total), segment.to.first.c_str(ctx),
segment.to.second.c_str(ctx)); segment.to.second.c_str(ctx));
} else if (segment.type == CriticalPath::Segment::Type::ROUTING || } else if (segment.type == CriticalPath::Segment::Type::ROUTING ||
segment.type == CriticalPath::Segment::Type::CLK2CLK || segment.type == CriticalPath::Segment::Type::CLK_TO_CLK ||
segment.type == CriticalPath::Segment::Type::CLK_SKEW) { segment.type == CriticalPath::Segment::Type::CLK_SKEW) {
route_total = route_total + segment.delay; route_total = route_total + segment.delay;
@ -108,7 +108,7 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
auto driver_loc = ctx->getBelLocation(driver->bel); auto driver_loc = ctx->getBelLocation(driver->bel);
auto sink_loc = ctx->getBelLocation(sink->bel); auto sink_loc = ctx->getBelLocation(sink->bel);
log_info("%8s % 5.2f % 5.2f Net %s (%d,%d) -> (%d,%d)\n", log_info("%10s % 5.2f % 5.2f Net %s (%d,%d) -> (%d,%d)\n",
CriticalPath::Segment::type_to_str(segment.type).c_str(), get_delay_ns(segment.delay), CriticalPath::Segment::type_to_str(segment.type).c_str(), get_delay_ns(segment.delay),
get_delay_ns(total), segment.net.c_str(ctx), driver_loc.x, driver_loc.y, sink_loc.x, get_delay_ns(total), segment.net.c_str(ctx), driver_loc.x, driver_loc.y, sink_loc.x,
sink_loc.y); sink_loc.y);
@ -241,7 +241,7 @@ static void log_fmax(Context *ctx, TimingResult &result, bool warn_on_failure)
bool has_clock_to_clock = false; bool has_clock_to_clock = false;
DelayPair clock_delay = DelayPair(0); DelayPair clock_delay = DelayPair(0);
for (const auto &seg : report.segments) { for (const auto &seg : report.segments) {
if (seg.type == CriticalPath::Segment::Type::CLK2CLK) { if (seg.type == CriticalPath::Segment::Type::CLK_TO_CLK) {
has_clock_to_clock = true; has_clock_to_clock = true;
clock_delay += seg.delay; clock_delay += seg.delay;
} }