ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cadical_reap.cpp
Go to the documentation of this file.
1#include "global.h"
2
3#include "reap.hpp"
4#include <cassert>
5#include <climits>
6#include <cstring>
7
8#ifdef _MSC_VER
9#include <intrin.h>
10static inline int __builtin_clz(unsigned x) {
11 unsigned long r;
12 _BitScanReverse(&r, x);
13 return (int)(r ^ 31);
14}
15#endif
16
18
19void Reap::init () {
20 for (auto &bucket : buckets)
21 bucket = {0};
22 CADICAL_assert (!num_elements);
23 CADICAL_assert (!last_deleted);
24 min_bucket = 32;
25 CADICAL_assert (!max_bucket);
26}
27
29 num_elements = 0;
30 last_deleted = 0;
31 min_bucket = 32;
32 max_bucket = 0;
33}
34
36 num_elements = 0;
37 last_deleted = 0;
38 min_bucket = 32;
39 max_bucket = 0;
40}
41
42static inline unsigned leading_zeroes_of_unsigned (unsigned x) {
43 return x ? __builtin_clz (x) : sizeof (unsigned) * 8;
44}
45
46void Reap::push (unsigned e) {
47 CADICAL_assert (last_deleted <= e);
48 const unsigned diff = e ^ last_deleted;
49 const unsigned bucket = 32 - leading_zeroes_of_unsigned (diff);
50 buckets[bucket].push_back (e);
51 if (min_bucket > bucket)
52 min_bucket = bucket;
53 if (max_bucket < bucket)
54 max_bucket = bucket;
55 CADICAL_assert (num_elements != UINT_MAX);
56 num_elements++;
57}
58
59unsigned Reap::pop () {
60 CADICAL_assert (num_elements > 0);
61 unsigned i = min_bucket;
62 for (;;) {
63 CADICAL_assert (i < 33);
64 CADICAL_assert (i <= max_bucket);
65 std::vector<unsigned> &s = buckets[i];
66 if (s.empty ()) {
67 min_bucket = ++i;
68 continue;
69 }
70 unsigned res;
71 if (i) {
72 res = UINT_MAX;
73 const auto begin = std::begin (s);
74 const auto end = std::end (s);
75 auto q = std::begin (s);
76 CADICAL_assert (begin < end);
77 for (auto p = begin; p != end; ++p) {
78 const unsigned tmp = *p;
79 if (tmp >= res)
80 continue;
81 res = tmp;
82 q = p;
83 }
84
85 for (auto p = begin; p != end; ++p) {
86 if (p == q)
87 continue;
88 const unsigned other = *p;
89 const unsigned diff = other ^ res;
90 CADICAL_assert (sizeof (unsigned) == 4);
91 const unsigned j = 32 - leading_zeroes_of_unsigned (diff);
92 CADICAL_assert (j < i);
93 buckets[j].push_back (other);
94 if (min_bucket > j)
95 min_bucket = j;
96 }
97
98 s.clear ();
99
100 if (i && max_bucket == i) {
101#ifndef CADICAL_NDEBUG
102 for (unsigned j = i + 1; j < 33; j++)
103 CADICAL_assert (buckets[j].empty ());
104#endif
105 if (s.empty ())
106 max_bucket = i - 1;
107 }
108 } else {
109 res = last_deleted;
110 CADICAL_assert (!buckets[0].empty ());
111 CADICAL_assert (buckets[0].at (0) == res);
112 buckets[0].pop_back ();
113 }
114
115 if (min_bucket == i) {
116#ifndef CADICAL_NDEBUG
117 for (unsigned j = 0; j < i; j++)
118 CADICAL_assert (buckets[j].empty ());
119#endif
120 if (s.empty ())
121 min_bucket = std::min ((int) (i + 1), 32);
122 }
123
124 --num_elements;
125 CADICAL_assert (last_deleted <= res);
126 last_deleted = res;
127
128 return res;
129 }
130}
131
132void Reap::clear () {
133 CADICAL_assert (max_bucket <= 32);
134 for (unsigned i = 0; i < 33; i++)
135 buckets[i].clear ();
136 num_elements = 0;
137 last_deleted = 0;
138 min_bucket = 32;
139 max_bucket = 0;
140}
141
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
Definition global.h:14
void init()
unsigned pop()
void push(unsigned)
bool empty()
Definition reap.hpp:16
void release()
void clear()
Cube * p
Definition exorList.c:222