예제 #1
0
 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()))
예제 #2
0
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
예제 #3
0
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
예제 #4
0
 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()))