mirror of https://github.com/YosysHQ/nextpnr.git
route_mult binds dedicated, locked routing for each CC_MULT cluster with wires computed from the cluster's placed location, reaching a couple of tiles outside the cluster body (the A-passthrough column sits at root.x-1 and its switch-box routes reach further). Nothing reserved those halo wires during placement and there was no spacing rule between multiplier clusters, so once the placer packed two clusters close enough their halos overlapped and route_mult double-bound a shared wire -> abort in bindPip (base_arch.h: w2n_entry == nullptr). It was seed-dependent and only surfaced on denser designs. Add a placement-legality rule in isBelLocationValid: compute a multiplier cluster's halo bounding box (its placed cells' bbox expanded by a margin that covers route_mult's reach) and reject the placement if it overlaps another multiplier cluster's halo. The multiplier cluster roots are cached once in assign_cell_info (via the existing multiplier_* pools) so the check is cheap. Verified on a design that reproducibly triggered the collision: seeds that previously aborted in 'Routing multipliers' now place and route, and a seed that already routed still routes (the rule does not over-constrain). Pairs with the route_mult.cc change that turns the residual assert into an actionable error. Co-Authored-By: Claude <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| himbaechel_dbgen | ||
| uarch | ||
| .gitignore | ||
| CMakeLists.txt | ||
| arch.cc | ||
| arch.h | ||
| arch_pybindings.cc | ||
| arch_pybindings.h | ||
| archdefs.h | ||
| chipdb.h | ||
| himbaechel_api.cc | ||
| himbaechel_api.h | ||
| himbaechel_constids.h | ||
| himbaechel_gfxids.h | ||
| himbaechel_helpers.cc | ||
| himbaechel_helpers.h | ||
| main.cc | ||