aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gowin/arch.cc8
-rw-r--r--gowin/archdefs.h2
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