Improved log messages in SA placer, minor changes from clangformat

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2018-06-19 15:00:24 +02:00
parent 2603c6d805
commit d7f424b809
2 changed files with 31 additions and 14 deletions

View File

@ -146,7 +146,8 @@ static float get_wirelength(Context *ctx, NetInfo *net)
} }
// Attempt a SA position swap, return true on success or false on failure // Attempt a SA position swap, return true on success or false on failure
static bool try_swap_position(Context *ctx, CellInfo *cell, BelId newBel, SAState &state) static bool try_swap_position(Context *ctx, CellInfo *cell, BelId newBel,
SAState &state)
{ {
static std::unordered_set<NetInfo *> update; static std::unordered_set<NetInfo *> update;
static std::vector<std::pair<NetInfo *, float>> new_lengths; static std::vector<std::pair<NetInfo *, float>> new_lengths;
@ -237,8 +238,10 @@ BelId random_bel_for_cell(Context *ctx, CellInfo *cell, SAState &state)
int x = 0, y = 0; int x = 0, y = 0;
ctx->estimatePosition(cell->bel, x, y); ctx->estimatePosition(cell->bel, x, y);
while (true) { while (true) {
int nx = ctx->rng(2 * state.diameter + 1) + std::max(x - state.diameter, 0); int nx = ctx->rng(2 * state.diameter + 1) +
int ny = ctx->rng(2 * state.diameter + 1) + std::max(y - state.diameter, 0); std::max(x - state.diameter, 0);
int ny = ctx->rng(2 * state.diameter + 1) +
std::max(y - state.diameter, 0);
int beltype_idx = state.bel_types.at(targetType); int beltype_idx = state.bel_types.at(targetType);
if (nx >= int(state.fast_bels.at(beltype_idx).size())) if (nx >= int(state.fast_bels.at(beltype_idx).size()))
continue; continue;
@ -289,9 +292,10 @@ bool place_design_sa(Context *ctx)
visit_cells.push(cell); visit_cells.push(cell);
} }
} }
log_info("place_constraints placed %d\n", int(placed_cells)); log_info("Placed %d cells based on constraints.\n", int(placed_cells));
std::vector<CellInfo *> autoplaced;
// Sort to-place cells for deterministic initial placement // Sort to-place cells for deterministic initial placement
std::vector<CellInfo *> autoplaced;
for (auto cell : ctx->cells) { for (auto cell : ctx->cells) {
CellInfo *ci = cell.second; CellInfo *ci = cell.second;
if (ci->bel == BelId()) { if (ci->bel == BelId()) {
@ -300,11 +304,18 @@ bool place_design_sa(Context *ctx)
} }
std::sort(autoplaced.begin(), autoplaced.end(), std::sort(autoplaced.begin(), autoplaced.end(),
[](CellInfo *a, CellInfo *b) { return a->name < b->name; }); [](CellInfo *a, CellInfo *b) { return a->name < b->name; });
ctx->shuffle(autoplaced);
// Place cells randomly initially // Place cells randomly initially
log_info("Creating initial placement for remaining %d cells.\n",
int(autoplaced.size()));
for (auto cell : autoplaced) { for (auto cell : autoplaced) {
place_initial(ctx, cell); place_initial(ctx, cell);
placed_cells++; placed_cells++;
} }
log_info("Running simulated annealing placer.\n");
// Build up a fast position/type to Bel lookup table // Build up a fast position/type to Bel lookup table
int max_x = 0, max_y = 0; int max_x = 0, max_y = 0;
int bel_types = 0; int bel_types = 0;
@ -330,6 +341,7 @@ bool place_design_sa(Context *ctx)
state.fast_bels.at(type_idx).at(x).at(y).push_back(bel); state.fast_bels.at(type_idx).at(x).at(y).push_back(bel);
} }
state.diameter = std::max(max_x, max_y) + 1; state.diameter = std::max(max_x, max_y) + 1;
// Calculate wirelength after initial placement // Calculate wirelength after initial placement
state.curr_wirelength = 0; state.curr_wirelength = 0;
for (auto net : ctx->nets) { for (auto net : ctx->nets) {
@ -347,8 +359,8 @@ bool place_design_sa(Context *ctx)
state.n_move = state.n_accept = 0; state.n_move = state.n_accept = 0;
state.improved = false; state.improved = false;
if (iter % 5 == 0) if (iter % 5 == 0 || iter == 1)
log(" at iteration #%d: temp = %f, wire length = %f\n", iter, log_info(" at iteration #%d: temp = %f, wire length = %f\n", iter,
state.temp, state.curr_wirelength); state.temp, state.curr_wirelength);
for (int m = 0; m < 15; ++m) { for (int m = 0; m < 15; ++m) {
@ -369,8 +381,12 @@ bool place_design_sa(Context *ctx)
} else } else
++n_no_progress; ++n_no_progress;
if (state.temp <= 1e-3 && n_no_progress >= 5) if (state.temp <= 1e-3 && n_no_progress >= 5) {
if (iter % 5 != 0)
log_info(" at iteration #%d: temp = %f, wire length = %f\n",
iter, state.temp, state.curr_wirelength);
break; break;
}
double Raccept = (double)state.n_accept / (double)state.n_move; double Raccept = (double)state.n_accept / (double)state.n_move;

View File

@ -211,7 +211,8 @@ void nxio_to_sb(Context *ctx, CellInfo *nxio, CellInfo *sbio)
replace_port(tbuf, "E", sbio, "OUTPUT_ENABLE"); replace_port(tbuf, "E", sbio, "OUTPUT_ENABLE");
ctx->nets.erase(donet->name); ctx->nets.erase(donet->name);
if (!donet->users.empty()) if (!donet->users.empty())
log_error("unsupported tristate IO pattern for IO buffer '%s', " log_error(
"unsupported tristate IO pattern for IO buffer '%s', "
"instantiate SB_IO manually to ensure correct behaviour\n", "instantiate SB_IO manually to ensure correct behaviour\n",
nxio->name.c_str(ctx)); nxio->name.c_str(ctx));
ctx->cells.erase(tbuf->name); ctx->cells.erase(tbuf->name);