Peano
Loading...
Searching...
No Matches
kernel_impl.py
Go to the documentation of this file.
1import warnings
2
4 def __init__(self,its=[[0]],iterators=["patch","i","j","k"],depth=0):
5 self.its = its
6 self.start = [i[0] for i in its]
7 self.end = [i[-1] for i in its]
8 self.iterators = iterators
9 self.size = []
10 for i in range(len(self.start)):
11 self.size.append(self.end[i]-self.start[i]+1)
12 self.depth = depth
13 self.max_depth = len(self.start)
14
15 self.i = self.iterators[depth]
16 self.s = self.size[depth]
17 self.S = self.start[depth]
18 self.E = self.end[depth] + 1
19
20 self.shifted = False
21 self.offset = ["" for _ in range(len(self.iterators))]
22
23 def lower(self):
24 if self.depth == self.max_depth-1:
25 self.depth = -1
26 self.depth += 1
27 self.i = self.iterators[self.depth]
28 self.s = self.size[self.depth]
29 self.S = self.start[self.depth]
30 self.E = self.end[self.depth] + 1
31 return self
32
33 def upper(self):
34 self.depth -= 1
35 self.i = self.iterators[self.depth]
36 self.s = self.size[self.depth]
37 self.S = self.start[self.depth]
38 self.E = self.end[self.depth] + 1
39 return self
40
41 def index(self):
42 string = "["
43 string += self.iterators[0]+self.offset[0]
44 for i in range(len(self.iterators)-1):
45 string += "," + self.iterators[i+1] + self.offset[i+1]
46 string += "]"
47 return string
48
49 def shift(self,enum):
50 self.shifted=True
51 # self.offset = ["" for _ in range(len(self.iterators))]
52 for i in range(len(self.iterators)):
53 temp = enum.start[i] - self.start[i]
54 if temp == 0:
55 self.offset[i] = ""
56 elif temp > 0:
57 self.offset[i] = f"+{temp}"
58 elif temp < 0:
59 self.offset[i] = f"-{temp}"
60 # return self.shifted, self.offset
61
62 def fetch(self,enum):
63 its,iterators,depth = enum[0],enum[1],enum[2]
64 self.its = its
65 self.start = [i[0] for i in its]
66 self.end = [i[-1] for i in its]
67 self.iterators = iterators
68 self.size = []
69 for i in range(len(self.start)):
70 self.size.append(self.end[i]-self.start[i]+1)
71 self.depth = depth
72 self.max_depth = len(self.start)
73
74 self.i = iterators[depth]
75 self.s = self.size[depth]
76 self.S = self.start[depth]
77 self.E = self.end[depth] + 1
78 return self
79
80 def RETURN(self):
81 return [self.its,self.iterators,self.depth]
82
83class impl:
84 def __init__(self,xhpp):
85 self.file = xhpp.file
86 self.debug = xhpp.debug
87 self.code = xhpp.code
88
89 self.INDENT = 0
90 self.SCOPE = 0
91
92 def namespace(self,location):
93 self.code += f"\nnamespace {location}" + "{" + "\n"
94 self.SCOPE += 1
95 self.INDENT += 1
96
97 def indent(self,val=0,force=False):
98 self.INDENT += val
99 if val == 0 or force:
100 self.code += (self.INDENT * "\t")
101
102 def alloc(self,name,enum):
103 size = enum.size
104 if self.debug: print("Hello from impl.alloc")
105 self.indent()
106 self.code += name
107 self.code += f" = new double[{size[0]}"
108 for _ in range(len(size)-1):
109 self.code += f",{size[_+1]}"
110 self.code += "];\n"
111
112 def loop(self,name,expression,enums,below):
113 if self.debug: print("Hello from impl.loop")
114 enum = enums[name]
115 enum = Enumerator().fetch(enum)
116 self.indent()
117 self.code += f"for (int {enum.i} = {0}; {enum.i} < {enum.E-enum.S}; {enum.i}++)" + " {\n"
118 if below > 0:
119 self.indent(1)
120 enum.lower()
121 enums[name] = enum.RETURN()
122 self.loop(name,expression,enums,below-1)
123 self.indent(-1)
124 else:
125 self.indent(1,True)
126 self.code += name + enum.index() + " = " + self.express(expression,enum,enums) + ";\n"
127 self.indent(-1)
128 self.indent()
129 self.code += "}\n"
130
131 def express(self,expression,enum,enums):
132 var_start = 0
133 string = ""
134 for i in range(len(expression)):
135 char = expression[i]
136 if char == "(":
137 string += char
138 var_start = i+1
139 elif char == "[" and expression[i+1] == "]":
140 temp_enum = expression[var_start:i]
141 if temp_enum in enums:
142 temp_enum = Enumerator().fetch(enums[temp_enum])
143 else:
144 temp_enum = enum
145 temp_enum.shift(enum)
146 string += temp_enum.index()
147 elif char == "]" and expression[i-1] == "[":
148 pass
149 else:
150 string += char
151 return string
152
153 def stencil(self,out_name,names,stencil,scales,var_list,enums,below,special=None,enum=None):
154 if self.debug: print("Hello from impl.stencil")
155 if enum==None:
156 enum = Enumerator().fetch(enums[out_name])
157 self.indent()
158 self.code += f"for (int {enum.i} = {enum.S}; {enum.i} < {enum.E}; {enum.i}++)" + " {\n"
159 if below > 0:
160 self.indent(1)
161 enum.lower()
162 enums[out_name] = enum.RETURN()
163 self.stencil(out_name,names,stencil,scales,var_list,enums,below-1)
164 self.indent(-1)
165 else:
166 self.indent(1)
167 lhs = out_name + enum.index()
168 temp = ""
169 inside = False
170 dim = 0
171 scale_i = 0
172 for char in stencil:
173 if char == "[":
174 inside = True
175 dim = 0
176 self.indent()
177 self.code += lhs
178 if type(scales) == list:
179 scale = scales[scale_i]
180 else: scale = scales
181 if scale >= 0:
182 self.code += " += "
183 else:
184 self.code += " -= "
185 self.code += f"{abs(scale)} * " + names[int(temp)] + "["
186 temp = ""
187 elif char == "]":
188 inside = False
189 self.code += temp
190 self.code += "]\n"
191 temp = ""
192 scale_i += 1
193 elif char == "-":
194 temp += char
195 elif char.isnumeric():
196 if inside:
197 if dim > 0:
198 self.code += ","
199 if char == "0":
200 self.code += enum.iterators[dim]
201 else:
202 if len(temp) == 0:
203 temp += "+"
204 self.code += enum.iterators[dim] + temp + char
205 dim += 1
206 temp = ""
207 else:
208 temp += char
209
210 self.indent(-1)
211 self.indent()
212 self.code += "}\n"
213
214 def __del__(self):
215 self.code += '\n'
216 # with open(self.file,'w') as FOUT:
217 # FOUT.write(self.code)
218
__init__(self, its=[[0]], iterators=["patch","i","j","k"], depth=0)
Definition kernel_impl.py:4
express(self, expression, enum, enums)
stencil(self, out_name, names, stencil, scales, var_list, enums, below, special=None, enum=None)
indent(self, val=0, force=False)
__init__(self, xhpp)
loop(self, name, expression, enums, below)
namespace(self, location)
alloc(self, name, enum)