static: Fix crash when no placeable cells

Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
gatecat 2026-05-20 10:51:55 +02:00
parent d5b1068b29
commit 48c70978b3
1 changed files with 39 additions and 35 deletions

View File

@ -1568,45 +1568,49 @@ class StaticPlacer
insert_spacer();
prepare_density_bins();
initialise();
bool legalised_ip = false;
float best_overlap = 1.0;
int best_overlap_iter = 0;
while (true) {
step();
for (auto &p : dens_penalty)
if (p < 50.0)
p *= 1.025;
else
p += 1.0;
// wl_coeff.at(Axis::X) = std::max(0.005, 0.995 * wl_coeff.at(Axis::X));
// wl_coeff.at(Axis::Y) = std::max(0.005, 0.995 * wl_coeff.at(Axis::Y));
if (ccells.empty()) {
log_info("No cells available for static to place\n");
} else {
initialise();
bool legalised_ip = false;
float best_overlap = 1.0;
int best_overlap_iter = 0;
while (true) {
step();
for (auto &p : dens_penalty)
if (p < 50.0)
p *= 1.025;
else
p += 1.0;
// wl_coeff.at(Axis::X) = std::max(0.005, 0.995 * wl_coeff.at(Axis::X));
// wl_coeff.at(Axis::Y) = std::max(0.005, 0.995 * wl_coeff.at(Axis::Y));
// update_penalties();
if (!legalised_ip) {
float ip_overlap = 0;
for (int i = cfg.logic_groups; i < int(groups.size()); i++)
ip_overlap = std::max(ip_overlap, groups.at(i).overlap);
if (ip_overlap < 0.15) {
legalise_step(true);
legalised_ip = true;
// update_penalties();
if (!legalised_ip) {
float ip_overlap = 0;
for (int i = cfg.logic_groups; i < int(groups.size()); i++)
groups.at(i).enabled = false;
}
} else {
float logic_overlap = 0;
for (int i = 0; i < cfg.logic_groups; i++)
logic_overlap = std::max(logic_overlap, groups.at(i).overlap);
if (logic_overlap < best_overlap) {
best_overlap = logic_overlap;
best_overlap_iter = iter;
}
if (logic_overlap < 0.1 || (logic_overlap < 0.2 && iter > (best_overlap_iter + 50))) {
legalise_step(false);
break;
ip_overlap = std::max(ip_overlap, groups.at(i).overlap);
if (ip_overlap < 0.15) {
legalise_step(true);
legalised_ip = true;
for (int i = cfg.logic_groups; i < int(groups.size()); i++)
groups.at(i).enabled = false;
}
} else {
float logic_overlap = 0;
for (int i = 0; i < cfg.logic_groups; i++)
logic_overlap = std::max(logic_overlap, groups.at(i).overlap);
if (logic_overlap < best_overlap) {
best_overlap = logic_overlap;
best_overlap_iter = iter;
}
if (logic_overlap < 0.1 || (logic_overlap < 0.2 && iter > (best_overlap_iter + 50))) {
legalise_step(false);
break;
}
}
++iter;
}
++iter;
}
{
auto placer1_cfg = Placer1Cfg(ctx);