timing_log: Fix logging indendation to match master
timing: Disable clock_skew analysis by default
This commit is contained in:
parent
5488cd994b
commit
25d64b2105
@ -715,7 +715,8 @@ dict<domain_id_t, delay_t> TimingAnalyser::max_delay_by_domain_pairs()
|
|||||||
|
|
||||||
// walk back to startpoint
|
// walk back to startpoint
|
||||||
auto crit_path = walk_crit_path(domain_pair_id(launch_id, capture_id), ep.first, true);
|
auto crit_path = walk_crit_path(domain_pair_id(launch_id, capture_id), ep.first, true);
|
||||||
auto &sp = crit_path.back();
|
auto first_inp = crit_path.back();
|
||||||
|
const auto &sp = first_inp.cell->ports.at(first_inp.port).net->driver;
|
||||||
auto &sp_port = ports.at(CellPortKey{sp.cell->name, sp.port});
|
auto &sp_port = ports.at(CellPortKey{sp.cell->name, sp.port});
|
||||||
|
|
||||||
for (auto &fanin : sp_port.cell_arcs) {
|
for (auto &fanin : sp_port.cell_arcs) {
|
||||||
@ -877,9 +878,8 @@ std::vector<PortRef> TimingAnalyser::walk_crit_path(domain_id_t domain_pair, Cel
|
|||||||
// We store the reversed critical path as all input ports that lead to
|
// We store the reversed critical path as all input ports that lead to
|
||||||
// the timing startpoint.
|
// the timing startpoint.
|
||||||
auto is_input = portClass != TMG_CLOCK_INPUT && portClass != TMG_IGNORE && port.type == PortType::PORT_IN;
|
auto is_input = portClass != TMG_CLOCK_INPUT && portClass != TMG_IGNORE && port.type == PortType::PORT_IN;
|
||||||
is_startpoint = portClass == TMG_REGISTER_OUTPUT || portClass == TMG_STARTPOINT;
|
|
||||||
|
|
||||||
if (is_input || is_startpoint)
|
if (is_input)
|
||||||
crit_path_rev.emplace_back(PortRef{cell, port.name});
|
crit_path_rev.emplace_back(PortRef{cell, port.name});
|
||||||
|
|
||||||
if (!ports.at(cursor).arrival.count(dp.key.launch))
|
if (!ports.at(cursor).arrival.count(dp.key.launch))
|
||||||
@ -890,6 +890,7 @@ std::vector<PortRef> TimingAnalyser::walk_crit_path(domain_id_t domain_pair, Cel
|
|||||||
} else {
|
} else {
|
||||||
cursor = ports.at(cursor).arrival.at(dp.key.launch).bwd_min;
|
cursor = ports.at(cursor).arrival.at(dp.key.launch).bwd_min;
|
||||||
}
|
}
|
||||||
|
is_startpoint = portClass == TMG_REGISTER_OUTPUT || portClass == TMG_STARTPOINT;
|
||||||
} while (!is_startpoint);
|
} while (!is_startpoint);
|
||||||
|
|
||||||
return crit_path_rev;
|
return crit_path_rev;
|
||||||
@ -930,7 +931,8 @@ CriticalPath TimingAnalyser::build_critical_path_report(domain_id_t domain_pair,
|
|||||||
auto crit_path = boost::adaptors::reverse(crit_path_rev);
|
auto crit_path = boost::adaptors::reverse(crit_path_rev);
|
||||||
|
|
||||||
// Get timing and clocking info on the startpoint
|
// Get timing and clocking info on the startpoint
|
||||||
const auto &sp = crit_path.front();
|
auto first_inp = crit_path.front();
|
||||||
|
const auto &sp = first_inp.cell->ports.at(first_inp.port).net->driver;
|
||||||
const auto &sp_cell = sp.cell;
|
const auto &sp_cell = sp.cell;
|
||||||
const auto &sp_port = sp_cell->ports.at(sp.port);
|
const auto &sp_port = sp_cell->ports.at(sp.port);
|
||||||
int sp_clocks;
|
int sp_clocks;
|
||||||
@ -1037,8 +1039,7 @@ CriticalPath TimingAnalyser::build_critical_path_report(domain_id_t domain_pair,
|
|||||||
if (is_startpoint && register_start) {
|
if (is_startpoint && register_start) {
|
||||||
comb_delay = sp_clk_info.clockToQ;
|
comb_delay = sp_clk_info.clockToQ;
|
||||||
seg_logic.type = CriticalPath::Segment::Type::CLK_TO_Q;
|
seg_logic.type = CriticalPath::Segment::Type::CLK_TO_Q;
|
||||||
} else if (prev_port == driver.port) {
|
} else if (is_startpoint) {
|
||||||
// Case where we start with a STARTPOINT etc
|
|
||||||
comb_delay = DelayQuad(0);
|
comb_delay = DelayQuad(0);
|
||||||
seg_logic.type = CriticalPath::Segment::Type::SOURCE;
|
seg_logic.type = CriticalPath::Segment::Type::SOURCE;
|
||||||
} else {
|
} else {
|
||||||
|
@ -99,8 +99,8 @@ struct TimingAnalyser
|
|||||||
TimingResult &get_timing_result() { return result; }
|
TimingResult &get_timing_result() { return result; }
|
||||||
|
|
||||||
// Enable analysis of clock skew between FFs.
|
// Enable analysis of clock skew between FFs.
|
||||||
// Only do this after legal placement
|
bool with_clock_skew = false;
|
||||||
bool with_clock_skew = true;
|
|
||||||
// REMOVE ME once approved
|
// REMOVE ME once approved
|
||||||
delay_t clock_delay_fac = 100;
|
delay_t clock_delay_fac = 100;
|
||||||
|
|
||||||
|
@ -61,9 +61,9 @@ static void log_crit_paths(const Context *ctx, TimingResult &result)
|
|||||||
source_entries.emplace_back(sourcelist.substr(prev, current - prev));
|
source_entries.emplace_back(sourcelist.substr(prev, current - prev));
|
||||||
|
|
||||||
// Iterate and print our source list at the correct indentation level
|
// 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) {
|
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());
|
return ctx->getDelayNS(d.maxDelay());
|
||||||
};
|
};
|
||||||
|
|
||||||
log_info(" type curr total\n");
|
log_info(" type curr total name\n");
|
||||||
for (const auto &segment : path.segments) {
|
for (const auto &segment : path.segments) {
|
||||||
|
|
||||||
total += segment.delay;
|
total += segment.delay;
|
||||||
@ -94,7 +94,7 @@ 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("%10s % 5.2f % 5.2f %s.%s\n", CriticalPath::Segment::type_to_str(segment.type).c_str(),
|
log_info("%10s % 5.2f % 5.2f Source %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 ||
|
||||||
@ -108,11 +108,11 @@ 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("%10s % 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);
|
||||||
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));
|
segment.to.second.c_str(ctx));
|
||||||
|
|
||||||
const NetInfo *net = ctx->nets.at(segment.net).get();
|
const NetInfo *net = ctx->nets.at(segment.net).get();
|
||||||
|
Loading…
Reference in New Issue
Block a user