Skip to content

Commit fe75f40

Browse files
committed
memory: fix iteration order of MemoryMap resources and windows.
Fixes #74.
1 parent 9f46553 commit fe75f40

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

amaranth_soc/memory.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,11 @@ def resources(self):
403403
A tuple ``resource, name, (start, end)`` describing the address range assigned to the
404404
resource.
405405
"""
406-
for resource, resource_name, resource_range in self._resources.values():
406+
def is_resource(item):
407+
addr_range, assignment = item
408+
return id(assignment) in self._resources
409+
for resource_range, resource in filter(is_resource, self._ranges.items()):
410+
_, resource_name, _ = self._resources[id(resource)]
407411
yield resource, resource_name, (resource_range.start, resource_range.stop)
408412

409413
def add_window(self, window, *, addr=None, sparse=None):
@@ -537,7 +541,10 @@ def windows(self):
537541
contiguous addresses on the narrower bus that are accessed for each transaction on
538542
the wider bus. Otherwise, it is always 1.
539543
"""
540-
for window, window_range in self._windows.values():
544+
def is_window(item):
545+
addr_range, assignment = item
546+
return id(assignment) in self._windows
547+
for window_range, window in filter(is_window, self._ranges.items()):
541548
yield window, (window_range.start, window_range.stop, window_range.step)
542549

543550
def window_patterns(self):
@@ -554,14 +561,14 @@ def window_patterns(self):
554561
the narrower bus that are accessed for each transaction on the wider bus. Otherwise,
555562
it is always 1.
556563
"""
557-
for window, window_range in self._windows.values():
564+
for window, (window_start, window_stop, window_ratio) in self.windows():
558565
const_bits = self.addr_width - window.addr_width
559566
if const_bits > 0:
560-
const_pat = "{:0{}b}".format(window_range.start >> window.addr_width, const_bits)
567+
const_pat = "{:0{}b}".format(window_start >> window.addr_width, const_bits)
561568
else:
562569
const_pat = ""
563570
pattern = "{}{}".format(const_pat, "-" * window.addr_width)
564-
yield window, (pattern, window_range.step)
571+
yield window, (pattern, window_ratio)
565572

566573
@staticmethod
567574
def _translate(resource_info, window, window_range):

tests/test_csr_reg.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -837,17 +837,17 @@ def test_memory_map(self):
837837
self.assertEqual(results[0][1], ("a",))
838838
self.assertEqual(results[0][2], (0, 1))
839839

840-
self.assertIs(results[1][0], rc)
841-
self.assertEqual(results[1][1], ("b", "c"))
842-
self.assertEqual(results[1][2], (3, 4))
840+
self.assertIs(results[1][0], rd)
841+
self.assertEqual(results[1][1], ("b", "d"))
842+
self.assertEqual(results[1][2], (1, 2))
843843

844-
self.assertIs(results[2][0], rd)
845-
self.assertEqual(results[2][1], ("b", "d"))
846-
self.assertEqual(results[2][2], (1, 2))
844+
self.assertIs(results[2][0], re)
845+
self.assertEqual(results[2][1], ("b", "e"))
846+
self.assertEqual(results[2][2], (2, 3))
847847

848-
self.assertIs(results[3][0], re)
849-
self.assertEqual(results[3][1], ("b", "e"))
850-
self.assertEqual(results[3][2], (2, 3))
848+
self.assertIs(results[3][0], rc)
849+
self.assertEqual(results[3][1], ("b", "c"))
850+
self.assertEqual(results[3][2], (3, 4))
851851

852852
self.assertIs(results[4][0], rf)
853853
self.assertEqual(results[4][1], ("b", "0", "f"))

tests/test_memory.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,11 +372,14 @@ def test_iter_resources(self):
372372
memory_map = MemoryMap(addr_width=16, data_width=8)
373373
res1 = _MockResource("res1")
374374
res2 = _MockResource("res2")
375-
memory_map.add_resource(res1, name=("foo",), size=1)
376-
memory_map.add_resource(res2, name=("bar",), size=2)
375+
res3 = _MockResource("res3")
376+
memory_map.add_resource(res1, name=("a",), size=1)
377+
memory_map.add_resource(res2, name=("b",), size=2, addr=2)
378+
memory_map.add_resource(res3, name=("c",), size=1, addr=1)
377379
self.assertEqual(list(memory_map.resources()), [
378-
(res1, ("foo",), (0, 1)),
379-
(res2, ("bar",), (1, 3)),
380+
(res1, ("a",), (0, 1)),
381+
(res3, ("c",), (1, 2)),
382+
(res2, ("b",), (2, 4)),
380383
])
381384

382385
def test_add_window(self):
@@ -487,22 +490,28 @@ def test_add_window_wrong_name_conflict_subordinate(self):
487490
def test_iter_windows(self):
488491
memory_map = MemoryMap(addr_width=16, data_width=16)
489492
window_1 = MemoryMap(addr_width=10, data_width=8)
490-
memory_map.add_window(window_1, sparse=False)
491493
window_2 = MemoryMap(addr_width=12, data_width=16)
494+
window_3 = MemoryMap(addr_width=10, data_width=8)
495+
memory_map.add_window(window_1, sparse=False)
492496
memory_map.add_window(window_2)
497+
memory_map.add_window(window_3, sparse=False, addr=0x400)
493498
self.assertEqual(list(memory_map.windows()), [
494-
(window_1, (0, 0x200, 2)),
499+
(window_1, (0x0000, 0x0200, 2)),
500+
(window_3, (0x0400, 0x0600, 2)),
495501
(window_2, (0x1000, 0x2000, 1)),
496502
])
497503

498504
def test_iter_window_patterns(self):
499505
memory_map = MemoryMap(addr_width=16, data_width=16)
500506
window_1 = MemoryMap(addr_width=10, data_width=8)
501-
memory_map.add_window(window_1, sparse=False)
502507
window_2 = MemoryMap(addr_width=12, data_width=16)
508+
window_3 = MemoryMap(addr_width=10, data_width=8)
509+
memory_map.add_window(window_1, sparse=False)
503510
memory_map.add_window(window_2)
511+
memory_map.add_window(window_3, sparse=False, addr=0x400)
504512
self.assertEqual(list(memory_map.window_patterns()), [
505513
(window_1, ("000000----------", 2)),
514+
(window_3, ("000001----------", 2)),
506515
(window_2, ("0001------------", 1)),
507516
])
508517

0 commit comments

Comments
 (0)