aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/placer_heap.cc18
-rw-r--r--common/timing.cc9
-rw-r--r--common/timing.h6
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 <typename T> 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<IdString, std::tuple<int, int>> 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<double>(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<CellPortKey> get_failing_eps(domain_id_t domain_pair, int count);
// print the critical path for an endpoint and domain pair