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); }
public static Z3IntExpr BV2Int(this Z3BVExpr expr1, Z3Context context) { var size = expr1.SortSize; var parts = new Z3IntExpr[size]; var zero = context.MkInt(0); var bvzero = context.MkBV(0, 1); for (uint i = 0; i < size; ++i) { parts[i] = (Z3IntExpr)expr1.Index(context, i).Eq(context, bvzero).Ite( context, zero, context.MkInt(BigInteger.Pow(2, (int)i).ToString())); } return((Z3IntExpr)context.MkAdd(parts)); }