# SPDX-License-Identifier: Apache-2.0
#
# This file is part of the M2-ISA-R project: https://github.com/tum-ei-eda/M2-ISA-R
#
# Copyright (C) 2022
# Chair of Electrical Design Automation
# Technical University of Munich
"""Transformation functions to determine whether a function is considered to be static."""
from ...metamodel import arch, behav
# pylint: disable=unused-argument
[docs]
def operation(self: behav.Operation, context):
statements = []
for stmt in self.statements:
temp = stmt.generate(context)
if isinstance(temp, list):
statements.extend(temp)
else:
statements.append(temp)
return all(statements)
[docs]
def binary_operation(self: behav.BinaryOperation, context):
left = self.left.generate(context)
right = self.right.generate(context)
return all([left, right])
[docs]
def slice_operation(self: behav.SliceOperation, context):
expr = self.expr.generate(context)
left = self.left.generate(context)
right = self.right.generate(context)
return all([expr, left, right])
[docs]
def concat_operation(self: behav.ConcatOperation, context):
left = self.left.generate(context)
right = self.right.generate(context)
return all([left, right])
[docs]
def number_literal(self: behav.IntLiteral, context):
return True
[docs]
def int_literal(self: behav.IntLiteral, context):
return True
[docs]
def scalar_definition(self: behav.ScalarDefinition, context):
return True
[docs]
def break_(self: behav.Break, context):
return True
[docs]
def assignment(self: behav.Assignment, context):
target = self.target.generate(context)
expr = self.expr.generate(context)
return all([target, expr])
[docs]
def conditional(self: behav.Conditional, context):
conds = [x.generate(context) for x in self.conds]
stmts = [x.generate(context) for x in self.stmts]
conds.extend(stmts)
return all(conds)
[docs]
def loop(self: behav.Loop, context):
cond = self.cond.generate(context)
stmts = [x.generate(context) for x in self.stmts]
stmts.append(cond)
return all(stmts)
[docs]
def ternary(self: behav.Ternary, context):
cond = self.cond.generate(context)
then_expr = self.then_expr.generate(context)
else_expr = self.else_expr.generate(context)
return all([cond, then_expr, else_expr])
[docs]
def return_(self: behav.Return, context):
if self.expr is not None:
return self.expr.generate(context)
return True
[docs]
def unary_operation(self: behav.UnaryOperation, context):
right = self.right.generate(context)
return right
[docs]
def named_reference(self: behav.NamedReference, context):
if isinstance(self.reference, arch.Scalar):
return self.reference.static
static_map = {
arch.Memory: False,
arch.BitFieldDescr: True,
arch.Constant: True,
arch.FnParam: True,
arch.Scalar: True,
arch.Intrinsic: False
}
return static_map.get(type(self.reference), False)
[docs]
def indexed_reference(self: behav.IndexedReference, context):
self.index.generate(context)
return False
[docs]
def type_conv(self: behav.TypeConv, context):
expr = self.expr.generate(context)
return expr
[docs]
def callable_(self: behav.Callable, context):
args = [arg.generate(context) for arg in self.args]
args.append(self.ref_or_name.static)
return all(args)
[docs]
def group(self: behav.Group, context):
expr = self.expr.generate(context)
return expr