Skip to content

Commit c68114e

Browse files
committed
Added implementation and tests
1 parent 4a34746 commit c68114e

File tree

5 files changed

+77
-0
lines changed

5 files changed

+77
-0
lines changed

src/org/sosy_lab/java_smt/solvers/cvc4/CVC4FloatingPointFormulaManager.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import com.google.common.collect.ImmutableList;
1212
import edu.stanford.CVC4.BitVectorExtract;
13+
import edu.stanford.CVC4.BitVector;
1314
import edu.stanford.CVC4.Expr;
1415
import edu.stanford.CVC4.ExprManager;
1516
import edu.stanford.CVC4.FloatingPoint;
@@ -82,6 +83,19 @@ protected Expr makeNumberImpl(double pN, FloatingPointType pType, Expr pRounding
8283
return makeNumberImpl(Double.toString(pN), pType, pRoundingMode);
8384
}
8485

86+
@Override
87+
protected Expr makeNumberImpl(
88+
BigInteger exponent, BigInteger mantissa, boolean signBit, FloatingPointType type) {
89+
final String signStr = signBit ? "1" : "0";
90+
final String exponentStr = getBvRepresentation(exponent, type.getExponentSize());
91+
final String mantissaStr = getBvRepresentation(mantissa, type.getMantissaSize());
92+
final String bitvecStr = signStr + exponentStr + mantissaStr;
93+
final BitVector bitVector = new BitVector(bitvecStr, 2);
94+
final FloatingPoint fp =
95+
new FloatingPoint(type.getExponentSize(), type.getMantissaSize() + 1, bitVector);
96+
return exprManager.mkConst(fp);
97+
}
98+
8599
@Override
86100
protected Expr makeNumberAndRound(String pN, FloatingPointType pType, Expr pRoundingMode) {
87101
try {

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5FloatingPointFormulaManager.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.github.cvc5.Sort;
1818
import io.github.cvc5.Term;
1919
import java.math.BigDecimal;
20+
import java.math.BigInteger;
2021
import org.sosy_lab.common.rationals.Rational;
2122
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
2223
import org.sosy_lab.java_smt.api.FormulaType;
@@ -66,6 +67,23 @@ protected Term makeNumberImpl(double pN, FloatingPointType pType, Term pRounding
6667
return makeNumberImpl(Double.toString(pN), pType, pRoundingMode);
6768
}
6869

70+
@Override
71+
protected Term makeNumberImpl(
72+
BigInteger exponent, BigInteger mantissa, boolean signBit, FloatingPointType type) {
73+
try {
74+
final String signStr = signBit ? "1" : "0";
75+
final String exponentStr = getBvRepresentation(exponent, type.getExponentSize());
76+
final String mantissaStr = getBvRepresentation(mantissa, type.getMantissaSize());
77+
final String bitvecForm = signStr + exponentStr + mantissaStr;
78+
79+
final Term bv =
80+
solver.mkBitVector(type.getExponentSize() + type.getMantissaSize() + 1, bitvecForm, 2);
81+
return solver.mkFloatingPoint(type.getExponentSize(), type.getMantissaSize() + 1, bv);
82+
} catch (CVC5ApiException e) {
83+
throw new IllegalArgumentException("You tried creating a invalid bitvector", e);
84+
}
85+
}
86+
6987
@Override
7088
protected Term makeNumberAndRound(String pN, FloatingPointType pType, Term pRoundingMode) {
7189
try {

src/org/sosy_lab/java_smt/solvers/mathsat5/Mathsat5FloatingPointFormulaManager.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_equal;
1212
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_abs;
13+
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_bits_number;
1314
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_cast;
1415
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_div;
1516
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_equal;
@@ -45,6 +46,7 @@
4546
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_term_get_type;
4647

4748
import com.google.common.collect.ImmutableList;
49+
import java.math.BigInteger;
4850
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
4951
import org.sosy_lab.java_smt.api.FormulaType;
5052
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -94,6 +96,18 @@ protected Long makeNumberImpl(double pN, FloatingPointType pType, Long pRounding
9496
return makeNumberImpl(Double.toString(pN), pType, pRoundingMode);
9597
}
9698

99+
@Override
100+
protected Long makeNumberImpl(
101+
BigInteger exponent, BigInteger mantissa, boolean signBit, FloatingPointType type) {
102+
final String signStr = signBit ? "1" : "0";
103+
final String exponentStr = getBvRepresentation(exponent, type.getExponentSize());
104+
final String mantissaStr = getBvRepresentation(mantissa, type.getMantissaSize());
105+
final String bitvecForm = signStr + exponentStr + mantissaStr;
106+
final BigInteger bitvecValue = new BigInteger(bitvecForm, 2);
107+
return msat_make_fp_bits_number(
108+
mathsatEnv, bitvecValue.toString(), type.getExponentSize(), type.getMantissaSize());
109+
}
110+
97111
@Override
98112
protected Long makeNumberAndRound(String pN, FloatingPointType pType, Long pRoundingMode) {
99113
try {

src/org/sosy_lab/java_smt/solvers/z3/Z3FloatingPointFormulaManager.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88

99
package org.sosy_lab.java_smt.solvers.z3;
1010

11+
import com.google.common.base.Preconditions;
1112
import com.google.common.collect.ImmutableList;
1213
import com.microsoft.z3.Native;
14+
import com.microsoft.z3.Z3Exception;
15+
import java.math.BigInteger;
1316
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
1417
import org.sosy_lab.java_smt.api.FormulaType;
1518
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -70,6 +73,24 @@ protected Long makeNumberImpl(double pN, FloatingPointType pType, Long pRounding
7073
return makeNumberImpl(Double.toString(pN), pType, pRoundingMode);
7174
}
7275

76+
@Override
77+
protected Long makeNumberImpl(
78+
BigInteger exponent,
79+
BigInteger mantissa,
80+
boolean signBit,
81+
FloatingPointType type) {
82+
83+
long signBv = Native.mkBvNumeral(z3context, 1, new boolean[]{signBit});
84+
long expoBv = Native.mkNumeral(z3context, exponent.toString(), Native.mkBvSort(z3context,
85+
type.getExponentSize()));
86+
long mantBv = Native.mkNumeral(z3context, mantissa.toString(), Native.mkBvSort(z3context,
87+
type.getMantissaSize()));
88+
89+
assert Native.getSort(z3context, signBv) != Native.getSort(z3context, mantBv);
90+
91+
return Native.mkFpaFp(z3context, signBv, expoBv, mantBv);
92+
}
93+
7394
@Override
7495
protected Long makeNumberAndRound(String pN, FloatingPointType pType, Long pRoundingMode) {
7596
// Z3 does not allow specifying a rounding mode for numerals,

src/org/sosy_lab/java_smt/test/FloatingPointFormulaManagerTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.common.collect.ImmutableSet;
1919
import com.google.common.collect.Lists;
2020
import java.math.BigDecimal;
21+
import java.math.BigInteger;
2122
import java.util.List;
2223
import java.util.Random;
2324
import org.junit.Before;
@@ -949,4 +950,13 @@ public void failOnInvalidString() {
949950
fpmgr.makeNumber("a", singlePrecType);
950951
assert_().fail();
951952
}
953+
954+
@Test
955+
public void fpFromBitPattern() throws SolverException, InterruptedException {
956+
final FloatingPointFormula expr1 = fpmgr.makeNumber(-0.1, doublePrecType);
957+
final FloatingPointFormula expr2 =
958+
fpmgr.makeNumber(
959+
BigInteger.valueOf(123), BigInteger.valueOf(5033165), true, doublePrecType);
960+
assertThatFormula(fpmgr.assignment(expr1, expr2)).isTautological();
961+
}
952962
}

0 commit comments

Comments
 (0)