aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/router2.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/common/router2.cc b/common/router2.cc
index b48857d7..59763f86 100644
--- a/common/router2.cc
+++ b/common/router2.cc
@@ -1244,6 +1244,37 @@ struct Router2
route_net(tcs.at(N), fail, false);
}
+//#define ROUTER2_STATISTICS
+
+ void dump_statistics()
+ {
+#ifdef ROUTER2_STATISTICS
+ int total_wires = int(flat_wires.size());
+ int have_hist_cong = 0;
+ int have_any_bound = 0, have_1_bound = 0, have_2_bound = 0, have_gte3_bound = 0;
+ for (auto &wire : flat_wires) {
+ int bound = wire.bound_nets.size();
+ if (bound != 0)
+ ++have_any_bound;
+ if (bound == 1)
+ ++have_1_bound;
+ else if (bound == 2)
+ ++have_2_bound;
+ else if (bound >= 3)
+ ++have_gte3_bound;
+ if (wire.hist_cong_cost > 1.0)
+ ++have_hist_cong;
+ }
+ log_info("Out of %d wires:\n", total_wires);
+ log_info(" %d (%.02f%%) have any bound nets\n", have_any_bound, (100.0 * have_any_bound) / total_wires);
+ log_info(" %d (%.02f%%) have 1 bound net\n", have_1_bound, (100.0 * have_1_bound) / total_wires);
+ log_info(" %d (%.02f%%) have 2 bound nets\n", have_2_bound, (100.0 * have_2_bound) / total_wires);
+ log_info(" %d (%.02f%%) have >2 bound nets\n", have_gte3_bound, (100.0 * have_gte3_bound) / total_wires);
+ log_info(" %d (%.02f%%) have historical congestion\n", have_hist_cong,
+ (100.0 * have_hist_cong) / total_wires);
+#endif
+ }
+
void operator()()
{
log_info("Running router2...\n");
@@ -1301,6 +1332,8 @@ struct Router2
write_heatmap(cong_map, true);
}
#endif
+ dump_statistics();
+
if (overused_wires == 0) {
// Try and actually bind nextpnr Arch API wires
bind_and_check_all();