def raw_bits(self):
return Cat(*self.flatten())
- def connect(self, *slaves, leave_out=set()):
- if isinstance(leave_out, str):
- leave_out = {leave_out}
+ def connect(self, *slaves, keep=None, omit=None):
+ if keep is None:
+ keep = set([f[0] for f in self.layout])
+ if isinstance(keep, list):
+ keep = set(keep)
+ if omit is None:
+ omit = set()
+ if isinstance(omit, list):
+ omit = set(omit)
+
+ keep = keep - omit
+
r = []
for f in self.layout:
field = f[0]
- if field not in leave_out:
- self_e = getattr(self, field)
- if isinstance(self_e, Signal):
+ self_e = getattr(self, field)
+ if isinstance(self_e, Signal):
+ if field in keep:
direction = f[2]
if direction == DIR_M_TO_S:
r += [getattr(slave, field).eq(self_e) for slave in slaves]
r.append(self_e.eq(reduce(or_, [getattr(slave, field) for slave in slaves])))
else:
raise TypeError
- else:
- for slave in slaves:
- r += self_e.connect(getattr(slave, field), leave_out=leave_out)
+ else:
+ for slave in slaves:
+ r += self_e.connect(getattr(slave, field), keep=keep, omit=omit)
return r
def connect_flat(self, *slaves):