report: Handle new segment types
timing_log: Use common segment type strings
This commit is contained in:
parent
3b7fec8c4f
commit
eb0bf9ea9c
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user