Skip to content

Commit e1f85a4

Browse files
RoundingMode: Add new method makeRoundingMode() to the FloatingPointFormulaManager
1 parent 5de5afa commit e1f85a4

12 files changed

+98
-2
lines changed

src/org/sosy_lab/java_smt/api/FloatingPointFormulaManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
*/
3535
public interface FloatingPointFormulaManager {
3636

37+
/** Creates a formula for the given floating point rounding mode */
38+
FloatingPointRoundingModeFormula makeRoundingMode(FloatingPointRoundingMode pRoundingMode);
39+
3740
/**
3841
* Creates a floating point formula representing the given double value with the specified type.
3942
*/

src/org/sosy_lab/java_smt/api/FloatingPointRoundingModeFormula.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import com.google.errorprone.annotations.Immutable;
1212

1313
/**
14-
* Formula representing a rounding mode for floating-point operations. This is currently unused by
15-
* the API but necessary for traversal of formulas with such terms.
14+
* Formula representing a rounding mode for floating-point operations.
15+
*
16+
* <p>Rounding mode formulas are used by floating-point formulas to select the rounding mode for the
17+
* operation. Use {@link FloatingPointFormulaManager#makeRoundingMode(FloatingPointRoundingMode)} to
18+
* wrap a {@link org.sosy_lab.java_smt.api.FloatingPointRoundingMode} value inside a new formula.
1619
*/
1720
@Immutable
1821
public interface FloatingPointRoundingModeFormula extends Formula {}

src/org/sosy_lab/java_smt/basicimpl/AbstractFloatingPointFormulaManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.sosy_lab.java_smt.api.FloatingPointFormulaManager;
2323
import org.sosy_lab.java_smt.api.FloatingPointNumber.Sign;
2424
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
25+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
2526
import org.sosy_lab.java_smt.api.Formula;
2627
import org.sosy_lab.java_smt.api.FormulaType;
2728
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -60,6 +61,12 @@ private TFormulaInfo getRoundingMode(FloatingPointRoundingMode pFloatingPointRou
6061
return roundingModes.computeIfAbsent(pFloatingPointRoundingMode, this::getRoundingModeImpl);
6162
}
6263

64+
@Override
65+
public FloatingPointRoundingModeFormula makeRoundingMode(
66+
FloatingPointRoundingMode pRoundingMode) {
67+
return getFormulaCreator().encapsulateRoundingMode(getRoundingMode(pRoundingMode));
68+
}
69+
6370
protected FloatingPointFormula wrap(TFormulaInfo pTerm) {
6471
return getFormulaCreator().encapsulateFloatingPoint(pTerm);
6572
}

src/org/sosy_lab/java_smt/basicimpl/FormulaCreator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ protected FloatingPointFormula encapsulateFloatingPoint(TFormulaInfo pTerm) {
160160
return new FloatingPointFormulaImpl<>(pTerm);
161161
}
162162

163+
protected FloatingPointRoundingModeFormula encapsulateRoundingMode(TFormulaInfo pTerm) {
164+
checkArgument(
165+
getFormulaType(pTerm).isFloatingPointRoundingModeType(),
166+
"Floatingpoint rounding mode formula has unexpected type: %s",
167+
getFormulaType(pTerm));
168+
return new FloatingPointRoundingModeFormulaImpl<>(pTerm);
169+
}
170+
163171
protected <TI extends Formula, TE extends Formula> ArrayFormula<TI, TE> encapsulateArray(
164172
TFormulaInfo pTerm, FormulaType<TI> pIndexType, FormulaType<TE> pElementType) {
165173
checkArgument(

src/org/sosy_lab/java_smt/delegate/debugging/DebuggingFloatingPointFormulaManager.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.sosy_lab.java_smt.api.FloatingPointFormulaManager;
1818
import org.sosy_lab.java_smt.api.FloatingPointNumber.Sign;
1919
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
20+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
2021
import org.sosy_lab.java_smt.api.Formula;
2122
import org.sosy_lab.java_smt.api.FormulaType;
2223
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -31,6 +32,15 @@ public class DebuggingFloatingPointFormulaManager implements FloatingPointFormul
3132
debugging = pDebugging;
3233
}
3334

35+
@Override
36+
public FloatingPointRoundingModeFormula makeRoundingMode(
37+
FloatingPointRoundingMode pRoundingMode) {
38+
debugging.assertThreadLocal();
39+
FloatingPointRoundingModeFormula result = delegate.makeRoundingMode(pRoundingMode);
40+
debugging.addFormulaTerm(result);
41+
return result;
42+
}
43+
3444
@Override
3545
public FloatingPointFormula makeNumber(double n, FloatingPointType type) {
3646
debugging.assertThreadLocal();

src/org/sosy_lab/java_smt/delegate/statistics/StatisticsFloatingPointFormulaManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.sosy_lab.java_smt.api.FloatingPointFormulaManager;
2020
import org.sosy_lab.java_smt.api.FloatingPointNumber.Sign;
2121
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
22+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
2223
import org.sosy_lab.java_smt.api.Formula;
2324
import org.sosy_lab.java_smt.api.FormulaType;
2425
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -34,6 +35,13 @@ class StatisticsFloatingPointFormulaManager implements FloatingPointFormulaManag
3435
stats = checkNotNull(pStats);
3536
}
3637

38+
@Override
39+
public FloatingPointRoundingModeFormula makeRoundingMode(
40+
FloatingPointRoundingMode pRoundingMode) {
41+
stats.fpOperations.getAndIncrement();
42+
return delegate.makeRoundingMode(pRoundingMode);
43+
}
44+
3745
@Override
3846
public FloatingPointFormula makeNumber(double pN, FloatingPointType pType) {
3947
stats.fpOperations.getAndIncrement();

src/org/sosy_lab/java_smt/delegate/synchronize/SynchronizedFloatingPointFormulaManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.sosy_lab.java_smt.api.FloatingPointFormulaManager;
2020
import org.sosy_lab.java_smt.api.FloatingPointNumber.Sign;
2121
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
22+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
2223
import org.sosy_lab.java_smt.api.Formula;
2324
import org.sosy_lab.java_smt.api.FormulaType;
2425
import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType;
@@ -35,6 +36,14 @@ class SynchronizedFloatingPointFormulaManager implements FloatingPointFormulaMan
3536
sync = checkNotNull(pSync);
3637
}
3738

39+
@Override
40+
public FloatingPointRoundingModeFormula makeRoundingMode(
41+
FloatingPointRoundingMode pRoundingMode) {
42+
synchronized (sync) {
43+
return delegate.makeRoundingMode(pRoundingMode);
44+
}
45+
}
46+
3847
@Override
3948
public FloatingPointFormula makeNumber(double pN, FloatingPointType pType) {
4049
synchronized (sync) {

src/org/sosy_lab/java_smt/solvers/bitwuzla/BitwuzlaFormulaCreator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.sosy_lab.java_smt.api.BooleanFormula;
3434
import org.sosy_lab.java_smt.api.FloatingPointFormula;
3535
import org.sosy_lab.java_smt.api.FloatingPointNumber;
36+
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
37+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
3638
import org.sosy_lab.java_smt.api.Formula;
3739
import org.sosy_lab.java_smt.api.FormulaType;
3840
import org.sosy_lab.java_smt.api.FormulaType.ArrayFormulaType;
@@ -131,6 +133,14 @@ assert getFormulaType(pTerm).isFloatingPointType()
131133
return new BitwuzlaFloatingPointFormula(pTerm);
132134
}
133135

136+
@Override
137+
protected FloatingPointRoundingModeFormula encapsulateRoundingMode(Term pTerm) {
138+
assert getFormulaType(pTerm).isFloatingPointRoundingModeType()
139+
: String.format(
140+
"%s is no FP rounding mode, but %s (%s)", pTerm, pTerm.sort(), getFormulaType(pTerm));
141+
return new BitwuzlaFloatingPointRoundingModeFormula(pTerm);
142+
}
143+
134144
@Override
135145
@SuppressWarnings("MethodTypeParameterName")
136146
protected <TI extends Formula, TE extends Formula> ArrayFormula<TI, TE> encapsulateArray(

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.sosy_lab.java_smt.api.FloatingPointFormula;
4242
import org.sosy_lab.java_smt.api.FloatingPointNumber;
4343
import org.sosy_lab.java_smt.api.FloatingPointNumber.Sign;
44+
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
45+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
4446
import org.sosy_lab.java_smt.api.Formula;
4547
import org.sosy_lab.java_smt.api.FormulaType;
4648
import org.sosy_lab.java_smt.api.FormulaType.ArrayFormulaType;
@@ -264,6 +266,15 @@ assert getFormulaType(pTerm).isFloatingPointType()
264266
return new CVC4FloatingPointFormula(pTerm);
265267
}
266268

269+
@Override
270+
protected FloatingPointRoundingModeFormula encapsulateRoundingMode(Expr pTerm) {
271+
assert getFormulaType(pTerm).isFloatingPointRoundingModeType()
272+
: String.format(
273+
"%s is no FP rounding mode, but %s (%s)",
274+
pTerm, pTerm.getType(), getFormulaType(pTerm));
275+
return new CVC4FloatingPointRoundingModeFormula(pTerm);
276+
}
277+
267278
@Override
268279
@SuppressWarnings("MethodTypeParameterName")
269280
protected <TI extends Formula, TE extends Formula> ArrayFormula<TI, TE> encapsulateArray(

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import org.sosy_lab.java_smt.api.EnumerationFormula;
4545
import org.sosy_lab.java_smt.api.FloatingPointFormula;
4646
import org.sosy_lab.java_smt.api.FloatingPointNumber;
47+
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
48+
import org.sosy_lab.java_smt.api.FloatingPointRoundingModeFormula;
4749
import org.sosy_lab.java_smt.api.Formula;
4850
import org.sosy_lab.java_smt.api.FormulaType;
4951
import org.sosy_lab.java_smt.api.FormulaType.ArrayFormulaType;
@@ -315,6 +317,15 @@ assert getFormulaType(pTerm).isFloatingPointType()
315317
return new CVC5FloatingPointFormula(pTerm);
316318
}
317319

320+
@Override
321+
protected FloatingPointRoundingModeFormula encapsulateRoundingMode(Term pTerm) {
322+
assert getFormulaType(pTerm).isFloatingPointRoundingModeType()
323+
: String.format(
324+
"%s is no FP rounding mode, but %s (%s)",
325+
pTerm, pTerm.getSort(), getFormulaType(pTerm));
326+
return new CVC5FloatingPointRoundingModeFormula(pTerm);
327+
}
328+
318329
@Override
319330
@SuppressWarnings("MethodTypeParameterName")
320331
protected <TI extends Formula, TE extends Formula> ArrayFormula<TI, TE> encapsulateArray(

0 commit comments

Comments
 (0)