Skip to content
Snippets Groups Projects

Improved Source File and Code Structure Modelling

Merged Frederik Hennig requested to merge fhennig/source-files into master
Viewing commit b90499a3
Show latest version
4 files
+ 56
84
Preferences
Compare changes
Files
4
  • b90499a3
    some cleanup · b90499a3
    Frederik Hennig authored
     - move numpy_struct to class composer and use its sequencers
     - fix some type errors
from __future__ import annotations
from typing import Sequence, TypeAlias
from abc import ABC, abstractmethod
import numpy as np
import sympy as sp
from functools import reduce
from warnings import warn
@@ -33,10 +32,6 @@ from ..ir.source_components import (
SfgFunction,
SfgKernelNamespace,
SfgKernelHandle,
SfgClass,
SfgConstructor,
SfgMemberVariable,
SfgClassKeyword,
SfgEntityDecl,
SfgEntityDef,
SfgNamespaceBlock,
@@ -86,7 +81,7 @@ SequencerArg: TypeAlias = tuple | ExprLike | SfgCallTreeNode | SfgNodeBuilder
class KernelsAdder:
def __init__(self, ctx: SfgContext, loc: SfgNamespaceBlock):
self._ctx = ctx
self._loc = SfgNamespaceBlock
self._loc = loc
assert isinstance(loc.namespace, SfgKernelNamespace)
self._kernel_namespace = loc.namespace
@@ -110,6 +105,8 @@ class KernelsAdder:
khandle = SfgKernelHandle(kernel_name, self._kernel_namespace, kernel)
self._kernel_namespace.add_kernel(khandle)
self._loc.elements.append(SfgEntityDef(khandle))
for header in kernel.required_headers:
assert self._ctx.impl_file is not None
self._ctx.impl_file.includes.append(HeaderFile.parse(header))
@@ -242,7 +239,7 @@ class SfgBasicComposer(SfgIComposer):
self._cursor.write_impl(kns_block)
return KernelsAdder(self._ctx, kns_block)
def include(self, header_file: str | HeaderFile, private: bool = False):
def include(self, header: str | HeaderFile, private: bool = False):
"""Include a header file.
Args:
@@ -262,7 +259,7 @@ class SfgBasicComposer(SfgIComposer):
#include <vector>
#include "custom.h"
"""
header_file = HeaderFile.parse(header_file)
header_file = HeaderFile.parse(header)
if private:
if self._ctx.impl_file is None:
@@ -273,21 +270,6 @@ class SfgBasicComposer(SfgIComposer):
else:
self._ctx.header_file.includes.append(header_file)
def numpy_struct(
self, name: str, dtype: np.dtype, add_constructor: bool = True
) -> SfgClass:
"""Add a numpy structured data type as a C++ struct
Returns:
The created class object
"""
cls = self._struct_from_numpy_dtype(
name, dtype, add_constructor=add_constructor
)
self._cursor.add_entity(cls)
self._cursor.write_header(SfgEntityDecl(cls))
return cls
def kernel_function(self, name: str, kernel: Kernel | SfgKernelHandle):
"""Create a function comprising just a single kernel call.
@@ -295,9 +277,11 @@ class SfgBasicComposer(SfgIComposer):
ast_or_kernel_handle: Either a pystencils AST, or a kernel handle for an already registered AST.
"""
if isinstance(kernel, Kernel):
kernel = self.kernels.add(kernel, name)
khandle = self.kernels.add(kernel, name)
else:
khandle = kernel
self.function(name)(self.call(kernel))
self.function(name)(self.call(khandle))
def function(
self,
@@ -536,41 +520,6 @@ class SfgBasicComposer(SfgIComposer):
]
return SfgDeferredVectorMapping(components, rhs)
def _struct_from_numpy_dtype(
self, struct_name: str, dtype: np.dtype, add_constructor: bool = True
):
cls = SfgClass(
struct_name,
self._cursor.current_namespace,
class_keyword=SfgClassKeyword.STRUCT,
)
fields = dtype.fields
if fields is None:
raise SfgException(f"Numpy dtype {dtype} is not a structured type.")
constr_params = []
constr_inits = []
for member_name, type_info in fields.items():
member_type = create_type(type_info[0])
member = SfgMemberVariable(member_name, member_type)
arg = SfgVar(f"{member_name}_", member_type)
cls.default.append_member(member)
constr_params.append(arg)
constr_inits.append(f"{member}({arg})")
if add_constructor:
cls.default.append_member(
SfgEntityDef(SfgConstructor(constr_params, constr_inits))
)
return cls
def make_statements(arg: ExprLike) -> SfgStatements:
return SfgStatements(str(arg), (), depends(arg), includes(arg))