From 8de344297b3e5b81f8042a69d0372002a98d6b90 Mon Sep 17 00:00:00 2001 From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de> Date: Tue, 23 Feb 2016 15:54:32 +0100 Subject: [PATCH] Move all C++ stuff to the new generators --- python/dune/perftool/generation/__init__.py | 2 +- python/dune/perftool/generation/cpp.py | 55 +++++++++++++++++++ python/dune/perftool/generation/generators.py | 27 --------- python/dune/perftool/generation/loopy.py | 1 + python/dune/perftool/pdelab/__init__.py | 2 +- python/dune/perftool/pdelab/localoperator.py | 49 +++++------------ 6 files changed, 73 insertions(+), 63 deletions(-) create mode 100644 python/dune/perftool/generation/cpp.py delete mode 100644 python/dune/perftool/generation/generators.py create mode 100644 python/dune/perftool/generation/loopy.py diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py index 1c686dcf..c0b4b10e 100644 --- a/python/dune/perftool/generation/__init__.py +++ b/python/dune/perftool/generation/__init__.py @@ -2,4 +2,4 @@ from __future__ import absolute_import # TODO I am not sure about whether to collect these here or not. from dune.perftool.generation.cache import no_caching, generator_factory, retrieve_cache_items, delete_cache_items, delete_cache -from dune.perftool.generation.generators import * +from dune.perftool.generation.cpp import * diff --git a/python/dune/perftool/generation/cpp.py b/python/dune/perftool/generation/cpp.py new file mode 100644 index 00000000..652f7f71 --- /dev/null +++ b/python/dune/perftool/generation/cpp.py @@ -0,0 +1,55 @@ +""" +Define some generators based on the caching mechanism that +are commonly needed for code generation +""" + +from dune.perftool.generation import generator_factory +from dune.perftool.cgen.clazz import AccessModifier + +symbol = generator_factory(item_tags=("symbol",)) + + +def include_file(include, filetag=None): + assert filetag + from cgen import Include + gen = generator_factory(on_store=lambda i: Include(i), item_tags=(filetag, "include"), no_deco=True) + return gen(include) + + +def preamble(tag): + return generator_factory(item_tags=(tag, "preamble"), counted=True) + + +def initializer_list(obj, params, classtag=None): + assert classtag + gen = generator_factory(item_tags=(classtag, "initializer"), counted=True, cache_key_generator=lambda *a: a[0]) + return "{}({})".format(obj, ", ".join(params)) + + +def base_class(baseclass, classtag=None, access=AccessModifier.PUBLIC, construction=[]): + assert classtag + + from dune.perftool.cgen.clazz import BaseClass + gen = generator_factory(item_tags=("baseclass", classtag), on_store=lambda n: BaseClass(n, inheritance=access), counted=True, no_deco=True) + + if construction: + initializer_list(baseclass, construction, classtag=classtag) + + return gen(baseclass) + + +def class_member(classtag=None, access=AccessModifier.PRIVATE): + assert classtag + from cgen import Value + from dune.perftool.cgen.clazz import ClassMember + + return generator_factory(item_tags=(classtag, "member"), on_store=lambda t, n: ClassMember(Value(_type, name), access=access), counted=True, cache_key_generator=lambda t, n: n) + + +def constructor_parameter(_type, name, classtag=None, constructortag=None): + assert classtag + assert constructortag + from cgen import Value + + gen = generator_factory(item_tags=(classtag, constructortag, "constructor", "parameter"), counted=True, no_deco=True) + return gen(Value(_type, name)) diff --git a/python/dune/perftool/generation/generators.py b/python/dune/perftool/generation/generators.py deleted file mode 100644 index 2eff5e2b..00000000 --- a/python/dune/perftool/generation/generators.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Define some generators based on the caching mechanism that -are commonly needed for code generation -""" - -from dune.perftool.generation import generator_factory -from dune.perftool.cgen.clazz import AccessModifier - -symbol = generator_factory(item_tags=("symbol",)) - - -def include_file(include, filetag="operator"): - from cgen import Include - gen = generator_factory(on_store=lambda i: Include(i), item_tags=(filetag, "include"), no_deco=True) - return gen(include) - - -# TODO this should perhaps already take into account a potential construction of the base class object -def base_class(baseclass, classtag=None, access=AccessModifier.PUBLIC): - assert classtag - from dune.perftool.cgen.clazz import BaseClass - gen = generator_factory(item_tags=("baseclass", classtag), on_store=lambda n: BaseClass(n, inheritance=access), counted=True, no_deco=True) - return gen(baseclass) - - -def preamble(tag): - return generator_factory(item_tags=(tag, "preamble"), counted=True) diff --git a/python/dune/perftool/generation/loopy.py b/python/dune/perftool/generation/loopy.py new file mode 100644 index 00000000..f4c0c5ab --- /dev/null +++ b/python/dune/perftool/generation/loopy.py @@ -0,0 +1 @@ +""" The loopy specific generators """ \ No newline at end of file diff --git a/python/dune/perftool/pdelab/__init__.py b/python/dune/perftool/pdelab/__init__.py index 9b611ba1..1b35864e 100644 --- a/python/dune/perftool/pdelab/__init__.py +++ b/python/dune/perftool/pdelab/__init__.py @@ -1,7 +1,7 @@ """ The pdelab specific parts of the code generation process """ # Define the generators that are used throughout all pdelab specific code generations. -from dune.perftool.generation import symbol +from dune.perftool.generation import symbol, generator_factory from dune.perftool.loopy.transformer import quadrature_iname from loopy import CInstruction diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py index 24f06f14..618c4ef8 100644 --- a/python/dune/perftool/pdelab/localoperator.py +++ b/python/dune/perftool/pdelab/localoperator.py @@ -1,43 +1,24 @@ from __future__ import absolute_import from dune.perftool.options import get_option -from dune.perftool.generation import include_file, base_class, symbol, generator_factory +from dune.perftool.generation import include_file, base_class, symbol, initializer_list, class_member, constructor_parameter from dune.perftool.cgen.clazz import BaseClass, ClassMember from pytools import memoize -@generator_factory(item_tags=("initializer", "operator"), counted=True, cache_key_generator=lambda *a: a[0]) -def initializer_list(obj, params): - return "{}({})".format(obj, ", ".join(params)) +@class_member("operator") +def define_initree(name): + include_file('dune/common/parametertree.hh', filetag="operatorfile") + constructor_parameter("const Dune::ParameterTree&", "iniParams", classtag="operator", constructortag="iniconstructor") + initializer_list("_iniParams", ["iniParams"]) - -@generator_factory(item_tags=("operator", "member"), counted=True, cache_key_generator=lambda t, n: n) -def define_private_member(_type, name): - from cgen import Value - from dune.perftool.cgen.clazz import ClassMember, AccessModifier - return ClassMember(Value(_type, name), access=AccessModifier.PRIVATE) - - -@generator_factory(item_tags=("operator", "constructor_param"), counted=True) -def constructor_parameter(_type, name): - from cgen import Value - return Value(_type, name) - - -@symbol -def name_initree_constructor(): - include_file('dune/common/parametertree.hh', filetag="operator") - constructor_parameter("const Dune::ParameterTree&", "iniParams") - return "iniParams" + return "const Dune::ParameterTree&", "_iniParams" @symbol def name_initree_member(): - include_file('dune/common/parametertree.hh', filetag="operator") - define_private_member("const Dune::ParameterTree&", "_iniParams") - in_constructor = name_initree_constructor() - initializer_list("_iniParams", [in_constructor]) + define_initree("_iniParams") return "_iniParams" @@ -166,11 +147,11 @@ def generate_localoperator_kernels(form): delete_cache() # Manage includes and base classes that we always need - include_file('dune/pdelab/gridfunctionspace/gridfunctionspaceutilities.hh', filetag="operator") - include_file('dune/pdelab/localoperator/idefault.hh', filetag="operator") - include_file('dune/pdelab/localoperator/flags.hh', filetag="operator") - include_file('dune/pdelab/localoperator/pattern.hh', filetag="operator") - include_file('dune/geometry/quadraturerules.hh', filetag="operator") + include_file('dune/pdelab/gridfunctionspace/gridfunctionspaceutilities.hh', filetag="operatorfile") + include_file('dune/pdelab/localoperator/idefault.hh', filetag="operatorfile") + include_file('dune/pdelab/localoperator/flags.hh', filetag="operatorfile") + include_file('dune/pdelab/localoperator/pattern.hh', filetag="operatorfile") + include_file('dune/geometry/quadraturerules.hh', filetag="operatorfile") base_class('Dune::PDELab::LocalOperatorDefaultFlags', classtag="operator") @@ -185,7 +166,7 @@ def generate_localoperator_kernels(form): # Generate the necessary jacobian methods from dune.perftool.options import get_option if get_option("numerical_jacobian"): - include_file("dune/pdelab/localoperator/defaultimp.hh", filetag="operator") + include_file("dune/pdelab/localoperator/defaultimp.hh", filetag="operatorfile") else: from ufl import derivative from ufl.algorithms import expand_derivatives @@ -214,4 +195,4 @@ def generate_localoperator_file(kernels): # TODO take the name of this thing from the UFL file lop = cgen_class_from_cache("operator", members=operator_methods) - generate_file(get_option("operator_file"), "operator", [lop]) + generate_file(get_option("operator_file"), "operatorfile", [lop]) -- GitLab