Project

General

Profile

Revision 9c654082 src/tools/stateflow/semantics/cPS_lustre_generator.ml

View differences:

src/tools/stateflow/semantics/cPS_lustre_generator.ml
7 7
module LustrePrinter (
8 8
  Vars : sig
9 9
    val state_vars : ActiveStates.Vars.t
10
    val global_vars : LustreSpec.var_decl list
10
    val global_vars : GlobalVarDef.t list
11

  
11 12
  end) : TransformerType =
12 13
struct
13 14
  include TransformerStub
......
53 54
    let loc = Location.dummy_loc in
54 55
    Corelang.mkvar_decl
55 56
      loc
56
      (name, typ, Corelang.mkclock loc LustreSpec.Ckdec_any, false, None)
57
      (name, typ, Corelang.mkclock loc LustreSpec.Ckdec_any, false, None, None (*"__no_parent__" *))
57 58

  
58 59
  let var_to_vdecl ?(prefix="") var typ = mkvar (var_to_ident prefix var) typ 
59 60
  let state_vars_to_vdecl_list ?(prefix="") vars =
......
115 116
    LustreSpec.ty_dec_loc = Location.dummy_loc;
116 117
  }
117 118
    
118
  let event_var = mkvar "event" event_type
119
  let event_var = mkvar "event" event_type 
119 120

  
120 121

  
121 122
  let const_map : (event_base_t, int) Hashtbl.t = Hashtbl.create 13
......
327 328
	let (vars', tr') = tr "sin_" "sout_" in
328 329
	pp_name call args;
329 330
	let funname = Format.flush_str_formatter () in
331
	let inputs = event_var :: state_vars_to_vdecl_list ~prefix:"sin_" Vars.state_vars in
332
	let outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars in
330 333
	let node =
331 334
	  Corelang.mktop (	
332 335
	    LustreSpec.Node {LustreSpec.node_id = funname;
333 336
			   node_type = Types.new_var ();
334 337
			   node_clock = Clocks.new_var true;
335
			   node_inputs = event_var :: state_vars_to_vdecl_list ~prefix:"sin_" Vars.state_vars;
336
			   node_outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars;
338
			   node_inputs = inputs;
339
			   node_outputs = outputs;
337 340
			   node_locals = mk_locals vars'; (* TODO: add global vars *)
338 341
			   node_gencalls = [];
339 342
			   node_checks = [];
......
346 349
      )  
347 350
	in
348 351
	[node]
352

  
353

  
354

  
355
	  (* TODO
356
	     C'est pas evident. 
357
Il faut faire les choses suivantes:
358
- rajouter dans un ensemble les variables manipulées localement
359
- on doit comprendre comment les variables globales sont injectées dans le modele final:
360
   - le node principal doit uniquement les afficher. Il peut les initialiser avec les valeurs init définies. Puis appeller la fcn thetacallD_from_principal.
361
   - elles peuvent/doivent etre dans input et output de ce node thetacallD
362
	  *)
363

  
349 364
	  
350 365
  let mk_main_loop () =
351 366
    (* let loc = Location.dummy_loc in *)
352 367
    
353 368
    let call_stmt =
354 369
      (* (%t) -> pre (thetaCallD_from_principal (event, %a)) *)
355
      let init = mkexpr
356
	(LustreSpec.Expr_tuple (List.map (fun _ -> expr_of_bool false) (ActiveStates.Vars.elements Vars.state_vars)))
370
      let init =
371
	let init_state_false =
372
	  List.map (fun _ -> expr_of_bool false) (ActiveStates.Vars.elements Vars.state_vars) in
373
	let init_globals =
374
	  List.map (fun v -> v.GlobalVarDef.init_val) Vars.global_vars in
375
	mkexpr (LustreSpec.Expr_tuple (init_state_false @ init_globals))
357 376
      in
358 377
      let args = (Corelang.expr_of_vdecl event_var)::
359 378
	(vars_to_exprl ~prefix:"sout_" Vars.state_vars)
......
363 382
      let rhs = mkexpr (LustreSpec.Expr_arrow (init, pre_call_expr)) in
364 383
      mkstmt_eq Vars.state_vars ~prefix_lhs:"sout_" rhs
365 384
    in
385
    let inputs = List.map Corelang.copy_var_decl [event_var] in
386
    let outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars in
387
    (* TODO add the globals as sout_data_x entry values *)
366 388
    let node_principal =
367 389
      Corelang.mktop (	
368 390
	LustreSpec.Node {LustreSpec.node_id = "principal_loop";
369 391
			 node_type = Types.new_var ();
370 392
			 node_clock = Clocks.new_var true;
371
			 node_inputs = List.map Corelang.copy_var_decl [event_var];
372
			 node_outputs = state_vars_to_vdecl_list ~prefix:"sout_" Vars.state_vars;
393
			 node_inputs = inputs;
394
			 node_outputs = outputs;
373 395
			 node_locals = []; (* TODO: add global vars *)
374 396
			 node_gencalls = [];
375 397
			 node_checks = [];
......
381 403
			 node_annot = []}
382 404
      )  
383 405
    in
384
      node_principal
406
    node_principal
385 407
    
386 408

  
387 409
  let mkprincipal tr =

Also available in: Unified diff