From ac8a12aee5a78615dc1d060bc68ae39e6f2f1751 Mon Sep 17 00:00:00 2001 From: Lofty Date: Tue, 29 Jul 2025 08:50:10 +0100 Subject: [PATCH] bugfix for number of hops --- himbaechel/uarch/gatemate/bitstream.cc | 12 ++++----- himbaechel/uarch/gatemate/route_mult.cc | 33 +++++++++++++++---------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/himbaechel/uarch/gatemate/bitstream.cc b/himbaechel/uarch/gatemate/bitstream.cc index 1360de08..d2baf908 100644 --- a/himbaechel/uarch/gatemate/bitstream.cc +++ b/himbaechel/uarch/gatemate/bitstream.cc @@ -23,6 +23,7 @@ #include "config.h" #include "gatemate.h" #include "gatemate_util.h" +#include "log.h" #include "property.h" #include "uarch/gatemate/pack.h" @@ -274,28 +275,27 @@ struct BitstreamBackend if (!all_correct && !all_inverted) { log_warning("multiplier net '%s' has inconsistent inversion\n", net_name.c_str(ctx)); + auto driver_loc = ctx->getBelLocation(net->driver.cell->bel); + log_warning("net is driven from (%d, %d)\n", driver_loc.x, driver_loc.y); + log_warning(" these ports are not inverted:\n"); for (PortRef user : net->users) { auto loc = ctx->getBelLocation(user.cell->bel); - auto x_fourgroup = (loc.x - 3) % 4; - auto y_fourgroup = (loc.y - 3) % 4; auto should_be_inverted = user.cell->constr_x % 2 == 1; auto inversion = need_inversion(user.cell, user.port); if (inversion == should_be_inverted) - log_warning(" %s.%s with four-group (%d, %d)\n", user.cell->name.c_str(ctx), user.port.c_str(ctx), x_fourgroup, y_fourgroup); + log_warning(" %s.%s at (%d, %d)\n", user.cell->name.c_str(ctx), user.port.c_str(ctx), loc.x, loc.y); } log_warning(" these ports are inverted:\n"); for (PortRef user : net->users) { auto loc = ctx->getBelLocation(user.cell->bel); - auto x_fourgroup = (loc.x - 3) % 4; - auto y_fourgroup = (loc.y - 3) % 4; auto should_be_inverted = user.cell->constr_x % 2 == 1; auto inversion = need_inversion(user.cell, user.port); if (inversion != should_be_inverted) - log_warning(" %s.%s with four-group (%d, %d)\n", user.cell->name.c_str(ctx), user.port.c_str(ctx), x_fourgroup, y_fourgroup); + log_warning(" %s.%s at (%d, %d)\n", user.cell->name.c_str(ctx), user.port.c_str(ctx), loc.x, loc.y); } } else if (all_inverted) { net->driver.cell->params[id_INIT_L10] = Property(~driver_l10 & 0b1111, 4); diff --git a/himbaechel/uarch/gatemate/route_mult.cc b/himbaechel/uarch/gatemate/route_mult.cc index 457617aa..eed80f2a 100644 --- a/himbaechel/uarch/gatemate/route_mult.cc +++ b/himbaechel/uarch/gatemate/route_mult.cc @@ -43,7 +43,14 @@ namespace { log_error("Couldn't find pip from %s to %s\n", ctx->nameOfWire(from), ctx->nameOfWire(to)); } - void route_mult_diag(Context *ctx, NetInfo *net, Loc loc, WireId last_wire, int plane, int hops) { + void route_mult_diag(Context *ctx, NetInfo *net, Loc loc, WireId last_wire, int plane) { + auto hops = 0; + auto in_port = ctx->idf("IN%d", plane); + for (auto user : net->users) { + if (user.port == in_port) + hops++; + } + log_info(" routing diagonal: %d hops\n", hops); for (int i = 0; i < hops; i++) { @@ -84,7 +91,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_y1_int, in_mux, net); // inverting } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5, net->users.entries()); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5); } void route_mult_x1y1_upper_in1(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a) { @@ -114,7 +121,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_y1_int, in_mux, net); // inverting } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1, net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1); } void route_mult_x1y1_upper_in8(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a, bool bind_route_start = false) { @@ -168,7 +175,7 @@ namespace { find_and_bind_downhill_pip(ctx, in_mux_p12, in_mux_p04, net); // inverting find_and_bind_downhill_pip(ctx, in_mux_p04, in_mux_p08, net); // inverting - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8, bind_route_start ? net->users.entries() : net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8); } void route_mult_x1y2_lower(Context *ctx, NetInfo *net, CellInfo* lower, Loc loc, bool is_fourgroup_a) { @@ -228,7 +235,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_y3_int, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5, net->users.entries()); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5); } void route_mult_x1y2_upper_in1(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a) { @@ -289,7 +296,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_y3, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1, net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1); } void route_mult_x1y2_upper_in8(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a, bool bind_route_start = false) { @@ -333,7 +340,7 @@ namespace { find_and_bind_downhill_pip(ctx, in_mux_p12, in_mux_p04, net); // inverting find_and_bind_downhill_pip(ctx, in_mux_p04, in_mux_p08, net); // inverting - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8, bind_route_start ? net->users.entries() : net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8); } void route_mult_x2y1_lower(Context *ctx, NetInfo *net, CellInfo* lower, Loc loc, bool is_fourgroup_a) { @@ -385,7 +392,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_p05_y1_int, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5, net->users.entries()); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5); } void route_mult_x2y1_upper_in1(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a) { @@ -437,7 +444,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_sml_p01_y1_int, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1, net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1); } void route_mult_x2y1_upper_in8(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a, bool bind_route_start = false) { @@ -481,7 +488,7 @@ namespace { find_and_bind_downhill_pip(ctx, in_mux_p12, in_mux_p04, net); // inverting find_and_bind_downhill_pip(ctx, in_mux_p04, in_mux_p08, net); // inverting - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8, bind_route_start ? net->users.entries() : net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux_p08, 8); } void route_mult_x2y2_lower(Context *ctx, NetInfo *net, CellInfo* lower, Loc loc, bool is_fourgroup_a) { @@ -538,7 +545,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_big_p05_ydiag, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5, net->users.entries()); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 5); } void route_mult_x2y2_upper_in1(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a) { @@ -595,7 +602,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_big_p01_ydiag, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1, net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y, 0}, in_mux, 1); } void route_mult_x2y2_upper_in8(Context *ctx, NetInfo *net, CellInfo* upper, Loc loc, bool is_fourgroup_a, bool bind_route_start = false) { @@ -644,7 +651,7 @@ namespace { find_and_bind_downhill_pip(ctx, sb_big_ydiag, in_mux, net); } - route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux, 8, bind_route_start ? net->users.entries() : net->users.entries() / 2); + route_mult_diag(ctx, net, Loc{loc.x + 1, loc.y + 1, 0}, in_mux, 8); } }