From 354d497a577afa5800924a6217d6edf1e6bf6c23 Mon Sep 17 00:00:00 2001 From: Pepijn de Vos Date: Sun, 28 Feb 2021 17:48:05 +0100 Subject: only one type of dff per slice --- gowin/arch.cc | 8 +++++++- gowin/archdefs.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'gowin') 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 -- cgit v1.2.3