Exemplo n.º 1
0
    def __init__(self, environment, z3_ctx):
        DagWalker.__init__(self, environment)
        self.mgr = environment.formula_manager
        self._get_type = environment.stc.get_type
        self._back_memoization = {}
        self.ctx = z3_ctx

        # Back Conversion
        self._back_fun = {
            z3.Z3_OP_AND:
            lambda args, expr: self.mgr.And(args),
            z3.Z3_OP_OR:
            lambda args, expr: self.mgr.Or(args),
            z3.Z3_OP_MUL:
            lambda args, expr: self.mgr.Times(args),
            z3.Z3_OP_ADD:
            lambda args, expr: self.mgr.Plus(args),
            z3.Z3_OP_DIV:
            lambda args, expr: self.mgr.Div(args[0], args[1]),
            z3.Z3_OP_IDIV:
            lambda args, expr: self.mgr.Div(args[0], args[1]),
            z3.Z3_OP_MOD:
            lambda args, expr: self.mgr.Mod(args[0], args[1]),
            z3.Z3_OP_IFF:
            lambda args, expr: self.mgr.Iff(args[0], args[1]),
            z3.Z3_OP_XOR:
            lambda args, expr: self.mgr.Xor(args[0], args[1]),
            z3.Z3_OP_FALSE:
            lambda args, expr: self.mgr.FALSE(),
            z3.Z3_OP_TRUE:
            lambda args, expr: self.mgr.TRUE(),
            z3.Z3_OP_GT:
            lambda args, expr: self.mgr.GT(args[0], args[1]),
            z3.Z3_OP_GE:
            lambda args, expr: self.mgr.GE(args[0], args[1]),
            z3.Z3_OP_LT:
            lambda args, expr: self.mgr.LT(args[0], args[1]),
            z3.Z3_OP_LE:
            lambda args, expr: self.mgr.LE(args[0], args[1]),
            z3.Z3_OP_SUB:
            lambda args, expr: self.mgr.Minus(args[0], args[1]),
            z3.Z3_OP_NOT:
            lambda args, expr: self.mgr.Not(args[0]),
            z3.Z3_OP_IMPLIES:
            lambda args, expr: self.mgr.Implies(args[0], args[1]),
            z3.Z3_OP_ITE:
            lambda args, expr: self.mgr.Ite(args[0], args[1], args[2]),
            z3.Z3_OP_TO_REAL:
            lambda args, expr: self.mgr.ToReal(args[0]),
            z3.Z3_OP_BAND:
            lambda args, expr: self.mgr.BVAnd(args[0], args[1]),
            z3.Z3_OP_BOR:
            lambda args, expr: self.mgr.BVOr(args[0], args[1]),
            z3.Z3_OP_BXOR:
            lambda args, expr: self.mgr.BVXor(args[0], args[1]),
            z3.Z3_OP_BNOT:
            lambda args, expr: self.mgr.BVNot(args[0]),
            z3.Z3_OP_BNEG:
            lambda args, expr: self.mgr.BVNeg(args[0]),
            z3.Z3_OP_CONCAT:
            lambda args, expr: self.mgr.BVConcat(args[0], args[1]),
            z3.Z3_OP_ULT:
            lambda args, expr: self.mgr.BVULT(args[0], args[1]),
            z3.Z3_OP_ULEQ:
            lambda args, expr: self.mgr.BVULE(args[0], args[1]),
            z3.Z3_OP_SLT:
            lambda args, expr: self.mgr.BVSLT(args[0], args[1]),
            z3.Z3_OP_SLEQ:
            lambda args, expr: self.mgr.BVSLE(args[0], args[1]),
            z3.Z3_OP_UGT:
            lambda args, expr: self.mgr.BVUGT(args[0], args[1]),
            z3.Z3_OP_UGEQ:
            lambda args, expr: self.mgr.BVUGE(args[0], args[1]),
            z3.Z3_OP_SGT:
            lambda args, expr: self.mgr.BVSGT(args[0], args[1]),
            z3.Z3_OP_SGEQ:
            lambda args, expr: self.mgr.BVSGE(args[0], args[1]),
            z3.Z3_OP_BADD:
            lambda args, expr: self.mgr.BVAdd(args[0], args[1]),
            z3.Z3_OP_BMUL:
            lambda args, expr: self.mgr.BVMul(args[0], args[1]),
            z3.Z3_OP_BUDIV:
            lambda args, expr: self.mgr.BVUDiv(args[0], args[1]),
            z3.Z3_OP_BSDIV:
            lambda args, expr: self.mgr.BVSDiv(args[0], args[1]),
            z3.Z3_OP_BUREM:
            lambda args, expr: self.mgr.BVURem(args[0], args[1]),
            z3.Z3_OP_BSREM:
            lambda args, expr: self.mgr.BVSRem(args[0], args[1]),
            z3.Z3_OP_BSHL:
            lambda args, expr: self.mgr.BVLShl(args[0], args[1]),
            z3.Z3_OP_BLSHR:
            lambda args, expr: self.mgr.BVLShr(args[0], args[1]),
            z3.Z3_OP_BASHR:
            lambda args, expr: self.mgr.BVAShr(args[0], args[1]),
            z3.Z3_OP_BSUB:
            lambda args, expr: self.mgr.BVSub(args[0], args[1]),
            z3.Z3_OP_EXT_ROTATE_LEFT:
            lambda args, expr: self.mgr.BVRol(args[0], args[1].
                                              bv_unsigned_value()),
            z3.Z3_OP_EXT_ROTATE_RIGHT:
            lambda args, expr: self.mgr.BVRor(args[0], args[1].
                                              bv_unsigned_value()),
            z3.Z3_OP_BV2INT:
            lambda args, expr: self.mgr.BVToNatural(args[0]),
            z3.Z3_OP_POWER:
            lambda args, expr: self.mgr.Pow(args[0], args[1]),
            z3.Z3_OP_SELECT:
            lambda args, expr: self.mgr.Select(args[0], args[1]),
            z3.Z3_OP_STORE:
            lambda args, expr: self.mgr.Store(args[0], args[1], args[2]),
            # Actually use both args, expr
            z3.Z3_OP_SIGN_EXT:
            lambda args, expr: self.mgr.BVSExt(args[0], z3.get_payload(
                expr, 0)),
            z3.Z3_OP_ZERO_EXT:
            lambda args, expr: self.mgr.BVZExt(args[0], z3.get_payload(
                expr, 0)),
            z3.Z3_OP_ROTATE_LEFT:
            lambda args, expr: self.mgr.BVRol(args[0], z3.get_payload(expr, 0)
                                              ),
            z3.Z3_OP_ROTATE_RIGHT:
            lambda args, expr: self.mgr.BVRor(args[0], z3.get_payload(expr, 0)
                                              ),
            z3.Z3_OP_EXTRACT:
            lambda args, expr: self.mgr.BVExtract(args[
                0], z3.get_payload(expr, 1), z3.get_payload(expr, 0)),
            # Complex Back Translation
            z3.Z3_OP_EQ:
            self._back_z3_eq,
            z3.Z3_OP_UMINUS:
            self._back_z3_uminus,
            z3.Z3_OP_CONST_ARRAY:
            self._back_z3_const_array,
        }
        # Unique reference to Sorts
        self.z3RealSort = z3.RealSort(self.ctx)
        self.z3BoolSort = z3.BoolSort(self.ctx)
        self.z3IntSort = z3.IntSort(self.ctx)
        self._z3ArraySorts = {}
        self._z3BitVecSorts = {}
        self._z3Sorts = {}
        # Unique reference to Function Declaration
        self._z3_func_decl_cache = {}
        return
Exemplo n.º 2
0
Arquivo: z3.py Projeto: mpreiner/pysmt
    def __init__(self, environment, z3_ctx):
        DagWalker.__init__(self, environment)
        self.mgr = environment.formula_manager
        self._get_type = environment.stc.get_type
        self._back_memoization = {}
        self.ctx = z3_ctx

        # Back Conversion
        self._back_fun = {
            z3.Z3_OP_AND: lambda args, expr: self.mgr.And(args),
            z3.Z3_OP_OR: lambda args, expr: self.mgr.Or(args),
            z3.Z3_OP_MUL: lambda args, expr: self.mgr.Times(args),
            z3.Z3_OP_ADD: lambda args, expr: self.mgr.Plus(args),
            z3.Z3_OP_DIV: lambda args, expr: self.mgr.Div(args[0], args[1]),
            z3.Z3_OP_IFF: lambda args, expr: self.mgr.Iff(args[0], args[1]),
            z3.Z3_OP_XOR: lambda args, expr:  self.mgr.Xor(args[0], args[1]),
            z3.Z3_OP_FALSE: lambda args, expr: self.mgr.FALSE(),
            z3.Z3_OP_TRUE: lambda args, expr: self.mgr.TRUE(),
            z3.Z3_OP_GT: lambda args, expr: self.mgr.GT(args[0], args[1]),
            z3.Z3_OP_GE: lambda args, expr: self.mgr.GE(args[0], args[1]),
            z3.Z3_OP_LT: lambda args, expr: self.mgr.LT(args[0], args[1]),
            z3.Z3_OP_LE: lambda args, expr: self.mgr.LE(args[0], args[1]),
            z3.Z3_OP_SUB: lambda args, expr: self.mgr.Minus(args[0], args[1]),
            z3.Z3_OP_NOT: lambda args, expr: self.mgr.Not(args[0]),
            z3.Z3_OP_IMPLIES: lambda args, expr: self.mgr.Implies(args[0], args[1]),
            z3.Z3_OP_ITE: lambda args, expr: self.mgr.Ite(args[0], args[1], args[2]),
            z3.Z3_OP_TO_REAL: lambda args, expr: self.mgr.ToReal(args[0]),
            z3.Z3_OP_BAND : lambda args, expr: self.mgr.BVAnd(args[0], args[1]),
            z3.Z3_OP_BOR : lambda args, expr: self.mgr.BVOr(args[0], args[1]),
            z3.Z3_OP_BXOR : lambda args, expr: self.mgr.BVXor(args[0], args[1]),
            z3.Z3_OP_BNOT : lambda args, expr: self.mgr.BVNot(args[0]),
            z3.Z3_OP_BNEG : lambda args, expr: self.mgr.BVNeg(args[0]),
            z3.Z3_OP_CONCAT : lambda args, expr: self.mgr.BVConcat(args[0], args[1]),
            z3.Z3_OP_ULT : lambda args, expr: self.mgr.BVULT(args[0], args[1]),
            z3.Z3_OP_ULEQ : lambda args, expr: self.mgr.BVULE(args[0], args[1]),
            z3.Z3_OP_SLT : lambda args, expr: self.mgr.BVSLT(args[0], args[1]),
            z3.Z3_OP_SLEQ : lambda args, expr: self.mgr.BVSLE(args[0], args[1]),
            z3.Z3_OP_UGT : lambda args, expr: self.mgr.BVUGT(args[0], args[1]),
            z3.Z3_OP_UGEQ : lambda args, expr: self.mgr.BVUGE(args[0], args[1]),
            z3.Z3_OP_SGT : lambda args, expr: self.mgr.BVSGT(args[0], args[1]),
            z3.Z3_OP_SGEQ : lambda args, expr: self.mgr.BVSGE(args[0], args[1]),
            z3.Z3_OP_BADD : lambda args, expr: self.mgr.BVAdd(args[0], args[1]),
            z3.Z3_OP_BMUL : lambda args, expr: self.mgr.BVMul(args[0], args[1]),
            z3.Z3_OP_BUDIV : lambda args, expr: self.mgr.BVUDiv(args[0], args[1]),
            z3.Z3_OP_BSDIV : lambda args, expr: self.mgr.BVSDiv(args[0], args[1]),
            z3.Z3_OP_BUREM : lambda args, expr: self.mgr.BVURem(args[0], args[1]),
            z3.Z3_OP_BSREM : lambda args, expr: self.mgr.BVSRem(args[0], args[1]),
            z3.Z3_OP_BSHL : lambda args, expr: self.mgr.BVLShl(args[0], args[1]),
            z3.Z3_OP_BLSHR : lambda args, expr: self.mgr.BVLShr(args[0], args[1]),
            z3.Z3_OP_BASHR : lambda args, expr: self.mgr.BVAShr(args[0], args[1]),
            z3.Z3_OP_BSUB : lambda args, expr: self.mgr.BVSub(args[0], args[1]),
            z3.Z3_OP_EXT_ROTATE_LEFT : lambda args, expr: self.mgr.BVRol(args[0], args[1].bv_unsigned_value()),
            z3.Z3_OP_EXT_ROTATE_RIGHT: lambda args, expr: self.mgr.BVRor(args[0], args[1].bv_unsigned_value()),
            z3.Z3_OP_BV2INT: lambda args, expr: self.mgr.BVToNatural(args[0]),
            z3.Z3_OP_POWER : lambda args, expr: self.mgr.Pow(args[0], args[1]),
            z3.Z3_OP_SELECT : lambda args, expr: self.mgr.Select(args[0], args[1]),
            z3.Z3_OP_STORE : lambda args, expr: self.mgr.Store(args[0], args[1], args[2]),
            # Actually use both args, expr
            z3.Z3_OP_SIGN_EXT: lambda args, expr: self.mgr.BVSExt(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ZERO_EXT: lambda args, expr: self.mgr.BVZExt(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ROTATE_LEFT: lambda args, expr: self.mgr.BVRol(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ROTATE_RIGHT: lambda args, expr: self.mgr.BVRor(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_EXTRACT: lambda args, expr: self.mgr.BVExtract(args[0],
                                                              z3.get_payload(expr, 1),
                                                              z3.get_payload(expr, 0)),
            # Complex Back Translation
            z3.Z3_OP_EQ : self._back_z3_eq,
            z3.Z3_OP_UMINUS : self._back_z3_uminus,
            z3.Z3_OP_CONST_ARRAY : self._back_z3_const_array,
        }
        # Unique reference to Sorts
        self.z3RealSort = z3.RealSort(self.ctx)
        self.z3BoolSort = z3.BoolSort(self.ctx)
        self.z3IntSort  = z3.IntSort(self.ctx)
        self._z3ArraySorts = {}
        self._z3BitVecSorts = {}
        self._z3Sorts = {}
        # Unique reference to Function Declaration
        self._z3_func_decl_cache = {}
        return
Exemplo n.º 3
0
    def __init__(self, environment, z3_ctx):
        DagWalker.__init__(self, environment)
        self.mgr = environment.formula_manager
        self._get_type = environment.stc.get_type
        self._back_memoization = {}
        self.ctx = z3_ctx
        # Forward conversion
        self.set_function(p_(self.walk_nary, z3.Z3_mk_and), op.AND)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_or), op.OR)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_add), op.PLUS)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_mul), op.TIMES)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_sub), op.MINUS)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_implies), op.IMPLIES)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_le), op.LE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_lt), op.LT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_eq), op.EQUALS, op.IFF)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_power), op.POW)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_div), op.DIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvult), op.BV_ULT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvule), op.BV_ULE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvslt), op.BV_SLT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsle), op.BV_SLE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_concat), op.BV_CONCAT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvor), op.BV_OR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvand), op.BV_AND)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvxor), op.BV_XOR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvadd), op.BV_ADD)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsub), op.BV_SUB)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvmul), op.BV_MUL)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvudiv), op.BV_UDIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvurem), op.BV_UREM)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvshl), op.BV_LSHL)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvlshr), op.BV_LSHR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsdiv), op.BV_SDIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsrem), op.BV_SREM)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvashr), op.BV_ASHR)
        self.set_function(self.walk_quantifier, *op.QUANTIFIERS)

        # Back Conversion
        self._back_fun = {
            z3.Z3_OP_AND:
            lambda args, expr: self.mgr.And(args),
            z3.Z3_OP_OR:
            lambda args, expr: self.mgr.Or(args),
            z3.Z3_OP_MUL:
            lambda args, expr: self.mgr.Times(args),
            z3.Z3_OP_ADD:
            lambda args, expr: self.mgr.Plus(args),
            z3.Z3_OP_DIV:
            lambda args, expr: self.mgr.Div(args[0], args[1]),
            z3.Z3_OP_IFF:
            lambda args, expr: self.mgr.Iff(args[0], args[1]),
            z3.Z3_OP_XOR:
            lambda args, expr: self.mgr.Xor(args[0], args[1]),
            z3.Z3_OP_FALSE:
            lambda args, expr: self.mgr.FALSE(),
            z3.Z3_OP_TRUE:
            lambda args, expr: self.mgr.TRUE(),
            z3.Z3_OP_GT:
            lambda args, expr: self.mgr.GT(args[0], args[1]),
            z3.Z3_OP_GE:
            lambda args, expr: self.mgr.GE(args[0], args[1]),
            z3.Z3_OP_LT:
            lambda args, expr: self.mgr.LT(args[0], args[1]),
            z3.Z3_OP_LE:
            lambda args, expr: self.mgr.LE(args[0], args[1]),
            z3.Z3_OP_SUB:
            lambda args, expr: self.mgr.Minus(args[0], args[1]),
            z3.Z3_OP_NOT:
            lambda args, expr: self.mgr.Not(args[0]),
            z3.Z3_OP_IMPLIES:
            lambda args, expr: self.mgr.Implies(args[0], args[1]),
            z3.Z3_OP_ITE:
            lambda args, expr: self.mgr.Ite(args[0], args[1], args[2]),
            z3.Z3_OP_TO_REAL:
            lambda args, expr: self.mgr.ToReal(args[0]),
            z3.Z3_OP_BAND:
            lambda args, expr: self.mgr.BVAnd(args[0], args[1]),
            z3.Z3_OP_BOR:
            lambda args, expr: self.mgr.BVOr(args[0], args[1]),
            z3.Z3_OP_BXOR:
            lambda args, expr: self.mgr.BVXor(args[0], args[1]),
            z3.Z3_OP_BNOT:
            lambda args, expr: self.mgr.BVNot(args[0]),
            z3.Z3_OP_BNEG:
            lambda args, expr: self.mgr.BVNeg(args[0]),
            z3.Z3_OP_CONCAT:
            lambda args, expr: self.mgr.BVConcat(args[0], args[1]),
            z3.Z3_OP_ULT:
            lambda args, expr: self.mgr.BVULT(args[0], args[1]),
            z3.Z3_OP_ULEQ:
            lambda args, expr: self.mgr.BVULE(args[0], args[1]),
            z3.Z3_OP_SLT:
            lambda args, expr: self.mgr.BVSLT(args[0], args[1]),
            z3.Z3_OP_SLEQ:
            lambda args, expr: self.mgr.BVSLE(args[0], args[1]),
            z3.Z3_OP_UGT:
            lambda args, expr: self.mgr.BVUGT(args[0], args[1]),
            z3.Z3_OP_UGEQ:
            lambda args, expr: self.mgr.BVUGE(args[0], args[1]),
            z3.Z3_OP_SGT:
            lambda args, expr: self.mgr.BVSGT(args[0], args[1]),
            z3.Z3_OP_SGEQ:
            lambda args, expr: self.mgr.BVSGE(args[0], args[1]),
            z3.Z3_OP_BADD:
            lambda args, expr: self.mgr.BVAdd(args[0], args[1]),
            z3.Z3_OP_BMUL:
            lambda args, expr: self.mgr.BVMul(args[0], args[1]),
            z3.Z3_OP_BUDIV:
            lambda args, expr: self.mgr.BVUDiv(args[0], args[1]),
            z3.Z3_OP_BSDIV:
            lambda args, expr: self.mgr.BVSDiv(args[0], args[1]),
            z3.Z3_OP_BUREM:
            lambda args, expr: self.mgr.BVURem(args[0], args[1]),
            z3.Z3_OP_BSREM:
            lambda args, expr: self.mgr.BVSRem(args[0], args[1]),
            z3.Z3_OP_BSHL:
            lambda args, expr: self.mgr.BVLShl(args[0], args[1]),
            z3.Z3_OP_BLSHR:
            lambda args, expr: self.mgr.BVLShr(args[0], args[1]),
            z3.Z3_OP_BASHR:
            lambda args, expr: self.mgr.BVAShr(args[0], args[1]),
            z3.Z3_OP_BSUB:
            lambda args, expr: self.mgr.BVSub(args[0], args[1]),
            z3.Z3_OP_EXT_ROTATE_LEFT:
            lambda args, expr: self.mgr.BVRol(args[0], args[1].
                                              bv_unsigned_value()),
            z3.Z3_OP_EXT_ROTATE_RIGHT:
            lambda args, expr: self.mgr.BVRor(args[0], args[1].
                                              bv_unsigned_value()),
            z3.Z3_OP_POWER:
            lambda args, expr: self.mgr.Pow(args[0], args[1]),
            z3.Z3_OP_SELECT:
            lambda args, expr: self.mgr.Select(args[0], args[1]),
            z3.Z3_OP_STORE:
            lambda args, expr: self.mgr.Store(args[0], args[1], args[2]),
            # Actually use both args, expr
            z3.Z3_OP_SIGN_EXT:
            lambda args, expr: self.mgr.BVSExt(args[0], z3.get_payload(
                expr, 0)),
            z3.Z3_OP_ZERO_EXT:
            lambda args, expr: self.mgr.BVZExt(args[0], z3.get_payload(
                expr, 0)),
            z3.Z3_OP_ROTATE_LEFT:
            lambda args, expr: self.mgr.BVRol(args[0], z3.get_payload(expr, 0)
                                              ),
            z3.Z3_OP_ROTATE_RIGHT:
            lambda args, expr: self.mgr.BVRor(args[0], z3.get_payload(expr, 0)
                                              ),
            z3.Z3_OP_EXTRACT:
            lambda args, expr: self.mgr.BVExtract(args[
                0], z3.get_payload(expr, 1), z3.get_payload(expr, 0)),
            # Complex Back Translation
            z3.Z3_OP_EQ:
            self._back_z3_eq,
            z3.Z3_OP_UMINUS:
            self._back_z3_uminus,
            z3.Z3_OP_CONST_ARRAY:
            self._back_z3_const_array,
        }
        # Unique reference to Sorts
        self.z3RealSort = z3.RealSort(self.ctx)
        self.z3BoolSort = z3.BoolSort(self.ctx)
        self.z3IntSort = z3.IntSort(self.ctx)
        self.z3ArraySorts = {}
        self._z3BitVecSorts = {}
        # Unique reference to Function Declaration
        self._z3_func_decl_cache = {}
        return
Exemplo n.º 4
0
    def _back_single_term(self, expr, args):
        assert z3.is_expr(expr)

        if z3.is_quantifier(expr):
            raise NotImplementedError(
                "Quantified back conversion is currently not supported")

        res = None
        if z3.is_and(expr):
            res = self.mgr.And(args)
        elif z3.is_or(expr):
            res = self.mgr.Or(args)
        elif z3.is_add(expr):
            res = self.mgr.Plus(args)
        elif z3.is_div(expr):
            res = self.mgr.Div(args[0], args[1])
        elif z3.is_eq(expr):
            if self._get_type(args[0]).is_bool_type():
                res = self.mgr.Iff(args[0], args[1])
            else:
                res = self.mgr.Equals(args[0], args[1])
        elif z3.is_iff(expr):
            res = self.mgr.Iff(args[0], args[1])
        elif z3.is_xor(expr):
            res = self.mgr.Xor(args[0], args[1])
        elif z3.is_false(expr):
            res = self.mgr.FALSE()
        elif z3.is_true(expr):
            res = self.mgr.TRUE()
        elif z3.is_gt(expr):
            res = self.mgr.GT(args[0], args[1])
        elif z3.is_ge(expr):
            res = self.mgr.GE(args[0], args[1])
        elif z3.is_lt(expr):
            res = self.mgr.LT(args[0], args[1])
        elif z3.is_le(expr):
            res = self.mgr.LE(args[0], args[1])
        elif z3.is_mul(expr):
            res = self.mgr.Times(args[0], args[1])
        elif z3.is_uminus(expr):
            tp = self._get_type(args[0])
            if tp.is_real_type():
                minus_one = self.mgr.Real(-1)
            else:
                assert tp.is_int_type()
                minus_one = self.mgr.Int(-1)
            res = self.mgr.Times(args[0], minus_one)
        elif z3.is_sub(expr):
            res = self.mgr.Minus(args[0], args[1])
        elif z3.is_not(expr):
            res = self.mgr.Not(args[0])
        elif z3.is_implies(expr):
            res = self.mgr.Implies(args[0], args[1])
        elif z3.is_quantifier(expr):
            raise NotImplementedError
        elif z3.is_const(expr):
            if z3.is_rational_value(expr):
                n = expr.numerator_as_long()
                d = expr.denominator_as_long()
                f = Fraction(n, d)
                res = self.mgr.Real(f)
            elif z3.is_int_value(expr):
                n = expr.as_long()
                res = self.mgr.Int(n)
            elif z3.is_bv_value(expr):
                n = expr.as_long()
                w = expr.size()
                res = self.mgr.BV(n, w)
            else:
                # it must be a symbol
                res = self.mgr.get_symbol(str(expr))
        elif z3.is_ite(expr):
            res = self.mgr.Ite(args[0], args[1], args[2])
        elif z3.is_function(expr):
            res = self.mgr.Function(self.mgr.get_symbol(expr.decl().name()), args)
        elif z3.is_to_real(expr):
            res = self.mgr.ToReal(args[0])
        elif z3.is_bv_and(expr):
            res = self.mgr.BVAnd(args[0], args[1])
        elif z3.is_bv_or(expr):
            res = self.mgr.BVOr(args[0], args[1])
        elif z3.is_bv_xor(expr):
            res = self.mgr.BVXor(args[0], args[1])
        elif z3.is_bv_not(expr):
            res = self.mgr.BVNot(args[0])
        elif z3.is_bv_neg(expr):
            res = self.mgr.BVNeg(args[0])
        elif z3.is_bv_concat(expr):
            res = self.mgr.BVConcat(args[0], args[1])
        elif z3.is_bv_ult(expr):
            res = self.mgr.BVULT(args[0], args[1])
        elif z3.is_bv_uleq(expr):
            res = self.mgr.BVULE(args[0], args[1])
        elif z3.is_bv_slt(expr):
            res = self.mgr.BVSLT(args[0], args[1])
        elif z3.is_bv_sleq(expr):
            res = self.mgr.BVSLE(args[0], args[1])
        elif z3.is_bv_ugt(expr):
            res = self.mgr.BVUGT(args[0], args[1])
        elif z3.is_bv_ugeq(expr):
            res = self.mgr.BVUGE(args[0], args[1])
        elif z3.is_bv_sgt(expr):
            res = self.mgr.BVSGT(args[0], args[1])
        elif z3.is_bv_sgeq(expr):
            res = self.mgr.BVSGE(args[0], args[1])
        elif z3.is_bv_extract(expr):
            end = z3.get_payload(expr, 0)
            start = z3.get_payload(expr, 1)
            res = self.mgr.BVExtract(args[0], start, end)
        elif z3.is_bv_add(expr):
            res = self.mgr.BVAdd(args[0], args[1])
        elif z3.is_bv_mul(expr):
            res = self.mgr.BVMul(args[0], args[1])
        elif z3.is_bv_udiv(expr):
            res = self.mgr.BVUDiv(args[0], args[1])
        elif z3.is_bv_sdiv(expr):
            res = self.mgr.BVSDiv(args[0], args[1])
        elif z3.is_bv_urem(expr):
            res = self.mgr.BVURem(args[0], args[1])
        elif z3.is_bv_srem(expr):
            res = self.mgr.BVSRem(args[0], args[1])
        elif z3.is_bv_lshl(expr):
            res = self.mgr.BVLShl(args[0], args[1])
        elif z3.is_bv_lshr(expr):
            res = self.mgr.BVLShr(args[0], args[1])
        elif z3.is_bv_ashr(expr):
            res = self.mgr.BVAShr(args[0], args[1])
        elif z3.is_bv_sub(expr):
            res = self.mgr.BVSub(args[0], args[1])
        elif z3.is_bv_rol(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVRol(args[0], amount)
        elif z3.is_bv_ror(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVRor(args[0], amount)
        elif z3.is_bv_ext_rol(expr):
            amount = args[1].bv_unsigned_value()
            res = self.mgr.BVRol(args[0], amount)
        elif z3.is_bv_ext_ror(expr):
            amount = args[1].bv_unsigned_value()
            res = self.mgr.BVRor(args[0], amount)
        elif z3.is_bv_sext(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVSExt(args[0], amount)
        elif z3.is_bv_zext(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVZExt(args[0], amount)

        if res is None:
            raise ConvertExpressionError(message=("Unsupported expression: %s" %
                                                   str(expr)),
                                         expression=expr)
        return res
Exemplo n.º 5
0
Arquivo: z3.py Projeto: agriggio/pysmt
    def __init__(self, environment, z3_ctx):
        DagWalker.__init__(self, environment)
        self.mgr = environment.formula_manager
        self._get_type = environment.stc.get_type
        self._back_memoization = {}
        self.ctx = z3_ctx
        # Forward conversion
        self.set_function(p_(self.walk_nary, z3.Z3_mk_and), op.AND)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_or), op.OR)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_add), op.PLUS)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_mul), op.TIMES)
        self.set_function(p_(self.walk_nary, z3.Z3_mk_sub), op.MINUS)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_implies), op.IMPLIES)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_le), op.LE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_lt), op.LT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_eq), op.EQUALS, op.IFF)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_power), op.POW)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_div), op.DIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvult), op.BV_ULT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvule), op.BV_ULE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvslt), op.BV_SLT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsle), op.BV_SLE)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_concat), op.BV_CONCAT)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvor), op.BV_OR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvand), op.BV_AND)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvxor), op.BV_XOR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvadd), op.BV_ADD)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsub), op.BV_SUB)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvmul), op.BV_MUL)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvudiv), op.BV_UDIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvurem), op.BV_UREM)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvshl), op.BV_LSHL)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvlshr), op.BV_LSHR)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsdiv), op.BV_SDIV)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvsrem), op.BV_SREM)
        self.set_function(p_(self.walk_binary, z3.Z3_mk_bvashr), op.BV_ASHR)
        self.set_function(self.walk_quantifier, *op.QUANTIFIERS)

        # Back Conversion
        self._back_fun = {
            z3.Z3_OP_AND: lambda args, expr: self.mgr.And(args),
            z3.Z3_OP_OR: lambda args, expr: self.mgr.Or(args),
            z3.Z3_OP_MUL: lambda args, expr: self.mgr.Times(args),
            z3.Z3_OP_ADD: lambda args, expr: self.mgr.Plus(args),
            z3.Z3_OP_DIV: lambda args, expr: self.mgr.Div(args[0], args[1]),
            z3.Z3_OP_IFF: lambda args, expr: self.mgr.Iff(args[0], args[1]),
            z3.Z3_OP_XOR: lambda args, expr:  self.mgr.Xor(args[0], args[1]),
            z3.Z3_OP_FALSE: lambda args, expr: self.mgr.FALSE(),
            z3.Z3_OP_TRUE: lambda args, expr: self.mgr.TRUE(),
            z3.Z3_OP_GT: lambda args, expr: self.mgr.GT(args[0], args[1]),
            z3.Z3_OP_GE: lambda args, expr: self.mgr.GE(args[0], args[1]),
            z3.Z3_OP_LT: lambda args, expr: self.mgr.LT(args[0], args[1]),
            z3.Z3_OP_LE: lambda args, expr: self.mgr.LE(args[0], args[1]),
            z3.Z3_OP_SUB: lambda args, expr: self.mgr.Minus(args[0], args[1]),
            z3.Z3_OP_NOT: lambda args, expr: self.mgr.Not(args[0]),
            z3.Z3_OP_IMPLIES: lambda args, expr: self.mgr.Implies(args[0], args[1]),
            z3.Z3_OP_ITE: lambda args, expr: self.mgr.Ite(args[0], args[1], args[2]),
            z3.Z3_OP_TO_REAL: lambda args, expr: self.mgr.ToReal(args[0]),
            z3.Z3_OP_BAND : lambda args, expr: self.mgr.BVAnd(args[0], args[1]),
            z3.Z3_OP_BOR : lambda args, expr: self.mgr.BVOr(args[0], args[1]),
            z3.Z3_OP_BXOR : lambda args, expr: self.mgr.BVXor(args[0], args[1]),
            z3.Z3_OP_BNOT : lambda args, expr: self.mgr.BVNot(args[0]),
            z3.Z3_OP_BNEG : lambda args, expr: self.mgr.BVNeg(args[0]),
            z3.Z3_OP_CONCAT : lambda args, expr: self.mgr.BVConcat(args[0], args[1]),
            z3.Z3_OP_ULT : lambda args, expr: self.mgr.BVULT(args[0], args[1]),
            z3.Z3_OP_ULEQ : lambda args, expr: self.mgr.BVULE(args[0], args[1]),
            z3.Z3_OP_SLT : lambda args, expr: self.mgr.BVSLT(args[0], args[1]),
            z3.Z3_OP_SLEQ : lambda args, expr: self.mgr.BVSLE(args[0], args[1]),
            z3.Z3_OP_UGT : lambda args, expr: self.mgr.BVUGT(args[0], args[1]),
            z3.Z3_OP_UGEQ : lambda args, expr: self.mgr.BVUGE(args[0], args[1]),
            z3.Z3_OP_SGT : lambda args, expr: self.mgr.BVSGT(args[0], args[1]),
            z3.Z3_OP_SGEQ : lambda args, expr: self.mgr.BVSGE(args[0], args[1]),
            z3.Z3_OP_BADD : lambda args, expr: self.mgr.BVAdd(args[0], args[1]),
            z3.Z3_OP_BMUL : lambda args, expr: self.mgr.BVMul(args[0], args[1]),
            z3.Z3_OP_BUDIV : lambda args, expr: self.mgr.BVUDiv(args[0], args[1]),
            z3.Z3_OP_BSDIV : lambda args, expr: self.mgr.BVSDiv(args[0], args[1]),
            z3.Z3_OP_BUREM : lambda args, expr: self.mgr.BVURem(args[0], args[1]),
            z3.Z3_OP_BSREM : lambda args, expr: self.mgr.BVSRem(args[0], args[1]),
            z3.Z3_OP_BSHL : lambda args, expr: self.mgr.BVLShl(args[0], args[1]),
            z3.Z3_OP_BLSHR : lambda args, expr: self.mgr.BVLShr(args[0], args[1]),
            z3.Z3_OP_BASHR : lambda args, expr: self.mgr.BVAShr(args[0], args[1]),
            z3.Z3_OP_BSUB : lambda args, expr: self.mgr.BVSub(args[0], args[1]),
            z3.Z3_OP_EXT_ROTATE_LEFT : lambda args, expr: self.mgr.BVRol(args[0], args[1].bv_unsigned_value()),
            z3.Z3_OP_EXT_ROTATE_RIGHT: lambda args, expr: self.mgr.BVRor(args[0], args[1].bv_unsigned_value()),
            z3.Z3_OP_POWER : lambda args, expr: self.mgr.Pow(args[0], args[1]),
            z3.Z3_OP_SELECT : lambda args, expr: self.mgr.Select(args[0], args[1]),
            z3.Z3_OP_STORE : lambda args, expr: self.mgr.Store(args[0], args[1], args[2]),
            # Actually use both args, expr
            z3.Z3_OP_SIGN_EXT: lambda args, expr: self.mgr.BVSExt(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ZERO_EXT: lambda args, expr: self.mgr.BVZExt(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ROTATE_LEFT: lambda args, expr: self.mgr.BVRol(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_ROTATE_RIGHT: lambda args, expr: self.mgr.BVRor(args[0], z3.get_payload(expr, 0)),
            z3.Z3_OP_EXTRACT: lambda args, expr: self.mgr.BVExtract(args[0],
                                                              z3.get_payload(expr, 1),
                                                              z3.get_payload(expr, 0)),
            # Complex Back Translation
            z3.Z3_OP_EQ : self._back_z3_eq,
            z3.Z3_OP_UMINUS : self._back_z3_uminus,
            z3.Z3_OP_CONST_ARRAY : self._back_z3_const_array,
        }
        # Unique reference to Sorts
        self.z3RealSort = z3.RealSort(self.ctx)
        self.z3BoolSort = z3.BoolSort(self.ctx)
        self.z3IntSort  = z3.IntSort(self.ctx)
        self.z3ArraySorts = {}
        self._z3BitVecSorts = {}
        # Unique reference to Function Declaration
        self._z3_func_decl_cache = {}
        return
Exemplo n.º 6
0
Arquivo: z3.py Projeto: 0Chuzz/pysmt
    def _back_single_term(self, expr, args, model=None):
        assert z3.is_expr(expr)

        if z3.is_quantifier(expr):
            raise NotImplementedError(
                "Quantified back conversion is currently not supported")

        res = None
        if z3.is_and(expr):
            res = self.mgr.And(args)
        elif z3.is_or(expr):
            res = self.mgr.Or(args)
        elif z3.is_add(expr):
            res = self.mgr.Plus(args)
        elif z3.is_div(expr):
            res = self.mgr.Div(args[0], args[1])
        elif z3.is_eq(expr):
            if self._get_type(args[0]).is_bool_type():
                res = self.mgr.Iff(args[0], args[1])
            else:
                res = self.mgr.Equals(args[0], args[1])
        elif z3.is_iff(expr):
            res = self.mgr.Iff(args[0], args[1])
        elif z3.is_xor(expr):
            res = self.mgr.Xor(args[0], args[1])
        elif z3.is_false(expr):
            res = self.mgr.FALSE()
        elif z3.is_true(expr):
            res = self.mgr.TRUE()
        elif z3.is_gt(expr):
            res = self.mgr.GT(args[0], args[1])
        elif z3.is_ge(expr):
            res = self.mgr.GE(args[0], args[1])
        elif z3.is_lt(expr):
            res = self.mgr.LT(args[0], args[1])
        elif z3.is_le(expr):
            res = self.mgr.LE(args[0], args[1])
        elif z3.is_mul(expr):
            res = self.mgr.Times(args[0], args[1])
        elif z3.is_uminus(expr):
            tp = self._get_type(args[0])
            if tp.is_real_type():
                minus_one = self.mgr.Real(-1)
            else:
                assert tp.is_int_type()
                minus_one = self.mgr.Int(-1)
            res = self.mgr.Times(args[0], minus_one)
        elif z3.is_sub(expr):
            res = self.mgr.Minus(args[0], args[1])
        elif z3.is_not(expr):
            res = self.mgr.Not(args[0])
        elif z3.is_implies(expr):
            res = self.mgr.Implies(args[0], args[1])
        elif z3.is_quantifier(expr):
            raise NotImplementedError
        elif z3.is_const(expr):
            if z3.is_rational_value(expr):
                n = expr.numerator_as_long()
                d = expr.denominator_as_long()
                f = Fraction(n, d)
                res = self.mgr.Real(f)
            elif z3.is_int_value(expr):
                n = expr.as_long()
                res = self.mgr.Int(n)
            elif z3.is_bv_value(expr):
                n = expr.as_long()
                w = expr.size()
                res = self.mgr.BV(n, w)
            elif z3.is_as_array(expr):
                if model is None:
                    raise NotImplementedError("As-array expressions cannot be" \
                                              " handled as they are not " \
                                              "self-contained")
                else:
                    interp_decl = z3.get_as_array_func(expr)
                    interp = model[interp_decl]
                    default = self.back(interp.else_value(), model=model)
                    assign = {}
                    for i in xrange(interp.num_entries()):
                        e = interp.entry(i)
                        assert e.num_args() == 1
                        idx = self.back(e.arg_value(0), model=model)
                        val = self.back(e.value(), model=model)
                        assign[idx] = val
                    arr_type = self._z3_to_type(expr.sort())
                    res = self.mgr.Array(arr_type.index_type, default, assign)
            elif z3.is_algebraic_value(expr):
                # Algebraic value
                return self.mgr._Algebraic(Numeral(expr))
            else:
                # it must be a symbol
                res = self.mgr.get_symbol(str(expr))
        elif z3.is_ite(expr):
            res = self.mgr.Ite(args[0], args[1], args[2])
        elif z3.is_function(expr):
            res = self.mgr.Function(self.mgr.get_symbol(expr.decl().name()), args)
        elif z3.is_to_real(expr):
            res = self.mgr.ToReal(args[0])
        elif z3.is_bv_and(expr):
            res = self.mgr.BVAnd(args[0], args[1])
        elif z3.is_bv_or(expr):
            res = self.mgr.BVOr(args[0], args[1])
        elif z3.is_bv_xor(expr):
            res = self.mgr.BVXor(args[0], args[1])
        elif z3.is_bv_not(expr):
            res = self.mgr.BVNot(args[0])
        elif z3.is_bv_neg(expr):
            res = self.mgr.BVNeg(args[0])
        elif z3.is_bv_concat(expr):
            res = self.mgr.BVConcat(args[0], args[1])
        elif z3.is_bv_ult(expr):
            res = self.mgr.BVULT(args[0], args[1])
        elif z3.is_bv_uleq(expr):
            res = self.mgr.BVULE(args[0], args[1])
        elif z3.is_bv_slt(expr):
            res = self.mgr.BVSLT(args[0], args[1])
        elif z3.is_bv_sleq(expr):
            res = self.mgr.BVSLE(args[0], args[1])
        elif z3.is_bv_ugt(expr):
            res = self.mgr.BVUGT(args[0], args[1])
        elif z3.is_bv_ugeq(expr):
            res = self.mgr.BVUGE(args[0], args[1])
        elif z3.is_bv_sgt(expr):
            res = self.mgr.BVSGT(args[0], args[1])
        elif z3.is_bv_sgeq(expr):
            res = self.mgr.BVSGE(args[0], args[1])
        elif z3.is_bv_extract(expr):
            end = z3.get_payload(expr, 0)
            start = z3.get_payload(expr, 1)
            res = self.mgr.BVExtract(args[0], start, end)
        elif z3.is_bv_add(expr):
            res = self.mgr.BVAdd(args[0], args[1])
        elif z3.is_bv_mul(expr):
            res = self.mgr.BVMul(args[0], args[1])
        elif z3.is_bv_udiv(expr):
            res = self.mgr.BVUDiv(args[0], args[1])
        elif z3.is_bv_sdiv(expr):
            res = self.mgr.BVSDiv(args[0], args[1])
        elif z3.is_bv_urem(expr):
            res = self.mgr.BVURem(args[0], args[1])
        elif z3.is_bv_srem(expr):
            res = self.mgr.BVSRem(args[0], args[1])
        elif z3.is_bv_lshl(expr):
            res = self.mgr.BVLShl(args[0], args[1])
        elif z3.is_bv_lshr(expr):
            res = self.mgr.BVLShr(args[0], args[1])
        elif z3.is_bv_ashr(expr):
            res = self.mgr.BVAShr(args[0], args[1])
        elif z3.is_bv_sub(expr):
            res = self.mgr.BVSub(args[0], args[1])
        elif z3.is_bv_rol(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVRol(args[0], amount)
        elif z3.is_bv_ror(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVRor(args[0], amount)
        elif z3.is_bv_ext_rol(expr):
            amount = args[1].bv_unsigned_value()
            res = self.mgr.BVRol(args[0], amount)
        elif z3.is_bv_ext_ror(expr):
            amount = args[1].bv_unsigned_value()
            res = self.mgr.BVRor(args[0], amount)
        elif z3.is_bv_sext(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVSExt(args[0], amount)
        elif z3.is_bv_zext(expr):
            amount = z3.get_payload(expr, 0)
            res = self.mgr.BVZExt(args[0], amount)
        elif z3.is_array_select(expr):
            res = self.mgr.Select(args[0], args[1])
        elif z3.is_array_store(expr):
            res = self.mgr.Store(args[0], args[1], args[2])
        elif z3.is_const_array(expr):
            arr_ty = self._z3_to_type(expr.sort())
            k = args[0]
            res = self.mgr.Array(arr_ty.index_type, k)
        elif z3.is_power(expr):
            res = self.mgr.Pow(args[0], args[1])
        if res is None:
            raise ConvertExpressionError(message=("Unsupported expression: %s" %
                                                   str(expr)),
                                         expression=expr)
        return res