From b72ef2158f9d670078dba939b2aaa5a4cc500973 Mon Sep 17 00:00:00 2001
From: Martin Bauer <martin.bauer@fau.de>
Date: Wed, 14 Nov 2018 12:52:24 +0100
Subject: [PATCH] Removed 'symbol_name_to_variable_name'

- was not used consistently before
- symbol names are expected to be valid C identifiers
- for complicated field names, the latex_name of field should be used
---
 astnodes.py         | 2 +-
 field.py            | 3 ++-
 gpucuda/cudajit.py  | 5 ++---
 kernelparameters.py | 7 +++----
 llvm/llvmjit.py     | 3 +--
 sympyextensions.py  | 5 -----
 transformations.py  | 3 +--
 7 files changed, 10 insertions(+), 18 deletions(-)

diff --git a/astnodes.py b/astnodes.py
index 3548afae4..6a7026c6a 100644
--- a/astnodes.py
+++ b/astnodes.py
@@ -198,7 +198,7 @@ class KernelFunction(Node):
 
         This function is expensive, cache the result where possible!
         """
-        field_map = {symbol_name_to_variable_name(f.name): f for f in self.fields_accessed}
+        field_map = {f.name: f for f in self.fields_accessed}
 
         def get_fields(symbol):
             if hasattr(symbol, 'field_name'):
diff --git a/field.py b/field.py
index 8cc5ee0f6..20501752a 100644
--- a/field.py
+++ b/field.py
@@ -379,7 +379,8 @@ class Field:
         return Field.Access(self, center)(*args, **kwargs)
 
     def hashable_contents(self):
-        return self._layout, self.shape, self.strides, hash(self._dtype), self.field_type, self._field_name
+        dth = hash(self._dtype)
+        return self._layout, self.shape, self.strides, dth, self.field_type, self._field_name, self.latex_name
 
     def __hash__(self):
         return hash(self.hashable_contents())
diff --git a/gpucuda/cudajit.py b/gpucuda/cudajit.py
index ef10184b5..8383813a4 100644
--- a/gpucuda/cudajit.py
+++ b/gpucuda/cudajit.py
@@ -1,7 +1,6 @@
 import numpy as np
 from pystencils.backends.cbackend import generate_c
 from pystencils.kernelparameters import FieldPointerSymbol
-from pystencils.sympyextensions import symbol_name_to_variable_name
 from pystencils.data_types import StructType
 from pystencils.field import FieldType
 
@@ -67,7 +66,7 @@ def make_python_function(kernel_function_node, argument_dict=None):
 
 
 def _build_numpy_argument_list(parameters, argument_dict):
-    argument_dict = {symbol_name_to_variable_name(k): v for k, v in argument_dict.items()}
+    argument_dict = {k: v for k, v in argument_dict.items()}
     result = []
 
     for param in parameters:
@@ -101,7 +100,7 @@ def _check_arguments(parameter_specification, argument_dict):
     Checks if parameters passed to kernel match the description in the AST function node.
     If not it raises a ValueError, on success it returns the array shape that determines the CUDA blocks and threads
     """
-    argument_dict = {symbol_name_to_variable_name(k): v for k, v in argument_dict.items()}
+    argument_dict = {k: v for k, v in argument_dict.items()}
     array_shapes = set()
     index_arr_shapes = set()
 
diff --git a/kernelparameters.py b/kernelparameters.py
index 55e5ccbdb..25869d266 100644
--- a/kernelparameters.py
+++ b/kernelparameters.py
@@ -15,7 +15,6 @@ would reference back to the field.
 """
 from sympy.core.cache import cacheit
 from pystencils.data_types import TypedSymbol, create_composite_type_from_string, PointerType, get_base_type
-from pystencils.sympyextensions import symbol_name_to_variable_name
 
 SHAPE_DTYPE = create_composite_type_from_string("const int64")
 STRIDE_DTYPE = create_composite_type_from_string("const int64")
@@ -28,7 +27,7 @@ class FieldStrideSymbol(TypedSymbol):
         return obj
 
     def __new_stage2__(cls, field_name, coordinate):
-        name = "_stride_{name}_{i}".format(name=symbol_name_to_variable_name(field_name), i=coordinate)
+        name = "_stride_{name}_{i}".format(name=field_name, i=coordinate)
         obj = super(FieldStrideSymbol, cls).__xnew__(cls, name, STRIDE_DTYPE)
         obj.field_name = field_name
         obj.coordinate = coordinate
@@ -52,7 +51,7 @@ class FieldShapeSymbol(TypedSymbol):
         return obj
 
     def __new_stage2__(cls, field_names, coordinate):
-        names = "_".join([symbol_name_to_variable_name(field_name) for field_name in field_names])
+        names = "_".join([field_name for field_name in field_names])
         name = "_size_{names}_{i}".format(names=names, i=coordinate)
         obj = super(FieldShapeSymbol, cls).__xnew__(cls, name, SHAPE_DTYPE)
         obj.field_names = tuple(field_names)
@@ -76,7 +75,7 @@ class FieldPointerSymbol(TypedSymbol):
         return obj
 
     def __new_stage2__(cls, field_name, field_dtype, const):
-        name = "_data_{name}".format(name=symbol_name_to_variable_name(field_name))
+        name = "_data_{name}".format(name=field_name)
         dtype = PointerType(get_base_type(field_dtype), const=const, restrict=False)
         obj = super(FieldPointerSymbol, cls).__xnew__(cls, name, dtype)
         obj.field_name = field_name
diff --git a/llvm/llvmjit.py b/llvm/llvmjit.py
index e33d97d99..545454cb9 100644
--- a/llvm/llvmjit.py
+++ b/llvm/llvmjit.py
@@ -5,12 +5,11 @@ import ctypes as ct
 from pystencils.data_types import create_composite_type_from_string
 from ..data_types import to_ctypes, ctypes_from_llvm, StructType
 from .llvm import generate_llvm
-from pystencils.sympyextensions import symbol_name_to_variable_name
 from pystencils.field import FieldType
 
 
 def build_ctypes_argument_list(parameter_specification, argument_dict):
-    argument_dict = {symbol_name_to_variable_name(k): v for k, v in argument_dict.items()}
+    argument_dict = {k: v for k, v in argument_dict.items()}
     ct_arguments = []
     array_shapes = set()
     index_arr_shapes = set()
diff --git a/sympyextensions.py b/sympyextensions.py
index 400f55d66..b95fc6bc5 100644
--- a/sympyextensions.py
+++ b/sympyextensions.py
@@ -549,8 +549,3 @@ def sort_assignments_topologically(assignments: Sequence[Assignment]) -> List[As
 class SymbolCreator:
     def __getattribute__(self, name):
         return sp.Symbol(name)
-
-
-def symbol_name_to_variable_name(symbol_name):
-    """Replaces characters which are allowed in sympy symbol names but not in C/C++ variable names"""
-    return symbol_name.replace("^", "_")
diff --git a/transformations.py b/transformations.py
index 2f1bdf022..c2cc77796 100644
--- a/transformations.py
+++ b/transformations.py
@@ -14,7 +14,6 @@ from pystencils.data_types import TypedSymbol, PointerType, StructType, get_base
 from pystencils.kernelparameters import FieldPointerSymbol, FieldStrideSymbol
 from pystencils.slicing import normalize_slice
 import pystencils.astnodes as ast
-from pystencils.sympyextensions import symbol_name_to_variable_name
 
 
 def filtered_tree_iteration(node, node_type, stop_type=None):
@@ -755,7 +754,7 @@ class KernelConstraintsCheck:
         elif isinstance(rhs, TypedSymbol):
             return rhs
         elif isinstance(rhs, sp.Symbol):
-            return TypedSymbol(symbol_name_to_variable_name(rhs.name), self._type_for_symbol[rhs.name])
+            return TypedSymbol(rhs.name, self._type_for_symbol[rhs.name])
         elif type_constants and isinstance(rhs, sp.Number):
             return cast_func(rhs, create_type(self._type_for_symbol['_constant']))
         elif isinstance(rhs, sp.Mul):
-- 
GitLab