diff options
author | David Shah <davey1576@gmail.com> | 2018-08-03 18:14:09 +0200 |
---|---|---|
committer | David Shah <davey1576@gmail.com> | 2018-08-03 18:14:09 +0200 |
commit | 4a751d9aafa0de4f64960bf7e9f16400319259ef (patch) | |
tree | cf029a91ede496085b43c0b6c4144e5543274057 /common | |
parent | aa8435df218de50825bdcbcfe4ee88f26c3ff836 (diff) | |
download | nextpnr-4a751d9aafa0de4f64960bf7e9f16400319259ef.tar.gz nextpnr-4a751d9aafa0de4f64960bf7e9f16400319259ef.tar.bz2 nextpnr-4a751d9aafa0de4f64960bf7e9f16400319259ef.zip |
Add distance moved metrics, changing heuristics
Signed-off-by: David Shah <davey1576@gmail.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/place_common.cc | 30 | ||||
-rw-r--r-- | common/placer1.cc | 2 |
2 files changed, 31 insertions, 1 deletions
diff --git a/common/place_common.cc b/common/place_common.cc index c41f0b4e..dff989bf 100644 --- a/common/place_common.cc +++ b/common/place_common.cc @@ -425,6 +425,34 @@ class ConstraintLegaliseWorker print_chain(child, depth + 1); } + void print_stats(const char *point) + { + float distance_sum = 0; + float max_distance = 0; + int moved_cells = 0; + int unplaced_cells = 0; + for (auto orig : oldLocations) { + if (ctx->cells.at(orig.first)->bel == BelId()) { + unplaced_cells++; + continue; + } + Loc newLoc = ctx->getBelLocation(ctx->cells.at(orig.first)->bel); + if (newLoc != orig.second) { + float distance = std::sqrt(std::pow(newLoc.x - orig.second.x, 2) + pow(newLoc.y - orig.second.y, 2)); + moved_cells++; + distance_sum += distance; + if (distance > max_distance) + max_distance = distance; + } + } + log_info(" moved %d cells, %d unplaced (after %s)\n", moved_cells, unplaced_cells, point); + if (moved_cells > 0) { + log_info(" average distance %f\n", (distance_sum / moved_cells)); + log_info(" maximum distance %f\n", max_distance); + } + } + + bool legalise_constraints() { log_info("Legalising relative constraints...\n"); @@ -440,6 +468,7 @@ class ConstraintLegaliseWorker return false; } } + print_stats("after legalising chains"); for (auto rippedCell : rippedCells) { bool res = place_single_cell(ctx, ctx->cells.at(rippedCell).get(), true); if (!res) { @@ -448,6 +477,7 @@ class ConstraintLegaliseWorker return false; } } + print_stats("after replacing ripped up cells"); for (auto cell : sorted(ctx->cells)) if (get_constraints_distance(ctx, cell.second) != 0) log_error("constraint satisfaction check failed for cell '%s' at Bel '%s'\n", cell.first.c_str(ctx), diff --git a/common/placer1.cc b/common/placer1.cc index 673e304f..6da8608a 100644 --- a/common/placer1.cc +++ b/common/placer1.cc @@ -395,7 +395,7 @@ private: if (other != IdString()) new_dist += get_constraints_distance(ctx, other_cell); delta = new_metric - curr_metric; - delta += (1 / temp) * (new_dist - old_dist); + delta += (10 / temp) * (new_dist - old_dist); n_move++; // SA acceptance criterea if (delta < 0 || (temp > 1e-6 && (ctx->rng() / float(0x3fffffff)) <= std::exp(-delta / temp))) { |