Source code for m2isar.backends.coverage.id_transform

# 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) 2024
# Chair of Electrical Design Automation
# Technical University of Munich

"""Visitor for mapping line/function IDs to model objects for coverage backends."""

from ...metamodel import behav
from ...metamodel.utils.ExprVisitor import ExprVisitor
from .utils import IdMatcherContext
from functools import singledispatchmethod


[docs] class IdTransformVisitor(ExprVisitor): """Visitor that builds a mapping from code info IDs to behavior objects.""" @singledispatchmethod
[docs] def generate(self, expr: behav.BaseNode, context=None): raise NotImplementedError(f"No visit method implemented for type {type(expr).__name__} in {type(expr).__name__}")
[docs] def _store_id(self, expr: behav.BaseNode, context: "IdMatcherContext"): if expr.line_info is not None: context.id_to_obj_map[context.arch_name][expr.line_info.id] = expr
@generate.register
[docs] def _(self, expr: behav.Operation, context: "IdMatcherContext"): self._store_id(expr, context) for stmt in expr.statements: self.generate(stmt, context)
@generate.register def _(self, expr: behav.Block, context: "IdMatcherContext"): self._store_id(expr, context) for stmt in expr.statements: self.generate(stmt, context) @generate.register def _(self, expr: behav.BinaryOperation, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.left, context) self.generate(expr.right, context) @generate.register def _(self, expr: behav.SliceOperation, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.expr, context) self.generate(expr.left, context) self.generate(expr.right, context) @generate.register def _(self, expr: behav.ConcatOperation, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.left, context) self.generate(expr.right, context) @generate.register def _(self, expr: behav.NumberLiteral, context: "IdMatcherContext"): self._store_id(expr, context) @generate.register def _(self, expr: behav.IntLiteral, context: "IdMatcherContext"): self._store_id(expr, context) @generate.register def _(self, expr: behav.ScalarDefinition, context: "IdMatcherContext"): self._store_id(expr, context) @generate.register def _(self, expr: behav.Break, context: "IdMatcherContext"): self._store_id(expr, context) @generate.register def _(self, expr: behav.Assignment, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.target, context) self.generate(expr.expr, context) @generate.register def _(self, expr: behav.Conditional, context: "IdMatcherContext"): self._store_id(expr, context) for cond in expr.conds: self.generate(cond, context) for stmt in expr.stmts: self.generate(stmt, context) @generate.register def _(self, expr: behav.Loop, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.cond, context) for stmt in expr.stmts: self.generate(stmt, context) @generate.register def _(self, expr: behav.Ternary, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.cond, context) self.generate(expr.then_expr, context) self.generate(expr.else_expr, context) @generate.register def _(self, expr: behav.Return, context: "IdMatcherContext"): self._store_id(expr, context) if expr.expr is not None: self.generate(expr.expr, context) @generate.register def _(self, expr: behav.UnaryOperation, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.right, context) @generate.register def _(self, expr: behav.NamedReference, context: "IdMatcherContext"): self._store_id(expr, context) @generate.register def _(self, expr: behav.IndexedReference, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.index, context) @generate.register def _(self, expr: behav.TypeConv, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.expr, context) @generate.register def _(self, expr: behav.Callable, context: "IdMatcherContext"): self._store_id(expr, context) for arg in expr.args: self.generate(arg, context) @generate.register def _(self, expr: behav.ProcedureCall, context: "IdMatcherContext"): self._store_id(expr, context) for arg in expr.args: self.generate(arg, context) @generate.register def _(self, expr: behav.Group, context: "IdMatcherContext"): self._store_id(expr, context) self.generate(expr.expr, context)