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