From d0e0400bd0faea8eb048c6d508ed9bb1dab48955 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sat, 28 Jan 2012 02:01:58 -0500
Subject: [PATCH] [f2cl] Fix silent widening of real 1 to {1, 1} in assignment.

---
 contrib/fortran-to-opencl/translate.py | 60 +++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/contrib/fortran-to-opencl/translate.py b/contrib/fortran-to-opencl/translate.py
index d3c35a54..4476d4bc 100644
--- a/contrib/fortran-to-opencl/translate.py
+++ b/contrib/fortran-to-opencl/translate.py
@@ -247,11 +247,28 @@ class TypeInferenceMapper(CombineMapper):
         return expr.dtype
 
     def map_constant(self, expr):
-        return np.array(expr).dtype
+        return np.asarray(expr).dtype
 
     def map_variable(self, expr):
         return self.scope.get_type(expr.name)
 
+    def map_call(self, expr):
+        name = expr.function.name
+        if name == "fromreal":
+            arg, = expr.parameters
+            base_dtype = self.rec(arg)
+            tgt_real_dtype = (np.float32(0)+base_dtype.type(0)).dtype
+            assert tgt_real_dtype.kind == "f"
+            if tgt_real_dtype == np.float32:
+                return np.dtype(np.complex64)
+            elif tgt_real_dtype == np.float64:
+                return np.dtype(np.complex128)
+            else:
+                raise RuntimeError("unexpected complex type")
+
+        else:
+            return CombineMapper.map_call(self, expr)
+
 
 
 
@@ -426,8 +443,8 @@ class CCodeMapper(ComplexCCodeMapper):
             if name in ["conjg", "dconjg"]:
                 name = "conj"
 
-            if name == "cdlog":
-                name = "log"
+            if name[:2] == "cd" and name[2:] in ["log", "exp", "sqrt"]:
+                name = name[2:]
 
             if name == "aimag":
                 name = "imag"
@@ -469,6 +486,9 @@ class CCodeMapper(ComplexCCodeMapper):
         else:
             return expr.value
 
+    def map_wildcard(self, expr, enclosing_prec):
+        return ":"
+
 
 # }}}
 
@@ -710,6 +730,8 @@ class ArgumentAnalayzer(FTreeWalkerBase):
         scope = self.scope_stack[-1]
 
         lhs = self.parse_expr(node.variable)
+
+
         from pymbolic.primitives import Subscript, Call
         if isinstance(lhs, Subscript):
             lhs_name = lhs.aggregate.name
@@ -1089,6 +1111,13 @@ class F2CLTranslator(FTreeWalkerBase):
         if lhs_dtype.kind != 'c' and rhs_dtype.kind == 'c':
             from pymbolic import var
             rhs = var("real")(rhs)
+        # check for silent widening of real
+        if lhs_dtype.kind == 'c' and rhs_dtype.kind != 'c':
+            from pymbolic import var
+            rhs = var("fromreal")(rhs)
+
+        if lhs_name == "cd":
+            print lhs_dtype, rhs_dtype, rhs
 
         return cgen.Assign(self.gen_expr(lhs), self.gen_expr(rhs))
 
@@ -1318,15 +1347,26 @@ def f2cl_files(source_file, target_file, **kwargs):
 if __name__ == "__main__":
     from cgen.opencl import CLConstant
 
-    f2cl_files("hank107.f", "hank107.cl",
+    if 0:
+        f2cl_files("hank107.f", "hank107.cl",
+                addr_space_hints={
+                    ("hank107p", "p"): CLConstant,
+                    ("hank107pc", "p"): CLConstant,
+                    },
+                force_casts={
+                    ("hank107p", 0): "__constant cdouble_t *",
+                    })
+
+        f2cl_files("cdjseval2d.f", "cdjseval2d.cl")
+
+    f2cl_files("hank103.f", "hank103.cl",
             addr_space_hints={
-                ("hank107p", "p"): CLConstant,
-                ("hank107pc", "p"): CLConstant,
+                ("hank103p", "p"): CLConstant,
+                ("hank103pc", "p"): CLConstant,
                 },
             force_casts={
-                ("hank107p", 0): "__constant cdouble_t *",
-                })
-
-    f2cl_files("cdjseval2d.f", "cdjseval2d.cl", try_compile=True)
+                ("hank103p", 0): "__constant cdouble_t *",
+                },
+            try_compile=True)
 
 # vim: foldmethod=marker
-- 
GitLab