format code
[nmutil.git] / src / nmutil / iocontrol.py
index 853a1d040d9f6dcdfd48daee06674f94953b2f58..18dffa2e756fdfe77ade446fac926a463da1303f 100644 (file)
@@ -23,6 +23,7 @@
 from nmigen import Signal, Cat, Const, Module, Value, Elaboratable
 from nmigen.cli import verilog, rtlil
 from nmigen.hdl.rec import Record
+from nmigen import tracer
 
 from collections.abc import Sequence, Iterable
 from collections import OrderedDict
@@ -73,15 +74,41 @@ class Object:
         return list(self)
 
 
+def add_prefix_to_record_signals(prefix, record):
+    """recursively hunt through Records, modifying names to add a prefix
+    """
+    for key, val in record.fields.items():
+        if isinstance(val, Signal):
+            val.name = prefix + val.name
+        elif isinstance(val, Record):
+            add_prefix_to_record_signals(prefix, val)
+
+
 class RecordObject(Record):
     def __init__(self, layout=None, name=None):
+        #if name is None:
+        #    name = tracer.get_var_name(depth=2, default="$ro")
         Record.__init__(self, layout=layout or [], name=name)
 
+
     def __setattr__(self, k, v):
+        #print(f"RecordObject setattr({k}, {v})")
         #print (dir(Record))
         if (k.startswith('_') or k in ["fields", "name", "src_loc"] or
            k in dir(Record) or "fields" not in self.__dict__):
             return object.__setattr__(self, k, v)
+
+        if self.name is None:
+            prefix = ""
+        else:
+            prefix = self.name + "_"
+        # Prefix the signal name with the name of the recordobject
+        if isinstance(v, Signal):
+            #print (self, self.name, v.name)
+            v.name = prefix + v.name
+        elif isinstance(v, Record):
+            add_prefix_to_record_signals(prefix, v)
+
         self.fields[k] = v
         #print ("RecordObject setattr", k, v)
         if isinstance(v, Record):
@@ -94,7 +121,9 @@ class RecordObject(Record):
 
     def __iter__(self):
         for x in self.fields.values(): # remember: fields is an OrderedDict
-            if isinstance(x, Record):
+            if hasattr(x, 'ports'):
+                yield from x.ports()
+            elif isinstance(x, Record):
                 for f in x.fields.values():
                     yield f
             elif isinstance(x, Iterable):
@@ -243,7 +272,8 @@ class NextControl(Elaboratable):
                 res.append(nxt.stop_i.eq(self.stop_o))
         if do_data:
             res.append(nmoperator.eq(nxt.data_i, self.data_o))
-        print ("connect to next", self, self.maskwid, nxt.data_i, do_data, do_stop)
+        print ("connect to next", self, self.maskwid, nxt.data_i,
+                                  do_data, do_stop)
         return res
 
     def _connect_out(self, nxt, direct=False, fn=None,