@@ -33,18 +33,19 @@ def __init__(self, identity, addr, data):
33
33
34
34
class MemoryInstance (Fragment ):
35
35
class _ReadPort :
36
- def __init__ (self , * , domain , addr , data , en , transparency ):
36
+ def __init__ (self , * , domain , addr , data , en , transparent_for ):
37
37
assert isinstance (domain , str )
38
38
self ._domain = domain
39
39
self ._addr = Value .cast (addr )
40
40
self ._data = Value .cast (data )
41
41
self ._en = Value .cast (en )
42
- self ._transparency = tuple (transparency )
42
+ self ._transparent_for = tuple (transparent_for )
43
43
assert len (self ._en ) == 1
44
44
if domain == "comb" :
45
45
assert isinstance (self ._en , Const )
46
46
assert self ._en .width == 1
47
47
assert self ._en .value == 1
48
+ assert not self ._transparent_for
48
49
49
50
class _WritePort :
50
51
def __init__ (self , * , domain , addr , data , en ):
@@ -70,23 +71,25 @@ def __init__(self, *, identity, width, depth, init=None, attrs=None, src_loc=Non
70
71
self ._identity = identity
71
72
self ._width = operator .index (width )
72
73
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 ()
74
76
assert len (self ._init ) <= self ._depth
75
77
self ._init += (0 ,) * (self ._depth - len (self ._init ))
76
78
for x in self ._init :
77
79
assert isinstance (x , int )
78
80
self ._attrs = attrs or {}
79
81
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]" = []
82
84
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 )
85
87
assert len (port ._data ) == self ._width
86
88
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
90
93
for signal in port ._data ._rhs_signals ():
91
94
self .add_driver (signal , port ._domain )
92
95
self ._read_ports .append (port )
@@ -209,12 +212,12 @@ def elaborate(self, platform):
209
212
for port in self ._read_ports :
210
213
port ._MustUse__used = True
211
214
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 = ())
213
216
else :
214
- transparency = []
217
+ transparent_for = []
215
218
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 )
218
221
return f
219
222
220
223
0 commit comments