From 0807b98851b1c1d7956aa96ade7cb784a4524407 Mon Sep 17 00:00:00 2001
From: Stephan Seitz <stephan.seitz@fau.de>
Date: Tue, 3 Dec 2019 13:33:13 +0100
Subject: [PATCH] Make OpenCL tests run again

- int(...) is not a real cast for CUDA OpenCL
- sympy.boolalg has moved to sympy.logic.boolalg
---
 pystencils/backends/cbackend.py       |  9 +++++++--
 pystencils/backends/opencl_backend.py |  2 +-
 pystencils/cpu/vectorization.py       |  7 ++++++-
 pystencils/data_types.py              | 15 ++++++++++-----
 pystencils/transformations.py         |  7 ++++++-
 5 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/pystencils/backends/cbackend.py b/pystencils/backends/cbackend.py
index 70e2814f..dcf6e0a0 100644
--- a/pystencils/backends/cbackend.py
+++ b/pystencils/backends/cbackend.py
@@ -16,6 +16,11 @@ from pystencils.integer_functions import (
     bit_shift_left, bit_shift_right, bitwise_and, bitwise_or, bitwise_xor,
     int_div, int_power_of_2, modulo_ceil)
 
+try:
+    from sympy.boolalg import BooleanTrue, BooleanFalse
+except Exception:
+    from sympy.logic.boolalg import BooleanTrue, BooleanFalse
+
 try:
     from sympy.printing.ccode import C99CodePrinter as CCodePrinter
 except ImportError:
@@ -293,9 +298,9 @@ class CBackend:
         return ""
 
     def _print_Conditional(self, node):
-        if type(node.condition_expr) is sp.boolalg.BooleanTrue:
+        if type(node.condition_expr) is BooleanTrue:
             return self._print_Block(node.true_block)
-        elif type(node.condition_expr) is sp.boolalg.BooleanFalse:
+        elif type(node.condition_expr) is BooleanFalse:
             return self._print_Block(node.false_block)
         cond_type = get_type_of_expression(node.condition_expr)
         if isinstance(cond_type, VectorType):
diff --git a/pystencils/backends/opencl_backend.py b/pystencils/backends/opencl_backend.py
index b5da806b..1c6dfbac 100644
--- a/pystencils/backends/opencl_backend.py
+++ b/pystencils/backends/opencl_backend.py
@@ -73,7 +73,7 @@ class OpenClSympyPrinter(CudaSympyPrinter):
         function_name, dimension = tuple(symbol_name.split("."))
         dimension = self.DIMENSION_MAPPING[dimension]
         function_name = self.INDEXING_FUNCTION_MAPPING[function_name]
-        return f"int({function_name}({dimension}))"
+        return f"(int)({function_name}({dimension}))"
 
     def _print_TextureAccess(self, node):
         raise NotImplementedError()
diff --git a/pystencils/cpu/vectorization.py b/pystencils/cpu/vectorization.py
index 1e3a434b..c3bae67f 100644
--- a/pystencils/cpu/vectorization.py
+++ b/pystencils/cpu/vectorization.py
@@ -15,6 +15,11 @@ from pystencils.sympyextensions import fast_subs
 from pystencils.transformations import (
     cut_loop, filtered_tree_iteration, replace_inner_stride_with_one)
 
+try:
+    from sympy.boolalg import BooleanFunction
+except ImportError:
+    from sympy.logic.boolalg import BooleanFunction
+
 
 # noinspection PyPep8Naming
 class vec_any(sp.Function):
@@ -177,7 +182,7 @@ def insert_vector_casts(ast_node):
                                         visit_expr(expr.args[4]))
         elif isinstance(expr, cast_func):
             return expr
-        elif expr.func in handled_functions or isinstance(expr, sp.Rel) or isinstance(expr, sp.boolalg.BooleanFunction):
+        elif expr.func in handled_functions or isinstance(expr, (sp.Rel, BooleanFunction)):
             new_args = [visit_expr(a) for a in expr.args]
             arg_types = [get_type_of_expression(a) for a in new_args]
             if not any(type(t) is VectorType for t in arg_types):
diff --git a/pystencils/data_types.py b/pystencils/data_types.py
index af085ab3..b4f8c931 100644
--- a/pystencils/data_types.py
+++ b/pystencils/data_types.py
@@ -4,14 +4,19 @@ from functools import partial
 from typing import Tuple
 
 import numpy as np
-
-import pystencils
 import sympy as sp
 import sympy.codegen.ast
+from sympy.core.cache import cacheit
+
+import pystencils
 from pystencils.cache import memorycache, memorycache_if_hashable
 from pystencils.utils import all_equal
-from sympy.core.cache import cacheit
-from sympy.logic.boolalg import Boolean
+
+try:
+    from sympy.boolalg import Boolean, BooleanFunction
+except Exception:
+    from sympy.logic.boolalg import Boolean, BooleanFunction
+
 
 try:
     import llvmlite.ir as ir
@@ -541,7 +546,7 @@ def get_type_of_expression(expr,
     elif isinstance(expr, sp.Indexed):
         typed_symbol = expr.base.label
         return typed_symbol.dtype.base_type
-    elif isinstance(expr, (sp.boolalg.Boolean, sp.boolalg.BooleanFunction)):
+    elif isinstance(expr, (Boolean, BooleanFunction)):
         # if any arg is of vector type return a vector boolean, else return a normal scalar boolean
         result = create_type("bool")
         vec_args = [get_type(a) for a in expr.args if isinstance(get_type(a), VectorType)]
diff --git a/pystencils/transformations.py b/pystencils/transformations.py
index 762c3613..244cd226 100644
--- a/pystencils/transformations.py
+++ b/pystencils/transformations.py
@@ -21,6 +21,11 @@ from pystencils.kernelparameters import FieldPointerSymbol
 from pystencils.simp.assignment_collection import AssignmentCollection
 from pystencils.slicing import normalize_slice
 
+try:
+    from sympy.boolalg import BooleanFunction
+except ImportError:
+    from sympy.logic.boolalg import BooleanFunction
+
 
 class NestedScopes:
     """Symbol visibility model using nested scopes
@@ -851,7 +856,7 @@ class KernelConstraintsCheck:
             return cast_func(
                 self.process_expression(rhs.args[0], type_constants=False),
                 rhs.dtype)
-        elif isinstance(rhs, sp.boolalg.BooleanFunction) or \
+        elif isinstance(rhs, BooleanFunction) or \
                 type(rhs) in pystencils.integer_functions.__dict__.values():
             new_args = [self.process_expression(a, type_constants) for a in rhs.args]
             types_of_expressions = [get_type_of_expression(a) for a in new_args]
-- 
GitLab