aboutsummaryrefslogtreecommitdiffstats
path: root/common/place_common.cc
diff options
context:
space:
mode:
Diffstat (limited to 'common/place_common.cc')
-rw-r--r--common/place_common.cc18
1 files changed, 9 insertions, 9 deletions
diff --git a/common/place_common.cc b/common/place_common.cc
index 60735890..b2f0e849 100644
--- a/common/place_common.cc
+++ b/common/place_common.cc
@@ -25,7 +25,7 @@
NEXTPNR_NAMESPACE_BEGIN
// Get the total estimated wirelength for a net
-wirelen_t get_net_wirelength(const Context *ctx, const NetInfo *net, float &tns)
+wirelen_t get_net_metric(const Context *ctx, const NetInfo *net, MetricType type, float &tns)
{
wirelen_t wirelength = 0;
int driver_x, driver_y;
@@ -47,7 +47,7 @@ wirelen_t get_net_wirelength(const Context *ctx, const NetInfo *net, float &tns)
CellInfo *load_cell = load.cell;
if (load_cell->bel == BelId())
continue;
- if (ctx->timing_driven) {
+ if (ctx->timing_driven && type == MetricType::COST) {
WireId user_wire = ctx->getWireBelPin(load_cell->bel, ctx->portPinFromId(load.port));
delay_t raw_wl = ctx->estimateDelay(drv_wire, user_wire);
float slack = ctx->getDelayNS(load.budget) - ctx->getDelayNS(raw_wl);
@@ -66,7 +66,7 @@ wirelen_t get_net_wirelength(const Context *ctx, const NetInfo *net, float &tns)
xmax = std::max(xmax, load_x);
ymax = std::max(ymax, load_y);
}
- if (ctx->timing_driven) {
+ if (ctx->timing_driven && type == MetricType::COST) {
wirelength = wirelen_t((((ymax - ymin) + (xmax - xmin)) * std::min(5.0, (1.0 + std::exp(-worst_slack / 5)))));
} else {
wirelength = wirelen_t((ymax - ymin) + (xmax - xmin));
@@ -76,7 +76,7 @@ wirelen_t get_net_wirelength(const Context *ctx, const NetInfo *net, float &tns)
}
// Get the total wirelength for a cell
-wirelen_t get_cell_wirelength(const Context *ctx, const CellInfo *cell)
+wirelen_t get_cell_metric(const Context *ctx, const CellInfo *cell, MetricType type)
{
std::set<IdString> nets;
for (auto p : cell->ports) {
@@ -86,16 +86,16 @@ wirelen_t get_cell_wirelength(const Context *ctx, const CellInfo *cell)
wirelen_t wirelength = 0;
float tns = 0;
for (auto n : nets) {
- wirelength += get_net_wirelength(ctx, ctx->nets.at(n).get(), tns);
+ wirelength += get_net_metric(ctx, ctx->nets.at(n).get(), type, tns);
}
return wirelength;
}
-wirelen_t get_cell_wirelength_at_bel(const Context *ctx, CellInfo *cell, BelId bel)
+wirelen_t get_cell_metric_at_bel(const Context *ctx, CellInfo *cell, BelId bel, MetricType type)
{
BelId oldBel = cell->bel;
cell->bel = bel;
- wirelen_t wirelen = get_cell_wirelength(ctx, cell);
+ wirelen_t wirelen = get_cell_metric(ctx, cell, type);
cell->bel = oldBel;
return wirelen;
}
@@ -118,7 +118,7 @@ bool place_single_cell(Context *ctx, CellInfo *cell, bool require_legality)
for (auto bel : ctx->getBels()) {
if (ctx->getBelType(bel) == targetType && (!require_legality || ctx->isValidBelForCell(cell, bel))) {
if (ctx->checkBelAvail(bel)) {
- wirelen_t wirelen = get_cell_wirelength_at_bel(ctx, cell, bel);
+ wirelen_t wirelen = get_cell_metric_at_bel(ctx, cell, bel, MetricType::COST);
if (iters >= 4)
wirelen += ctx->rng(25);
if (wirelen <= best_wirelen) {
@@ -126,7 +126,7 @@ bool place_single_cell(Context *ctx, CellInfo *cell, bool require_legality)
best_bel = bel;
}
} else {
- wirelen_t wirelen = get_cell_wirelength_at_bel(ctx, cell, bel);
+ wirelen_t wirelen = get_cell_metric_at_bel(ctx, cell, bel, MetricType::COST);
if (iters >= 4)
wirelen += ctx->rng(25);
if (wirelen <= best_ripup_wirelen) {