From 9c65408284d9dc252cbc9aacbbd34430ce9eca7d Mon Sep 17 00:00:00 2001 From: ploc <ploc@garoche.net> Date: Tue, 13 Feb 2018 17:42:39 +0100 Subject: [PATCH] [lustresf] work in progress. Added global env with initial values --- src/tools/stateflow/common/basetypes.ml | 9 +++- src/tools/stateflow/common/datatype.ml | 4 +- .../json-parser/main_parse_json_file.ml | 22 ++++++---- src/tools/stateflow/models/model_simple.ml | 8 +++- src/tools/stateflow/models/model_stopwatch.ml | 16 +++++-- src/tools/stateflow/semantics/cPS.ml | 4 +- .../semantics/cPS_lustre_generator.ml | 42 ++++++++++++++----- src/tools/stateflow/sf_sem.ml | 4 +- 8 files changed, 79 insertions(+), 30 deletions(-) diff --git a/src/tools/stateflow/common/basetypes.ml b/src/tools/stateflow/common/basetypes.ml index b8781b20..8b19769e 100644 --- a/src/tools/stateflow/common/basetypes.ml +++ b/src/tools/stateflow/common/basetypes.ml @@ -122,8 +122,8 @@ sig val pp_cond : Format.formatter -> t -> unit end - - module Condition = + +module Condition = struct type t = | Quote of base_condition_t @@ -155,3 +155,8 @@ struct end let _ = (module Condition : ConditionType) + +module GlobalVarDef = +struct + type t = {variable: LustreSpec.var_decl; init_val: LustreSpec.expr} +end diff --git a/src/tools/stateflow/common/datatype.ml b/src/tools/stateflow/common/datatype.ml index 9d3c17a2..0b2eab44 100644 --- a/src/tools/stateflow/common/datatype.ml +++ b/src/tools/stateflow/common/datatype.ml @@ -39,7 +39,7 @@ type 'prog_t src_components_t = | Junction of junction_name_t * transitions_t | SFFunction of 'prog_t -type prog_t = Program of state_name_t * prog_t src_components_t list * LustreSpec.var_decl list +type prog_t = Program of state_name_t * prog_t src_components_t list * (LustreSpec.var_decl * LustreSpec.expr) list type scope_t = Constant | Input | Local | Output | Parameter @@ -159,7 +159,7 @@ struct Format.fprintf fmt "Main node name: %s@ %a@ %a@" name (pp_src pp_sffunction) component_list - pp_vars vars + pp_vars (List.map fst vars) let pp_scope fmt src = Format.fprintf fmt (match src with diff --git a/src/tools/stateflow/json-parser/main_parse_json_file.ml b/src/tools/stateflow/json-parser/main_parse_json_file.ml index a9c5a9c2..f0dd09c3 100644 --- a/src/tools/stateflow/json-parser/main_parse_json_file.ml +++ b/src/tools/stateflow/json-parser/main_parse_json_file.ml @@ -129,25 +129,31 @@ let json_parse _ file pp = end) in let module Sem = CPS.Semantics (T) (Model) in let prog = Sem.code_gen modularmode in + let header = List.map Corelang.mktop [ + (LustreSpec.Open (false,"lustrec_math")); + (LustreSpec.Open (false,"conv")); + (LustreSpec.Open (true,"locallib")); + ] + in + let prog =header@prog in Options.print_dec_types := true; - Format.printf "%a@." Printers.pp_prog prog; + (* Format.printf "%a@." Printers.pp_prog prog; *) let auto_file = "sf_gen_test_auto.lus" in (* Could be changed *) let auto_out = open_out auto_file in let auto_fmt = Format.formatter_of_out_channel auto_out in Format.fprintf auto_fmt "%a@." Printers.pp_prog prog; - - let prog = (LustreSpec.Open ("math",false))::prog + Format.eprintf "Print initial lustre model with automaton in sf_gen_test_auto.lus@."; + let prog, deps = Compiler_stages.stage1 prog "" "" in - Format.printf "%a@." Printers.pp_prog prog; + (* Format.printf "%a@." Printers.pp_prog prog; *) let noauto_file = "sf_gen_test_noauto.lus" in (* Could be changed *) let noauto_out = open_out noauto_file in let noauto_fmt = Format.formatter_of_out_channel noauto_out in - Format.fprintf noauto_fmt "%a@." Printers.pp_prog prog - - - + Format.fprintf noauto_fmt "%a@." Printers.pp_prog prog; + Format.eprintf "Print expanded lustre model in sf_gen_test_noauto.lus@."; + () with Parse.Error (l, err) -> Format.eprintf "Parse error at loc %a : %a@.@?" Location.pp_loc l Parse.pp_error err diff --git a/src/tools/stateflow/models/model_simple.ml b/src/tools/stateflow/models/model_simple.ml index 05c042ab..d89b8464 100644 --- a/src/tools/stateflow/models/model_simple.ml +++ b/src/tools/stateflow/models/model_simple.ml @@ -3,7 +3,13 @@ open SF let name = "simple" - let condition x = condition (Corelang.mkexpr Location.dummy_loc (LustreSpec.Expr_const (Corelang.const_of_bool true))) +let condition x = condition { + expr = Corelang.mkexpr Location.dummy_loc (LustreSpec.Expr_const (Corelang.const_of_bool true)); + cinputs = []; + coutputs = []; + cvariables = []; +} + let action _ = no_action let model : prog_t = diff --git a/src/tools/stateflow/models/model_stopwatch.ml b/src/tools/stateflow/models/model_stopwatch.ml index 2abca849..b4ed5f22 100644 --- a/src/tools/stateflow/models/model_stopwatch.ml +++ b/src/tools/stateflow/models/model_stopwatch.ml @@ -5,8 +5,12 @@ open SF let verbose = false let actionv x = no_action (*TODO if verbose then action x else no_action*) let action x = no_action (* TODO *) -let condition x = condition (Corelang.mkexpr Location.dummy_loc (LustreSpec.Expr_const (Corelang.const_of_bool true))) - +let condition x = condition { + expr = Corelang.mkexpr Location.dummy_loc (LustreSpec.Expr_const (Corelang.const_of_bool true)); + cinputs = []; + coutputs = []; + cvariables = []; +} let name = "stopwatch" let model = @@ -250,8 +254,12 @@ let model = int_typ, (* type *) Corelang.dummy_clock_dec, (* clock *) false, (* not a constant *) - None (* no default value *) - ) + None, (* no default value *) + None (* no parent known *) + ), + (* Default value is zero *) + Corelang.mkexpr Location.dummy_loc (LustreSpec.Expr_const (LustreSpec.Const_int 0)) + ) ["cent"; "sec"; diff --git a/src/tools/stateflow/semantics/cPS.ml b/src/tools/stateflow/semantics/cPS.ml index 795feb94..b73c2507 100644 --- a/src/tools/stateflow/semantics/cPS.ml +++ b/src/tools/stateflow/semantics/cPS.ml @@ -8,10 +8,10 @@ struct module Prog = struct - let init, defs, state_vars = + let init, defs, state_vars, globals = let Program (init, defs, globals) = M.model in let state_vars = SF.states M.model in - init, defs, state_vars + init, defs, state_vars, globals (*let _ = Format.printf "Model definitions@.%a@.####" Simulink.pp_src defs; () *) end diff --git a/src/tools/stateflow/semantics/cPS_lustre_generator.ml b/src/tools/stateflow/semantics/cPS_lustre_generator.ml index 481da149..06088873 100644 --- a/src/tools/stateflow/semantics/cPS_lustre_generator.ml +++ b/src/tools/stateflow/semantics/cPS_lustre_generator.ml @@ -7,7 +7,8 @@ let ff = Format.fprintf module LustrePrinter ( Vars : sig val state_vars : ActiveStates.Vars.t - val global_vars : LustreSpec.var_decl list + val global_vars : GlobalVarDef.t list + end) : TransformerType = struct include TransformerStub @@ -53,7 +54,7 @@ struct let loc = Location.dummy_loc in Corelang.mkvar_decl loc - (name, typ, Corelang.mkclock loc LustreSpec.Ckdec_any, false, None) + (name, typ, Corelang.mkclock loc LustreSpec.Ckdec_any, false, None, None (*"__no_parent__" *)) let var_to_vdecl ?(prefix="") var typ = mkvar (var_to_ident prefix var) typ let state_vars_to_vdecl_list ?(prefix="") vars = @@ -115,7 +116,7 @@ struct LustreSpec.ty_dec_loc = Location.dummy_loc; } - let event_var = mkvar "event" event_type + let event_var = mkvar "event" event_type let const_map : (event_base_t, int) Hashtbl.t = Hashtbl.create 13 @@ -327,13 +328,15 @@ struct let (vars', tr') = tr "sin_" "sout_" in pp_name call args; let funname = Format.flush_str_formatter () in + let inputs = event_var :: state_vars_to_vdecl_list ~prefix:"sin_" Vars.state_vars in + let outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars in let node = Corelang.mktop ( LustreSpec.Node {LustreSpec.node_id = funname; node_type = Types.new_var (); node_clock = Clocks.new_var true; - node_inputs = event_var :: state_vars_to_vdecl_list ~prefix:"sin_" Vars.state_vars; - node_outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars; + node_inputs = inputs; + node_outputs = outputs; node_locals = mk_locals vars'; (* TODO: add global vars *) node_gencalls = []; node_checks = []; @@ -346,14 +349,30 @@ struct ) in [node] + + + + (* TODO + C'est pas evident. +Il faut faire les choses suivantes: +- rajouter dans un ensemble les variables manipulées localement +- on doit comprendre comment les variables globales sont injectées dans le modele final: + - le node principal doit uniquement les afficher. Il peut les initialiser avec les valeurs init définies. Puis appeller la fcn thetacallD_from_principal. + - elles peuvent/doivent etre dans input et output de ce node thetacallD + *) + let mk_main_loop () = (* let loc = Location.dummy_loc in *) let call_stmt = (* (%t) -> pre (thetaCallD_from_principal (event, %a)) *) - let init = mkexpr - (LustreSpec.Expr_tuple (List.map (fun _ -> expr_of_bool false) (ActiveStates.Vars.elements Vars.state_vars))) + let init = + let init_state_false = + List.map (fun _ -> expr_of_bool false) (ActiveStates.Vars.elements Vars.state_vars) in + let init_globals = + List.map (fun v -> v.GlobalVarDef.init_val) Vars.global_vars in + mkexpr (LustreSpec.Expr_tuple (init_state_false @ init_globals)) in let args = (Corelang.expr_of_vdecl event_var):: (vars_to_exprl ~prefix:"sout_" Vars.state_vars) @@ -363,13 +382,16 @@ struct let rhs = mkexpr (LustreSpec.Expr_arrow (init, pre_call_expr)) in mkstmt_eq Vars.state_vars ~prefix_lhs:"sout_" rhs in + let inputs = List.map Corelang.copy_var_decl [event_var] in + let outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars in + (* TODO add the globals as sout_data_x entry values *) let node_principal = Corelang.mktop ( LustreSpec.Node {LustreSpec.node_id = "principal_loop"; node_type = Types.new_var (); node_clock = Clocks.new_var true; - node_inputs = List.map Corelang.copy_var_decl [event_var]; - node_outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars; + node_inputs = inputs; + node_outputs = outputs; node_locals = []; (* TODO: add global vars *) node_gencalls = []; node_checks = []; @@ -381,7 +403,7 @@ struct node_annot = []} ) in - node_principal + node_principal let mkprincipal tr = diff --git a/src/tools/stateflow/sf_sem.ml b/src/tools/stateflow/sf_sem.ml index 7ca676c0..0f7bd182 100644 --- a/src/tools/stateflow/sf_sem.ml +++ b/src/tools/stateflow/sf_sem.ml @@ -63,7 +63,9 @@ let _ = | GenLus -> let module Model = (val model) in let state_vars = Datatype.SF.states Model.model in - let global_vars = Datatype.SF.global_vars Model.model in + let global_vars = + List.map (fun (v,e) -> {Basetypes.GlobalVarDef.variable = v; init_val = e;}) + (Datatype.SF.global_vars Model.model) in let module T = CPS_lustre_generator.LustrePrinter (struct let state_vars = state_vars -- GitLab