Skip to content

Commit 23f7f2e

Browse files
committed
Implement RFC 45: Move hdl.Memory to lib.Memory.
1 parent c91873c commit 23f7f2e

File tree

8 files changed

+454
-27
lines changed

8 files changed

+454
-27
lines changed

amaranth/hdl/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ._dsl import SyntaxError, SyntaxWarning, Module
55
from ._cd import DomainError, ClockDomain
66
from ._ir import UnusedElaboratable, Elaboratable, DriverConflict, Fragment, Instance
7-
from ._mem import Memory, ReadPort, WritePort, DummyPort
7+
from ._mem import MemoryIdentity, MemoryInstance, Memory, ReadPort, WritePort, DummyPort
88
from ._rec import Record
99
from ._xfrm import DomainRenamer, ResetInserter, EnableInserter
1010

@@ -21,7 +21,7 @@
2121
# _ir
2222
"UnusedElaboratable", "Elaboratable", "DriverConflict", "Fragment", "Instance",
2323
# _mem
24-
"Memory", "ReadPort", "WritePort", "DummyPort",
24+
"MemoryIdentity", "MemoryInstance", "Memory", "ReadPort", "WritePort", "DummyPort",
2525
# _rec
2626
"Record",
2727
# _xfrm

amaranth/hdl/_ir.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,7 @@ def emit_read_port(self, module_idx: int, fragment: '_mem.MemoryInstance',
11091109
en=en,
11101110
clk=clk,
11111111
clk_edge=cd.clk_edge,
1112-
transparent_for=tuple(write_ports[idx] for idx in port._transparency),
1112+
transparent_for=tuple(write_ports[idx] for idx in port._transparent_for),
11131113
src_loc=port._data.src_loc,
11141114
)
11151115
data = self.netlist.add_value_cell(len(port._data), cell)

amaranth/hdl/_mem.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ def __init__(self, identity, addr, data):
3333

3434
class MemoryInstance(Fragment):
3535
class _ReadPort:
36-
def __init__(self, *, domain, addr, data, en, transparency):
36+
def __init__(self, *, domain, addr, data, en, transparent_for):
3737
assert isinstance(domain, str)
3838
self._domain = domain
3939
self._addr = Value.cast(addr)
4040
self._data = Value.cast(data)
4141
self._en = Value.cast(en)
42-
self._transparency = tuple(transparency)
42+
self._transparent_for = tuple(transparent_for)
4343
assert len(self._en) == 1
4444
if domain == "comb":
4545
assert isinstance(self._en, Const)
4646
assert self._en.width == 1
4747
assert self._en.value == 1
48+
assert not self._transparent_for
4849

4950
class _WritePort:
5051
def __init__(self, *, domain, addr, data, en):
@@ -70,23 +71,25 @@ def __init__(self, *, identity, width, depth, init=None, attrs=None, src_loc=Non
7071
self._identity = identity
7172
self._width = operator.index(width)
7273
self._depth = operator.index(depth)
73-
self._init = tuple(init) if init is not None else ()
74+
mask = (1 << self._width) - 1
75+
self._init = tuple(item & mask for item in init) if init is not None else ()
7476
assert len(self._init) <= self._depth
7577
self._init += (0,) * (self._depth - len(self._init))
7678
for x in self._init:
7779
assert isinstance(x, int)
7880
self._attrs = attrs or {}
7981
self._src_loc = src_loc
80-
self._read_ports = []
81-
self._write_ports = []
82+
self._read_ports: "list[MemoryInstance._ReadPort]" = []
83+
self._write_ports: "list[MemoryInstance._WritePort]" = []
8284

83-
def read_port(self, *, domain, addr, data, en, transparency):
84-
port = self._ReadPort(domain=domain, addr=addr, data=data, en=en, transparency=transparency)
85+
def read_port(self, *, domain, addr, data, en, transparent_for):
86+
port = self._ReadPort(domain=domain, addr=addr, data=data, en=en, transparent_for=transparent_for)
8587
assert len(port._data) == self._width
8688
assert len(port._addr) == ceil_log2(self._depth)
87-
for x in port._transparency:
88-
assert isinstance(x, int)
89-
assert x in range(len(self._write_ports))
89+
for idx in port._transparent_for:
90+
assert isinstance(idx, int)
91+
assert idx in range(len(self._write_ports))
92+
assert self._write_ports[idx]._domain == port._domain
9093
for signal in port._data._rhs_signals():
9194
self.add_driver(signal, port._domain)
9295
self._read_ports.append(port)
@@ -209,12 +212,12 @@ def elaborate(self, platform):
209212
for port in self._read_ports:
210213
port._MustUse__used = True
211214
if port.domain == "comb":
212-
f.read_port(domain="comb", addr=port.addr, data=port.data, en=Const(1), transparency=())
215+
f.read_port(domain="comb", addr=port.addr, data=port.data, en=Const(1), transparent_for=())
213216
else:
214-
transparency = []
217+
transparent_for = []
215218
if port.transparent:
216-
transparency = write_ports.get(port.domain, [])
217-
f.read_port(domain=port.domain, addr=port.addr, data=port.data, en=port.en, transparency=transparency)
219+
transparent_for = write_ports.get(port.domain, [])
220+
f.read_port(domain=port.domain, addr=port.addr, data=port.data, en=port.en, transparent_for=transparent_for)
218221
return f
219222

220223

amaranth/hdl/_xfrm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def on_fragment(self, fragment):
263263
addr=port._addr,
264264
data=port._data,
265265
en=port._en,
266-
transparency=port._transparency,
266+
transparent_for=port._transparent_for,
267267
)
268268
for port in fragment._read_ports
269269
]

amaranth/lib/fifo.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ..utils import ceil_log2
88
from .coding import GrayEncoder, GrayDecoder
99
from .cdc import FFSynchronizer, AsyncFFSynchronizer
10+
from .memory import Memory
1011

1112

1213
__all__ = ["FIFOInterface", "SyncFIFO", "SyncFIFOBuffered", "AsyncFIFO", "AsyncFIFOBuffered"]
@@ -130,7 +131,7 @@ def elaborate(self, platform):
130131
do_read = self.r_rdy & self.r_en
131132
do_write = self.w_rdy & self.w_en
132133

133-
storage = m.submodules.storage = Memory(width=self.width, depth=self.depth)
134+
storage = m.submodules.storage = Memory(shape=self.width, depth=self.depth, init=[])
134135
w_port = storage.write_port()
135136
r_port = storage.read_port(domain="comb")
136137
produce = Signal(range(self.depth))
@@ -257,9 +258,9 @@ def elaborate(self, platform):
257258

258259
do_inner_read = inner_r_rdy & (~self.r_rdy | self.r_en)
259260

260-
storage = m.submodules.storage = Memory(width=self.width, depth=inner_depth)
261+
storage = m.submodules.storage = Memory(shape=self.width, depth=inner_depth, init=[])
261262
w_port = storage.write_port()
262-
r_port = storage.read_port(domain="sync", transparent=False)
263+
r_port = storage.read_port(domain="sync")
263264
produce = Signal(range(inner_depth))
264265
consume = Signal(range(inner_depth))
265266

@@ -438,9 +439,9 @@ def elaborate(self, platform):
438439
m.d[self._w_domain] += self.w_level.eq(produce_w_bin - consume_w_bin)
439440
m.d.comb += self.r_level.eq(produce_r_bin - consume_r_bin)
440441

441-
storage = m.submodules.storage = Memory(width=self.width, depth=self.depth)
442+
storage = m.submodules.storage = Memory(shape=self.width, depth=self.depth, init=[])
442443
w_port = storage.write_port(domain=self._w_domain)
443-
r_port = storage.read_port (domain=self._r_domain, transparent=False)
444+
r_port = storage.read_port (domain=self._r_domain)
444445
m.d.comb += [
445446
w_port.addr.eq(produce_w_bin[:-1]),
446447
w_port.data.eq(self.w_data),

0 commit comments

Comments
 (0)