aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/placer_heap.cc12
-rw-r--r--ecp5/arch.cc2
-rw-r--r--ecp5/archdefs.h14
3 files changed, 22 insertions, 6 deletions
diff --git a/common/placer_heap.cc b/common/placer_heap.cc
index d0771fc3..af073873 100644
--- a/common/placer_heap.cc
+++ b/common/placer_heap.cc
@@ -187,7 +187,7 @@ class HeAPPlacer
heap_runs.push_back(std::unordered_set<PartitionId>{partition});
all_partitions.insert(partition);
}
- partition_count[cell->type]++;
+ partition_count[partition]++;
}
// If more than 98% of cells are one cell type, always solve all at once
// Otherwise, follow full HeAP strategy of rotate&all
@@ -252,8 +252,10 @@ class HeAPPlacer
legal_hpwl = total_hpwl();
auto run_stopt = std::chrono::high_resolution_clock::now();
+
+ IdString partition_name = ctx->getPartitionName(*run.begin());
log_info(" at iteration #%d, type %s: wirelen solved = %d, spread = %d, legal = %d; time = %.02fs\n",
- iter + 1, (run.size() > 1 ? "ALL" : run.begin()->c_str(ctx)), int(solved_hpwl),
+ iter + 1, (run.size() > 1 ? "ALL" : partition_name.c_str(ctx)), int(solved_hpwl),
int(spread_hpwl), int(legal_hpwl),
std::chrono::duration<double>(run_stopt - run_startt).count());
}
@@ -558,7 +560,7 @@ class HeAPPlacer
}
// Setup the cells to be solved, returns the number of rows
- int setup_solve_cells(std::unordered_set<IdString> *celltypes = nullptr)
+ int setup_solve_cells(std::unordered_set<PartitionId> *partitions = nullptr)
{
int row = 0;
solve_cells.clear();
@@ -567,7 +569,7 @@ class HeAPPlacer
cell.second->udata = dont_solve;
// Then update cells to be placed, which excludes cell children
for (auto cell : place_cells) {
- if (celltypes && !celltypes->count(cell->type))
+ if (partitions && !partitions->count(ctx->getPartitionForCellType(cell->type)))
continue;
cell->udata = row++;
solve_cells.push_back(cell);
@@ -958,7 +960,7 @@ class HeAPPlacer
if (vc->region != nullptr && vc->region->constr_bels && !vc->region->bels.count(target))
goto fail;
CellInfo *bound;
- if (target == BelId() || ctx->isValidBelForCellType(vc->type, target))
+ if (target == BelId() || !ctx->isValidBelForCellType(vc->type, target))
goto fail;
bound = ctx->getBoundBelCell(target);
// Chains cannot overlap
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index 4368f0d0..b40b0002 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -126,7 +126,7 @@ Arch::Arch(ArchArgs args) : args(args)
PartitionId partition;
partition.name = bel_type;
- partitions.push_back(partitions);
+ partitions.push_back(partition);
}
}
diff --git a/ecp5/archdefs.h b/ecp5/archdefs.h
index b0e01e4d..5bfe13d2 100644
--- a/ecp5/archdefs.h
+++ b/ecp5/archdefs.h
@@ -131,6 +131,10 @@ struct PartitionId {
bool operator==(const PartitionId &other) const { return (name == other.name); }
bool operator!=(const PartitionId &other) const { return (name != other.name); }
+ bool operator<(const PartitionId &other) const
+ {
+ return name < other.name;
+ }
};
struct GroupId
@@ -269,4 +273,14 @@ template <> struct hash<NEXTPNR_NAMESPACE_PREFIX DecalId>
}
};
+template <> struct hash<NEXTPNR_NAMESPACE_PREFIX PartitionId>
+{
+ std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX PartitionId &partition) const noexcept
+ {
+ std::size_t seed = 0;
+ boost::hash_combine(seed, hash<NEXTPNR_NAMESPACE_PREFIX IdString>()(partition.name));
+ return seed;
+ }
+};
+
} // namespace std