m2isar.metamodel.behav ====================== .. py:module:: m2isar.metamodel.behav .. autoapi-nested-parse:: This module contains classes for modeling the behavioral part of an M2-ISA-R model, this means the functional behavior of functions and instructions. Behavior is modeled as a tree of instances of the classes in this module. This object tree can then be traversed with transformation functions to generate code or transform the tree. All classes in this module should inherit from :class:`BaseNode`, but never implement the `generate` method here. This method is dynamically overwritten during runtime depending on which translation module is loaded using :func:`patch_model`. Classes ------- .. autoapisummary:: m2isar.metamodel.behav.BaseNode m2isar.metamodel.behav.CodeLiteral m2isar.metamodel.behav.Operator m2isar.metamodel.behav.Operation m2isar.metamodel.behav.Block m2isar.metamodel.behav.BinaryOperation m2isar.metamodel.behav.SliceOperation m2isar.metamodel.behav.ConcatOperation m2isar.metamodel.behav.NumberLiteral m2isar.metamodel.behav.IntLiteral m2isar.metamodel.behav.StringLiteral m2isar.metamodel.behav.Assignment m2isar.metamodel.behav.Conditional m2isar.metamodel.behav.Loop m2isar.metamodel.behav.Ternary m2isar.metamodel.behav.ScalarDefinition m2isar.metamodel.behav.Return m2isar.metamodel.behav.Break m2isar.metamodel.behav.UnaryOperation m2isar.metamodel.behav.NamedReference m2isar.metamodel.behav.IndexedReference m2isar.metamodel.behav.TypeConv m2isar.metamodel.behav.Callable m2isar.metamodel.behav.FunctionCall m2isar.metamodel.behav.ProcedureCall m2isar.metamodel.behav.Group Module Contents --------------- .. py:class:: BaseNode(line_info: m2isar.metamodel.code_info.LineInfo = None) The base class for all behavior model classes. Only implements an empty generate function which raises a :exc:`NotImplementedError` if it is not overridden. .. py:attribute:: line_info :value: None .. py:attribute:: inferred_type :value: None .. py:method:: generate(context) :abstractmethod: .. py:class:: CodeLiteral(val, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.CodeLiteral :parts: 1 :private-bases: The base class for all behavior model classes. Only implements an empty generate function which raises a :exc:`NotImplementedError` if it is not overridden. .. py:attribute:: val .. py:class:: Operator(op: str, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Operator :parts: 1 :private-bases: Class representing an operator (of either a :class:`.UnaryOperation` or a :class:`.BinaryOperation`). .. py:attribute:: value .. py:class:: Operation(statements: list[BaseNode], line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Operation :parts: 1 :private-bases: Top-level collection class containing a list of actual operations. .. py:attribute:: statements .. py:class:: Block(statements: list[BaseNode], line_info=None) Bases: :py:obj:`Operation` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Block :parts: 1 :private-bases: A seperated code block .. py:class:: BinaryOperation(left: BaseNode, op: Operator, right: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.BinaryOperation :parts: 1 :private-bases: A binary operation with a left-hand and a right-hand operand as well as an operator. .. py:attribute:: left .. py:attribute:: op .. py:attribute:: right .. py:class:: SliceOperation(expr: BaseNode, left: BaseNode, right: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.SliceOperation :parts: 1 :private-bases: A slicing operation for extracting bit runs from scalar values. .. py:attribute:: expr .. py:attribute:: left .. py:attribute:: right .. py:class:: ConcatOperation(left: BaseNode, right: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.ConcatOperation :parts: 1 :private-bases: A concatenating operation. .. py:attribute:: left .. py:attribute:: right .. py:class:: NumberLiteral(value, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.NumberLiteral :parts: 1 :private-bases: A class holding a generic number literal. .. py:attribute:: value .. py:method:: __repr__() .. py:class:: IntLiteral(value: int, bit_size: int = None, signed: bool = None, line_info=None) Bases: :py:obj:`NumberLiteral` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.IntLiteral :parts: 1 :private-bases: A more precise class holding only integer literals. .. py:attribute:: bit_size .. py:method:: __repr__() .. py:class:: StringLiteral(value: str) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.StringLiteral :parts: 1 :private-bases: A string constant .. py:attribute:: value .. py:method:: __repr__() .. py:class:: Assignment(target: BaseNode, expr: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Assignment :parts: 1 :private-bases: An assignment statement. .. py:attribute:: target .. py:attribute:: expr .. py:class:: Conditional(conds: list[BaseNode], stmts: list[BaseNode], line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Conditional :parts: 1 :private-bases: A conditional statement with multiple conditions and statement blocks. Each statement block has a corresponding condition statement. The exception from this is the very last statement block, which when no corresponding condition is present is treated as an else statement. .. py:attribute:: conds .. py:attribute:: stmts .. py:class:: Loop(cond: BaseNode, stmts: list[BaseNode], post_test: bool, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Loop :parts: 1 :private-bases: A loop statement, representing while and do .. while loops. `post_test` differentiates between normal while (post_test = False) and do .. while (post_test=True) loops. .. py:attribute:: cond .. py:attribute:: stmts .. py:attribute:: post_test .. py:class:: Ternary(cond: BaseNode, then_expr: BaseNode, else_expr: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Ternary :parts: 1 :private-bases: A ternary expression. .. py:attribute:: cond .. py:attribute:: then_expr .. py:attribute:: else_expr .. py:class:: ScalarDefinition(scalar: m2isar.metamodel.arch.Scalar, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.ScalarDefinition :parts: 1 :private-bases: A scalar declaration without initialization. To initialize the scalar while declaring it, use the scalar definition as LHS of an assignment statement. .. py:attribute:: scalar .. py:class:: Return(expr: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Return :parts: 1 :private-bases: A return expression. .. py:attribute:: expr .. py:class:: Break(line_info: m2isar.metamodel.code_info.LineInfo = None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Break :parts: 1 :private-bases: A break statement. .. py:class:: UnaryOperation(op: Operator, right: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.UnaryOperation :parts: 1 :private-bases: An unary operation, whith an operator and a right hand operand. .. py:attribute:: op .. py:attribute:: right .. py:class:: NamedReference(reference: Union[m2isar.metamodel.arch.Memory, m2isar.metamodel.arch.BitFieldDescr, m2isar.metamodel.arch.Scalar, m2isar.metamodel.arch.Constant, m2isar.metamodel.arch.FnParam, m2isar.metamodel.arch.Intrinsic], line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.NamedReference :parts: 1 :private-bases: A named reference to a :class:`arch.Memory`, BitFieldDescr, Scalar, Constant or FnParam. .. py:attribute:: reference .. py:class:: IndexedReference(reference: m2isar.metamodel.arch.Memory, index: BaseNode, right: BaseNode = None, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.IndexedReference :parts: 1 :private-bases: An indexed reference to a :class:`..arch.Memory`. Can optionally specify a range of indices using the `right` parameter. .. py:attribute:: reference .. py:attribute:: index .. py:attribute:: right :value: None .. py:class:: TypeConv(data_type, size, expr: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.TypeConv :parts: 1 :private-bases: A type conversion. Size can be None, in this case only the signedness is affected. .. py:attribute:: data_type .. py:attribute:: size .. py:attribute:: expr .. py:class:: Callable(ref_or_name: Union[str, m2isar.metamodel.arch.Function], args: list[BaseNode], line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Callable :parts: 1 :private-bases: A generic invocation of a callable. .. py:attribute:: ref_or_name .. py:attribute:: args .. py:class:: FunctionCall(ref_or_name: Union[str, m2isar.metamodel.arch.Function], args: list[BaseNode], line_info=None) Bases: :py:obj:`Callable` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.FunctionCall :parts: 1 :private-bases: A function (method with return value) call. .. py:class:: ProcedureCall(ref_or_name: Union[str, m2isar.metamodel.arch.Function], args: list[BaseNode], line_info=None) Bases: :py:obj:`Callable` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.ProcedureCall :parts: 1 :private-bases: A procedure (method without return value) call. .. py:class:: Group(expr: BaseNode, line_info=None) Bases: :py:obj:`BaseNode` .. autoapi-inheritance-diagram:: m2isar.metamodel.behav.Group :parts: 1 :private-bases: A group of expressions, used e.g. for parenthesized expressions. .. py:attribute:: expr