diff --git a/integration/MakeDemo/kernels.py b/integration/MakeDemo/kernels.py index add435f06bc5ecd454c1472a5f2632efe242603f..310b9bcd0c244afe86c869117b19c4b335ef6c34 100644 --- a/integration/MakeDemo/kernels.py +++ b/integration/MakeDemo/kernels.py @@ -12,6 +12,12 @@ sfg_config = SfgConfiguration( ) with SourceFileGenerator(sfg_config) as sfg: + sfg.prelude("""Generated by the pystencils Source File Generator. + +Author: Frederik Hennig <frederik.hennig@fau.de>""") + + sfg.define("using namespace std;") + sfg.namespace("jacobi") u_src, u_dst, f = fields("u_src, u_dst, f(1) : double[2D]", layout="fzyx") diff --git a/src/pystencilssfg/composer.py b/src/pystencilssfg/composer.py index 8d2c9766b697517dfe1dae1921b53ecf0efd0007..d405b66a48f34ad8d512af234de6965ad436a32e 100644 --- a/src/pystencilssfg/composer.py +++ b/src/pystencilssfg/composer.py @@ -24,7 +24,17 @@ class SfgComposer: @property def context(self): return self._ctx - + + def prelude(self, content: str): + """Add a string to the code file's prelude. + + Do not wrap the given string in comment syntax.""" + self._ctx.append_to_prelude(content) + + def define(self, definition: str): + """Add a custom definition to the generated header file.""" + self._ctx.add_definition(definition) + def namespace(self, namespace: str): """Set the inner code namespace. Throws an exception if a namespace was already set.""" self._ctx.set_namespace(namespace) diff --git a/src/pystencilssfg/context.py b/src/pystencilssfg/context.py index 548d9e5727b642a6dfb2e75b3947420b8156b766..96649db9d7a3a9c7301df10dd6f8268d675b8505 100644 --- a/src/pystencilssfg/context.py +++ b/src/pystencilssfg/context.py @@ -12,7 +12,7 @@ class SfgContext: self._config = config self._default_kernel_namespace = SfgKernelNamespace(self, "kernels") - self._code_namespace = None + self._code_namespace: str | None = None # Source Components self._prelude: list[str] = [] @@ -58,10 +58,10 @@ class SfgContext: # Prelude, Includes, Definitions, Namespace # ---------------------------------------------------------------------------------------------- - def prelude_comments(self) -> Generator[str, None, None]: + def prelude(self) -> Generator[str, None, None]: """The prelude is a comment block printed at the top of both generated files.""" yield from self._prelude - + def append_to_prelude(self, code_str: str): self._prelude.append(code_str) @@ -83,7 +83,7 @@ class SfgContext: def set_namespace(self, namespace: str): if self._code_namespace is not None: raise SfgException("The code namespace was already set.") - + self._code_namespace = namespace # ---------------------------------------------------------------------------------------------- diff --git a/src/pystencilssfg/emitters/cpu/basic_cpu.py b/src/pystencilssfg/emitters/cpu/basic_cpu.py index 46ddfb5ccac5c8106a92b1af34d38184d7ca69ce..25c952c8d6a39c55ea39bbf18f7c6f22600eb991 100644 --- a/src/pystencilssfg/emitters/cpu/basic_cpu.py +++ b/src/pystencilssfg/emitters/cpu/basic_cpu.py @@ -29,6 +29,8 @@ class BasicCpuEmitter: '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, '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), @@ -54,3 +56,16 @@ class BasicCpuEmitter: with open(path.join(self._output_directory, self._source_filename), 'w') as cppfile: cppfile.write(source) + + +def get_prelude_comment(ctx: SfgContext): + prelude_lines = [] + for p in ctx.prelude(): + prelude_lines += p.splitlines() + prelude_lines += [""] # empty line in-between + prelude_lines = prelude_lines[:-1] + + if not prelude_lines: + return "" + + return "\n".join(["/**"] + [f"* {line}" for line in prelude_lines] + ["*/"]) diff --git a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp b/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp index 6132d661fef182f73570c1c67f4a6e14ad3fe168..12b81bf6146298a88992b0a1aa0294af002e68cf 100644 --- a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp +++ b/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp @@ -1,3 +1,5 @@ +{{ prelude }} + #include "{{header_filename}}" {% for incl in private_includes %} diff --git a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h b/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h index 6cc4e5e8b1152d32e8c388d4d87abba778e45e1c..312e50ede2d495aac55a30dbef8b04d078f4d02c 100644 --- a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h +++ b/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h @@ -1,3 +1,5 @@ +{{ prelude }} + #pragma once #include <cstdint> @@ -6,6 +8,10 @@ {{incl}} {% endfor %} +{% for definition in definitions %} +{{ definition }} +{% endfor %} + #define RESTRICT __restrict__ {% if fq_namespace is not none %}