5
5
from ._ast import *
6
6
from ._ir import Elaboratable , Fragment
7
7
from ..utils import ceil_log2
8
+ from .._utils import deprecated
8
9
9
10
10
11
__all__ = ["Memory" , "ReadPort" , "WritePort" , "DummyPort" ]
@@ -33,18 +34,19 @@ def __init__(self, identity, addr, data):
33
34
34
35
class MemoryInstance (Fragment ):
35
36
class _ReadPort :
36
- def __init__ (self , * , domain , addr , data , en , transparency ):
37
+ def __init__ (self , * , domain , addr , data , en , transparent_for ):
37
38
assert isinstance (domain , str )
38
39
self ._domain = domain
39
40
self ._addr = Value .cast (addr )
40
41
self ._data = Value .cast (data )
41
42
self ._en = Value .cast (en )
42
- self ._transparency = tuple (transparency )
43
+ self ._transparent_for = tuple (transparent_for )
43
44
assert len (self ._en ) == 1
44
45
if domain == "comb" :
45
46
assert isinstance (self ._en , Const )
46
47
assert self ._en .width == 1
47
48
assert self ._en .value == 1
49
+ assert not self ._transparent_for
48
50
49
51
class _WritePort :
50
52
def __init__ (self , * , domain , addr , data , en ):
@@ -70,22 +72,24 @@ def __init__(self, *, identity, width, depth, init=None, attrs=None, src_loc=Non
70
72
self ._identity = identity
71
73
self ._width = operator .index (width )
72
74
self ._depth = operator .index (depth )
73
- self ._init = tuple (init ) if init is not None else ()
75
+ mask = (1 << self ._width ) - 1
76
+ self ._init = tuple (item & mask for item in init ) if init is not None else ()
74
77
assert len (self ._init ) <= self ._depth
75
78
self ._init += (0 ,) * (self ._depth - len (self ._init ))
76
79
for x in self ._init :
77
80
assert isinstance (x , int )
78
81
self ._attrs = attrs or {}
79
- self ._read_ports = []
80
- self ._write_ports = []
82
+ self ._read_ports : "list[MemoryInstance._ReadPort]" = []
83
+ self ._write_ports : "list[MemoryInstance._WritePort]" = []
81
84
82
- def read_port (self , * , domain , addr , data , en , transparency ):
83
- 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 )
84
87
assert len (port ._data ) == self ._width
85
88
assert len (port ._addr ) == ceil_log2 (self ._depth )
86
- for x in port ._transparency :
87
- assert isinstance (x , int )
88
- 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
89
93
for signal in port ._data ._rhs_signals ():
90
94
self .add_driver (signal , port ._domain )
91
95
self ._read_ports .append (port )
@@ -124,6 +128,8 @@ class Memory(Elaboratable):
124
128
init : list of int
125
129
attrs : dict
126
130
"""
131
+ # TODO(amaranth-0.6): remove
132
+ @deprecated ("`amaranth.hdl.Memory` is deprecated, use `amaranth.lib.memory.Memory` instead" )
127
133
def __init__ (self , * , width , depth , init = None , name = None , attrs = None , simulate = True ):
128
134
if not isinstance (width , int ) or width < 0 :
129
135
raise TypeError ("Memory width must be a non-negative integer, not {!r}"
@@ -132,8 +138,8 @@ def __init__(self, *, width, depth, init=None, name=None, attrs=None, simulate=T
132
138
raise TypeError ("Memory depth must be a non-negative integer, not {!r}"
133
139
.format (depth ))
134
140
135
- self .name = name or tracer .get_var_name (depth = 2 , default = "$memory" )
136
- self .src_loc = tracer .get_src_loc ()
141
+ self .name = name or tracer .get_var_name (depth = 3 , default = "$memory" )
142
+ self .src_loc = tracer .get_src_loc (src_loc_at = 1 )
137
143
138
144
self .width = width
139
145
self .depth = depth
@@ -208,12 +214,12 @@ def elaborate(self, platform):
208
214
for port in self ._read_ports :
209
215
port ._MustUse__used = True
210
216
if port .domain == "comb" :
211
- f .read_port (domain = "comb" , addr = port .addr , data = port .data , en = Const (1 ), transparency = ())
217
+ f .read_port (domain = "comb" , addr = port .addr , data = port .data , en = Const (1 ), transparent_for = ())
212
218
else :
213
- transparency = []
219
+ transparent_for = []
214
220
if port .transparent :
215
- transparency = write_ports .get (port .domain , [])
216
- f .read_port (domain = port .domain , addr = port .addr , data = port .data , en = port .en , transparency = transparency )
221
+ transparent_for = write_ports .get (port .domain , [])
222
+ f .read_port (domain = port .domain , addr = port .addr , data = port .data , en = port .en , transparent_for = transparent_for )
217
223
return f
218
224
219
225
@@ -346,13 +352,15 @@ class DummyPort:
346
352
It does not include any read/write port specific attributes, i.e. none besides ``"domain"``;
347
353
any such attributes may be set manually.
348
354
"""
355
+ # TODO(amaranth-0.6): remove
356
+ @deprecated ("`DummyPort` is deprecated, use `amaranth.lib.memory.ReadPort` or `amaranth.lib.memory.WritePort` instead" )
349
357
def __init__ (self , * , data_width , addr_width , domain = "sync" , name = None , granularity = None ):
350
358
self .domain = domain
351
359
352
360
if granularity is None :
353
361
granularity = data_width
354
362
if name is None :
355
- name = tracer .get_var_name (depth = 2 , default = "dummy" )
363
+ name = tracer .get_var_name (depth = 3 , default = "dummy" )
356
364
357
365
self .addr = Signal (addr_width ,
358
366
name = f"{ name } _addr" , src_loc_at = 1 )
0 commit comments