diff --git a/src/backends/C/c_backend.ml b/src/backends/C/c_backend.ml index 62c7014f781da16be176be435e72d8dee57c8266..3c46ad1a4d5601ce735c8723ddc6f4ecbe5c6e6b 100644 --- a/src/backends/C/c_backend.ml +++ b/src/backends/C/c_backend.ml @@ -37,8 +37,7 @@ let with_main_node machines node f = | Some m -> f m -let gen_files - generate_spec_header +let gen_files generate_spec_header ( print_memory_header, print_alloc_header, print_spec_header, @@ -48,59 +47,59 @@ let gen_files let destname = !Options.dest_dir ^ "/" ^ basename in (* Generating H spec file *) - if generate_spec_header then + if generate_spec_header then ( let spec_header_file = destname ^ "_spec.h" in with_out_file spec_header_file (fun header_fmt -> print_spec_header header_fmt basename machines dependencies); - (* Generating H memory file *) - let memory_header_file = destname ^ "_memory.h" in - with_out_file memory_header_file (fun header_fmt -> - print_memory_header header_fmt basename machines dependencies); - - (* Generating H alloc file *) - let alloc_header_file = destname ^ "_alloc.h" in - (* Could be changed *) - with_out_file alloc_header_file (fun header_fmt -> - print_alloc_header header_fmt basename machines dependencies); - - (* Generating Lib C file *) - let source_lib_file = c_or_cpp destname in - with_out_file source_lib_file (fun source_lib_fmt -> - print_lib_c source_lib_fmt basename prog machines dependencies); - - (* Generating Main C file *) - let main_node = !Options.main_node in - with_main_node machines main_node (fun m -> - let source_main_file = c_or_cpp (destname ^ "_main") in - with_out_file source_main_file (fun source_main_fmt -> - print_main_c source_main_fmt m basename prog machines dependencies)); - - (* Generating Mauve files *) - with_main_node machines !Options.mauve (fun m -> - let source_mauve_file = destname ^ "_mauve.hpp" in - with_out_file source_mauve_file (fun source_mauve_fmt -> - (* Header *) - print_mauve_header source_mauve_fmt basename; - (* Shell *) - print_mauve_shell source_mauve_fmt m; - (* Core *) - print_mauve_core source_mauve_fmt m; - (* FSM *) - print_mauve_fsm source_mauve_fmt m)); - - (* Generating Makefile *) - (* Makefiles: - for the moment two cases 1. Classical Makefile, only when - provided with a main node May contain additional framac eacsl targets 2. - Cmake : 2 files - lustrec-basename.cmake describing all variables - the - main CMakeLists.txt activating the first file - Later option 1 should be - removed *) - (* Case 1 *) - if main_node <> "" then - let makefile_file = destname ^ ".makefile" in + (* Generating H memory file *) + let memory_header_file = destname ^ "_memory.h" in + with_out_file memory_header_file (fun header_fmt -> + print_memory_header header_fmt basename machines dependencies); + + (* Generating H alloc file *) + let alloc_header_file = destname ^ "_alloc.h" in (* Could be changed *) - with_out_file makefile_file (fun makefile_fmt -> - print_makefile basename main_node dependencies makefile_fmt) + with_out_file alloc_header_file (fun header_fmt -> + print_alloc_header header_fmt basename machines dependencies); + + (* Generating Lib C file *) + let source_lib_file = c_or_cpp destname in + with_out_file source_lib_file (fun source_lib_fmt -> + print_lib_c source_lib_fmt basename prog machines dependencies); + + (* Generating Main C file *) + let main_node = !Options.main_node in + with_main_node machines main_node (fun m -> + let source_main_file = c_or_cpp (destname ^ "_main") in + with_out_file source_main_file (fun source_main_fmt -> + print_main_c source_main_fmt m basename prog machines dependencies)); + + (* Generating Mauve files *) + with_main_node machines !Options.mauve (fun m -> + let source_mauve_file = destname ^ "_mauve.hpp" in + with_out_file source_mauve_file (fun source_mauve_fmt -> + (* Header *) + print_mauve_header source_mauve_fmt basename; + (* Shell *) + print_mauve_shell source_mauve_fmt m; + (* Core *) + print_mauve_core source_mauve_fmt m; + (* FSM *) + print_mauve_fsm source_mauve_fmt m)); + + (* Generating Makefile *) + (* Makefiles: - for the moment two cases 1. Classical Makefile, only when + provided with a main node May contain additional framac eacsl targets 2. + Cmake : 2 files - lustrec-basename.cmake describing all variables - the + main CMakeLists.txt activating the first file - Later option 1 should be + removed *) + (* Case 1 *) + if main_node <> "" then + let makefile_file = destname ^ ".makefile" in + (* Could be changed *) + with_out_file makefile_file (fun makefile_fmt -> + print_makefile basename main_node dependencies makefile_fmt)) (* (\* Case 2 *\) *) (* let cmake_file = "lustrec-" ^ basename ^ ".cmake" in *) @@ -134,7 +133,12 @@ let print_c_header basename = Header.pp_header_from_header header_fmt basename lusic.contents let translate_to_c generate_c_header basename prog machines dependencies = - let generate_spec_header, header_m, source_m, source_main_m, makefile_m, machines = + let ( generate_spec_header, + header_m, + source_m, + source_main_m, + makefile_m, + machines ) = let open Options in match !spec with | SpecNo -> diff --git a/src/backends/C/c_backend_header.ml b/src/backends/C/c_backend_header.ml index 7e08852b6dd2b295937ee4dca835025689354d8c..d5361f85f4dd4a7d81252b416987015ff3d41598 100644 --- a/src/backends/C/c_backend_header.ml +++ b/src/backends/C/c_backend_header.ml @@ -34,7 +34,6 @@ module EmptyMod = struct module GhostProto = EmptyGhostProto let pp_predicates _ _ = () - let pp_machine_decl_prefix _ _ = () let pp_import_arrow fmt () = @@ -245,12 +244,13 @@ functor (* Include once: start *) let machines' = List.filter (fun m -> not m.mis_contract) machines in let baseNAME = file_to_module_name basename in - let self_dep = { - local = true; - name = basename; - content = []; - is_stateful = true (* assuming it is stateful *); - } + let self_dep = + { + local = true; + name = basename; + content = []; + is_stateful = true (* assuming it is stateful *); + } in fprintf header_fmt @@ -259,11 +259,9 @@ functor #define _%s_ALLOC@,\ @,\ /* Import header from %s */@,\ - %a\ - @,\ + %a@,\ /* Import memory header from %s */@,\ - %a\ - @,\ + %a@,\ %a%a%a#endif@]@." (* Print the svn version number and the supported C standard (C90 or C99) *) @@ -275,11 +273,11 @@ functor basename pp_import_prototype self_dep - (* Import the memory header *) + (* Import the memory header *) basename pp_import_memory_prototype self_dep - (* Print dependencies *) + (* Print dependencies *) (pp_print_list ~pp_open_box:pp_open_vbox0 ~pp_prologue:(pp_print_endcut "/* Import dependencies */") @@ -406,11 +404,7 @@ functor let baseNAME = file_to_module_name basename in fprintf header_fmt - "@[<v>%a@,\ - #ifndef _%s_MEMORY@,\ - #define _%s_MEMORY@,\ - @,\ - %a%a#endif@]@." + "@[<v>%a@,#ifndef _%s_MEMORY@,#define _%s_MEMORY@,@,%a%a#endif@]@." (* Print the svn version number and the supported C standard (C90 or C99) *) pp_print_version @@ -438,11 +432,7 @@ functor let baseNAME = file_to_module_name basename in fprintf header_fmt - "@[<v>%a@,\ - #ifndef _%s_SPEC@,\ - #define _%s_SPEC@,\ - @,\ - %a#endif@]@." + "@[<v>%a@,#ifndef _%s_SPEC@,#define _%s_SPEC@,@,%a#endif@]@." (* Print the svn version number and the supported C standard (C90 or C99) *) pp_print_version @@ -451,7 +441,6 @@ functor baseNAME Mod.pp_predicates machines - end (* Local Variables: *) (* compile-command:"make -C ../../.." *) diff --git a/src/backends/C/c_backend_main.ml b/src/backends/C/c_backend_main.ml index 3f78e6aa166529b702c89a01d9ca69baa6d7f5dd..a8eb84f3048ddfb0c3701f1d481c39a5fd996c49 100644 --- a/src/backends/C/c_backend_main.ml +++ b/src/backends/C/c_backend_main.ml @@ -18,7 +18,6 @@ open C_backend_common module Mpfr = Lustrec_mpfr module type MODIFIERS_MAINSRC = sig - val pp_import_spec_prototype : formatter -> dep_t -> unit val pp_declare_ghost_state : formatter -> ident -> unit val pp_ghost_state_parameter : formatter -> unit -> unit @@ -26,6 +25,7 @@ module type MODIFIERS_MAINSRC = sig val pp_main_loop_invariants : ident -> machine_t list -> formatter -> machine_t -> unit + val pp_main_loop_end : ident -> machine_t list -> formatter -> machine_t -> unit end @@ -465,21 +465,20 @@ module Main (Mod : MODIFIERS_MAINSRC) = struct () let pp_main_c main_fmt main_machine basename _prog machines _dependencies = - let self_dep = { - local = true; - name = basename; - content = []; - is_stateful = true (* assuming it is stateful*); - } + let self_dep = + { + local = true; + name = basename; + content = []; + is_stateful = true (* assuming it is stateful*); + } in fprintf main_fmt "@[<v>%a@,\ #include <stdlib.h>@,\ #include <assert.h>@,\ - %a\ - %a\ - @,\ + %a%a@,\ %a@,\ %a\n\ \ @]@." diff --git a/src/backends/C/c_backend_main.mli b/src/backends/C/c_backend_main.mli index 3dc18e6be8d79b01c8a694cf598b859009c02ba1..b2de757237c9648806c0354774138c75ce53200e 100644 --- a/src/backends/C/c_backend_main.mli +++ b/src/backends/C/c_backend_main.mli @@ -11,6 +11,7 @@ module type MODIFIERS_MAINSRC = sig val pp_main_loop_invariants : ident -> machine_t list -> formatter -> machine_t -> unit + val pp_main_loop_end : ident -> machine_t list -> formatter -> machine_t -> unit end diff --git a/src/backends/C/c_backend_spec.ml b/src/backends/C/c_backend_spec.ml index 3c02b2bd0e419d539cfcb099688728999f304425..c5c62381611e1a7a9b4b52ad6621834f68f7b7ea 100644 --- a/src/backends/C/c_backend_spec.ml +++ b/src/backends/C/c_backend_spec.ml @@ -903,24 +903,23 @@ let pp_arrow_reset_ghost mem fmt inst = let contract_of machines m = match m.mspec.mnode_spec with | Some spec -> ( - match spec with - | Contract c -> - Some c, None - | NodeSpec f -> ( - let m_f = find_machine f machines in - match m_f.mspec.mnode_spec with - | Some (Contract c) -> - Some c, Some m_f - | _ -> - None, None)) + match spec with + | Contract c -> + Some c, None + | NodeSpec f -> ( + let m_f = find_machine f machines in + match m_f.mspec.mnode_spec with + | Some (Contract c) -> + Some c, Some m_f + | _ -> + None, None)) | None -> None, None let rename n x = sprintf "%s_%d" x n let rename_var_decl n vd = { vd with var_id = rename n vd.var_id } -let pp_k_induction_case base m m_c pp_mem_out pp_vars fmt - (n, mem_out) = +let pp_k_induction_case base m m_c pp_mem_out pp_vars fmt (n, mem_out) = let name = m.mname.node_id in fprintf fmt @@ -943,52 +942,55 @@ let pp_k_induction_case_def base m (_, m_c, _) fmt n = let stateless = fst (get_stateless_status m) in let stateless_c = fst (get_stateless_status m_c) in let l = List.init (n + 1) Fun.id in - let l_pp = List.concat_map (function - | 0 -> - let pp = pp_reset_set' in - [ - fun fmt -> - (if stateless_c then fun fmt (x, _) -> pp fmt x - else pp_and pp pp) - fmt - ((name, rename 0 mem), (name_c, rename 0 mem_c)) - ] - | n' -> - let pp_var_c fmt (out, vd) = - if out && n' < n then pp_true_c_bool fmt () - else pp_var_decl fmt vd - in - let c_inputs = - List.map - (fun v -> false, rename_var_decl n' v) - m_c.mstep.step_inputs - in - let c_outputs = - List.map - (fun v -> true, rename_var_decl n' v) - m_c.mstep.step_outputs - in - let pp stateless pp_var = - pp_transition_aux - stateless - pp_print_string - pp_print_string - pp_var - in - [ - (fun fmt -> - pp stateless pp_var_decl fmt - ( name, - List.map (rename_var_decl n') (inputs @ outputs), - rename (n' - 1) mem, - rename n' mem )); - (fun fmt -> - pp stateless_c pp_var_c fmt - ( name_c, - c_inputs @ c_outputs, - rename (n' - 1) mem_c, - rename n' mem_c )) - ]) l + let l_pp = + List.concat_map + (function + | 0 -> + let pp = pp_reset_set' in + [ + (fun fmt -> + (if stateless_c then fun fmt (x, _) -> pp fmt x else pp_and pp pp) + fmt + ((name, rename 0 mem), (name_c, rename 0 mem_c))); + ] + | n' -> + let pp_var_c fmt (out, vd) = + if out && n' < n then pp_true_c_bool fmt () else pp_var_decl fmt vd + in + let c_inputs = + List.map + (fun v -> false, rename_var_decl n' v) + m_c.mstep.step_inputs + in + let c_outputs = + List.map + (fun v -> true, rename_var_decl n' v) + m_c.mstep.step_outputs + in + let pp stateless pp_var = + pp_transition_aux stateless pp_print_string pp_print_string pp_var + in + [ + (fun fmt -> + pp + stateless + pp_var_decl + fmt + ( name, + List.map (rename_var_decl n') (inputs @ outputs), + rename (n' - 1) mem, + rename n' mem )); + (fun fmt -> + pp + stateless_c + pp_var_c + fmt + ( name_c, + c_inputs @ c_outputs, + rename (n' - 1) mem_c, + rename n' mem_c )); + ]) + l in let l_pp = if base then l_pp else List.tl l_pp in let pp fmt () = @@ -998,8 +1000,7 @@ let pp_k_induction_case_def base m (_, m_c, _) fmt n = pp_exists (pp_machine_decl ~ghost:true - (pp_comma_list (fun fmt n -> - pp_print_string fmt (rename n mem_c)))) + (pp_comma_list (fun fmt n -> pp_print_string fmt (rename n mem_c)))) pp fmt ((name_c, l), ()) @@ -1013,24 +1014,23 @@ let pp_k_induction_case_def base m (_, m_c, _) fmt n = (pp_locals m_c)) (pp_exists (fun fmt l -> - fprintf - fmt - "%a@,%a" - (pp_machine_decl - ~ghost:true - (pp_comma_list ~pp_eol:pp_print_comma (fun fmt n -> - pp_print_string fmt (rename (n - 1) mem)))) - (name, l) - (pp_locals m) - (List.concat_map (fun n -> - List.map (rename_var_decl n) (inputs @ outputs)) - l)) + fprintf + fmt + "%a@,%a" + (pp_machine_decl + ~ghost:true + (pp_comma_list ~pp_eol:pp_print_comma (fun fmt n -> + pp_print_string fmt (rename (n - 1) mem)))) + (name, l) + (pp_locals m) + (List.concat_map + (fun n -> List.map (rename_var_decl n) (inputs @ outputs)) + l)) pp) fmt - ( (n, (name, rename n mem)), - ( List.tl l, () ) ) + ((n, (name, rename n mem)), (List.tl l, ())) -let pp_base_case_defs m fmt (_, _, k as c_m_k) = +let pp_base_case_defs m fmt ((_, _, k) as c_m_k) = let l = List.init (k - 1) succ in pp_print_list ~pp_open_box:pp_open_vbox0 @@ -1039,7 +1039,7 @@ let pp_base_case_defs m fmt (_, _, k as c_m_k) = fmt l -let pp_inductive_case_def m fmt (_, _, k as c_m_k) = +let pp_inductive_case_def m fmt ((_, _, k) as c_m_k) = pp_k_induction_case_def false m c_m_k fmt k let pp_k_induction_lemmas m fmt (_, m_c, k) = @@ -1050,45 +1050,44 @@ let pp_k_induction_lemmas m fmt (_, m_c, k) = ~pp_open_box:pp_open_vbox0 ~pp_sep:pp_print_cutcut (fun fmt n -> - let outputs = List.map (rename_var_decl n) m_c.mstep.step_outputs in - pp_lemma - (fun fmt n -> fprintf fmt "%s_k_induction_%d" name n) - (pp_forall - (fun fmt () -> - fprintf - fmt - "%a,@;%a" - (pp_machine_decl' ~ghost:true) - (name, mem) - (pp_locals m_c) - outputs) - (pp_implies - (pp_k_induction_case - (n <> k) - m - m_c - pp_print_string - (pp_comma_list pp_var_decl)) - (pp_and_l - (fun fmt x -> - pp_equal pp_var_decl pp_print_int fmt (x, 1))))) - fmt - (n, ((), ((n, mem), outputs)))) + let outputs = List.map (rename_var_decl n) m_c.mstep.step_outputs in + pp_lemma + (fun fmt n -> fprintf fmt "%s_k_induction_%d" name n) + (pp_forall + (fun fmt () -> + fprintf + fmt + "%a,@;%a" + (pp_machine_decl' ~ghost:true) + (name, mem) + (pp_locals m_c) + outputs) + (pp_implies + (pp_k_induction_case + (n <> k) + m + m_c + pp_print_string + (pp_comma_list pp_var_decl)) + (pp_and_l (fun fmt x -> + pp_equal pp_var_decl pp_print_int fmt (x, 1))))) + fmt + (n, ((), ((n, mem), outputs)))) fmt l let pp_k_induction m fmt c_m_k = pp_acsl_cut (fun fmt () -> - fprintf - fmt - "%a@,@,%a@,@,%a" - (pp_base_case_defs m) - c_m_k - (pp_inductive_case_def m) - c_m_k - (pp_k_induction_lemmas m) - c_m_k) + fprintf + fmt + "%a@,@,%a@,@,%a" + (pp_base_case_defs m) + c_m_k + (pp_inductive_case_def m) + c_m_k + (pp_k_induction_lemmas m) + c_m_k) fmt () @@ -1145,11 +1144,9 @@ module HdrMod = struct "/* ACSL transition memory footprints lemmas */" pp_transition_footprint_lemmas) machines - (pp_preds - "/* k-induction predicates and lemmas */" - (fun fmt m -> - let c, m_c = contract_of machines m in - pp_print_option (pp_proof_annotation m m_c) fmt c)) + (pp_preds "/* k-induction predicates and lemmas */" (fun fmt m -> + let c, m_c = contract_of machines m in + pp_print_option (pp_proof_annotation m m_c) fmt c)) machines let pp_machine_decl_prefix _ _ = () @@ -1285,7 +1282,8 @@ module SrcMod = struct (* let rename_predicate n = function *) (* | Transition (s, f, inst, i, es, r, mf, mif) -> *) - (* Transition (s, f, inst, i, List.map (rename_expression n) es, r, mf, mif) *) + (* Transition (s, f, inst, i, List.map (rename_expression n) es, r, mf, + mif) *) (* | p -> *) (* p *) @@ -1374,15 +1372,15 @@ module SrcMod = struct pp_print_string pp_print_string (fun fmt v -> - (if is_output m v then pp_ptr_decl else pp_var_decl) - fmt - v))) + (if is_output m v then pp_ptr_decl else pp_var_decl) + fmt + v))) fmt ( m_c.mstep.step_outputs, ( m_c.mname.node_id, - m_c.mstep.step_inputs @ m_c.mstep.step_outputs, - mem_in, - mem_out ))) + m_c.mstep.step_inputs @ m_c.mstep.step_outputs, + mem_in, + mem_out ) )) fmt m_c) in @@ -1562,9 +1560,7 @@ module SrcMod = struct end module MainMod = struct - let pp_import_spec_prototype = SrcMod.pp_import_spec_prototype - let main_mem_ghost = "main_mem_ghost" let pp_declare_ghost_state fmt name = @@ -1587,94 +1583,114 @@ module MainMod = struct let k_induction_of machines m = match contract_of machines m with - | Some c, Some m_c -> - begin match c.mc_proof with - | Some (Kinduction k) -> - Some (m_c, k) - | _ -> None - end - | _ -> None + | Some c, Some m_c -> ( + match c.mc_proof with Some (Kinduction k) -> Some (m_c, k) | _ -> None) + | _ -> + None let pp_main_loop_invariants main_mem machines fmt m = let name = m.mname.node_id in let insts = instances machines m in let m_c_k = k_induction_of machines m in - fprintf fmt "%a%a" - (pp_print_option - (fun fmt _ -> - fprintf fmt "%a@," - (pp_acsl_line (pp_ghost pp_print_string)) "int __k = 0;")) + fprintf + fmt + "%a%a" + (pp_print_option (fun fmt _ -> + fprintf + fmt + "%a@," + (pp_acsl_line (pp_ghost pp_print_string)) + "int __k = 0;")) m_c_k - (pp_acsl_cut - (fun fmt () -> - fprintf - fmt - "%a@,%a@,%a@,%a%a" - (pp_loop_invariant pp_mem_valid') - (name, main_mem) - (pp_loop_invariant - (pp_memory_pack_aux pp_print_string pp_print_string)) - (name, main_mem_ghost, main_mem) - (pp_loop_invariant - (pp_separated - (pp_paren pp_print_string) - pp_ref' - (pp_ref pp_var_decl))) - (main_mem, main_mem_ghost, insts, m.mstep.step_outputs) - (pp_loop_invariant - (pp_or (pp_valid_read pp_stdout) (pp_equal pp_stdout pp_null))) - ((), ((), ())) - (pp_print_option - (fun fmt (m_c, k) -> - fprintf fmt "@,%a@,%a" - (pp_loop_invariant (pp_gequal pp_print_string pp_print_int)) - ("__k", 0) - (pp_loop_invariant - (pp_and_l (fun fmt k' -> - pp_paren - (pp_implies - ((if k' = k then pp_gequal else pp_equal) pp_print_string pp_print_int) - (fun fmt mem -> - if k' = 0 then pp_reset_set' fmt (name, mem) - else pp_k_induction_case - (k' < k) - m - m_c - pp_print_string - (pp_comma_list ~pp_open_box:(fun fmt () -> pp_open_hovbox fmt 0) (fun fmt _ -> pp_true_c_bool fmt ())) - fmt (k', mem))) - fmt - (("__k", k'), - main_mem_ghost)))) - (List.init (k + 1) Fun.id))) - m_c_k)) + (pp_acsl_cut (fun fmt () -> + fprintf + fmt + "%a@,%a@,%a@,%a%a" + (pp_loop_invariant pp_mem_valid') + (name, main_mem) + (pp_loop_invariant + (pp_memory_pack_aux pp_print_string pp_print_string)) + (name, main_mem_ghost, main_mem) + (pp_loop_invariant + (pp_separated + (pp_paren pp_print_string) + pp_ref' + (pp_ref pp_var_decl))) + (main_mem, main_mem_ghost, insts, m.mstep.step_outputs) + (pp_loop_invariant + (pp_or (pp_valid_read pp_stdout) (pp_equal pp_stdout pp_null))) + ((), ((), ())) + (pp_print_option (fun fmt (m_c, k) -> + fprintf + fmt + "@,%a@,%a" + (pp_loop_invariant (pp_gequal pp_print_string pp_print_int)) + ("__k", 0) + (pp_loop_invariant + (pp_and_l (fun fmt k' -> + pp_paren + (pp_implies + ((if k' = k then pp_gequal else pp_equal) + pp_print_string + pp_print_int) + (fun fmt mem -> + if k' = 0 then pp_reset_set' fmt (name, mem) + else + pp_k_induction_case + (k' < k) + m + m_c + pp_print_string + (pp_comma_list + ~pp_open_box:(fun fmt () -> + pp_open_hovbox fmt 0) + (fun fmt _ -> pp_true_c_bool fmt ())) + fmt + (k', mem))) + fmt + (("__k", k'), main_mem_ghost)))) + (List.init (k + 1) Fun.id))) + m_c_k)) () let pp_main_loop_end _main_mem machines fmt m = - fprintf fmt "@,%a" - (pp_print_option - (fun fmt (m_c, _) -> - let stateless_c = fst (get_stateless_status m_c) in - let name_c = m_c.mname.node_id in - let mem_in_c = mk_mem_in_c m in - let mem_out_c = mk_mem_out_c m in - let pp_var_c fmt (out, vd) = - if out then pp_true_c_bool fmt () - else pp_var_decl fmt vd - in - let c_inputs = List.map (fun v -> false, v) m_c.mstep.step_inputs in - let c_outputs = List.map (fun v -> true, v) m_c.mstep.step_outputs in - fprintf fmt "%a@,%a" - (pp_acsl_line (pp_ghost pp_print_string)) - "__k++;" - (pp_acsl_line' - (pp_assert - (pp_transition_aux - stateless_c - pp_print_string - pp_print_string - pp_var_c))) - (name_c, c_inputs @ c_outputs, mem_in_c, mem_out_c))) + fprintf + fmt + "@,%a" + (pp_print_option (fun fmt (m_c, _) -> + let stateless_c = fst (get_stateless_status m_c) in + let name_c = m_c.mname.node_id in + let mem_in_c = mk_mem_in_c m in + let mem_out_c = mk_mem_out_c m in + let pp_var_c fmt (out, vd) = + if out then pp_true_c_bool fmt () else pp_var_decl fmt vd + in + let c_inputs = List.map (fun v -> false, v) m_c.mstep.step_inputs in + let c_outputs = List.map (fun v -> true, v) m_c.mstep.step_outputs in + let pp = + pp_transition_aux + stateless_c + pp_print_string + pp_print_string + pp_var_c + in + fprintf + fmt + "%a@,%a" + (pp_acsl_line (pp_ghost pp_print_string)) + "__k++;" + (pp_acsl_line' + (pp_assert (fun fmt x -> + if stateless_c then pp fmt x + else + pp_exists + (pp_machine_decl + ~ghost:true + (pp_comma_list pp_print_string)) + pp + fmt + ((name_c, [ mem_in_c; mem_out_c ]), x)))) + (name_c, c_inputs @ c_outputs, mem_in_c, mem_out_c))) (k_induction_of machines m) let pp_main_spec fmt = diff --git a/src/backends/C/c_backend_src.ml b/src/backends/C/c_backend_src.ml index 06da4eacd3af29ff32765d11a8fb5dcc19ebaef2..b6f4c43733cb92b9c7d1d2c978cdd3556457e473 100644 --- a/src/backends/C/c_backend_src.ml +++ b/src/backends/C/c_backend_src.ml @@ -22,7 +22,6 @@ module type MODIFIERS_SRC = sig module GhostProto : MODIFIERS_GHOST_PROTO val pp_import_spec_prototype : formatter -> dep_t -> unit - val pp_set_reset_spec : formatter -> ident -> ident -> machine_t -> unit val pp_clear_reset_spec : formatter -> ident -> ident -> machine_t -> unit @@ -33,7 +32,6 @@ module type MODIFIERS_SRC = sig machine_t -> ident -> ident -> formatter -> instr_t -> unit val pp_ghost_parameter : ident -> formatter -> ident option -> unit - val pp_c_decl_local_spec_var : machine_t -> formatter -> var_decl -> unit val get_spec_locals : machine_t -> var_decl list val pp_ghost_reset_memory : machine_t -> formatter -> ident -> unit @@ -1001,12 +999,13 @@ module Main (Mod : MODIFIERS_SRC) = struct ind.nodei_id let pp_lib_c source_fmt basename prog machines dependencies = - let self_dep = { - local = true; - name = basename; - content = []; - is_stateful = true (* assuming it is stateful *); - } + let self_dep = + { + local = true; + name = basename; + content = []; + is_stateful = true (* assuming it is stateful *); + } in fprintf source_fmt diff --git a/src/backends/C/c_backend_src.mli b/src/backends/C/c_backend_src.mli index 12d9fb78fd072a825a312b47bbd6a862788a3c93..8a3d136de41f1baaeaf371a084475e0ff883568e 100644 --- a/src/backends/C/c_backend_src.mli +++ b/src/backends/C/c_backend_src.mli @@ -8,7 +8,6 @@ module type MODIFIERS_SRC = sig module GhostProto : MODIFIERS_GHOST_PROTO val pp_import_spec_prototype : formatter -> dep_t -> unit - val pp_set_reset_spec : formatter -> ident -> ident -> machine_t -> unit val pp_clear_reset_spec : formatter -> ident -> ident -> machine_t -> unit @@ -19,7 +18,6 @@ module type MODIFIERS_SRC = sig machine_t -> ident -> ident -> formatter -> instr_t -> unit val pp_ghost_parameter : ident -> formatter -> ident option -> unit - val pp_c_decl_local_spec_var : machine_t -> formatter -> var_decl -> unit val get_spec_locals : machine_t -> var_decl list val pp_ghost_reset_memory : machine_t -> formatter -> ident -> unit