bitwuzla_sys/
lib.rs

1//! Low-level bindings for the [Bitwuzla] SMT solver.
2//!
3//! Please see the Bitwuzla [C API documentation] for function descriptions.
4//!
5//! [Bitwuzla]: https://bitwuzla.github.io/
6//! [C API documentation]: https://bitwuzla.github.io/docs/c/api.html
7
8#![allow(non_snake_case)]
9#![allow(non_upper_case_globals)]
10
11include!("../src-generated/bindings.rs");
12
13#[cfg(test)]
14mod tests {
15    #[test]
16    fn smoke_test() {
17        use std::ffi::CStr;
18        use crate::*;
19
20        unsafe {
21            let term_manager = bitwuzla_term_manager_new();
22
23            let s = bitwuzla_mk_bv_sort(term_manager, 16);
24            let a = bitwuzla_mk_const(term_manager, s, b"a\0" as *const _ as _);
25            let b = bitwuzla_mk_const(term_manager, s, b"b\0" as *const _ as _);
26            let c = bitwuzla_mk_const(term_manager, s, b"c\0" as *const _ as _);
27
28            let a_lt_b = bitwuzla_mk_term2(term_manager, BITWUZLA_KIND_BV_SLT, a, b);
29            let a_plus_c = bitwuzla_mk_term2(term_manager, BITWUZLA_KIND_BV_ADD, a, c);
30            let b_plus_c = bitwuzla_mk_term2(term_manager, BITWUZLA_KIND_BV_ADD, b, c);
31            let a_plus_c_gt_b_plus_c = bitwuzla_mk_term2(term_manager, BITWUZLA_KIND_BV_SGT, a_plus_c, b_plus_c);
32
33            let options = bitwuzla_options_new();
34            bitwuzla_set_option(options, BITWUZLA_OPT_PRODUCE_MODELS, 1);
35
36            let bzla = bitwuzla_new(term_manager, options);
37            bitwuzla_assert(bzla, a_lt_b);
38            bitwuzla_assert(bzla, a_plus_c_gt_b_plus_c);
39
40            assert_eq!(bitwuzla_check_sat(bzla), BITWUZLA_SAT);
41
42            let a = CStr::from_ptr(bitwuzla_term_value_get_str(bitwuzla_get_value(bzla, a))).to_str().unwrap().to_string();
43            let b = CStr::from_ptr(bitwuzla_term_value_get_str(bitwuzla_get_value(bzla, b))).to_str().unwrap().to_string();
44            let c = CStr::from_ptr(bitwuzla_term_value_get_str(bitwuzla_get_value(bzla, c))).to_str().unwrap().to_string();
45
46            let a = u16::from_str_radix(&a, 2).unwrap() as i16;
47            let b = u16::from_str_radix(&b, 2).unwrap() as i16;
48            let c = u16::from_str_radix(&c, 2).unwrap() as i16;
49
50            assert!(a.checked_add(c).is_none() || b.checked_add(c).is_none());
51
52            bitwuzla_delete(bzla);
53            bitwuzla_options_delete(options);
54            bitwuzla_term_manager_delete(term_manager);
55        }
56    }
57}