3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-07 09:55:19 +00:00
This commit is contained in:
Nikolaj Bjorner 2022-07-11 09:26:34 -07:00
commit 49b7e9084f
4 changed files with 21 additions and 14 deletions

View file

@ -91,7 +91,7 @@ Type2Dotnet = { VOID : 'void', VOID_PTR : 'IntPtr', INT : 'int', UINT : 'uint',
# Mapping to ML types # 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**', 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' } 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): def param2ml(p):
k = param_kind(p) k = param_kind(p)
if k == OUT: 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" return "int"
elif param_type(p) == INT64 or param_type(p) == UINT64:
return "int64"
elif param_type(p) == STRING: elif param_type(p) == STRING:
return "string" return "string"
else: else:
@ -1252,9 +1254,9 @@ def ml_unwrap(t, ts, s):
elif t == UINT: elif t == UINT:
return '(' + ts + ') Unsigned_int_val(' + s + ')' return '(' + ts + ') Unsigned_int_val(' + s + ')'
elif t == INT64: elif t == INT64:
return '(' + ts + ') Long_val(' + s + ')' return '(' + ts + ') Int64_val(' + s + ')'
elif t == UINT64: elif t == UINT64:
return '(' + ts + ') Unsigned_long_val(' + s + ')' return '(' + ts + ') Int64_val(' + s + ')'
elif t == DOUBLE: elif t == DOUBLE:
return '(' + ts + ') Double_val(' + s + ')' return '(' + ts + ') Double_val(' + s + ')'
elif ml_has_plus_type(ts): 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: elif t == INT or t == UINT or t == PRINT_MODE or t == ERROR_CODE or t == LBOOL:
return d + ' = Val_int(' + n + ');' return d + ' = Val_int(' + n + ');'
elif t == INT64 or t == UINT64: elif t == INT64 or t == UINT64:
return d + ' = Val_long(' + n + ');' return d + ' = caml_copy_int64(' + n + ');'
elif t == DOUBLE: elif t == DOUBLE:
return d + '= caml_copy_double(' + n + ');' return d + '= caml_copy_double(' + n + ');'
elif t == STRING: elif t == STRING:

View file

@ -927,10 +927,10 @@ end
module FiniteDomain : module FiniteDomain :
sig sig
(** Create a new finite domain sort. *) (** 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. *) (** 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. *) (** Indicates whether the term is of an array sort. *)
val is_finite_domain : Expr.expr -> bool val is_finite_domain : Expr.expr -> bool
@ -939,7 +939,7 @@ sig
val is_lt : Expr.expr -> bool val is_lt : Expr.expr -> bool
(** The size of the finite domain sort. *) (** The size of the finite domain sort. *)
val get_size : Sort.sort -> int val get_size : Sort.sort -> int64
end end
@ -2078,7 +2078,7 @@ sig
val mk_numeral_i : context -> int -> Sort.sort -> Expr.expr val mk_numeral_i : context -> int -> Sort.sort -> Expr.expr
(** Create a numeral of FloatingPoint sort from a sign bit and two integers. *) (** 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 *) (** Create a numeral of FloatingPoint sort from a string *)
val mk_numeral_s : context -> string -> Sort.sort -> Expr.expr 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 val get_numeral_exponent_string : context -> Expr.expr -> bool -> string
(** Return the exponent value of a floating-point numeral as a signed integer *) (** 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. (** 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. *) 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 Remark: This function extracts the significand bits, without the
hidden bit or normalization. Throws an exception if the hidden bit or normalization. Throws an exception if the
significand does not fit into an int. *) 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. *) (** Indicates whether a floating-point numeral is a NaN. *)
val is_numeral_nan : context -> Expr.expr -> bool val is_numeral_nan : context -> Expr.expr -> bool

View file

@ -1429,7 +1429,10 @@ namespace smt {
inc_ref(l2); inc_ref(l2);
m_watches[(~l1).index()].insert_literal(l2); m_watches[(~l1).index()].insert_literal(l2);
m_watches[(~l2).index()].insert_literal(l1); 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)); assign(l1, b_justification(~l2));
} }
m_clause_proof.add(l1, l2, k, j); m_clause_proof.add(l1, l2, k, j);

View file

@ -113,9 +113,9 @@ class parallel_tactic : public tactic {
void shutdown() { void shutdown() {
if (!m_shutdown) { if (!m_shutdown) {
std::lock_guard<std::mutex> lock(m_mutex);
m_shutdown = true; m_shutdown = true;
m_cond.notify_all(); m_cond.notify_all();
std::lock_guard<std::mutex> lock(m_mutex);
for (solver_state* st : m_active) { for (solver_state* st : m_active) {
st->m().limit().cancel(); st->m().limit().cancel();
} }
@ -147,7 +147,9 @@ class parallel_tactic : public tactic {
} }
{ {
std::unique_lock<std::mutex> lock(m_mutex); std::unique_lock<std::mutex> lock(m_mutex);
m_cond.wait(lock); if (!m_shutdown) {
m_cond.wait(lock);
}
} }
dec_wait(); dec_wait();
} }