11
11
import io .github .cvc5 .CVC5ApiException ;
12
12
import io .github .cvc5 .Kind ;
13
13
import io .github .cvc5 .Op ;
14
- import io .github .cvc5 .Solver ;
15
14
import io .github .cvc5 .Sort ;
16
15
import io .github .cvc5 .Term ;
16
+ import io .github .cvc5 .TermManager ;
17
17
import java .math .BigInteger ;
18
18
import java .util .List ;
19
19
import org .sosy_lab .java_smt .basicimpl .AbstractBitvectorFormulaManager ;
20
20
21
21
public class CVC5BitvectorFormulaManager
22
- extends AbstractBitvectorFormulaManager <Term , Sort , Solver , Term > {
22
+ extends AbstractBitvectorFormulaManager <Term , Sort , TermManager , Term > {
23
23
24
- private final Solver solver ;
24
+ private final TermManager termManager ;
25
25
26
26
protected CVC5BitvectorFormulaManager (
27
27
CVC5FormulaCreator pCreator , CVC5BooleanFormulaManager pBmgr ) {
28
28
super (pCreator , pBmgr );
29
- solver = pCreator .getEnv ();
29
+ termManager = pCreator .getEnv ();
30
30
}
31
31
32
32
@ Override
33
33
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 );
35
35
}
36
36
37
37
@ Override
38
38
protected Term extract (Term pParam1 , int pMsb , int pLsb ) {
39
39
Op ext ;
40
40
try {
41
41
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 );
43
43
} else {
44
- ext = solver .mkOp (Kind .BITVECTOR_EXTRACT , pMsb , pLsb );
44
+ ext = termManager .mkOp (Kind .BITVECTOR_EXTRACT , pMsb , pLsb );
45
45
}
46
- return solver .mkTerm (ext , pParam1 );
46
+ return termManager .mkTerm (ext , pParam1 );
47
47
} catch (CVC5ApiException e ) {
48
48
throw new IllegalArgumentException (
49
49
"You tried creating a invalid bitvector extract from bit "
@@ -62,11 +62,11 @@ protected Term extend(Term pParam1, int pExtensionBits, boolean signed) {
62
62
final Op op ;
63
63
try {
64
64
if (signed ) {
65
- op = solver .mkOp (Kind .BITVECTOR_SIGN_EXTEND , pExtensionBits );
65
+ op = termManager .mkOp (Kind .BITVECTOR_SIGN_EXTEND , pExtensionBits );
66
66
} else {
67
- op = solver .mkOp (Kind .BITVECTOR_ZERO_EXTEND , pExtensionBits );
67
+ op = termManager .mkOp (Kind .BITVECTOR_ZERO_EXTEND , pExtensionBits );
68
68
}
69
- return solver .mkTerm (op , pParam1 );
69
+ return termManager .mkTerm (op , pParam1 );
70
70
} catch (CVC5ApiException e ) {
71
71
throw new IllegalArgumentException (
72
72
"You tried creating a invalid bitvector extend with term "
@@ -83,7 +83,7 @@ protected Term makeBitvectorImpl(int pLength, BigInteger pI) {
83
83
pI = transformValueToRange (pLength , pI );
84
84
try {
85
85
// 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 );
87
87
} catch (CVC5ApiException e ) {
88
88
throw new IllegalArgumentException (
89
89
"You tried creating a invalid bitvector with length "
@@ -98,7 +98,7 @@ protected Term makeBitvectorImpl(int pLength, BigInteger pI) {
98
98
@ Override
99
99
protected Term makeVariableImpl (int length , String varName ) {
100
100
try {
101
- Sort type = solver .mkBitVectorSort (length );
101
+ Sort type = termManager .mkBitVectorSort (length );
102
102
return getFormulaCreator ().makeVariable (type , varName );
103
103
} catch (CVC5ApiException e ) {
104
104
throw new IllegalArgumentException (
@@ -114,22 +114,22 @@ protected Term makeVariableImpl(int length, String varName) {
114
114
@ Override
115
115
protected Term shiftRight (Term pParam1 , Term pParam2 , boolean signed ) {
116
116
if (signed ) {
117
- return solver .mkTerm (Kind .BITVECTOR_ASHR , pParam1 , pParam2 );
117
+ return termManager .mkTerm (Kind .BITVECTOR_ASHR , pParam1 , pParam2 );
118
118
} else {
119
- return solver .mkTerm (Kind .BITVECTOR_LSHR , pParam1 , pParam2 );
119
+ return termManager .mkTerm (Kind .BITVECTOR_LSHR , pParam1 , pParam2 );
120
120
}
121
121
}
122
122
123
123
@ Override
124
124
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 );
126
126
}
127
127
128
128
@ Override
129
129
protected Term rotateLeftByConstant (Term pNumber , int pToRotate ) {
130
130
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 );
133
133
} catch (CVC5ApiException e ) {
134
134
throw new IllegalArgumentException (
135
135
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) {
139
139
@ Override
140
140
protected Term rotateRightByConstant (Term pNumber , int pToRotate ) {
141
141
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 );
144
144
} catch (CVC5ApiException e ) {
145
145
throw new IllegalArgumentException (
146
146
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) {
149
149
150
150
@ Override
151
151
protected Term not (Term pParam1 ) {
152
- return solver .mkTerm (Kind .BITVECTOR_NOT , pParam1 );
152
+ return termManager .mkTerm (Kind .BITVECTOR_NOT , pParam1 );
153
153
}
154
154
155
155
@ Override
156
156
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 );
158
158
}
159
159
160
160
@ Override
161
161
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 );
163
163
}
164
164
165
165
@ Override
166
166
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 );
168
168
}
169
169
170
170
@ Override
171
171
protected Term negate (Term pParam1 ) {
172
- return solver .mkTerm (Kind .BITVECTOR_NEG , pParam1 );
172
+ return termManager .mkTerm (Kind .BITVECTOR_NEG , pParam1 );
173
173
}
174
174
175
175
@ Override
176
176
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 );
178
178
}
179
179
180
180
@ Override
181
181
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 );
183
183
}
184
184
185
185
@ Override
186
186
protected Term divide (Term pParam1 , Term pParam2 , boolean signed ) {
187
187
if (signed ) {
188
- return solver .mkTerm (Kind .BITVECTOR_SDIV , pParam1 , pParam2 );
188
+ return termManager .mkTerm (Kind .BITVECTOR_SDIV , pParam1 , pParam2 );
189
189
} else {
190
- return solver .mkTerm (Kind .BITVECTOR_UDIV , pParam1 , pParam2 );
190
+ return termManager .mkTerm (Kind .BITVECTOR_UDIV , pParam1 , pParam2 );
191
191
}
192
192
}
193
193
194
194
@ Override
195
195
protected Term remainder (Term pParam1 , Term pParam2 , boolean signed ) {
196
196
if (signed ) {
197
- return solver .mkTerm (Kind .BITVECTOR_SREM , pParam1 , pParam2 );
197
+ return termManager .mkTerm (Kind .BITVECTOR_SREM , pParam1 , pParam2 );
198
198
} else {
199
- return solver .mkTerm (Kind .BITVECTOR_UREM , pParam1 , pParam2 );
199
+ return termManager .mkTerm (Kind .BITVECTOR_UREM , pParam1 , pParam2 );
200
200
}
201
201
}
202
202
203
203
@ Override
204
204
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 );
206
206
}
207
207
208
208
@ Override
209
209
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 );
211
211
}
212
212
213
213
@ Override
214
214
protected Term equal (Term pParam1 , Term pParam2 ) {
215
- return solver .mkTerm (Kind .EQUAL , pParam1 , pParam2 );
215
+ return termManager .mkTerm (Kind .EQUAL , pParam1 , pParam2 );
216
216
}
217
217
218
218
@ Override
219
219
protected Term lessThan (Term pParam1 , Term pParam2 , boolean signed ) {
220
220
if (signed ) {
221
- return solver .mkTerm (Kind .BITVECTOR_SLT , pParam1 , pParam2 );
221
+ return termManager .mkTerm (Kind .BITVECTOR_SLT , pParam1 , pParam2 );
222
222
} else {
223
- return solver .mkTerm (Kind .BITVECTOR_ULT , pParam1 , pParam2 );
223
+ return termManager .mkTerm (Kind .BITVECTOR_ULT , pParam1 , pParam2 );
224
224
}
225
225
}
226
226
227
227
@ Override
228
228
protected Term lessOrEquals (Term pParam1 , Term pParam2 , boolean signed ) {
229
229
if (signed ) {
230
- return solver .mkTerm (Kind .BITVECTOR_SLE , pParam1 , pParam2 );
230
+ return termManager .mkTerm (Kind .BITVECTOR_SLE , pParam1 , pParam2 );
231
231
} else {
232
- return solver .mkTerm (Kind .BITVECTOR_ULE , pParam1 , pParam2 );
232
+ return termManager .mkTerm (Kind .BITVECTOR_ULE , pParam1 , pParam2 );
233
233
}
234
234
}
235
235
236
236
@ Override
237
237
protected Term greaterThan (Term pParam1 , Term pParam2 , boolean signed ) {
238
238
if (signed ) {
239
- return solver .mkTerm (Kind .BITVECTOR_SGT , pParam1 , pParam2 );
239
+ return termManager .mkTerm (Kind .BITVECTOR_SGT , pParam1 , pParam2 );
240
240
} else {
241
- return solver .mkTerm (Kind .BITVECTOR_UGT , pParam1 , pParam2 );
241
+ return termManager .mkTerm (Kind .BITVECTOR_UGT , pParam1 , pParam2 );
242
242
}
243
243
}
244
244
245
245
@ Override
246
246
protected Term greaterOrEquals (Term pParam1 , Term pParam2 , boolean signed ) {
247
247
if (signed ) {
248
- return solver .mkTerm (Kind .BITVECTOR_SGE , pParam1 , pParam2 );
248
+ return termManager .mkTerm (Kind .BITVECTOR_SGE , pParam1 , pParam2 );
249
249
} else {
250
- return solver .mkTerm (Kind .BITVECTOR_UGE , pParam1 , pParam2 );
250
+ return termManager .mkTerm (Kind .BITVECTOR_UGE , pParam1 , pParam2 );
251
251
}
252
252
}
253
253
254
254
@ Override
255
255
protected Term makeBitvectorImpl (int pLength , Term pParam1 ) {
256
256
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 );
259
259
} catch (CVC5ApiException e ) {
260
260
throw new IllegalArgumentException (
261
261
"You tried creating a invalid bitvector out of a integer term "
@@ -269,7 +269,7 @@ protected Term makeBitvectorImpl(int pLength, Term pParam1) {
269
269
270
270
@ Override
271
271
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 );
273
273
274
274
// CVC5 returns unsigned int by default
275
275
if (pSigned && pBv .getSort ().isBitVector ()) {
@@ -280,14 +280,14 @@ protected Term toIntegerFormulaImpl(Term pBv, boolean pSigned) {
280
280
final int size = Math .toIntExact (pBv .getSort ().getBitVectorSize ());
281
281
final BigInteger modulo = BigInteger .ONE .shiftLeft (size );
282
282
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 ());
285
285
286
286
intExpr =
287
- solver .mkTerm (
287
+ termManager .mkTerm (
288
288
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 ),
291
291
intExpr );
292
292
}
293
293
@@ -296,6 +296,6 @@ protected Term toIntegerFormulaImpl(Term pBv, boolean pSigned) {
296
296
297
297
@ Override
298
298
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 ]));
300
300
}
301
301
}
0 commit comments