Skip to content

Commit bb4f9b7

Browse files
committed
Add SMT bit vector comparison operation
1 parent c558465 commit bb4f9b7

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

src/solvers/smt2_incremental/smt_bit_vector_theory.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,28 @@ void smt_bit_vector_theoryt::xnort::validate(
245245
const smt_function_application_termt::factoryt<smt_bit_vector_theoryt::xnort>
246246
smt_bit_vector_theoryt::xnor{};
247247

248+
const char *smt_bit_vector_theoryt::comparet::identifier()
249+
{
250+
return "bvcomp";
251+
}
252+
253+
smt_sortt smt_bit_vector_theoryt::comparet::return_sort(
254+
const smt_termt &lhs,
255+
const smt_termt &rhs)
256+
{
257+
return smt_bit_vector_sortt{1};
258+
}
259+
260+
void smt_bit_vector_theoryt::comparet::validate(
261+
const smt_termt &lhs,
262+
const smt_termt &rhs)
263+
{
264+
validate_matched_bit_vector_sorts(lhs, rhs);
265+
}
266+
267+
const smt_function_application_termt::factoryt<smt_bit_vector_theoryt::comparet>
268+
smt_bit_vector_theoryt::compare{};
269+
248270
// Relational operator definitions
249271

250272
const char *smt_bit_vector_theoryt::unsigned_less_thant::identifier()

src/solvers/smt2_incremental/smt_bit_vector_theory.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ class smt_bit_vector_theoryt
8585
};
8686
static const smt_function_application_termt::factoryt<xnort> xnor;
8787

88+
struct comparet final
89+
{
90+
static const char *identifier();
91+
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs);
92+
static void validate(const smt_termt &lhs, const smt_termt &rhs);
93+
};
94+
static const smt_function_application_termt::factoryt<comparet> compare;
95+
8896
// Relational operator class declarations
8997
struct unsigned_less_thant final
9098
{

unit/solvers/smt2_incremental/smt_bit_vector_theory.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,32 @@ TEST_CASE("SMT bit vector bitwise operators", "[core][smt2_incremental]")
174174
}
175175
}
176176

177+
TEST_CASE("SMT bit vector comparison", "[core][smt2_incremental]")
178+
{
179+
const smt_bit_vector_constant_termt a_valid{42, 16}, b_valid{8, 16};
180+
SECTION("Valid operands")
181+
{
182+
const auto compare = smt_bit_vector_theoryt::compare(a_valid, b_valid);
183+
const auto expected_return_sort = smt_bit_vector_sortt{1};
184+
REQUIRE(
185+
compare.function_identifier() ==
186+
smt_identifier_termt("bvcomp", expected_return_sort));
187+
REQUIRE(compare.get_sort() == expected_return_sort);
188+
REQUIRE(compare.arguments().size() == 2);
189+
REQUIRE(compare.arguments()[0].get() == a_valid);
190+
REQUIRE(compare.arguments()[1].get() == b_valid);
191+
}
192+
SECTION("Invalid operands")
193+
{
194+
const smt_bool_literal_termt false_term{false};
195+
const smt_bool_literal_termt true_term{true};
196+
cbmc_invariants_should_throwt invariants_throw;
197+
CHECK_THROWS(smt_bit_vector_theoryt::compare(a_valid, false_term));
198+
CHECK_THROWS(smt_bit_vector_theoryt::compare(false_term, a_valid));
199+
CHECK_THROWS(smt_bit_vector_theoryt::compare(false_term, true_term));
200+
}
201+
}
202+
177203
TEST_CASE("SMT bit vector predicates", "[core][smt2_incremental]")
178204
{
179205
const smt_bit_vector_constant_termt two{2, 8};

0 commit comments

Comments
 (0)