コード例 #1
0
ファイル: smtinterp.py プロジェクト: f2013519/alive-nj
def _sdiv(term, smt):
  if isinstance(smt.type(term), FloatType):
    return z3.fpDiv(z3.get_current_rounding_mode(),
      smt.eval(term.x), smt.eval(term.y))

  x = smt.eval(term.x)
  y = smt.eval(term.y)
  smt.add_safe(y != 0)

  return x / y
コード例 #2
0
 def _op_raw_fpDiv(self, rm, a, b):
     return z3.fpDiv(rm, a, b, ctx=self._context)
コード例 #3
0
ファイル: smtinterp.py プロジェクト: rutgers-apl/alive-nj
def _sdiv(term, smt):
  if isinstance(smt.type(term), FloatType):
    return z3.fpDiv(z3.get_current_rounding_mode(),
      smt.eval(term.x), smt.eval(term.y))

  return smt.eval(term.x) / smt.eval(term.y)
コード例 #4
0
ファイル: smtinterp.py プロジェクト: rutgers-apl/alive-nj
    defined = lambda x,y: [z3.ULT(y, y.size())],
    poisons = {'exact': lambda x,y: z3.LShR(x, y) << y == x}))

eval.register(AndInst, BaseSMTTranslator, binop(operator.and_))
eval.register(OrInst, BaseSMTTranslator, binop(operator.or_))
eval.register(XorInst, BaseSMTTranslator, binop(operator.xor))


def fbinop(op):
  return lambda term,smt: smt._float_binary_operator(term, op)

eval.register(FAddInst, BaseSMTTranslator, fbinop(operator.add))
eval.register(FSubInst, BaseSMTTranslator, fbinop(operator.sub))
eval.register(FMulInst, BaseSMTTranslator, fbinop(operator.mul))
eval.register(FDivInst, BaseSMTTranslator, fbinop(
  lambda x,y: z3.fpDiv(z3.get_default_rounding_mode(), x, y)))
eval.register(FRemInst, BaseSMTTranslator, fbinop(z3.fpRem))


@doubledispatch
def _eval_bitcast(src, tgt, v):
  """
  Return SMT expression converting v from src to tgt.
  
  Assumes src and tgt have the same bit width.
  """
  raise NotImplementedError

@_eval_bitcast.register(IntType, IntType)
@_eval_bitcast.register(IntType, PtrType)
@_eval_bitcast.register(PtrType, IntType)
コード例 #5
0
ファイル: backend_z3.py プロジェクト: angr/claripy
 def _op_raw_fpDiv(self, rm, a, b):
     return z3.fpDiv(rm, a, b, ctx=self._context)
コード例 #6
0
def _sdiv(term, smt):
    if isinstance(smt.type(term), FloatType):
        return z3.fpDiv(z3.get_current_rounding_mode(), smt.eval(term.x),
                        smt.eval(term.y))

    return smt.eval(term.x) / smt.eval(term.y)
コード例 #7
0
eval.register(AndInst, BaseSMTTranslator, binop(operator.and_))
eval.register(OrInst, BaseSMTTranslator, binop(operator.or_))
eval.register(XorInst, BaseSMTTranslator, binop(operator.xor))


def fbinop(op):
    return lambda term, smt: smt._float_binary_operator(term, op)


eval.register(FAddInst, BaseSMTTranslator, fbinop(operator.add))
eval.register(FSubInst, BaseSMTTranslator, fbinop(operator.sub))
eval.register(FMulInst, BaseSMTTranslator, fbinop(operator.mul))
eval.register(
    FDivInst, BaseSMTTranslator,
    fbinop(lambda x, y: z3.fpDiv(z3.get_default_rounding_mode(), x, y)))
eval.register(FRemInst, BaseSMTTranslator, fbinop(z3.fpRem))


@doubledispatch
def _eval_bitcast(src, tgt, v):
    """
  Return SMT expression converting v from src to tgt.
  
  Assumes src and tgt have the same bit width.
  """
    raise NotImplementedError


@_eval_bitcast.register(IntType, IntType)
@_eval_bitcast.register(IntType, PtrType)
コード例 #8
0
ファイル: fp.py プロジェクト: j29scott/ArbitraryFloats
 def __div__(self,other):
     assert isinstance(other,Float) and other.ne == self.ne and other.ns == self.ns
     return Float(val=z3.simplify(z3.fpDiv(rnd, self.z3_ds, other.z3_ds)),ne=self.ne,ns=self.ns)