diff --git a/common/kernel/command.cc b/common/kernel/command.cc index a51f9576f4..fc58d38360 100644 --- a/common/kernel/command.cc +++ b/common/kernel/command.cc @@ -396,6 +396,8 @@ po::options_description CommandHandler::getGeneralOptions() general.add_options()("parallel-refine", "use new experimental parallelised engine for placement refinement"); #endif + general.add_options()("router1-timeout", po::value(), "Timeout for router1 in iteration count (default: 0, no timeout)"); + general.add_options()("router2-heatmap", po::value(), "prefix for router2 resource congestion heatmaps"); @@ -538,6 +540,10 @@ void CommandHandler::setupContext(Context *ctx) if (vm.count("parallel-refine")) ctx->settings[ctx->id("placerHeap/parallelRefine")] = true; + if (vm.count("router1-timeout")) { + ctx->settings[ctx->id("router1/maxIterCnt")] = std::to_string(std::max(0, vm["router1-timeout"].as())); + } + if (vm.count("router2-heatmap")) ctx->settings[ctx->id("router2/heatmap")] = vm["router2-heatmap"].as(); if (vm.count("tmg-ripup") || vm.count("router2-tmg-ripup")) diff --git a/common/route/router1.cc b/common/route/router1.cc index 510065f611..625f68dbfb 100644 --- a/common/route/router1.cc +++ b/common/route/router1.cc @@ -1146,7 +1146,7 @@ NEXTPNR_NAMESPACE_BEGIN Router1Cfg::Router1Cfg(Context *ctx) { - maxIterCnt = ctx->setting("router1/maxIterCnt", 200); + maxIterCnt = ctx->setting("router1/maxIterCnt", 0); cleanupReroute = ctx->setting("router1/cleanupReroute", true); fullCleanupReroute = ctx->setting("router1/fullCleanupReroute", true); useEstimate = ctx->setting("router1/useEstimate", true); @@ -1199,11 +1199,17 @@ bool router1(Context *ctx, const Router1Cfg &cfg) last_arcs_with_ripup = router.arcs_with_ripup; last_arcs_without_ripup = router.arcs_without_ripup; ctx->yield(); + #ifndef NDEBUG router.check(); #endif } - + if (cfg.maxIterCnt){ + if (iter_cnt > cfg.maxIterCnt) { + log_error("Max iteration count reached, stopping routing.\n"); + } + } + if (ctx->debug) log("-- %d --\n", iter_cnt);