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); }