summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Checkmate50 <dgeisler50@gmail.com>2016-06-07 01:01:49 -0600
committerGravatar Checkmate50 <dgeisler50@gmail.com>2016-06-07 01:01:49 -0600
commit743be23f3961e02f1d556860f9fb0e17b98ab54d (patch)
treedc725bbaecd74984fb76d9be2db5d81bc74369ca
parentaef6aa03c2ec101e08ea4839003b4d61a6c06d24 (diff)
fixed some merging issues
-rw-r--r--Source/Core/AbsyExpr.cs104
-rw-r--r--Source/Provers/SMTLib/TypeDeclCollector.cs2
2 files changed, 100 insertions, 6 deletions
diff --git a/Source/Core/AbsyExpr.cs b/Source/Core/AbsyExpr.cs
index 7ffd5f7f..b980a22b 100644
--- a/Source/Core/AbsyExpr.cs
+++ b/Source/Core/AbsyExpr.cs
@@ -313,6 +313,13 @@ namespace Microsoft.Boogie {
Contract.Ensures(Contract.Result<NAryExpr>() != null);
return Binary(BinaryOperator.Opcode.RealDiv, e1, e2);
}
+ public static NAryExpr FloatDiv(Expr e1, Expr e2)
+ {
+ Contract.Requires(e2 != null);
+ Contract.Requires(e1 != null);
+ Contract.Ensures(Contract.Result<NAryExpr>() != null);
+ return Binary(BinaryOperator.Opcode.FloatDiv, e1, e2);
+ }
public static NAryExpr Pow(Expr e1, Expr e2) {
Contract.Requires(e2 != null);
Contract.Requires(e1 != null);
@@ -356,6 +363,11 @@ namespace Microsoft.Boogie {
Contract.Ensures(Contract.Result<LiteralExpr>() != null);
return new LiteralExpr(Token.NoToken, value);
}
+ public static LiteralExpr Literal(BigFloat value)
+ {
+ Contract.Ensures(Contract.Result<LiteralExpr>() != null);
+ return new LiteralExpr(Token.NoToken, value);
+ }
private static LiteralExpr/*!*/ true_ = Literal(true);
public static LiteralExpr/*!*/ True {
@@ -514,7 +526,7 @@ namespace Microsoft.Boogie {
}
public class LiteralExpr : Expr {
- public readonly object/*!*/ Val; // false, true, a BigNum, a BigDec, or a BvConst
+ public readonly object/*!*/ Val; // false, true, a BigNum, a BigDec, a BigFloat, or a BvConst
[ContractInvariantMethod]
void ObjectInvariant() {
Contract.Invariant(Val != null);
@@ -563,6 +575,21 @@ namespace Microsoft.Boogie {
}
/// <summary>
+ /// Creates a literal expression for the floating point value "v".
+ /// </summary>
+ /// <param name="tok"></param>
+ /// <param name="v"></param>
+ public LiteralExpr(IToken/*!*/ tok, BigFloat v, bool immutable = false)
+ : base(tok, immutable)
+ {
+ Contract.Requires(tok != null);
+ Val = v;
+ Type = Type.GetFloatType(v.ExponentSize, v.SignificandSize);
+ if (immutable)
+ CachedHashCode = ComputeHashCode();
+ }
+
+ /// <summary>
/// Creates a literal expression for the bitvector value "v".
/// </summary>
public LiteralExpr(IToken/*!*/ tok, BigNum v, int b, bool immutable=false)
@@ -633,6 +660,9 @@ namespace Microsoft.Boogie {
return Type.Int;
} else if (Val is BigDec) {
return Type.Real;
+ } else if (Val is BigFloat) {
+ BigFloat temp = (BigFloat)Val;
+ return Type.GetFloatType(temp.ExponentSize, temp.SignificandSize);
} else if (Val is BvConst) {
return Type.GetBvType(((BvConst)Val).Bits);
} else {
@@ -681,6 +711,14 @@ namespace Microsoft.Boogie {
}
}
+ public bool isBigFloat
+ {
+ get
+ {
+ return Val is BigFloat;
+ }
+ }
+
public BigDec asBigDec {
get {
Contract.Assert(isBigDec);
@@ -688,6 +726,13 @@ namespace Microsoft.Boogie {
}
}
+ public BigFloat asBigFloat {
+ get {
+ Contract.Assert(isBigFloat);
+ return (BigFloat)cce.NonNull(Val);
+ }
+ }
+
public bool isBool {
get {
return Val is bool;
@@ -1355,6 +1400,9 @@ namespace Microsoft.Boogie {
if (arg0type.Unify(Type.Real)) {
return Type.Real;
}
+ //if (arg0type.Unify(Type.Float)) {
+ //return Type.Float;
+ //}
goto BAD_TYPE;
case Opcode.Not:
if (arg0type.Unify(Type.Bool)) {
@@ -1399,6 +1447,9 @@ namespace Microsoft.Boogie {
if (argument is BigDec) {
return -((BigDec)argument);
}
+ if (argument is BigFloat) {
+ return -((BigFloat)argument);
+ }
break;
case Opcode.Not:
if (argument is bool) {
@@ -1431,6 +1482,7 @@ namespace Microsoft.Boogie {
Div,
Mod,
RealDiv,
+ FloatDiv,
Pow,
Eq,
Neq,
@@ -1671,6 +1723,12 @@ namespace Microsoft.Boogie {
if (arg0type.Unify(Type.Real) && arg1type.Unify(Type.Real)) {
return Type.Real;
}
+ if (arg0type.IsFloat && arg0type.Unify(arg1type)) {
+ return Type.GetFloatType(arg0.Type.FloatExponent, arg0.Type.FloatMantissa);
+ }
+ if (arg1type.IsFloat && arg1type.Unify(arg0type)) {
+ return Type.GetFloatType(arg1.Type.FloatExponent, arg1.Type.FloatMantissa);
+ }
goto BAD_TYPE;
case Opcode.Div:
case Opcode.Mod:
@@ -1683,6 +1741,12 @@ namespace Microsoft.Boogie {
(arg1type.Unify(Type.Int) || arg1type.Unify(Type.Real))) {
return Type.Real;
}
+ if (arg0type.IsFloat && arg0type.Unify(arg1type)) {
+ return Type.GetFloatType(arg0.Type.FloatExponent, arg0.Type.FloatMantissa);
+ }
+ if (arg1type.IsFloat && arg1type.Unify(arg0type)) {
+ return Type.GetFloatType(arg1.Type.FloatExponent, arg1.Type.FloatMantissa);
+ }
goto BAD_TYPE;
case Opcode.Pow:
if (arg0type.Unify(Type.Real) && arg1type.Unify(Type.Real)) {
@@ -1715,6 +1779,9 @@ namespace Microsoft.Boogie {
if (arg0type.Unify(Type.Real) && arg1type.Unify(Type.Real)) {
return Type.Bool;
}
+ if ((arg0type.IsFloat && arg0type.Unify(arg1type)) || (arg1type.IsFloat && arg1type.Unify(arg0type))) {
+ return Type.Bool;
+ }
goto BAD_TYPE;
case Opcode.And:
case Opcode.Or:
@@ -1825,6 +1892,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) + ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) + ((BigFloat)e2);
+ }
break;
case Opcode.Sub:
if (e1 is BigNum && e2 is BigNum) {
@@ -1833,6 +1903,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) - ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) - ((BigFloat)e2);
+ }
break;
case Opcode.Mul:
if (e1 is BigNum && e2 is BigNum) {
@@ -1841,6 +1914,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) * ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) * ((BigFloat)e2);
+ }
break;
case Opcode.Div:
if (e1 is BigNum && e2 is BigNum) {
@@ -1855,6 +1931,9 @@ namespace Microsoft.Boogie {
case Opcode.RealDiv:
// TODO: add partial evaluation fro real division
break;
+ case Opcode.FloatDiv:
+ //TODO: add float division
+ break;
case Opcode.Pow:
// TODO: add partial evaluation fro real exponentiation
break;
@@ -1865,6 +1944,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) < ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) < ((BigFloat)e2);
+ }
break;
case Opcode.Le:
if (e1 is BigNum && e2 is BigNum) {
@@ -1873,6 +1955,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) <= ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) <= ((BigFloat)e2);
+ }
break;
case Opcode.Gt:
if (e1 is BigNum && e2 is BigNum) {
@@ -1881,6 +1966,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) > ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) > ((BigFloat)e2);
+ }
break;
case Opcode.Ge:
if (e1 is BigNum && e2 is BigNum) {
@@ -1889,6 +1977,9 @@ namespace Microsoft.Boogie {
if (e1 is BigDec && e2 is BigDec) {
return ((BigDec)e1) >= ((BigDec)e2);
}
+ if (e1 is BigFloat && e2 is BigFloat) {
+ return ((BigFloat)e1) >= ((BigFloat)e2);
+ }
break;
case Opcode.And:
@@ -1990,7 +2081,7 @@ namespace Microsoft.Boogie {
}
else
{
- this.name.Emit(stream, 0xF0, false);
+ this.name.Emit(stream, 0xF0, false);
}
if (stream.UseForComputingChecksums)
{
@@ -2177,7 +2268,8 @@ namespace Microsoft.Boogie {
public class ArithmeticCoercion : IAppliable {
public enum CoercionType {
ToInt,
- ToReal
+ ToReal,
+ ToFloat
}
private IToken/*!*/ tok;
@@ -2185,6 +2277,7 @@ namespace Microsoft.Boogie {
private readonly string name;
private readonly Type type;
private readonly Type argType;
+ private readonly Type argType2;
private readonly int hashCode;
public ArithmeticCoercion(IToken tok, CoercionType coercion) {
@@ -2264,8 +2357,9 @@ namespace Microsoft.Boogie {
tpInstantiation = SimpleTypeParamInstantiation.EMPTY;
- if (!cce.NonNull(cce.NonNull(args[0]).Type).Unify(argType)) {
- tc.Error(this.tok, "argument type {0} does not match expected type {1}", cce.NonNull(args[0]).Type, this.argType);
+ if (!(cce.NonNull(cce.NonNull(args[0]).Type).Unify(argType) || cce.NonNull(cce.NonNull(args[0]).Type).Unify(argType2)))
+ {
+ tc.Error(this.tok, "argument type {0} does not match expected type {1} or type {2}", cce.NonNull(args[0]).Type, this.argType, this.argType2);
}
return this.type;
diff --git a/Source/Provers/SMTLib/TypeDeclCollector.cs b/Source/Provers/SMTLib/TypeDeclCollector.cs
index eaed83e9..1d63fa5d 100644
--- a/Source/Provers/SMTLib/TypeDeclCollector.cs
+++ b/Source/Provers/SMTLib/TypeDeclCollector.cs
@@ -311,7 +311,7 @@ void ObjectInvariant()
return;
}
- if (type.IsBool || type.IsInt || type.IsReal || type.IsBv)
+ if (type.IsBool || type.IsInt || type.IsReal || type.IsBv || type.IsFloat)
return;
CtorType ctorType = type as CtorType;