Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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()