File tree 5 files changed +57
-3
lines changed
src/solvers/smt2_incremental
unit/solvers/smt2_incremental 5 files changed +57
-3
lines changed Original file line number Diff line number Diff line change @@ -154,9 +154,9 @@ static smt_termt convert_expr_to_smt(const bitnot_exprt &bitwise_not)
154
154
155
155
static smt_termt convert_expr_to_smt (const unary_minus_exprt &unary_minus)
156
156
{
157
- UNIMPLEMENTED_FEATURE (
158
- " Generation of SMT formula for unary minus expression: " +
159
- unary_minus.pretty ( ));
157
+ PRECONDITION (can_cast_type<bitvector_typet>(unary_minus. op (). type ()));
158
+ return smt_bit_vector_theoryt::negation (
159
+ convert_expr_to_smt ( unary_minus.op () ));
160
160
}
161
161
162
162
static smt_termt convert_expr_to_smt (const unary_plus_exprt &unary_plus)
Original file line number Diff line number Diff line change @@ -169,3 +169,22 @@ void smt_bit_vector_theoryt::remaindert::validate(
169
169
const smt_function_application_termt::factoryt<
170
170
smt_bit_vector_theoryt::remaindert>
171
171
smt_bit_vector_theoryt::remainder{};
172
+
173
+ const char *smt_bit_vector_theoryt::negationt::identifier ()
174
+ {
175
+ return " bvneg" ;
176
+ }
177
+
178
+ smt_sortt
179
+ smt_bit_vector_theoryt::negationt::return_sort (const smt_termt &operand)
180
+ {
181
+ return operand.get_sort ();
182
+ }
183
+
184
+ void smt_bit_vector_theoryt::negationt::validate (const smt_termt &operand)
185
+ {
186
+ }
187
+
188
+ const smt_function_application_termt::factoryt<
189
+ smt_bit_vector_theoryt::negationt>
190
+ smt_bit_vector_theoryt::negation{};
Original file line number Diff line number Diff line change @@ -62,6 +62,14 @@ class smt_bit_vector_theoryt
62
62
static void validate (const smt_termt &lhs, const smt_termt &rhs);
63
63
};
64
64
static const smt_function_application_termt::factoryt<remaindert> remainder;
65
+
66
+ struct negationt final
67
+ {
68
+ static const char *identifier ();
69
+ static smt_sortt return_sort (const smt_termt &operand);
70
+ static void validate (const smt_termt &operand);
71
+ };
72
+ static const smt_function_application_termt::factoryt<negationt> negation;
65
73
};
66
74
67
75
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_BIT_VECTOR_THEORY_H
Original file line number Diff line number Diff line change @@ -376,4 +376,20 @@ TEST_CASE(
376
376
const cbmc_invariants_should_throwt invariants_throw;
377
377
REQUIRE_THROWS (convert_expr_to_smt (mod_exprt{one_bvint, false_exprt{}}));
378
378
}
379
+
380
+ SECTION (" Unary minus of constant size bit-vector" )
381
+ {
382
+ const auto constructed_term =
383
+ convert_expr_to_smt (unary_minus_exprt{one_bvint});
384
+ const auto expected_term = smt_bit_vector_theoryt::negation (smt_term_one);
385
+ CHECK (constructed_term == expected_term);
386
+ }
387
+
388
+ SECTION (
389
+ " Ensure that unary minus node conversion fails if the operand is not a "
390
+ " bit-vector" )
391
+ {
392
+ const cbmc_invariants_should_throwt invariants_throw;
393
+ REQUIRE_THROWS (convert_expr_to_smt (unary_minus_exprt{true_exprt{}}));
394
+ }
379
395
}
Original file line number Diff line number Diff line change @@ -245,4 +245,15 @@ TEST_CASE(
245
245
REQUIRE (function_application.arguments ()[0 ].get () == two);
246
246
REQUIRE (function_application.arguments ()[1 ].get () == three);
247
247
}
248
+
249
+ SECTION (" Unary Minus" )
250
+ {
251
+ const auto function_application = smt_bit_vector_theoryt::negation (two);
252
+ REQUIRE (
253
+ function_application.function_identifier () ==
254
+ smt_identifier_termt (" bvneg" , smt_bit_vector_sortt{8 }));
255
+ REQUIRE (function_application.get_sort () == smt_bit_vector_sortt{8 });
256
+ REQUIRE (function_application.arguments ().size () == 1 );
257
+ REQUIRE (function_application.arguments ()[0 ].get () == two);
258
+ }
248
259
}
You can’t perform that action at this time.
0 commit comments