diff --git a/dune-project b/dune-project index 6b6ecc3cae7abc895b18746d0ca5aa2753a021a6..b24676ef139e456e19044629cad326c572aa0001 100644 --- a/dune-project +++ b/dune-project @@ -1,4 +1,5 @@ (lang dune 2.8) + (name lustrec) (version 1.7) diff --git a/src/backends/C/c_backend.ml b/src/backends/C/c_backend.ml index 04f1f6de57ebb616696649036c4b819002f665ca..f30080562af179ad19499456b471f6c264abaedb 100644 --- a/src/backends/C/c_backend.ml +++ b/src/backends/C/c_backend.ml @@ -41,18 +41,15 @@ let gen_files ( print_alloc_header, print_lib_c, print_main_c, - print_makefile, - preprocess + print_makefile (* , print_cmake *) ) basename prog machines dependencies = let destname = !Options.dest_dir ^ "/" ^ basename in - let machines, spec = preprocess machines in - (* 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 prog machines dependencies spec); + print_alloc_header header_fmt basename machines dependencies); (* Generating Lib C file *) let source_lib_file = c_or_cpp destname in @@ -124,21 +121,19 @@ let print_c_header basename = Header.print_header_from_header header_fmt basename lusic.contents) let translate_to_c generate_c_header basename prog machines dependencies = - let header_m, source_m, source_main_m, makefile_m, preprocess = + let header_m, source_m, source_main_m, makefile_m = match !Options.spec with | "no" -> ( C_backend_header.((module EmptyMod : MODIFIERS_HDR)), C_backend_src.((module EmptyMod : MODIFIERS_SRC)), C_backend_main.((module EmptyMod : MODIFIERS_MAINSRC)), - C_backend_makefile.((module EmptyMod : MODIFIERS_MKF)), - fun m -> m, [] ) + C_backend_makefile.((module EmptyMod : MODIFIERS_MKF)) ) | "acsl" -> let open C_backend_spec in ( C_backend_header.((module HdrMod : MODIFIERS_HDR)), C_backend_src.((module SrcMod : MODIFIERS_SRC)), C_backend_main.((module EmptyMod : MODIFIERS_MAINSRC)), - C_backend_makefile.((module MakefileMod : MODIFIERS_MKF)), - preprocess_acsl ) + C_backend_makefile.((module MakefileMod : MODIFIERS_MKF)) ) | "c" -> assert false (* not implemented yet *) | _ -> @@ -153,8 +148,7 @@ let translate_to_c generate_c_header basename prog machines dependencies = ( Header.print_alloc_header, Source.print_lib_c, SourceMain.print_main_c, - Makefile.print_makefile, - preprocess ) + Makefile.print_makefile ) (* CMakefile.print_makefile *) in if generate_c_header then print_c_header basename; diff --git a/src/backends/C/c_backend_common.ml b/src/backends/C/c_backend_common.ml index 621edbd47ea74ab1cf72679c27bd4050632f0df5..4abd012222e76cd9bbb2fe6703c95b89eeb37d7d 100644 --- a/src/backends/C/c_backend_common.ml +++ b/src/backends/C/c_backend_common.ml @@ -720,7 +720,7 @@ module type MODIFIERS_GHOST_PROTO = sig end module EmptyGhostProto : MODIFIERS_GHOST_PROTO = struct - let pp_ghost_parameters ?cut _ _ = () + let pp_ghost_parameters ?cut _ _ = ignore cut end module Protos (Mod : MODIFIERS_GHOST_PROTO) = struct diff --git a/src/backends/C/c_backend_header.ml b/src/backends/C/c_backend_header.ml index 999ea58cfa353e08a116ee75411602b9b3b3608c..6343c0aadb255288f0d46032211146571bbc243a 100644 --- a/src/backends/C/c_backend_header.ml +++ b/src/backends/C/c_backend_header.ml @@ -302,8 +302,7 @@ functor (* MAIN Header Printing functions *) (********************************************************************************************) - let print_alloc_header header_fmt basename _prog machines dependencies spec - = + let print_alloc_header header_fmt basename machines dependencies = (* Include once: start *) let baseNAME = file_to_module_name basename in fprintf header_fmt diff --git a/src/backends/C/c_backend_spec.ml b/src/backends/C/c_backend_spec.ml index 70dec97ec2f862b09aec6c1f8e6c43f57fc9fa99..505a58b881c45b54d37f9dba53f6b7b3258de2a8 100644 --- a/src/backends/C/c_backend_spec.ml +++ b/src/backends/C/c_backend_spec.ml @@ -22,10 +22,6 @@ open Machine_code_common (**************************************************************************) -(* TODO ACSL Return updates machines (eg with local annotations) and acsl - preamble *) -let preprocess_acsl machines = machines, [] - let pp_acsl_basic_type_desc t_desc = if Types.is_bool_type t_desc then (* if !Options.cpp then "bool" else "_Bool" *) @@ -187,11 +183,7 @@ let pp_or_l pp_v fmt = let pp_not pp fmt = fprintf fmt "!%a" pp -let pp_valid pp = - pp_and_l - (* pp_print_list *) - (* ~pp_sep:pp_print_cut *) - (fun fmt x -> fprintf fmt "\\valid(%a)" pp x) +let pp_valid pp = pp_and_l (fun fmt x -> fprintf fmt "\\valid(%a)" pp x) let pp_old pp fmt = fprintf fmt "\\old(%a)" pp diff --git a/src/backends/C/c_backend_src.ml b/src/backends/C/c_backend_src.ml index e7711d4d89472c9e7b46fa817d96d288aa7242c9..8e9fa4f08705f42497cbbc6e20542a92d9e45bb4 100644 --- a/src/backends/C/c_backend_src.ml +++ b/src/backends/C/c_backend_src.ml @@ -228,9 +228,10 @@ functor | MSetReset inst -> pp_machine_set_reset m self mem fmt inst | MClearReset -> - fprintf fmt "%t@,%a" - (pp_machine_clear_reset m self mem) - pp_label reset_label + if not (fst (get_stateless_status m)) then + fprintf fmt "%t@,%a" + (pp_machine_clear_reset m self mem) + pp_label reset_label | MResetAssign b -> pp_reset_assign self fmt b | MLocalAssign (i, v) -> diff --git a/src/backends/Horn/horn_backend_traces.ml b/src/backends/Horn/horn_backend_traces.ml index 5cc92914ddccf7352c134b6748e1d009431e3558..6c26620b486775d5c15adced3ea13321d06248a9 100644 --- a/src/backends/Horn/horn_backend_traces.ml +++ b/src/backends/Horn/horn_backend_traces.ml @@ -27,7 +27,7 @@ let pp_traces = (* Compute memories associated to each machine *) let compute_mems machines m = - let rec aux fst prefix m = + let rec aux prefix m = List.map (fun mem -> prefix, mem) m.mmemory @ List.fold_left (fun accu (id, (n, _)) -> @@ -35,10 +35,10 @@ let compute_mems machines m = if name = "_arrow" then accu else let machine_n = get_machine machines name in - aux false ((id, machine_n) :: prefix) machine_n @ accu) + aux ((id, machine_n) :: prefix) machine_n @ accu) [] m.minstances in - aux true [] m + aux [] m (* We extract the annotation dealing with traceability *) let machines_traces machines = diff --git a/src/clock_calculus.ml b/src/clock_calculus.ml index dd72307c06bd63e5b64ca703e358ece71265caf4..9cb97068751b62c4f7ca7b629de57d3a9d57e550 100644 --- a/src/clock_calculus.ml +++ b/src/clock_calculus.ml @@ -480,19 +480,18 @@ and clock_appl env f args clock_reset loc = and clock_call env f args clock_reset loc = (* Format.eprintf "Clocking call %s@." f; *) - let cfun = clock_ident false env f loc in + let cfun = clock_ident env f loc in let cins, couts = split_arrow cfun in let cins = clock_list_of_clock cins in List.iter2 (clock_subtyping_arg env) args cins; unify_imported_clock (Some clock_reset) cfun loc; couts -and clock_ident nocarrier env id loc = - clock_expr ~nocarrier env (expr_of_ident id loc) +and clock_ident env id loc = clock_expr env (expr_of_ident id loc) and clock_carrier env c loc ce = let expr_c = expr_of_ident c loc in - let ck = clock_expr ~nocarrier:false env expr_c in + let ck = clock_expr env expr_c in let cr = new_carrier Carry_name (*Carry_const c*) ck.cscoped in let ckb = new_var true in let ckcarry = new_ck (Ccarrying (cr, ckb)) ck.cscoped in @@ -502,7 +501,7 @@ and clock_carrier env c loc ce = (** [clock_expr env expr] performs the clock calculus for expression [expr] in environment [env] *) -and clock_expr ?(nocarrier = true) env expr = +and clock_expr env expr = let resulting_ck = match expr.expr_desc with | Expr_const _ -> diff --git a/src/lustre_live.ml b/src/lustre_live.ml index f38e65cd0fe7f401199123024ff56e1bec1e27e9..6e66609a94158ab7dc2ef51da06951da005eb1ed 100644 --- a/src/lustre_live.ml +++ b/src/lustre_live.ml @@ -15,8 +15,6 @@ open Utils open ISet module Live = Map.Make (Int) -let pp_live fmt l = Live.bindings - let assigned s eq = union s (of_list eq.eq_lhs) let rec occur_dim_expr s d = diff --git a/src/machine_code.ml b/src/machine_code.ml index 9251adcc2d218831b6de3ac900422e3e6ba8fe45..44645a32bed90dfb7f8aa439dc76660be18e4ec6 100644 --- a/src/machine_code.ml +++ b/src/machine_code.ml @@ -236,7 +236,8 @@ let reset_instance env i r c = | None -> None, [] -let translate_eq env ctx id inputs locals outputs i eq = +let translate_eq env ctx nd inputs locals outputs i eq = + let id = nd.node_id in let translate_expr = translate_expr env in let translate_act = translate_act env in let locals_pi = Lustre_live.inter_live_i_with id (i - 1) locals in @@ -268,11 +269,12 @@ let translate_eq env ctx id inputs locals outputs i eq = { inst with instr_spec = - [ - mk_memory_pack ~i id; - mk_transition ~i id (vdecls_to_vals inputs) - (vdecls_to_vals locals_i) (vdecls_to_vals outputs_i); - ]; + (if fst (get_stateless_status_node nd) then [] + else [ mk_memory_pack ~i id ]) + @ [ + mk_transition ~i id (vdecls_to_vals inputs) + (vdecls_to_vals locals_i) (vdecls_to_vals outputs_i); + ]; } :: ctx.s; mp = pred_mp ctx spec_mp; @@ -388,10 +390,10 @@ let constant_equations locals = else eqs) [] locals -let translate_eqs env ctx id inputs locals outputs eqs = +let translate_eqs env ctx nd inputs locals outputs eqs = List.fold_left (fun (ctx, i) eq -> - let ctx = translate_eq env ctx id inputs locals outputs i eq in + let ctx = translate_eq env ctx nd inputs locals outputs i eq in ctx, i + 1) (ctx, 1) eqs |> fst @@ -434,18 +436,16 @@ let process_asserts nd = in vars, eql, assertl -let translate_core env nid sorted_eqs inputs locals outputs = +let translate_core env nd sorted_eqs inputs locals outputs = let constant_eqs = constant_equations locals in (* Compute constants' instructions *) - let ctx0 = - translate_eqs env ctx_init nid inputs locals outputs constant_eqs - in + let ctx0 = translate_eqs env ctx_init nd inputs locals outputs constant_eqs in assert (ctx0.si = []); assert (IMap.is_empty ctx0.j); (* Compute ctx for all eqs *) - let ctx = translate_eqs env ctx_init nid inputs locals outputs sorted_eqs in + let ctx = translate_eqs env ctx_init nd inputs locals outputs sorted_eqs in ctx, ctx0.s @@ -480,6 +480,12 @@ let transition_0 nd = } let transition_toplevel nd i = + let tr = + mk_transition nd.node_id ~i + (vdecls_to_vals nd.node_inputs) + [] + (vdecls_to_vals nd.node_outputs) + in { tname = nd; tindex = None; @@ -487,13 +493,8 @@ let transition_toplevel nd i = tlocals = []; toutputs = nd.node_outputs; tformula = - ExistsMem - ( nd.node_id, - Predicate (ResetCleared nd.node_id), - mk_transition nd.node_id ~i - (vdecls_to_vals nd.node_inputs) - [] - (vdecls_to_vals nd.node_outputs) ); + (if fst (get_stateless_status_node nd) then tr + else ExistsMem (nd.node_id, Predicate (ResetCleared nd.node_id), tr)); tfootprint = ISet.empty; } @@ -542,8 +543,7 @@ let translate_decl nd sch = (* Translate equations *) let ctx, ctx0_s = - translate_core env nd.node_id equations nd.node_inputs locals - nd.node_outputs + translate_core env nd equations nd.node_inputs locals nd.node_outputs in (* Format.eprintf "ok4@.@?"; *) @@ -578,10 +578,11 @@ let translate_decl nd sch = let clear_reset = mkinstr ~instr_spec: - [ - mk_memory_pack ~i:0 nd.node_id; - mk_transition ~i:0 nd.node_id (vdecls_to_vals nd.node_inputs) [] []; - ] + ((if fst (get_stateless_status_node nd) then [] + else [ mk_memory_pack ~i:0 nd.node_id ]) + @ [ + mk_transition ~i:0 nd.node_id (vdecls_to_vals nd.node_inputs) [] []; + ]) MClearReset in { diff --git a/src/machine_code_common.mli b/src/machine_code_common.mli index 081fe19340d6b85f4008167a37b157f8787195f1..254ccd55810042013999aff85995051eb9798038 100644 --- a/src/machine_code_common.mli +++ b/src/machine_code_common.mli @@ -17,6 +17,8 @@ val get_const_assign : Lustre_types.var_decl -> Machine_code_types.value_t +val get_stateless_status_node : Lustre_types.node_desc -> bool * bool + val get_stateless_status : Machine_code_types.machine_t -> bool * bool val get_stateless_status_top_decl : Lustre_types.top_decl -> bool * bool diff --git a/src/main_lustre_testgen.ml b/src/main_lustre_testgen.ml index 36b6fdb8ae8a551f355f753d6a0e3728a96f5535..27f2de55e73bd301da0c3e40f9d1f1dae77fac3e 100644 --- a/src/main_lustre_testgen.ml +++ b/src/main_lustre_testgen.ml @@ -192,7 +192,7 @@ let _ = Arg.parse options anonymous usage with - | Parse.Error _ + | Parse.Error | Types.Error (_, _) | Clocks.Error (_, _) | Error.Error _ diff --git a/src/typing.ml b/src/typing.ml index b69b2b8f90a42ecc8d9c56aba4cb3b121ffa6e5d..4f5cda9c45ce92f1f3ddeba89f5f1ea1e551c78a 100644 --- a/src/typing.ml +++ b/src/typing.ml @@ -332,7 +332,7 @@ struct (* Expected type ty1, got type ty2 *) let try_unify ?(sub = false) ?(semi = false) ty1 ty2 loc = try unify ~sub ~semi ty1 ty2 with - | Unify (t1', t2') -> + | Unify _ -> raise (Error (loc, Type_clash (ty1, ty2))) | Dimension.Unify _ -> raise (Error (loc, Type_clash (ty1, ty2)))