Skip to content
Snippets Groups Projects
context.py 1.56 KiB
Newer Older
from os import path

from .kernel_namespace import SfgKernelNamespace

class SourceFileGenerator:
    def __init__(self, namespace: str = "pystencils", basename: str = None):
        
        if basename is None:
            import __main__
            scriptpath = __main__.__file__
            scriptname = path.split(scriptpath)[1]
            basename = path.splitext(scriptname)[0]

        self.basename = basename
        self.header_filename = basename + ".h"
        self.cpp_filename = basename + ".cpp"

        self._context = SfgContext(namespace)

    def __enter__(self):
        return self._context

    def __exit__(self, *args):
        from .emitters.cpu.basic_cpu import BasicCpuEmitter
        BasicCpuEmitter(self._context, self.basename).write_files()


class SfgContext:
    def __init__(self, root_namespace: str):
        self._root_namespace = root_namespace
        self._default_kernel_namespace = SfgKernelNamespace(self, "kernels")

        self._kernel_namespaces = { self._default_kernel_namespace.name : self._default_kernel_namespace }

    @property
    def root_namespace(self):
        return self._root_namespace

    @property
    def kernels(self):
        return self._default_kernel_namespace

    def kernel_namespace(self, name):
        if name in self._kernel_namespaces:
            raise ValueError(f"Duplicate kernel namespace: {name}")

        kns = SfgKernelNamespace(self, name)
        self._kernel_namespaces[name] = kns
        return kns

    @property
    def kernel_namespaces(self):
        yield from self._kernel_namespaces.values()