ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
arena.c
Go to the documentation of this file.
1#include "error.h"
2#include "internal.h"
3#include "logging.h"
4#include "print.h"
5
7
8static void report_resized (kissat *solver, const char *mode,
9 arena before) {
10#ifndef KISSAT_QUIET
11 ward *const old_begin = BEGIN_STACK (before);
12 ward *const new_begin = BEGIN_STACK (solver->arena);
13 const bool moved = (new_begin != old_begin);
14 const uint64_t capacity = CAPACITY_STACK (solver->arena);
15 const uint64_t bytes = capacity * sizeof (ward);
16 kissat_phase (solver, "arena", GET (arena_resized),
17 "%s to %s %d-byte-words %s (%s)", mode,
18 FORMAT_COUNT (capacity), (int) sizeof (ward),
19 FORMAT_BYTES (bytes), (moved ? "moved" : "in place"));
20#else
21 (void) solver;
22 (void) mode;
23 (void) before;
24#endif
25}
26
28 KISSAT_assert (size <= UINT_MAX);
29 const size_t res = SIZE_STACK (solver->arena);
30 KISSAT_assert (res <= MAX_REF);
31 const size_t bytes = kissat_bytes_of_clause (size);
32 KISSAT_assert (kissat_aligned_word (bytes));
33 const size_t needed = bytes / sizeof (ward);
34 KISSAT_assert (needed <= UINT_MAX);
35 size_t capacity = CAPACITY_STACK (solver->arena);
36 KISSAT_assert (kissat_is_power_of_two (MAX_ARENA));
37 KISSAT_assert (capacity <= MAX_ARENA);
38 size_t available = capacity - res;
39 if (needed > available) {
40 const arena before = solver->arena;
41 do {
42 KISSAT_assert (kissat_is_zero_or_power_of_two (capacity));
43 if (capacity == MAX_ARENA)
44 kissat_fatal ("maximum arena capacity "
45 "of 2^%u %zu-byte-words %s exhausted"
46#ifdef KISSAT_COMPACT
47 " (consider a configuration without '--compact')"
48#endif
49 ,
50 LD_MAX_ARENA, sizeof (ward),
51 FORMAT_BYTES (MAX_ARENA * sizeof (ward)));
52 kissat_stack_enlarge (solver, (chars *) &solver->arena,
53 sizeof (ward));
54 capacity = CAPACITY_STACK (solver->arena);
55 available = capacity - res;
56 } while (needed > available);
57 INC (arena_resized);
58 INC (arena_enlarged);
59 report_resized (solver, "enlarged", before);
60 KISSAT_assert (capacity <= MAX_ARENA);
61 }
62 solver->arena.end += needed;
63 LOG ("allocated clause[%zu] of size %zu bytes %s", res, size,
64 FORMAT_BYTES (bytes));
65 return (reference) res;
66}
67
69 const arena before = solver->arena;
70 const size_t capacity = CAPACITY_STACK (before);
71 const size_t size = SIZE_STACK (before);
72#ifndef KISSAT_QUIET
73 const size_t capacity_bytes = capacity * sizeof (ward);
74 kissat_phase (solver, "arena", GET (arena_resized),
75 "capacity of %s %d-byte-words %s", FORMAT_COUNT (capacity),
76 (int) sizeof (ward), FORMAT_BYTES (capacity_bytes));
77 const size_t size_bytes = size * sizeof (ward);
78 kissat_phase (solver, "arena", GET (arena_resized),
79 "filled %.0f%% with %s %d-byte-words %s",
80 kissat_percent (size, capacity), FORMAT_COUNT (size),
81 (int) sizeof (ward), FORMAT_BYTES (size_bytes));
82#endif
83 if (size > capacity / 4) {
84 kissat_phase (solver, "arena", GET (arena_resized),
85 "not shrinking since more than 25%% filled");
86 return;
87 }
88 INC (arena_resized);
89 INC (arena_shrunken);
90 SHRINK_STACK (solver->arena);
91 report_resized (solver, "shrunken", before);
92}
93
94#if !defined(KISSAT_NDEBUG) || defined(LOGGING)
95
96bool kissat_clause_in_arena (const kissat *solver, const clause *c) {
97 if (!kissat_aligned_pointer (c))
98 return false;
99 const char *p = (char *) c;
100 const char *begin = (char *) BEGIN_STACK (solver->arena);
101 const char *end = (char *) END_STACK (solver->arena);
102 if (p < begin)
103 return false;
104 const size_t bytes = kissat_bytes_of_clause (c->size);
105 if (end < p + bytes)
106 return false;
107 return true;
108}
109
110#endif
111
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
reference kissat_allocate_clause(kissat *solver, size_t size)
Definition arena.c:27
void kissat_shrink_arena(kissat *solver)
Definition arena.c:68
ABC_NAMESPACE_HEADER_START typedef word ward
Definition arena.h:12
#define LD_MAX_ARENA
Definition arena.h:19
#define MAX_ARENA
Definition arena.h:21
#define BEGIN_STACK(S)
Definition stack.h:46
#define CAPACITY_STACK(S)
Definition stack.h:20
#define SIZE_STACK(S)
Definition stack.h:19
#define END_STACK(S)
Definition stack.h:48
#define INC(NAME)
#define LOG(...)
void kissat_fatal(const char *fmt,...)
Definition error.c:58
Cube * p
Definition exorList.c:222
#define FORMAT_COUNT(WORD)
Definition format.h:33
#define FORMAT_BYTES(BYTES)
Definition format.h:31
#define KISSAT_assert(ignore)
Definition global.h:13
#define KISSAT_COMPACT
Definition global.h:7
#define SHRINK_STACK(S)
Definition stack.h:44
#define solver
Definition kitten.c:211
#define kissat_phase(...)
Definition print.h:48
#define MAX_REF
Definition reference.h:14
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
ABC_NAMESPACE_IMPL_START void kissat_stack_enlarge(struct kissat *solver, chars *s, size_t bytes)
Definition stack.c:9
#define GET(NAME)
Definition statistics.h:416
unsigned size
Definition clause.h:37
Definition mode.h:11