Skip to content
Snippets Groups Projects
Commit e02732bf authored by Frederik Hennig's avatar Frederik Hennig
Browse files

added prelude and definitions

parent 833d1f29
No related merge requests found
Pipeline #57744 passed with stages
in 5 minutes and 1 second
......@@ -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")
......
......@@ -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)
......
......@@ -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
# ----------------------------------------------------------------------------------------------
......
......@@ -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] + ["*/"])
{{ prelude }}
#include "{{header_filename}}"
{% for incl in private_includes %}
......
{{ 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 %}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment