Skip to content

Commit d5ee1be

Browse files
CVC5: Updated the JavaSMT backend for CVC5 to use the new TermManager. See cvc5/cvc5#10426 for the interface. This will solve issue #310.
1 parent 458b8f1 commit d5ee1be

20 files changed

+671
-593
lines changed

Diff for: src/org/sosy_lab/java_smt/solvers/cvc5/CVC5AbstractProver.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.github.cvc5.Result;
1818
import io.github.cvc5.Solver;
1919
import io.github.cvc5.Term;
20+
import io.github.cvc5.TermManager;
2021
import io.github.cvc5.UnknownExplanation;
2122
import java.util.ArrayDeque;
2223
import java.util.ArrayList;
@@ -63,9 +64,11 @@ protected CVC5AbstractProver(
6364
mgr = pMgr;
6465
creator = pFormulaCreator;
6566
incremental = !enableSL;
66-
solver = new Solver();
6767
assertedTerms.add(PathCopyingPersistentTreeMap.of());
6868

69+
TermManager termManager = creator.getEnv();
70+
solver = new Solver(termManager);
71+
6972
setSolverOptions(randomSeed, pOptions, pFurtherOptionsMap, solver);
7073
}
7174

Diff for: src/org/sosy_lab/java_smt/solvers/cvc5/CVC5ArrayFormulaManager.java

+9-8
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,32 @@
99
package org.sosy_lab.java_smt.solvers.cvc5;
1010

1111
import io.github.cvc5.Kind;
12-
import io.github.cvc5.Solver;
1312
import io.github.cvc5.Sort;
1413
import io.github.cvc5.Term;
14+
import io.github.cvc5.TermManager;
1515
import org.sosy_lab.java_smt.api.Formula;
1616
import org.sosy_lab.java_smt.api.FormulaType;
1717
import org.sosy_lab.java_smt.basicimpl.AbstractArrayFormulaManager;
1818

1919
@SuppressWarnings("MethodTypeParameterName")
20-
public class CVC5ArrayFormulaManager extends AbstractArrayFormulaManager<Term, Sort, Solver, Term> {
20+
public class CVC5ArrayFormulaManager extends AbstractArrayFormulaManager<Term, Sort, TermManager,
21+
Term> {
2122

22-
private final Solver solver;
23+
private final TermManager termManager;
2324

2425
public CVC5ArrayFormulaManager(CVC5FormulaCreator pFormulaCreator) {
2526
super(pFormulaCreator);
26-
solver = pFormulaCreator.getEnv();
27+
termManager = pFormulaCreator.getEnv();
2728
}
2829

2930
@Override
3031
protected Term select(Term pArray, Term pIndex) {
31-
return solver.mkTerm(Kind.SELECT, pArray, pIndex);
32+
return termManager.mkTerm(Kind.SELECT, pArray, pIndex);
3233
}
3334

3435
@Override
3536
protected Term store(Term pArray, Term pIndex, Term pValue) {
36-
return solver.mkTerm(Kind.STORE, pArray, pIndex, pValue);
37+
return termManager.mkTerm(Kind.STORE, pArray, pIndex, pValue);
3738
}
3839

3940
@Override
@@ -48,11 +49,11 @@ protected <TI extends Formula, TE extends Formula> Term internalMakeArray(
4849
protected <TI extends Formula, TE extends Formula> Term internalMakeArray(
4950
FormulaType<TI> pIndexType, FormulaType<TE> pElementType, Term defaultElement) {
5051
final Sort cvc5ArrayType = toSolverType(FormulaType.getArrayType(pIndexType, pElementType));
51-
return solver.mkConstArray(cvc5ArrayType, defaultElement);
52+
return termManager.mkConstArray(cvc5ArrayType, defaultElement);
5253
}
5354

5455
@Override
5556
protected Term equivalence(Term pArray1, Term pArray2) {
56-
return solver.mkTerm(Kind.EQUAL, pArray1, pArray2);
57+
return termManager.mkTerm(Kind.EQUAL, pArray1, pArray2);
5758
}
5859
}

Diff for: src/org/sosy_lab/java_smt/solvers/cvc5/CVC5BitvectorFormulaManager.java

+51-51
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,39 @@
1111
import io.github.cvc5.CVC5ApiException;
1212
import io.github.cvc5.Kind;
1313
import io.github.cvc5.Op;
14-
import io.github.cvc5.Solver;
1514
import io.github.cvc5.Sort;
1615
import io.github.cvc5.Term;
16+
import io.github.cvc5.TermManager;
1717
import java.math.BigInteger;
1818
import java.util.List;
1919
import org.sosy_lab.java_smt.basicimpl.AbstractBitvectorFormulaManager;
2020

2121
public class CVC5BitvectorFormulaManager
22-
extends AbstractBitvectorFormulaManager<Term, Sort, Solver, Term> {
22+
extends AbstractBitvectorFormulaManager<Term, Sort, TermManager, Term> {
2323

24-
private final Solver solver;
24+
private final TermManager termManager;
2525

2626
protected CVC5BitvectorFormulaManager(
2727
CVC5FormulaCreator pCreator, CVC5BooleanFormulaManager pBmgr) {
2828
super(pCreator, pBmgr);
29-
solver = pCreator.getEnv();
29+
termManager = pCreator.getEnv();
3030
}
3131

3232
@Override
3333
protected Term concat(Term pParam1, Term pParam2) {
34-
return solver.mkTerm(Kind.BITVECTOR_CONCAT, pParam1, pParam2);
34+
return termManager.mkTerm(Kind.BITVECTOR_CONCAT, pParam1, pParam2);
3535
}
3636

3737
@Override
3838
protected Term extract(Term pParam1, int pMsb, int pLsb) {
3939
Op ext;
4040
try {
4141
if (pMsb < pLsb || pMsb >= pParam1.getSort().getBitVectorSize() || pLsb < 0 || pMsb < 0) {
42-
ext = solver.mkOp(Kind.BITVECTOR_EXTRACT, 0, 0);
42+
ext = termManager.mkOp(Kind.BITVECTOR_EXTRACT, 0, 0);
4343
} else {
44-
ext = solver.mkOp(Kind.BITVECTOR_EXTRACT, pMsb, pLsb);
44+
ext = termManager.mkOp(Kind.BITVECTOR_EXTRACT, pMsb, pLsb);
4545
}
46-
return solver.mkTerm(ext, pParam1);
46+
return termManager.mkTerm(ext, pParam1);
4747
} catch (CVC5ApiException e) {
4848
throw new IllegalArgumentException(
4949
"You tried creating a invalid bitvector extract from bit "
@@ -62,11 +62,11 @@ protected Term extend(Term pParam1, int pExtensionBits, boolean signed) {
6262
final Op op;
6363
try {
6464
if (signed) {
65-
op = solver.mkOp(Kind.BITVECTOR_SIGN_EXTEND, pExtensionBits);
65+
op = termManager.mkOp(Kind.BITVECTOR_SIGN_EXTEND, pExtensionBits);
6666
} else {
67-
op = solver.mkOp(Kind.BITVECTOR_ZERO_EXTEND, pExtensionBits);
67+
op = termManager.mkOp(Kind.BITVECTOR_ZERO_EXTEND, pExtensionBits);
6868
}
69-
return solver.mkTerm(op, pParam1);
69+
return termManager.mkTerm(op, pParam1);
7070
} catch (CVC5ApiException e) {
7171
throw new IllegalArgumentException(
7272
"You tried creating a invalid bitvector extend with term "
@@ -83,7 +83,7 @@ protected Term makeBitvectorImpl(int pLength, BigInteger pI) {
8383
pI = transformValueToRange(pLength, pI);
8484
try {
8585
// Use String conversion as it can hold more values
86-
return solver.mkBitVector(pLength, pI.toString(), 10);
86+
return termManager.mkBitVector(pLength, pI.toString(), 10);
8787
} catch (CVC5ApiException e) {
8888
throw new IllegalArgumentException(
8989
"You tried creating a invalid bitvector with length "
@@ -98,7 +98,7 @@ protected Term makeBitvectorImpl(int pLength, BigInteger pI) {
9898
@Override
9999
protected Term makeVariableImpl(int length, String varName) {
100100
try {
101-
Sort type = solver.mkBitVectorSort(length);
101+
Sort type = termManager.mkBitVectorSort(length);
102102
return getFormulaCreator().makeVariable(type, varName);
103103
} catch (CVC5ApiException e) {
104104
throw new IllegalArgumentException(
@@ -114,22 +114,22 @@ protected Term makeVariableImpl(int length, String varName) {
114114
@Override
115115
protected Term shiftRight(Term pParam1, Term pParam2, boolean signed) {
116116
if (signed) {
117-
return solver.mkTerm(Kind.BITVECTOR_ASHR, pParam1, pParam2);
117+
return termManager.mkTerm(Kind.BITVECTOR_ASHR, pParam1, pParam2);
118118
} else {
119-
return solver.mkTerm(Kind.BITVECTOR_LSHR, pParam1, pParam2);
119+
return termManager.mkTerm(Kind.BITVECTOR_LSHR, pParam1, pParam2);
120120
}
121121
}
122122

123123
@Override
124124
protected Term shiftLeft(Term pParam1, Term pParam2) {
125-
return solver.mkTerm(Kind.BITVECTOR_SHL, pParam1, pParam2);
125+
return termManager.mkTerm(Kind.BITVECTOR_SHL, pParam1, pParam2);
126126
}
127127

128128
@Override
129129
protected Term rotateLeftByConstant(Term pNumber, int pToRotate) {
130130
try {
131-
Op op = solver.mkOp(Kind.BITVECTOR_ROTATE_LEFT, pToRotate);
132-
return solver.mkTerm(op, pNumber);
131+
Op op = termManager.mkOp(Kind.BITVECTOR_ROTATE_LEFT, pToRotate);
132+
return termManager.mkTerm(op, pNumber);
133133
} catch (CVC5ApiException e) {
134134
throw new IllegalArgumentException(
135135
String.format("You tried rotation a bitvector %s with shift %d", pNumber, pToRotate), e);
@@ -139,8 +139,8 @@ protected Term rotateLeftByConstant(Term pNumber, int pToRotate) {
139139
@Override
140140
protected Term rotateRightByConstant(Term pNumber, int pToRotate) {
141141
try {
142-
Op op = solver.mkOp(Kind.BITVECTOR_ROTATE_RIGHT, pToRotate);
143-
return solver.mkTerm(op, pNumber);
142+
Op op = termManager.mkOp(Kind.BITVECTOR_ROTATE_RIGHT, pToRotate);
143+
return termManager.mkTerm(op, pNumber);
144144
} catch (CVC5ApiException e) {
145145
throw new IllegalArgumentException(
146146
String.format("You tried rotation a bitvector %s with shift %d", pNumber, pToRotate), e);
@@ -149,113 +149,113 @@ protected Term rotateRightByConstant(Term pNumber, int pToRotate) {
149149

150150
@Override
151151
protected Term not(Term pParam1) {
152-
return solver.mkTerm(Kind.BITVECTOR_NOT, pParam1);
152+
return termManager.mkTerm(Kind.BITVECTOR_NOT, pParam1);
153153
}
154154

155155
@Override
156156
protected Term and(Term pParam1, Term pParam2) {
157-
return solver.mkTerm(Kind.BITVECTOR_AND, pParam1, pParam2);
157+
return termManager.mkTerm(Kind.BITVECTOR_AND, pParam1, pParam2);
158158
}
159159

160160
@Override
161161
protected Term or(Term pParam1, Term pParam2) {
162-
return solver.mkTerm(Kind.BITVECTOR_OR, pParam1, pParam2);
162+
return termManager.mkTerm(Kind.BITVECTOR_OR, pParam1, pParam2);
163163
}
164164

165165
@Override
166166
protected Term xor(Term pParam1, Term pParam2) {
167-
return solver.mkTerm(Kind.BITVECTOR_XOR, pParam1, pParam2);
167+
return termManager.mkTerm(Kind.BITVECTOR_XOR, pParam1, pParam2);
168168
}
169169

170170
@Override
171171
protected Term negate(Term pParam1) {
172-
return solver.mkTerm(Kind.BITVECTOR_NEG, pParam1);
172+
return termManager.mkTerm(Kind.BITVECTOR_NEG, pParam1);
173173
}
174174

175175
@Override
176176
protected Term add(Term pParam1, Term pParam2) {
177-
return solver.mkTerm(Kind.BITVECTOR_ADD, pParam1, pParam2);
177+
return termManager.mkTerm(Kind.BITVECTOR_ADD, pParam1, pParam2);
178178
}
179179

180180
@Override
181181
protected Term subtract(Term pParam1, Term pParam2) {
182-
return solver.mkTerm(Kind.BITVECTOR_SUB, pParam1, pParam2);
182+
return termManager.mkTerm(Kind.BITVECTOR_SUB, pParam1, pParam2);
183183
}
184184

185185
@Override
186186
protected Term divide(Term pParam1, Term pParam2, boolean signed) {
187187
if (signed) {
188-
return solver.mkTerm(Kind.BITVECTOR_SDIV, pParam1, pParam2);
188+
return termManager.mkTerm(Kind.BITVECTOR_SDIV, pParam1, pParam2);
189189
} else {
190-
return solver.mkTerm(Kind.BITVECTOR_UDIV, pParam1, pParam2);
190+
return termManager.mkTerm(Kind.BITVECTOR_UDIV, pParam1, pParam2);
191191
}
192192
}
193193

194194
@Override
195195
protected Term remainder(Term pParam1, Term pParam2, boolean signed) {
196196
if (signed) {
197-
return solver.mkTerm(Kind.BITVECTOR_SREM, pParam1, pParam2);
197+
return termManager.mkTerm(Kind.BITVECTOR_SREM, pParam1, pParam2);
198198
} else {
199-
return solver.mkTerm(Kind.BITVECTOR_UREM, pParam1, pParam2);
199+
return termManager.mkTerm(Kind.BITVECTOR_UREM, pParam1, pParam2);
200200
}
201201
}
202202

203203
@Override
204204
protected Term smodulo(Term pParam1, Term pParam2) {
205-
return solver.mkTerm(Kind.BITVECTOR_SMOD, pParam1, pParam2);
205+
return termManager.mkTerm(Kind.BITVECTOR_SMOD, pParam1, pParam2);
206206
}
207207

208208
@Override
209209
protected Term multiply(Term pParam1, Term pParam2) {
210-
return solver.mkTerm(Kind.BITVECTOR_MULT, pParam1, pParam2);
210+
return termManager.mkTerm(Kind.BITVECTOR_MULT, pParam1, pParam2);
211211
}
212212

213213
@Override
214214
protected Term equal(Term pParam1, Term pParam2) {
215-
return solver.mkTerm(Kind.EQUAL, pParam1, pParam2);
215+
return termManager.mkTerm(Kind.EQUAL, pParam1, pParam2);
216216
}
217217

218218
@Override
219219
protected Term lessThan(Term pParam1, Term pParam2, boolean signed) {
220220
if (signed) {
221-
return solver.mkTerm(Kind.BITVECTOR_SLT, pParam1, pParam2);
221+
return termManager.mkTerm(Kind.BITVECTOR_SLT, pParam1, pParam2);
222222
} else {
223-
return solver.mkTerm(Kind.BITVECTOR_ULT, pParam1, pParam2);
223+
return termManager.mkTerm(Kind.BITVECTOR_ULT, pParam1, pParam2);
224224
}
225225
}
226226

227227
@Override
228228
protected Term lessOrEquals(Term pParam1, Term pParam2, boolean signed) {
229229
if (signed) {
230-
return solver.mkTerm(Kind.BITVECTOR_SLE, pParam1, pParam2);
230+
return termManager.mkTerm(Kind.BITVECTOR_SLE, pParam1, pParam2);
231231
} else {
232-
return solver.mkTerm(Kind.BITVECTOR_ULE, pParam1, pParam2);
232+
return termManager.mkTerm(Kind.BITVECTOR_ULE, pParam1, pParam2);
233233
}
234234
}
235235

236236
@Override
237237
protected Term greaterThan(Term pParam1, Term pParam2, boolean signed) {
238238
if (signed) {
239-
return solver.mkTerm(Kind.BITVECTOR_SGT, pParam1, pParam2);
239+
return termManager.mkTerm(Kind.BITVECTOR_SGT, pParam1, pParam2);
240240
} else {
241-
return solver.mkTerm(Kind.BITVECTOR_UGT, pParam1, pParam2);
241+
return termManager.mkTerm(Kind.BITVECTOR_UGT, pParam1, pParam2);
242242
}
243243
}
244244

245245
@Override
246246
protected Term greaterOrEquals(Term pParam1, Term pParam2, boolean signed) {
247247
if (signed) {
248-
return solver.mkTerm(Kind.BITVECTOR_SGE, pParam1, pParam2);
248+
return termManager.mkTerm(Kind.BITVECTOR_SGE, pParam1, pParam2);
249249
} else {
250-
return solver.mkTerm(Kind.BITVECTOR_UGE, pParam1, pParam2);
250+
return termManager.mkTerm(Kind.BITVECTOR_UGE, pParam1, pParam2);
251251
}
252252
}
253253

254254
@Override
255255
protected Term makeBitvectorImpl(int pLength, Term pParam1) {
256256
try {
257-
Op length = solver.mkOp(Kind.INT_TO_BITVECTOR, pLength);
258-
return solver.mkTerm(length, pParam1);
257+
Op length = termManager.mkOp(Kind.INT_TO_BITVECTOR, pLength);
258+
return termManager.mkTerm(length, pParam1);
259259
} catch (CVC5ApiException e) {
260260
throw new IllegalArgumentException(
261261
"You tried creating a invalid bitvector out of a integer term "
@@ -269,7 +269,7 @@ protected Term makeBitvectorImpl(int pLength, Term pParam1) {
269269

270270
@Override
271271
protected Term toIntegerFormulaImpl(Term pBv, boolean pSigned) {
272-
Term intExpr = solver.mkTerm(Kind.BITVECTOR_TO_NAT, pBv);
272+
Term intExpr = termManager.mkTerm(Kind.BITVECTOR_TO_NAT, pBv);
273273

274274
// CVC5 returns unsigned int by default
275275
if (pSigned && pBv.getSort().isBitVector()) {
@@ -280,14 +280,14 @@ protected Term toIntegerFormulaImpl(Term pBv, boolean pSigned) {
280280
final int size = Math.toIntExact(pBv.getSort().getBitVectorSize());
281281
final BigInteger modulo = BigInteger.ONE.shiftLeft(size);
282282
final BigInteger maxInt = BigInteger.ONE.shiftLeft(size - 1).subtract(BigInteger.ONE);
283-
final Term moduloExpr = solver.mkInteger(modulo.longValue());
284-
final Term maxIntExpr = solver.mkInteger(maxInt.longValue());
283+
final Term moduloExpr = termManager.mkInteger(modulo.longValue());
284+
final Term maxIntExpr = termManager.mkInteger(maxInt.longValue());
285285

286286
intExpr =
287-
solver.mkTerm(
287+
termManager.mkTerm(
288288
Kind.ITE,
289-
solver.mkTerm(Kind.GT, intExpr, maxIntExpr),
290-
solver.mkTerm(Kind.SUB, intExpr, moduloExpr),
289+
termManager.mkTerm(Kind.GT, intExpr, maxIntExpr),
290+
termManager.mkTerm(Kind.SUB, intExpr, moduloExpr),
291291
intExpr);
292292
}
293293

@@ -296,6 +296,6 @@ protected Term toIntegerFormulaImpl(Term pBv, boolean pSigned) {
296296

297297
@Override
298298
protected Term distinctImpl(List<Term> pParam) {
299-
return solver.mkTerm(Kind.DISTINCT, pParam.toArray(new Term[0]));
299+
return termManager.mkTerm(Kind.DISTINCT, pParam.toArray(new Term[0]));
300300
}
301301
}

0 commit comments

Comments
 (0)