aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-06-17 15:04:53 +0200
committerDavid Shah <davey1576@gmail.com>2018-06-17 15:04:53 +0200
commit748171dae29c65182e6360a12a9e2bdbbfc35163 (patch)
treedaddc1f0a38029f2c77f8c4253a3a5682a45033f /common
parent681c9654d7c49d407a999b2b03c980d66bcefd8f (diff)
downloadnextpnr-748171dae29c65182e6360a12a9e2bdbbfc35163.tar.gz
nextpnr-748171dae29c65182e6360a12a9e2bdbbfc35163.tar.bz2
nextpnr-748171dae29c65182e6360a12a9e2bdbbfc35163.zip
place_sa: Adding seed option
Signed-off-by: David Shah <davey1576@gmail.com>
Diffstat (limited to 'common')
-rw-r--r--common/place_sa.cc20
-rw-r--r--common/place_sa.h2
2 files changed, 11 insertions, 11 deletions
diff --git a/common/place_sa.cc b/common/place_sa.cc
index 61f9f748..e8b3725c 100644
--- a/common/place_sa.cc
+++ b/common/place_sa.cc
@@ -74,9 +74,10 @@ static void place_initial(Design *design, CellInfo *cell, rnd_state &rnd)
{
bool all_placed = false;
int iters = 25;
- while(!all_placed) {
+ while (!all_placed) {
BelId best_bel = BelId();
- float best_score = std::numeric_limits<float>::infinity(), best_ripup_score = std::numeric_limits<float>::infinity();
+ float best_score = std::numeric_limits<float>::infinity(),
+ best_ripup_score = std::numeric_limits<float>::infinity();
Chip &chip = design->chip;
CellInfo *ripup_target = nullptr;
BelId ripup_bel = BelId();
@@ -86,7 +87,8 @@ static void place_initial(Design *design, CellInfo *cell, rnd_state &rnd)
}
BelType targetType = belTypeFromId(cell->type);
for (auto bel : chip.getBels()) {
- if (chip.getBelType(bel) == targetType && isValidBelForCell(design, cell, bel)) {
+ if (chip.getBelType(bel) == targetType &&
+ isValidBelForCell(design, cell, bel)) {
if (chip.checkBelAvail(bel)) {
float score = random_float_upto(rnd, 1.0);
if (score <= best_score) {
@@ -97,18 +99,17 @@ static void place_initial(Design *design, CellInfo *cell, rnd_state &rnd)
float score = random_float_upto(rnd, 1.0);
if (score <= best_ripup_score) {
best_ripup_score = score;
- ripup_target = design->cells.at(chip.getBelCell(bel, true));
+ ripup_target =
+ design->cells.at(chip.getBelCell(bel, true));
ripup_bel = bel;
}
-
}
-
}
}
if (best_bel == BelId()) {
if (iters == 0 || ripup_bel == BelId())
log_error("failed to place cell '%s' of type '%s'\n",
- cell->name.c_str(), cell->type.c_str());
+ cell->name.c_str(), cell->type.c_str());
--iters;
chip.unbindBel(ripup_target->bel);
ripup_target->bel = BelId();
@@ -123,7 +124,6 @@ static void place_initial(Design *design, CellInfo *cell, rnd_state &rnd)
cell->attrs["BEL"] = chip.getBelName(cell->bel).str();
cell = ripup_target;
}
-
}
// Stores the state of the SA placer
@@ -293,7 +293,7 @@ BelId random_bel_for_cell(Design *design, CellInfo *cell, SAState &state,
}
}
-void place_design_sa(Design *design)
+void place_design_sa(Design *design, int seed)
{
SAState state;
@@ -329,7 +329,7 @@ void place_design_sa(Design *design)
}
log_info("place_constraints placed %d\n", int(placed_cells));
rnd_state rnd;
- rnd.state = 1;
+ rnd.state = seed;
std::vector<CellInfo *> autoplaced;
// Sort to-place cells for deterministic initial placement
for (auto cell : design->cells) {
diff --git a/common/place_sa.h b/common/place_sa.h
index f320111e..944cb97e 100644
--- a/common/place_sa.h
+++ b/common/place_sa.h
@@ -23,7 +23,7 @@
NEXTPNR_NAMESPACE_BEGIN
-extern void place_design_sa(Design *design);
+extern void place_design_sa(Design *design, int seed);
NEXTPNR_NAMESPACE_END