ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
inlinequeue.h
Go to the documentation of this file.
1#ifndef _inlinequeue_h_INCLUDED
2#define _inlinequeue_h_INCLUDED
3
4#include "internal.h"
5#include "logging.h"
6
7#include "global.h"
9
10static inline void kissat_update_queue (kissat *solver, const links *links,
11 unsigned idx) {
13 const unsigned stamp = links[idx].stamp;
14 LOG ("queue updated to %s stamped %u", LOGVAR (idx), stamp);
15 solver->queue.search.idx = idx;
16 solver->queue.search.stamp = stamp;
17}
18
19static inline void kissat_enqueue_links (kissat *solver, unsigned i,
21 struct links *p = links + i;
24 const unsigned j = p->prev = queue->last;
25 queue->last = i;
26 if (DISCONNECTED (j))
27 queue->first = i;
28 else {
29 struct links *l = links + j;
31 l->next = i;
32 }
33 if (queue->stamp == UINT_MAX) {
35 KISSAT_assert (p->stamp == queue->stamp);
36 } else
37 p->stamp = ++queue->stamp;
38}
39
40static inline void kissat_dequeue_links (unsigned i, links *links,
41 queue *queue) {
42 struct links *l = links + i;
43 const unsigned j = l->prev, k = l->next;
44 l->prev = l->next = DISCONNECT;
45 if (DISCONNECTED (j)) {
47 queue->first = k;
48 } else {
49 struct links *p = links + j;
50 KISSAT_assert (p->next == i);
51 p->next = k;
52 }
53 if (DISCONNECTED (k)) {
54 KISSAT_assert (queue->last == i);
55 queue->last = j;
56 } else {
57 struct links *n = links + k;
58 KISSAT_assert (n->prev == i);
59 n->prev = j;
60 }
61}
62
63static inline void kissat_enqueue (kissat *solver, unsigned idx) {
64 KISSAT_assert (idx < solver->vars);
65 links *links = solver->links, *l = links + idx;
66 l->prev = l->next = DISCONNECT;
67 kissat_enqueue_links (solver, idx, links, &solver->queue);
68 LOG ("enqueued %s stamped %u", LOGVAR (idx), l->stamp);
69 if (!VALUE (LIT (idx)))
70 kissat_update_queue (solver, links, idx);
72}
73
74static inline void kissat_dequeue (kissat *solver, unsigned idx) {
75 KISSAT_assert (idx < solver->vars);
76 LOG ("dequeued %s", LOGVAR (idx));
77 links *links = solver->links;
78 if (solver->queue.search.idx == idx) {
79 struct links *l = links + idx;
80 unsigned search = l->next;
81 if (search == DISCONNECT)
82 search = l->prev;
83 if (search == DISCONNECT) {
84 solver->queue.search.idx = DISCONNECT;
85 solver->queue.search.stamp = 0;
86 } else
87 kissat_update_queue (solver, links, search);
88 }
89 kissat_dequeue_links (idx, links, &solver->queue);
91}
92
93static inline void kissat_move_to_front (kissat *solver, unsigned idx) {
94 queue *queue = &solver->queue;
95 links *links = solver->links;
96 if (idx == queue->last) {
98 return;
99 }
100 KISSAT_assert (idx < solver->vars);
101 const value tmp = VALUE (LIT (idx));
102 if (tmp && queue->search.idx == idx) {
103 unsigned prev = links[idx].prev;
104 if (!DISCONNECTED (prev))
105 kissat_update_queue (solver, links, prev);
106 else {
107 unsigned next = links[idx].next;
109 kissat_update_queue (solver, links, next);
110 }
111 }
112 kissat_dequeue_links (idx, links, queue);
113 kissat_enqueue_links (solver, idx, links, queue);
114 LOG ("moved-to-front %s stamped %u", LOGVAR (idx), LINK (idx).stamp);
115 if (!tmp)
116 kissat_update_queue (solver, links, idx);
118}
119
121
122#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
void kissat_reassign_queue_stamps(kissat *solver)
Definition queue.c:24
#define LINK(IDX)
Definition queue.h:31
#define DISCONNECT
Definition queue.h:7
#define kissat_check_queue(...)
Definition queue.h:36
#define DISCONNECTED(IDX)
Definition queue.h:8
#define LIT(IDX)
Definition literal.h:31
Definition queue.h:20
unsigned last
Definition queue.h:21
unsigned idx
Definition queue.h:23
unsigned first
Definition queue.h:21
unsigned stamp
Definition queue.h:21
struct queue::@155145366230376277010262212306311251364106156233 search
#define VALUE(LIT)
Definition value.h:10