[placer1] Only increase temperature if legaliser moved something

This commit is contained in:
Eddie Hung 2018-11-13 16:17:39 -08:00
parent cab91b035b
commit 1b93107843
2 changed files with 23 additions and 19 deletions

View File

@ -431,12 +431,12 @@ class ConstraintLegaliseWorker
print_chain(child, depth + 1); print_chain(child, depth + 1);
} }
void print_stats(const char *point) unsigned print_stats(const char *point)
{ {
float distance_sum = 0; float distance_sum = 0;
float max_distance = 0; float max_distance = 0;
int moved_cells = 0; unsigned moved_cells = 0;
int unplaced_cells = 0; unsigned unplaced_cells = 0;
for (auto orig : oldLocations) { for (auto orig : oldLocations) {
if (ctx->cells.at(orig.first)->bel == BelId()) { if (ctx->cells.at(orig.first)->bel == BelId()) {
unplaced_cells++; unplaced_cells++;
@ -456,9 +456,10 @@ class ConstraintLegaliseWorker
log_info(" average distance %f\n", (distance_sum / moved_cells)); log_info(" average distance %f\n", (distance_sum / moved_cells));
log_info(" maximum distance %f\n", max_distance); log_info(" maximum distance %f\n", max_distance);
} }
return moved_cells + unplaced_cells;
} }
bool legalise_constraints() int legalise_constraints()
{ {
log_info("Legalising relative constraints...\n"); log_info("Legalising relative constraints...\n");
for (auto cell : sorted(ctx->cells)) { for (auto cell : sorted(ctx->cells)) {
@ -470,27 +471,28 @@ class ConstraintLegaliseWorker
if (ctx->verbose) if (ctx->verbose)
print_chain(cell.second); print_chain(cell.second);
log_error("failed to place chain starting at cell '%s'\n", cell.first.c_str(ctx)); log_error("failed to place chain starting at cell '%s'\n", cell.first.c_str(ctx));
return false; return -1;
} }
} }
print_stats("legalising chains"); if (print_stats("legalising chains") == 0)
return 0;
for (auto rippedCell : rippedCells) { for (auto rippedCell : rippedCells) {
bool res = place_single_cell(ctx, ctx->cells.at(rippedCell).get(), true); bool res = place_single_cell(ctx, ctx->cells.at(rippedCell).get(), true);
if (!res) { if (!res) {
log_error("failed to place cell '%s' after relative constraint legalisation\n", rippedCell.c_str(ctx)); log_error("failed to place cell '%s' after relative constraint legalisation\n", rippedCell.c_str(ctx));
return false; return -1;
} }
} }
print_stats("replacing ripped up cells"); auto score = print_stats("replacing ripped up cells");
for (auto cell : sorted(ctx->cells)) for (auto cell : sorted(ctx->cells))
if (get_constraints_distance(ctx, cell.second) != 0) if (get_constraints_distance(ctx, cell.second) != 0)
log_error("constraint satisfaction check failed for cell '%s' at Bel '%s'\n", cell.first.c_str(ctx), log_error("constraint satisfaction check failed for cell '%s' at Bel '%s'\n", cell.first.c_str(ctx),
ctx->getBelName(cell.second->bel).c_str(ctx)); ctx->getBelName(cell.second->bel).c_str(ctx));
return true; return score;
} }
}; };
bool legalise_relative_constraints(Context *ctx) { return ConstraintLegaliseWorker(ctx).legalise_constraints(); } bool legalise_relative_constraints(Context *ctx) { return ConstraintLegaliseWorker(ctx).legalise_constraints() > 0; }
// Get the total distance from satisfied constraints for a cell // Get the total distance from satisfied constraints for a cell
int get_constraints_distance(const Context *ctx, const CellInfo *cell) int get_constraints_distance(const Context *ctx, const CellInfo *cell)

View File

@ -245,16 +245,18 @@ class SAPlacer
// Once cooled below legalise threshold, run legalisation and start requiring // Once cooled below legalise threshold, run legalisation and start requiring
// legal moves only // legal moves only
if (temp < legalise_temp && require_legal) { if (temp < legalise_temp && require_legal) {
legalise_relative_constraints(ctx); if (legalise_relative_constraints(ctx)) {
require_legal = false; // Only increase temperature if something was moved
autoplaced.clear(); autoplaced.clear();
for (auto cell : sorted(ctx->cells)) { for (auto cell : sorted(ctx->cells)) {
if (cell.second->belStrength < STRENGTH_STRONG) if (cell.second->belStrength < STRENGTH_STRONG)
autoplaced.push_back(cell.second); autoplaced.push_back(cell.second);
}
temp = post_legalise_temp;
diameter *= post_legalise_dia_scale;
ctx->shuffle(autoplaced);
} }
temp = post_legalise_temp; require_legal = false;
diameter *= post_legalise_dia_scale;
ctx->shuffle(autoplaced);
// Legalisation is a big change so force a slack redistribution here // Legalisation is a big change so force a slack redistribution here
if (ctx->slack_redist_iter > 0) if (ctx->slack_redist_iter > 0)