aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYRabbit <rabbit@yrabbit.cyou>2022-06-09 08:20:29 +1000
committerYRabbit <rabbit@yrabbit.cyou>2022-06-09 08:20:29 +1000
commitbd0af4052c434b1cf3ed8522360b5acc78bd17a2 (patch)
treeb15a4cfd64fa6412c091ba579dee250fb8cae639
parent2da7caf6573d857e72388003982043d743bc9438 (diff)
downloadnextpnr-bd0af4052c434b1cf3ed8522360b5acc78bd17a2.tar.gz
nextpnr-bd0af4052c434b1cf3ed8522360b5acc78bd17a2.tar.bz2
nextpnr-bd0af4052c434b1cf3ed8522360b5acc78bd17a2.zip
gowin: Use local aliases
In the Gowin chips, the tiles are connected to each other by a one-hop wire, among others. There are 4 one-hop wires, of which 2 are shared between north/south and east/west, have three names: e.g. SN10 and N110 and S110. But only one of them, the first, occurs as a sink for PIP, that is, you can not get a route that would pass through the S110 for example. This commit corrects the names to SN?0 and EW?0 at the wire creation stage to avoid dead wires. In addition, the SN?0 and EW?0 are among the few sinks for global clock wires and now there is the possibility of a more optimal clock routing. Signed-off-by: YRabbit <rabbit@yrabbit.cyou>
-rw-r--r--gowin/arch.cc18
1 files changed, 11 insertions, 7 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc
index a991879e..82f5018b 100644
--- a/gowin/arch.cc
+++ b/gowin/arch.cc
@@ -34,6 +34,8 @@
NEXTPNR_NAMESPACE_BEGIN
+const PairPOD *pairLookup(const PairPOD *list, const size_t len, const int dest);
+
// GUI
void Arch::fixClockSpineDecals(void)
{
@@ -627,7 +629,15 @@ IdString Arch::wireToGlobal(int &row, int &col, const DatabasePOD *db, IdString
}
snprintf(buf, 32, "%c%d0", direction, num);
wire = id(buf);
- snprintf(buf, 32, "R%dC%d_%c%d", row + 1, col + 1, direction, num);
+ // local aliases
+ const TilePOD *tile = db->grid[row * db->cols + col].get();
+ auto local_alias = pairLookup(tile->aliases.get(), tile->num_aliases, wire.index);
+ if (local_alias != nullptr) {
+ wire = IdString(local_alias->src_id);
+ snprintf(buf, 32, "R%dC%d_%s", row + 1, col + 1, wire.c_str(this));
+ } else {
+ snprintf(buf, 32, "R%dC%d_%c%d", row + 1, col + 1, direction, num);
+ }
return id(buf);
}
@@ -1491,12 +1501,6 @@ Arch::Arch(ArchArgs args) : args(args)
snprintf(buf, 32, "R%dC%d_%s_%s", row + 1, col + 1, srcid.c_str(this), destid.c_str(this));
IdString pipname = id(buf);
DelayQuad delay = getWireTypeDelay(destid);
- // local alias
- auto local_alias = pairLookup(tile->aliases.get(), tile->num_aliases, srcid.index);
- if (local_alias != nullptr) {
- srcid = IdString(local_alias->src_id);
- gsrcname = wireToGlobal(srcrow, srccol, db, srcid);
- }
// global alias
srcid = IdString(pip.src_id);
GlobalAliasPOD alias;