ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vector.h File Reference
#include "stack.h"
#include "utilities.h"
#include <limits.h>
#include "global.h"
Include dependency graph for vector.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  vectors
 
struct  vector
 

Macros

#define LD_MAX_VECTORS   (sizeof (word) == 8 ? 32u : 28u)
 
#define MAX_VECTORS   (((uint64_t) 1) << LD_MAX_VECTORS)
 
#define INVALID_VECTOR_ELEMENT   UINT_MAX
 
#define MAX_SECTOR   MAX_SIZE_T
 
#define kissat_check_vectors(...)
 

Typedefs

typedef struct vector vector
 
typedef struct vectors vectors
 

Functions

unsigned * kissat_enlarge_vector (struct kissat *, vector *)
 
void kissat_defrag_vectors (struct kissat *, size_t, vector *)
 
void kissat_remove_from_vector (struct kissat *, vector *, unsigned)
 
void kissat_resize_vector (struct kissat *, vector *, size_t)
 
void kissat_release_vectors (struct kissat *)
 

Macro Definition Documentation

◆ INVALID_VECTOR_ELEMENT

#define INVALID_VECTOR_ELEMENT   UINT_MAX

Definition at line 20 of file vector.h.

◆ kissat_check_vectors

#define kissat_check_vectors ( ...)
Value:
do { \
} while (0)

Definition at line 47 of file vector.h.

47#define kissat_check_vectors(...) \
48 do { \
49 } while (0)

◆ LD_MAX_VECTORS

#define LD_MAX_VECTORS   (sizeof (word) == 8 ? 32u : 28u)

Definition at line 13 of file vector.h.

◆ MAX_SECTOR

#define MAX_SECTOR   MAX_SIZE_T

Definition at line 22 of file vector.h.

◆ MAX_VECTORS

#define MAX_VECTORS   (((uint64_t) 1) << LD_MAX_VECTORS)

Definition at line 18 of file vector.h.

Typedef Documentation

◆ vector

typedef struct vector vector

Definition at line 24 of file vector.h.

◆ vectors

typedef struct vectors vectors

Definition at line 25 of file vector.h.

Function Documentation

◆ kissat_defrag_vectors()

void kissat_defrag_vectors ( struct kissat * solver,
size_t size_unsorted,
vector * unsorted )

Definition at line 161 of file vector.c.

162 {
163 unsigneds *stack = &solver->vectors.stack;
164 const size_t size_vectors = SIZE_STACK (*stack);
165 if (size_vectors < 2)
166 return;
167 START (defrag);
168 INC (defragmentations);
169 LOG ("defragmenting vectors size %zu capacity %zu usable %zu",
170 size_vectors, CAPACITY_STACK (*stack), solver->vectors.usable);
171 size_t bytes = size_unsorted * sizeof (unsigned);
172 unsigned *sorted = (unsigned*)kissat_malloc (solver, bytes);
173 unsigned size_sorted = 0;
174 for (unsigned i = 0; i < size_unsorted; i++) {
175 vector *vector = unsorted + i;
176 if (kissat_empty_vector (vector))
177#ifdef KISSAT_COMPACT
178 vector->offset = 0;
179#else
180 vector->begin = vector->end = 0;
181#endif
182 else
183 sorted[size_sorted++] = i;
184 }
185 RADIX_SORT (unsigned, rank, size_sorted, sorted, RANK_OFFSET);
186 unsigned *old_begin_stack = BEGIN_STACK (*stack);
187 unsigned *p = old_begin_stack + 1;
188 for (unsigned i = 0; i < size_sorted; i++) {
189 unsigned j = sorted[i];
190 vector *vector = unsorted + j;
191 const size_t size = kissat_size_vector (vector);
192 unsigned *new_end_of_vector = p + size;
193#ifdef KISSAT_COMPACT
194 const unsigned old_offset = vector->offset;
195 const unsigned new_offset = p - old_begin_stack;
196 KISSAT_assert (new_offset <= old_offset);
197 vector->offset = new_offset;
198 const unsigned *const q = old_begin_stack + old_offset;
199#else
200 if (!size) {
201 vector->begin = vector->end = 0;
202 continue;
203 }
204 const unsigned *const q = vector->begin;
205 vector->begin = p;
206 vector->end = new_end_of_vector;
207#endif
208 KISSAT_assert (MAX_SIZE_T / sizeof (unsigned) >= size);
209 memmove (p, q, size * sizeof (unsigned));
210 p = new_end_of_vector;
211 }
212 kissat_free (solver, sorted, bytes);
213#ifndef KISSAT_QUIET
214 const size_t freed = END_STACK (*stack) - p;
215 double freed_fraction = kissat_percent (freed, size_vectors);
216 kissat_phase (solver, "defrag", GET (defragmentations),
217 "freed %zu usable entries %.0f%% thus %s", freed,
218 freed_fraction, FORMAT_BYTES (freed * sizeof (unsigned)));
219 KISSAT_assert (freed == solver->vectors.usable);
220#endif
221 SET_END_OF_STACK (*stack, p);
222#ifndef KISSAT_COMPACT
223 KISSAT_assert (old_begin_stack == BEGIN_STACK (*stack));
224#endif
225 SHRINK_STACK (*stack);
226#ifndef KISSAT_COMPACT
227 unsigned *new_begin_stack = BEGIN_STACK (*stack);
228 const ptrdiff_t moved =
229 (char *) new_begin_stack - (char *) old_begin_stack;
230 if (moved)
231 fix_vector_pointers_after_moving_stack (solver, moved);
232#endif
233 solver->vectors.usable = 0;
235 STOP (defrag);
236}
void * kissat_malloc(kissat *solver, size_t bytes)
Definition allocate.c:49
void kissat_free(kissat *solver, void *ptr, size_t bytes)
Definition allocate.c:61
#define BEGIN_STACK(S)
Definition stack.h:46
#define CAPACITY_STACK(S)
Definition stack.h:20
#define SIZE_STACK(S)
Definition stack.h:19
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
#define END_STACK(S)
Definition stack.h:48
#define INC(NAME)
#define LOG(...)
Cube * p
Definition exorList.c:222
#define FORMAT_BYTES(BYTES)
Definition format.h:31
#define KISSAT_assert(ignore)
Definition global.h:13
#define SHRINK_STACK(S)
Definition stack.h:44
#define solver
Definition kitten.c:211
unsigned long long size
Definition giaNewBdd.h:39
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define RADIX_SORT(VTYPE, RTYPE, N, V, RANK)
Definition rank.h:25
#define GET(NAME)
Definition statistics.h:416
unsigned offset
Definition vector.h:34
char * memmove()
#define MAX_SIZE_T
Definition utilities.h:45
unsigned rank
Definition vector.c:142
#define RANK_OFFSET(A)
Definition vector.c:159
#define kissat_check_vectors(...)
Definition vector.h:47
Here is the call graph for this function:

◆ kissat_enlarge_vector()

unsigned * kissat_enlarge_vector ( struct kissat * solver,
vector * vector )

Definition at line 45 of file vector.c.

45 {
46 unsigneds *stack = &solver->vectors.stack;
47 const size_t old_vector_size = kissat_size_vector (vector);
48#ifdef LOGGING
49 const size_t old_offset = kissat_offset_vector (solver, vector);
50 LOG2 ("enlarging vector %zu[%zu] at %p", old_offset, old_vector_size,
51 (void *) vector);
52#endif
53 KISSAT_assert (old_vector_size < MAX_VECTORS / 2);
54 const size_t new_vector_size = old_vector_size ? 2 * old_vector_size : 1;
55 size_t old_stack_size = SIZE_STACK (*stack);
56 size_t capacity = CAPACITY_STACK (*stack);
57 KISSAT_assert (kissat_is_power_of_two (MAX_VECTORS));
58 KISSAT_assert (capacity <= MAX_VECTORS);
59 size_t available = capacity - old_stack_size;
60 if (new_vector_size > available) {
61#if !defined(KISSAT_QUIET) || !defined(KISSAT_COMPACT)
62 unsigned *old_begin_stack = BEGIN_STACK (*stack);
63#endif
64 unsigned enlarged = 0;
65 do {
66 KISSAT_assert (kissat_is_zero_or_power_of_two (capacity));
67
68 if (capacity == MAX_VECTORS)
69 kissat_fatal ("maximum vector stack size "
70 "of 2^%u entries %s exhausted",
72 FORMAT_BYTES (MAX_VECTORS * sizeof (unsigned)));
73 enlarged++;
74 kissat_stack_enlarge (solver, (chars *) stack, sizeof (unsigned));
75
76 capacity = CAPACITY_STACK (*stack);
77 available = capacity - old_stack_size;
78 } while (new_vector_size > available);
79
80 if (enlarged) {
81 INC (vectors_enlarged);
82#if !defined(KISSAT_QUIET) || !defined(KISSAT_COMPACT)
83 unsigned *new_begin_stack = BEGIN_STACK (*stack);
84 const ptrdiff_t moved =
85 (char *) new_begin_stack - (char *) old_begin_stack;
86#endif
87#ifndef KISSAT_QUIET
88 kissat_phase (solver, "vectors", GET (vectors_enlarged),
89 "enlarged to %s entries %s (%s)",
90 FORMAT_COUNT (capacity),
91 FORMAT_BYTES (capacity * sizeof (unsigned)),
92 (moved ? "moved" : "in place"));
93#endif
94#ifndef KISSAT_COMPACT
95 if (moved)
96 fix_vector_pointers_after_moving_stack (solver, moved);
97#endif
98 }
99 KISSAT_assert (capacity <= MAX_VECTORS);
100 KISSAT_assert (new_vector_size <= available);
101 }
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;
106 KISSAT_assert (end_new_vector <= stack->allocated);
107 const size_t old_bytes = old_vector_size * sizeof (unsigned);
108 const size_t delta_size = new_vector_size - old_vector_size;
109 KISSAT_assert (MAX_SIZE_T / sizeof (unsigned) >= delta_size);
110 const size_t delta_bytes = delta_size * sizeof (unsigned);
111 if (old_bytes) {
112 memcpy (begin_new_vector, begin_old_vector, old_bytes);
113 memset (begin_old_vector, 0xff, old_bytes);
114 }
115 solver->vectors.usable += old_vector_size;
116 kissat_add_usable (solver, delta_size);
117 if (delta_bytes)
118 memset (middle_new_vector, 0xff, delta_bytes);
119#ifdef KISSAT_COMPACT
120 const uint64_t offset = SIZE_STACK (*stack);
121 KISSAT_assert (offset <= MAX_VECTORS);
122 vector->offset = offset;
123 LOG2 ("enlarged vector at %p to %u[%u]", (void *) vector, vector->offset,
124 vector->size);
125#else
126 vector->begin = begin_new_vector;
127 vector->end = middle_new_vector;
128#ifdef LOGGING
129 const size_t new_offset = vector->begin - stack->begin;
130 LOG2 ("enlarged vector at %p to %zu[%zu]", (void *) vector, new_offset,
131 old_vector_size);
132#endif
133#endif
134 stack->end = end_new_vector;
135 KISSAT_assert (begin_new_vector < end_new_vector);
136 KISSAT_assert (kissat_size_vector (vector) == old_vector_size);
137 return middle_new_vector;
138}
void kissat_fatal(const char *fmt,...)
Definition error.c:58
#define FORMAT_COUNT(WORD)
Definition format.h:33
#define LOG2(...)
Definition logging.h:352
ABC_NAMESPACE_IMPL_START void kissat_stack_enlarge(struct kissat *solver, chars *s, size_t bytes)
Definition stack.c:9
unsigned size
Definition vector.h:35
char * memcpy()
char * memset()
#define LD_MAX_VECTORS
Definition vector.h:13
#define MAX_VECTORS
Definition vector.h:18
Here is the call graph for this function:

◆ kissat_release_vectors()

void kissat_release_vectors ( struct kissat * solver)

Definition at line 284 of file vector.c.

284 {
285 RELEASE_STACK (solver->vectors.stack);
286 solver->vectors.usable = 0;
287}
#define RELEASE_STACK(S)
Definition stack.h:71
Here is the caller graph for this function:

◆ kissat_remove_from_vector()

void kissat_remove_from_vector ( struct kissat * solver,
vector * vector,
unsigned remove )

Definition at line 238 of file vector.c.

239 {
240 unsigned *begin = kissat_begin_vector (solver, vector), *p = begin;
241 const unsigned *const end = kissat_end_vector (solver, vector);
242 KISSAT_assert (p != end);
243 while (*p != remove)
244 p++, KISSAT_assert (p != end);
245 while (++p != end)
246 p[-1] = *p;
248#ifdef KISSAT_COMPACT
249 vector->size--;
250#else
251 KISSAT_assert (vector->begin < vector->end);
252 vector->end--;
253#endif
254 kissat_inc_usable (solver);
256#ifndef CHECK_VECTORS
257 (void) solver;
258#endif
259}
#define INVALID_VECTOR_ELEMENT
Definition vector.h:20

◆ kissat_resize_vector()

void kissat_resize_vector ( struct kissat * solver,
vector * vector,
size_t new_size )

Definition at line 261 of file vector.c.

262 {
263 const size_t old_size = kissat_size_vector (vector);
264 KISSAT_assert (new_size <= old_size);
265 if (new_size == old_size)
266 return;
267#ifdef KISSAT_COMPACT
268 vector->size = new_size;
269#else
270 vector->end = vector->begin + new_size;
271#endif
272 unsigned *begin = kissat_begin_vector (solver, vector);
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);
279#ifndef CHECK_VECTORS
280 (void) solver;
281#endif
282}
Here is the call graph for this function: