ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
sort.c
Go to the documentation of this file.
1#include "internal.h"
2#include "logging.h"
3
5
6static inline value
7move_smallest_literal_to_front (kissat *solver, const value *const values,
8 const assigned *const assigned,
9 bool satisfied_is_enough, unsigned start,
10 unsigned size, unsigned *lits) {
11 KISSAT_assert (1 < size);
12 KISSAT_assert (start < size);
13
14 unsigned a = lits[start];
15
16 value u = values[a];
17 if (!u || (u > 0 && satisfied_is_enough))
18 return u;
19
20 unsigned pos = 0, best = a;
21
22 {
23 const unsigned i = IDX (a);
24 unsigned k = (u ? assigned[i].level : UINT_MAX);
25
26 KISSAT_assert (start < UINT_MAX);
27 for (unsigned i = start + 1; i < size; i++) {
28 const unsigned b = lits[i];
29 const value v = values[b];
30
31 if (!v || (v > 0 && satisfied_is_enough)) {
32 best = b;
33 pos = i;
34 u = v;
35 break;
36 }
37
38 const unsigned j = IDX (b);
39 const unsigned l = (v ? assigned[j].level : UINT_MAX);
40
41 bool better;
42
43 if (u < 0 && v > 0)
44 better = true;
45 else if (u > 0 && v < 0)
46 better = false;
47 else if (u < 0) {
48 KISSAT_assert (v < 0);
49 better = (k < l);
50 } else {
51 KISSAT_assert (u > 0);
52 KISSAT_assert (v > 0);
53 KISSAT_assert (!satisfied_is_enough);
54 better = (k > l);
55 }
56
57 if (!better)
58 continue;
59
60 best = b;
61 pos = i;
62 u = v;
63 k = l;
64 }
65 }
66
67 if (!pos)
68 return u;
69
70 lits[start] = best;
71 lits[pos] = a;
72
73 LOG ("new smallest literal %s at %u swapped with %s at %u", LOGLIT (best),
74 pos, LOGLIT (a), start);
75#ifndef LOGGING
76 (void) solver;
77#endif
78 return u;
79}
80
81#ifdef INLINE_SORT
82static inline
83#endif
84 void
86#ifdef INLINE_SORT
87 const value *const values,
88 const assigned *assigned,
89#endif
90 unsigned size, unsigned *lits) {
91#ifndef INLINE_SORT
92 const value *const values = solver->values;
93 const assigned *const assigned = solver->assigned;
94#endif
95 value u = move_smallest_literal_to_front (solver, values, assigned, false,
96 0, size, lits);
97 if (size > 2)
98 move_smallest_literal_to_front (solver, values, assigned, (u >= 0), 1,
99 size, lits);
100}
101
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define INLINE_SORT
Definition collect.c:1
bool pos
Definition globals.c:30
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOGLIT(...)
Definition logging.hpp:99
unsigned long long size
Definition giaNewBdd.h:39
#define IDX(LIT)
Definition literal.h:28
void kissat_sort_literals(kissat *solver, unsigned size, unsigned *lits)
Definition sort.c:85
unsigned level
Definition assign.h:19