1818from devito .arch .compiler import AOMPCompiler
1919from devito .symbolics .inspection import has_integer_args , sympy_dtype
2020from devito .symbolics .queries import q_leaf
21- from devito .tools import ctypes_to_cstr , ctypes_vector_mapper , dtype_to_ctype
21+ from devito .tools import (
22+ ctypes_to_cstr , ctypes_vector_mapper , dtype_to_ctype , memoized_func
23+ )
2224from devito .types .basic import AbstractFunction
2325
24- __all__ = ['BasePrinter' , 'ccode' ]
26+ __all__ = ['BasePrinter' , 'ccode' , 'get_printer' ]
2527
2628
2729class BasePrinter (CodePrinter ):
@@ -449,15 +451,20 @@ def _print_Fallback(self, expr):
449451 sympy .printing .str .StrPrinter ._print_Add = BasePrinter ._print_Add
450452
451453
452- def ccode (expr , printer = None , ** settings ):
454+ @memoized_func
455+ def get_printer (printer , dtype ):
456+ return printer (settings = {'dtype' : dtype })
457+
458+
459+ def ccode (expr , printer = None , dtype = None ):
453460 """Generate C++ code from an expression.
454461
455462 Parameters
456463 ----------
457464 expr : expr-like
458465 The expression to be printed.
459- settings : dict
460- Options for code printing .
466+ dtype : data-type, optional
467+ Data type used by the printer .
461468
462469 Returns
463470 -------
@@ -468,4 +475,5 @@ def ccode(expr, printer=None, **settings):
468475 if printer is None :
469476 from devito .passes .iet .languages .C import CPrinter
470477 printer = CPrinter
471- return printer (settings = settings ).doprint (expr , None )
478+ dtype = printer ._default_settings ['dtype' ] if dtype is None else dtype
479+ return get_printer (printer , dtype ).doprint (expr , None )
0 commit comments