ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
arena.c File Reference
#include "error.h"
#include "internal.h"
#include "logging.h"
#include "print.h"
Include dependency graph for arena.c:

Go to the source code of this file.

Functions

reference kissat_allocate_clause (kissat *solver, size_t size)
 
void kissat_shrink_arena (kissat *solver)
 

Function Documentation

◆ kissat_allocate_clause()

reference kissat_allocate_clause ( kissat * solver,
size_t size )

Definition at line 27 of file arena.c.

27 {
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}
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 CAPACITY_STACK(S)
Definition stack.h:20
#define SIZE_STACK(S)
Definition stack.h:19
#define INC(NAME)
#define LOG(...)
void kissat_fatal(const char *fmt,...)
Definition error.c:58
#define FORMAT_BYTES(BYTES)
Definition format.h:31
#define KISSAT_assert(ignore)
Definition global.h:13
#define KISSAT_COMPACT
Definition global.h:7
#define solver
Definition kitten.c:211
#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
Here is the call graph for this function:

◆ kissat_shrink_arena()

void kissat_shrink_arena ( kissat * solver)

Definition at line 68 of file arena.c.

68 {
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}
#define FORMAT_COUNT(WORD)
Definition format.h:33
#define SHRINK_STACK(S)
Definition stack.h:44
unsigned long long size
Definition giaNewBdd.h:39
#define kissat_phase(...)
Definition print.h:48
#define GET(NAME)
Definition statistics.h:416