fhdl.ast, back.pysim: implement shifts.

This commit is contained in:
whitequark 2018-12-15 09:58:30 +00:00
parent 46f5addf05
commit db4600d52b
5 changed files with 50 additions and 16 deletions

View file

@ -75,15 +75,23 @@ class _RHSValueCompiler(ValueTransformer):
elif len(value.operands) == 2:
lhs, rhs = map(self, value.operands)
if value.op == "+":
return lambda state: normalize(lhs(state) + rhs(state), shape)
return lambda state: normalize(lhs(state) + rhs(state), shape)
if value.op == "-":
return lambda state: normalize(lhs(state) - rhs(state), shape)
return lambda state: normalize(lhs(state) - rhs(state), shape)
if value.op == "&":
return lambda state: normalize(lhs(state) & rhs(state), shape)
return lambda state: normalize(lhs(state) & rhs(state), shape)
if value.op == "|":
return lambda state: normalize(lhs(state) | rhs(state), shape)
return lambda state: normalize(lhs(state) | rhs(state), shape)
if value.op == "^":
return lambda state: normalize(lhs(state) ^ rhs(state), shape)
return lambda state: normalize(lhs(state) ^ rhs(state), shape)
if value.op == "<<":
def sshl(lhs, rhs):
return lhs << rhs if rhs >= 0 else lhs >> -rhs
return lambda state: normalize(sshl(lhs(state), rhs(state)), shape)
if value.op == ">>":
def sshr(lhs, rhs):
return lhs >> rhs if rhs >= 0 else lhs << -rhs
return lambda state: normalize(sshr(lhs(state), rhs(state)), shape)
if value.op == "==":
return lambda state: normalize(lhs(state) == rhs(state), shape)
if value.op == "!=":

View file

@ -206,8 +206,8 @@ class _ValueTransformer(xfrm.ValueTransformer):
(2, "/"): "$div",
(2, "%"): "$mod",
(2, "**"): "$pow",
(2, "<<<"): "$sshl",
(2, ">>>"): "$sshr",
(2, "<<"): "$sshl",
(2, ">>"): "$sshr",
(2, "&"): "$and",
(2, "^"): "$xor",
(2, "|"): "$or",