Skip to content

Commit 9d67a0a

Browse files
Jean-François Nguyenjfng
authored andcommitted
memory: use id() to index memory map resources and windows.
Resource objects are no longer required to implement __hash__.
1 parent e9f73e4 commit 9d67a0a

File tree

2 files changed

+21
-24
lines changed

2 files changed

+21
-24
lines changed

nmigen_soc/csr/bus.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,6 @@ def __init__(self, width, access, *, name=None, src_loc_at=0):
7676
]
7777
super().__init__(layout, name=name, src_loc_at=1 + src_loc_at)
7878

79-
# FIXME: get rid of this
80-
__hash__ = object.__hash__
81-
8279

8380
class Interface(Record):
8481
"""CPU-side CSR interface.

nmigen_soc/memory.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ def _compute_addr_range(self, addr, size, step=1, *, alignment, extend):
186186
if overlaps:
187187
overlap_descrs = []
188188
for overlap in overlaps:
189-
if overlap in self._resources:
190-
resource_range = self._resources[overlap]
189+
if id(overlap) in self._resources:
190+
_, resource_range = self._resources[id(overlap)]
191191
overlap_descrs.append("resource {!r} at {:#x}..{:#x}"
192192
.format(overlap, resource_range.start, resource_range.stop))
193-
if overlap in self._windows:
194-
window_range = self._windows[overlap]
193+
if id(overlap) in self._windows:
194+
_, window_range = self._windows[id(overlap)]
195195
overlap_descrs.append("window {!r} at {:#x}..{:#x}"
196196
.format(overlap, window_range.start, window_range.stop))
197197
raise ValueError("Address range {:#x}..{:#x} overlaps with {}"
@@ -231,8 +231,8 @@ def add_resource(self, resource, *, size, addr=None, alignment=None, extend=Fals
231231
Raises :exn:`ValueError` if the requested address and size, after alignment, would overlap
232232
with any resources or windows that have already been added, or would be out of bounds.
233233
"""
234-
if resource in self._resources:
235-
addr_range = self._resources[resource]
234+
if id(resource) in self._resources:
235+
_, addr_range = self._resources[id(resource)]
236236
raise ValueError("Resource {!r} is already added at address range {:#x}..{:#x}"
237237
.format(resource, addr_range.start, addr_range.stop))
238238

@@ -246,7 +246,7 @@ def add_resource(self, resource, *, size, addr=None, alignment=None, extend=Fals
246246

247247
addr_range = self._compute_addr_range(addr, size, alignment=alignment, extend=extend)
248248
self._ranges.insert(addr_range, resource)
249-
self._resources[resource] = addr_range
249+
self._resources[id(resource)] = resource, addr_range
250250
self._next_addr = addr_range.stop
251251
return addr_range.start, addr_range.stop
252252

@@ -259,7 +259,7 @@ def resources(self):
259259
------------
260260
A tuple ``resource, (start, end)`` describing the address range assigned to the resource.
261261
"""
262-
for resource, resource_range in self._resources.items():
262+
for resource, resource_range in self._resources.values():
263263
yield resource, (resource_range.start, resource_range.stop)
264264

265265
def add_window(self, window, *, addr=None, sparse=None, extend=False):
@@ -313,8 +313,8 @@ def add_window(self, window, *, addr=None, sparse=None, extend=False):
313313
if not isinstance(window, MemoryMap):
314314
raise TypeError("Window must be a MemoryMap, not {!r}"
315315
.format(window))
316-
if window in self._windows:
317-
addr_range = self._windows[window]
316+
if id(window) in self._windows:
317+
_, addr_range = self._windows[id(window)]
318318
raise ValueError("Window {!r} is already added at address range {:#x}..{:#x}"
319319
.format(window, addr_range.start, addr_range.stop))
320320

@@ -351,7 +351,7 @@ def add_window(self, window, *, addr=None, sparse=None, extend=False):
351351
addr_range = self._compute_addr_range(addr, size, ratio, alignment=alignment,
352352
extend=extend)
353353
self._ranges.insert(addr_range, window)
354-
self._windows[window] = addr_range
354+
self._windows[id(window)] = window, addr_range
355355
self._next_addr = addr_range.stop
356356
return addr_range.start, addr_range.stop, addr_range.step
357357

@@ -367,7 +367,7 @@ def windows(self):
367367
contiguous addresses on the narrower bus that are accessed for each transaction on
368368
the wider bus. Otherwise, it is always 1.
369369
"""
370-
for window, window_range in self._windows.items():
370+
for window, window_range in self._windows.values():
371371
yield window, (window_range.start, window_range.stop, window_range.step)
372372

373373
def window_patterns(self):
@@ -384,7 +384,7 @@ def window_patterns(self):
384384
the narrower bus that are accessed for each transaction on the wider bus. Otherwise,
385385
it is always 1.
386386
"""
387-
for window, window_range in self._windows.items():
387+
for window, window_range in self._windows.values():
388388
const_bits = self.addr_width - window.addr_width
389389
if const_bits > 0:
390390
const_pat = "{:0{}b}".format(window_range.start >> window.addr_width, const_bits)
@@ -418,9 +418,9 @@ def all_resources(self):
418418
uses sparse addressing.
419419
"""
420420
for addr_range, assignment in self._ranges.items():
421-
if assignment in self._resources:
421+
if id(assignment) in self._resources:
422422
yield assignment, (addr_range.start, addr_range.stop, self.data_width)
423-
elif assignment in self._windows:
423+
elif id(assignment) in self._windows:
424424
for sub_resource, sub_descr in assignment.all_resources():
425425
yield sub_resource, self._translate(*sub_descr, assignment, addr_range)
426426
else:
@@ -448,11 +448,11 @@ def find_resource(self, resource):
448448
----------
449449
Raises :exn:`KeyError` if the resource is not found.
450450
"""
451-
if resource in self._resources:
452-
resource_range = self._resources[resource]
451+
if id(resource) in self._resources:
452+
_, resource_range = self._resources[id(resource)]
453453
return resource_range.start, resource_range.stop, self.data_width
454454

455-
for window, window_range in self._windows.items():
455+
for window, window_range in self._windows.values():
456456
try:
457457
return self._translate(*window.find_resource(resource), window, window_range)
458458
except KeyError:
@@ -476,10 +476,10 @@ def decode_address(self, address):
476476
if assignment is None:
477477
return
478478

479-
if assignment in self._resources:
479+
if id(assignment) in self._resources:
480480
return assignment
481-
elif assignment in self._windows:
482-
addr_range = self._windows[assignment]
481+
elif id(assignment) in self._windows:
482+
_, addr_range = self._windows[id(assignment)]
483483
return assignment.decode_address((address - addr_range.start) // addr_range.step)
484484
else:
485485
assert False # :nocov:

0 commit comments

Comments
 (0)