placer1: Allow scaling HPWL differently in each direction
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
ca73356187
commit
7bda6f15a9
@ -68,7 +68,10 @@ class SAPlacer
|
||||
int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
|
||||
// Number of cells at each extremity
|
||||
int nx0 = 0, nx1 = 0, ny0 = 0, ny1 = 0;
|
||||
wirelen_t hpwl() const { return wirelen_t((x1 - x0) + (y1 - y0)); }
|
||||
wirelen_t hpwl(const Placer1Cfg &cfg) const
|
||||
{
|
||||
return wirelen_t(cfg.hpwl_scale_x * (x1 - x0) + cfg.hpwl_scale_y * (y1 - y0));
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
@ -689,8 +692,10 @@ class SAPlacer
|
||||
|
||||
int dx = diameter, dy = diameter;
|
||||
if (cell->region != nullptr && cell->region->constr_bels) {
|
||||
dx = std::min(diameter, (region_bounds[cell->region->name].x1 - region_bounds[cell->region->name].x0) + 1);
|
||||
dy = std::min(diameter, (region_bounds[cell->region->name].y1 - region_bounds[cell->region->name].y0) + 1);
|
||||
dx = std::min(cfg.hpwl_scale_x * diameter,
|
||||
(region_bounds[cell->region->name].x1 - region_bounds[cell->region->name].x0) + 1);
|
||||
dy = std::min(cfg.hpwl_scale_y * diameter,
|
||||
(region_bounds[cell->region->name].y1 - region_bounds[cell->region->name].y0) + 1);
|
||||
// Clamp location to within bounds
|
||||
curr_loc.x = std::max(region_bounds[cell->region->name].x0, curr_loc.x);
|
||||
curr_loc.x = std::min(region_bounds[cell->region->name].x1, curr_loc.x);
|
||||
@ -820,7 +825,7 @@ class SAPlacer
|
||||
{
|
||||
wirelen_t cost = 0;
|
||||
for (const auto &net : net_bounds)
|
||||
cost += net.hpwl();
|
||||
cost += net.hpwl(cfg);
|
||||
return cost;
|
||||
}
|
||||
|
||||
@ -1061,10 +1066,10 @@ class SAPlacer
|
||||
}
|
||||
|
||||
for (const auto &bc : md.bounds_changed_nets_x)
|
||||
md.wirelen_delta += md.new_net_bounds[bc].hpwl() - net_bounds[bc].hpwl();
|
||||
md.wirelen_delta += md.new_net_bounds[bc].hpwl(cfg) - net_bounds[bc].hpwl(cfg);
|
||||
for (const auto &bc : md.bounds_changed_nets_y)
|
||||
if (md.already_bounds_changed_x[bc] == MoveChangeData::NO_CHANGE)
|
||||
md.wirelen_delta += md.new_net_bounds[bc].hpwl() - net_bounds[bc].hpwl();
|
||||
md.wirelen_delta += md.new_net_bounds[bc].hpwl(cfg) - net_bounds[bc].hpwl(cfg);
|
||||
|
||||
if (cfg.timing_driven) {
|
||||
for (const auto &tc : md.changed_arcs) {
|
||||
@ -1145,6 +1150,8 @@ Placer1Cfg::Placer1Cfg(Context *ctx)
|
||||
timingFanoutThresh = std::numeric_limits<int>::max();
|
||||
timing_driven = ctx->setting<bool>("timing_driven");
|
||||
slack_redist_iter = ctx->setting<int>("slack_redist_iter");
|
||||
hpwl_scale_x = 1;
|
||||
hpwl_scale_y = 1;
|
||||
}
|
||||
|
||||
bool placer1(Context *ctx, Placer1Cfg cfg)
|
||||
|
@ -34,6 +34,7 @@ struct Placer1Cfg
|
||||
int timingFanoutThresh;
|
||||
bool timing_driven;
|
||||
int slack_redist_iter;
|
||||
int hpwl_scale_x, hpwl_scale_y;
|
||||
};
|
||||
|
||||
extern bool placer1(Context *ctx, Placer1Cfg cfg);
|
||||
|
Loading…
Reference in New Issue
Block a user