genlib/record: support abstract signal width
This commit is contained in:
parent
7e20320b9d
commit
14ed5c1acc
|
@ -11,19 +11,21 @@ from migen.genlib.misc import optree
|
|||
# size can be an int, or a (int, bool) tuple for signed numbers
|
||||
# sublayout must be a list
|
||||
|
||||
def layout_len(layout):
|
||||
def layout_len(layout, **layout_dict):
|
||||
r = 0
|
||||
for f in layout:
|
||||
if isinstance(f[1], (int, tuple)): # cases 1/2
|
||||
if isinstance(f[1], (int, tuple, str)): # cases 1/2
|
||||
if(len(f) == 3):
|
||||
fname, fsize, fdirection = f
|
||||
else:
|
||||
fname, fsize = f
|
||||
elif isinstance(f[1], list): # case 3
|
||||
fname, fsublayout = f
|
||||
fsize = layout_len(fsublayout)
|
||||
fsize = layout_len(fsublayout, **layout_dict)
|
||||
else:
|
||||
raise TypeError
|
||||
if isinstance(fsize, str):
|
||||
fsize = layout_dict[fsize]
|
||||
if isinstance(fsize, tuple):
|
||||
r += fsize[0]
|
||||
else:
|
||||
|
@ -55,20 +57,23 @@ def layout_partial(layout, *elements):
|
|||
return r
|
||||
|
||||
class Record:
|
||||
def __init__(self, layout, name=None):
|
||||
def __init__(self, layout, name=None, **layout_dict):
|
||||
self.name = get_obj_var_name(name, "")
|
||||
self.layout = layout
|
||||
self.layout_dict = layout_dict
|
||||
|
||||
if self.name:
|
||||
prefix = self.name + "_"
|
||||
else:
|
||||
prefix = ""
|
||||
for f in self.layout:
|
||||
if isinstance(f[1], (int, tuple)): # cases 1/2
|
||||
if isinstance(f[1], (int, tuple, str)): # cases 1/2
|
||||
if(len(f) == 3):
|
||||
fname, fsize, fdirection = f
|
||||
else:
|
||||
fname, fsize = f
|
||||
if isinstance(fsize, str):
|
||||
fsize = layout_dict[fsize]
|
||||
finst = Signal(fsize, name=prefix + fname)
|
||||
elif isinstance(f[1], list): # case 3
|
||||
fname, fsublayout = f
|
||||
|
@ -139,7 +144,7 @@ class Record:
|
|||
return r
|
||||
|
||||
def __len__(self):
|
||||
return layout_len(self.layout)
|
||||
return layout_len(self.layout, **self.layout_dict)
|
||||
|
||||
def __repr__(self):
|
||||
return "<Record " + ":".join(f[0] for f in self.layout) + " at " + hex(id(self)) + ">"
|
||||
|
|
Loading…
Reference in New Issue