HeAP: Make beta configurable

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2020-02-02 15:45:01 +00:00
parent d1f5cdcb93
commit 7db1484c75
2 changed files with 10 additions and 9 deletions

View File

@ -1028,7 +1028,6 @@ class HeAPPlacer
sl_time += std::chrono::duration<float>(endt - startt).count(); sl_time += std::chrono::duration<float>(endt - startt).count();
} }
// Implementation of the cut-based spreading as described in the HeAP/SimPL papers // Implementation of the cut-based spreading as described in the HeAP/SimPL papers
static constexpr float beta = 0.9;
template <typename T> T limit_to_reg(Region *reg, T val, bool dir) template <typename T> T limit_to_reg(Region *reg, T val, bool dir)
{ {
@ -1049,7 +1048,7 @@ class HeAPPlacer
int id; int id;
int x0, y0, x1, y1; int x0, y0, x1, y1;
std::vector<int> cells, bels; std::vector<int> cells, bels;
bool overused() const bool overused(float beta) const
{ {
for (size_t t = 0; t < cells.size(); t++) { for (size_t t = 0; t < cells.size(); t++) {
if (bels.at(t) < 4) { if (bels.at(t) < 4) {
@ -1380,8 +1379,9 @@ class HeAPPlacer
void expand_regions() void expand_regions()
{ {
std::queue<int> overu_regions; std::queue<int> overu_regions;
float beta = p->cfg.beta;
for (auto &r : regions) { for (auto &r : regions) {
if (!merged_regions.count(r.id) && r.overused()) if (!merged_regions.count(r.id) && r.overused(beta))
overu_regions.push(r.id); overu_regions.push(r.id);
} }
while (!overu_regions.empty()) { while (!overu_regions.empty()) {
@ -1390,33 +1390,33 @@ class HeAPPlacer
if (merged_regions.count(rid)) if (merged_regions.count(rid))
continue; continue;
auto &reg = regions.at(rid); auto &reg = regions.at(rid);
while (reg.overused()) { while (reg.overused(beta)) {
bool changed = false; bool changed = false;
// 2 x units for every 1 y unit to account for INT gaps between CLBs // 2 x units for every 1 y unit to account for INT gaps between CLBs
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {
if (reg.x0 > 0) { if (reg.x0 > 0) {
grow_region(reg, reg.x0 - 1, reg.y0, reg.x1, reg.y1); grow_region(reg, reg.x0 - 1, reg.y0, reg.x1, reg.y1);
changed = true; changed = true;
if (!reg.overused()) if (!reg.overused(beta))
break; break;
} }
if (reg.x1 < p->max_x) { if (reg.x1 < p->max_x) {
grow_region(reg, reg.x0, reg.y0, reg.x1 + 1, reg.y1); grow_region(reg, reg.x0, reg.y0, reg.x1 + 1, reg.y1);
changed = true; changed = true;
if (!reg.overused()) if (!reg.overused(beta))
break; break;
} }
} }
if (reg.y0 > 0) { if (reg.y0 > 0) {
grow_region(reg, reg.x0, reg.y0 - 1, reg.x1, reg.y1); grow_region(reg, reg.x0, reg.y0 - 1, reg.x1, reg.y1);
changed = true; changed = true;
if (!reg.overused()) if (!reg.overused(beta))
break; break;
} }
if (reg.y1 < p->max_y) { if (reg.y1 < p->max_y) {
grow_region(reg, reg.x0, reg.y0, reg.x1, reg.y1 + 1); grow_region(reg, reg.x0, reg.y0, reg.x1, reg.y1 + 1);
changed = true; changed = true;
if (!reg.overused()) if (!reg.overused(beta))
break; break;
} }
if (!changed) { if (!changed) {
@ -1712,6 +1712,7 @@ bool placer_heap(Context *ctx, PlacerHeapCfg cfg) { return HeAPPlacer(ctx, cfg).
PlacerHeapCfg::PlacerHeapCfg(Context *ctx) PlacerHeapCfg::PlacerHeapCfg(Context *ctx)
{ {
alpha = ctx->setting<float>("placerHeap/alpha", 0.1); alpha = ctx->setting<float>("placerHeap/alpha", 0.1);
beta = ctx->setting<float>("placerHeap/beta", 0.9);
criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2); criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2);
timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10); timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10);
timing_driven = ctx->setting<bool>("timing_driven"); timing_driven = ctx->setting<bool>("timing_driven");

View File

@ -35,7 +35,7 @@ struct PlacerHeapCfg
{ {
PlacerHeapCfg(Context *ctx); PlacerHeapCfg(Context *ctx);
float alpha; float alpha, beta;
float criticalityExponent; float criticalityExponent;
float timingWeight; float timingWeight;
bool timing_driven; bool timing_driven;