Source code for m2isar.metamodel.utils.function_throws

# 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

"""Tranformation functions to determine whether a function throws an exception."""

from functools import reduce
from operator import or_

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 reduce(or_, statements, arch.FunctionThrows.NO)
[docs] def binary_operation(self: behav.BinaryOperation, context): left = self.left.generate(context) right = self.right.generate(context) return reduce(or_, [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 reduce(or_, [expr, left, right])
[docs] def concat_operation(self: behav.ConcatOperation, context): left = self.left.generate(context) right = self.right.generate(context) return reduce(or_, [left, right])
[docs] def number_literal(self: behav.IntLiteral, context): return arch.FunctionThrows.NO
[docs] def int_literal(self: behav.IntLiteral, context): return arch.FunctionThrows.NO
[docs] def scalar_definition(self: behav.ScalarDefinition, context): return arch.FunctionThrows.NO
[docs] def break_(self: behav.Break, context): return arch.FunctionThrows.NO
[docs] def assignment(self: behav.Assignment, context): target = self.target.generate(context) expr = self.expr.generate(context) return reduce(or_, [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 arch.FunctionThrows.MAYBE if reduce(or_, conds) else arch.FunctionThrows.NO
[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 reduce(or_, 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 reduce(or_, [cond, then_expr, else_expr])
[docs] def return_(self: behav.Return, context): if self.expr is not None: return self.expr.generate(context) return arch.FunctionThrows.NO
[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.Memory) and arch.MemoryAttribute.ETISS_CAN_FAIL in self.reference.attributes: return arch.FunctionThrows.YES return arch.FunctionThrows.NO
[docs] def indexed_reference(self: behav.IndexedReference, context): if isinstance(self.reference, arch.Memory) and arch.MemoryAttribute.ETISS_CAN_FAIL in self.reference.attributes: return arch.FunctionThrows.YES return self.index.generate(context)
[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.throws) return reduce(or_, args)
[docs] def group(self: behav.Group, context): expr = self.expr.generate(context) return expr