Esempio n. 1
0
        public static Z3BVExpr Int2BV(this Z3IntExpr expr1, Z3Context context, uint size)
        {
            Contract.Requires(expr1 != null && context != null && size > 0);

            Z3IntExpr xj, pow;
            var       xi     = new Z3IntExpr[size];
            var       yi     = new Z3BVExpr[size];
            var       zero   = context.MkInt(0);
            var       one    = context.MkInt(1);
            var       bvzero = context.MkBV(0, size);
            var       bvone  = context.MkBV(1, size);

            xi[size - 1] = expr1;
            for (int i = ((int)size) - 2; i >= 0; --i)
            {
                pow   = context.MkInt(BigInteger.Pow(2, i + 1).ToString());
                xj    = xi[i + 1];
                xi[i] = (Z3IntExpr)xj.Ge(context, pow).Ite(context, xj.Sub(context, pow), xj);
            }

            Z3BVExpr coercion = bvzero;

            for (int i = ((int)size) - 1; i >= 0; --i)
            {
                pow      = context.MkInt(BigInteger.Pow(2, i).ToString());
                coercion = (Z3BVExpr)xi[i].Ge(context, pow).Ite(
                    context,
                    context.MkBVAdd(context.MkBVSHL(coercion, bvone), bvone),
                    context.MkBVSHL(coercion, bvone));
            }

            Contract.Assert(coercion != null);
            return(coercion);
        }