diff --git a/src/tools/zustre/zustre_cex.ml b/src/tools/zustre/zustre_cex.ml index 36f474d24a0a9700425459cdfc7d9a01752b01d6..d8843e82df7cc1691456035a03a0a62ec6741428 100644 --- a/src/tools/zustre/zustre_cex.ml +++ b/src/tools/zustre/zustre_cex.ml @@ -57,7 +57,8 @@ let build_cex machine machines decl_err = (* Recall that MAIN args are in@mems@out *) let args = Z3.Expr.get_args conj in if List.length args = 1 + nb_inputs + nb_mems + nb_outputs then - let id = Z3.Arithmetic.Integer.get_int (List.hd args) in + (* Should be done with get_int but that function vanished from the opam Z3 API *) + let id = Big_int.int_of_big_int (Z3.Arithmetic.Integer.get_big_int (List.hd args)) in let input_values = Utils.List.extract args 1 (1 + nb_inputs) in let output_values = Utils.List.extract args (1+nb_inputs+nb_mems) (1 + nb_inputs + nb_mems + nb_outputs) in (id, (input_values, output_values))::main, funs diff --git a/src/tools/zustre/zustre_common.ml b/src/tools/zustre/zustre_common.ml index 1409342e967bb6ed8fd7012ff297e9923a34383f..a03bf88a3eee04f33dbf6f84140e17682571bcae 100644 --- a/src/tools/zustre/zustre_common.ml +++ b/src/tools/zustre/zustre_common.ml @@ -366,7 +366,7 @@ let horn_basic_app i val_to_expr vl = is a printer for variables (typically [pp_c_var_read]), but an offset suffix may be added for array variables *) -let rec horn_val_to_expr ?(is_lhs=false) self v = +let rec horn_val_to_expr ?(is_lhs=false) m self v = match v.value_desc with | Cst c -> horn_const_to_expr c @@ -393,28 +393,30 @@ let rec horn_val_to_expr ?(is_lhs=false) self v = !ctx (build_array (t, (x+1))) (Z3.Arithmetic.Integer.mk_numeral_i !ctx x) - (horn_val_to_expr ~is_lhs:is_lhs self h) + (horn_val_to_expr ~is_lhs:is_lhs m self h) in build_array (il, 0) - + | Access(tab,index) -> Z3.Z3Array.mk_select !ctx - (horn_val_to_expr ~is_lhs:is_lhs self tab) - (horn_val_to_expr ~is_lhs:is_lhs self index) + (horn_val_to_expr ~is_lhs:is_lhs m self tab) + (horn_val_to_expr ~is_lhs:is_lhs m self index) (* Code specific for arrays *) | Power (v, n) -> assert false - | LocalVar v -> - horn_var_to_expr - (rename_machine - self - v) - | StateVar v -> - if Types.is_array_type v.var_type - then assert false - else horn_var_to_expr (rename_machine self ((if is_lhs then rename_next else rename_current) (* self *) v)) - | Fun (n, vl) -> horn_basic_app n (horn_val_to_expr self) vl + | Var v -> + if is_memory m v then + if Types.is_array_type v.var_type + then assert false + else horn_var_to_expr (rename_machine self ((if is_lhs then rename_next else rename_current) (* self *) v)) + + else + horn_var_to_expr + (rename_machine + self + v) + | Fun (n, vl) -> horn_basic_app n (horn_val_to_expr m self) vl let no_reset_to_exprs machines m i = let (n,_) = List.assoc i m.minstances in @@ -478,8 +480,8 @@ let instance_call_to_exprs machines reset_instances m i inputs outputs = let idx = horn_var_to_expr idx in let uid = uid_conc (get_instance_uid i) (horn_var_to_expr uid) in let inout = - List.map (horn_val_to_expr self) - (inputs @ (List.map (fun v -> mk_val (LocalVar v) v.var_type) outputs)) + List.map (horn_val_to_expr m self) + (inputs @ (List.map (fun v -> mk_val (Var v) v.var_type) outputs)) in idx::uid::inout in @@ -509,16 +511,16 @@ let instance_call_to_exprs machines reset_instances m i inputs outputs = let stmt1 = (* out = ite mem_m then i1 else i2 *) Z3.Boolean.mk_eq !ctx ( (* output var *) - horn_val_to_expr + horn_val_to_expr ~is_lhs:true - self - (mk_val (LocalVar o) o.var_type) + m self + (mk_val (Var o) o.var_type) ) ( Z3.Boolean.mk_ite !ctx (horn_var_to_expr mem_m) - (horn_val_to_expr self i1) - (horn_val_to_expr self i2) + (horn_val_to_expr m self i1) + (horn_val_to_expr m self i2) ) in let stmt2 = (* mem_X = false *) @@ -578,8 +580,8 @@ let assign_to_exprs m var_name value = let e = Z3.Boolean.mk_eq !ctx - (horn_val_to_expr ~is_lhs:true self var_name) - (horn_val_to_expr self value) + (horn_val_to_expr ~is_lhs:true m self var_name) + (horn_val_to_expr m self value) (* was: TODO deal with array accesses (value_suffix_to_expr self value) *) in [e] @@ -598,12 +600,12 @@ let rec instr_to_exprs machines reset_instances (m: machine_t) instr : Z3.Expr.e | MLocalAssign (i,v) -> assign_to_exprs m - (mk_val (LocalVar i) i.var_type) v, + (mk_val (Var i) i.var_type) v, reset_instances | MStateAssign (i,v) -> assign_to_exprs m - (mk_val (StateVar i) i.var_type) v, + (mk_val (Var i) i.var_type) v, reset_instances | MStep ([i0], i, vl) when Basic_library.is_internal_fun i (List.map (fun v -> v.value_type) vl) -> assert false (* This should not happen anymore *) @@ -629,7 +631,7 @@ let rec instr_to_exprs machines reset_instances (m: machine_t) instr : Z3.Expr.e let e = Z3.Boolean.mk_implies !ctx (Z3.Boolean.mk_eq !ctx - (horn_val_to_expr self g) + (horn_val_to_expr m self g) (horn_tag_to_expr tag)) branch_def in @@ -857,7 +859,7 @@ let decl_machine machines m = begin (*Rule for step "; Stateless step rule with Assertions @.";*) let body_with_asserts = - Z3.Boolean.mk_and !ctx (horn_body :: List.map (horn_val_to_expr m.mname.node_id) assertsl) + Z3.Boolean.mk_and !ctx (horn_body :: List.map (horn_val_to_expr m m.mname.node_id) assertsl) in let vars = rename_machine_list m.mname.node_id m.mstep.step_locals in add_rule vars (Z3.Boolean.mk_implies !ctx body_with_asserts horn_head) @@ -915,7 +917,7 @@ let decl_machine machines m = (* Rule for step Assertions @.; *) let body_with_asserts = Z3.Boolean.mk_and !ctx - (horn_step_body :: List.map (horn_val_to_expr m.mname.node_id) assertsl) + (horn_step_body :: List.map (horn_val_to_expr m m.mname.node_id) assertsl) in let vars = (step_vars_c_m_x machines m) @(rename_machine_list m.mname.node_id m.mstep.step_locals) in add_rule (idx::uid::vars) (Z3.Boolean.mk_implies !ctx body_with_asserts horn_step_head)