From ebc2527368d920ea3c40a9ca83f73df242785044 Mon Sep 17 00:00:00 2001 From: gatecat Date: Thu, 4 Mar 2021 10:14:20 +0000 Subject: timing: Use new engine for HeAP Signed-off-by: gatecat --- common/placer_heap.cc | 18 +++++++++--------- common/timing.cc | 9 ++++++--- common/timing.h | 6 ++++-- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/common/placer_heap.cc b/common/placer_heap.cc index eb931a37..a19d68fa 100644 --- a/common/placer_heap.cc +++ b/common/placer_heap.cc @@ -139,9 +139,11 @@ template struct EquationSystem class HeAPPlacer { public: - HeAPPlacer(Context *ctx, PlacerHeapCfg cfg) : ctx(ctx), cfg(cfg), fast_bels(ctx, /*check_bel_available=*/true, -1) + HeAPPlacer(Context *ctx, PlacerHeapCfg cfg) + : ctx(ctx), cfg(cfg), fast_bels(ctx, /*check_bel_available=*/true, -1), tmg(ctx) { Eigen::initParallel(); + tmg.setup(); } bool place() @@ -269,7 +271,7 @@ class HeAPPlacer // Update timing weights if (cfg.timing_driven) - get_criticalities(ctx, &net_crit); + tmg.run(); if (legal_hpwl < best_hpwl) { best_hpwl = legal_hpwl; @@ -355,6 +357,8 @@ class HeAPPlacer FastBels fast_bels; std::unordered_map> bel_types; + TimingAnalyser tmg; + struct BoundingBox { // Actual bounding box @@ -392,8 +396,6 @@ class HeAPPlacer // Performance counting double solve_time = 0, cl_time = 0, sl_time = 0; - NetCriticalityMap net_crit; - // Place cells with the BEL attribute set to constrain them void place_constraints() { @@ -736,11 +738,9 @@ class HeAPPlacer std::max(1, (yaxis ? cfg.hpwl_scale_y : cfg.hpwl_scale_x) * std::abs(o_pos - this_pos))); - if (user_idx != -1 && net_crit.count(ni->name)) { - auto &nc = net_crit.at(ni->name); - if (user_idx < int(nc.criticality.size())) - weight *= (1.0 + cfg.timingWeight * - std::pow(nc.criticality.at(user_idx), cfg.criticalityExponent)); + if (user_idx != -1) { + weight *= (1.0 + cfg.timingWeight * std::pow(tmg.get_criticality(CellPortKey(port)), + cfg.criticalityExponent)); } // If cell 0 is not fixed, it will stamp +w on its equation and -w on the other end's equation, diff --git a/common/timing.cc b/common/timing.cc index 5eae6db3..f4c0d297 100644 --- a/common/timing.cc +++ b/common/timing.cc @@ -34,16 +34,19 @@ void TimingAnalyser::setup() { init_ports(); get_cell_delays(); - get_route_delays(); topo_sort(); setup_port_domains(); + run(); +} + +void TimingAnalyser::run() +{ reset_times(); + get_route_delays(); walk_forward(); walk_backward(); compute_slack(); compute_criticality(); - print_fmax(); - print_report(); } void TimingAnalyser::init_ports() diff --git a/common/timing.h b/common/timing.h index 6928b11f..b7880667 100644 --- a/common/timing.h +++ b/common/timing.h @@ -127,6 +127,10 @@ struct TimingAnalyser public: TimingAnalyser(Context *ctx) : ctx(ctx){}; void setup(); + void run(); + void print_report(); + + float get_criticality(CellPortKey port) const { return ports.at(port).worst_crit; } bool setup_only = false; @@ -146,8 +150,6 @@ struct TimingAnalyser void compute_criticality(); void print_fmax(); - void print_report(); - // get the N most failing endpoints for a given domain pair std::vector get_failing_eps(domain_id_t domain_pair, int count); // print the critical path for an endpoint and domain pair -- cgit v1.2.3