1use crate::lace::{Task, WorkerP};
2use crate::{MTBDD, MTBDDMAP};
3use libc::{c_char, c_double, c_int, c_long, c_void, size_t, FILE};
4use std::marker::{PhantomData, PhantomPinned};
5
6pub type MTBDD_APPLY_OP = extern "C" fn(*mut WorkerP, *mut Task, *mut MTBDD, *mut MTBDD) -> MTBDD;
7pub type MTBDD_APPLYP_OP =
8 extern "C" fn(*mut WorkerP, *mut Task, *mut MTBDD, *mut MTBDD, size_t) -> MTBDD;
9pub type MTBDD_UAPPLY_OP = extern "C" fn(*mut WorkerP, *mut Task, MTBDD, size_t) -> MTBDD;
10pub type MTBDD_ABSTRACT_OP = extern "C" fn(*mut WorkerP, *mut Task, MTBDD, MTBDD, c_int) -> MTBDD;
11pub type MTBDD_ENUM_CB =
12 extern "C" fn(*mut WorkerP, *mut Task, *mut MTBDDEnumTrace, MTBDD, *mut c_void);
13pub type MTBDD_EVAL_COMPOSE_CB = extern "C" fn(*mut WorkerP, *mut Task, MTBDD) -> MTBDD;
14pub type MTBDD_VISIT_PRE_CB = extern "C" fn(*mut WorkerP, *mut Task, MTBDD, *mut c_void) -> c_int;
15pub type MTBDD_VISIT_POST_CB = extern "C" fn(*mut WorkerP, *mut Task, MTBDD, *mut c_void);
16pub type MTBDD_ENUM_FILTER_CB = extern "C" fn(MTBDD) -> c_int;
17
18#[repr(C)]
19pub struct MTBDDEnumTrace {
20 pub prev: *mut MTBDDEnumTrace,
21 pub var: u32,
22 pub val: c_int,
23}
24
25#[repr(C)]
27pub struct SkipList {
28 _data: [u8; 0],
29 _marker: PhantomData<(*mut u8, PhantomPinned)>,
30}
31
32pub type SkipListPtr = *mut SkipList;
33
34extern "C" {
35 pub fn Sylvan_init_mtbdd() -> c_void;
36 pub fn Sylvan_init_bdd() -> c_void;
37 pub fn Sylvan_mtbdd_makeleaf(leaf_type: u32, value: u64) -> MTBDD;
38 pub fn Sylvan_mtbdd_makenode(var: u32, low: MTBDD, high: MTBDD) -> MTBDD;
39 pub fn Sylvan_makenode(var: u32, low: MTBDD, high: MTBDD) -> MTBDD;
40 pub fn Sylvan_mtbdd_isleaf(mtbdd: MTBDD) -> c_int;
41 pub fn Sylvan_mtbdd_isnode(mtbdd: MTBDD) -> c_int;
42 pub fn Sylvan_mtbdd_gettype(leaf: MTBDD) -> u32;
43 pub fn Sylvan_mtbdd_getvalue(leaf: MTBDD) -> u64;
44 pub fn Sylvan_mtbdd_getvar(node: MTBDD) -> u32;
45 pub fn Sylvan_var(node: MTBDD) -> u32;
46 pub fn Sylvan_mtbdd_getlow(node: MTBDD) -> MTBDD;
47 pub fn Sylvan_low(node: MTBDD) -> MTBDD;
48 pub fn Sylvan_mtbdd_gethigh(node: MTBDD) -> MTBDD;
49 pub fn Sylvan_high(node: MTBDD) -> MTBDD;
50 pub fn Sylvan_mtbdd_hascomp(dd: MTBDD) -> c_int;
51 pub fn Sylvan_mtbdd_comp(dd: MTBDD) -> MTBDD;
52 pub fn Sylvan_mtbdd_not(dd: MTBDD) -> MTBDD;
53 pub fn Sylvan_mtbdd_int64(value: i64) -> MTBDD;
54 pub fn Sylvan_mtbdd_double(value: c_double) -> MTBDD;
55 pub fn Sylvan_mtbdd_fraction(numer: i64, denom: u64) -> MTBDD;
56 pub fn Sylvan_mtbdd_getint64(terminal: MTBDD) -> i64;
57 pub fn Sylvan_mtbdd_getdouble(terminal: MTBDD) -> c_double;
58 pub fn Sylvan_mtbdd_getnumer(terminal: MTBDD) -> i32;
59 pub fn Sylvan_mtbdd_getdenom(terminal: MTBDD) -> u32;
60 pub fn Sylvan_mtbdd_ithvar(var: u32) -> MTBDD;
61 pub fn Sylvan_ithvar(var: u32) -> MTBDD;
62 pub fn Sylvan_mtbdd_set_empty() -> MTBDD;
63 pub fn Sylvan_set_empty() -> MTBDD;
64 pub fn Sylvan_mtbdd_set_isempty(set: MTBDD) -> c_int;
65 pub fn Sylvan_set_isempty(set: MTBDD) -> c_int;
66 pub fn Sylvan_mtbdd_set_first(set: MTBDD) -> u32;
67 pub fn Sylvan_set_first(set: MTBDD) -> u32;
68 pub fn Sylvan_mtbdd_set_next(set: MTBDD) -> MTBDD;
69 pub fn Sylvan_set_next(set: MTBDD) -> MTBDD;
70 pub fn Sylvan_mtbdd_set_from_array(arr: *mut u32, length: size_t) -> MTBDD;
71 pub fn Sylvan_mtbdd_fromarray(arr: *mut u32, length: size_t) -> MTBDD;
72 pub fn Sylvan_mtbdd_set_fromarray(arr: *mut u32, length: size_t) -> MTBDD;
73 pub fn Sylvan_set_fromarray(arr: *mut u32, length: size_t) -> MTBDD;
74 pub fn Sylvan_mtbdd_set_to_array(set: MTBDD, arr: *mut u32) -> c_void;
75 pub fn Sylvan_mtbdd_set_toarray(set: MTBDD, arr: *mut u32) -> c_void;
76 pub fn Sylvan_set_toarray(set: MTBDD, arr: *mut u32) -> c_void;
77 pub fn Sylvan_mtbdd_set_count(set: MTBDD) -> size_t;
78 pub fn Sylvan_set_count(set: MTBDD) -> size_t;
79 pub fn Sylvan_mtbdd_set_union(set1: MTBDD, set2: MTBDD) -> MTBDD;
80 pub fn Sylvan_mtbdd_set_addall(set1: MTBDD, set2: MTBDD) -> MTBDD;
81 pub fn Sylvan_set_addall(set1: MTBDD, set2: MTBDD) -> MTBDD;
82 pub fn Sylvan_mtbdd_set_minus(set1: MTBDD, set2: MTBDD) -> MTBDD;
83 pub fn Sylvan_mtbdd_set_removeall(set1: MTBDD, set2: MTBDD) -> MTBDD;
84 pub fn Sylvan_set_removeall(set1: MTBDD, set2: MTBDD) -> MTBDD;
85 pub fn Sylvan_mtbdd_set_contains(set: MTBDD, var: u32) -> c_int;
86 pub fn Sylvan_mtbdd_set_in(set: MTBDD, var: u32) -> c_int;
87 pub fn Sylvan_set_in(set: MTBDD, var: u32) -> c_int;
88 pub fn Sylvan_mtbdd_set_add(set: MTBDD, var: u32) -> MTBDD;
89 pub fn Sylvan_set_add(set: MTBDD, var: u32) -> MTBDD;
90 pub fn Sylvan_mtbdd_set_remove(set: MTBDD, var: u32) -> MTBDD;
91 pub fn Sylvan_set_remove(set: MTBDD, var: u32) -> MTBDD;
92 pub fn Sylvan_mtbdd_test_isset(set: MTBDD) -> c_void;
93 pub fn Sylvan_test_isset(set: MTBDD) -> c_void;
94 pub fn Sylvan_mtbdd_cube(variables: MTBDD, cube: *mut u8, terminal: MTBDD) -> MTBDD;
95 pub fn Sylvan_mtbdd_union_cube(
96 mtbdd: MTBDD,
97 variables: MTBDD,
98 cube: *mut u8,
99 terminal: MTBDD,
100 ) -> MTBDD;
101 pub fn Sylvan_mtbdd_satcount(dd: MTBDD, nvars: size_t) -> c_double;
102 pub fn Sylvan_mtbdd_leafcount_more(mtbdds: *const MTBDD, count: size_t) -> size_t;
103 pub fn Sylvan_mtbdd_leafcount(dd: MTBDD) -> size_t;
104 pub fn Sylvan_mtbdd_nodecount_more(mtbdds: *const MTBDD, count: size_t) -> size_t;
105 pub fn Sylvan_mtbdd_nodecount(dd: MTBDD) -> size_t;
106 pub fn Sylvan_nodecount(dd: MTBDD) -> size_t;
107 pub fn Sylvan_mtbdd_apply(a: MTBDD, b: MTBDD, op: MTBDD_APPLY_OP) -> MTBDD;
108 pub fn Sylvan_mtbdd_applyp(
109 a: MTBDD,
110 b: MTBDD,
111 p: size_t,
112 op: MTBDD_APPLYP_OP,
113 opid: u64,
114 ) -> MTBDD;
115 pub fn Sylvan_mtbdd_uapply(dd: MTBDD, op: MTBDD_UAPPLY_OP, param: size_t) -> MTBDD;
116 pub fn Sylvan_mtbdd_abstract(a: MTBDD, v: MTBDD, op: MTBDD_ABSTRACT_OP) -> MTBDD;
117 pub fn Sylvan_mtbdd_negate(a: MTBDD) -> MTBDD;
118 pub fn Sylvan_mtbdd_cmpl(a: MTBDD) -> MTBDD;
119 pub fn Sylvan_mtbdd_plus(a: MTBDD, b: MTBDD) -> MTBDD;
120 pub fn Sylvan_mtbdd_minus(a: MTBDD, b: MTBDD) -> MTBDD;
121 pub fn Sylvan_mtbdd_times(a: MTBDD, b: MTBDD) -> MTBDD;
122 pub fn Sylvan_mtbdd_min(a: MTBDD, b: MTBDD) -> MTBDD;
123 pub fn Sylvan_mtbdd_max(a: MTBDD, b: MTBDD) -> MTBDD;
124 pub fn Sylvan_mtbdd_abstract_plus(dd: MTBDD, v: MTBDD) -> MTBDD;
125 pub fn Sylvan_mtbdd_abstract_times(dd: MTBDD, v: MTBDD) -> MTBDD;
126 pub fn Sylvan_mtbdd_abstract_min(dd: MTBDD, v: MTBDD) -> MTBDD;
127 pub fn Sylvan_mtbdd_abstract_max(dd: MTBDD, v: MTBDD) -> MTBDD;
128 pub fn Sylvan_mtbdd_ite(f: MTBDD, g: MTBDD, h: MTBDD) -> MTBDD;
129 pub fn Sylvan_mtbdd_and_abstract_plus(a: MTBDD, b: MTBDD, vars: MTBDD) -> MTBDD;
130 pub fn Sylvan_mtbdd_and_exists(a: MTBDD, b: MTBDD, vars: MTBDD) -> MTBDD;
131 pub fn Sylvan_mtbdd_and_abstract_max(a: MTBDD, b: MTBDD, vars: MTBDD) -> MTBDD;
132 pub fn Sylvan_mtbdd_threshold_double(dd: MTBDD, value: c_double) -> MTBDD;
133 pub fn Sylvan_mtbdd_strict_threshold_double(dd: MTBDD, value: c_double) -> MTBDD;
134 pub fn Sylvan_mtbdd_equal_norm_d(a: MTBDD, b: MTBDD, epsilon: c_double) -> MTBDD;
135 pub fn Sylvan_mtbdd_equal_norm_rel_d(a: MTBDD, b: MTBDD, epsilon: c_double) -> MTBDD;
136 pub fn Sylvan_mtbdd_leq(a: MTBDD, b: MTBDD) -> MTBDD;
137 pub fn Sylvan_mtbdd_less(a: MTBDD, b: MTBDD) -> MTBDD;
138 pub fn Sylvan_mtbdd_geq(a: MTBDD, b: MTBDD) -> MTBDD;
139 pub fn Sylvan_mtbdd_greater(a: MTBDD, b: MTBDD) -> MTBDD;
140 pub fn Sylvan_mtbdd_support(dd: MTBDD) -> MTBDD;
141 pub fn Sylvan_support(dd: MTBDD) -> MTBDD;
142 pub fn Sylvan_mtbdd_compose(dd: MTBDD, map: MTBDDMAP) -> MTBDD;
143 pub fn Sylvan_mtbdd_minimum(dd: MTBDD) -> MTBDD;
144 pub fn Sylvan_mtbdd_maximum(dd: MTBDD) -> MTBDD;
145 pub fn Sylvan_mtbdd_enum_first(
146 dd: MTBDD,
147 variables: MTBDD,
148 arr: *mut u8,
149 filter_cb: MTBDD_ENUM_FILTER_CB,
150 ) -> MTBDD;
151 pub fn Sylvan_mtbdd_enum_next(
152 dd: MTBDD,
153 variables: MTBDD,
154 arr: *mut u8,
155 filter_cb: MTBDD_ENUM_FILTER_CB,
156 ) -> MTBDD;
157 pub fn Sylvan_mtbdd_enum_all_first(
158 dd: MTBDD,
159 variables: MTBDD,
160 arr: *mut u8,
161 filter_cb: MTBDD_ENUM_FILTER_CB,
162 ) -> MTBDD;
163 pub fn Sylvan_mtbdd_enum_all_next(
164 dd: MTBDD,
165 variables: MTBDD,
166 arr: *mut u8,
167 filter_cb: MTBDD_ENUM_FILTER_CB,
168 ) -> MTBDD;
169 pub fn Sylvan_mtbdd_enum_par(dd: MTBDD, cb: MTBDD_ENUM_CB, context: *mut c_void) -> c_void;
170 pub fn Sylvan_mtbdd_eval_compose(dd: MTBDD, vars: MTBDD, cb: MTBDD_EVAL_COMPOSE_CB) -> MTBDD;
171 pub fn Sylvan_mtbdd_test_isvalid(mtbdd: MTBDD) -> c_int;
172 pub fn Sylvan_test_isbdd(mtbdd: MTBDD) -> c_int;
173 pub fn Sylvan_mtbdd_fprintdot(out: *mut FILE, mtbdd: MTBDD) -> c_void;
174 pub fn Sylvan_fprintdot(out: *mut FILE, mtbdd: MTBDD) -> c_void;
175 pub fn Sylvan_mtbdd_printdot(mtbdd: MTBDD) -> c_void;
176 pub fn Sylvan_printdot(mtbdd: MTBDD) -> c_void;
177 pub fn Sylvan_mtbdd_fprintdot_nc(out: *mut FILE, mtbdd: MTBDD) -> c_void;
178 pub fn Sylvan_mtbdd_printdot_nc(mtbdd: MTBDD) -> c_void;
179 pub fn Sylvan_mtbdd_fprint_leaf(out: *mut FILE, leaf: MTBDD) -> c_void;
180 pub fn Sylvan_mtbdd_print_leaf(leaf: MTBDD) -> c_void;
181 pub fn Sylvan_mtbdd_leaf_to_str(leaf: MTBDD, buf: *mut c_char, buflen: size_t) -> *mut c_char;
182 pub fn Sylvan_mtbdd_printsha(dd: MTBDD) -> c_void;
183 pub fn Sylvan_printsha(dd: MTBDD) -> c_void;
184 pub fn Sylvan_mtbdd_fprintsha(f: *mut FILE, dd: MTBDD) -> c_void;
185 pub fn Sylvan_fprintsha(f: *mut FILE, dd: MTBDD) -> c_void;
186 pub fn Sylvan_mtbdd_getsha(dd: MTBDD, target: *mut c_char) -> c_void;
187 pub fn Sylvan_getsha(dd: MTBDD, target: *mut c_char) -> c_void;
188 pub fn Sylvan_mtbdd_visit_seq(
189 dd: MTBDD,
190 pre: MTBDD_VISIT_PRE_CB,
191 post: MTBDD_VISIT_POST_CB,
192 context: *mut c_void,
193 ) -> c_void;
194 pub fn Sylvan_mtbdd_visit_par(
195 dd: MTBDD,
196 pre: MTBDD_VISIT_PRE_CB,
197 post: MTBDD_VISIT_POST_CB,
198 context: *mut c_void,
199 ) -> c_void;
200 pub fn Sylvan_mtbdd_writer_tobinary(file: *mut FILE, dds: *mut MTBDD, count: c_int) -> c_void;
201 pub fn Sylvan_mtbdd_writer_totext(file: *mut FILE, dds: *mut MTBDD, count: c_int) -> c_void;
202 pub fn Sylvan_mtbdd_writer_start() -> SkipListPtr;
203 pub fn Sylvan_mtbdd_writer_add(sl: SkipListPtr, dd: MTBDD) -> c_void;
204 pub fn Sylvan_mtbdd_writer_writebinary(out: *mut FILE, sl: SkipListPtr) -> c_void;
205 pub fn Sylvan_mtbdd_writer_get(sl: SkipListPtr, dd: MTBDD) -> u64;
206 pub fn Sylvan_mtbdd_writer_end(sl: SkipListPtr) -> c_void;
207 pub fn Sylvan_mtbdd_reader_frombinary(file: *mut FILE, dds: *mut MTBDD, count: c_int) -> c_int;
208 pub fn Sylvan_mtbdd_reader_readbinary(file: *mut FILE) -> *mut u64;
209 pub fn Sylvan_mtbdd_reader_get(arr: *mut u64, identifier: u64) -> MTBDD;
210 pub fn Sylvan_mtbdd_reader_end(arr: *mut u64) -> c_void;
211 pub fn Sylvan_mtbdd_map_empty() -> MTBDD;
212 pub fn Sylvan_map_empty() -> MTBDD;
213 pub fn Sylvan_mtbdd_map_isempty(map: MTBDD) -> c_int;
214 pub fn Sylvan_map_isempty(map: MTBDD) -> c_int;
215 pub fn Sylvan_mtbdd_map_key(map: MTBDD) -> u32;
216 pub fn Sylvan_map_key(map: MTBDD) -> u32;
217 pub fn Sylvan_mtbdd_map_value(map: MTBDD) -> MTBDD;
218 pub fn Sylvan_map_value(map: MTBDD) -> MTBDD;
219 pub fn Sylvan_mtbdd_map_next(map: MTBDD) -> MTBDD;
220 pub fn Sylvan_map_next(map: MTBDD) -> MTBDD;
221 pub fn Sylvan_mtbdd_map_contains(map: MTBDDMAP, key: u32) -> c_int;
222 pub fn Sylvan_map_contains(map: MTBDDMAP, key: u32) -> c_int;
223 pub fn Sylvan_mtbdd_map_count(map: MTBDDMAP) -> size_t;
224 pub fn Sylvan_map_count(map: MTBDDMAP) -> size_t;
225 pub fn Sylvan_mtbdd_map_add(map: MTBDDMAP, key: u32, value: MTBDD) -> MTBDDMAP;
226 pub fn Sylvan_map_add(map: MTBDDMAP, key: u32, value: MTBDD) -> MTBDDMAP;
227 pub fn Sylvan_mtbdd_map_update(map1: MTBDDMAP, map2: MTBDDMAP) -> MTBDDMAP;
228 pub fn Sylvan_mtbdd_map_addall(map1: MTBDDMAP, map2: MTBDDMAP) -> MTBDDMAP;
229 pub fn Sylvan_map_addall(map1: MTBDDMAP, map2: MTBDDMAP) -> MTBDDMAP;
230 pub fn Sylvan_mtbdd_map_remove(map: MTBDDMAP, key: u32) -> MTBDDMAP;
231 pub fn Sylvan_map_remove(map: MTBDDMAP, key: u32) -> MTBDDMAP;
232 pub fn Sylvan_mtbdd_map_removeall(map: MTBDDMAP, variables: MTBDD) -> MTBDDMAP;
233 pub fn Sylvan_map_removeall(map: MTBDDMAP, variables: MTBDD) -> MTBDDMAP;
234 pub fn Sylvan_mtbdd_gc_mark_rec(mtbdd: MTBDD) -> c_void;
235 pub fn Sylvan_gc_mark_rec(mtbdd: MTBDD) -> c_void;
236 pub fn Sylvan_mtbdd_protect(ptr: *mut MTBDD) -> c_void;
237 pub fn Sylvan_protect(ptr: *mut MTBDD) -> c_void;
238 pub fn Sylvan_mtbdd_unprotect(ptr: *mut MTBDD) -> c_void;
239 pub fn Sylvan_unprotect(ptr: *mut MTBDD) -> c_void;
240 pub fn Sylvan_mtbdd_count_protected() -> size_t;
241 pub fn Sylvan_count_protected() -> size_t;
242 pub fn Sylvan_mtbdd_ref(dd: MTBDD) -> MTBDD;
243 pub fn Sylvan_ref(dd: MTBDD) -> MTBDD;
244 pub fn Sylvan_mtbdd_deref(dd: MTBDD) -> c_void;
245 pub fn Sylvan_deref(dd: MTBDD) -> c_void;
246 pub fn Sylvan_mtbdd_count_refs() -> size_t;
247 pub fn Sylvan_count_refs() -> size_t;
248 pub fn Sylvan_mtbdd_refs_pushptr(ptr: *const MTBDD) -> c_void;
249 pub fn Sylvan_refs_pushptr(ptr: *const MTBDD) -> c_void;
250 pub fn Sylvan_mtbdd_refs_popptr(amount: size_t) -> c_void;
251 pub fn Sylvan_refs_popptr(amount: size_t) -> c_void;
252 pub fn Sylvan_mtbdd_refs_push(mtbdd: MTBDD) -> MTBDD;
253 pub fn Sylvan_refs_push(mtbdd: MTBDD) -> MTBDD;
254 pub fn Sylvan_mtbdd_refs_pop(amount: c_long) -> c_void;
255 pub fn Sylvan_refs_pop(amount: c_long) -> c_void;
256 pub fn Sylvan_mtbdd_refs_spawn(t: *mut Task) -> c_void;
257 pub fn Sylvan_refs_spawn(t: *mut Task) -> c_void;
258 pub fn Sylvan_mtbdd_refs_sync(mtbdd: MTBDD) -> MTBDD;
259 pub fn Sylvan_refs_sync(mtbdd: MTBDD) -> MTBDD;
260}