Exemple #1
0
        public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Substract(
            BitVecExpr a, BitVecExpr b, BoolExpr carry, Context ctx
            )
        {
            if (carry.IsFalse)
            {
                return(Substract(a, b, ctx));
            }

            uint nBits = a.SortSize;

            BitVecExpr bv0_1bit = ctx.MkBV(0, 1);
            BitVecExpr bv1_1bit = ctx.MkBV(1, 1);

            BitVecExpr ax     = ctx.MkConcat(bv0_1bit, a);
            BitVecExpr bx     = ctx.MkConcat(bv0_1bit, b);
            BitVecExpr bx2    = ctx.MkBVAdd(bx, ctx.MkITE(carry, ctx.MkBV(1, nBits + 1), ctx.MkBV(0, nBits + 1)) as BitVecExpr);
            BitVecExpr rx     = ctx.MkBVSub(ax, bx2);
            BitVecExpr result = ctx.MkExtract(nBits - 1, 0, rx);

            BoolExpr cf = ToolsFlags.Create_CF_Sub(ax, bx2, nBits, ctx);
            BoolExpr of = ToolsFlags.Create_OF_Sub(ax, bx2, nBits, ctx);
            BoolExpr af = ToolsFlags.Create_AF_Sub(ax, bx2, ctx);

            return(result : result, cf : cf, of : of, af : af);
        }
Exemple #2
0
        public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Addition(
            BitVecExpr a, BitVecExpr b, BoolExpr carry, Context ctx)
        {
            Contract.Requires(ctx != null);
            Contract.Requires(a != null);

            //if (carry.IsFalse) return Addition(a, b, ctx);

            uint nBits = a.SortSize;

            BitVecExpr bv0_1bit = ctx.MkBV(0, 1);
            BitVecExpr bv1_1bit = ctx.MkBV(1, 1);

            BitVecExpr ax      = ctx.MkZeroExt(1, a);
            BitVecExpr bx      = ctx.MkZeroExt(1, b);
            BitVecExpr carryBV = ctx.MkITE(carry, ctx.MkBV(1, nBits + 1), ctx.MkBV(0, nBits + 1)) as BitVecExpr;
            BitVecExpr bx2     = ctx.MkBVAdd(bx, carryBV);
            BitVecExpr rx      = ctx.MkBVAdd(ax, bx2);
            BitVecExpr result  = ctx.MkExtract(nBits - 1, 0, rx);

            BoolExpr cf = ToolsFlags.Create_CF_Add(ax, bx2, nBits, ctx);
            BoolExpr of = ToolsFlags.Create_OF_Add(ax, bx2, nBits, ctx);
            BoolExpr af = ToolsFlags.Create_AF_Add(ax, bx2, ctx);

            return(result : result, cf : cf, of : of, af : af);
        }
        public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Addition(
            BitVecExpr a, BitVecExpr b, Context ctx)
        {
            BitVecExpr result = ctx.MkBVAdd(a, b);
            BoolExpr   cf     = ToolsFlags.Create_CF_Add(a, b, a.SortSize, ctx);
            BoolExpr   of     = ToolsFlags.Create_OF_Add(a, b, a.SortSize, ctx);
            BoolExpr   af     = ToolsFlags.Create_AF_Add(a, b, ctx);

            return(result : result, cf : cf, of : of, af : af);
        }
        public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Substract(
            BitVecExpr a, BitVecExpr b, Context ctx)
        {
            uint       nBits  = a.SortSize;
            BitVecExpr result = ctx.MkBVSub(a, b);
            BoolExpr   cf     = ToolsFlags.Create_CF_Sub(a, b, nBits, ctx);
            BoolExpr   of     = ToolsFlags.Create_OF_Sub(a, b, nBits, ctx);
            BoolExpr   af     = ToolsFlags.Create_AF_Sub(a, b, ctx);

            return(result : result, cf : cf, of : of, af : af);
        }
Exemple #5
0
        public void Set_SF_ZF_PF(BitVecExpr value)
        {
            Debug.Assert(value != null);
            this.Empty = false;

            lock (this._ctxLock)
            {
                Context ctx = this._ctx;
                value = value.Translate(ctx) as BitVecExpr;
                this.Set(Flags.SF, ToolsFlags.Create_SF(value, value.SortSize, ctx));
                this.Set(Flags.ZF, ToolsFlags.Create_ZF(value, ctx));
                this.Set(Flags.PF, ToolsFlags.Create_PF(value, ctx));
            }
        }
Exemple #6
0
        public void Set_SF_ZF_PF(BitVecExpr value)
        {
            Contract.Requires(value != null);
            this.Empty = false;

            lock (this.ctxLock_)
            {
                Context ctx = this.ctx_;
                value = value.Translate(ctx) as BitVecExpr;
                this.Set(Flags.SF, ToolsFlags.Create_SF(value, value.SortSize, ctx));
                this.Set(Flags.ZF, ToolsFlags.Create_ZF(value, ctx));
                this.Set(Flags.PF, ToolsFlags.Create_PF(value, ctx));
            }
        }