back.rtlil: avoid unsoundness for division by zero.

Fixes #238.
This commit is contained in:
whitequark 2019-10-04 07:56:06 +00:00
parent de34728bf8
commit 964c67453f

View file

@ -505,6 +505,18 @@ class _RHSValueCompiler(_ValueCompiler):
"B_WIDTH": rhs_bits,
"Y_WIDTH": res_bits,
}, src=src(value.src_loc))
if value.op in ("//", "%"):
# RTLIL leaves division by zero undefined, but we require it to return zero.
divmod_res = res
res = self.s.rtlil.wire(width=res_bits, src=src(value.src_loc))
self.s.rtlil.cell("$mux", ports={
"\\A": divmod_res,
"\\B": self(ast.Const(0, (res_bits, res_sign))),
"\\S": self(lhs == 0),
"\\Y": res,
}, params={
"WIDTH": res_bits
}, src=src(value.src_loc))
return res
def on_Operator_mux(self, value):