Skip to content

Commit 0832c09

Browse files
committed
Add CaDiCaL support to CMake
Add CMake configuration to build using CaDiCaL, which was already supported with Makefiles. Also bump the version of CaDiCaL to sr19 and fix the use of the cnf_solvert interface.
1 parent 21574d6 commit 0832c09

File tree

8 files changed

+68
-23
lines changed

8 files changed

+68
-23
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ endif()
3333
set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled")
3434

3535
set(sat_impl "minisat2" CACHE STRING
36-
"This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'"
36+
"This setting controls the SAT library which is used. Valid values are
37+
'minisat2', 'glucose', or 'cadical'"
3738
)
3839

3940
if(${enable_cbmc_tests})

jbmc/lib/java-models-library

scripts/cadical-patch

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,12 @@ glucose-download:
149149
@(cd ../glucose-syrup; patch -p1 < ../scripts/glucose-syrup-patch)
150150
@rm glucose-syrup.tgz
151151

152-
cadical_release = rel-06w
152+
cadical_release = sr19
153153
cadical-download:
154154
@echo "Downloading CaDiCaL $(cadical_release)"
155155
@curl -L https://github.com/arminbiere/cadical/archive/$(cadical_release).tar.gz | tar xz
156156
@rm -Rf ../cadical
157157
@mv cadical-$(cadical_release) ../cadical
158-
@(cd ../cadical; patch -p1 < ../scripts/cadical-patch)
159158
@cd ../cadical && CXX=$(CXX) CXXFLAGS=-O3 ./configure --debug && make
160159

161160
doc :

src/solvers/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,36 @@ elseif("${sat_impl}" STREQUAL "glucose")
9898
target_sources(solvers PRIVATE ${glucose_source})
9999

100100
target_link_libraries(solvers glucose-condensed)
101+
elseif("${sat_impl}" STREQUAL "cadical")
102+
message(STATUS "Building solvers with cadical")
103+
104+
download_project(PROJ cadical
105+
URL https://github.com/arminbiere/cadical/archive/sr19.tar.gz
106+
PATCH_COMMAND true
107+
COMMAND CXX=${CXX_COMPILER} CXXFLAGS=-O3 ./configure --debug
108+
URL_MD5 dd9b7c7b88aa769985993e33fbfdfb35
109+
)
110+
111+
message(STATUS "Building CaDiCaL")
112+
execute_process(COMMAND make WORKING_DIRECTORY ${cadical_SOURCE_DIR})
113+
114+
target_compile_definitions(solvers PUBLIC
115+
SATCHECK_CADICAL HAVE_CADICAL
116+
)
117+
118+
add_library(cadical STATIC IMPORTED)
119+
120+
set_target_properties(
121+
cadical
122+
PROPERTIES IMPORTED_LOCATION ${cadical_SOURCE_DIR}/build/libcadical.a
123+
)
124+
125+
target_include_directories(solvers
126+
PUBLIC
127+
${cadical_SOURCE_DIR}/src
128+
)
129+
130+
target_link_libraries(solvers cadical)
101131
endif()
102132

103133
if(CMAKE_USE_CUDD)

src/solvers/sat/satcheck_cadical.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ tvt satcheck_cadicalt::l_get(literalt a) const
2323

2424
tvt result;
2525

26-
if(a.var_no() > static_cast<unsigned>(solver->max()))
26+
if(a.var_no() > static_cast<unsigned>(solver->vars()))
2727
return tvt(tvt::tv_enumt::TV_UNKNOWN);
2828

2929
const int val = solver->val(a.dimacs());
@@ -79,6 +79,21 @@ propt::resultt satcheck_cadicalt::do_prop_solve()
7979
}
8080
else
8181
{
82+
// if assumptions contains false, we need this to be UNSAT
83+
for(const auto &a : assumptions)
84+
{
85+
if(a.is_false())
86+
{
87+
log.status() << "got FALSE as assumption: instance is UNSATISFIABLE"
88+
<< messaget::eom;
89+
status = statust::UNSAT;
90+
return resultt::P_UNSATISFIABLE;
91+
}
92+
}
93+
94+
for(const auto &a : assumptions)
95+
solver->assume(a.dimacs());
96+
8297
switch(solver->solve())
8398
{
8499
case 10:
@@ -107,8 +122,8 @@ void satcheck_cadicalt::set_assignment(literalt a, bool value)
107122
INVARIANT(false, "method not supported");
108123
}
109124

110-
satcheck_cadicalt::satcheck_cadicalt() :
111-
solver(new CaDiCaL::Solver())
125+
satcheck_cadicalt::satcheck_cadicalt(message_handlert &message_handler)
126+
: cnf_solvert(message_handler), solver(new CaDiCaL::Solver())
112127
{
113128
solver->set("quiet", 1);
114129
}
@@ -120,13 +135,20 @@ satcheck_cadicalt::~satcheck_cadicalt()
120135

121136
void satcheck_cadicalt::set_assumptions(const bvt &bv)
122137
{
123-
INVARIANT(false, "method not supported");
138+
// We filter out 'true' assumptions which cause spurious results with CaDiCaL.
139+
assumptions.clear();
140+
for(const auto &assumption : bv)
141+
{
142+
if(!assumption.is_true())
143+
{
144+
assumptions.push_back(assumption);
145+
}
146+
}
124147
}
125148

126149
bool satcheck_cadicalt::is_in_conflict(literalt a) const
127150
{
128-
INVARIANT(false, "method not supported");
129-
return false;
151+
return solver->failed(a.dimacs());
130152
}
131153

132154
#endif

src/solvers/sat/satcheck_cadical.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace CaDiCaL // NOLINT(readability/namespace)
2020
class satcheck_cadicalt:public cnf_solvert
2121
{
2222
public:
23-
satcheck_cadicalt();
23+
explicit satcheck_cadicalt(message_handlert &message_handler);
2424
virtual ~satcheck_cadicalt();
2525

2626
const std::string solver_text() override;
@@ -32,11 +32,11 @@ class satcheck_cadicalt:public cnf_solvert
3232
void set_assumptions(const bvt &_assumptions) override;
3333
bool has_set_assumptions() const override
3434
{
35-
return false;
35+
return true;
3636
}
3737
bool has_is_in_conflict() const override
3838
{
39-
return false;
39+
return true;
4040
}
4141
bool is_in_conflict(literalt a) const override;
4242

@@ -45,6 +45,8 @@ class satcheck_cadicalt:public cnf_solvert
4545

4646
// NOLINTNEXTLINE(readability/identifiers)
4747
CaDiCaL::Solver * solver;
48+
49+
bvt assumptions;
4850
};
4951

5052
#endif // CPROVER_SOLVERS_SAT_SATCHECK_CADICAL_H

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ SRC += analyses/ai/ai.cpp \
4545
solvers/floatbv/float_utils.cpp \
4646
solvers/lowering/byte_operators.cpp \
4747
solvers/prop/bdd_expr.cpp \
48+
solvers/sat/satcheck_cadical.cpp \
4849
solvers/sat/satcheck_minisat2.cpp \
4950
solvers/strings/array_pool/array_pool.cpp \
5051
solvers/strings/string_constraint_generator_valueof/calculate_max_string_length.cpp \

0 commit comments

Comments
 (0)