def translate_unary_expression(self, e): e0 = self.translate_expression(e.arg(0)) if e.decl().kind() == z3p.Z3_OP_NOT: return 'TheLTS->MakeOp(LTSOps::OpNOT, {})'.format(e0) elif e.decl().kind() == z3p.Z3_OP_UMINUS: assert z3p.is_int_value(e.arg(0)) return 'TheLTS->MakeVal("{i}", TheLTS->MakeRangeType({i}, {i}))'.format(i='-{}'.format(e.arg(0))) else: raise NotImplementedError("can't translate expression {} with {}".format(e, e.num_args()))
def z3_to_python_value(value): """ is_expr: Return `True` if `a` is a Z3 expression, is_expr(1) is False """ assert z3p.is_expr(value) if z3p.is_int_value(value): return value.as_long() elif value.sort() == z3p.BoolSort(): if z3p.is_true(value): return True elif z3p.is_false(value): return False raise NotImplementedError
def translate_expression(self, e): if e == z3p.BoolVal(True): return 'TheLTS->MakeTrue()' elif e == z3p.BoolVal(False): return 'TheLTS->MakeFalse()' elif z3p.is_int_value(e): return 'TheLTS->MakeVal("{i}", TheLTS->MakeRangeType({i}, {i}))'.format(i=e) elif z3p.is_const(e) and e in self.channels: return self.translate_channel_reference(e) elif z3p.is_const(e): return '{}Exp'.format(to_camel_case(e.decl().name())) elif e.num_args() == 1: return self.translate_unary_expression(e) elif e.num_args() == 2 and e.decl().kind() == z3p.Z3_OP_SELECT: return self.translate_channel_reference(e) elif e.num_args() == 2: return self.translate_binary_expression(e) elif e.num_args() == 3: return self.translate_ternary_expreession(e) else: raise NotImplementedError("can't translate expression {} with {}".format(e, e.num_args()))