Skip to content

Commit 310cbf0

Browse files
RoundingMode: Fix visitors for rounding mode formulas
1 parent e1f85a4 commit 310cbf0

File tree

4 files changed

+71
-21
lines changed

4 files changed

+71
-21
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,19 @@ public Object convertValue(Term term) {
594594
return term.to_bool();
595595
}
596596
if (sort.is_rm()) {
597-
return term.to_rm();
597+
if (term.is_rm_value_rna()) {
598+
return FloatingPointRoundingMode.NEAREST_TIES_AWAY;
599+
} else if (term.is_rm_value_rne()) {
600+
return FloatingPointRoundingMode.NEAREST_TIES_TO_EVEN;
601+
} else if (term.is_rm_value_rtn()) {
602+
return FloatingPointRoundingMode.TOWARD_NEGATIVE;
603+
} else if (term.is_rm_value_rtp()) {
604+
return FloatingPointRoundingMode.TOWARD_POSITIVE;
605+
} else if (term.is_rm_value_rtz()) {
606+
return FloatingPointRoundingMode.TOWARD_ZERO;
607+
} else {
608+
throw new IllegalArgumentException(String.format("Unknown rounding mode: %s", term));
609+
}
598610
}
599611
if (sort.is_bv()) {
600612
return new BigInteger(term.to_bv(), 2);

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import edu.stanford.CVC4.Integer;
2727
import edu.stanford.CVC4.Kind;
2828
import edu.stanford.CVC4.Rational;
29+
import edu.stanford.CVC4.RoundingMode;
2930
import edu.stanford.CVC4.Type;
3031
import edu.stanford.CVC4.vectorExpr;
3132
import edu.stanford.CVC4.vectorType;
@@ -334,8 +335,7 @@ public <R> R visit(FormulaVisitor<R> visitor, Formula formula, final Expr f) {
334335
} else if (type.isFloatingPoint()) {
335336
return visitor.visitConstant(formula, convertFloatingPoint(f));
336337
} else if (type.isRoundingMode()) {
337-
// TODO is this correct?
338-
return visitor.visitConstant(formula, f.getConstRoundingMode());
338+
return visitor.visitConstant(formula, convertRoundingMode(f));
339339
} else if (type.isString()) {
340340
return visitor.visitConstant(formula, f.getConstString());
341341
} else if (type.isArray()) {
@@ -624,6 +624,9 @@ public Object convertValue(Expr expForType, Expr value) {
624624
} else if (valueType.isFloatingPoint()) {
625625
return convertFloatingPoint(value);
626626

627+
} else if (valueType.isRoundingMode()) {
628+
return convertRoundingMode(value);
629+
627630
} else if (valueType.isString()) {
628631
return unescapeUnicodeForSmtlib(value.getConstString().toString());
629632

@@ -659,4 +662,21 @@ private FloatingPointNumber convertFloatingPoint(Expr fpExpr) {
659662
expWidth,
660663
mantWidth);
661664
}
665+
666+
private FloatingPointRoundingMode convertRoundingMode(Expr pExpr) {
667+
RoundingMode rm = pExpr.getConstRoundingMode();
668+
if (rm.equals(RoundingMode.roundNearestTiesToAway)) {
669+
return FloatingPointRoundingMode.NEAREST_TIES_AWAY;
670+
} else if (rm.equals(RoundingMode.roundNearestTiesToEven)) {
671+
return FloatingPointRoundingMode.NEAREST_TIES_TO_EVEN;
672+
} else if (rm.equals(RoundingMode.roundTowardNegative)) {
673+
return FloatingPointRoundingMode.TOWARD_NEGATIVE;
674+
} else if (rm.equals(RoundingMode.roundTowardPositive)) {
675+
return FloatingPointRoundingMode.TOWARD_POSITIVE;
676+
} else if (rm.equals(RoundingMode.roundTowardZero)) {
677+
return FloatingPointRoundingMode.TOWARD_ZERO;
678+
} else {
679+
throw new IllegalArgumentException(String.format("Unknown rounding mode: %s", pExpr));
680+
}
681+
}
662682
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.github.cvc5.Kind;
2828
import io.github.cvc5.Op;
2929
import io.github.cvc5.Pair;
30+
import io.github.cvc5.RoundingMode;
3031
import io.github.cvc5.Solver;
3132
import io.github.cvc5.Sort;
3233
import io.github.cvc5.Term;
@@ -410,7 +411,7 @@ public <R> R visit(FormulaVisitor<R> visitor, Formula formula, final Term f) {
410411
return visitor.visitConstant(formula, convertFloatingPoint(f));
411412

412413
} else if (f.isRoundingModeValue()) {
413-
return visitor.visitConstant(formula, f.getRoundingModeValue());
414+
return visitor.visitConstant(formula, convertRoundingMode(f));
414415

415416
} else if (f.isConstArray()) {
416417
Term constant = f.getConstArrayBase();
@@ -827,6 +828,9 @@ public Object convertValue(Term expForType, Term value) {
827828
} else if (value.isFloatingPointValue()) {
828829
return convertFloatingPoint(value);
829830

831+
} else if (value.isRoundingModeValue()) {
832+
return convertRoundingMode(value);
833+
830834
} else if (value.isBooleanValue()) {
831835
return value.getBooleanValue();
832836

@@ -856,6 +860,23 @@ private FloatingPointNumber convertFloatingPoint(Term value) throws CVC5ApiExcep
856860
return FloatingPointNumber.of(bits, expWidth, mantWidth);
857861
}
858862

863+
private FloatingPointRoundingMode convertRoundingMode(Term pTerm) throws CVC5ApiException {
864+
RoundingMode rm = pTerm.getRoundingModeValue();
865+
if (rm.equals(RoundingMode.ROUND_NEAREST_TIES_TO_AWAY)) {
866+
return FloatingPointRoundingMode.NEAREST_TIES_AWAY;
867+
} else if (rm.equals(RoundingMode.ROUND_NEAREST_TIES_TO_EVEN)) {
868+
return FloatingPointRoundingMode.NEAREST_TIES_TO_EVEN;
869+
} else if (rm.equals(RoundingMode.ROUND_TOWARD_NEGATIVE)) {
870+
return FloatingPointRoundingMode.TOWARD_NEGATIVE;
871+
} else if (rm.equals(RoundingMode.ROUND_TOWARD_POSITIVE)) {
872+
return FloatingPointRoundingMode.TOWARD_POSITIVE;
873+
} else if (rm.equals(RoundingMode.ROUND_TOWARD_ZERO)) {
874+
return FloatingPointRoundingMode.TOWARD_ZERO;
875+
} else {
876+
throw new IllegalArgumentException(String.format("Unknown rounding mode: %s", pTerm));
877+
}
878+
}
879+
859880
private Term accessVariablesCache(String name, Sort sort) {
860881
Term existingVar = variablesCache.get(name, sort.toString());
861882
Preconditions.checkNotNull(

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

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_OR;
7272
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_PLUS;
7373
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_TIMES;
74-
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_UNKNOWN;
7574
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_decl_get_arg_type;
7675
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_decl_get_name;
7776
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_decl_get_tag;
@@ -341,6 +340,20 @@ public <R> R visit(FormulaVisitor<R> visitor, Formula formula, final Long f) {
341340
return visitor.visitConstant(formula, true);
342341
} else if (msat_term_is_false(environment, f)) {
343342
return visitor.visitConstant(formula, false);
343+
} else if (msat_is_fp_roundingmode_type(environment, msat_term_get_type(f))) {
344+
long decl = msat_term_get_decl(f);
345+
switch (msat_decl_get_name(decl)) {
346+
case "`fprounding_even`":
347+
return visitor.visitConstant(formula, FloatingPointRoundingMode.NEAREST_TIES_TO_EVEN);
348+
case "`fprounding_plus_inf`":
349+
return visitor.visitConstant(formula, FloatingPointRoundingMode.TOWARD_POSITIVE);
350+
case "`fprounding_minus_inf`":
351+
return visitor.visitConstant(formula, FloatingPointRoundingMode.TOWARD_NEGATIVE);
352+
case "`fprounding_zero`":
353+
return visitor.visitConstant(formula, FloatingPointRoundingMode.TOWARD_ZERO);
354+
default:
355+
throw new IllegalArgumentException("Unknown rounding mode " + msat_decl_get_name(decl));
356+
}
344357
} else if (msat_term_is_constant(environment, f)) {
345358
return visitor.visitFreeVariable(formula, msat_term_repr(f));
346359
} else if (msat_is_enum_type(environment, msat_term_get_type(f))) {
@@ -524,22 +537,6 @@ private FunctionDeclarationKind getDeclarationKind(long pF) {
524537
return FunctionDeclarationKind.FP_IS_SUBNORMAL;
525538
case MSAT_TAG_FP_ISNORMAL:
526539
return FunctionDeclarationKind.FP_IS_NORMAL;
527-
528-
case MSAT_TAG_UNKNOWN:
529-
switch (msat_decl_get_name(decl)) {
530-
case "`fprounding_even`":
531-
return FunctionDeclarationKind.FP_ROUND_EVEN;
532-
case "`fprounding_plus_inf`":
533-
return FunctionDeclarationKind.FP_ROUND_POSITIVE;
534-
case "`fprounding_minus_inf`":
535-
return FunctionDeclarationKind.FP_ROUND_NEGATIVE;
536-
case "`fprounding_zero`":
537-
return FunctionDeclarationKind.FP_ROUND_ZERO;
538-
539-
default:
540-
return FunctionDeclarationKind.OTHER;
541-
}
542-
543540
case MSAT_TAG_FLOOR:
544541
return FunctionDeclarationKind.FLOOR;
545542

0 commit comments

Comments
 (0)