gen/build: use verilog 2001-style synthesis attributes for vivado (will need rework)
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Thu, 11 Feb 2016 21:54:26 +0000 (22:54 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Thu, 11 Feb 2016 21:54:26 +0000 (22:54 +0100)
litex/build/xilinx/common.py
litex/gen/fhdl/structure.py
litex/gen/fhdl/verilog.py

index 69c1538466f247a0d983d5d366308ce64f3a8774..2fdb9454a507331a0be23520cd3b0e5f1f3e3ed1 100644 (file)
@@ -44,7 +44,7 @@ def settings(path, ver=None, sub=None):
 
 class XilinxNoRetimingImpl(Module):
     def __init__(self, reg):
-        self.specials += SynthesisDirective("attribute register_balancing of {r} is no", r=reg)
+        reg.attribute += " OPTIMIZE =\"OFF\"," # XXX "register balancing is no" equivalent?
 
 
 class XilinxNoRetiming:
@@ -52,12 +52,11 @@ class XilinxNoRetiming:
     def lower(dr):
         return XilinxNoRetimingImpl(dr.reg)
 
-
 class XilinxMultiRegImpl(MultiRegImpl):
     def __init__(self, *args, **kwargs):
         MultiRegImpl.__init__(self, *args, **kwargs)
-        self.specials += [SynthesisDirective("attribute shreg_extract of {r} is no", r=r)
-            for r in self.regs]
+        for reg in self.regs:
+            reg.attribute += " SHIFT_EXTRACT=\"NO\", ASYNC_REG=\"TRUE\","
 
 
 class XilinxMultiReg:
index 113954bfc327223637cef5b1b32edcda7bcfc80c..3316571d7ac82d78a5702f4d27da42759d567bb8 100644 (file)
@@ -310,7 +310,7 @@ class Signal(_Value):
         defaults to 0) and `max` (exclusive, defaults to 2).
     related : Signal or None
     """
-    def __init__(self, bits_sign=None, name=None, variable=False, reset=0, name_override=None, min=None, max=None, related=None):
+    def __init__(self, bits_sign=None, name=None, variable=False, reset=0, name_override=None, min=None, max=None, related=None, attribute=""):
         from litex.gen.fhdl.bitcontainer import bits_for
 
         _Value.__init__(self)
@@ -339,6 +339,7 @@ class Signal(_Value):
         self.name_override = name_override
         self.backtrace = _tracer.trace_back(name)
         self.related = related
+        self.attribute = attribute
 
     def __setattr__(self, k, v):
         if k == "reset":
@@ -524,7 +525,7 @@ class Case(_Statement):
         for k, v in cases.items():
             if isinstance(k, (bool, int)):
                 k = Constant(k)
-            if (not isinstance(k, Constant) 
+            if (not isinstance(k, Constant)
                     and not (isinstance(k, str) and k == "default")):
                 raise TypeError("Case object is not a Migen constant")
             if not isinstance(v, _collections.Iterable):
index bb0c4443b976258779d3ba19a0121d4357adaa8b..1dc4635cb3e2dc4e8cf64c637535c64ac9664d85 100644 (file)
@@ -196,13 +196,16 @@ def _printheader(f, ios, name, ns,
             r += "\tinput " + _printsig(ns, sig)
     r += "\n);\n\n"
     for sig in sorted(sigs - ios, key=lambda x: x.duid):
+        attributes = ""
+        if sig.attribute != "":
+            attributes = "(*" + sig.attribute[:-1] + "*) "
         if sig in wires:
-            r += "wire " + _printsig(ns, sig) + ";\n"
+            r += attributes + "wire " + _printsig(ns, sig) + ";\n"
         else:
             if reg_initialization:
-                r += "reg " + _printsig(ns, sig) + " = " + _printexpr(ns, sig.reset)[0] + ";\n"
+                r += attributes + "reg " + _printsig(ns, sig) + " = " + _printexpr(ns, sig.reset)[0] + ";\n"
             else:
-                r += "reg " + _printsig(ns, sig) + ";\n"
+                r += attributes + "reg " + _printsig(ns, sig) + ";\n"
     r += "\n"
     return r