1from abc
import ABC, abstractmethod
65 return ' ' * indent_level * Node.spaces_per_tab + f
"Argument: {self.id}"
71 def __init__(self, id, return_type: Type, template =
None, namespaces = [], stateless =
False):
78 FunctionDefinition._stateless = stateless
81 self.
_body.append(statement)
87 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
88 namespace_footer =
"}"
91 template_strings = [argument.print_cpp()
for argument
in self.
_template]
92 template_string =
"template <" +
",".join(template_strings) +
">\n"
94 current_indent = indent_level + 1
95 argument_prints = [argument.print_cpp()
for argument
in self.
_arguments]
97 return f
"""#include <fstream>\n{namespace_header}
98{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_cpp()} {self.id}({', '.join(argument_prints)});
103 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
104 namespace_footer =
"}"
107 template_strings = [argument.print_cpp()
for argument
in self.
_template]
108 template_string =
"template <" +
",".join(template_strings) +
">\n"
110 current_indent = indent_level + 1
111 statement_prints = [statement.print_cpp(current_indent + 1)
for statement
in self.
_body]
112 argument_prints = [argument.print_cpp()
for argument
in self.
_arguments]
114 return f
"""{namespace_header}
115{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_cpp()} {self.id}({', '.join(argument_prints)}) {{
117{os.linesep.join(statement_prints)}
118{' ' * current_indent * Node.spaces_per_tab}}}
123 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
124 namespace_footer =
"}"
127 template_strings = [argument.print_omp()
for argument
in self.
_template]
128 template_string =
"template <" +
",".join(template_strings) +
">\n"
130 current_indent = indent_level + 1
131 statement_prints = [statement.print_omp(current_indent + 1)
for statement
in self.
_body]
132 argument_prints = [argument.print_omp()
for argument
in self.
_arguments]
134 return f
"""{namespace_header}
135{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_omp()} {self.id}({', '.join(argument_prints)}) {{
136{os.linesep.join(statement_prints)}
137{' ' * current_indent * Node.spaces_per_tab}}}
142 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
143 namespace_footer =
"}"
146 template_strings = [argument.print_sycl()
for argument
in self.
_template]
147 template_string =
"template <" +
",".join(template_strings) +
">\n"
149 current_indent = indent_level + 1
150 statement_prints = [statement.print_sycl(current_indent + 1)
for statement
in self.
_body]
151 argument_prints = [argument.print_sycl()
for argument
in self.
_arguments]
154 return f
"""{namespace_header}
155{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_sycl()} {self.id}({', '.join(argument_prints)}) {{
156{os.linesep.join(statement_prints)}
157{' ' * current_indent * Node.spaces_per_tab}}}
162 statement_prints = [statement.print_mlir(indent_level + 1)
for statement
in self.
_body]
163 argument_prints = [argument.print_mlir()
for argument
in self.
_arguments]
165func.func @{self.id}({', '.join(argument_prints)}) -> ({self._return_type.print_mlir()}) {{
166{os.linesep.join(statement_prints)}
171 statement_prints = [statement.print_tree(indent_level + 1)
for statement
in self.
_body]
172 argument_prints = [argument.print_tree(indent_level + 1)
for argument
in self.
_arguments]
174FunctionDefinition: {self.id}:
175{os.linesep.join(argument_prints)}
176{os.linesep.join(statement_prints)}"""
179 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
180 namespace_footer =
"}"
182 function_call_string = self.
id
184 template_strings = [argument.print_cpp()
for argument
in self.
_template]
185 template_string =
"template <" +
",".join(template_strings) +
">\n"
186 function_call_string +=
"<" +
",".join([template.split(
' ')[1]
for template
in template_strings]) +
">"
189 arguments.append(
Argument(
"measurement",
TCustom(
"tarch::timing::Measurement&")))
191 current_indent = indent_level + 1
192 argument_prints = [argument.print_cpp()
for argument
in arguments]
194 return f
"""{namespace_header}
195{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_cpp()} {self.id}({', '.join(argument_prints)}) {{
196tarch::timing::Watch watch("{"::".join(self._namespaces)}", "{self.id}", false, true);
197{function_call_string}({",".join([argument.print_cpp().split(' ')[-1] for argument in self._arguments])});
199measurement.setValue(watch.getCalendarTime());
200{' ' * current_indent * Node.spaces_per_tab}}}
205 namespace_header = f
"""namespace {"::".join(self._namespaces)} {{"""
206 namespace_footer =
"}"
209 template_strings = [argument.print_cpp()
for argument
in self.
_template]
210 template_string =
"template <" +
",".join(template_strings) +
">\n"
213 arguments.append(
Argument(
"measurement",
TCustom(
"tarch::timing::Measurement&")))
215 current_indent = indent_level + 1
216 argument_prints = [argument.print_cpp()
for argument
in arguments]
218 return f
"""{namespace_header}
219{template_string}{' ' * current_indent * Node.spaces_per_tab}{self._return_type.print_cpp()} {self.id}({', '.join(argument_prints)});
229 return f
"""{self._output.print_cpp()} << {self._statement.print_cpp()};"""
232 return f
"""{self._output.print_omp()} << {self._statement.print_omp()};"""
235 return f
"""{self._output.print_sycl()} << {self._statement.print_sycl()};"""
251 if self.
type is None:
276 if type(rhs)
is Name:
277 return (Name.variables[self.
id] > Name.variables[rhs.id])
278 return (Name.variables[self.
id] > rhs)
281 if type(rhs)
is Name:
282 if rhs.id
in Name.variables
and self.
id in Name.variables:
283 return (self.
_value == Name.variables[rhs.id])
287 if self.
id in Name.variables:
288 return (Name.variables[self.
id] == rhs)
296 return ' ' * indent_level * Node.spaces_per_tab + self.
id
299 return ' ' * indent_level * Node.spaces_per_tab + self.
id
302 return ' ' * indent_level * Node.spaces_per_tab + self.
id
305 return ' ' * indent_level * Node.spaces_per_tab +
"%" + self.
id
308 return ' ' * indent_level * Node.spaces_per_tab +
"Name:" + self.
id
318 if type(rhs)
is Integer:
324 if type(rhs)
is Integer:
326 if type(rhs)
is UnaryOperation
and rhs._operation ==
"-":
329 if type(rhs)
is Integer:
346 if type(rhs)
is Name:
347 if rhs.id
in Name.variables:
348 return (self.
_value < Name.variables[rhs.id])
351 return (self.
_value < rhs)
354 if type(rhs)
is Name:
355 if rhs.id
in Name.variables:
356 return (self.
_value > Name.variables[rhs.id])
359 return (self.
_value > rhs)
362 if type(rhs)
is Integer:
363 return (self.
_value == rhs._value)
373 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
375 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
379 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
381 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
385 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
387 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
391 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
393 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
397 return ' ' * indent_level * Node.spaces_per_tab +
"Integer: " + str(self.
_value)
399 return ' ' * indent_level * Node.spaces_per_tab +
"Integer: " + str(self.
_string)
413 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
416 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
419 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
422 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
425 return ' ' * indent_level * Node.spaces_per_tab +
"Boolean: " + str(self.
_value)
438 return ' ' * indent_level * Node.spaces_per_tab + self.
_value
441 return ' ' * indent_level * Node.spaces_per_tab + self.
_value
444 return ' ' * indent_level * Node.spaces_per_tab + self.
_value
447 return ' ' * indent_level * Node.spaces_per_tab + self.
_value
450 return ' ' * indent_level * Node.spaces_per_tab +
"String: " + self.
_value
454 def __init__(self, value, string = None, reference = False):
468 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
470 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
474 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
476 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
480 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
482 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
486 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_value)
488 return ' ' * indent_level * Node.spaces_per_tab + str(self.
_string)
491 return ' ' * indent_level * Node.spaces_per_tab +
"Float: " + str(self.
_value)
495 def __init__(self, iteration_range, internal, requires_memory_allocation, id = None, underlying_type = String(
"double")):
511 for i
in range(len(offset)):
512 if type(offset[i])
is list:
513 if offset[i][0]
is None:
515 if offset[i][1]
is None:
519 output._iteration_range[i][1] = offset[i][1]
520 output._iteration_range[i][0] = offset[i][0]
522 raise Exception(
"Invalid index")
524 for i
in range(len(output._offset), len(output._iteration_range)):
525 output._offset.append(
Integer(0))
531 index_list = indices[0:-1]
532 for i
in range(0, len(dimensions) - 1):
534 if type(dimensions[-len(index_list)][1] - dimensions[-len(index_list)][0])
is Integer
and (dimensions[-len(index_list)][1] - dimensions[-len(index_list)][0])._value == 1:
535 index = self.
_offset[offset_start_index]
537 if type(self.
_offset[offset_start_index + 0].
get_type())
is TDataBlock:
540 index = index_list[0] + self.
_offset[offset_start_index + 0]
542 index = factors[-len(index_list)] * index
543 for i
in range(1, len(index_list)):
544 if type(self.
_offset[offset_start_index + i].
get_type())
is TDataBlock:
547 temp = index_list[i] + self.
_offset[offset_start_index + i]
548 index = index + factors[-len(index_list) + i] * temp
564 return ' ' * indent_level * Node.spaces_per_tab + self.
id
570 return ' ' * indent_level * Node.spaces_per_tab + self.
id
576 return ' ' * indent_level * Node.spaces_per_tab + self.
id
583 return ' ' * indent_level * Node.spaces_per_tab +
"%" + self.
id
587 return ' ' * indent_level * Node.spaces_per_tab + f
"""DataBlock:
588{self._internal.print_tree(indent_level + 1)}"""
590 return ' ' * indent_level * Node.spaces_per_tab +
"DataBlock: " + self.
id
602 for i
in range(len(self.
_dataBlock._memory_range) - 2, -1, -1):
605 for i
in range(len(self.
_dataBlock._memory_range) - 1, -1, -1):
606 index.append(loops[i].get_iteration_variable())
610 for i
in range(0, len(loops) - 1):
611 loops[i].add_statement(loops[i + 1])
614 for i
in range(0, len(self.
_dataBlock._memory_range) - 2):
617 for loop
in loops[::-1]:
622 return f
"""log.open("{self._filename.print_cpp()}");
623{self._loop.print_cpp()}
640 def __init__(self, value: Expression, index: Expression):
651 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_cpp()}[{self._index.print_cpp()}]"
654 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_omp()}[{self._index.print_omp()}]"
657 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_sycl()}[{self._index.print_sycl()}]"
660 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_mlir()}[{self._index.print_mlir()}]"
663 return f
"""Subscript:
664{self._value.print_tree(indent_level + 1)}
665{self._index.print_tree(indent_level + 1)}"""
685 return ' ' * indent_level * Node.spaces_per_tab +
"llvm.mlir.addressof" + self.
_expression.
print_mlir()
688 return ' ' * indent_level * Node.spaces_per_tab + f
"""Reference:
689{self._expression.print_tree(indent_level + 1)}"""
693 def __init__(self, value: Expression, index: Expression):
701 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_cpp()}({self._index.print_cpp()})"
704 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_omp()}({self._index.print_omp()})"
707 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_sycl()}({self._index.print_sycl()})"
710 return ' ' * indent_level * Node.spaces_per_tab + f
"{self._value.print_mlir()}({self._index.print_mlir()})"
716{self._value.print_tree(indent_level + 1)}
717{self._index.print_tree(indent_level + 1)}"""
730 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_cpp()} {self._operation} {self._rhs.print_cpp()})"
733 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_omp()} {self._operation} {self._rhs.print_omp()})"
736 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_sycl()} {self._operation} {self._rhs.print_sycl()})"
741 mlir_operation =
"arith.mulf"
743 mlir_operation =
"arith.divf"
745 mlir_operation =
"arith.addf"
747 mlir_operation =
"arith.subf"
750 mlir_operation =
"arith.muli"
752 mlir_operation =
"arith.divi"
754 mlir_operation =
"arith.addi"
756 mlir_operation =
"arith.subi"
758 return ' ' * indent_level * Node.spaces_per_tab + f
"""{mlir_operation} {self._lhs.print_mlir()}, {self._rhs.print_mlir()} : {self._lhs.get_type().print_mlir()}"""
762Comparison {self._operation}:
763{self._lhs.print_tree(indent_level + 1)}
764{self._rhs.print_tree(indent_level + 1)}"""
772 if type(self.
_lhs)
is BinaryOperation:
773 if self.
_lhs._operation ==
"+":
778 elif self.
_lhs._operation ==
"-":
781 elif self.
_lhs._operation ==
"*":
787 if type(self.
_rhs)
is BinaryOperation:
788 if self.
_rhs._operation ==
"+":
793 elif self.
_rhs._operation ==
"-":
796 elif self.
_rhs._operation ==
"*":
802 if self.
_operation ==
"-" and type(self.
_rhs)
is UnaryOperation
and self.
_rhs._operation ==
"-":
805 if self.
_operation ==
"+" and type(self.
_rhs)
is UnaryOperation
and self.
_rhs._operation ==
"-":
832 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_cpp()} {self._operation} {self._rhs.print_cpp()})"
835 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_omp()} {self._operation} {self._rhs.print_omp()})"
838 return ' ' * indent_level * Node.spaces_per_tab + f
"({self._lhs.print_sycl()} {self._operation} {self._rhs.print_sycl()})"
843 mlir_operation =
"arith.mulf"
845 mlir_operation =
"arith.divf"
847 mlir_operation =
"arith.addf"
849 mlir_operation =
"arith.subf"
852 mlir_operation =
"arith.muli"
854 mlir_operation =
"arith.divi"
856 mlir_operation =
"arith.addi"
858 mlir_operation =
"arith.subi"
860 return ' ' * indent_level * Node.spaces_per_tab + f
"""{mlir_operation} {self._lhs.print_mlir()}, {self._rhs.print_mlir()} : {self._lhs.get_type().print_mlir()}"""
864BinaryOperation {self._operation}:
865{self._lhs.print_tree(indent_level + 1)}
866{self._rhs.print_tree(indent_level + 1)}"""
893 return f
"({self._operation} {self._operand.print_cpp()})"
896 return f
"({self._operation} {self._operand.print_omp()})"
899 return f
"({self._operation} {self._operand.print_sycl()})"
906 return ' ' * indent_level * Node.spaces_per_tab + f
"""arith.negf {self._operand.print_mlir()} : {self._operand.get_type().print_mlir()}"""
911 return ' ' * indent_level * Node.spaces_per_tab + f
"""arith.negf {self._operand.print_mlir()} : {self._operand.get_type().print_mlir()}"""
915UnaryOperation {self._operation}:
916{self._operand.print_tree(indent_level + 1)}"""
920 if type(dataBlock)
is Name:
954class DataBlockComparison(Expression):
956 if type(lhs)
is Name
and type(lhs.get_type())
is TDataBlock:
957 self.
_lhs = Name.variables[lhs.id]
961 if type(rhs)
is Name
and type(rhs.get_type())
is TDataBlock:
962 self.
_rhs = Name.variables[rhs.id]
977 if type(self.
_rhs._memory_range[0])
is not BinaryOperation
and type(self.
_memory_range[0])
is not BinaryOperation
and self.
_rhs._memory_range[0][1] > self.
_memory_range[0][1]:
1014 def __init__(self, operation, lhs, rhs, useFunctionSyntax=False):
1015 if type(lhs)
is Name
and type(lhs.get_type())
is TDataBlock:
1020 if type(rhs)
is Name
and type(rhs.get_type())
is TDataBlock:
1034 elif type(self.
_rhs._iteration_range[0][1])
is not BinaryOperation
and type(self.
_iteration_range[0][1])
is not BinaryOperation
and self.
_rhs._iteration_range[0][1] > self.
_iteration_range[0][1]:
1066 lhs_is_double =
False
1067 rhs_is_double =
False
1069 lhs_is_double = (str(self.
_lhs.
get_type().get_single()) ==
"double")
1071 lhs_is_double = (str(self.
_lhs.
get_type()) ==
"double")
1074 rhs_is_double = (str(self.
_rhs.
get_type().get_single()) ==
"double")
1076 rhs_is_double = (str(self.
_rhs.
get_type()) ==
"double")
1078 if (lhs_is_double
or rhs_is_double):
1107 if type(dataBlock)
is Name
and type(dataBlock.get_type())
is TDataBlock:
1146 if type(dataBlock)
is Name:
1154 loops = [self.
_loop]
1156 for i
in range(len(self.
_dataBlock._iteration_range) - 2, -1, -1):
1158 loops[-2].add_statement(loops[-1])
1160 for loop
in loops[::-1]:
1161 index.append(loop.get_iteration_variable())
1179 return f
"""DataBlockUnaryMax:
1180{self._dataBlock.print_tree(indent_level + 1)}"""
1214 return ' ' * indent_level * Node.spaces_per_tab + self.
_type
1217 return ' ' * indent_level * Node.spaces_per_tab + self.
_type
1220 return ' ' * indent_level * Node.spaces_per_tab + self.
_type
1223 return ' ' * indent_level * Node.spaces_per_tab + self.
_type
1226 return ' ' * indent_level * Node.spaces_per_tab +
"TCustom: " + self.
_type
1231 return ' ' * indent_level * Node.spaces_per_tab +
"int"
1234 return ' ' * indent_level * Node.spaces_per_tab +
"int"
1237 return ' ' * indent_level * Node.spaces_per_tab +
"int"
1240 return ' ' * indent_level * Node.spaces_per_tab +
"i32"
1243 return ' ' * indent_level * Node.spaces_per_tab +
"TInteger"
1247 return ' ' * indent_level * Node.spaces_per_tab +
"bool"
1250 return ' ' * indent_level * Node.spaces_per_tab +
"bool"
1253 return ' ' * indent_level * Node.spaces_per_tab +
"bool"
1256 return ' ' * indent_level * Node.spaces_per_tab +
"i1"
1259 return ' ' * indent_level * Node.spaces_per_tab +
"TBoolean"
1265 return ' ' * indent_level * Node.spaces_per_tab +
"double" + (
"&" if self.
_reference else "")
1268 return ' ' * indent_level * Node.spaces_per_tab +
"double" + (
"&" if self.
_reference else "")
1271 return ' ' * indent_level * Node.spaces_per_tab +
"double" + (
"&" if self.
_reference else "")
1274 return ' ' * indent_level * Node.spaces_per_tab +
"f64"
1277 return ' ' * indent_level * Node.spaces_per_tab +
"TFloat"
1282 return ' ' * indent_level * Node.spaces_per_tab +
"const char*"
1285 return ' ' * indent_level * Node.spaces_per_tab +
"const char*"
1288 return ' ' * indent_level * Node.spaces_per_tab +
"const char*"
1294 return ' ' * indent_level * Node.spaces_per_tab +
"TString"
1315 return ' ' * indent_level * Node.spaces_per_tab + f
"""memref<?>"""
1318 return ' ' * indent_level * Node.spaces_per_tab +
"TDataBlock"
1331 statement_prints = [statement.print_cpp(indent_level + 1)
for statement
in self.
_statements]
1332 return ' ' * indent_level * Node.spaces_per_tab + f
"""if constexpr ({self._boolean.print_cpp()}) {{
1333{os.linesep.join(statement_prints)}
1334""" +
' ' * indent_level * Node.spaces_per_tab +
"}"
1337 statement_prints = [statement.print_cpp(indent_level + 1)
for statement
in self.
_statements]
1338 return ' ' * indent_level * Node.spaces_per_tab + f
"""if constexpr ({self._boolean.print_cpp()}) {{
1339{os.linesep.join(statement_prints)}
1340""" +
' ' * indent_level * Node.spaces_per_tab +
"}"
1343 statement_prints = [statement.print_cpp(indent_level + 1)
for statement
in self.
_statements]
1344 return ' ' * indent_level * Node.spaces_per_tab + f
"""if constexpr ({self._boolean.print_cpp()}) {{
1345{os.linesep.join(statement_prints)}
1346""" +
' ' * indent_level * Node.spaces_per_tab +
"}"
1352 statement_prints = [statement.print_tree(indent_level + 1)
for statement
in self._statements]
1353 return ' ' * indent_level * Node.spaces_per_tab + f
"""If:
1354{os.linesep.join(statement_prints)}"""
1357 _inuse_iteration_variables = set()
1358 _iteration_variable_names = [
'i',
'j',
'k',
'l',
'n',
'm',
'a',
'b',
'c',
'd']
1360 def __init__(self, iteration_range, iteration_variable_name = None, use_scheduler = False):
1365 if iteration_variable_name ==
None:
1366 for variable_name
in For._iteration_variable_names:
1367 if variable_name
not in For._inuse_iteration_variables:
1369 For._inuse_iteration_variables.add(variable_name)
1373 For._inuse_iteration_variables.update({iteration_variable_name : self.
_iteration_variable})
1388 statement_prints = [statement.print_cpp(indent_level + 1)
for statement
in self.
_statements]
1390 return ' ' * indent_level * Node.spaces_per_tab + f
"""parallelForWithSchedulerInstructions({self._iteration_variable.print_cpp()}, {self._iteration_range[1].print_cpp()}, loopParallelism) {{
1391{os.linesep.join(statement_prints)}
1392{' ' * indent_level * Node.spaces_per_tab}}}
1395 return ' ' * indent_level * Node.spaces_per_tab + f"""for (int {self._iteration_variable.print_cpp()} = {self._iteration_range[0].print_cpp()}; {self._iteration_variable.print_cpp()} < {self._iteration_range[1].print_cpp()}; {self._iteration_variable.print_cpp()}++) {{
1396{os.linesep.join(statement_prints)}
1397""" + ' ' * indent_level * Node.spaces_per_tab + "}"
1400 def print_omp(self, indent_level = 0):
1401 statement_prints = [statement.print_omp(indent_level + 1) for statement in self._statements]
1402 return ' ' * indent_level * Node.spaces_per_tab + f"""for (int {self._iteration_variable.print_omp()} = {self._iteration_range[0].print_omp()}; {self._iteration_variable.print_omp()} < {self._iteration_range[1].print_omp()}; {self._iteration_variable.print_omp()}++) {{
1403{os.linesep.join(statement_prints)}
1404""" + ' ' * indent_level * Node.spaces_per_tab + "}"
1406 def print_sycl(self, indent_level = 0):
1407 statement_prints = [statement.print_sycl(indent_level + 1) for statement in self._statements]
1408 return ' ' * indent_level * Node.spaces_per_tab + f"""for (int {self._iteration_variable.print_sycl()} = {self._iteration_range[0].print_sycl()}; {self._iteration_variable.print_sycl()} < {self._iteration_range[1].print_sycl()}; {self._iteration_variable.print_sycl()}++) {{
1409{os.linesep.join(statement_prints)}
1410""" + ' ' * indent_level * Node.spaces_per_tab + "}"
1412 def print_mlir(self, indent_level = 0):
1413 statement_prints = [statement.print_mlir(indent_level + 1) for statement in self._statements]
1414 return ' ' * indent_level * Node.spaces_per_tab + f"""affine.for {self._iteration_variable.print_mlir()} = {self._iteration_range[0].print_mlir()} to {self._iteration_range[1].print_mlir()} {{
1415{os.linesep.join(statement_prints)}
1416""" + ' ' * indent_level * Node.spaces_per_tab + "}"
1418 def print_tree(self, indent_level = 0):
1419 statement_prints = [statement.print_tree(indent_level + 1) for statement in self._statements]
1420 return ' ' * indent_level * Node.spaces_per_tab + f"""For:
1421{os.linesep.join(statement_prints)}"""
1425class Comment(Statement):
1426 def __init__(self, comment):
1427 self._comment = comment
1432 def print_cpp(self, indent_level = 0):
1433 return ' ' * indent_level * Node.spaces_per_tab + "//" + self._comment[1:]
1435 def print_omp(self, indent_level = 0):
1436 return ' ' * indent_level * Node.spaces_per_tab + "//" + self._comment[1:]
1438 def print_sycl(self, indent_level = 0):
1439 return ' ' * indent_level * Node.spaces_per_tab + "//" + self._comment[1:]
1441 def print_mlir(self, indent_level = 0):
1442 return ' ' * indent_level * Node.spaces_per_tab + "//" + self._comment[1:]
1444 def print_tree(self, indent_level=0):
1445 return ' ' * indent_level * Node.spaces_per_tab + "Comment"
1448class FunctionCall(Statement):
1449 def __init__(self, id, arguments, is_offloadable = False):
1451 self._arguments = arguments
1452 self._is_offloadable = is_offloadable
1454 def add_argument(self, argument: Expression):
1455 self._arguments.append(argument)
1457 def print_cpp(self, indent_level=0):
1458 argument_prints = [argument.print_cpp() for argument in self._arguments]
1459 return ' ' * indent_level * Node.spaces_per_tab + f"""{self.id}({", ".join(argument_prints)});"""
1461 def print_omp(self, indent_level=0):
1462 argument_prints = [argument.print_omp() for argument in self._arguments]
1463 return ' ' * indent_level * Node.spaces_per_tab + f"""{self.id}({", ".join(argument_prints)});"""
1465 def print_sycl(self, indent_level=0):
1466 argument_prints = [argument.print_sycl() for argument in self._arguments]
1467 return ' ' * indent_level * Node.spaces_per_tab + f"""{self.id}({", ".join(argument_prints)});"""
1469 def print_mlir(self, indent_level=0):
1470 argument_prints = [argument.print_cpp() for argument in self._arguments]
1471 return ' ' * indent_level * Node.spaces_per_tab + f"""func.call @{self.id}({", ".join(argument_prints)});"""
1473 def print_tree(self, indent_level=0):
1474 argument_prints = [argument.print_tree() for argument in self._arguments]
1475 return ' ' * indent_level * Node.spaces_per_tab + f"""FunctionCall:
1476{' ' * (indent_level + 1) * Node.spaces_per_tab + ",".join(argument_prints)}"""
1479class Max(Statement):
1480 def __init__(self, lhs, rhs):
1484 def print_cpp(self, indent_level=0):
1485 return ' ' * indent_level * Node.spaces_per_tab + f"""std::max({self._lhs.print_cpp()}, {self._rhs.print_cpp()});"""
1487 def print_omp(self, indent_level=0):
1488 return ' ' * indent_level * Node.spaces_per_tab + f"""std::max({self._lhs.print_omp()}, {self._rhs.print_omp()});"""
1490 def print_sycl(self, indent_level=0):
1491 return ' ' * indent_level * Node.spaces_per_tab + f"""std::max({self._lhs.print_sycl()}, {self._rhs.print_sycl()});"""
1493 def print_mlir(self, indent_level=0):
1494 return ' ' * indent_level * Node.spaces_per_tab + f"""affine.max({self._lhs.print_mlir()}, {self._rhs.print_mlir()});"""
1496 def print_tree(self, indent_level=0):
1497 return ' ' * indent_level * Node.spaces_per_tab + f"""Max:
1498{self._lhs.print_tree(indent_level + 1)}
1499{self._rhs.print_tree(indent_level + 1)}"""
1501class MemoryAllocation(Statement):
1502 memoryAllocated = []
1504 def __init__(self, name: Name, object_type: Type, dimensions, specify_type = True, add_to_stack=True):
1505 self._type = object_type
1506 if type(dimensions[0]) is list:
1507 self._dimensions = [dimension[1] for dimension in dimensions]
1509 self._dimensions = dimensions
1511 self._specify_type = specify_type
1513 if add_to_stack == True:
1514 MemoryAllocation.memoryAllocated[-1].append(self)
1516 if len(self._dimensions) > 1:
1517 size = self._dimensions[-2]
1518 for i in range(len(self._dimensions) - 3, -1, -1):
1519 size = size * self._dimensions[i]
1521 self._loop = For([Integer(0), self._dimensions[-1]])
1522 self._loop.add_statement(MemoryAllocation(Subscript(self._name, self._loop.get_iteration_variable()), self._type, [size], False, False))
1523 self._loop.close_scope()
1525 def print_cpp(self, indent_level=0):
1526 if len(self._dimensions) == 1:
1527 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_cpp() + "* " if self._specify_type else ""}{self._name.print_cpp()} = new {self._type.print_cpp()}[{self._dimensions[0].print_cpp()}];"""
1529 size = self._dimensions[-2]
1530 for i in range(len(self._dimensions) - 3, -1, -1):
1531 size = size * self._dimensions[i]
1533 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_cpp()}** {self._name.print_cpp()} = new {self._type.print_cpp()}*[{self._dimensions[-1].print_cpp()}];
1534{self._loop.print_cpp(indent_level)}"""
1536 def print_omp(self, indent_level=0):
1537 if len(self._dimensions) == 1:
1538 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_omp() + "* " if self._specify_type else ""}{self._name.print_omp()} = new {self._type.print_omp()}[{self._dimensions[0].print_omp()}];"""
1540 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_omp()}** {self._name.print_omp()} = new {self._type.print_omp()}*[{self._dimensions[-1].print_omp()}];
1541{self._loop.print_omp(indent_level)}"""
1543 def print_sycl(self, indent_level=0):
1544 if len(self._dimensions) == 1:
1545 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_sycl() + "* " if self._specify_type else ""}{self._name.print_sycl()} = new {self._type.print_sycl()}[{self._dimensions[0].print_sycl()}];"""
1547 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._type.print_sycl()}** {self._name.print_sycl()} = new {self._type.print_sycl()}*[{self._dimensions[-1].print_sycl()}];
1548{self._loop.print_sycl(indent_level)}"""
1550 def print_mlir(self, indent_level=0):
1551 return ' ' * indent_level * Node.spaces_per_tab + f"""{self._name.print_mlir()} = memref.alloc() : {self._name.get_type().print_mlir()}"""
1553 def print_tree(self, indent_level=0):
1554 return ' ' * indent_level * Node.spaces_per_tab + f"""MemoryAllocation:
1555{self._name.print_tree(indent_level + 1)}"""
1558class MemoryDeallocation(Statement):
1559 def __init__(self, allocation: MemoryAllocation):
1560 self._dimensions = allocation._dimensions
1561 self._name = allocation._name
1563 if len(self._dimensions) > 1:
1564 size = self._dimensions[-2]
1565 for i in range(len(self._dimensions) - 3, -1, -1):
1566 size = size * self._dimensions[i]
1568 self._loop = For([Integer(0), self._dimensions[-1]])
1569 self._loop.add_statement(MemoryDeallocation(MemoryAllocation(Subscript(self._name, self._loop.get_iteration_variable()), None, [size], False, False)))
1570 self._loop.close_scope()
1572 def print_cpp(self, indent_level=0):
1573 if len(self._dimensions) == 1:
1574 return ' ' * indent_level * Node.spaces_per_tab + f"""delete[] {self._name.print_cpp()};"""
1576 return f"""{self._loop.print_cpp(indent_level)}
1577{' ' * indent_level * Node.spaces_per_tab}delete[] {self._name.print_cpp()};"""
1579 def print_omp(self, indent_level=0):
1580 if len(self._dimensions) == 1:
1581 return ' ' * indent_level * Node.spaces_per_tab + f"""delete[] {self._name.print_omp()};"""
1583 return f"""{self._loop.print_omp(indent_level)}
1584{' ' * indent_level * Node.spaces_per_tab}delete[] {self._name.print_omp()};"""
1586 def print_sycl(self, indent_level=0):
1587 if len(self._dimensions) == 1:
1588 return ' ' * indent_level * Node.spaces_per_tab + f"""delete[] {self._name.print_sycl()};"""
1590 return f"""{self._loop.print_sycl(indent_level)}
1591{' ' * indent_level * Node.spaces_per_tab}delete[] {self._name.print_sycl()};"""
1593 def print_mlir(self, indent_level=0):
1594 return ' ' * indent_level * Node.spaces_per_tab + f"""memref.dealloc {self._name.print_mlir()} : {self._name.get_type().print_mlir()}"""
1596 def print_tree(self, indent_level=0):
1597 return ' ' * indent_level * Node.spaces_per_tab + f"""MemoryDeallocation:
1598{self._name.print_tree(indent_level + 1)}"""
1601class Construction(Statement):
1602 def __init__(self, name: Name, expression: Expression):
1604 self._expression = expression
1605 Name.variables.update({self._name.id: expression})
1607 def print_cpp(self, indent_level = 0):
1608 return ' ' * indent_level * Node.spaces_per_tab + f"{self._name.get_type().print_cpp()} {self._name.print_cpp()} = {self._expression.print_cpp()};"
1610 def print_omp(self, indent_level = 0):
1611 return ' ' * indent_level * Node.spaces_per_tab + f"{self._name.get_type().print_omp()} {self._name.print_omp()} = {self._expression.print_omp()};"
1613 def print_sycl(self, indent_level = 0):
1614 return ' ' * indent_level * Node.spaces_per_tab + f"{self._name.get_type().print_sycl()} {self._name.print_sycl()} = {self._expression.print_sycl()};"
1616 def print_mlir(self, indent_level = 0):
1617 return ' ' * indent_level * Node.spaces_per_tab + f"{self._name.print_mlir()} = {self._expression.print_mlir()} : {self._name.get_type().print_mlir()}"
1619 def print_tree(self, indent_level=0):
1622{self._name.print_tree(indent_level + 1)}
1623{self._expression.print_tree(indent_level + 1)}"""
1626class DataBlockConstructionFromExisting(Statement):
1627 def __init__(self, name: Name, dataBlock: DataBlock):
1629 self._dataBlock = dataBlock
1630 self._dataBlock.id = name.id
1631 Name.variables.update({self._name.id: self._dataBlock})
1633 def print_cpp(self, indent_level = 0):
1634 type_print = self._name.get_type().print_cpp()
1635 if len(self._dataBlock._iteration_range) > 1:
1637 return ' ' * indent_level * Node.spaces_per_tab + f"{type_print} {self._name.print_cpp()} = {self._dataBlock._internal.print_cpp()};"
1639 def print_omp(self, indent_level = 0):
1640 type_print = self._name.get_type().print_omp()
1641 if len(self._dataBlock._iteration_range) > 1:
1643 return ' ' * indent_level * Node.spaces_per_tab + f"{type_print} {self._name.print_omp()} = {self._dataBlock._internal.print_omp()};"
1645 def print_sycl(self, indent_level = 0):
1646 type_print = self._name.get_type().print_sycl()
1647 if len(self._dataBlock._iteration_range) > 1:
1649 return ' ' * indent_level * Node.spaces_per_tab + f"{type_print} {self._name.print_sycl()} = {self._dataBlock._internal.print_sycl()};"
1651 def print_mlir(self, indent_level = 0):
1652 type_print = self._name.get_type().print_cpp()
1653 if len(self._dataBlock._iteration_range) > 1:
1654 type_print = "!llvm.ptr"
1655 return ' ' * indent_level * Node.spaces_per_tab + f"{self._name.print_cpp()} = {self._dataBlock._internal.print_mlir()} : {type_print}"
1657 def print_tree(self, indent_level=0):
1659DataBlockConstructionFromExisting:
1660{self._name.print_tree(indent_level + 1)}
1661{self._dataBlock._internal.print_tree(indent_level + 1)}"""
1664class DataBlockConstructionFromOperation:
1665 def __init__(self, name: Name, dataBlockOperation):
1667 self._dataBlock = DataBlock(dataBlockOperation._iteration_range, None, False, self._name.id, underlying_type=dataBlockOperation.get_type().get_single())
1668 Name.variables.update({self._name.id: self._dataBlock})
1669 if type(dataBlockOperation) is DataBlockBinaryOperation or type(dataBlockOperation) is DataBlockUnaryOperation or type(dataBlockOperation) is DataBlockMax or type(dataBlockOperation) is DataBlockComparison or type(dataBlockOperation._internal) is String:
1670 self._operation = dataBlockOperation
1672 self._operation = dataBlockOperation._internal
1674 self.memoryAllocation = MemoryAllocation(self._name, self._dataBlock.get_type().get_single(), self._dataBlock._memory_range)
1675 self.assignment = DataBlockAssignment(self._name, self._operation)
1677 def print_cpp(self, indent_level = 0):
1678 return f"""{self.memoryAllocation.print_cpp(indent_level)}
1679{self.assignment.print_cpp(indent_level)}"""
1681 def print_omp(self, indent_level = 0):
1682 return f"""{self.memoryAllocation.print_omp(indent_level)}
1683{self.assignment.print_omp(indent_level)}"""
1685 def print_sycl(self, indent_level = 0):
1686 return f"""{self.memoryAllocation.print_sycl(indent_level)}
1687{self.assignment.print_sycl(indent_level)}"""
1689 def print_mlir(self, indent_level = 0):
1690 return f"""{self.memoryAllocation.print_mlir(indent_level)}
1691{self.assignment.print_mlir(indent_level)}"""
1693 def print_tree(self, indent_level = 0):
1694 return ' ' * indent_level * Node.spaces_per_tab + f"""DataBlockConstructionFromOperation:
1695{self._name.print_tree(indent_level + 1)}
1696{self._dataBlock.print_tree(indent_level + 1)}"""
1699class DataBlockConstructionFromFunction(Statement):
1700 def __init__(self, name: Name, dataBlock: DataBlock):
1702 self._dataBlock = dataBlock
1703 self._dataBlock.id = name.id
1704 Name.variables.update({self._name.id: self._dataBlock})
1706 self.memoryAllocation = MemoryAllocation(self._name, self._dataBlock.get_type().get_single(), self._dataBlock._memory_range)
1707 self.initialisation = For(self._dataBlock._memory_range[-1])
1711 for i in range(len(self._dataBlock._iteration_range) - 2, 0, -1):
1712 inner_loop = For([Integer(0), self._dataBlock._memory_range[i][1] - self._dataBlock._memory_range[i][0]])
1713 inner_loops.append(inner_loop)
1714 if type(self._dataBlock._internal) is not FunctionCall:
1715 inner_loop = For(self._dataBlock._memory_range[0])
1716 inner_loops.append(inner_loop)
1719 for i in range(len(inner_loops)):
1720 index.append(inner_loops[-(i + 1)].get_iteration_variable())
1721 index.append(self.initialisation.get_iteration_variable())
1723 output_offset = [Integer(0) for i in self._dataBlock._iteration_range[1:]]
1724 input_offset = [self._dataBlock._iteration_range[i][0] - Name.variables[self._dataBlock._internal._arguments[0].id]._iteration_range[i][0] for i in range(1, len(self._dataBlock._iteration_range))]
1726 if type(self._dataBlock._internal) is FunctionCall:
1727 functionCall = FunctionCall(self._dataBlock._internal.id, [])
1728 functionCall._is_offloadable = self._dataBlock._internal._is_offloadable
1730 functionCall.add_argument(Reference(self._dataBlock._internal._arguments[0].multidimensional_index(index, 1)))
1732 for argument in self._dataBlock._internal._arguments[1:]:
1733 if type(argument.get_type()) is TDataBlock:
1734 offset = [i[0] for i in Name.variables[argument.id]._iteration_range[1:]]
1735 if len(Name.variables[argument.id]._iteration_range) == 1:
1736 functionCall.add_argument(Name.variables[argument.id].multidimensional_index(index, 1))
1738 functionCall.add_argument(Reference(Name.variables[argument.id].multidimensional_index(index, 1)))
1740 functionCall.add_argument(argument)
1742 functionCall.add_argument(Reference(self._dataBlock.multidimensional_index(index, 1)))
1743 if functionCall._is_offloadable:
1744 functionCall.add_argument(String("Solver::Offloadable::Yes"))
1746 functionCall = Assignment(self._dataBlock.multidimensional_index(index), self._dataBlock._internal)
1748 self.initialisation.add_statement(inner_loops[0])
1750 for i in range (0, len(inner_loops) - 1):
1751 inner_loops[i].add_statement(inner_loops[i + 1])
1752 inner_loops[-1].add_statement(functionCall)
1754 for i in range(len(inner_loops) - 1, -1, -1):
1755 inner_loops[i].close_scope()
1756 self.initialisation.close_scope()
1758 def print_cpp(self, indent_level = 0):
1759 return f"""{self.memoryAllocation.print_cpp(indent_level)}
1760{self.initialisation.print_cpp(indent_level)}"""
1762 def print_omp(self, indent_level = 0):
1763 return f"""{self.memoryAllocation.print_omp(indent_level)}
1764{' ' * indent_level * Node.spaces_per_tab}#pragma omp parallel for simd collapse(Dimensions + 1) schedule(static, 1)
1765{self.initialisation.print_omp(indent_level)}"""
1767 def print_sycl(self, indent_level = 0):
1768 return f"""{self.memoryAllocation.print_sycl(indent_level)}
1769{self.initialisation.print_sycl(indent_level)}"""
1771 def print_mlir(self, indent_level = 0):
1772 return f"""{self.memoryAllocation.print_mlir(indent_level)}
1773{self.initialisation.print_mlir(indent_level)}"""
1775 def print_tree(self, indent_level = 0):
1776 return ' ' * indent_level * Node.spaces_per_tab + f"""DataBlockConstructionFromFunction:
1777{self._name.print_tree(indent_level + 1)}
1778{self._dataBlock.print_tree(indent_level + 1)}"""
1780class Assignment(Statement):
1781 def __init__(self, lhs: Expression, rhs: Expression):
1785 def print_cpp(self, indent_level = 0):
1786 return ' ' * indent_level * Node.spaces_per_tab + f"{self._lhs.print_cpp()} = {self._rhs.print_cpp()};"
1788 def print_omp(self, indent_level = 0):
1789 return ' ' * indent_level * Node.spaces_per_tab + f"{self._lhs.print_omp()} = {self._rhs.print_omp()};"
1791 def print_sycl(self, indent_level = 0):
1792 return ' ' * indent_level * Node.spaces_per_tab + f"{self._lhs.print_sycl()} = {self._rhs.print_sycl()};"
1794 def print_mlir(self, indent_level = 0):
1795 return ' ' * indent_level * Node.spaces_per_tab + f"{self._lhs.print_mlir()} = {self._rhs.print_mlir()} : {self._lhs.get_type().print_mlir()}"
1797 def print_tree(self, indent_level = 0):
1798 return ' ' * indent_level * Node.spaces_per_tab + f"""Assignment:
1799{self._lhs.print_tree(indent_level + 1)}
1800{self._rhs.print_tree(indent_level + 1)}"""
1803class DataBlockAssignment(Statement):
1804 def __init__(self, lhs: Expression, rhs: Expression):
1805 if type(lhs) is Name:
1806 self._lhs = Name.variables[lhs.id]
1807 self._lhs._id = lhs.id
1811 if type(rhs) is Name:
1812 self._rhs = Name.variables[rhs.id]
1819 loops.append(For([Integer(0), self._lhs._iteration_range[-1][1] - self._lhs._iteration_range[-1][0]]))
1820 for i in range(len(self._lhs._memory_range) - 2, -1, -1):
1821 loops.append(For([Integer(0), self._lhs._iteration_range[i][1] - self._lhs._iteration_range[i][0]]))
1823 for i in range(len(self._lhs._memory_range) - 1, -1, -1):
1824 index.append(loops[i].get_iteration_variable())
1826 if type(self._rhs.get_type()) is TDataBlock:
1828 for i in range(len(self._lhs._iteration_range)):
1829 lhs_start = self._lhs._iteration_range[i][0]
1830 rhs_start = self._rhs._iteration_range[i][0]
1831 if type(rhs_start.get_type()) is TDataBlock:
1832 rhs_start = Subscript(rhs_start, lhs_start)
1833 rhs_offset.append(lhs_start - rhs_start)
1835 rhs_offset = [Integer(0) for i in self._lhs._iteration_range]
1837 lhs_offset = [Integer(0) for i in self._lhs._iteration_range]
1839 loops[-1].add_statement(Assignment(self._lhs.multidimensional_index(index), self._rhs.multidimensional_index(index)))
1840 for i in range(0, len(loops) - 1):
1841 loops[i].add_statement(loops[i + 1])
1843 for loop in loops[::-1]:
1845 self._loop = loops[0]
1846 self._numDimensions = len(loops)
1848 def print_cpp(self, indent_level = 0):
1849 return self._loop.print_cpp(indent_level)
1851 def print_omp(self, indent_level = 0):
1852 return ' ' * indent_level * Node.spaces_per_tab + f"""#pragma omp parallel for simd collapse(Dimensions + 1) schedule(static, 1)
1853{self._loop.print_omp(indent_level)}"""
1855 def print_sycl(self, indent_level = 0):
1856 return self._loop.print_sycl(indent_level)
1858 def print_mlir(self, indent_level = 0):
1859 return self._loop.print_mlir(indent_level)
1861 def print_tree(self, indent_level = 0):
1862 return ' ' * indent_level * Node.spaces_per_tab + f"""DataBlockAssignment:
1863{self._lhs.print_tree(indent_level + 1)}
1864{self._rhs.print_tree(indent_level + 1)}"""
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
__init__(self, id, Type type)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
multidimensional_index(self, index, start_index=0)
print_tree(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
print_cpp(self, indent_level=0)
__init__(self, operation, lhs, rhs)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
print_mlir(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_tree(self, indent_level=0)
__init__(self, operation, lhs, rhs)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
requires_memory_allocation
__init__(self, operation, lhs, rhs, useFunctionSyntax=False)
print_tree(self, indent_level=0)
multidimensional_index(self, index, start_index=0)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
requires_memory_allocation
print_mlir(self, indent_level=0)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
multidimensional_index(self, index, start_index=0)
__init__(self, operation, lhs, rhs)
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
multidimensional_index(self, index, start_index=0)
__init__(self, dataBlock, index)
print_cpp(self, indent_level=0)
print_tree(self, indent_level=0)
print_sycl(self, indent_level=0)
multidimensional_index(self, index, start_index=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_tree(self, indent_level=0)
print_mlir(self, indent_level=0)
print_omp(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_mlir(self, indent_level=0)
__init__(self, dataBlock)
set_output_variable(self, outputVariable)
print_tree(self, indent_level=0)
__init__(self, operation, dataBlock)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
requires_memory_allocation
multidimensional_index(self, index, start_index=0)
print_omp(self, indent_level=0)
linearise_index(self, indices, dimensions, offset_start_index=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
multidimensional_index(self, index_list, start_index=0)
print_tree(self, indent_level=0)
requires_memory_allocation
__init__(self, iteration_range, internal, requires_memory_allocation, id=None, underlying_type=String("double"))
multidimensional_index(self, index_list, start_index=0)
print_sycl(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
__init__(self, value, string=None, reference=False)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
get_iteration_variable(self)
__init__(self, iteration_range, iteration_variable_name=None, use_scheduler=False)
print_cpp(self, indent_level=0)
add_statement(self, statement)
print_definition_with_timer(self, indent_level=0)
print_declaration(self, indent_level=0)
print_declaration_with_timer(self, indent_level=0)
print_sycl(self, indent_level=0)
add_argument(self, Argument argument)
print_mlir(self, indent_level=0)
__init__(self, id, Type return_type, template=None, namespaces=[], stateless=False)
print_tree(self, indent_level=0)
print_cpp(self, indent_level=0)
add_statement(self, Statement statement)
print_omp(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_tree(self, indent_level=0)
print_mlir(self, indent_level=0)
add_statement(self, statement)
print_sycl(self, indent_level=0)
__init__(self, value, string=None)
print_sycl(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_cpp(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
__init__(self, dataBlock, filename)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
__init__(self, statementToLog, outputStream)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
print_sycl(self, indent_level=0)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
__init__(self, id, type=None)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_cpp(self, indent_level=0)
multidimensional_index(self, index_list, start_index=0)
print_cpp(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
__init__(self, Expression expression)
print_cpp(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
print_sycl(self, indent_level=0)
__init__(self, Expression value, Expression index)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
print_tree(self, indent_level=0)
print_mlir(self, indent_level=0)
print_sycl(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
__init__(self, type_name)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_sycl(self, indent_level=0)
print_omp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
__init__(self, dimensions, underlying_type)
print_cpp(self, indent_level=0)
print_omp(self, indent_level=0)
__init__(self, reference=False)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
print_cpp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
print_cpp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_omp(self, indent_level=0)
print_sycl(self, indent_level=0)
print_sycl(self, indent_level=0)
print_mlir(self, indent_level=0)
__init__(self, operation, operand)
print_tree(self, indent_level=0)
print_omp(self, indent_level=0)
print_cpp(self, indent_level=0)
print_mlir(self, indent_level=0)
print_omp(self, indent_level=0)
print_tree(self, indent_level=0)
print_sycl(self, indent_level=0)
__init__(self, Expression value, Expression index)
print_cpp(self, indent_level=0)