back.pysim: fix simulation of Value.xor().

This commit is contained in:
whitequark 2019-09-20 10:12:59 +00:00
parent 4777a7b3a2
commit 7f6b3f93f5
2 changed files with 6 additions and 3 deletions

View file

@ -137,7 +137,7 @@ class _RHSValueCompiler(_ValueCompiler):
return lambda state: normalize(arg(state) == mask, shape) return lambda state: normalize(arg(state) == mask, shape)
if value.op == "r^": if value.op == "r^":
# Believe it or not, this is the fastest way to compute a sideways XOR in Python. # Believe it or not, this is the fastest way to compute a sideways XOR in Python.
return lambda state: normalize(str(arg(state)).count("1") % 2, shape) return lambda state: normalize(format(arg(state), "b").count("1") % 2, shape)
elif len(value.operands) == 2: elif len(value.operands) == 2:
lhs, rhs = map(self, value.operands) lhs, rhs = map(self, value.operands)
if value.op == "+": if value.op == "+":

View file

@ -61,18 +61,21 @@ class SimulatorUnitTestCase(FHDLTestCase):
stmt = lambda y, a: y.eq(a.any()) stmt = lambda y, a: y.eq(a.any())
self.assertStatement(stmt, [C(0b00, 2)], C(0)) self.assertStatement(stmt, [C(0b00, 2)], C(0))
self.assertStatement(stmt, [C(0b01, 2)], C(1)) self.assertStatement(stmt, [C(0b01, 2)], C(1))
self.assertStatement(stmt, [C(0b10, 2)], C(1))
self.assertStatement(stmt, [C(0b11, 2)], C(1)) self.assertStatement(stmt, [C(0b11, 2)], C(1))
def test_all(self): def test_all(self):
stmt = lambda y, a: y.eq(a.all()) stmt = lambda y, a: y.eq(a.all())
self.assertStatement(stmt, [C(0b00, 2)], C(0)) self.assertStatement(stmt, [C(0b00, 2)], C(0))
self.assertStatement(stmt, [C(0b01, 2)], C(0)) self.assertStatement(stmt, [C(0b01, 2)], C(0))
self.assertStatement(stmt, [C(0b10, 2)], C(0))
self.assertStatement(stmt, [C(0b11, 2)], C(1)) self.assertStatement(stmt, [C(0b11, 2)], C(1))
def test_xor(self): def test_xor_unary(self):
stmt = lambda y, a: y.eq(a.xor()) stmt = lambda y, a: y.eq(a.xor())
self.assertStatement(stmt, [C(0b00, 2)], C(0)) self.assertStatement(stmt, [C(0b00, 2)], C(0))
self.assertStatement(stmt, [C(0b01, 2)], C(1)) self.assertStatement(stmt, [C(0b01, 2)], C(1))
self.assertStatement(stmt, [C(0b10, 2)], C(1))
self.assertStatement(stmt, [C(0b11, 2)], C(0)) self.assertStatement(stmt, [C(0b11, 2)], C(0))
def test_add(self): def test_add(self):
@ -100,7 +103,7 @@ class SimulatorUnitTestCase(FHDLTestCase):
stmt = lambda y, a, b: y.eq(a | b) stmt = lambda y, a, b: y.eq(a | b)
self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b1110, 4)) self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b1110, 4))
def test_xor(self): def test_xor_binary(self):
stmt = lambda y, a, b: y.eq(a ^ b) stmt = lambda y, a, b: y.eq(a ^ b)
self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b0110, 4)) self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b0110, 4))