Skip to content

Commit c1d9942

Browse files
conp-solutionstautschnig
authored andcommitted
Add support for MergeSat
MergeSat is a recent SAT solver that fits the MiniSat2 interface. To use MergeSat as a proper SAT backend, some extensions might be dropped. Especially being able to print memory usage is not helpful for CBMC, but requires pulling in a new dependency. Signed-off-by: Norbert Manthey <[email protected]>
1 parent a5ce4e5 commit c1d9942

File tree

5 files changed

+82
-8
lines changed

5 files changed

+82
-8
lines changed

src/Makefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ minisat2-download:
139139
@(cd ../minisat-2.2.1; patch -p1 < ../scripts/minisat-2.2.1-patch)
140140
@rm minisat2_2.2.1.orig.tar.gz
141141

142+
mergesat_version = 4.0-rc
143+
mergesat-download:
144+
@echo "Downloading MergeSat $(mergesat_version)"
145+
@$(DOWNLOADER) https://github.com/conp-solutions/mergesat/archive/$(mergesat_version).tar.gz
146+
@$(TAR) xfz $(mergesat_version).tar.gz
147+
@rm -Rf ../mergesat
148+
@mv mergesat-$(mergesat_version) ../mergesat
149+
@$(RM) $(mergesat_version).tar.gz
150+
142151
cudd-download:
143152
@echo "Downloading Cudd 3.0.0"
144153
@$(DOWNLOADER) https://sourceforge.net/projects/cudd-mirror/files/cudd-3.0.0.tar.gz/download cudd-3.0.0.tar.gz

src/config.inc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ endif
3030
#BOOLEFORCE = ../../booleforce-0.4
3131
#MINISAT = ../../MiniSat-p_v1.14
3232
#MINISAT2 = ../../minisat-2.2.1
33+
#MERGESAT = ../../mergesat-3.0
3334
#IPASIR = ../../ipasir
3435
#GLUCOSE = ../../glucose-syrup
3536
#CADICAL = ../../cadical
3637

3738
# select default solver to be minisat2 if no other is specified
38-
ifeq ($(BOOLEFORCE)$(CHAFF)$(GLUCOSE)$(IPASIR)$(LINGELING)$(MINISAT)$(MINISAT2)$(PICOSAT)$(CADICAL),)
39+
ifeq ($(BOOLEFORCE)$(CHAFF)$(GLUCOSE)$(IPASIR)$(LINGELING)$(MINISAT)$(MINISAT2)$(MERGESAT)$(PICOSAT)$(CADICAL),)
3940
MINISAT2 = ../../minisat-2.2.1
4041
endif
4142

@@ -63,6 +64,10 @@ ifneq ($(MINISAT2),)
6364
CP_CXXFLAGS += -DSATCHECK_MINISAT2
6465
endif
6566

67+
ifneq ($(MERGESAT),)
68+
CP_CXXFLAGS += -DSATCHECK_MERGESAT
69+
endif
70+
6671
ifneq ($(GLUCOSE),)
6772
CP_CXXFLAGS += -DSATCHECK_GLUCOSE
6873
endif

src/solvers/Makefile

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ ifneq ($(MINISAT2),)
2222
CLEANFILES += $(MINISAT2_LIB) $(patsubst %$(OBJEXT), %$(DEPEXT), $(MINISAT2_LIB))
2323
endif
2424

25+
ifneq ($(MERGESAT),)
26+
# MergeSat is based on MiniSat2 and is invoked (with suitable defines/ifdefs)
27+
# via satcheck_minisat2.{h,cpp}
28+
MERGESAT_SRC=sat/satcheck_minisat2.cpp
29+
MERGESAT_INCLUDE=-I $(MERGESAT)
30+
MERGESAT_LIB=$(MERGESAT)/minisat/simp/SimpSolver$(OBJEXT) $(MERGESAT)/minisat/core/Solver$(OBJEXT) $(MERGESAT)/minisat/utils/ccnr$(OBJEXT) $(MERGESAT)/minisat/utils/Options$(OBJEXT) $(MERGESAT)/minisat/utils/System$(OBJEXT)
31+
CP_CXXFLAGS += -DHAVE_MERGESAT -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
32+
CLEANFILES += $(MERGESAT_LIB) $(patsubst %$(OBJEXT), %$(DEPEXT), $(MERGESAT_LIB))
33+
endif
34+
2535
ifneq ($(IPASIR),)
2636
IPASIR_SRC=sat/satcheck_ipasir.cpp
2737
IPASIR_INCLUDE=-I $(IPASIR)
@@ -74,6 +84,7 @@ SRC = $(BOOLEFORCE_SRC) \
7484
$(GLUCOSE_SRC) \
7585
$(LINGELING_SRC) \
7686
$(MINISAT2_SRC) \
87+
$(MERGESAT_SRC) \
7788
$(IPASIR_SRC) \
7889
$(MINISAT_SRC) \
7990
$(PICOSAT_SRC) \
@@ -226,6 +237,28 @@ $(MINISAT2)/minisat/core/Solver$(OBJEXT): $(MINISAT2)/minisat/core/Solver.cc
226237
endif
227238
endif
228239

240+
ifneq ($(MERGESAT),)
241+
ifeq ($(BUILD_ENV_),MSVC)
242+
sat/satcheck_minisat2$(OBJEXT): sat/satcheck_minisat2.cpp
243+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
244+
245+
$(MERGESAT)/minisat/utils/ccnr$(OBJEXT): $(MERGESAT)/minisat/utils/ccnr.cc
246+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
247+
248+
$(MERGESAT)/minisat/utils/Options$(OBJEXT): $(MERGESAT)/minisat/utils/Options.cc
249+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
250+
251+
$(MERGESAT)/minisat/utils/System$(OBJEXT): $(MERGESAT)/minisat/utils/System.cc
252+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
253+
254+
$(MERGESAT)/minisat/simp/SimpSolver$(OBJEXT): $(MERGESAT)/minisat/simp/SimpSolver.cc
255+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
256+
257+
$(MERGESAT)/minisat/core/Solver$(OBJEXT): $(MERGESAT)/minisat/core/Solver.cc
258+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
259+
endif
260+
endif
261+
229262
ifneq ($(GLUCOSE),)
230263
ifeq ($(BUILD_ENV_),MSVC)
231264
sat/satcheck_glucose$(OBJEXT): sat/satcheck_glucose.cpp
@@ -241,6 +274,7 @@ endif
241274

242275
INCLUDES += -I .. \
243276
$(CHAFF_INCLUDE) $(BOOLEFORCE_INCLUDE) $(MINISAT_INCLUDE) $(MINISAT2_INCLUDE) \
277+
$(MERGESAT_INCLUDE) \
244278
$(IPASIR_INCLUDE) \
245279
$(SQUOLEM2_INC) $(CUDD_INCLUDE) $(GLUCOSE_INCLUDE) \
246280
$(PICOSAT_INCLUDE) $(LINGELING_INCLUDE) $(CADICAL_INCLUDE)
@@ -259,7 +293,7 @@ endif
259293
endif
260294

261295
SOLVER_LIB = $(CHAFF_LIB) $(BOOLEFORCE_LIB) $(MINISAT_LIB) \
262-
$(MINISAT2_LIB) $(SQUOLEM2_LIB) $(CUDD_LIB) \
296+
$(MINISAT2_LIB) $(MERGESAT_LIB) $(SQUOLEM2_LIB) $(CUDD_LIB) \
263297
$(PICOSAT_LIB) $(LINGELING_LIB) $(GLUCOSE_LIB) $(CADICAL_LIB)
264298

265299
SOLVER_OBJS = $(filter %$(OBJEXT), $(SOLVER_LIB))

src/solvers/sat/satcheck.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
// #define SATCHECK_ZCHAFF
1818
// #define SATCHECK_MINISAT1
1919
// #define SATCHECK_MINISAT2
20+
// #define SATCHECK_MERGESAT
2021
// #define SATCHECK_GLUCOSE
2122
// #define SATCHECK_BOOLEFORCE
2223
// #define SATCHECK_PICOSAT
@@ -39,6 +40,10 @@ Author: Daniel Kroening, [email protected]
3940
#define SATCHECK_MINISAT2
4041
#endif
4142

43+
#if defined(HAVE_MERGESAT) && !defined(SATCHECK_MERGESAT)
44+
# define SATCHECK_MERGESAT
45+
#endif
46+
4247
#if defined(HAVE_GLUCOSE) && !defined(SATCHECK_GLUCOSE)
4348
#define SATCHECK_GLUCOSE
4449
#endif
@@ -80,9 +85,11 @@ typedef satcheck_booleforcet satcheck_no_simplifiert;
8085
typedef satcheck_minisat1t satcheckt;
8186
typedef satcheck_minisat1t satcheck_no_simplifiert;
8287

83-
#elif defined SATCHECK_MINISAT2
88+
#elif defined SATCHECK_MINISAT2 || defined SATCHECK_MERGESAT
89+
// MergeSat is based on MiniSat2 and is invoked (with suitable defines/ifdefs)
90+
// via satcheck_minisat2.{h,cpp}
8491

85-
#include "satcheck_minisat2.h"
92+
# include "satcheck_minisat2.h"
8693

8794
typedef satcheck_minisat_simplifiert satcheckt;
8895
typedef satcheck_minisat_no_simplifiert satcheck_no_simplifiert;

src/solvers/sat/satcheck_minisat2.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,20 @@ Author: Daniel Kroening, [email protected]
1313
# include <unistd.h>
1414
#endif
1515

16-
#include <limits>
17-
1816
#include <util/invariant.h>
1917
#include <util/make_unique.h>
2018
#include <util/threeval.h>
2119

2220
#include <minisat/core/Solver.h>
2321
#include <minisat/simp/SimpSolver.h>
2422

25-
#ifndef HAVE_MINISAT2
26-
#error "Expected HAVE_MINISAT2"
23+
#include <cstdlib>
24+
#include <limits>
25+
26+
// MergeSat is based on MiniSat2; variations in their API are handled via
27+
// #ifdefs
28+
#if !defined(HAVE_MINISAT2) && !defined(HAVE_MERGESAT)
29+
# error "Expected HAVE_MINISAT2 or HAVE_MERGESAT"
2730
#endif
2831

2932
void convert(const bvt &bv, Minisat::vec<Minisat::Lit> &dest)
@@ -77,7 +80,11 @@ void satcheck_minisat2_baset<T>::set_polarity(literalt a, bool value)
7780
try
7881
{
7982
add_variables();
83+
#ifdef HAVE_MERGESAT
84+
solver->setPolarity(a.var_no(), value);
85+
#else
8086
solver->setPolarity(a.var_no(), value ? l_True : l_False);
87+
#endif
8188
}
8289
catch(Minisat::OutOfMemoryException)
8390
{
@@ -101,12 +108,20 @@ void satcheck_minisat2_baset<T>::clear_interrupt()
101108

102109
const std::string satcheck_minisat_no_simplifiert::solver_text()
103110
{
111+
#ifdef HAVE_MERGESAT
112+
return "MergeSat 4.0-rc without simplifier";
113+
#else
104114
return "MiniSAT 2.2.1 without simplifier";
115+
#endif
105116
}
106117

107118
const std::string satcheck_minisat_simplifiert::solver_text()
108119
{
120+
#ifdef HAVE_MERGESAT
121+
return "MergeSat 4.0-rc with simplifier";
122+
#else
109123
return "MiniSAT 2.2.1 with simplifier";
124+
#endif
110125
}
111126

112127
template<typename T>
@@ -314,6 +329,10 @@ satcheck_minisat2_baset<T>::satcheck_minisat2_baset(
314329
solver(util_make_unique<T>()),
315330
time_limit_seconds(0)
316331
{
332+
#ifdef HAVE_MERGESAT
333+
int ret = setenv(MINISAT_RUNTIME_ARGS, "-no-grow-iter", 0);
334+
CHECK_RETURN(ret == 0);
335+
#endif
317336
}
318337

319338
template <typename T>

0 commit comments

Comments
 (0)