diff --git a/src/pystencilssfg/cli.py b/src/pystencilssfg/cli.py index 7a2e296c3eb6506e93533e5280a6f42fd47c139a..c51db09d28adc0e91633856222a4d5d7dc1c9805 100644 --- a/src/pystencilssfg/cli.py +++ b/src/pystencilssfg/cli.py @@ -72,9 +72,12 @@ def list_files(args): _, scriptname = path.split(args.codegen_script) basename = path.splitext(scriptname)[0] - from .emitters.cpu.basic_cpu import BasicCpuEmitter + from .emitters import HeaderSourcePairEmitter - emitter = BasicCpuEmitter(basename, config) + emitter = HeaderSourcePairEmitter(basename, + config.header_extension, + config.source_extension, + config.output_directory) print(args.sep.join(emitter.output_files), end=os.linesep if args.newline else '') diff --git a/src/pystencilssfg/context.py b/src/pystencilssfg/context.py index e7c5ddfce9b1f8c9fc1f4888be0aa46a0be02822..d1add3c47c7e4f09b6c442db6b1cd265bba523cd 100644 --- a/src/pystencilssfg/context.py +++ b/src/pystencilssfg/context.py @@ -1,18 +1,23 @@ from typing import Generator, Sequence -from .configuration import SfgConfiguration, SfgCodeStyle +from .configuration import SfgCodeStyle from .tree.visitors import CollectIncludes from .source_components import SfgHeaderInclude, SfgKernelNamespace, SfgFunction from .exceptions import SfgException class SfgContext: - def __init__(self, config: SfgConfiguration, argv: Sequence[str] | None = None): + def __init__(self, + outer_namespace: str | None = None, + codestyle: SfgCodeStyle = SfgCodeStyle(), + argv: Sequence[str] | None = None): self._argv = argv - self._config = config self._default_kernel_namespace = SfgKernelNamespace(self, "kernels") - self._code_namespace: str | None = None + self._outer_namespace = outer_namespace + self._inner_namespace: str | None = None + + self._codestyle = codestyle # Source Components self._prelude: str = "" @@ -34,11 +39,11 @@ class SfgContext: @property def outer_namespace(self) -> str | None: - return self._config.outer_namespace + return self._outer_namespace @property def inner_namespace(self) -> str | None: - return self._code_namespace + return self._inner_namespace @property def fully_qualified_namespace(self) -> str | None: @@ -51,8 +56,7 @@ class SfgContext: @property def codestyle(self) -> SfgCodeStyle: - assert self._config.codestyle is not None - return self._config.codestyle + return self._codestyle # ---------------------------------------------------------------------------------------------- # Prelude, Includes, Definitions, Namespace @@ -88,10 +92,10 @@ class SfgContext: self._definitions.append(definition) def set_namespace(self, namespace: str): - if self._code_namespace is not None: + if self._inner_namespace is not None: raise SfgException("The code namespace was already set.") - self._code_namespace = namespace + self._inner_namespace = namespace # ---------------------------------------------------------------------------------------------- # Kernel Namespaces diff --git a/src/pystencilssfg/emitters/__init__.py b/src/pystencilssfg/emitters/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fc3c4f6843e1d794a7f55210667bd474d6cbf665 100644 --- a/src/pystencilssfg/emitters/__init__.py +++ b/src/pystencilssfg/emitters/__init__.py @@ -0,0 +1,5 @@ +from .header_source_pair import HeaderSourcePairEmitter + +__all__ = [ + "HeaderSourcePairEmitter" +] diff --git a/src/pystencilssfg/emitters/cpu/__init__.py b/src/pystencilssfg/emitters/cpu/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/pystencilssfg/emitters/cpu/basic_cpu.py b/src/pystencilssfg/emitters/header_source_pair.py similarity index 81% rename from src/pystencilssfg/emitters/cpu/basic_cpu.py rename to src/pystencilssfg/emitters/header_source_pair.py index d49addd7e10856061369962ac23e58409d9e222e..fc4e9433a9bdf7697ce59774526df8844444fdbb 100644 --- a/src/pystencilssfg/emitters/cpu/basic_cpu.py +++ b/src/pystencilssfg/emitters/header_source_pair.py @@ -4,16 +4,19 @@ from textwrap import indent from os import path -from ...configuration import SfgConfiguration -from ...context import SfgContext +from ..context import SfgContext -class BasicCpuEmitter: - def __init__(self, basename: str, config: SfgConfiguration): +class HeaderSourcePairEmitter: + def __init__(self, + basename: str, + header_extension: str, + impl_extension: str, + output_directory: str): self._basename = basename - self._output_directory = cast(str, config.output_directory) - self._header_filename = f"{basename}.{config.header_extension}" - self._source_filename = f"{basename}.{config.source_extension}" + self._output_directory = cast(str, output_directory) + self._header_filename = f"{basename}.{header_extension}" + self._source_filename = f"{basename}.{impl_extension}" @property def output_files(self) -> tuple[str, str]: @@ -39,9 +42,9 @@ class BasicCpuEmitter: 'functions': list(ctx.functions()) } - template_name = "BasicCpu" + template_name = "HeaderSourcePair" - env = Environment(loader=PackageLoader('pystencilssfg.emitters.cpu'), + env = Environment(loader=PackageLoader('pystencilssfg.emitters'), undefined=StrictUndefined, trim_blocks=True, lstrip_blocks=True) diff --git a/src/pystencilssfg/emitters/cpu/jinja_filters.py b/src/pystencilssfg/emitters/jinja_filters.py similarity index 100% rename from src/pystencilssfg/emitters/cpu/jinja_filters.py rename to src/pystencilssfg/emitters/jinja_filters.py diff --git a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp b/src/pystencilssfg/emitters/templates/HeaderSourcePair.tmpl.cpp similarity index 100% rename from src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.cpp rename to src/pystencilssfg/emitters/templates/HeaderSourcePair.tmpl.cpp diff --git a/src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h b/src/pystencilssfg/emitters/templates/HeaderSourcePair.tmpl.h similarity index 100% rename from src/pystencilssfg/emitters/cpu/templates/BasicCpu.tmpl.h rename to src/pystencilssfg/emitters/templates/HeaderSourcePair.tmpl.h diff --git a/src/pystencilssfg/generator.py b/src/pystencilssfg/generator.py index b0da25c96599eb94bc406f849139503395e340f0..12449f83f09736ab1b03b004d412c7f13848a7b1 100644 --- a/src/pystencilssfg/generator.py +++ b/src/pystencilssfg/generator.py @@ -1,3 +1,6 @@ +# TODO +# mypy strict_optional=False + import sys import os from os import path @@ -21,10 +24,13 @@ class SourceFileGenerator: config = merge_configurations(project_config, cmdline_config, sfg_config) - self._context = SfgContext(config, argv=script_args) + self._context = SfgContext(config.outer_namespace, config.codestyle, argv=script_args) - from .emitters.cpu.basic_cpu import BasicCpuEmitter - self._emitter = BasicCpuEmitter(basename, config) + from .emitters import HeaderSourcePairEmitter + self._emitter = HeaderSourcePairEmitter(basename, + config.header_extension, + config.source_extension, + config.output_directory) def clean_files(self): for file in self._emitter.output_files: diff --git a/src/pystencilssfg/source_concepts/source_objects.py b/src/pystencilssfg/source_concepts/source_objects.py index e2cad1ff32fdff6338b0ffb2ca838968d038d802..2f5a392f8cd6a45922543547f000acb12d37d78b 100644 --- a/src/pystencilssfg/source_concepts/source_objects.py +++ b/src/pystencilssfg/source_concepts/source_objects.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, TypeAlias +from typing import TYPE_CHECKING, Union, TypeAlias from abc import ABC, abstractmethod @@ -19,7 +19,7 @@ class SrcObject: Two objects are identical if they have the same identifier and type string.""" - def __init__(self, src_type: SrcType, identifier: Optional[str]): + def __init__(self, src_type: SrcType, identifier: str): self._src_type = src_type self._identifier = identifier @@ -28,7 +28,7 @@ class SrcObject: return self._identifier @property - def name(self): + def name(self) -> str: """For interface compatibility with ps.TypedSymbol""" return self._identifier @@ -53,7 +53,7 @@ TypedSymbolOrObject: TypeAlias = Union[TypedSymbol, SrcObject] class SrcField(SrcObject, ABC): - def __init__(self, src_type: SrcType, identifier: Optional[str]): + def __init__(self, src_type: SrcType, identifier: str): super().__init__(src_type, identifier) @abstractmethod