ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
fifo.h
Go to the documentation of this file.
1#ifndef _fifo_h_INCLUDED
2#define _fifo_h_INCLUDED
3
4#include "stack.h"
5
6#include <string.h>
7
8#include "global.h"
10
11#define FIFO(TYPE) \
12 struct { \
13 TYPE *begin; \
14 TYPE *end; \
15 TYPE *start; \
16 TYPE *limit; \
17 TYPE *allocated; \
18 }
19
20#define BEGIN_FIFO(F) ((F).begin)
21#define END_FIFO(F) ((F).end)
22#define START_FIFO(F) ((F).start)
23#define LIMIT_FIFO(F) ((F).limit)
24#define ALLOCATED_FIFO(F) ((F).allocated)
25
26#define INIT_FIFO(F) memset (&(F), 0, sizeof (F))
27
28#define EMPTY_FIFO(F) (END_FIFO (F) == BEGIN_FIFO (F))
29#define FULL_FIFO(F) (END_FIFO (F) == ALLOCATED_FIFO (F))
30#define SIZE_FIFO(F) (END_FIFO (F) - BEGIN_FIFO (F))
31
32#define MOVABLE_FIFO(F) (BEGIN_FIFO (F) == LIMIT_FIFO (F))
33#define CAPACITY_FIFO(F) (ALLOCATED_FIFO (F) - START_FIFO (F))
34
35#define ENLARGE_FIFO(T, F) \
36 do { \
37 size_t OLD_BEGIN_OFFSET = BEGIN_FIFO (F) - START_FIFO (F); \
38 size_t OLD_END_OFFSET = END_FIFO (F) - START_FIFO (F); \
39 size_t OLD_CAPACITY = CAPACITY_FIFO (F); \
40 size_t NEW_CAPACITY = OLD_CAPACITY ? 2 * OLD_CAPACITY : 2; \
41 size_t OLD_BYTES = OLD_CAPACITY * sizeof *BEGIN_FIFO (F); \
42 size_t NEW_BYTES = NEW_CAPACITY * sizeof *BEGIN_FIFO (F); \
43 START_FIFO (F) = \
44 (T*) kissat_realloc (solver, START_FIFO (F), OLD_BYTES, NEW_BYTES); \
45 ALLOCATED_FIFO (F) = START_FIFO (F) + NEW_CAPACITY; \
46 LIMIT_FIFO (F) = START_FIFO (F) + NEW_CAPACITY / 2; \
47 BEGIN_FIFO (F) = START_FIFO (F) + OLD_BEGIN_OFFSET; \
48 END_FIFO (F) = START_FIFO (F) + OLD_END_OFFSET; \
49 KISSAT_assert (BEGIN_FIFO (F) < LIMIT_FIFO (F)); \
50 } while (0)
51
52#define MOVE_FIFO(F) \
53 do { \
54 size_t SIZE = SIZE_FIFO (F); \
55 size_t BYTES = SIZE * sizeof *BEGIN_FIFO (F); \
56 memmove (START_FIFO (F), BEGIN_FIFO (F), BYTES); \
57 BEGIN_FIFO (F) = START_FIFO (F); \
58 END_FIFO (F) = BEGIN_FIFO (F) + SIZE; \
59 } while (0)
60
61#define ENQUEUE_FIFO(T, F, E) \
62 do { \
63 if (FULL_FIFO (F)) \
64 ENLARGE_FIFO (T, F); \
65 *END_FIFO (F)++ = (E); \
66 } while (0)
67
68#define DEQUEUE_FIFO(F, E) \
69 do { \
70 KISSAT_assert (!EMPTY_FIFO (F)); \
71 (E) = *BEGIN_FIFO (F)++; \
72 if (MOVABLE_FIFO (F)) \
73 MOVE_FIFO (F); \
74 } while (0)
75
76#define POP_FIFO(F) (KISSAT_assert (!EMPTY_FIFO (F)), *--END_FIFO (F))
77
78#define RELEASE_FIFO(F) \
79 do { \
80 size_t CAPACITY = CAPACITY_FIFO (F); \
81 size_t BYTES = CAPACITY * sizeof *BEGIN_FIFO (F); \
82 kissat_free (solver, START_FIFO (F), BYTES); \
83 INIT_FIFO (F); \
84 } while (0)
85
86#define CLEAR_FIFO(F) \
87 do { \
88 BEGIN_FIFO (F) = END_FIFO (F) = START_FIFO (F); \
89 } while (0)
90
92 unsigned *begin, *end;
93 unsigned *start, *limit, *allocated;
94};
95
97
98#define all_fifo all_stack
99
101
102#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
unsigned * end
Definition fifo.h:92
unsigned * start
Definition fifo.h:93
unsigned * limit
Definition fifo.h:93
unsigned * allocated
Definition fifo.h:93
unsigned * begin
Definition fifo.h:92