Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
56191d2
ExprVisitor MetaClass instead of MonkeyPatch
jokap11 Mar 20, 2026
7e1f9eb
[Backend] Use ExprVisitor for Modelviewer
jokap11 Mar 20, 2026
2fd123e
ExprVisitor calling convention plus bugfix in treeview
jokap11 Mar 21, 2026
7633fb6
ExprVisitor get rid of global dispatch table
jokap11 Mar 21, 2026
c786b9b
Bugfix FunctionThrow
jokap11 Mar 21, 2026
8beba4d
[METAMODEL] Used ExprVisitor for preprocessing Utils
jokap11 Mar 21, 2026
ddf509e
[Backend] Use ExprVisitor for Coverage
jokap11 Mar 21, 2026
168f46f
[Backend] Switch ETISS gen to ExprVisitor
jokap11 Mar 21, 2026
6625f60
[BackEnd] Isa Manual ExprVisitor
jokap11 Mar 21, 2026
6f04292
[FrontEnd] Remove monkey patching from FrontEnd
jokap11 Mar 21, 2026
adb06c3
Change Description to use ExprVisitor
jokap11 Mar 21, 2026
f3c1eb0
print warning for implicit truncations (asignment only) (TODO: cli)
PhilippvK Jun 15, 2025
fb24735
print warning for shift width overflows (TODO: cli & LOC)
PhilippvK Jun 15, 2025
e495b58
add warnings manager
PhilippvK Jul 4, 2025
234df0c
warnings: fixes
PhilippvK Apr 13, 2026
b284f1c
warnings: drop comment
PhilippvK Apr 13, 2026
790a44d
warnings: add shift-signed & sign-compare
PhilippvK Apr 13, 2026
ba433c0
fix warnings manager
PhilippvK Apr 15, 2026
5d0f39c
m2isar/metamodel/__init__.py: add helpers load_model & dump_model
PhilippvK Apr 15, 2026
9b511fb
m2isar/metamodel/arch.py: add __repr__ method for DataType
PhilippvK Apr 15, 2026
d65c335
add m2isar/transforms/__init__.py
PhilippvK Apr 15, 2026
963db92
add m2isar/transforms/infer_types
PhilippvK Apr 15, 2026
fd497e2
add m2isar/transforms/validate_behav
PhilippvK Apr 15, 2026
37e874c
m2isar/backends/etiss/warnings.py: add bit-op-missmatch
PhilippvK Apr 15, 2026
94642be
move common warnings code to toplevel
PhilippvK Apr 15, 2026
857f25f
m2isar/backends/etiss/writer.py: add comment
PhilippvK Apr 15, 2026
8ffa0ed
add --validate flag for parser
PhilippvK Apr 15, 2026
a83a381
comment out prints in transforms
PhilippvK Apr 15, 2026
64fa03d
remove redundant warnings code from etiss writer
PhilippvK Apr 15, 2026
9383448
remove print
PhilippvK Apr 15, 2026
aa4a9b9
load_model cleanup
PhilippvK Apr 15, 2026
ff3b867
validate_behav: cleanup visitor
PhilippvK Apr 15, 2026
da1b076
coredsl parser: expose --infer-types (on by default)
PhilippvK Apr 15, 2026
611fea1
infer_types: cleanup
PhilippvK Apr 15, 2026
0a15f88
infer_types: cleanup prints
PhilippvK Apr 15, 2026
d3b20a7
Merge pull request #50 from tum-ei-eda/warn-implicit-trunc
PhilippvK Apr 16, 2026
0c2aedf
Merge pull request #67 from jokap11/remove_monkey_patch
PhilippvK Apr 16, 2026
72bbcf0
handle ENABLE attribute in parser (before duplicate detection)
PhilippvK Apr 13, 2026
30eb905
resolve IntLiteral to int in metamodel
PhilippvK Apr 13, 2026
8177e2b
pyproject.toml: fix for new setuptools
PhilippvK Apr 13, 2026
36bedfd
m2isar/backends/etiss/instruction_transform.py: handle list of stmts …
PhilippvK Apr 13, 2026
6403a66
Merge pull request #79 from tum-ei-eda/handle-enable-in-parser-2
PhilippvK Apr 16, 2026
0b71172
m2isar/frontends/coredsl2/parser.py: fixup try_eval_bool
PhilippvK Apr 16, 2026
ab300ec
m2isar/metamodel/utils/ExprVisitor.py: change default implementation …
PhilippvK Apr 16, 2026
f5c212f
infer_types: port to new visitor
PhilippvK Apr 16, 2026
af30cf3
restore ExprVisitor and add ExprMutator
PhilippvK Apr 16, 2026
7be64cb
validate_behav: fix shift-overflow warning
PhilippvK Apr 16, 2026
20d8e59
WarningFlagAction: fix typos
PhilippvK Apr 16, 2026
8d025ec
add missing handler to sample ExprVisitor & ExprMutator
PhilippvK Apr 16, 2026
1865918
validate_behav: port to new visitor
PhilippvK Apr 16, 2026
9bcb958
fix implementation of ExprVisitor & ExprMutator
PhilippvK Apr 16, 2026
671296a
Merge pull request #76 from tum-ei-eda/port-transforms-to-new-visitor
PhilippvK Apr 16, 2026
0904847
[Frontend] IndexedRefs dont duplicate LHS to RHS
jokap11 Apr 17, 2026
66c7b20
[Viewer] Distinguish RangedMemNodes in Viewer
jokap11 Apr 17, 2026
c0f3cf1
[Infer] Bugfix Prohibit TypeConv from propagating in wrong dir
jokap11 Apr 17, 2026
a299121
[ETISS] Remove memory correcting with inferred_type
jokap11 Apr 17, 2026
383e5c8
[Transform] Include RangedMem Acess for typeinfer
jokap11 Apr 17, 2026
0d1f430
[ETISS] Use only base address variable
jokap11 Apr 17, 2026
33170e1
[Transform] Force ranged mem access lhs within lower/upper bound
jokap11 Apr 17, 2026
9d4e386
Merge pull request #80 from tum-ei-eda/ranged_mem_index
jokap11 Apr 17, 2026
740fa5f
m2isar/metamodel/behav.py: add assertion
PhilippvK Apr 17, 2026
da94446
expr_simplifier: fallback to inferred types in TypeConv without expli…
PhilippvK Apr 17, 2026
9ef8c31
validate_behav: fix shift-overflow warning
PhilippvK Apr 17, 2026
bdf9c27
validate_behav: fix visitor assigning None
PhilippvK Apr 17, 2026
610184c
etiss writer: handle duplicate instruction names (with different enco…
PhilippvK Apr 17, 2026
aae6937
[Viewer] Bugfix always-true Assertion
jokap11 Apr 17, 2026
457992b
[ETISS] Add comments back to Generator
jokap11 Apr 17, 2026
dd96ed5
Merge pull request #81 from tum-ei-eda/develop-fixes
PhilippvK Apr 24, 2026
ec225df
Merge remote-tracking branch 'origin/coredsl2' into develop
PhilippvK Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions m2isar/backends/coverage/coverage_dbg.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@

from tqdm import tqdm

from ...metamodel import M2_METAMODEL_VERSION, M2Model, arch, patch_model
from ...metamodel import M2_METAMODEL_VERSION, M2Model, arch
from ...metamodel.code_info import FunctionInfo, LineInfo
from ...metamodel.utils.expr_preprocessor import (process_attributes,
process_functions,
process_instructions)
from . import id_transform
from .id_transform import IdTransformVisitor
from .utils import IdMatcherContext

logger = logging.getLogger("coverage_lcov")
Expand Down Expand Up @@ -66,7 +66,7 @@ def main():
process_attributes(core_obj)


patch_model(id_transform)
id_transform_visitor = IdTransformVisitor()

ctx = IdMatcherContext()

Expand All @@ -77,12 +77,12 @@ def main():
if fn_obj.function_info is not None:
ctx.id_to_obj_map[core_name][fn_obj.function_info.id] = fn_obj

fn_obj.operation.generate(ctx)
id_transform_visitor.generate(fn_obj.operation, ctx)

for instr_name, instr_obj in core_obj.instructions.items():
ctx.id_to_obj_map[core_name][instr_obj.function_info.id] = instr_obj

instr_obj.operation.generate(ctx)
id_transform_visitor.generate(instr_obj.operation, ctx)

id_to_obj_map = {}

Expand Down
10 changes: 5 additions & 5 deletions m2isar/backends/coverage/coverage_lcov.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@

from tqdm.contrib.concurrent import process_map

from ...metamodel import M2_METAMODEL_VERSION, M2Model, patch_model
from ...metamodel import M2_METAMODEL_VERSION, M2Model
from ...metamodel.code_info import (BranchInfo, CodeInfoBase, FunctionInfo,
LineInfo)
from ...metamodel.utils.expr_preprocessor import (process_attributes,
process_functions,
process_instructions)
from . import id_transform
from .id_transform import IdTransformVisitor
from .utils import IdMatcherContext

logger = logging.getLogger("coverage_lcov")
Expand Down Expand Up @@ -137,7 +137,7 @@ def main():

logger.info("building model-specific coverage database")

patch_model(id_transform)
id_transform_visitor = IdTransformVisitor()

ctx = IdMatcherContext()

Expand All @@ -148,12 +148,12 @@ def main():
if fn_obj.function_info is not None:
ctx.id_to_obj_map[core_name][fn_obj.function_info.id] = fn_obj

fn_obj.operation.generate(ctx)
id_transform_visitor.generate(fn_obj.operation, ctx)

for instr_name, instr_obj in core_obj.instructions.items():
ctx.id_to_obj_map[core_name][instr_obj.function_info.id] = instr_obj

instr_obj.operation.generate(ctx)
id_transform_visitor.generate(instr_obj.operation, ctx)


logger.info("initializing coverage counters")
Expand Down
264 changes: 132 additions & 132 deletions m2isar/backends/coverage/id_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,138 +6,138 @@
# 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


def operation(self: behav.Operation, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

for stmt in self.statements:
stmt.generate(context)

def block(self: behav.Block, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

for stmt in self.statements:
stmt.generate(context)

def binary_operation(self: behav.BinaryOperation, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.left.generate(context)
self.right.generate(context)

def slice_operation(self: behav.SliceOperation, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.expr.generate(context)
self.left.generate(context)
self.right.generate(context)

def concat_operation(self: behav.ConcatOperation, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.left.generate(context)
self.right.generate(context)

def number_literal(self: behav.IntLiteral, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

def int_literal(self: behav.IntLiteral, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

def scalar_definition(self: behav.ScalarDefinition, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

def break_(self: behav.Break, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

def assignment(self: behav.Assignment, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.target.generate(context)
self.expr.generate(context)

def conditional(self: behav.Conditional, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

for cond in self.conds:
cond.generate(context)

for stmt in self.stmts:
#
#for stmt in op:
stmt.generate(context)
#

def loop(self: behav.Loop, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.cond.generate(context)

for stmt in self.stmts:
stmt.generate(context)

def ternary(self: behav.Ternary, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.cond.generate(context)
self.then_expr.generate(context)
self.else_expr.generate(context)

def return_(self: behav.Return, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

if self.expr is not None:
self.expr.generate(context)

def unary_operation(self: behav.UnaryOperation, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.right.generate(context)

def named_reference(self: behav.NamedReference, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

def indexed_reference(self: behav.IndexedReference, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.index.generate(context)

def type_conv(self: behav.TypeConv, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.expr.generate(context)

def callable_(self: behav.Callable, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

for arg, arg_descr in zip(self.args, self.ref_or_name.args):
arg.generate(context)

def group(self: behav.Group, context: "IdMatcherContext"):
if self.line_info is not None:
context.id_to_obj_map[context.arch_name][self.line_info.id] = self

self.expr.generate(context)
from functools import singledispatchmethod


class IdTransformVisitor(ExprVisitor):
"""Visitor that builds a mapping from code info IDs to behavior objects."""

@singledispatchmethod
def generate(self, expr: behav.BaseNode, context=None):
raise NotImplementedError(f"No visit method implemented for type {type(expr).__name__} in {type(expr).__name__}")

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
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)
Loading
Loading