16static void fix_vector_pointers_after_moving_stack (
kissat *
solver,
19 uint64_t bytes = moved < 0 ? -moved : moved;
20 LOG (
"fixing begin and end pointers of all watches "
21 "since the global watches stack has been moved by %s",
25 struct vector *end_watches = begin_watches +
LITS;
26 for (
struct vector *
p = begin_watches;
p != end_watches;
p++) {
28#define FIX_POINTER(PTR) \
30 char *old_char_ptr_value = (char *) (PTR); \
31 if (!old_char_ptr_value) \
33 char *new_char_ptr_value = old_char_ptr_value + moved; \
34 unsigned *new_unsigned_ptr_value = (unsigned *) new_char_ptr_value; \
35 (PTR) = new_unsigned_ptr_value; \
38 FIX_POINTER (
p->begin);
46 unsigneds *stack = &
solver->vectors.stack;
47 const size_t old_vector_size = kissat_size_vector (
vector);
49 const size_t old_offset = kissat_offset_vector (
solver,
vector);
50 LOG2 (
"enlarging vector %zu[%zu] at %p", old_offset, old_vector_size,
54 const size_t new_vector_size = old_vector_size ? 2 * old_vector_size : 1;
59 size_t available = capacity - old_stack_size;
60 if (new_vector_size > available) {
61#if !defined(KISSAT_QUIET) || !defined(KISSAT_COMPACT)
64 unsigned enlarged = 0;
70 "of 2^%u entries %s exhausted",
77 available = capacity - old_stack_size;
78 }
while (new_vector_size > available);
81 INC (vectors_enlarged);
82#if !defined(KISSAT_QUIET) || !defined(KISSAT_COMPACT)
84 const ptrdiff_t moved =
85 (
char *) new_begin_stack - (
char *) old_begin_stack;
89 "enlarged to %s entries %s (%s)",
92 (moved ?
"moved" :
"in place"));
96 fix_vector_pointers_after_moving_stack (
solver, moved);
102 unsigned *begin_old_vector = kissat_begin_vector (
solver,
vector);
103 unsigned *begin_new_vector =
END_STACK (*stack);
104 unsigned *middle_new_vector = begin_new_vector + old_vector_size;
105 unsigned *end_new_vector = begin_new_vector + new_vector_size;
107 const size_t old_bytes = old_vector_size *
sizeof (unsigned);
108 const size_t delta_size = new_vector_size - old_vector_size;
110 const size_t delta_bytes = delta_size *
sizeof (unsigned);
112 memcpy (begin_new_vector, begin_old_vector, old_bytes);
113 memset (begin_old_vector, 0xff, old_bytes);
115 solver->vectors.usable += old_vector_size;
116 kissat_add_usable (
solver, delta_size);
118 memset (middle_new_vector, 0xff, delta_bytes);
126 vector->begin = begin_new_vector;
127 vector->end = middle_new_vector;
129 const size_t new_offset =
vector->begin - stack->begin;
130 LOG2 (
"enlarged vector at %p to %zu[%zu]", (
void *)
vector, new_offset,
134 stack->end = end_new_vector;
137 return middle_new_vector;
144static inline rank rank_offset (
vector *unsorted,
unsigned i) {
145 return unsorted[i].
offset;
150typedef uintptr_t
rank;
152static inline rank rank_offset (
vector *unsorted,
unsigned i) {
153 const unsigned *begin = unsorted[i].begin;
154 return (uintptr_t) begin;
159#define RANK_OFFSET(A) rank_offset (unsorted, (A))
163 unsigneds *stack = &
solver->vectors.stack;
164 const size_t size_vectors =
SIZE_STACK (*stack);
165 if (size_vectors < 2)
168 INC (defragmentations);
169 LOG (
"defragmenting vectors size %zu capacity %zu usable %zu",
171 size_t bytes = size_unsorted *
sizeof (unsigned);
173 unsigned size_sorted = 0;
174 for (
unsigned i = 0; i < size_unsorted; i++) {
176 if (kissat_empty_vector (
vector))
183 sorted[size_sorted++] = i;
187 unsigned *
p = old_begin_stack + 1;
188 for (
unsigned i = 0; i < size_sorted; i++) {
189 unsigned j = sorted[i];
191 const size_t size = kissat_size_vector (
vector);
192 unsigned *new_end_of_vector =
p +
size;
195 const unsigned new_offset =
p - old_begin_stack;
198 const unsigned *
const q = old_begin_stack + old_offset;
204 const unsigned *
const q =
vector->begin;
206 vector->end = new_end_of_vector;
210 p = new_end_of_vector;
215 double freed_fraction = kissat_percent (freed, size_vectors);
217 "freed %zu usable entries %.0f%% thus %s", freed,
218 freed_fraction,
FORMAT_BYTES (freed *
sizeof (
unsigned)));
222#ifndef KISSAT_COMPACT
226#ifndef KISSAT_COMPACT
228 const ptrdiff_t moved =
229 (
char *) new_begin_stack - (
char *) old_begin_stack;
231 fix_vector_pointers_after_moving_stack (
solver, moved);
233 solver->vectors.usable = 0;
240 unsigned *begin = kissat_begin_vector (
solver,
vector), *
p = begin;
241 const unsigned *
const end = kissat_end_vector (
solver,
vector);
254 kissat_inc_usable (
solver);
263 const size_t old_size = kissat_size_vector (
vector);
265 if (new_size == old_size)
273 unsigned *end = begin + new_size;
274 size_t delta = old_size - new_size;
275 kissat_add_usable (
solver, delta);
276 size_t bytes = delta *
sizeof (unsigned);
277 memset (end, 0xff, bytes);
286 solver->vectors.usable = 0;
292 const unsigned *
const begin = kissat_begin_vector (
solver,
vector);
293 const unsigned *
const end = kissat_end_vector (
solver,
vector);
294 if (!
solver->transitive_reducing)
295 for (
const unsigned *
p = begin;
p != end;
p++)
303 if (
solver->transitive_reducing)
311 const unsigned *
const begin =
BEGIN_STACK (*stack);
312 const unsigned *
const end =
END_STACK (*stack);
316 for (
const unsigned *
p = begin + 1;
p != end;
p++)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void * kissat_malloc(kissat *solver, size_t bytes)
void kissat_free(kissat *solver, void *ptr, size_t bytes)
#define CAPACITY_STACK(S)
#define SET_END_OF_STACK(S, P)
void kissat_fatal(const char *fmt,...)
#define all_literals(LIT)
#define KISSAT_assert(ignore)
#define kissat_phase(...)
#define RADIX_SORT(VTYPE, RTYPE, N, V, RANK)
ABC_NAMESPACE_IMPL_START void kissat_stack_enlarge(struct kissat *solver, chars *s, size_t bytes)
void kissat_defrag_vectors(kissat *solver, size_t size_unsorted, vector *unsorted)
void kissat_resize_vector(kissat *solver, vector *vector, size_t new_size)
void kissat_remove_from_vector(kissat *solver, vector *vector, unsigned remove)
ABC_NAMESPACE_IMPL_START unsigned * kissat_enlarge_vector(kissat *solver, vector *vector)
void kissat_release_vectors(kissat *solver)
#define INVALID_VECTOR_ELEMENT
#define kissat_check_vectors(...)