aboutsummaryrefslogtreecommitdiffstats
path: root/common/placer_heap.cc
diff options
context:
space:
mode:
authorKeith Rothman <537074+litghost@users.noreply.github.com>2021-02-26 11:37:27 -0800
committerKeith Rothman <537074+litghost@users.noreply.github.com>2021-02-26 11:40:58 -0800
commit77a5a60a66b0cfc1602edb61aadf392dc651bf46 (patch)
tree9ebd1ff8d35cc6d008d66b159709709747c4d6cd /common/placer_heap.cc
parent7878561970d27ff2fed73fe0909fa64320e34bc8 (diff)
downloadnextpnr-77a5a60a66b0cfc1602edb61aadf392dc651bf46.tar.gz
nextpnr-77a5a60a66b0cfc1602edb61aadf392dc651bf46.tar.bz2
nextpnr-77a5a60a66b0cfc1602edb61aadf392dc651bf46.zip
Fix latent bug with context locking in placer HeAP.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
Diffstat (limited to 'common/placer_heap.cc')
-rw-r--r--common/placer_heap.cc22
1 files changed, 12 insertions, 10 deletions
diff --git a/common/placer_heap.cc b/common/placer_heap.cc
index df1454e8..cea862af 100644
--- a/common/placer_heap.cc
+++ b/common/placer_heap.cc
@@ -49,6 +49,7 @@
#include "nextpnr.h"
#include "place_common.h"
#include "placer1.h"
+#include "scope_lock.h"
#include "timing.h"
#include "util.h"
@@ -147,7 +148,7 @@ class HeAPPlacer
{
auto startt = std::chrono::high_resolution_clock::now();
- ctx->lock();
+ nextpnr::ScopeLock<Context> lock(ctx);
place_constraints();
build_fast_bels();
seed_placement();
@@ -312,15 +313,6 @@ class HeAPPlacer
log_info("AP soln: %s -> %s\n", cell.first.c_str(ctx), ctx->nameOfBel(cell.second->bel));
}
- ctx->unlock();
- auto endtt = std::chrono::high_resolution_clock::now();
- log_info("HeAP Placer Time: %.02fs\n", std::chrono::duration<double>(endtt - startt).count());
- log_info(" of which solving equations: %.02fs\n", solve_time);
- log_info(" of which spreading cells: %.02fs\n", cl_time);
- log_info(" of which strict legalisation: %.02fs\n", sl_time);
-
- ctx->check();
-
bool any_bad_placements = false;
for (auto bel : ctx->getBels()) {
CellInfo *cell = ctx->getBoundBelCell(bel);
@@ -339,6 +331,16 @@ class HeAPPlacer
return false;
}
+ lock.unlock_early();
+
+ auto endtt = std::chrono::high_resolution_clock::now();
+ log_info("HeAP Placer Time: %.02fs\n", std::chrono::duration<double>(endtt - startt).count());
+ log_info(" of which solving equations: %.02fs\n", solve_time);
+ log_info(" of which spreading cells: %.02fs\n", cl_time);
+ log_info(" of which strict legalisation: %.02fs\n", sl_time);
+
+ ctx->check();
+
if (!placer1_refine(ctx, Placer1Cfg(ctx))) {
return false;
}