ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
resize.c
Go to the documentation of this file.
1#include "resize.h"
2#include "allocate.h"
3#include "inline.h"
4#include "require.h"
5
6#include <limits.h>
7#include <string.h>
8
10
11#define NREALLOC_GENERIC(TYPE, NAME, ELEMENTS_PER_BLOCK) \
12 do { \
13 const size_t block_size = sizeof (TYPE); \
14 solver->NAME = \
15 (TYPE*) kissat_nrealloc (solver, solver->NAME, old_size, new_size, \
16 ELEMENTS_PER_BLOCK * block_size); \
17 } while (0)
18
19#define CREALLOC_GENERIC(TYPE, NAME, ELEMENTS_PER_BLOCK) \
20 do { \
21 const size_t block_size = sizeof (TYPE); \
22 TYPE *NAME = \
23 (TYPE*) kissat_calloc (solver, ELEMENTS_PER_BLOCK * new_size, block_size); \
24 if (old_size) { \
25 const size_t bytes = ELEMENTS_PER_BLOCK * old_size * block_size; \
26 memcpy (NAME, solver->NAME, bytes); \
27 } \
28 kissat_dealloc (solver, solver->NAME, ELEMENTS_PER_BLOCK *old_size, \
29 block_size); \
30 solver->NAME = NAME; \
31 } while (0)
32
33#define NREALLOC_VARIABLE_INDEXED(TYPE, NAME) \
34 NREALLOC_GENERIC (TYPE, NAME, 1)
35
36#define NREALLOC_LITERAL_INDEXED(TYPE, NAME) \
37 NREALLOC_GENERIC (TYPE, NAME, 2)
38
39#define CREALLOC_VARIABLE_INDEXED(TYPE, NAME) \
40 CREALLOC_GENERIC (TYPE, NAME, 1)
41
42#define CREALLOC_LITERAL_INDEXED(TYPE, NAME) \
43 CREALLOC_GENERIC (TYPE, NAME, 2)
44
45static void reallocate_trail (kissat *solver, unsigned old_size,
46 unsigned new_size) {
47 unsigned propagated = solver->propagate - BEGIN_ARRAY (solver->trail);
48 REALLOCATE_ARRAY (unsigned, solver->trail, old_size, new_size);
49 solver->propagate = BEGIN_ARRAY (solver->trail) + propagated;
50}
51
52void kissat_increase_size (kissat *solver, unsigned new_size) {
53 KISSAT_assert (solver->vars <= new_size);
54 const unsigned old_size = solver->size;
55 if (old_size >= new_size)
56 return;
57
58#ifdef METRICS
59 LOG ("%s before increasing size from %u to %u",
60 FORMAT_BYTES (kissat_allocated (solver)), old_size, new_size);
61#endif
65
69
70 reallocate_trail (solver, old_size, new_size);
71 kissat_resize_heap (solver, SCORES, new_size);
73
74 solver->size = new_size;
75
76#ifdef METRICS
77 LOG ("%s after increasing size from %u to %u",
78 FORMAT_BYTES (kissat_allocated (solver)), old_size, new_size);
79#endif
80}
81
83 const unsigned old_size = solver->size;
84 const unsigned new_size = solver->vars;
85
86#ifdef METRICS
87 LOG ("%s before decreasing size from %u to %u",
88 FORMAT_BYTES (kissat_allocated (solver)), old_size, new_size);
89#endif
90
94
98
99 reallocate_trail (solver, old_size, new_size);
100 kissat_resize_heap (solver, SCORES, new_size);
101 kissat_decrease_phases (solver, new_size);
102
103 solver->size = new_size;
104
105#ifdef METRICS
106 LOG ("%s after decreasing size from %u to %u",
107 FORMAT_BYTES (kissat_allocated (solver)), old_size, new_size);
108#endif
109}
110
111void kissat_enlarge_variables (kissat *solver, unsigned new_vars) {
112 if (solver->vars >= new_vars)
113 return;
114 KISSAT_assert (new_vars <= INTERNAL_MAX_VAR + 1);
115 LOG ("enlarging variables from %u to %u", solver->vars, new_vars);
116 const size_t old_size = solver->size;
117 if (old_size < new_vars) {
118 LOG ("old size %zu below requested new number of variables %u",
119 old_size, new_vars);
120 size_t new_size;
121 if (!old_size)
122 new_size = new_vars;
123 else {
124 if (kissat_is_power_of_two (old_size)) {
125 KISSAT_assert (old_size <= UINT_MAX / 2);
126 new_size = 2 * old_size;
127 } else {
128 KISSAT_assert (1 < old_size);
129 new_size = 2;
130 }
131 while (new_size < new_vars) {
132 KISSAT_assert (new_size <= UINT_MAX / 2);
133 new_size *= 2;
134 }
135 }
136 kissat_increase_size (solver, new_size);
137 }
138 solver->vars = new_vars;
139}
140
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define REALLOCATE_ARRAY(T, A, O, N)
Definition array.h:31
#define BEGIN_ARRAY
Definition array.h:50
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define FORMAT_BYTES(BYTES)
Definition format.h:31
void kissat_resize_heap(kissat *solver, heap *heap, unsigned new_size)
Definition heap.c:46
#define SCORES
Definition internal.h:262
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
void kissat_increase_phases(kissat *solver, unsigned new_size)
Definition phases.c:22
void kissat_decrease_phases(kissat *solver, unsigned new_size)
Definition phases.c:31
#define CREALLOC_VARIABLE_INDEXED(TYPE, NAME)
Definition resize.c:39
#define CREALLOC_LITERAL_INDEXED(TYPE, NAME)
Definition resize.c:42
#define NREALLOC_VARIABLE_INDEXED(TYPE, NAME)
Definition resize.c:33
void kissat_enlarge_variables(kissat *solver, unsigned new_vars)
Definition resize.c:111
void kissat_increase_size(kissat *solver, unsigned new_size)
Definition resize.c:52
void kissat_decrease_size(kissat *solver)
Definition resize.c:82
#define NREALLOC_LITERAL_INDEXED(TYPE, NAME)
Definition resize.c:36
#define INTERNAL_MAX_VAR
Definition literal.h:13
Definition flags.h:11
signed char mark
Definition value.h:8
vector watches
Definition watch.h:49