Skip to content
Snippets Groups Projects
cpp.py 2.75 KiB
Newer Older
"""
Define some generators based on the caching mechanism that
are commonly needed for code generation
"""
Dominic Kempf's avatar
Dominic Kempf committed
from dune.codegen.options import get_option
from dune.codegen.generation import generator_factory
from dune.codegen.cgen.clazz import AccessModifier, BaseClass, ClassMember
Dominic Kempf's avatar
Dominic Kempf committed
import cgen
Dominic Kempf's avatar
Dominic Kempf committed
preamble = generator_factory(item_tags=("preamble",), counted=True, context_tags="kernel")
pre_include = generator_factory(item_tags=("file", "pre_include"), context_tags=("filetag",), no_deco=True)
post_include = generator_factory(item_tags=("file", "post_include"), context_tags=("filetag",), no_deco=True)
end_of_file = generator_factory(item_tags=("file", "end_of_file"), context_tags=("filetag",), no_deco=True)
class_member = generator_factory(item_tags=("member",), context_tags=("classtag",), on_store=lambda m: ClassMember(m), counted=True)
template_parameter = generator_factory(item_tags=("template_param",), context_tags=("classtag",), counted=True)
class_basename = generator_factory(item_tags=("basename",), context_tags=("classtag",))
@generator_factory(item_tags=("file", "include"), context_tags=("filetag",), counted=True)
Dominic Kempf's avatar
Dominic Kempf committed
def include_file(include, system=False):
    return cgen.Include(include, system=system)
Dominic Kempf's avatar
Dominic Kempf committed
@generator_factory(item_tags=("clazz", "initializer"), counted=True, context_tags=("classtag",), cache_key_generator=lambda o, p: o)
def initializer_list(obj, params):
Dominic Kempf's avatar
Dominic Kempf committed
    return "{}({})".format(obj, ", ".join(params))
Dominic Kempf's avatar
Dominic Kempf committed
@generator_factory(item_tags=("clazz", "baseclass"), context_tags=("classtag",), counted=True)
def base_class(baseclass, access=AccessModifier.PUBLIC, construction=[], classtag=None):
    if construction:
        initializer_list(baseclass, construction, classtag=classtag)
Dominic Kempf's avatar
Dominic Kempf committed
    return BaseClass(baseclass, inheritance=access)
Dominic Kempf's avatar
Dominic Kempf committed
@generator_factory(item_tags=("clazz", "constructor_param"), context_tags=("classtag",), counted=True)
def constructor_parameter(_type, name):
    return cgen.Value(_type, name)
Dominic Kempf's avatar
Dominic Kempf committed
@generator_factory(item_tags=("dump_timers",))
def dump_accumulate_timer(name):
Dominic Kempf's avatar
Dominic Kempf committed
    from dune.codegen.pdelab.localoperator import name_time_dumper_os
    os = name_time_dumper_os()
René Heß's avatar
René Heß committed
    # reset = name_time_dumper_reset()
    reset = 'false'
    code = "DUMP_TIMER({},{},{},{});".format(get_option("instrumentation_level"), name, os, reset)
Dominic Kempf's avatar
Dominic Kempf committed
    return code


@generator_factory(item_tags=("register_likwid_timers",))
def register_liwkid_timer(name):
    return "LIKWID_MARKER_REGISTER(\"{}\");".format(name)


@generator_factory(item_tags=("register_ssc_marks",))
def dump_ssc_marks(name):
    from dune.codegen.pdelab.driver.timings import get_region_marks
    return 'std::cout << "{}: " << {} << " <--> " << {} << std::endl;'.format(name,
Dominic Kempf's avatar
Dominic Kempf committed
                                                                              *get_region_marks(name, driver=False))