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,23 +72,25 @@ 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
82
self ._src_loc = src_loc
80
- self ._read_ports = []
81
- self ._write_ports = []
83
+ self ._read_ports : "list[MemoryInstance._ReadPort]" = []
84
+ self ._write_ports : "list[MemoryInstance._WritePort]" = []
82
85
83
- def read_port (self , * , domain , addr , data , en , transparency ):
84
- port = self ._ReadPort (domain = domain , addr = addr , data = data , en = en , transparency = transparency )
86
+ def read_port (self , * , domain , addr , data , en , transparent_for ):
87
+ port = self ._ReadPort (domain = domain , addr = addr , data = data , en = en , transparent_for = transparent_for )
85
88
assert len (port ._data ) == self ._width
86
89
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 ))
90
+ for idx in port ._transparent_for :
91
+ assert isinstance (idx , int )
92
+ assert idx in range (len (self ._write_ports ))
93
+ assert self ._write_ports [idx ]._domain == port ._domain
90
94
for signal in port ._data ._rhs_signals ():
91
95
self .add_driver (signal , port ._domain )
92
96
self ._read_ports .append (port )
@@ -125,6 +129,8 @@ class Memory(Elaboratable):
125
129
init : list of int
126
130
attrs : dict
127
131
"""
132
+ # TODO(amaranth-0.6): remove
133
+ @deprecated ("`amaranth.hdl.Memory` is deprecated, use `amaranth.lib.memory.Memory` instead" )
128
134
def __init__ (self , * , width , depth , init = None , name = None , attrs = None , simulate = True ):
129
135
if not isinstance (width , int ) or width < 0 :
130
136
raise TypeError ("Memory width must be a non-negative integer, not {!r}"
@@ -133,8 +139,8 @@ def __init__(self, *, width, depth, init=None, name=None, attrs=None, simulate=T
133
139
raise TypeError ("Memory depth must be a non-negative integer, not {!r}"
134
140
.format (depth ))
135
141
136
- self .name = name or tracer .get_var_name (depth = 2 , default = "$memory" )
137
- self .src_loc = tracer .get_src_loc ()
142
+ self .name = name or tracer .get_var_name (depth = 3 , default = "$memory" )
143
+ self .src_loc = tracer .get_src_loc (src_loc_at = 1 )
138
144
139
145
self .width = width
140
146
self .depth = depth
@@ -209,12 +215,12 @@ def elaborate(self, platform):
209
215
for port in self ._read_ports :
210
216
port ._MustUse__used = True
211
217
if port .domain == "comb" :
212
- f .read_port (domain = "comb" , addr = port .addr , data = port .data , en = Const (1 ), transparency = ())
218
+ f .read_port (domain = "comb" , addr = port .addr , data = port .data , en = Const (1 ), transparent_for = ())
213
219
else :
214
- transparency = []
220
+ transparent_for = []
215
221
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 )
222
+ transparent_for = write_ports .get (port .domain , [])
223
+ f .read_port (domain = port .domain , addr = port .addr , data = port .data , en = port .en , transparent_for = transparent_for )
218
224
return f
219
225
220
226
@@ -347,13 +353,15 @@ class DummyPort:
347
353
It does not include any read/write port specific attributes, i.e. none besides ``"domain"``;
348
354
any such attributes may be set manually.
349
355
"""
356
+ # TODO(amaranth-0.6): remove
357
+ @deprecated ("`DummyPort` is deprecated, use `amaranth.lib.memory.ReadPort` or `amaranth.lib.memory.WritePort` instead" )
350
358
def __init__ (self , * , data_width , addr_width , domain = "sync" , name = None , granularity = None ):
351
359
self .domain = domain
352
360
353
361
if granularity is None :
354
362
granularity = data_width
355
363
if name is None :
356
- name = tracer .get_var_name (depth = 2 , default = "dummy" )
364
+ name = tracer .get_var_name (depth = 3 , default = "dummy" )
357
365
358
366
self .addr = Signal (addr_width ,
359
367
name = f"{ name } _addr" , src_loc_at = 1 )
0 commit comments