ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
clause.c
Go to the documentation of this file.
1#include "allocate.h"
2#include "collect.h"
3#include "inline.h"
4
5#include <string.h>
6
8
9static void inc_clause (kissat *solver, bool original, bool redundant,
10 bool binary) {
11 if (binary)
12 INC (clauses_binary);
13 else if (redundant)
14 INC (clauses_redundant);
15 else
16 INC (clauses_irredundant);
17 INC (clauses_added);
18 if (original)
19 INC (clauses_original);
20}
21
22static void dec_clause (kissat *solver, bool redundant, bool binary) {
23 if (binary)
24 DEC (clauses_binary);
25 else if (redundant)
26 DEC (clauses_redundant);
27 else
28 DEC (clauses_irredundant);
29}
30
31static void init_clause (clause *res, bool redundant, unsigned glue,
32 unsigned size) {
33 KISSAT_assert (size <= UINT_MAX);
34 KISSAT_assert (redundant || !glue);
35
36 glue = MIN (MAX_GLUE, glue);
37
38 res->glue = glue;
39 res->garbage = false;
40 res->quotient = false;
41 res->reason = false;
42 res->redundant = redundant;
43 res->shrunken = false;
44 res->subsume = false;
45 res->swept = false;
46 res->vivify = false;
47
48 res->used = 0;
49
50 res->searched = 2;
51 res->size = size;
52}
53
55 watches *all_watches = solver->watches;
56 clause *c = kissat_dereference_clause (solver, ref);
57 kissat_inlined_connect_clause (solver, all_watches, c, ref);
58}
59
61 watches *all_watches = solver->watches;
62 const reference ref = kissat_reference_clause (solver, c);
63 kissat_inlined_connect_clause (solver, all_watches, c, ref);
64}
65
66static reference new_binary_clause (kissat *solver, bool original,
67 bool watch, unsigned first,
68 unsigned second) {
69 KISSAT_assert (first != second);
70 KISSAT_assert (first != NOT (second));
71 if (watch)
72 kissat_watch_binary (solver, first, second);
73 kissat_mark_added_literal (solver, first);
74 kissat_mark_added_literal (solver, second);
75 inc_clause (solver, original, false, true);
76 if (!original) {
77 CHECK_AND_ADD_BINARY (first, second);
78 ADD_BINARY_TO_PROOF (first, second);
79 }
80 return INVALID_REF;
81}
82
83static reference new_large_clause (kissat *solver, bool original,
84 bool redundant, unsigned glue,
85 unsigned size, unsigned *lits) {
86 KISSAT_assert (size > 2);
88 clause *c = kissat_unchecked_dereference_clause (solver, res);
89 init_clause (c, redundant, glue, size);
90 memcpy (c->lits, lits, size * sizeof (unsigned));
91 LOGREF (res, "new");
92 if (solver->watching)
93 kissat_watch_reference (solver, lits[0], lits[1], res);
94 else
96 if (redundant) {
97 if (solver->first_reducible == INVALID_REF)
98 solver->first_reducible = res;
99 } else {
101 solver->last_irredundant = res;
102 }
103 inc_clause (solver, original, redundant, false);
104 if (!original) {
107 }
108 return res;
109}
110
111static reference new_clause (kissat *solver, bool original, bool redundant,
112 unsigned glue, unsigned size, unsigned *lits) {
113 reference res;
114 if (size == 2)
115 res = new_binary_clause (solver, original, true, lits[0], lits[1]);
116 else
117 res = new_large_clause (solver, original, redundant, glue, size, lits);
118 kissat_defrag_watches_if_needed (solver);
119 return res;
120}
121
123 unsigned second) {
124 (void) new_binary_clause (solver, false, true, first, second);
125}
126
128 unsigned second) {
129 (void) new_binary_clause (solver, false, false, first, second);
130}
131
133 const unsigned size = SIZE_STACK (solver->clause);
134 unsigned *lits = BEGIN_STACK (solver->clause);
135 kissat_sort_literals (solver, size, lits);
136 reference res = new_clause (solver, true, false, 0, size, lits);
137 return res;
138}
139
141 const unsigned size = SIZE_STACK (solver->clause);
142 unsigned *lits = BEGIN_STACK (solver->clause);
143 return new_clause (solver, false, false, 0, size, lits);
144}
145
147 const unsigned size = SIZE_STACK (solver->clause);
148 unsigned *lits = BEGIN_STACK (solver->clause);
149 return new_clause (solver, false, true, glue, size, lits);
150}
151
152static void mark_clause_as_garbage (kissat *solver, clause *c) {
154 LOGCLS (c, "garbage");
155 if (!c->redundant)
159 KISSAT_assert (c->size > 2);
160 dec_clause (solver, c->redundant, false);
161 c->garbage = true;
162}
163
166 mark_clause_as_garbage (solver, c);
167 size_t bytes = kissat_actual_bytes_of_clause (c);
168 ADD (arena_garbage, bytes);
169}
170
172 LOGCLS (c, "delete");
173 KISSAT_assert (c->size > 2);
175 size_t bytes = kissat_actual_bytes_of_clause (c);
176 SUB (arena_garbage, bytes);
177 INC (clauses_deleted);
178 return (clause *) ((char *) c + bytes);
179}
180
181void kissat_delete_binary (kissat *solver, unsigned a, unsigned b) {
182 LOGBINARY (a, b, "delete");
183 kissat_mark_removed_literal (solver, a);
184 kissat_mark_removed_literal (solver, b);
187 dec_clause (solver, false, true);
188 INC (clauses_deleted);
189}
190
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
reference kissat_allocate_clause(kissat *solver, size_t size)
Definition arena.c:27
#define BEGIN_STACK(S)
Definition stack.h:46
#define SIZE_STACK(S)
Definition stack.h:19
#define ADD(NAME, DELTA)
#define INC(NAME)
#define REMOVE_CHECKER_CLAUSE(...)
Definition check.h:167
#define CHECK_AND_ADD_BINARY(...)
Definition check.h:137
#define CHECK_AND_ADD_CLAUSE(...)
Definition check.h:143
#define REMOVE_CHECKER_BINARY(...)
Definition check.h:161
reference kissat_new_redundant_clause(kissat *solver, unsigned glue)
Definition clause.c:146
reference kissat_new_irredundant_clause(kissat *solver)
Definition clause.c:140
void kissat_connect_referenced(kissat *solver, reference ref)
Definition clause.c:54
reference kissat_new_original_clause(kissat *solver)
Definition clause.c:132
void kissat_mark_clause_as_garbage(kissat *solver, clause *c)
Definition clause.c:164
void kissat_new_binary_clause(kissat *solver, unsigned first, unsigned second)
Definition clause.c:122
void kissat_connect_clause(kissat *solver, clause *c)
Definition clause.c:60
void kissat_new_unwatched_binary_clause(kissat *solver, unsigned first, unsigned second)
Definition clause.c:127
clause * kissat_delete_clause(kissat *solver, clause *c)
Definition clause.c:171
void kissat_delete_binary(kissat *solver, unsigned a, unsigned b)
Definition clause.c:181
void kissat_mark_removed_literals(kissat *solver, unsigned size, unsigned *lits)
Definition flags.c:107
void kissat_mark_added_literals(kissat *solver, unsigned size, unsigned *lits)
Definition flags.c:113
void kissat_sort_literals(struct kissat *, unsigned size, unsigned *lits)
Definition sort.c:85
#define MAX_GLUE
Definition clause.h:19
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOGREF(...)
Definition logging.h:433
#define LOGBINARY(...)
Definition logging.h:442
#define LOGCLS(...)
Definition logging.h:415
unsigned long long size
Definition giaNewBdd.h:39
#define ADD_BINARY_TO_PROOF(...)
Definition proof.h:123
#define ADD_CLAUSE_TO_PROOF(...)
Definition proof.h:129
#define DELETE_CLAUSE_FROM_PROOF(...)
Definition proof.h:155
#define DELETE_BINARY_FROM_PROOF(...)
Definition proof.h:149
#define INVALID_REF
Definition reference.h:16
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
#define NOT(LIT)
Definition literal.h:33
#define DEC(NAME)
Definition statistics.h:413
#define SUB(NAME, N)
Definition statistics.h:415
bool quotient
Definition clause.h:26
bool vivify
Definition clause.h:32
bool reason
Definition clause.h:27
unsigned glue
Definition clause.h:23
bool swept
Definition clause.h:31
unsigned lits[3]
Definition clause.h:39
bool redundant
Definition clause.h:28
unsigned searched
Definition clause.h:36
bool subsume
Definition clause.h:30
unsigned used
Definition clause.h:34
unsigned size
Definition clause.h:37
bool shrunken
Definition clause.h:29
bool garbage
Definition clause.h:25
Definition watch.h:41
char * memcpy()
#define MIN(a, b)
Definition util_old.h:256
vector watches
Definition watch.h:49