55from ._ast import *
66from ._ir import Elaboratable , Fragment
77from ..utils import ceil_log2
8+ from .._utils import deprecated
89
910
1011__all__ = ["Memory" , "ReadPort" , "WritePort" , "DummyPort" ]
@@ -33,18 +34,19 @@ def __init__(self, identity, addr, data):
3334
3435class MemoryInstance (Fragment ):
3536 class _ReadPort :
36- def __init__ (self , * , domain , addr , data , en , transparency ):
37+ def __init__ (self , * , domain , addr , data , en , transparent_for ):
3738 assert isinstance (domain , str )
3839 self ._domain = domain
3940 self ._addr = Value .cast (addr )
4041 self ._data = Value .cast (data )
4142 self ._en = Value .cast (en )
42- self ._transparency = tuple (transparency )
43+ self ._transparent_for = tuple (transparent_for )
4344 assert len (self ._en ) == 1
4445 if domain == "comb" :
4546 assert isinstance (self ._en , Const )
4647 assert self ._en .width == 1
4748 assert self ._en .value == 1
49+ assert not self ._transparent_for
4850
4951 class _WritePort :
5052 def __init__ (self , * , domain , addr , data , en ):
@@ -70,22 +72,24 @@ def __init__(self, *, identity, width, depth, init=None, attrs=None, src_loc=Non
7072 self ._identity = identity
7173 self ._width = operator .index (width )
7274 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 ()
7477 assert len (self ._init ) <= self ._depth
7578 self ._init += (0 ,) * (self ._depth - len (self ._init ))
7679 for x in self ._init :
7780 assert isinstance (x , int )
7881 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]" = []
8184
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 )
8487 assert len (port ._data ) == self ._width
8588 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
8993 for signal in port ._data ._rhs_signals ():
9094 self .add_driver (signal , port ._domain )
9195 self ._read_ports .append (port )
@@ -124,6 +128,8 @@ class Memory(Elaboratable):
124128 init : list of int
125129 attrs : dict
126130 """
131+ # TODO(amaranth-0.6): remove
132+ @deprecated ("`amaranth.hdl.Memory` is deprecated, use `amaranth.lib.memory.Memory` instead" )
127133 def __init__ (self , * , width , depth , init = None , name = None , attrs = None , simulate = True ):
128134 if not isinstance (width , int ) or width < 0 :
129135 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
132138 raise TypeError ("Memory depth must be a non-negative integer, not {!r}"
133139 .format (depth ))
134140
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 )
137143
138144 self .width = width
139145 self .depth = depth
@@ -208,12 +214,12 @@ def elaborate(self, platform):
208214 for port in self ._read_ports :
209215 port ._MustUse__used = True
210216 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 = ())
212218 else :
213- transparency = []
219+ transparent_for = []
214220 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 )
217223 return f
218224
219225
@@ -346,13 +352,15 @@ class DummyPort:
346352 It does not include any read/write port specific attributes, i.e. none besides ``"domain"``;
347353 any such attributes may be set manually.
348354 """
355+ # TODO(amaranth-0.6): remove
356+ @deprecated ("`DummyPort` is deprecated, use `amaranth.lib.memory.ReadPort` or `amaranth.lib.memory.WritePort` instead" )
349357 def __init__ (self , * , data_width , addr_width , domain = "sync" , name = None , granularity = None ):
350358 self .domain = domain
351359
352360 if granularity is None :
353361 granularity = data_width
354362 if name is None :
355- name = tracer .get_var_name (depth = 2 , default = "dummy" )
363+ name = tracer .get_var_name (depth = 3 , default = "dummy" )
356364
357365 self .addr = Signal (addr_width ,
358366 name = f"{ name } _addr" , src_loc_at = 1 )
0 commit comments