ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
arena.h File Reference
#include "reference.h"
#include "stack.h"
#include "utilities.h"
#include "global.h"
Include dependency graph for arena.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define LD_MAX_ARENA_32   (29 - (unsigned) sizeof (ward) / 4)
 
#define LD_MAX_ARENA   ((sizeof (word) == 4) ? LD_MAX_ARENA_32 : LD_MAX_REF)
 
#define MAX_ARENA   ((size_t) 1 << LD_MAX_ARENA)
 

Functions

typedef STACK (ward) arena
 
reference kissat_allocate_clause (struct kissat *, size_t size)
 
void kissat_shrink_arena (struct kissat *)
 

Variables

ABC_NAMESPACE_HEADER_START typedef word ward
 

Macro Definition Documentation

◆ LD_MAX_ARENA

#define LD_MAX_ARENA   ((sizeof (word) == 4) ? LD_MAX_ARENA_32 : LD_MAX_REF)

Definition at line 19 of file arena.h.

◆ LD_MAX_ARENA_32

#define LD_MAX_ARENA_32   (29 - (unsigned) sizeof (ward) / 4)

Definition at line 17 of file arena.h.

◆ MAX_ARENA

#define MAX_ARENA   ((size_t) 1 << LD_MAX_ARENA)

Definition at line 21 of file arena.h.

Function Documentation

◆ kissat_allocate_clause()

reference kissat_allocate_clause ( struct 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 ( struct 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

◆ STACK()

typedef STACK ( ward )

Variable Documentation

◆ ward

Definition at line 12 of file arena.h.