File: btorminisat.cc

package info (click to toggle)
boolector 1.5.118.6b56be4.121013-1
  • links: PTS
  • area: main
  • in suites: bullseye, buster, jessie, jessie-kfreebsd, stretch
  • size: 2,220 kB
  • sloc: ansic: 47,665; sh: 422; cpp: 173; makefile: 155
file content (185 lines) | stat: -rw-r--r-- 4,899 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*  Boolector: Satisfiablity Modulo Theories (SMT) solver.  *
 *  Copyright (C) 2011-2012 Armin Biere.
 *
 *  All rights reserved.
 *
 *  This file is part of Boolector.
 *  See COPYING for more information on using this software.
 */

#ifdef BTOR_USE_MINISAT

#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS
#endif

#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif

#include "../minisat/minisat/simp/SimpSolver.h"

extern "C" {

#include "btorminisat.h"
#include "btorsat.h"

#include <cassert>
#include <cstring>
#include <cstdio>

using namespace Minisat;

class BtorMiniSAT : public SimpSolver {
  vec<Lit> assumptions, clause;
  int szfmap; 
  signed char * fmap;
  bool nomodel;
  Lit import (int lit) {
    assert (0 < abs (lit) && abs (lit) <= nVars ());
    return mkLit (Var (abs (lit) - 1), (lit < 0));
  }
  void reset () { if (fmap) delete [] fmap, fmap = 0, szfmap = 0; }
  void ana () {
    fmap = new signed char [szfmap = nVars ()];
    memset (fmap, 0, szfmap);
    for (int i = 0; i < conflict.size (); i++) {
      int tmp = var (conflict[i]);
      assert (0 <= tmp && tmp < szfmap);
      fmap[tmp] = 1;
    }
  }
public:
  BtorMiniSAT () : szfmap (0), fmap (0), nomodel (true) { }
  ~BtorMiniSAT () { reset (); }
  int inc () { 
    nomodel = true;
    int res = newVar ();
    assert (0 <= res && res == nVars () - 1);
    return res + 1;
  }
  void assume (int lit) { nomodel = true; assumptions.push (import (lit)); }
  void add (int lit) {
    nomodel = true;
    if (lit) clause.push (import (lit));
    else addClause (clause), clause.clear ();
  }
  unsigned long long calls;
  int sat (bool simp) {
    calls++;
    reset ();
    bool res = solve (assumptions, simp);
    assumptions.clear ();
    nomodel = !res;
    return res ? 10 : 20;
  }
  int failed (int lit) {
    if (!fmap) ana ();
    int tmp = var (import (lit));
    assert (0 <= tmp && tmp < nVars ());
    return fmap [ tmp ];
  }
  int fixed (int lit) {
    Var v = var (import (lit));
    int idx = v, res;
    assert (0 <= idx && idx < nVars ());
    lbool val = assigns[idx];
    if (val == l_Undef || level (v)) res = 0;
    else res = (val == l_True) ? 1 : -1;
    if (lit < 0) res = -res;
    return res;
  }
  int deref (int lit) {
    if (nomodel) return fixed (lit);
    lbool res = modelValue (import (lit));
    return (res == l_True) ? 1 : -1;
  }
};

void * btor_minisat_init (BtorSATMgr *) { return new BtorMiniSAT (); }

const char * btor_minisat_version (void) { return "unknown"; }

void btor_minisat_add (BtorSATMgr * smgr, int lit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  solver->add (lit);
}

int btor_minisat_sat (BtorSATMgr * smgr, int limit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  (void) limit;
  return solver->sat (!smgr->inc_required);
}

int btor_minisat_deref (BtorSATMgr * smgr, int lit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  return solver->deref (lit);
}

int btor_minisat_repr (BtorSATMgr * smgr, int lit) {
  (void) smgr;
  return lit;
}

void btor_minisat_reset (BtorSATMgr * smgr) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  delete solver;
}

int btor_minisat_inc_max_var (BtorSATMgr * smgr) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  return solver->inc ();
}

int btor_minisat_variables (BtorSATMgr * smgr) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  return solver->nVars ();
}

void btor_minisat_assume (BtorSATMgr * smgr, int lit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  solver->assume (lit);
}

int btor_minisat_fixed (BtorSATMgr * smgr, int lit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  return solver->fixed (lit);
}

int btor_minisat_failed (BtorSATMgr * smgr, int lit) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  return solver->failed (lit);
}

void btor_minisat_set_output (BtorSATMgr *, FILE *) { }

void btor_minisat_set_prefix (BtorSATMgr *, const char *) { }

void btor_minisat_enable_verbosity (BtorSATMgr * smgr) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  solver->verbosity = 1;
}

void btor_minisat_stats (BtorSATMgr * smgr) {
  BtorMiniSAT * solver = (BtorMiniSAT*) BTOR_GET_SOLVER_SAT (smgr);
  printf (
    "[minisat] calls %llu\n"
    "[minisat] restarts %llu\n"
    "[minisat] conflicts %llu\n"
    "[minisat] decisions %llu\n"
    "[minisat] propagations %llu\n",
  (unsigned long long) solver->calls,
  (unsigned long long) solver->starts,
  (unsigned long long) solver->conflicts,
  (unsigned long long) solver->decisions,
  (unsigned long long) solver->propagations);
  fflush (stdout);
}

int btor_minisat_changed (BtorSATMgr *) { return 1; }

int btor_minisat_inconsistent (BtorSATMgr *) { return 0; }

};

#endif