ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
inlinevector.h
Go to the documentation of this file.
1#ifndef _inlinevector_h_INCLUDED
2#define _inlinevector_h_INCLUDED
3
4#include "internal.h"
5
6#include "global.h"
8
9static inline unsigned *kissat_begin_vector (kissat *solver,
10 vector *vector) {
11#ifdef KISSAT_COMPACT
12 return BEGIN_STACK (solver->vectors.stack) + vector->offset;
13#else
14 (void) solver;
15 return vector->begin;
16#endif
17}
18
19static inline unsigned *kissat_end_vector (kissat *solver, vector *vector) {
20#ifdef KISSAT_COMPACT
21 return kissat_begin_vector (solver, vector) + vector->size;
22#else
23 (void) solver;
24 return vector->end;
25#endif
26}
27
28static inline const unsigned *
29kissat_begin_const_vector (kissat *solver, const vector *vector) {
30#ifdef KISSAT_COMPACT
31 return BEGIN_STACK (solver->vectors.stack) + vector->offset;
32#else
33 (void) solver;
34 return vector->begin;
35#endif
36}
37
38static inline const unsigned *
39kissat_end_const_vector (kissat *solver, const vector *vector) {
40#ifdef KISSAT_COMPACT
41 return kissat_begin_const_vector (solver, vector) + vector->size;
42#else
43 (void) solver;
44 return vector->end;
45#endif
46}
47
48#if defined(LOGGING) || defined(TEST_VECTOR)
49
50static inline size_t kissat_offset_vector (kissat *solver, vector *vector) {
51#ifdef KISSAT_COMPACT
52 (void) solver;
53 return vector->offset;
54#else
55 unsigned *begin_vector = vector->begin;
56 unsigned *begin_stack = BEGIN_STACK (solver->vectors.stack);
57 return begin_vector ? begin_vector - begin_stack : 0;
58#endif
59}
60
61#endif
62
63static inline size_t kissat_size_vector (const vector *vector) {
64#ifdef KISSAT_COMPACT
65 return vector->size;
66#else
67 return vector->end - vector->begin;
68#endif
69}
70
71static inline bool kissat_empty_vector (vector *vector) {
72#ifdef KISSAT_COMPACT
73 return !vector->size;
74#else
75 return vector->end == vector->begin;
76#endif
77}
78
79static inline void kissat_inc_usable (kissat *solver) {
80 KISSAT_assert (MAX_SECTOR > solver->vectors.usable);
81 solver->vectors.usable++;
82}
83
84static inline void kissat_add_usable (kissat *solver, size_t inc) {
85 KISSAT_assert (MAX_SECTOR - inc >= solver->vectors.usable);
86 solver->vectors.usable += inc;
87}
88
89static inline unsigned *kissat_last_vector_pointer (kissat *solver,
90 vector *vector) {
91 KISSAT_assert (!kissat_empty_vector (vector));
92#ifdef KISSAT_COMPACT
94 unsigned *begin = kissat_begin_vector (solver, vector);
95 return begin + vector->size - 1;
96#else
97 (void) solver;
98 return vector->end - 1;
99#endif
100}
101
102#ifdef TEST_VECTOR
103
104static inline void kissat_pop_vector (kissat *solver, vector *vector) {
105 KISSAT_assert (!kissat_empty_vector (vector));
106#ifdef KISSAT_COMPACT
107 unsigned *p = kissat_last_vector_pointer (solver, vector);
108 vector->size--;
110#else
112 (void) solver;
113#endif
114 kissat_inc_usable (solver);
115}
116
117#endif
118
119static inline void kissat_release_vector (kissat *solver, vector *vector) {
121}
122
123static inline void kissat_dec_usable (kissat *solver) {
124 KISSAT_assert (solver->vectors.usable > 0);
125 solver->vectors.usable--;
126}
127
128static inline void kissat_push_vectors (kissat *solver, vector *vector,
129 unsigned e) {
130 unsigneds *stack = &solver->vectors.stack;
132 if (
133#ifdef KISSAT_COMPACT
134 !vector->size && !vector->offset
135#else
136 !vector->begin
137#endif
138 ) {
139 if (EMPTY_STACK (*stack))
140 PUSH_STACK (*stack, 0);
141 if (FULL_STACK (*stack)) {
142 unsigned *end = kissat_enlarge_vector (solver, vector);
144 *end = e;
145 kissat_dec_usable (solver);
146 } else {
147#ifdef KISSAT_COMPACT
148 KISSAT_assert ((uint64_t) SIZE_STACK (*stack) < MAX_VECTORS);
149 vector->offset = SIZE_STACK (*stack);
151 *stack->end++ = e;
152#else
153 KISSAT_assert (stack->end < stack->allocated);
154 *(vector->begin = stack->end++) = e;
155#endif
156 }
157#if !defined(KISSAT_COMPACT)
158 vector->end = vector->begin;
159#endif
160 } else {
161 unsigned *end = kissat_end_vector (solver, vector);
162 if (end == END_STACK (*stack)) {
163 if (FULL_STACK (*stack)) {
166 *end = e;
167 kissat_dec_usable (solver);
168 } else
169 *stack->end++ = e;
170 } else {
171 if (*end != INVALID_VECTOR_ELEMENT)
174 *end = e;
175 kissat_dec_usable (solver);
176 }
177 }
178#ifndef KISSAT_COMPACT
179 vector->end++;
180#else
181 vector->size++;
182#endif
184}
185
186#ifdef TEST_VECTOR
187
188#define all_vector(E, V) \
189 unsigned E, *E##_PTR = kissat_begin_vector (solver, &V), \
190 *const E##_END = kissat_end_vector (solver, &V); \
191 E##_PTR != E##_END && (E = *E##_PTR, true); \
192 E##_PTR++
193
194#endif
195
197
198#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define BEGIN_STACK(S)
Definition stack.h:46
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define FULL_STACK(S)
Definition stack.h:17
#define PUSH_STACK(S, E)
Definition stack.h:39
#define END_STACK(S)
Definition stack.h:48
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define KISSAT_COMPACT
Definition global.h:7
#define solver
Definition kitten.c:211
unsigned offset
Definition vector.h:34
unsigned size
Definition vector.h:35
void kissat_resize_vector(kissat *solver, vector *vector, size_t new_size)
Definition vector.c:261
ABC_NAMESPACE_IMPL_START unsigned * kissat_enlarge_vector(kissat *solver, vector *vector)
Definition vector.c:45
#define INVALID_VECTOR_ELEMENT
Definition vector.h:20
#define kissat_check_vectors(...)
Definition vector.h:47
#define MAX_SECTOR
Definition vector.h:22
#define MAX_VECTORS
Definition vector.h:18