ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
stack.h
Go to the documentation of this file.
1#ifndef _stack_h_INCLUDED
2#define _stack_h_INCLUDED
3
4#include <stdlib.h>
5
6#include "global.h"
8
9#define STACK(TYPE) \
10 struct { \
11 TYPE *begin; \
12 TYPE *end; \
13 TYPE *allocated; \
14 }
15
16#define FULL_STACK(S) ((S).end == (S).allocated)
17#define EMPTY_STACK(S) ((S).begin == (S).end)
18#define SIZE_STACK(S) ((size_t) ((S).end - (S).begin))
19#define CAPACITY_STACK(S) ((size_t) ((S).allocated - (S).begin))
20
21#define INIT_STACK(S) \
22 do { \
23 (S).begin = (S).end = (S).allocated = 0; \
24 } while (0)
25
26#define TOP_STACK(S) (END_STACK (S)[KISSAT_assert (!EMPTY_STACK (S)), -1])
27
28#define PEEK_STACK(S, N) \
29 (BEGIN_STACK (S)[KISSAT_assert ((N) < SIZE_STACK (S)), (N)])
30
31#define POKE_STACK(S, N, E) \
32 do { \
33 PEEK_STACK (S, N) = (E); \
34 } while (0)
35
36#define POP_STACK(S) (KISSAT_assert (!EMPTY_STACK (S)), *--(S).end)
37
38#define ENLARGE_STACK(S) \
39 do { \
40 KISSAT_assert (FULL_STACK (S)); \
41 kissat_stack_enlarge (solver, (chars *) &(S), sizeof *(S).begin); \
42 } while (0)
43
44#define SHRINK_STACK(S) \
45 do { \
46 if (!FULL_STACK (S)) \
47 kissat_shrink_stack (solver, (chars *) &(S), sizeof *(S).begin); \
48 } while (0)
49
50#define PUSH_STACK(S, E) \
51 do { \
52 if (FULL_STACK (S)) \
53 ENLARGE_STACK (S); \
54 *(S).end++ = (E); \
55 } while (0)
56
57#define BEGIN_STACK(S) (S).begin
58
59#define END_STACK(S) (S).end
60
61#define CLEAR_STACK(S) \
62 do { \
63 (S).end = (S).begin; \
64 } while (0)
65
66#define RESIZE_STACK(S, NEW_SIZE) \
67 do { \
68 const size_t TMP_NEW_SIZE = (NEW_SIZE); \
69 KISSAT_assert (TMP_NEW_SIZE <= SIZE_STACK (S)); \
70 (S).end = (S).begin + TMP_NEW_SIZE; \
71 } while (0)
72
73#define SET_END_OF_STACK(S, P) \
74 do { \
75 KISSAT_assert (BEGIN_STACK (S) <= (P)); \
76 KISSAT_assert ((P) <= END_STACK (S)); \
77 if ((P) == END_STACK (S)) \
78 break; \
79 (S).end = (P); \
80 } while (0)
81
82#define RELEASE_STACK(S) \
83 do { \
84 DEALLOC ((S).begin, CAPACITY_STACK (S)); \
85 INIT_STACK (S); \
86 } while (0)
87
88#define REMOVE_STACK(T, S, E) \
89 do { \
90 KISSAT_assert (!EMPTY_STACK (S)); \
91 T *END_REMOVE_STACK = END_STACK (S); \
92 T *P_REMOVE_STACK = BEGIN_STACK (S); \
93 while (*P_REMOVE_STACK != (E)) { \
94 P_REMOVE_STACK++; \
95 KISSAT_assert (P_REMOVE_STACK != END_REMOVE_STACK); \
96 } \
97 P_REMOVE_STACK++; \
98 while (P_REMOVE_STACK != END_REMOVE_STACK) { \
99 P_REMOVE_STACK[-1] = *P_REMOVE_STACK; \
100 P_REMOVE_STACK++; \
101 } \
102 (S).end--; \
103 } while (0)
104
105#define REVERSE_STACK(T, S) \
106 do { \
107 if (SIZE_STACK (S) < 2) \
108 break; \
109 T *HEAD = (S).begin, *TAIL = (S).end - 1; \
110 while (HEAD < TAIL) { \
111 T TMP = *HEAD; \
112 *HEAD++ = *TAIL; \
113 *TAIL-- = TMP; \
114 } \
115 } while (0)
116
117#define all_stack(T, E, S) \
118 T E, *E##_PTR = BEGIN_STACK (S), *const E##_END = END_STACK (S); \
119 E##_PTR != E##_END && (E = *E##_PTR, true); \
120 ++E##_PTR
121
122#define all_pointers(T, E, S) \
123 T *E, *const *E##_PTR = BEGIN_STACK (S), \
124 *const *const E##_END = END_STACK (S); \
125 E##_PTR != E##_END && (E = *E##_PTR, true); \
126 ++E##_PTR
127
128// clang-format off
129
130typedef STACK (char) chars;
131typedef STACK (int) ints;
132typedef STACK (size_t) sizes;
133typedef STACK (unsigned) unsigneds;
134
135// clang-format on
136
137struct kissat;
138
139void kissat_stack_enlarge (struct kissat *, chars *,
140 size_t size_of_element);
141void kissat_shrink_stack (struct kissat *, chars *, size_t size_of_element);
142
144
145#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define STACK(TYPE)
Definition stack.h:10
void kissat_shrink_stack(struct kissat *, chars *, size_t size_of_element)
Definition stack.c:26
void kissat_stack_enlarge(struct kissat *, chars *, size_t size_of_element)
Definition stack.c:9