aboutsummaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2022-02-04 20:49:32 +0000
committergatecat <gatecat@ds0.me>2022-02-04 20:49:32 +0000
commite5bfff6e9fbbbc743c504365ab41e4112aefb6d6 (patch)
tree86697d34fbd0acd8203212080f8f4d3a86a7daf5 /generic
parent5ef5c33e9e964a176040c829adc965ec46331d77 (diff)
downloadnextpnr-e5bfff6e9fbbbc743c504365ab41e4112aefb6d6.tar.gz
nextpnr-e5bfff6e9fbbbc743c504365ab41e4112aefb6d6.tar.bz2
nextpnr-e5bfff6e9fbbbc743c504365ab41e4112aefb6d6.zip
viaduct: Allow constraining only cascades without fanout
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'generic')
-rw-r--r--generic/viaduct_helpers.cc4
-rw-r--r--generic/viaduct_helpers.h3
2 files changed, 5 insertions, 2 deletions
diff --git a/generic/viaduct_helpers.cc b/generic/viaduct_helpers.cc
index 36bdd6be..e9f7fa60 100644
--- a/generic/viaduct_helpers.cc
+++ b/generic/viaduct_helpers.cc
@@ -82,7 +82,7 @@ void ViaductHelpers::remove_nextpnr_iobs(const pool<CellTypePort> &top_ports)
}
int ViaductHelpers::constrain_cell_pairs(const pool<CellTypePort> &src_ports, const pool<CellTypePort> &sink_ports,
- int delta_z)
+ int delta_z, bool allow_fanout)
{
int constrained = 0;
for (auto &cell : ctx->cells) {
@@ -96,6 +96,8 @@ int ViaductHelpers::constrain_cell_pairs(const pool<CellTypePort> &src_ports, co
continue;
if (!src_ports.count(CellTypePort(ci.type, port.first)))
continue;
+ if (!allow_fanout && port.second.net->users.size() > 1)
+ continue;
for (auto &usr : port.second.net->users) {
if (!sink_ports.count(CellTypePort(usr)))
continue;
diff --git a/generic/viaduct_helpers.h b/generic/viaduct_helpers.h
index 8cba8411..cac22304 100644
--- a/generic/viaduct_helpers.h
+++ b/generic/viaduct_helpers.h
@@ -70,7 +70,8 @@ struct ViaductHelpers
// expects a set of top-level port types
void remove_nextpnr_iobs(const pool<CellTypePort> &top_ports);
// Constrain cells with certain port connection patterns together with a fixed z-offset
- int constrain_cell_pairs(const pool<CellTypePort> &src_ports, const pool<CellTypePort> &sink_ports, int delta_z);
+ int constrain_cell_pairs(const pool<CellTypePort> &src_ports, const pool<CellTypePort> &sink_ports, int delta_z,
+ bool allow_fanout = true);
// Replace constants with given driving cells
void replace_constants(CellTypePort vcc_driver, CellTypePort gnd_driver,
const dict<IdString, Property> &vcc_params = {},