HeAP: Use for ECP5 as well as iCE40

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2019-01-25 18:26:14 +00:00
parent ba1e05f16b
commit 8295f997ae
2 changed files with 22 additions and 16 deletions

View File

@ -136,12 +136,10 @@ class HeAPPlacer
setup_solve_cells();
auto solve_startt = std::chrono::high_resolution_clock::now();
std::thread xaxis([&](){build_solve_direction(false, -1);});
std::thread yaxis([&](){build_solve_direction(true, -1);});
build_solve_direction(true, -1);
xaxis.join();
auto solve_endt = std::chrono::high_resolution_clock::now();
solve_time += std::chrono::duration<double>(solve_endt - solve_startt).count();
xaxis.join();
yaxis.join();
update_all_chains();
@ -161,13 +159,23 @@ class HeAPPlacer
std::vector<std::unordered_set<IdString>> heap_runs;
std::unordered_set<IdString> all_celltypes;
std::unordered_map<IdString, int> ct_count;
for (auto cell : place_cells) {
if (!all_celltypes.count(cell->type)) {
heap_runs.push_back(std::unordered_set<IdString>{cell->type});
all_celltypes.insert(cell->type);
}
ct_count[cell->type]++;
}
// If more than 98% of cells are one cell type, always solve all at once
// Otherwise, follow full HeAP strategy of rotate&all
for (auto &c : ct_count)
if (c.second >= 0.98 * int(place_cells.size())) {
heap_runs.clear();
break;
}
heap_runs.push_back(all_celltypes);
while (!valid || (stalled < 5 && (solved_hpwl <= legal_hpwl * 0.8))) {
@ -177,6 +185,8 @@ class HeAPPlacer
valid = true;
}
for (auto &run : heap_runs) {
auto run_startt = std::chrono::high_resolution_clock::now();
setup_solve_cells(&run);
if (solve_cells.empty())
continue;
@ -188,9 +198,8 @@ class HeAPPlacer
build_solve_direction(true, (iter == 0) ? -1 : iter);
} else {
std::thread xaxis([&](){build_solve_direction(false, (iter == 0) ? -1 : iter);});
std::thread yaxis([&](){build_solve_direction(true, (iter == 0) ? -1 : iter);});
build_solve_direction(true, (iter == 0) ? -1 : iter);
xaxis.join();
yaxis.join();
}
auto solve_endt = std::chrono::high_resolution_clock::now();
solve_time += std::chrono::duration<double>(solve_endt - solve_startt).count();
@ -210,6 +219,8 @@ class HeAPPlacer
legal_hpwl = total_hpwl();
log_info("Legalised HPWL = %d (%s)\n", int(legal_hpwl), valid ? "valid" : "invalid");
auto run_stopt = std::chrono::high_resolution_clock::now();
log_info(" %s runtime: %.02fs\n",(run.size() > 1 ? "ALL" : run.begin()->c_str(ctx)), std::chrono::duration<double>(run_stopt - run_startt).count());
}
@ -473,7 +484,7 @@ class HeAPPlacer
cell_locs[cell.first].locked = false;
cell_locs[cell.first].global = ctx->getBelGlobalBuf(bel);
// FIXME
if (has_connectivity(cell.second) && cell.second->type != ctx->id("SB_IO")) {
if (has_connectivity(cell.second) && cell.second->type != ctx->id("SB_IO")&& cell.second->type != ctx->id("TRELLIS_IO")) {
place_cells.push_back(ci);
placed = true;
} else {
@ -617,7 +628,7 @@ class HeAPPlacer
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 + 20 * std::pow(nc.criticality.at(user_idx), 2));
weight *= (1.0 + 10 * std::pow(nc.criticality.at(user_idx), 2));
}
// If cell 0 is not fixed, it will stamp +w on its equation and -w on the other end's equation,
@ -632,7 +643,7 @@ class HeAPPlacer
});
}
if (iter != -1) {
const float alpha = 0.2;
const float alpha = 0.1;
for (size_t row = 0; row < solve_cells.size(); row++) {
int l_pos = legal_pos(solve_cells.at(row));
int c_pos = cell_pos(solve_cells.at(row));

View File

@ -23,6 +23,7 @@
#include <boost/range/adaptor/reversed.hpp>
#include <cmath>
#include <cstring>
#include "placer_heap.h"
#include "gfx.h"
#include "globals.h"
#include "log.h"
@ -504,13 +505,7 @@ bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay
// -----------------------------------------------------------------------
bool Arch::place()
{
bool result = placer1(getCtx(), Placer1Cfg(getCtx()));
if (result)
permute_luts();
return result;
}
bool Arch::place() { return placer_heap(getCtx()); }
bool Arch::route()
{