diff options
author | Pepijn de Vos <pepijndevos@gmail.com> | 2021-02-28 17:48:05 +0100 |
---|---|---|
committer | Pepijn de Vos <pepijndevos@gmail.com> | 2021-02-28 17:48:05 +0100 |
commit | 354d497a577afa5800924a6217d6edf1e6bf6c23 (patch) | |
tree | 144415525c99df17319d2f9e1ed2626fbade6473 | |
parent | 6689bfe923791e7c1c2dd46134f8420f11abee29 (diff) | |
download | nextpnr-354d497a577afa5800924a6217d6edf1e6bf6c23.tar.gz nextpnr-354d497a577afa5800924a6217d6edf1e6bf6c23.tar.bz2 nextpnr-354d497a577afa5800924a6217d6edf1e6bf6c23.zip |
only one type of dff per slice
-rw-r--r-- | gowin/arch.cc | 8 | ||||
-rw-r--r-- | gowin/archdefs.h | 2 |
2 files changed, 9 insertions, 1 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc index 72051b3f..5e1811ea 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -1129,6 +1129,7 @@ void Arch::assignArchInfo() if (ci->type == id("SLICE")) { ci->is_slice = true; ci->ff_used = ci->params.at(id_FF_USED).as_bool(); + ci->ff_type = id(ci->params.at(id_FF_TYPE).as_string()); ci->slice_clk = get_net_or_empty(ci, id("CLK")); ci->slice_ce = get_net_or_empty(ci, id("CE")); ci->slice_lsr = get_net_or_empty(ci, id("LSR")); @@ -1162,9 +1163,10 @@ bool Arch::cellsCompatible(const CellInfo **cells, int count) const const NetInfo *clk[4] = {nullptr, nullptr, nullptr, nullptr}; const NetInfo *ce[4] = {nullptr, nullptr, nullptr, nullptr}; const NetInfo *lsr[4] = {nullptr, nullptr, nullptr, nullptr}; + IdString mode[4] = {IdString(), IdString(), IdString(), IdString()}; for (int i = 0; i < count; i++) { const CellInfo *ci = cells[i]; - if (ci->is_slice && ci->slice_clk != nullptr) { + if (ci->is_slice) { Loc loc = getBelLocation(ci->bel); int cls = loc.z / 2; if (loc.z >= 6 && ci->ff_used) // top slice have no ff @@ -1181,6 +1183,10 @@ bool Arch::cellsCompatible(const CellInfo **cells, int count) const lsr[cls] = ci->slice_lsr; else if (lsr[cls] != ci->slice_lsr) return false; + if (mode[cls] == IdString()) + mode[cls] = ci->ff_type; + else if (mode[cls] != ci->ff_type) + return false; } } return true; diff --git a/gowin/archdefs.h b/gowin/archdefs.h index 67ac6521..963660c6 100644 --- a/gowin/archdefs.h +++ b/gowin/archdefs.h @@ -57,6 +57,8 @@ struct ArchCellInfo { // Is the flip-flop of this slice used bool ff_used; + // The type of this flip-flop + IdString ff_type; // Is a slice type primitive bool is_slice; // Only packing rule for slice type primitives is a single clock per tile |