Skip to content

Commit df70aae

Browse files
committed
sim._pyrtl: sign extend RHS of assignment.
Fixes #502.
1 parent 9d62cbe commit df70aae

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

nmigen/sim/_pyrtl.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ def on_statements(self, stmts):
337337
self.emitter.append("pass")
338338

339339
def on_Assign(self, stmt):
340-
return self.lhs(stmt.lhs)(self.rhs(stmt.rhs))
340+
gen_rhs = f"({(1 << len(stmt.rhs)) - 1} & {self.rhs(stmt.rhs)})"
341+
if stmt.rhs.shape().signed:
342+
gen_rhs = f"sign({gen_rhs}, {-1 << (len(stmt.rhs) - 1)})"
343+
return self.lhs(stmt.lhs)(gen_rhs)
341344

342345
def on_Switch(self, stmt):
343346
gen_test = self.emitter.def_var("test",

tests/test_sim.py

+5
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ def test_as_signed(self):
6767
self.assertStatement(stmt, [C(0b01, unsigned(2)), C(0b0001, signed(4))], C(1))
6868
self.assertStatement(stmt, [C(0b11, unsigned(2)), C(0b1111, signed(4))], C(1))
6969

70+
def test_as_signed_issue_502(self):
71+
stmt = lambda y, a: y.eq(a.as_signed())
72+
self.assertStatement(stmt, [C(0b01, unsigned(2))], C(0b0001, signed(4)))
73+
self.assertStatement(stmt, [C(0b11, unsigned(2))], C(0b1111, signed(4)))
74+
7075
def test_any(self):
7176
stmt = lambda y, a: y.eq(a.any())
7277
self.assertStatement(stmt, [C(0b00, 2)], C(0))

0 commit comments

Comments
 (0)