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:
parent
e526a4115b
commit
9e28e45bd5
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user