Ejemplo n.º 1
0
        public override IArithmetic MulHi(IArithmetic r)
        {
            var a        = context.MkZeroExt(expr.SortSize * 2, expr);
            var basemult = Eval(r);
            var b        = context.MkZeroExt(basemult.SortSize * 2, basemult);

            var multed = context.MkBVMul(a, b);

            return(new BitVecWrapper(context.MkExtract(expr.SortSize * 2 - 1, expr.SortSize, multed), context));
        }
Ejemplo n.º 2
0
 protected BitVecExpr Eval(IArithmetic x)
 {
     if (x is BitVecWrapper a)
     {
         return(a.expr);
     }
     else
     {
         throw new ArgumentException("type mismatch");
     }
 }
Ejemplo n.º 3
0
 protected ulong Eval(IArithmetic x)
 {
     if (x is Arithmetic a)
     {
         return(a.expr);
     }
     else
     {
         throw new ArgumentException("type mismatch");
     }
 }
Ejemplo n.º 4
0
 public override object Equals(IArithmetic r)
 {
     if (r is BitVecWrapper x)
     {
         return(context.MkEq(expr, x.expr));
     }
     else if (r is Arithmetic a)
     {
         return(context.MkEq(expr, context.MkBV((ulong)a.Expression, bits)));
     }
     else
     {
         throw new NotSupportedException();
     }
 }
Ejemplo n.º 5
0
        public override IArithmetic MulHi(IArithmetic r)
        {
            var mult = Eval(r);
            ulong
                al = (uint)expr,
                ah = expr >> 32,
                bl = (uint)mult,
                bh = mult >> 32;

            ulong
                ll = al * bl,
                lh = al * bh,
                hl = ah * bl,
                hh = ah * bh;

            ulong mid = hl + (ll >> 32) + (uint)lh;

            return(new Arithmetic(hh + (mid >> 32) + (lh >> 32)));
        }
Ejemplo n.º 6
0
 public override IArithmetic Ror(IArithmetic sh) => new BitVecWrapper(context.MkBVRotateRight(expr, Eval(sh)), context);
Ejemplo n.º 7
0
 public override IArithmetic Sar(IArithmetic sh) => new BitVecWrapper(context.MkBVASHR(expr, Eval(sh)), context);
Ejemplo n.º 8
0
 public abstract IArithmetic Ror(IArithmetic sh);
Ejemplo n.º 9
0
 public abstract IArithmetic Shl(IArithmetic sh);
Ejemplo n.º 10
0
 public abstract IArithmetic And(IArithmetic r);
Ejemplo n.º 11
0
 public abstract IArithmetic Sub(IArithmetic r);
Ejemplo n.º 12
0
 public override object NotEquals(IArithmetic r) => expr != Eval(r);
Ejemplo n.º 13
0
 public override IArithmetic Ror(IArithmetic sh) => new Arithmetic(expr >> (int)(Eval(sh) & 0x3f) | expr << (64 - (int)(Eval(sh) & 0x3f)));
Ejemplo n.º 14
0
 public override IArithmetic Sar(IArithmetic sh) => new Arithmetic((ulong)((long)expr >> (int)(Eval(sh) & 0x3f)));
Ejemplo n.º 15
0
 public override IArithmetic Shr(IArithmetic sh) => new Arithmetic(expr >> (int)(Eval(sh) & 0x3f));
Ejemplo n.º 16
0
 public override IArithmetic Or(IArithmetic r) => new Arithmetic(expr | Eval(r));
Ejemplo n.º 17
0
 public override IArithmetic And(IArithmetic r) => new Arithmetic(expr & Eval(r));
Ejemplo n.º 18
0
 public override IArithmetic Xor(IArithmetic r) => new Arithmetic(expr ^ Eval(r));
Ejemplo n.º 19
0
 public static IArithmetic Output(IArithmetic s)
 {
     return(s << 2 ^ s.Sar(19));
 }
Ejemplo n.º 20
0
 public static IArithmetic Output(IArithmetic s, IArithmetic c)
 {
     return((s + c).Rol(15) - s);
 }
Ejemplo n.º 21
0
 public override object NotEquals(IArithmetic r) => context.MkNot(Equals(r) as BoolExpr);
Ejemplo n.º 22
0
 public abstract IArithmetic MulHi(IArithmetic r);
Ejemplo n.º 23
0
 public override IArithmetic Add(IArithmetic r) => new Arithmetic(expr + Eval(r));
Ejemplo n.º 24
0
 public abstract IArithmetic Or(IArithmetic r);
Ejemplo n.º 25
0
 public override IArithmetic Sub(IArithmetic r) => new Arithmetic(expr - Eval(r));
Ejemplo n.º 26
0
 public abstract IArithmetic Sar(IArithmetic sh);
Ejemplo n.º 27
0
 public override IArithmetic Or(IArithmetic r) => new BitVecWrapper(context.MkBVOR(expr, Eval(r)), context);
Ejemplo n.º 28
0
 public abstract object NotEquals(IArithmetic r);
Ejemplo n.º 29
0
 public override IArithmetic Mul(IArithmetic r) => new Arithmetic(expr * Eval(r));