ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
import.c
Go to the documentation of this file.
1#include "internal.h"
2#include "logging.h"
3#include "resize.h"
4
6
7static void adjust_imports_for_external_literal (kissat *solver,
8 unsigned eidx) {
9 while (eidx >= SIZE_STACK (solver->import)) {
10 struct import import;
11 import.lit = 0;
12 import.extension = false;
13 import.imported = false;
14 import.eliminated = false;
15 PUSH_STACK (solver->import, import);
16 }
17}
18
19static void adjust_exports_for_external_literal (kissat *solver,
20 unsigned eidx,
21 bool extension) {
22 struct import *import = &PEEK_STACK (solver->import, eidx);
23 unsigned iidx = solver->vars;
25 unsigned ilit = 2 * iidx;
26 import->extension = extension;
27 import->imported = true;
28 if (extension)
29 INC (variables_extension);
30 else
31 INC (variables_original);
33 import->lit = ilit;
34 LOG ("importing %s external variable %u as internal literal %u",
35 extension ? "extension" : "original", eidx, ilit);
36 while (iidx >= SIZE_STACK (solver->export_))
37 PUSH_STACK (solver->export_, 0);
38 POKE_STACK (solver->export_, iidx, (int) eidx);
39 LOG ("exporting internal variable %u as external literal %u", iidx, eidx);
40}
41
42static inline unsigned import_literal (kissat *solver, int elit,
43 bool extension) {
44 const unsigned eidx = ABS (elit);
45 adjust_imports_for_external_literal (solver, eidx);
46 struct import *import = &PEEK_STACK (solver->import, eidx);
47 if (import->eliminated)
48 return INVALID_LIT;
49 unsigned ilit;
50 if (!import->imported)
51 adjust_exports_for_external_literal (solver, eidx, extension);
53 ilit = import->lit;
54 if (elit < 0)
55 ilit = NOT (ilit);
57 return ilit;
58}
59
60unsigned kissat_import_literal (kissat *solver, int elit) {
62 if (GET_OPTION (tumble))
63 return import_literal (solver, elit, false);
64 const unsigned eidx = ABS (elit);
65 KISSAT_assert (SIZE_STACK (solver->import) <= UINT_MAX);
66 unsigned other = SIZE_STACK (solver->import);
67 if (eidx < other)
68 return import_literal (solver, elit, false);
69 if (!other)
70 adjust_imports_for_external_literal (solver, other++);
71
72 unsigned ilit = 0;
73 do {
75 ilit = import_literal (solver, other, false);
76 } while (other++ < eidx);
77
78 if (elit < 0)
79 ilit = NOT (ilit);
80
81 return ilit;
82}
83
85 size_t imported = SIZE_STACK (solver->import);
88 LOG ("can not get another external variable");
89 return INVALID_LIT;
90 }
91 KISSAT_assert (imported <= (unsigned) INT_MAX);
92 int eidx = (int) imported;
93 unsigned res = import_literal (solver, eidx, true);
94#ifndef KISSAT_NDEBUG
95 struct import *import = &PEEK_STACK (solver->import, imported);
98#endif
99 INC (fresh);
101 return res;
102}
103
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define POKE_STACK(S, N, E)
Definition stack.h:32
#define SIZE_STACK(S)
Definition stack.h:19
#define PUSH_STACK(S, E)
Definition stack.h:39
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
void kissat_activate_literal(kissat *solver, unsigned lit)
Definition flags.c:52
unsigned kissat_fresh_literal(kissat *solver)
Definition import.c:84
unsigned kissat_import_literal(kissat *solver, int elit)
Definition import.c:60
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define GET_OPTION(N)
Definition options.h:295
void kissat_enlarge_variables(kissat *solver, unsigned new_vars)
Definition resize.c:111
#define VALID_INTERNAL_LITERAL(LIT)
Definition literal.h:23
#define EXTERNAL_MAX_VAR
Definition literal.h:12
#define VALID_EXTERNAL_LITERAL(LIT)
Definition literal.h:25
#define NOT(LIT)
Definition literal.h:33
bool eliminated
Definition internal.h:52
bool extension
Definition internal.h:50
bool imported
Definition internal.h:51
unsigned lit
Definition internal.h:49
#define ABS(a)
Definition util_old.h:250