83 lhs_width = SyntaxTree.Name.variables[lhs_matrix.id]._width
85 lhs_width = lhs_matrix._width
88 rhs_width = SyntaxTree.Name.variables[rhs_matrix.id]._width
90 rhs_width = rhs_matrix._width
92 width = lhs_width * rhs_width
96 lhs_dimensions = SyntaxTree.Name.variables[lhs_matrix.id]._dimensions
98 lhs_dimensions = [SyntaxTree.Name.variables[lhs_matrix.id]._width, SyntaxTree.Name.variables[lhs_matrix.id]._width]
100 lhs_dimensions = lhs_matrix._dimensions
102 lhs_dimensions = [lhs_matrix._width, lhs_matrix._width]
105 rhs_dimensions = SyntaxTree.Name.variables[rhs_matrix.id]._dimensions
107 rhs_dimensions = [SyntaxTree.Name.variables[rhs_matrix.id]._width, SyntaxTree.Name.variables[rhs_matrix.id]._width]
109 rhs_dimensions = rhs_matrix._dimensions
111 rhs_dimensions = [rhs_matrix._width, rhs_matrix._width]
113 dimensions = [lhs_dimensions[0] * rhs_dimensions[0], lhs_dimensions[1] * rhs_dimensions[1]]
118 for interval
in constructor.args[0].elts:
121 if type(constructor.args[1])
is ast.Call:
124 if len(constructor.args) > 2:
126 function_arguments = []
127 for arg
in constructor.args[1].args[1:]:
129 if SyntaxTree.FunctionDefinition._stateless:
130 internal =
SyntaxTree.FunctionCall(
"SolverType::" + constructor.args[1].args[0].value, function_arguments,
True)
137 elif type(constructor.args[1])
is ast.Constant:
138 if type(constructor.args[1].value)
is str:
141 if len(constructor.args) > 2:
146 if len(constructor.args) > 2:
236 id = assignment_with_declaration.targets[0].id
241 if value.requires_memory_allocation ==
False:
252 SyntaxTree.Name.variables.update({id: value})
260 SyntaxTree.Name.variables.update({id: value})
327 def _parse_function(self, function: ast.FunctionDef, template, functor_arguments, namespaces, stateless, use_accelerator, top_level =
False, function_name =
None):
328 id = function.name
if function_name
is None else function_name
334 SyntaxTree.Node.use_accelerator =
True
335 for argument
in function.args.args:
339 parsed_function.id = parsed_function.id +
"Stateless"
341 for functor
in functor_arguments:
343 parsed_function.add_argument(functor)
345 for functor
in functor_arguments:
346 parsed_function.add_argument(functor)
348 SyntaxTree.MemoryAllocation.memoryAllocated.append([])
349 for statement
in function.body:
351 if isinstance(next_statement, list):
352 for nested_statement
in next_statement:
353 parsed_function.add_statement(nested_statement)
354 elif next_statement
is not None:
355 parsed_function.add_statement(next_statement)
356 for allocation
in SyntaxTree.MemoryAllocation.memoryAllocated[-1]:
358 SyntaxTree.MemoryAllocation.memoryAllocated.pop()
360 return parsed_function
362 def parse(self, function, template_arguments, functor_arguments, inuse_pde_terms, namespace = [], stateless = False, use_accelerator = False, mlir_omp = False, use_memory_manager = False, function_name = None):
363 SyntaxTree.Name.variables.clear()
364 SyntaxTree.For._inuse_iteration_variables.clear()
365 SyntaxTree.Node.use_accelerator =
False
366 SyntaxTree.Node.use_mlir_omp = mlir_omp
367 SyntaxTree.Node.use_memory_manager = use_memory_manager
370 source_code = inspect.getsource(function)
372 module = ast.parse(source_code)
373 function_definition = module.body[0]
374 assert isinstance(function_definition, ast.FunctionDef)
375 for argument
in template_arguments:
382 for argument
in functor_arguments:
390 template_arguments_copy = copy.deepcopy(template_arguments)
391 root = self.
_parse_function(function_definition, template_arguments_copy, functor_arguments, namespace, stateless, use_accelerator, top_level =
True, function_name = function_name)