Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/nmigen
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: dda8f34d396a
Choose a base ref
...
head repository: m-labs/nmigen
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 611c25f90947
Choose a head ref
  • 1 commit
  • 2 files changed
  • 1 contributor

Commits on Apr 19, 2019

  1. hdl.rec: fix slicing of records.

    whitequark committed Apr 19, 2019
    Copy the full SHA
    611c25f View commit details
Showing with 22 additions and 10 deletions.
  1. +13 −10 nmigen/hdl/rec.py
  2. +9 −0 nmigen/test/test_hdl_rec.py
23 changes: 13 additions & 10 deletions nmigen/hdl/rec.py
Original file line number Diff line number Diff line change
@@ -85,16 +85,19 @@ def concat(a, b):
def __getattr__(self, name):
return self[name]

def __getitem__(self, name):
try:
return self.fields[name]
except KeyError:
if self.name is None:
reference = "Unnamed record"
else:
reference = "Record '{}'".format(self.name)
raise NameError("{} does not have a field '{}'. Did you mean one of: {}?"
.format(reference, name, ", ".join(self.fields))) from None
def __getitem__(self, item):
if isinstance(item, str):
try:
return self.fields[item]
except KeyError:
if self.name is None:
reference = "Unnamed record"
else:
reference = "Record '{}'".format(self.name)
raise NameError("{} does not have a field '{}'. Did you mean one of: {}?"
.format(reference, item, ", ".join(self.fields))) from None
else:
return super().__getitem__(item)

def shape(self):
return sum(len(f) for f in self.fields.values()), False
9 changes: 9 additions & 0 deletions nmigen/test/test_hdl_rec.py
Original file line number Diff line number Diff line change
@@ -79,6 +79,15 @@ def test_unnamed(self):
self.assertEqual(repr(r), "(rec <unnamed> stb)")
self.assertEqual(r.stb.name, "stb")

def test_iter(self):
r = Record([
("data", 4),
("stb", 1),
])

self.assertEqual(repr(r[0]), "(slice (rec r data stb) 0:1)")
self.assertEqual(repr(r[0:3]), "(slice (rec r data stb) 0:3)")

def test_wrong_field(self):
r = Record([
("stb", 1),