aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYRabbit <rabbit@yrabbit.cyou>2021-09-04 17:39:09 +1000
committerYRabbit <rabbit@yrabbit.cyou>2021-09-04 17:39:09 +1000
commitd6fdd6c7cec607c8270968157dac50c1259993fb (patch)
treecd6865130d04de690c5766d3025bcc99c876c6a1
parente4701f2da1104550569a412fa40056619a5e9c2e (diff)
parente82d49e13aa342ba9d79c2c91bb64d2ea91653c7 (diff)
downloadnextpnr-d6fdd6c7cec607c8270968157dac50c1259993fb.tar.gz
nextpnr-d6fdd6c7cec607c8270968157dac50c1259993fb.tar.bz2
nextpnr-d6fdd6c7cec607c8270968157dac50c1259993fb.zip
Merge branch 'combine-dff' into extend-placement
-rw-r--r--gowin/arch.cc28
1 files changed, 26 insertions, 2 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc
index 813d52ed..022c93c3 100644
--- a/gowin/arch.cc
+++ b/gowin/arch.cc
@@ -804,6 +804,27 @@ Arch::Arch(ArchArgs args) : args(args)
}
}
}
+
+ // Permissible combinations of modes in a single slice
+ dff_comp_mode[id_DFF] = id_DFF;
+ dff_comp_mode[id_DFFE] = id_DFFE;
+ dff_comp_mode[id_DFFS] = id_DFFR;
+ dff_comp_mode[id_DFFR] = id_DFFS;
+ dff_comp_mode[id_DFFSE] = id_DFFRE;
+ dff_comp_mode[id_DFFRE] = id_DFFSE;
+ dff_comp_mode[id_DFFP] = id_DFFC;
+ dff_comp_mode[id_DFFC] = id_DFFP;
+ dff_comp_mode[id_DFFPE] = id_DFFCE;
+ dff_comp_mode[id_DFFCE] = id_DFFPE;
+ dff_comp_mode[id_DFFNS] = id_DFFNR;
+ dff_comp_mode[id_DFFNR] = id_DFFNS;
+ dff_comp_mode[id_DFFNSE] = id_DFFNRE;
+ dff_comp_mode[id_DFFNRE] = id_DFFNSE;
+ dff_comp_mode[id_DFFNP] = id_DFFNC;
+ dff_comp_mode[id_DFFNC] = id_DFFNP;
+ dff_comp_mode[id_DFFNPE] = id_DFFNCE;
+ dff_comp_mode[id_DFFNCE] = id_DFFNPE;
+
BaseArch::init_cell_types();
BaseArch::init_bel_buckets();
}
@@ -1251,8 +1272,11 @@ bool Arch::cellsCompatible(const CellInfo **cells, int count) const
return false;
if (mode[cls] == IdString())
mode[cls] = ci->ff_type;
- else if (mode[cls] != ci->ff_type)
- return false;
+ else if (mode[cls] != ci->ff_type) {
+ auto res = dff_comp_mode.find(mode[cls]);
+ if (res == dff_comp_mode.end() || res->second != ci->ff_type)
+ return false;
+ }
}
}
return true;