diff --git a/Notes.md b/Notes.md deleted file mode 100644 index 1c8539b0c284f49f2b9db2e419acd6a57800f99e..0000000000000000000000000000000000000000 --- a/Notes.md +++ /dev/null @@ -1,27 +0,0 @@ - -# Build System Integration - -## Configurator Script - -The configurator script should configure the code generator and provide global configuration to all codegen scripts. -In the CMake integration, it can be specified globally via the `PystencilsSfg_CONFIGURATOR_SCRIPT` cache variable. - -To decide and implement: - - - Use `runpy` and communicate via a global variable, or use `importlib.util.spec_from_file_location` and communicate via - a function call? In either case, there needs to be concensus about at least one name in the configurator script. - - Allow specifying a separate configurator file at `pystencilssfg_generate_target_sources`? Sound sensible... It's basically - for free with the potential to add lots of flexibility - -## Generator flags - -Two separate lists of flags may be passed to generator scripts: Some may be evaluated by the SFG, and the rest -will be passed on to the user script. - -Arguments to the SFG include: - - - Path of the configurator script - - Output directory - -How to separate user from generator arguments? - diff --git a/Readme.md b/Readme.md index 8bf4b6a2985a094ad65316563b2d14073575be2d..1f9ee2d652aec2f03cb0c20e3e51f76b32cfd20f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,3 @@ -# pystencils Source File Generator (ps-sfg) +# pystencils Source File Generator (pystencils-sfg) diff --git a/pystencilssfg/tree/basic_nodes.py b/pystencilssfg/tree/basic_nodes.py index 75fceb5ddf6f6e9edd587643287fc88452dc75e7..6fbf99a821bf3e1f08085094fc85e0c337055c2f 100644 --- a/pystencilssfg/tree/basic_nodes.py +++ b/pystencilssfg/tree/basic_nodes.py @@ -1,19 +1,16 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Sequence, Set, Union, Iterable - -if TYPE_CHECKING: - from ..context import SfgContext - from ..source_components import SfgHeaderInclude +from typing import TYPE_CHECKING, Sequence, Set from abc import ABC, abstractmethod from itertools import chain from ..kernel_namespace import SfgKernelHandle from ..source_concepts.source_objects import SrcObject, TypedSymbolOrObject - from ..exceptions import SfgException -from pystencils.typing import TypedSymbol +if TYPE_CHECKING: + from ..context import SfgContext + from ..source_components import SfgHeaderInclude class SfgCallTreeNode(ABC): """Base class for all nodes comprising SFG call trees. """ @@ -72,7 +69,7 @@ class SfgStatements(SfgCallTreeLeaf): required_objects: Objects (as `SrcObject` or `TypedSymbol`) that are required as input to these statements. """ - def __init__(self, + def __init__(self, code_string: str, defined_params: Sequence[TypedSymbolOrObject], required_params: Sequence[TypedSymbolOrObject]): diff --git a/pystencilssfg/tree/visitors.py b/pystencilssfg/tree/visitors.py index 9da7db247b8206d68ea81ce47ca5e79cc6889293..bc466c05e58b9f715b72f8b0438184c1c3c05575 100644 --- a/pystencilssfg/tree/visitors.py +++ b/pystencilssfg/tree/visitors.py @@ -1,8 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Sequence, Set, Union, Iterable -if TYPE_CHECKING: - from ..context import SfgContext +from typing import TYPE_CHECKING, Set from functools import reduce @@ -12,8 +10,13 @@ from .basic_nodes import SfgCallTreeNode, SfgCallTreeLeaf, SfgSequence, SfgState from .deferred_nodes import SfgParamCollectionDeferredNode +if TYPE_CHECKING: + from ..context import SfgContext + + class FlattenSequences(): """Flattens any nested sequences occuring in a kernel call tree.""" + def visit(self, node: SfgCallTreeNode) -> None: if isinstance(node, SfgSequence): return self._visit_SfgSequence(node) @@ -23,14 +26,14 @@ class FlattenSequences(): def _visit_SfgSequence(self, sequence: SfgSequence) -> None: children_flattened = [] - + def flatten(seq: SfgSequence): for c in seq.children: if isinstance(c, SfgSequence): flatten(c) else: children_flattened.append(c) - + flatten(sequence) for c in children_flattened: @@ -49,14 +52,15 @@ class CollectIncludes: class ExpandingParameterCollector(): + """Collects all parameters required but not defined in a kernel call tree. + Expands any deferred nodes of type `SfgParamCollectionDeferredNode` found within sequences on the way. + """ + def __init__(self, ctx: SfgContext) -> None: self._ctx = ctx self._flattener = FlattenSequences() - """Collects all parameters required but not defined in a kernel call tree. - Expands any deferred nodes of type `SfgParamCollectionDeferredNode` found within sequences on the way. - """ def visit(self, node: SfgCallTreeNode) -> Set[TypedSymbol]: if isinstance(node, SfgCallTreeLeaf): return self._visit_SfgCallTreeLeaf(node) @@ -72,13 +76,13 @@ class ExpandingParameterCollector(): """ Only in a sequence may parameters be defined and visible to subsequent nodes. """ - + params = set() def iter_nested_sequences(seq: SfgSequence, visible_params: Set[TypedSymbol]): for i in range(len(seq.children) - 1, -1, -1): c = seq.children[i] - + if isinstance(c, SfgParamCollectionDeferredNode): c = c.expand(self._ctx, visible_params=visible_params) seq.replace_child(i, c) @@ -88,7 +92,7 @@ class ExpandingParameterCollector(): else: if isinstance(c, SfgStatements): visible_params -= c.defined_parameters - + visible_params |= self.visit(c) iter_nested_sequences(sequence, params) @@ -108,6 +112,7 @@ class ParameterCollector(): Requires that all sequences in the tree are flattened. """ + def visit(self, node: SfgCallTreeNode) -> Set[TypedSymbol]: if isinstance(node, SfgCallTreeLeaf): return self._visit_SfgCallTreeLeaf(node) @@ -123,12 +128,12 @@ class ParameterCollector(): """ Only in a sequence may parameters be defined and visible to subsequent nodes. """ - + params = set() for c in sequence.children[::-1]: if isinstance(c, SfgStatements): params -= c.defined_parameters - + assert not isinstance(c, SfgSequence), "Sequence not flattened." params |= self.visit(c) return params