Skip to content

Commit ccf7aaf

Browse files
wanda-phiwhitequark
authored andcommitted
sim._pyrtl: fix masking for bitwise operands and muxes.
Fixes #926.
1 parent cce4e44 commit ccf7aaf

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

amaranth/sim/_pyrtl.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,11 @@ def sign(value):
170170
if value.operator == "%":
171171
return f"zmod({sign(lhs)}, {sign(rhs)})"
172172
if value.operator == "&":
173-
return f"({mask(lhs)} & {mask(rhs)})"
173+
return f"({sign(lhs)} & {sign(rhs)})"
174174
if value.operator == "|":
175-
return f"({mask(lhs)} | {mask(rhs)})"
175+
return f"({sign(lhs)} | {sign(rhs)})"
176176
if value.operator == "^":
177-
return f"({mask(lhs)} ^ {mask(rhs)})"
177+
return f"({sign(lhs)} ^ {sign(rhs)})"
178178
if value.operator == "<<":
179179
return f"({sign(lhs)} << {sign(rhs)})"
180180
if value.operator == ">>":
@@ -194,7 +194,7 @@ def sign(value):
194194
elif len(value.operands) == 3:
195195
if value.operator == "m":
196196
sel, val1, val0 = value.operands
197-
return f"({self(val1)} if {mask(sel)} else {self(val0)})"
197+
return f"({sign(val1)} if {mask(sel)} else {sign(val0)})"
198198
raise NotImplementedError("Operator '{}' not implemented".format(value.operator)) # :nocov:
199199

200200
def on_Slice(self, value):

tests/test_sim.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ def test_mod_neg(self):
152152
def test_and(self):
153153
stmt = lambda y, a, b: y.eq(a & b)
154154
self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b1000, 4))
155+
self.assertStatement(stmt, [C(0b1010, 4), C(0b10, signed(2))], C(0b1010, 4))
156+
stmt = lambda y, a: y.eq(a)
157+
self.assertStatement(stmt, [C(0b1010, 4) & C(-2, 2).as_unsigned()], C(0b0010, 4))
155158

156159
def test_or(self):
157160
stmt = lambda y, a, b: y.eq(a | b)
@@ -211,6 +214,9 @@ def test_mux(self):
211214
stmt = lambda y, a, b, c: y.eq(Mux(c, a, b))
212215
self.assertStatement(stmt, [C(2, 4), C(3, 4), C(0)], C(3, 4))
213216
self.assertStatement(stmt, [C(2, 4), C(3, 4), C(1)], C(2, 4))
217+
stmt = lambda y, a: y.eq(a)
218+
self.assertStatement(stmt, [Mux(0, C(0b1010, 4), C(0b10, 2).as_signed())], C(0b1110, 4))
219+
self.assertStatement(stmt, [Mux(0, C(0b1010, 4), C(-2, 2).as_unsigned())], C(0b0010, 4))
214220

215221
def test_mux_invert(self):
216222
stmt = lambda y, a, b, c: y.eq(Mux(~c, a, b))

0 commit comments

Comments
 (0)