Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 2 commits
  • 2 files changed
  • 0 commit comments
  • 1 contributor
Showing with 25 additions and 19 deletions.
  1. +14 −13 migen/bus/wishbone.py
  2. +11 −6 migen/genlib/record.py
27 migen/bus/wishbone.py
View
@@ -6,22 +6,23 @@
from migen.sim.generic import Proxy
_layout = [
- ("adr", 30, DIR_M_TO_S),
- ("dat_w", 32, DIR_M_TO_S),
- ("dat_r", 32, DIR_S_TO_M),
- ("sel", 4, DIR_M_TO_S),
- ("cyc", 1, DIR_M_TO_S),
- ("stb", 1, DIR_M_TO_S),
- ("ack", 1, DIR_S_TO_M),
- ("we", 1, DIR_M_TO_S),
- ("cti", 3, DIR_M_TO_S),
- ("bte", 2, DIR_M_TO_S),
- ("err", 1, DIR_S_TO_M)
+ ("adr", 30, DIR_M_TO_S),
+ ("dat_w", "data_width", DIR_M_TO_S),
+ ("dat_r", "data_width", DIR_S_TO_M),
+ ("sel", "sel_width", DIR_M_TO_S),
+ ("cyc", 1, DIR_M_TO_S),
+ ("stb", 1, DIR_M_TO_S),
+ ("ack", 1, DIR_S_TO_M),
+ ("we", 1, DIR_M_TO_S),
+ ("cti", 3, DIR_M_TO_S),
+ ("bte", 2, DIR_M_TO_S),
+ ("err", 1, DIR_S_TO_M)
]
class Interface(Record):
- def __init__(self):
- Record.__init__(self, _layout)
+ def __init__(self, data_width=32):
+ Record.__init__(self, _layout, data_width=data_width,
+ sel_width=data_width//8)
class InterconnectPointToPoint(Module):
def __init__(self, master, slave):
17 migen/genlib/record.py
View
@@ -11,19 +11,21 @@
# 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 @@ def connect_flat(self, *slaves):
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)) + ">"

No commit comments for this range

Something went wrong with that request. Please try again.