tools/verification/rvgen/rvgen/dot2c.py

Source file repositories/reference/linux-study-clean/tools/verification/rvgen/rvgen/dot2c.py

File Facts

System
Linux kernel
Corpus path
tools/verification/rvgen/rvgen/dot2c.py
Extension
.py
Size
9356 bytes
Lines
269
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: tools
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>
#
# dot2c: parse an automaton in dot file digraph format into a C
#
# This program was written in the development of this paper:
#  de Oliveira, D. B. and Cucinotta, T. and de Oliveira, R. S.
#  "Efficient Formal Verification for the Linux Kernel." International
#  Conference on Software Engineering and Formal Methods. Springer, Cham, 2019.
#
# For further information, see:
#   Documentation/trace/rv/deterministic_automata.rst

from .automata import Automata, AutomataError

class Dot2c(Automata):
    enum_suffix = ""
    enum_states_def = "states"
    enum_events_def = "events"
    enum_envs_def = "envs"
    struct_automaton_def = "automaton"
    var_automaton_def = "aut"

    def __init__(self, file_path, model_name=None):
        super().__init__(file_path, model_name)
        self.line_length = 100

    def __get_enum_states_content(self) -> list[str]:
        buff = []
        buff.append(f"\t{self.initial_state}{self.enum_suffix},")
        for state in self.states:
            if state != self.initial_state:
                buff.append(f"\t{state}{self.enum_suffix},")
        buff.append(f"\tstate_max{self.enum_suffix},")

        return buff

    def format_states_enum(self) -> list[str]:
        buff = []
        buff.append(f"enum {self.enum_states_def} {{")
        buff += self.__get_enum_states_content()
        buff.append("};\n")

        return buff

    def __get_enum_events_content(self) -> list[str]:
        buff = []
        for event in self.events:
            buff.append(f"\t{event}{self.enum_suffix},")

        buff.append(f"\tevent_max{self.enum_suffix},")

        return buff

    def format_events_enum(self) -> list[str]:
        buff = []
        buff.append(f"enum {self.enum_events_def} {{")
        buff += self.__get_enum_events_content()
        buff.append("};\n")

        return buff

    def __get_non_stored_envs(self) -> list[str]:
        return [e for e in self.envs if e not in self.env_stored]

    def __get_enum_envs_content(self) -> list[str]:
        buff = []
        # We first place env variables that have a u64 storage.

Annotation

Implementation Notes