示例#1
0
文件: mypyvy.py 项目: jrkoenig/mypyvy
def check_automaton_init(s: Solver, a: AutomatonDecl) -> None:
    utils.logger.always_print('checking automaton init:')

    prog = syntax.the_program

    t = s.get_translator(KEY_ONE)

    init_decl = a.the_init()
    assert init_decl is not None  # checked by resolver
    init_phase = prog.scope.get_phase(init_decl.phase)
    assert init_phase is not None  # checked by resolver

    with s:
        for init in prog.inits():
            s.add(t.translate_expr(init.expr))

        for inv in init_phase.invs():
            with s:
                s.add(z3.Not(t.translate_expr(inv.expr)))

                if inv.tok is not None:
                    msg = ' on line %d' % inv.tok.lineno
                else:
                    msg = ''
                utils.logger.always_print('  implies phase invariant%s... ' %
                                          msg,
                                          end='')
                sys.stdout.flush()

                logic.check_unsat([
                    (inv.tok,
                     'phase invariant%s may not hold in initial state' % msg)
                ], s, [KEY_ONE])
示例#2
0
    def __init__(self, automaton_decl: AutomatonDecl) -> None:
        self.automaton_decl = automaton_decl

        self._phases: Dict[str, Phase] = OrderedDict()
        for p in self.automaton_decl.phases():
            self._phases[p.name] = Phase(p)

        self._transitions = [
            PhaseTransition(
                self._phases[p.name],
                self._phases[(delta.target
                              if delta.target is not None else p.name)], delta)
            for p in self.automaton_decl.phases() for delta in p.transitions()
        ]

        init_decl = automaton_decl.the_init()
        assert init_decl is not None
        self._init_phase = self._phases[init_decl.phase]

        self.nontrivial = len(self._phases) > 1