diff --git a/src/pystencils/backend/ast/expressions.py b/src/pystencils/backend/ast/expressions.py index 67fd6b27ea9bad0b037affa63913193560ea6ed2..908f31052ed4b8d49a66cd1ce801d9841ef4fb7d 100644 --- a/src/pystencils/backend/ast/expressions.py +++ b/src/pystencils/backend/ast/expressions.py @@ -636,7 +636,7 @@ class PsIntDiv(PsBinOp, PsIntOpTrait): @property def python_operator(self) -> Callable[[Any, Any], Any]: - from .util import c_intdiv + from ...utils import c_intdiv return c_intdiv @@ -646,7 +646,7 @@ class PsRem(PsBinOp, PsIntOpTrait): @property def python_operator(self) -> Callable[[Any, Any], Any]: - from .util import c_rem + from ...utils import c_rem return c_rem diff --git a/src/pystencils/backend/ast/util.py b/src/pystencils/backend/ast/util.py index 2fdf6078d0cf285062656a739d2bdcea7736e1c2..0d3b78629fa9ee41d753893b1b6b4198cc75ae51 100644 --- a/src/pystencils/backend/ast/util.py +++ b/src/pystencils/backend/ast/util.py @@ -36,14 +36,3 @@ class AstEqWrapper: # TODO: consider replacing this with smth. more performant # TODO: Check that repr is implemented by all AST nodes return hash(repr(self._node)) - - -def c_intdiv(num, denom): - """C-style integer division""" - return int(num / denom) - - -def c_rem(num, denom): - """C-style integer remainder""" - div = c_intdiv(num, denom) - return num - div * denom diff --git a/src/pystencils/backend/transformations/eliminate_constants.py b/src/pystencils/backend/transformations/eliminate_constants.py index 15a6d5c5c48f5e27f7bc65880f0ad1eb851b4825..bd3b2bb5871b59dd1e0431ed3d5ee7d26c4ff7a6 100644 --- a/src/pystencils/backend/transformations/eliminate_constants.py +++ b/src/pystencils/backend/transformations/eliminate_constants.py @@ -316,7 +316,7 @@ class EliminateConstants: ) elif isinstance(expr, PsDiv): if is_int: - from ..ast.util import c_intdiv + from ...utils import c_intdiv folded = PsConstant(c_intdiv(v1, v2), dtype) elif isinstance(dtype, PsIeeeFloatType): folded = PsConstant(v1 / v2, dtype) diff --git a/src/pystencils/sympyextensions/integer_functions.py b/src/pystencils/sympyextensions/integer_functions.py index 600562ad1bb9970b36c9963ff71fc24ecca01f28..3b215266eac147ea3082a0536e180728201d6b3e 100644 --- a/src/pystencils/sympyextensions/integer_functions.py +++ b/src/pystencils/sympyextensions/integer_functions.py @@ -48,15 +48,16 @@ class int_div(IntegerFunctionTwoArgsMixIn): """C-style round-to-zero integer division""" def _eval_op(self, arg1, arg2): - return int(arg1 / arg2) + from ..utils import c_intdiv + return c_intdiv(arg1, arg2) class int_rem(IntegerFunctionTwoArgsMixIn): """C-style round-to-zero integer remainder""" def _eval_op(self, arg1, arg2): - div = int(arg1 / arg2) - return arg1 - div * arg2 + from ..utils import c_rem + return c_rem(arg1, arg2) # noinspection PyPep8Naming diff --git a/src/pystencils/utils.py b/src/pystencils/utils.py index f872ae48a54a2ae8c9437ec826be9b51c061f52e..98331e7e5f561405cee99c3422b9f232747ecfcb 100644 --- a/src/pystencils/utils.py +++ b/src/pystencils/utils.py @@ -250,3 +250,14 @@ class ContextVar: def get(self): return self.stack[-1] + + +def c_intdiv(num, denom): + """C-style integer division""" + return int(num / denom) + + +def c_rem(num, denom): + """C-style integer remainder""" + div = c_intdiv(num, denom) + return num - div * denom