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
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):
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):
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,