diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-28 13:43:55 +0200 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2019-06-28 13:43:55 +0200 |
commit | 831c7f2ef1dce44e31f986ee591e9aa6441d9a6e (patch) | |
tree | a62fe404c3a231c6659945a139d0e286aa9ea029 | |
parent | be47fc3e9a81a4890b05223ae18803cb07674dc9 (diff) | |
download | nextpnr-831c7f2ef1dce44e31f986ee591e9aa6441d9a6e.tar.gz nextpnr-831c7f2ef1dce44e31f986ee591e9aa6441d9a6e.tar.bz2 nextpnr-831c7f2ef1dce44e31f986ee591e9aa6441d9a6e.zip |
Speedup critical path
-rw-r--r-- | common/placer1.cc | 17 | ||||
-rw-r--r-- | common/placer1.h | 2 | ||||
-rw-r--r-- | common/placer_heap.cc | 3 | ||||
-rw-r--r-- | common/placer_heap.h | 1 |
4 files changed, 14 insertions, 9 deletions
diff --git a/common/placer1.cc b/common/placer1.cc index 7ab454c7..cb7ae847 100644 --- a/common/placer1.cc +++ b/common/placer1.cc @@ -219,7 +219,7 @@ class SAPlacer if ((placed_cells - constr_placed_cells) % 500 != 0) log_info(" initial placement placed %d/%d cells\n", int(placed_cells - constr_placed_cells), int(autoplaced.size())); - if (cfg.budgetBased && ctx->setting<int>("slack_redist_iter") > 0) + if (cfg.budgetBased && cfg.slack_redist_iter > 0) assign_budget(ctx); ctx->yield(); auto iplace_end = std::chrono::high_resolution_clock::now(); @@ -370,17 +370,16 @@ class SAPlacer ctx->shuffle(autoplaced); // Legalisation is a big change so force a slack redistribution here - if (ctx->setting<int>("slack_redist_iter") > 0 && cfg.budgetBased) + if (cfg.slack_redist_iter > 0 && cfg.budgetBased) assign_budget(ctx, true /* quiet */); } require_legal = false; - } else if (cfg.budgetBased && ctx->setting<int>("slack_redist_iter") > 0 && - iter % ctx->setting<int>("slack_redist_iter") == 0) { + } else if (cfg.budgetBased && cfg.slack_redist_iter > 0 && iter % cfg.slack_redist_iter == 0) { assign_budget(ctx, true /* quiet */); } // Invoke timing analysis to obtain criticalities - if (!cfg.budgetBased && ctx->setting<bool>("timing_driven")) + if (!cfg.budgetBased && cfg.timing_driven) get_criticalities(ctx, &net_crit); // Need to rebuild costs after criticalities change setup_costs(); @@ -805,7 +804,7 @@ class SAPlacer if (ignore_net(ni)) continue; net_bounds[ni->udata] = get_net_bounds(ni); - if (ctx->setting<bool>("timing_driven") && int(ni->users.size()) < cfg.timingFanoutThresh) + if (cfg.timing_driven && int(ni->users.size()) < cfg.timingFanoutThresh) for (size_t i = 0; i < ni->users.size(); i++) net_arc_tcost[ni->udata][i] = get_timing_cost(ni, i); } @@ -1022,7 +1021,7 @@ class SAPlacer } } - if (ctx->setting<bool>("timing_driven") && int(pn->users.size()) < cfg.timingFanoutThresh) { + if (cfg.timing_driven && int(pn->users.size()) < cfg.timingFanoutThresh) { // Output ports - all arcs change timing if (port.second.type == PORT_OUT) { int cc; @@ -1062,7 +1061,7 @@ class SAPlacer if (md.already_bounds_changed_x[bc] == MoveChangeData::NO_CHANGE) md.wirelen_delta += md.new_net_bounds[bc].hpwl() - net_bounds[bc].hpwl(); - if (ctx->setting<bool>("timing_driven")) { + if (cfg.timing_driven) { for (const auto &tc : md.changed_arcs) { double old_cost = net_arc_tcost.at(tc.first).at(tc.second); double new_cost = get_timing_cost(net_by_udata.at(tc.first), tc.second); @@ -1139,6 +1138,8 @@ Placer1Cfg::Placer1Cfg(Context *ctx) budgetBased = ctx->setting<bool>("placer1/budgetBased", false); startTemp = ctx->setting<float>("placer1/startTemp", 1); timingFanoutThresh = std::numeric_limits<int>::max(); + timing_driven = ctx->setting<bool>("timing_driven"); + slack_redist_iter = ctx->setting<int>("slack_redist_iter"); } bool placer1(Context *ctx, Placer1Cfg cfg) diff --git a/common/placer1.h b/common/placer1.h index 08edb2c4..1356db3e 100644 --- a/common/placer1.h +++ b/common/placer1.h @@ -32,6 +32,8 @@ struct Placer1Cfg bool budgetBased; float startTemp; int timingFanoutThresh; + bool timing_driven; + int slack_redist_iter; }; extern bool placer1(Context *ctx, Placer1Cfg cfg); diff --git a/common/placer_heap.cc b/common/placer_heap.cc index 7b72200a..cd800085 100644 --- a/common/placer_heap.cc +++ b/common/placer_heap.cc @@ -234,7 +234,7 @@ class HeAPPlacer std::chrono::duration<double>(run_stopt - run_startt).count()); } - if (ctx->setting<bool>("timing_driven")) + if (cfg.timing_driven) get_criticalities(ctx, &net_crit); if (legal_hpwl < best_hpwl) { @@ -1521,6 +1521,7 @@ PlacerHeapCfg::PlacerHeapCfg(Context *ctx) alpha = ctx->setting<float>("placerHeap/alpha", 0.1); criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2); timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10); + timing_driven = ctx->setting<bool>("timing_driven"); } NEXTPNR_NAMESPACE_END diff --git a/common/placer_heap.h b/common/placer_heap.h index 9b1c52cb..a018aef8 100644 --- a/common/placer_heap.h +++ b/common/placer_heap.h @@ -38,6 +38,7 @@ struct PlacerHeapCfg float alpha; float criticalityExponent; float timingWeight; + bool timing_driven; std::unordered_set<IdString> ioBufTypes; }; |