hdl.mem: add synthesis attribute support.
authorwhitequark <whitequark@whitequark.org>
Thu, 6 Feb 2020 14:48:48 +0000 (14:48 +0000)
committerwhitequark <whitequark@whitequark.org>
Thu, 6 Feb 2020 14:53:16 +0000 (14:53 +0000)
Fixes #291.

nmigen/back/rtlil.py
nmigen/hdl/mem.py
nmigen/test/test_hdl_mem.py

index dbddd618965da92e2b374e220c6002a4348e8a78..0e5c93abf0610f02f0cea0140678551a018d075e 100644 (file)
@@ -826,7 +826,7 @@ def _convert_fragment(builder, fragment, name_map, hierarchy):
                         memory = param_value
                         if memory not in memories:
                             memories[memory] = module.memory(width=memory.width, size=memory.depth,
-                                                             name=memory.name)
+                                                             name=memory.name, attrs=memory.attrs)
                             addr_bits = bits_for(memory.depth)
                             data_parts = []
                             data_mask = (1 << memory.width) - 1
index fc6c011bf61a4de6e25a417e4286bdf122e9cd45..235cbd2bf7438e96bfea8a0d23b513cffc9c6d0e 100644 (file)
@@ -1,4 +1,5 @@
 import operator
+from collections import OrderedDict
 
 from .. import tracer
 from .ast import *
@@ -24,14 +25,17 @@ class Memory:
     name : str
         Name hint for this memory. If ``None`` (default) the name is inferred from the variable
         name this ``Signal`` is assigned to.
+    attrs : dict
+        Dictionary of synthesis attributes.
 
     Attributes
     ----------
     width : int
     depth : int
     init : list of int
+    attrs : dict
     """
-    def __init__(self, *, width, depth, init=None, name=None, simulate=True):
+    def __init__(self, *, width, depth, init=None, name=None, attrs=None, simulate=True):
         if not isinstance(width, int) or width < 0:
             raise TypeError("Memory width must be a non-negative integer, not {!r}"
                             .format(width))
@@ -44,6 +48,7 @@ class Memory:
 
         self.width = width
         self.depth = depth
+        self.attrs = OrderedDict(() if attrs is None else attrs)
 
         # Array of signals for simulation.
         self._array = Array()
index e7fc232abe1f6cba1d5397a5f48d04be9fc37fe7..131c6398d458d145bf34a7ba6573bf6445b47849 100644 (file)
@@ -42,6 +42,12 @@ class MemoryTestCase(FHDLTestCase):
                     "'str' object cannot be interpreted as an integer"):
             m = Memory(width=8, depth=4, init=[1, "0"])
 
+    def test_attrs(self):
+        m1 = Memory(width=8, depth=4)
+        self.assertEqual(m1.attrs, {})
+        m2 = Memory(width=8, depth=4, attrs={"ram_block": True})
+        self.assertEqual(m2.attrs, {"ram_block": True})
+
     def test_read_port_transparent(self):
         mem    = Memory(width=8, depth=4)
         rdport = mem.read_port()