vendor.xilinx_{7series,spartan3_6}: specialize MultiReg.
authorDarrell Harmon <dlharmon@users.noreply.github.com>
Fri, 20 Sep 2019 15:13:27 +0000 (09:13 -0600)
committerwhitequark <whitequark@whitequark.org>
Fri, 20 Sep 2019 15:13:27 +0000 (15:13 +0000)
Vivado/ISE would otherwise infer an SRL16 from a MultiReg in some cases.

nmigen/vendor/xilinx_7series.py
nmigen/vendor/xilinx_spartan_3_6.py

index 6e7d22797220ff8423bfaad0e256a3a73b509866..d78581c16d46b4365203a74279dba3716d8d0da6 100644 (file)
@@ -360,3 +360,11 @@ class Xilinx7SeriesPlatform(TemplatedPlatform):
                 io_IO=p_port[bit], io_IOB=n_port[bit]
             )
         return m
+
+    def get_multi_reg(self, multireg):
+        m = Module()
+        for i, o in zip((multireg.i, *multireg._regs), multireg._regs):
+            o.attrs["ASYNC_REG"] = "TRUE"
+            m.d[multireg._o_domain] += o.eq(i)
+        m.d.comb += multireg.o.eq(multireg._regs[-1])
+        return m
index 00d6831da55d6708b72d03119fbf596e817157ab..25b2a592aa29eb82099761998038d00575614c7c 100644 (file)
@@ -411,6 +411,14 @@ class XilinxSpartan3Or6Platform(TemplatedPlatform):
             )
         return m
 
+    def get_multi_reg(self, multireg):
+        m = Module()
+        for i, o in zip((multireg.i, *multireg._regs), multireg._regs):
+            o.attrs["ASYNC_REG"] = "TRUE"
+            m.d[multireg._o_domain] += o.eq(i)
+        m.d.comb += multireg.o.eq(multireg._regs[-1])
+        return m
+
 
 XilinxSpartan3APlatform = XilinxSpartan3Or6Platform
 XilinxSpartan6Platform = XilinxSpartan3Or6Platform