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,35 +398,35 @@ struct CriticalPath
// Segment type
enum class Type
{
CLK2CLK, // Clock to clock delay
CLK_SKEW, // Clock skew
CLK_TO_Q, // Clock-to-Q delay
SOURCE, // Delayless source
LOGIC, // Combinational logic delay
ROUTING, // Routing delay
SETUP, // Setup time in sink
HOLD // Hold time in sink
CLK_TO_CLK, // Clock to clock delay
CLK_SKEW, // Clock skew
CLK_TO_Q, // Clock-to-Q delay
SOURCE, // Delayless source
LOGIC, // Combinational logic delay
ROUTING, // Routing delay
SETUP, // Setup time in sink
HOLD // Hold time in sink
};
[[maybe_unused]] static const std::string type_to_str(Type typ)
{
switch (typ) {
case Type::CLK2CLK:
return "CLK2CLK";
case Type::CLK_TO_CLK:
return "clk-to-clk";
case Type::CLK_SKEW:
return "CLK_SKEW";
return "clk-skew";
case Type::CLK_TO_Q:
return "CLK_TO_Q";
return "clk-to-q";
case Type::SOURCE:
return "SOURCE";
return "source";
case Type::LOGIC:
return "LOGIC";
return "logic";
case Type::ROUTING:
return "ROUTING";
return "routing";
case Type::SETUP:
return "SETUP";
return "setup";
case Type::HOLD:
return "HOLD";
return "hold";
default:
log_error("Impossible Segment::Type");
}

View File

@ -79,20 +79,8 @@ static Json::array json_report_critical_paths(const Context *ctx)
auto segmentJson =
Json::object({{"delay", Json::array({minDelay, maxDelay})}, {"from", fromJson}, {"to", toJson}});
if (segment.type == CriticalPath::Segment::Type::CLK2CLK) {
segmentJson["type"] = "clk-to-clk";
} 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["type"] = CriticalPath::Segment::type_to_str(segment.type);
if (segment.type == CriticalPath::Segment::Type::ROUTING) {
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);
if (clock_delay != 0) {
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.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);

View File

@ -61,9 +61,9 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
source_entries.emplace_back(sourcelist.substr(prev, current - prev));
// Iterate and print our source list at the correct indentation level
log_info(" Defined in:\n");
log_info(" Defined in:\n");
for (auto entry : source_entries) {
log_info(" %s\n", entry.c_str());
log_info(" %s\n", entry.c_str());
}
};
@ -82,7 +82,7 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
return ctx->getDelayNS(d.maxDelay());
};
log_info(" type curr total\n");
log_info(" type curr total\n");
for (const auto &segment : path.segments) {
total += segment.delay;
@ -94,11 +94,11 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
segment.type == CriticalPath::Segment::Type::HOLD) {
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),
segment.to.second.c_str(ctx));
} 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) {
route_total = route_total + segment.delay;
@ -108,11 +108,11 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
auto driver_loc = ctx->getBelLocation(driver->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),
get_delay_ns(total), segment.net.c_str(ctx), driver_loc.x, driver_loc.y, sink_loc.x,
sink_loc.y);
log_info(" Sink %s.%s\n", segment.to.first.c_str(ctx),
log_info(" Sink %s.%s\n", segment.to.first.c_str(ctx),
segment.to.second.c_str(ctx));
const NetInfo *net = ctx->nets.at(segment.net).get();
@ -125,7 +125,7 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
auto driver_wire = ctx->getNetinfoSourceWire(net);
auto sink_wire = ctx->getNetinfoSinkWire(net, sink_ref, 0);
log_info(" prediction: %f ns estimate: %f ns\n",
log_info(" prediction: %f ns estimate: %f ns\n",
ctx->getDelayNS(ctx->predictArcDelay(net, sink_ref)),
ctx->getDelayNS(ctx->estimateDelay(driver_wire, sink_wire)));
auto cursor = sink_wire;
@ -241,7 +241,7 @@ static void log_fmax(Context *ctx, TimingResult &result, bool warn_on_failure)
bool has_clock_to_clock = false;
DelayPair clock_delay = DelayPair(0);
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;
clock_delay += seg.delay;
}