back.pysim: implement modulus operator.
This commit is contained in:
parent
4601dd0a69
commit
7b9c8b440f
|
@ -363,6 +363,7 @@ class _ValueCompiler(ValueVisitor, _Compiler):
|
|||
helpers = {
|
||||
"sign": lambda value, sign: value | sign if value & sign else value,
|
||||
"zdiv": lambda lhs, rhs: 0 if rhs == 0 else lhs // rhs,
|
||||
"zmod": lambda lhs, rhs: 0 if rhs == 0 else lhs % rhs,
|
||||
}
|
||||
|
||||
def on_ClockSignal(self, value):
|
||||
|
@ -448,6 +449,8 @@ class _RHSValueCompiler(_ValueCompiler):
|
|||
return f"({sign(lhs)} * {sign(rhs)})"
|
||||
if value.operator == "//":
|
||||
return f"zdiv({sign(lhs)}, {sign(rhs)})"
|
||||
if value.operator == "%":
|
||||
return f"zmod({sign(lhs)}, {sign(rhs)})"
|
||||
if value.operator == "&":
|
||||
return f"({self(lhs)} & {self(rhs)})"
|
||||
if value.operator == "|":
|
||||
|
|
|
@ -110,6 +110,13 @@ class SimulatorUnitTestCase(FHDLTestCase):
|
|||
self.assertStatement(stmt, [C(2, 4), C(2, 4)], C(1, 8))
|
||||
self.assertStatement(stmt, [C(7, 4), C(2, 4)], C(3, 8))
|
||||
|
||||
def test_mod(self):
|
||||
stmt = lambda y, a, b: y.eq(a % b)
|
||||
self.assertStatement(stmt, [C(2, 4), C(0, 4)], C(0, 8))
|
||||
self.assertStatement(stmt, [C(2, 4), C(1, 4)], C(0, 8))
|
||||
self.assertStatement(stmt, [C(2, 4), C(2, 4)], C(0, 8))
|
||||
self.assertStatement(stmt, [C(7, 4), C(2, 4)], C(1, 8))
|
||||
|
||||
def test_and(self):
|
||||
stmt = lambda y, a, b: y.eq(a & b)
|
||||
self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b1000, 4))
|
||||
|
|
Loading…
Reference in a new issue