36 auto p =
reinterpret_cast<SolverParams*
>(state);
39 auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - p->start).count();
42 if (p->timeout && delta > p->timeout) {
51 auto delta_s = delta / 1000;
54 if (p->memory_limit && delta > 100 && delta_s > p->last_mem_check) {
55 p->last_mem_check = delta_s;
58 size_t memory_usage = 0;
59 std::ifstream str(
"/proc/self/status");
62 static std::regex vmsize(
"VmRSS:\\s*([0-9]+)\\s*kB");
63 while (std::getline(str, line)) {
65 if (std::regex_match(line, match, vmsize)) {
66 memory_usage = strtoul(match.str(1).c_str(), NULL, 10) / 1024;
74 if (memory_usage > p->memory_limit) {
98 if (node->isLogical() ==
false)
102 auto bzlaOptions = bitwuzla_options_new();
103 bitwuzla_set_option(bzlaOptions, BITWUZLA_OPT_PRODUCE_MODELS, 1);
104 auto bzla = bitwuzla_new(bzlaOptions);
108 bitwuzla_assert(bzla, bzlaAst.convert(node, bzla));
111 SolverParams p(this->timeout, this->memoryLimit);
112 if (this->timeout || this->memoryLimit) {
113 bitwuzla_set_termination_callback(bzla, this->
terminateCallback,
reinterpret_cast<void*
>(&p));
117 auto start = std::chrono::system_clock::now();
120 auto res = bitwuzla_check_sat(bzla);
131 case BITWUZLA_UNKNOWN:
137 std::vector<std::unordered_map<triton::usize, SolverModel>> ret;
138 while(res == BITWUZLA_SAT && limit >= 1) {
139 std::vector<BitwuzlaTerm> solution;
140 solution.reserve(bzlaAst.getVariables().size());
143 std::unordered_map<triton::usize, SolverModel> model;
144 for (
const auto& it : bzlaAst.getVariables()) {
145 const char* svalue = bitwuzla_term_value_get_str_fmt(bitwuzla_get_value(bzla, it.first), 2);
146 auto value = this->fromBvalueToUint512(svalue);
148 model[m.getId()] = m;
151 const auto& symvar_sort = bzlaAst.getBitvectorSorts().at(it.second->getSize());
152 auto cur_val = bitwuzla_mk_bv_value(symvar_sort, svalue, 2);
153 auto n = bitwuzla_mk_term2(BITWUZLA_KIND_EQUAL, it.first, cur_val);
154 solution.push_back(bitwuzla_mk_term1(BITWUZLA_KIND_NOT, n));
163 ret.push_back(model);
167 if (solution.size() > 1) {
168 bitwuzla_assert(bzla, bitwuzla_mk_term(BITWUZLA_KIND_OR, solution.size(), solution.data()));
171 bitwuzla_assert(bzla, solution.front());
175 res = bitwuzla_check_sat(bzla);
180 auto end = std::chrono::system_clock::now();
183 *solvingTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
185 bitwuzla_delete(bzla);
186 bitwuzla_options_delete(bzlaOptions);
211 if (node ==
nullptr) {
215 auto bzlaOptions = bitwuzla_options_new();
216 bitwuzla_set_option(bzlaOptions, BITWUZLA_OPT_PRODUCE_MODELS, 1);
217 auto bzla = bitwuzla_new(bzlaOptions);
220 if (bitwuzla_check_sat(bzla) != BITWUZLA_SAT) {
221 bitwuzla_delete(bzla);
222 bitwuzla_options_delete(bzlaOptions);
228 auto term_value = bitwuzla_get_value(bzla, bzlaAst.convert(node, bzla));
231 if (bitwuzla_term_is_bool(term_value)) {
232 res = bitwuzla_term_value_get_bool(term_value);
234 res =
triton::uint512{bitwuzla_term_value_get_str_fmt(term_value, 10)};
237 bitwuzla_delete(bzla);
238 bitwuzla_options_delete(bzlaOptions);