diff --git a/common/placer1.cc b/common/placer1.cc index 6da8608a..37294dfd 100644 --- a/common/placer1.cc +++ b/common/placer1.cc @@ -46,7 +46,7 @@ NEXTPNR_NAMESPACE_BEGIN class SAPlacer { public: - SAPlacer(Context *ctx) : ctx(ctx) + SAPlacer(Context *ctx, Placer1Cfg cfg) : ctx(ctx), cfg(cfg) { int num_bel_types = 0; for (auto bel : ctx->getBels()) { @@ -395,7 +395,7 @@ private: if (other != IdString()) new_dist += get_constraints_distance(ctx, other_cell); delta = new_metric - curr_metric; - delta += (10 / temp) * (new_dist - old_dist); + delta += (cfg.constraintWeight / temp) * (new_dist - old_dist); n_move++; // SA acceptance criterea if (delta < 0 || (temp > 1e-6 && (ctx->rng() / float(0x3fffffff)) <= std::exp(-delta / temp))) { @@ -458,12 +458,13 @@ private: const float legalise_temp = 1; const float post_legalise_temp = 10; const float post_legalise_dia_scale = 1.5; + Placer1Cfg cfg; }; -bool placer1(Context *ctx) +bool placer1(Context *ctx, Placer1Cfg cfg) { try { - SAPlacer placer(ctx); + SAPlacer placer(ctx, cfg); placer.place(); log_info("Checksum: 0x%08x\n", ctx->checksum()); #ifndef NDEBUG diff --git a/common/placer1.h b/common/placer1.h index 477fae56..d8f64b84 100644 --- a/common/placer1.h +++ b/common/placer1.h @@ -23,7 +23,12 @@ NEXTPNR_NAMESPACE_BEGIN -extern bool placer1(Context *ctx); +struct Placer1Cfg +{ + float constraintWeight = 10; +}; + +extern bool placer1(Context *ctx, Placer1Cfg cfg); NEXTPNR_NAMESPACE_END diff --git a/ecp5/arch.cc b/ecp5/arch.cc index 262f43fe..377b8665 100644 --- a/ecp5/arch.cc +++ b/ecp5/arch.cc @@ -426,7 +426,7 @@ delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, de // ----------------------------------------------------------------------- -bool Arch::place() { return placer1(getCtx()); } +bool Arch::place() { return placer1(getCtx(), Placer1Cfg()); } bool Arch::route() { diff --git a/generic/arch.cc b/generic/arch.cc index 1c22dbf7..f9133f9e 100644 --- a/generic/arch.cc +++ b/generic/arch.cc @@ -412,7 +412,7 @@ delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, de // --------------------------------------------------------------- -bool Arch::place() { return placer1(getCtx()); } +bool Arch::place() { return placer1(getCtx()\, Placer1Cfg()); } bool Arch::route() { return router1(getCtx(), Router1Cfg()); } diff --git a/ice40/arch.cc b/ice40/arch.cc index eff1d9b9..84856402 100644 --- a/ice40/arch.cc +++ b/ice40/arch.cc @@ -659,7 +659,11 @@ delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, de // ----------------------------------------------------------------------- -bool Arch::place() { return placer1(getCtx()); } +bool Arch::place() { + Placer1Cfg cfg; + cfg.constraintWeight = placer_constraintWeight; + return placer1(getCtx(), cfg); +} bool Arch::route() { diff --git a/ice40/arch.h b/ice40/arch.h index 98361132..b9b4f3c5 100644 --- a/ice40/arch.h +++ b/ice40/arch.h @@ -797,6 +797,9 @@ struct Arch : BaseCtx } NPNR_ASSERT_FALSE("Expected PLL pin to share an output with an SB_IO D_IN_{0,1}"); } + + float placer_constraintWeight = 10; + }; NEXTPNR_NAMESPACE_END diff --git a/ice40/main.cc b/ice40/main.cc index 41d264ad..60f5b444 100644 --- a/ice40/main.cc +++ b/ice40/main.cc @@ -106,6 +106,8 @@ int main(int argc, char *argv[]) options.add_options()("seed", po::value(), "seed value for random number generator"); options.add_options()("slack_redist_iter", po::value(), "number of iterations between slack redistribution"); + options.add_options()("cstrweight", po::value(), "placer weighting for relative constraint satisfaction"); + options.add_options()("version,V", "show version"); options.add_options()("tmfuzz", "run path delay estimate fuzzer"); options.add_options()("test", "check architecture database integrity"); @@ -318,6 +320,10 @@ int main(int argc, char *argv[]) ctx->slack_redist_iter = vm["slack_redist_iter"].as(); } + if (vm.count("cstrweight")) { + ctx->placer_constraintWeight = vm["cstrweight"].as(); + } + if (vm.count("svg")) { std::cout << "\n";