diff --git a/scripts/update_api.py b/scripts/update_api.py index 43903e92c..8c6275c56 100755 --- a/scripts/update_api.py +++ b/scripts/update_api.py @@ -91,7 +91,7 @@ Type2Dotnet = { VOID : 'void', VOID_PTR : 'IntPtr', INT : 'int', UINT : 'uint', # Mapping to ML types -Type2ML = { VOID : 'unit', VOID_PTR : 'ptr', INT : 'int', UINT : 'int', INT64 : 'int', UINT64 : 'int', DOUBLE : 'float', +Type2ML = { VOID : 'unit', VOID_PTR : 'ptr', INT : 'int', UINT : 'int', INT64 : 'int64', UINT64 : 'int64', DOUBLE : 'float', FLOAT : 'float', STRING : 'string', STRING_PTR : 'char**', BOOL : 'bool', SYMBOL : 'z3_symbol', PRINT_MODE : 'int', ERROR_CODE : 'int', CHAR : 'char', CHAR_PTR : 'string', LBOOL : 'int' } @@ -254,8 +254,10 @@ def param2pystr(p): def param2ml(p): k = param_kind(p) if k == OUT: - if param_type(p) == INT or param_type(p) == UINT or param_type(p) == BOOL or param_type(p) == INT64 or param_type(p) == UINT64: + if param_type(p) == INT or param_type(p) == UINT or param_type(p) == BOOL: return "int" + elif param_type(p) == INT64 or param_type(p) == UINT64: + return "int64" elif param_type(p) == STRING: return "string" else: @@ -1252,9 +1254,9 @@ def ml_unwrap(t, ts, s): elif t == UINT: return '(' + ts + ') Unsigned_int_val(' + s + ')' elif t == INT64: - return '(' + ts + ') Long_val(' + s + ')' + return '(' + ts + ') Int64_val(' + s + ')' elif t == UINT64: - return '(' + ts + ') Unsigned_long_val(' + s + ')' + return '(' + ts + ') Int64_val(' + s + ')' elif t == DOUBLE: return '(' + ts + ') Double_val(' + s + ')' elif ml_has_plus_type(ts): @@ -1271,7 +1273,7 @@ def ml_set_wrap(t, d, n): elif t == INT or t == UINT or t == PRINT_MODE or t == ERROR_CODE or t == LBOOL: return d + ' = Val_int(' + n + ');' elif t == INT64 or t == UINT64: - return d + ' = Val_long(' + n + ');' + return d + ' = caml_copy_int64(' + n + ');' elif t == DOUBLE: return d + '= caml_copy_double(' + n + ');' elif t == STRING: diff --git a/src/api/ml/z3.mli b/src/api/ml/z3.mli index 74320dd72..a7c629018 100644 --- a/src/api/ml/z3.mli +++ b/src/api/ml/z3.mli @@ -927,10 +927,10 @@ end module FiniteDomain : sig (** Create a new finite domain sort. *) - val mk_sort : context -> Symbol.symbol -> int -> Sort.sort + val mk_sort : context -> Symbol.symbol -> int64 -> Sort.sort (** Create a new finite domain sort. *) - val mk_sort_s : context -> string -> int -> Sort.sort + val mk_sort_s : context -> string -> int64 -> Sort.sort (** Indicates whether the term is of an array sort. *) val is_finite_domain : Expr.expr -> bool @@ -939,7 +939,7 @@ sig val is_lt : Expr.expr -> bool (** The size of the finite domain sort. *) - val get_size : Sort.sort -> int + val get_size : Sort.sort -> int64 end @@ -2078,7 +2078,7 @@ sig val mk_numeral_i : context -> int -> Sort.sort -> Expr.expr (** Create a numeral of FloatingPoint sort from a sign bit and two integers. *) - val mk_numeral_i_u : context -> bool -> int -> int -> Sort.sort -> Expr.expr + val mk_numeral_i_u : context -> bool -> int64 -> int64 -> Sort.sort -> Expr.expr (** Create a numeral of FloatingPoint sort from a string *) val mk_numeral_s : context -> string -> Sort.sort -> Expr.expr @@ -2303,7 +2303,7 @@ sig val get_numeral_exponent_string : context -> Expr.expr -> bool -> string (** Return the exponent value of a floating-point numeral as a signed integer *) - val get_numeral_exponent_int : context -> Expr.expr -> bool -> bool * int + val get_numeral_exponent_int : context -> Expr.expr -> bool -> bool * int64 (** Return the exponent of a floating-point numeral as a bit-vector expression. Remark: NaN's do not have a bit-vector exponent, so they are invalid arguments. *) @@ -2320,7 +2320,7 @@ sig Remark: This function extracts the significand bits, without the hidden bit or normalization. Throws an exception if the significand does not fit into an int. *) - val get_numeral_significand_uint : context -> Expr.expr -> bool * int + val get_numeral_significand_uint : context -> Expr.expr -> bool * int64 (** Indicates whether a floating-point numeral is a NaN. *) val is_numeral_nan : context -> Expr.expr -> bool diff --git a/src/smt/smt_internalizer.cpp b/src/smt/smt_internalizer.cpp index 451136351..092bc0127 100644 --- a/src/smt/smt_internalizer.cpp +++ b/src/smt/smt_internalizer.cpp @@ -1429,7 +1429,10 @@ namespace smt { inc_ref(l2); m_watches[(~l1).index()].insert_literal(l2); m_watches[(~l2).index()].insert_literal(l1); - if (get_assignment(l2) == l_false) { + if (get_assignment(l1) == l_false) { + assign(l2, b_justification(~l1)); + } + else if (get_assignment(l2) == l_false) { assign(l1, b_justification(~l2)); } m_clause_proof.add(l1, l2, k, j); diff --git a/src/solver/parallel_tactic.cpp b/src/solver/parallel_tactic.cpp index c79f52084..1d24ed1e6 100644 --- a/src/solver/parallel_tactic.cpp +++ b/src/solver/parallel_tactic.cpp @@ -113,9 +113,9 @@ class parallel_tactic : public tactic { void shutdown() { if (!m_shutdown) { + std::lock_guard lock(m_mutex); m_shutdown = true; m_cond.notify_all(); - std::lock_guard lock(m_mutex); for (solver_state* st : m_active) { st->m().limit().cancel(); } @@ -147,7 +147,9 @@ class parallel_tactic : public tactic { } { std::unique_lock lock(m_mutex); - m_cond.wait(lock); + if (!m_shutdown) { + m_cond.wait(lock); + } } dec_wait(); }