Skip to content
Snippets Groups Projects
basic_cpu.py 2.45 KiB
Newer Older
Frederik Hennig's avatar
Frederik Hennig committed
from typing import cast
from jinja2 import Environment, PackageLoader, StrictUndefined
from textwrap import indent
Frederik Hennig's avatar
Frederik Hennig committed
from ...configuration import SfgConfiguration
from ...context import SfgContext

Frederik Hennig's avatar
Frederik Hennig committed
    def __init__(self, basename: str, config: SfgConfiguration):
        self._basename = basename
Frederik Hennig's avatar
Frederik Hennig committed
        self._output_directory = cast(str, config.output_directory)
Frederik Hennig's avatar
Frederik Hennig committed
        self._header_filename = f"{basename}.{config.header_extension}"
        self._source_filename = f"{basename}.{config.source_extension}"
Frederik Hennig's avatar
Frederik Hennig committed
    def output_files(self) -> tuple[str, str]:
        return (
            path.join(self._output_directory, self._header_filename),
            path.join(self._output_directory, self._source_filename)
Frederik Hennig's avatar
Frederik Hennig committed
    def write_files(self, ctx: SfgContext):
        fq_namespace = ctx.fully_qualified_namespace

Frederik Hennig's avatar
Frederik Hennig committed
            'ctx': ctx,
            'header_filename': self._header_filename,
            'source_filename': self._source_filename,
            'basename': self._basename,
            'prelude': get_prelude_comment(ctx),
            'definitions': list(ctx.definitions()),
            'fq_namespace': fq_namespace,
Frederik Hennig's avatar
Frederik Hennig committed
            'public_includes': list(incl.get_code() for incl in ctx.includes() if not incl.private),
            'private_includes': list(incl.get_code() for incl in ctx.includes() if incl.private),
            'kernel_namespaces': list(ctx.kernel_namespaces()),
            'functions': list(ctx.functions())
        env = Environment(loader=PackageLoader('pystencilssfg.emitters.cpu'),
                          undefined=StrictUndefined,
                          trim_blocks=True,
                          lstrip_blocks=True)

        from .jinja_filters import add_filters_to_jinja
        add_filters_to_jinja(env)

        header = env.get_template(f"{template_name}.tmpl.h").render(**jinja_context)
        source = env.get_template(f"{template_name}.tmpl.cpp").render(**jinja_context)

        with open(path.join(self._output_directory, self._header_filename), 'w') as headerfile:
        with open(path.join(self._output_directory, self._source_filename), 'w') as cppfile:


def get_prelude_comment(ctx: SfgContext):
    if not ctx.prelude_comment:
    return "/*\n" + indent(ctx.prelude_comment, "* ", predicate=lambda _: True) + "*/\n"