return self.mgr.O(args[0]) def walk_ltl_h(self, formula, args, **kwargs): return self.mgr.H(args[0]) def walk_assign(self, formula, args, **kwargs): return self.mgr.Assign(args[0], args[1]) def walk_define(self, formula, args, **kwargs): return self.mgr.Define(args[0], args[1]) IdentityDagWalker.set_handler(walk_ltl_x, LTL_X) IdentityDagWalker.set_handler(walk_ltl_f, LTL_F) IdentityDagWalker.set_handler(walk_ltl_g, LTL_G) IdentityDagWalker.set_handler(walk_ltl_u, LTL_U) IdentityDagWalker.set_handler(walk_ltl_r, LTL_R) IdentityDagWalker.set_handler(walk_ltl_o, LTL_O) IdentityDagWalker.set_handler(walk_ltl_h, LTL_H) IdentityDagWalker.set_handler(walk_assign, ASSIGN) IdentityDagWalker.set_handler(walk_define, DEFINE) def walk_simplify_assign(self, formula, args, **kwargs): assert len(args) == 2 sl = args[0]
return args[0].set_linear(False) #updating some walkers with third approach from pysmt.walkers import IdentityDagWalker def walk_sin(self, formula, args, **kwargs): return self.mgr.Sin(args[0]) def walk_cos(self, formula, args, **kwargs): return self.mgr.Cos(args[0]) IdentityDagWalker.set_handler(walk_sin, SIN) IdentityDagWalker.set_handler(walk_cos, COS) from pysmt.smtlib.printers import SmtPrinter def walk_sin(self, formula): return self.walk_nary(formula, "sin") def walk_cos(self, formula): return self.walk_nary(formula, "cos") SmtPrinter.set_handler(walk_sin, SIN) SmtPrinter.set_handler(walk_cos, COS)
return self.mgr.F(args[0]) def walk_ltl_g(self, formula, args, **kwargs): return self.mgr.G(args[0]) def walk_ltl_o(self, formula, args, **kwargs): return self.mgr.O(args[0]) def walk_ltl_h(self, formula, args, **kwargs): return self.mgr.H(args[0]) IdentityDagWalker.set_handler(walk_ltl_x, LTL_X) IdentityDagWalker.set_handler(walk_ltl_y, LTL_Y) IdentityDagWalker.set_handler(walk_ltl_u, LTL_U) IdentityDagWalker.set_handler(walk_ltl_s, LTL_S) IdentityDagWalker.set_handler(walk_ltl_f, LTL_F) IdentityDagWalker.set_handler(walk_ltl_g, LTL_G) IdentityDagWalker.set_handler(walk_ltl_o, LTL_O) IdentityDagWalker.set_handler(walk_ltl_h, LTL_H) # EOC IdentityDagWalker from pysmt.environment import Environment, pop_env, get_env from pysmt.environment import push_env as pysmt_push_env class EnvironmentLTL(Environment): """Extension of pySMT environment."""
#from pysmt.shortcuts import Iff, Equals, Symbol from pysmt.shortcuts import Not, Equals, BVZero from pysmt.shortcuts import get_env, substitute #This function modifies our IdentityDagWalker to substitute known symbols in summary symbol_table = {} def walk_symbol(self, formula, args, **kwargs): symbol_subs = self.mgr.Symbol(formula.symbol_name(), formula.symbol_type()) if formula.symbol_name() in symbol_table: symbol_subs = symbol_table[formula.symbol_name()] return symbol_subs IdentityDagWalker.set_handler(walk_symbol, SYMBOL) def bmc_summarize(smtin_filename="UNNAMED_in.smt2", smtout_filename="UNNAMED_out.smt2"): parser = SmtLibParser() with open(smtin_filename, 'r+') as f: smtlib = parser.get_script(f) asserts = list(smtlib.filter_by_command_name([smtcmd.ASSERT])) defs = list(smtlib.filter_by_command_name([smtcmd.DEFINE_FUN])) decls = list(smtlib.filter_by_command_name([smtcmd.DECLARE_FUN])) #print(smtlib.get_last_formula()) func_summary = None
# EOC HRSerialize # Finally, a third option is to define new methods and attach them to # existing classes. We do so for the IdentityDagWalker from pysmt.walkers import IdentityDagWalker def walk_ltl_x(self, formula, args, **kwargs): return self.mgr.X(args[0]) def walk_ltl_y(self, formula, args, **kwargs): return self.mgr.Y(args[0]) def walk_ltl_u(self, formula, args, **kwargs): return self.mgr.U(args[0], args[1]) def walk_ltl_s(self, formula, args, **kwargs): return self.mgr.S(args[0], args[1]) def walk_ltl_f(self, formula, args, **kwargs): return self.mgr.F(args[0]) def walk_ltl_g(self, formula, args, **kwargs): return self.mgr.G(args[0]) def walk_ltl_o(self, formula, args, **kwargs): return self.mgr.O(args[0]) def walk_ltl_h(self, formula, args, **kwargs): return self.mgr.H(args[0]) IdentityDagWalker.set_handler(walk_ltl_x, LTL_X) IdentityDagWalker.set_handler(walk_ltl_y, LTL_Y) IdentityDagWalker.set_handler(walk_ltl_u, LTL_U) IdentityDagWalker.set_handler(walk_ltl_s, LTL_S) IdentityDagWalker.set_handler(walk_ltl_f, LTL_F) IdentityDagWalker.set_handler(walk_ltl_g, LTL_G) IdentityDagWalker.set_handler(walk_ltl_o, LTL_O) IdentityDagWalker.set_handler(walk_ltl_h, LTL_H) # EOC IdentityDagWalker from pysmt.environment import Environment, pop_env, get_env from pysmt.environment import push_env as pysmt_push_env class EnvironmentLTL(Environment): """Extension of pySMT environment.""" # Only specify new classes. Classes that have been extended