place_sa: Make the heuristic closer to arachne, seems to improve routability

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-06-21 11:45:58 +02:00
parent e526a4115b
commit 9e28e45bd5

View File

@ -321,25 +321,33 @@ class SAPlacer
driver_cell->bel, ctx->portPinFromId(net->driver.port)); driver_cell->bel, ctx->portPinFromId(net->driver.port));
if (driver_gb) if (driver_gb)
return 0; return 0;
float worst_slack = 1000;
int xmin = driver_x, xmax = driver_x, ymin = driver_y, ymax = driver_y;
for (auto load : net->users) { for (auto load : net->users) {
if (load.cell == nullptr) if (load.cell == nullptr)
continue; continue;
CellInfo *load_cell = load.cell; CellInfo *load_cell = load.cell;
if (load_cell->bel == BelId()) if (load_cell->bel == BelId())
continue; continue;
// ctx->estimatePosition(load_cell->bel, load_x, load_y, load_gb);
WireId user_wire = ctx->getWireBelPin( WireId user_wire = ctx->getWireBelPin(
load_cell->bel, ctx->portPinFromId(load.port)); load_cell->bel, ctx->portPinFromId(load.port));
// wirelength += std::abs(load_x - driver_x) + std::abs(load_y -
// driver_y);
delay_t raw_wl = ctx->estimateDelay(drv_wire, user_wire); delay_t raw_wl = ctx->estimateDelay(drv_wire, user_wire);
wirelength += wirelen_t((pow(1.3, (ctx->getDelayNS(raw_wl) - float slack =
ctx->getDelayNS(load.budget)) / ctx->getDelayNS(raw_wl) - ctx->getDelayNS(load.budget);
10) + worst_slack = std::min(slack, worst_slack);
ctx->getDelayNS(raw_wl)) * int load_x, load_y;
10); bool load_gb;
// wirelength += pow(ctx->estimateDelay(drv_wire, user_wire), 2.0); ctx->estimatePosition(load_cell->bel, load_x, load_y, load_gb);
if (load_gb)
continue;
xmin = std::min(xmin, load_x);
ymin = std::min(ymin, load_y);
xmax = std::max(xmax, load_x);
ymax = std::max(ymax, load_y);
} }
wirelength = wirelen_t((((ymax - ymin) + (xmax - xmin)) *
(1.0 + std::exp(-worst_slack / 5))));
return wirelength; return wirelength;
} }
@ -400,8 +408,9 @@ class SAPlacer
delta = new_wirelength - curr_wirelength; delta = new_wirelength - curr_wirelength;
n_move++; n_move++;
// SA acceptance criterea // SA acceptance criterea
if (delta < 0 || (temp > 1e-6 && (ctx->rng() / float(0x3fffffff)) <= if (delta < 0 ||
std::exp(-delta / temp))) { (temp > 1e-6 && (ctx->rng() / float(0x3fffffff)) <=
std::exp(-(delta / 2) / temp))) {
n_accept++; n_accept++;
if (delta < 2) if (delta < 2)
improved = true; improved = true;