From c71d2ed6ddf9632f744fea83c36b9fc0554ae7c7 Mon Sep 17 00:00:00 2001
From: Erwan Jahier <erwan.jahier@univ-grenoble-alpes.fr>
Date: Wed, 27 Sep 2017 10:14:24 +0200
Subject: [PATCH] rdbg-plugin: add events that mimick node calls when array or
 struct are accessed

BTW, fix iterator handling which was not working from SocExecDbg
---
 _oasis                             |   4 +-
 src/licEvalConst.ml                |   6 +-
 src/lustre-v6.mldylib              |   3 +-
 src/lustre-v6.mllib                |   3 +-
 src/lv6version.ml                  |   4 +-
 src/main.ml                        |   2 +-
 src/soc2cUtil.ml                   |  16 +-
 src/socExecDbg.ml                  | 277 ++++++++++++++++++++---------
 src/socExecValue.ml                |   2 +-
 src/socUtils.ml                    |  25 ++-
 src/socUtils.mli                   |   8 +-
 test/lus2lic.sum                   |  26 +--
 test/should_work/map_red_iter.lus  |   8 +-
 test/should_work/test_map.lus      |   8 +-
 test/should_work/trivial_array.lus |  13 ++
 test/should_work/when_tuple.lus    |   7 +-
 16 files changed, 278 insertions(+), 134 deletions(-)

diff --git a/_oasis b/_oasis
index e62fb321..e003d205 100644
--- a/_oasis
+++ b/_oasis
@@ -1,6 +1,6 @@
 OASISFormat: 0.4
 Name:        lustre-v6
-Version:     1.717
+Version:     1.718
 Synopsis:    The Lustre V6 Verimag compiler
 Description: This package contains:
    (1) lus2lic: the (current) name of the compiler (and interpreter via -exec).
@@ -50,5 +50,5 @@ Library "lustre-v6"
   BuildDepends: str,unix,num,rdbg-plugin (>= 1.109) 
   Install:true
   XMETAEnable: true
-  InternalModules: SocExecValue,SocUtils,Lv6util,Lv6version,Lv6errors,Lxm,Lv6MainArgs,Lv6Verbose,Soc,SocPredef,Lv6Id,SocExecDbg,SocExec,SocExecEvalPredef,Lv6Compile,AstTab,AstTabSymbol,AstInstanciateModel,Lv6parserUtils,AstV6,FilenameExtras,LicTab,LicDump,AstPredef,Lic,AstCore,FreshName,IdSolver,EvalConst,LicEvalConst,LicEvalType,UnifyType,Ast2lic,AstV6Dump,EvalClock,UnifyClock,LicEvalClock,EvalType,LicPrg,LicMetaOp,L2lCheckOutputs,Lv6Misc,L2lRmPoly,L2lExpandMetaOp,L2lSplit,L2lExpandNodes,L2lExpandArrays,L2lCheckLoops,L2lCheckMemSafe,L2lOptimIte,Lv6lexer,Lv6parser,AstRecognizePredef,Lic2soc,Action,ActionsDeps,SocVar,TopoSort,SortActions,SortActionsExpe,L2lCheckCKeyWord,L2lCheckKcgKeyWord,L2lWhenOnId,L2lNoWhenNot,L2lRemoveAlias,L2lExpandEnum
+  InternalModules: SocExecValue,SocUtils,Lv6util,Lv6version,Lv6errors,Lxm,Lv6MainArgs,Lv6Verbose,Soc2cIdent,Soc,SocPredef,Lv6Id,SocExecDbg,SocExec,SocExecEvalPredef,Lv6Compile,AstTab,AstTabSymbol,AstInstanciateModel,Lv6parserUtils,AstV6,FilenameExtras,LicTab,LicDump,AstPredef,Lic,AstCore,FreshName,IdSolver,EvalConst,LicEvalConst,LicEvalType,UnifyType,Ast2lic,AstV6Dump,EvalClock,UnifyClock,LicEvalClock,EvalType,LicPrg,LicMetaOp,L2lCheckOutputs,Lv6Misc,L2lRmPoly,L2lExpandMetaOp,L2lSplit,L2lExpandNodes,L2lExpandArrays,L2lCheckLoops,L2lCheckMemSafe,L2lOptimIte,Lv6lexer,Lv6parser,AstRecognizePredef,Lic2soc,Action,ActionsDeps,SocVar,TopoSort,SortActions,SortActionsExpe,L2lCheckCKeyWord,L2lCheckKcgKeyWord,L2lWhenOnId,L2lNoWhenNot,L2lRemoveAlias,L2lExpandEnum
 # Comment se passer de cette liste à la Prevert ?
diff --git a/src/licEvalConst.ml b/src/licEvalConst.ml
index 1d900b45..2c116992 100644
--- a/src/licEvalConst.ml
+++ b/src/licEvalConst.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 10/07/2017 (at 10:46) by Erwan Jahier> *)
+(* Time-stamp: <modified the 22/09/2017 (at 16:51) by Erwan Jahier> *)
 
 open AstPredef
 open Lic
@@ -143,7 +143,6 @@ let f
       | INT2REAL_n -> if_evaluator string_of_int ll
       | AND_n  -> bbb_evaluator (&&) ll
       | OR_n   -> bbb_evaluator (||) ll
-      | XOR_n  -> bbb_evaluator (<>) ll
       | IMPL_n -> bbb_evaluator (fun a b -> (not a) || b) ll
       | EQ_n   -> aab_evaluator (=) ll
       | NEQ_n  -> aab_evaluator (<>) ll 
@@ -170,7 +169,8 @@ let f
       | RSLASH_n -> fff_evaluator (/.) ll
       | RTIMES_n -> fff_evaluator ( *.) ll
       | NOR_n   -> boolred_evaluator 0 0 ll
-      | DIESE_n -> boolred_evaluator 1 1 ll
+      | DIESE_n -> boolred_evaluator 0 1 ll
+      | XOR_n  ->  boolred_evaluator 1 1 ll
 (*
       | CondAct -> assert false
       | Map -> assert false
diff --git a/src/lustre-v6.mldylib b/src/lustre-v6.mldylib
index ba6b3789..64f92c55 100644
--- a/src/lustre-v6.mldylib
+++ b/src/lustre-v6.mldylib
@@ -1,5 +1,5 @@
 # OASIS_START
-# DO NOT EDIT (digest: 0e59a5b102689755b86c5ab8a3414f4f)
+# DO NOT EDIT (digest: d031f6402d873c25d477fea574448e75)
 Lus2licRun
 SocExecValue
 SocUtils
@@ -9,6 +9,7 @@ Lv6errors
 Lxm
 Lv6MainArgs
 Lv6Verbose
+Soc2cIdent
 Soc
 SocPredef
 Lv6Id
diff --git a/src/lustre-v6.mllib b/src/lustre-v6.mllib
index ba6b3789..64f92c55 100644
--- a/src/lustre-v6.mllib
+++ b/src/lustre-v6.mllib
@@ -1,5 +1,5 @@
 # OASIS_START
-# DO NOT EDIT (digest: 0e59a5b102689755b86c5ab8a3414f4f)
+# DO NOT EDIT (digest: d031f6402d873c25d477fea574448e75)
 Lus2licRun
 SocExecValue
 SocUtils
@@ -9,6 +9,7 @@ Lv6errors
 Lxm
 Lv6MainArgs
 Lv6Verbose
+Soc2cIdent
 Soc
 SocPredef
 Lv6Id
diff --git a/src/lv6version.ml b/src/lv6version.ml
index ea32b769..e168b458 100644
--- a/src/lv6version.ml
+++ b/src/lv6version.ml
@@ -1,7 +1,7 @@
 (** Automatically generated from Makefile *) 
 let tool = "lus2lic"
 let branch = "master"
-let commit = "717"
-let sha_1 = "a80c5c7342142db766bda3353b81cff2cfcc8288"
+let commit = "718"
+let sha_1 = "2cf779843c4861964cf2903df72c46c2b233c142"
 let str = (branch ^ "." ^ commit ^ " (" ^ sha_1 ^ ")")
 let maintainer = "erwan.jahier@univ-grenoble-alpes.fr"
diff --git a/src/main.ml b/src/main.ml
index 930db8ae..5f499bfa 100644
--- a/src/main.ml
+++ b/src/main.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 20/07/2017 (at 17:09) by Erwan Jahier> *)
+(* Time-stamp: <modified the 22/09/2017 (at 10:09) by Erwan Jahier> *)
 
 open Lv6Verbose
 open AstV6
diff --git a/src/soc2cUtil.ml b/src/soc2cUtil.ml
index 815982e3..db4a13d2 100644
--- a/src/soc2cUtil.ml
+++ b/src/soc2cUtil.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 21/07/2017 (at 16:55) by Erwan Jahier> *)
+(* Time-stamp: <modified the 27/09/2017 (at 09:57) by Erwan Jahier> *)
 
 open Soc2cIdent
 open Data
@@ -38,15 +38,7 @@ let string_of_flow_decl (id, t) =
   Printf.sprintf "   %s;\n" (type_to_string t (id2s id)) 
 
 open Soc
-let rec (lustre_string_of_var_expr: Soc.var_expr -> string) = 
-  function
-    | Const("true", _) -> "true"
-    | Const("false", _) -> "false"
-    | Const(id, _) -> id2s id
-    | Var (id,_)   -> id
-    | Field(f, id,_) -> Printf.sprintf "%s.%s" (lustre_string_of_var_expr f) (id2s id) 
-    | Index(f, index,_) -> Printf.sprintf "%s[%i]" (lustre_string_of_var_expr f) index
-    | Slice(f,fi,la,st,wi,vt) -> assert false (* should not occur *)
+
 
 let string_of_flow_decl_w7annot gaol (id, t) = 
   let decl = string_of_flow_decl (id, t) in
@@ -68,7 +60,7 @@ let string_of_flow_decl_w7annot gaol (id, t) =
         )
         | Call(_, Method((inst2,("Lustre::pre",_,_)),"set"),outs,_) ->
            if inst2 = inst then
-             let output_list = List.map lustre_string_of_var_expr outs in
+             let output_list = List.map SocUtils.lustre_string_of_var_expr outs in
              let id2 = String.concat "," output_list in
              Some id2
            else 
@@ -85,7 +77,7 @@ let string_of_flow_decl_w7annot gaol (id, t) =
     | Some x -> x
   in
   let string_of_atomic_operation ao ins =
-    let input_list = List.map lustre_string_of_var_expr ins in
+    let input_list = List.map SocUtils.lustre_string_of_var_expr ins in
     match ao, input_list with
     | Assign,_ -> None
     | Procedure ("Lustre::ruminus",_,_), [a] -> Some (Printf.sprintf "-%s" a)
diff --git a/src/socExecDbg.ml b/src/socExecDbg.ml
index a470f1f3..b54a40aa 100644
--- a/src/socExecDbg.ml
+++ b/src/socExecDbg.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 12/09/2017 (at 08:52) by Erwan Jahier> *)
+(* Time-stamp: <modified the 27/09/2017 (at 10:11) by Erwan Jahier> *)
 open Soc
 open Data
 open SocExecValue
@@ -35,9 +35,28 @@ let (assign_expr : SocExecValue.ctx -> var_expr -> var_expr -> SocExecValue.ctx)
     in
     Lv6Verbose.exe ~flag:dbg (fun () -> print_string (" Done!"); flush stdout);
     res
+
+let make_simple_sinfo lxm name is os  =
+  Some(fun () ->
+         let atom =
+           {
+             Event.str  = name; 
+             Event.file = Lxm.file lxm ; 
+             Event.line = Lxm.line lxm ,Lxm.line lxm ; 
+             Event.char = Lxm.cstart lxm, Lxm.cend lxm;
+             Event.stack =  None;
+           }
+         in
+         {
+           Event.expr  = Expr.Var (Lxm.str lxm);
+           Event.atoms = [atom];
+           Event.more  = None; 
+           Event.in_subst = is ;
+           Event.out_subst = os ;
+         }
+      )
       
 let make_sinfo lxm name_opt ectx in_subst out_subst =
-  let l = Lxm.line lxm in
   (*   if l <= 0 then None else *)
     Some(fun () ->
          let atom =
@@ -145,8 +164,84 @@ let get_all_subst = SocExecValue.filter_top_subst
 let get_all_subst = SocExecValue.substs_to_data_subst
 let get_input_vals val_ctx in_vars =
   let datal = SocExecValue.get_vals val_ctx in
-  let datal = List.filter (fun (x,_) -> List.mem_assoc x in_vars) datal in
+  let datal = List.filter (fun (x,_) -> List.mem_assoc x in_vars||x="_memory") datal in
   datal
+
+(* Generates events that mimick node calls when array or struct are accessed *)
+let (gen_access_events :
+       Lxm.t -> var_expr -> Event.t -> SocExecValue.ctx ->
+       (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) =
+  fun lxm v ectx val_ctx  cont ->
+  let v_str = SocUtils.lustre_string_of_var_expr v in
+  let ve,id,short_id,t = match v with
+    | Index(ve, i, t) -> ve, v_str,
+                         "["^string_of_int i^"]", t
+    | Field(ve, id, t) -> ve, "access_field_"^id, "."^id, t
+    | _ -> assert false (* sno *)
+  in
+  let initial_sinfo = ectx.sinfo in
+  let top = SocUtils.get_top_var ve in
+  let v_in = SocUtils.lustre_string_of_var_expr top, data_type_of_var_expr top in
+  let v_out = v_str, t in
+  let lxm = Lxm.override_name short_id lxm in
+  let sinfo = make_simple_sinfo lxm short_id [v_in,v_in] [v_out,v_out] in
+  let val_ctx0 = { val_ctx with cpath = (List.tl val_ctx.cpath) } in
+  let val_v_in = SocExecValue.get_value val_ctx0  ve in
+  let (data:Data.subst list) = [  fst v_in, val_v_in]  in  
+  let cont2 local_ectx val_ctx =
+    let nectx = Event.incr_event_nb local_ectx in
+    let nectx = { nectx with Event.sinfo = initial_sinfo } in
+    let val_v_out =
+      match v, val_v_in with
+      | Index(ve, i, t) , A a -> a.(i)
+      | Field(ve, id, t), S fl -> (try List.assoc id fl with _ -> assert false (*sno *))
+      | _,U -> U
+      | _,_ -> assert false
+    in
+    let data = (fst v_out, val_v_out)::data in
+    {
+      Event.step = ectx.Event.step;
+      Event.nb = nectx.Event.nb;
+      Event.depth = ectx.Event.depth;
+      Event.kind = Event.Exit;
+      Event.lang = "lustre";
+      Event.name = id;
+      Event.inputs = [v_in];
+      Event.outputs = [v_out];
+      Event.locals = [];
+      Event.sinfo = sinfo;
+      Event.data = data;
+      Event.next = (fun () -> cont nectx val_ctx);
+      Event.terminate = ectx.Event.terminate;
+    } 
+  in
+  {
+    Event.step = ectx.Event.step;
+    Event.nb = ectx.Event.nb;
+    Event.depth = ectx.Event.depth;
+    Event.kind = Event.Call;
+    Event.lang = "lustre";
+    Event.name = id;
+    Event.inputs = [v_in];
+    Event.outputs = [v_out];
+    Event.locals = [];
+    Event.sinfo = sinfo;
+    Event.data = data;
+    Event.next = (fun () -> cont2 ectx val_ctx);
+    Event.terminate = ectx.Event.terminate;
+  } 
+
+let rec (gen_access_events_list :
+           Lxm.t -> var_expr list -> Event.t -> SocExecValue.ctx ->
+           (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) =
+  fun lxm vel_in ectx val_ctx cont ->
+  let vel_in = List.filter (function Index _ | Field _  -> true | _ -> false) vel_in in
+  match vel_in with
+  | [] -> cont ectx val_ctx
+  | ve_in::tail ->
+     let cont ectx val_ctx = gen_access_events lxm ve_in ectx val_ctx cont in
+     gen_access_events_list lxm tail  ectx val_ctx cont
+    
   
 exception  SourceInfoError of (string * string)
     
@@ -220,7 +315,7 @@ let rec (soc_step :  Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t ->
           in
           cont ectx val_ctx
         in
-        do_soc_step lxm inst_name node_step val_ctx soc_tbl node_soc
+        do_soc_step lxm None node_step val_ctx soc_tbl node_soc
                     vel_in vel_out ectx cont              
       ) else (
         let first_step = Var ("_memory",Bool) in
@@ -255,13 +350,9 @@ let rec (soc_step :  Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t ->
         | _  -> Array.of_list (List.map fst soc.instances)
       in
       let path_saved = val_ctx.cpath in
+      let add_i i (id,t) = (Printf.sprintf "%s_%d" id i), t in
       let rec f i cont ectx val_ctx = (* iterate over the list of instances *)
         if i < 0 then
-          let val_ctx = if iter = "map" then val_ctx else 
-                          let a_in  = Var (List.hd iter_inputs) in
-                          let a_out = Var (List.hd iter_outputs) in
-                          assign_expr val_ctx a_in a_out (* a_out=a_n *)
-          in
           cont ectx val_ctx
         else (
           let vel_in, vel_out =
@@ -270,9 +361,18 @@ let rec (soc_step :  Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t ->
                         List.map (array_index i) iter_outputs)
             | "fold" | "red" | "fill"
             | "fillred" ->
-               let a_in = Var (List.hd iter_inputs) in
-               ( a_in::(List.map (array_index i) (List.tl iter_inputs)),
-                 a_in::(List.map (array_index i) (List.tl iter_outputs)))
+               let a_in = (List.hd iter_inputs) in
+               let a_in_i, a_in_ip1 =
+                 if i = 0 then 
+                   Var (a_in), Var (add_i 1 a_in) 
+                 else 
+                   if i = n-1 then
+                     Var (add_i i a_in), Var (List.hd iter_outputs) 
+                   else
+                     Var (add_i i a_in), Var (add_i (i+1) a_in)
+               in
+               ( a_in_i::(  List.map (array_index i) (List.tl iter_inputs)),
+                 a_in_ip1::(List.map (array_index i) (List.tl iter_outputs)))
             | _ -> assert false (* should not occur *)
           in
           let cont ectx val_ctx =
@@ -280,9 +380,10 @@ let rec (soc_step :  Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t ->
             cont ectx val_ctx
           in
           let cont ectx val_ctx =
+            let lxm = node_step.lxm in
             let val_ctx = { val_ctx with cpath = inst_name.(i)::val_ctx.cpath } in
-            do_soc_step lxm inst_name.(i) node_step val_ctx soc_tbl node_soc
-                                          vel_in vel_out ectx cont
+            do_soc_step lxm (Some i) node_step val_ctx
+                        soc_tbl node_soc vel_in vel_out ectx cont
           in
           f (i-1) cont ectx val_ctx
         )
@@ -376,19 +477,19 @@ and (do_gao : Soc.tbl -> Event.t -> gao -> SocExecValue.ctx ->
       List.fold_left2 assign_expr val_ctx vel_in vel_out
     in
     cont ectx val_ctx
-    *)
-        let fcont = 
-        List.fold_left2
-          (fun acc_cont ve_in ve_out ->
-           let ncont ectx val_ctx =
-             assign_expr_dbg lxm val_ctx ve_in ve_out ectx acc_cont in
-           ncont
-          )
-          cont
-          vel_in
-          vel_out 
-      in
-      fcont ectx val_ctx 
+     *)
+    let fcont = 
+      List.fold_left2
+        (fun acc_cont ve_in ve_out ->
+         let ncont ectx val_ctx =
+           assign_expr_dbg lxm val_ctx ve_in ve_out ectx acc_cont in
+         ncont
+        )
+        cont
+        vel_in
+        vel_out 
+    in
+    fcont ectx val_ctx 
   )
   | Call(vel_out, Procedure sk, vel_in, lxm) -> (
     let (proc_name,_,_) = sk in
@@ -401,7 +502,7 @@ and (do_gao : Soc.tbl -> Event.t -> gao -> SocExecValue.ctx ->
       cont ectx val_ctx
     in
     let cont ectx val_ctx =
-      do_soc_step lxm proc_name step val_ctx soc_tbl soc vel_in vel_out ectx cont
+      do_soc_step lxm None step val_ctx soc_tbl soc vel_in vel_out ectx cont
     in
     cont ectx val_ctx 
   )
@@ -417,105 +518,107 @@ and (do_gao : Soc.tbl -> Event.t -> gao -> SocExecValue.ctx ->
       cont ectx val_ctx
     in
     let cont ectx val_ctx = 
-      do_soc_step lxm inst_name step val_ctx soc_tbl soc vel_in vel_out ectx cont
+      do_soc_step lxm None step val_ctx soc_tbl soc vel_in vel_out ectx cont
     in
     cont ectx val_ctx 
   )
-and (do_soc_step : Lxm.t -> Lv6Id.t -> step_method -> SocExecValue.ctx ->
+and (do_soc_step : Lxm.t -> int option -> step_method -> SocExecValue.ctx ->
                    Soc.tbl -> Soc.t ->  var_expr list -> var_expr list -> Event.t -> 
                    (Event.t -> SocExecValue.ctx -> Event.t) ->  Event.t) =
-  fun lxm name step val_ctx soc_tbl soc vel_in vel_out ectx cont -> 
-  profile_info ("SocExecDbg.do_soc_step "^name^"\n");
+  fun lxm int_opt step val_ctx0 soc_tbl soc vel_in vel_out ectx0 cont0 -> 
+  let (soc_name,_,_) = soc.key in
+  profile_info ("SocExecDbg.do_soc_step "^soc_name^"\n");
   let soc_in_vars, soc_out_vars = soc.profile in
   let step_in_vars = filter_params soc soc_in_vars step.idx_ins in 
   let step_out_vars = filter_params soc soc_out_vars step.idx_outs in
-  let new_s = substitute_args_and_params vel_in step_in_vars val_ctx in
-  let val_ctx =  { val_ctx with s = new_s } in
-  let cont ectx val_ctx =
-    let s_out = substitute_params_and_args step_out_vars vel_out val_ctx in
-    cont ectx { val_ctx with s = s_out }
-  in
-  (*     let (datal:Data.subst list) = get_all_subst val_ctx.s in *)
-  let datal = get_input_vals val_ctx step_in_vars in   
-  let (soc_name,_,_) = soc.key in
+  let new_s = substitute_args_and_params vel_in step_in_vars val_ctx0 in
   let step_name = match soc.step with
       [_] -> soc_name
     | _ -> soc_name^"."^step.name
   in
+  let step_name = match int_opt with
+    | Some i -> Printf.sprintf "%s_%d" step_name i
+    | None -> step_name
+  in
   let locals = if soc.step = [] then [] else
                  match (List.hd soc.step).impl with
                  | Gaol (var_list, _) -> var_list
                  | Iterator _
                  | Boolred _
                  | Condact _
-                 | Predef 
-                 | Extern -> []
+                 | Extern 
+                 | Predef  -> []
+  in
+  let locals = match soc.memory with
+    | No_mem | Mem_hidden  -> locals
+    | Mem dt -> ("_memory",dt)::locals
   in
   let name_opt =
-  (* the long names of lustre op are boring *)
+    (* the long names of lustre op are boring *)
     if String.length step_name > 8 && String.sub step_name 0 8 = "Lustre::" then
       None else Some step_name
   in
-  let sinfo = make_sinfo lxm name_opt  ectx
+  let initial_sinfo = ectx0.Event.sinfo in
+  let ectx0 = {
+    ectx0 with
+    Event.depth = ectx0.Event.depth+1;
+  }
+  in
+  let sinfo = make_sinfo lxm name_opt  ectx0
                          (List.map2 sinfo_subst vel_in step_in_vars)
                          (List.map2 sinfo_subst vel_out step_out_vars)
   in
-  let initial_sinfo = ectx.Event.sinfo in
-  let ectx = {
-    ectx with
-    Event.name = step_name;
-    Event.depth = ectx.Event.depth+1;
-    Event.data = datal;
-    Event.inputs  = fst soc.profile;
-    Event.outputs = snd soc.profile;
-    Event.locals = locals;
-    Event.sinfo = sinfo;
-  }
-  in
   let cont2 local_ectx val_ctx =
-    (*       let (datal:Data.subst list) = List.map
-        (fun v -> fst v, SocExecValue.get_val (fst v) val_ctx) step_out_vars
-         in *)
+    let cont3 ectx val_ctx =
+      let s_out = substitute_params_and_args step_out_vars vel_out val_ctx in
+      cont0 ectx { val_ctx with s = s_out }
+    in
     let (datal:Data.subst list) = SocExecValue.get_vals val_ctx in 
     let nectx = Event.incr_event_nb local_ectx in
     let nectx = Event.decr_event_depth nectx in
     let nectx = { nectx with Event.sinfo = initial_sinfo } in
     {
-      Event.step = ectx.Event.step;
+      Event.step = nectx.Event.step;
       Event.nb = local_ectx.Event.nb;
-      Event.depth = ectx.Event.depth;
+      Event.depth = ectx0.Event.depth;
       Event.kind = Event.Exit;
       Event.lang = "lustre";
       Event.name = step_name;
-      Event.inputs = ectx.Event.inputs;
-      Event.outputs = ectx.Event.outputs;
-      Event.locals = ectx.Event.locals;
+      Event.inputs = nectx.Event.inputs;
+      Event.outputs = nectx.Event.outputs;
+      Event.locals = nectx.Event.locals;
       Event.sinfo = sinfo;
       Event.data = datal;
-      Event.next = (fun () -> cont nectx val_ctx);
-      Event.terminate = ectx.Event.terminate;
+      Event.next = (fun () -> cont3 nectx val_ctx);
+      Event.terminate = nectx.Event.terminate;
     } 
   in
-  { 
-    Event.step = ectx.Event.step;
-    Event.nb = ectx.Event.nb;
-    Event.depth = ectx.Event.depth;
-    Event.kind = Event.Call;
-    Event.lang = "lustre";
-    Event.name = step_name;
-    Event.inputs = ectx.Event.inputs;
-    Event.outputs = ectx.Event.outputs;
-    Event.locals = ectx.Event.locals;
-    Event.sinfo = sinfo;
-    Event.data = ectx.Event.data;
-    Event.next = (fun () ->
-                  assert (List.mem  step soc.step);
-                  let ectx = Event.incr_event_nb ectx in
-                  soc_step lxm step soc_tbl soc ectx { val_ctx with s=new_s } cont2
-                 );
-    Event.terminate = ectx.Event.terminate;
-  }
-
+  let cont1 lectx val_ctx =
+    let ectx = {
+      lectx with
+      Event.name = step_name;
+      Event.inputs  = fst soc.profile;
+      Event.outputs = snd soc.profile;
+      Event.locals = locals;
+      Event.sinfo = sinfo;
+    }
+    in
+    let ectx = Event.incr_event_nb ectx in
+    let val_ctx =  { val_ctx with s = new_s } in
+    (*     let (datal:Data.subst list) = get_all_subst val_ctx.s in *)
+    let datal = get_input_vals val_ctx step_in_vars in   
+    {  ectx with 
+      Event.kind = Event.Call;
+      Event.lang = "lustre";
+      Event.data = datal;
+      Event.next = (fun () ->
+                    assert (List.mem  step soc.step);
+                    let ectx = Event.incr_event_nb ectx in
+                    soc_step lxm step soc_tbl soc ectx val_ctx cont2
+                   );
+    }
+  in
+  gen_access_events_list step.lxm vel_in ectx0 val_ctx0 cont1
 
 
 (* get the step params from its soc params *)
diff --git a/src/socExecValue.ml b/src/socExecValue.ml
index e01424d8..2384d166 100644
--- a/src/socExecValue.ml
+++ b/src/socExecValue.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2017 (at 15:55) by Erwan Jahier> *)
+(* Time-stamp: <modified the 26/09/2017 (at 17:27) by Erwan Jahier> *)
 
 let dbg = (Lv6Verbose.get_flag "exec")
 
diff --git a/src/socUtils.ml b/src/socUtils.ml
index 3b1bcfb6..837b1b72 100644
--- a/src/socUtils.ml
+++ b/src/socUtils.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 07/09/2017 (at 17:02) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/09/2017 (at 09:56) by Erwan Jahier> *)
 
 
 open Soc
@@ -388,3 +388,26 @@ let (filter_step_params : int list -> 'a list -> 'a list) =
 
 let _ = (
   assert (filter_step_params [0;1;4] ["v1";"v2";"v3";"v4";"v5"] =  ["v1";"v2";"v5"]))
+
+  
+let rec (get_top_var : Soc.var_expr  -> Soc.var_expr) =
+  fun var -> 
+(* if var = t.[2].field, then it returns (also) t.[2] and t  *)
+    match var with
+      | Soc.Slice(ve,_,_,_,_,_)
+      | Soc.Field(ve,_,_)  
+      | Soc.Index(ve,_,_) -> get_top_var ve
+      | Soc.Var(_,vt)
+      | Soc.Const(_,vt) -> var 
+
+open Soc2cIdent
+let rec (lustre_string_of_var_expr: Soc.var_expr -> string) = 
+  function
+    | Const("true", _) -> "true"
+    | Const("false", _) -> "false"
+    | Const(id, _) -> id2s id
+    | Var (id,_)   -> id
+    | Field(f, id,_) -> Printf.sprintf "%s.%s" (lustre_string_of_var_expr f) (id2s id) 
+    | Index(f, index,_) -> Printf.sprintf "%s[%i]" (lustre_string_of_var_expr f) index
+    | Slice(f,fi,la,st,wi,vt) -> assert false (* should not occur *)
+
diff --git a/src/socUtils.mli b/src/socUtils.mli
index 83531dc7..c7d47f2e 100644
--- a/src/socUtils.mli
+++ b/src/socUtils.mli
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 07/09/2017 (at 17:02) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/09/2017 (at 09:54) by Erwan Jahier> *)
 
 
 (** Donne toute les méthodes d'un composant. *)
@@ -71,3 +71,9 @@ nb : we suppose that the index list is in increasing order.
 val filter_step_params : int list -> 'a list -> 'a list
 
 val get_rank : 'a -> ('a * 'b) list -> int
+
+                                      
+(* if var = t.[2].field, then it returns (also) t.[2] and t  *)
+val get_top_var : Soc.var_expr  -> Soc.var_expr
+
+val lustre_string_of_var_expr: Soc.var_expr -> string
diff --git a/test/lus2lic.sum b/test/lus2lic.sum
index 09b1f8b4..ea7658c5 100644
--- a/test/lus2lic.sum
+++ b/test/lus2lic.sum
@@ -1,5 +1,5 @@
 ==> lus2lic0.sum <==
-Test Run By jahier on Mon Sep 11 15:03:42 
+Test Run By jahier on Wed Sep 27 09:40:20 
 Native configuration is x86_64-unknown-linux-gnu
 
 		=== lus2lic0 tests ===
@@ -66,7 +66,7 @@ XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/lecte
 XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/s.lus
 
 ==> lus2lic1.sum <==
-Test Run By jahier on Mon Sep 11 15:03:43 
+Test Run By jahier on Wed Sep 27 09:40:21 
 Native configuration is x86_64-unknown-linux-gnu
 
 		=== lus2lic1 tests ===
@@ -412,7 +412,7 @@ PASS: sh multipar.sh
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus  {}
 
 ==> lus2lic2.sum <==
-Test Run By jahier on Mon Sep 11 15:04:37 
+Test Run By jahier on Wed Sep 27 09:41:17 
 Native configuration is x86_64-unknown-linux-gnu
 
 		=== lus2lic2 tests ===
@@ -752,7 +752,7 @@ PASS: sh zzz2.sh
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz2.lus  {}
 
 ==> lus2lic3.sum <==
-Test Run By jahier on Mon Sep 11 15:05:36 
+Test Run By jahier on Wed Sep 27 09:42:18 
 Native configuration is x86_64-unknown-linux-gnu
 
 		=== lus2lic3 tests ===
@@ -1266,7 +1266,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {}
 
 
 ==> lus2lic4.sum <==
-Test Run By jahier on Mon Sep 11 15:06:50 
+Test Run By jahier on Wed Sep 27 09:43:31 
 Native configuration is x86_64-unknown-linux-gnu
 
 		=== lus2lic4 tests ===
@@ -1784,13 +1784,13 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node zzz2.lus {}
 ===============================
 # Total number of failures: 14
 lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds
-lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 54 seconds
-lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 59 seconds
-lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 74 seconds
-lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 47 seconds
+lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 56 seconds
+lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 61 seconds
+lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 73 seconds
+lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 49 seconds
 * Ref time: 
-0.06user 0.01system 3:55.62elapsed 0%CPU (0avgtext+0avgdata 5580maxresident)k
-32inputs+0outputs (0major+6192minor)pagefaults 0swaps
+0.06user 0.00system 3:59.96elapsed 0%CPU (0avgtext+0avgdata 5564maxresident)k
+96inputs+0outputs (0major+6134minor)pagefaults 0swaps
 * Quick time (-j 4):
-0.06user 0.01system 1:44.43elapsed 0%CPU (0avgtext+0avgdata 5648maxresident)k
-64inputs+0outputs (0major+6216minor)pagefaults 0swaps
+0.05user 0.02system 2:20.68elapsed 0%CPU (0avgtext+0avgdata 5424maxresident)k
+128inputs+0outputs (0major+6122minor)pagefaults 0swaps
diff --git a/test/should_work/map_red_iter.lus b/test/should_work/map_red_iter.lus
index 4a78e2fb..f0f6dcee 100644
--- a/test/should_work/map_red_iter.lus
+++ b/test/should_work/map_red_iter.lus
@@ -54,10 +54,10 @@ let
 tel
 
 node map_red_iter (indice_gen : int ; 
-                      InfoGenIndiv  : T_InfoGenIndiv ;
-                      InfoGenGlob    : T_InfoGenGlob ;
-                      TabEtatCharge : T_EtatCharge^NBC;
-                      TabComVal     : bool^NBC) 
+                   InfoGenIndiv  : T_InfoGenIndiv ;
+                   InfoGenGlob    : T_InfoGenGlob ;
+                   TabEtatCharge : T_EtatCharge^NBC;
+                   TabComVal     : bool^NBC) 
         returns (TabComChg  : T_ComChg^NBC);
 var bidon : int;
 let
diff --git a/test/should_work/test_map.lus b/test/should_work/test_map.lus
index 9a427eac..c0fe9f47 100644
--- a/test/should_work/test_map.lus
+++ b/test/should_work/test_map.lus
@@ -1,7 +1,7 @@
 
-function myplus<<type t>>(x, y : t) returns (o : t);
+function myplus<<type t>>(e1, e2 : t) returns (res : t);
 let
-   o = x + y;
+   res = e1 + e2;
 tel
 
 const n=4;
@@ -12,7 +12,7 @@ let
 	(* o = titi<<int>>(x,y); *)
 tel
 
-function test_map(x,y: real^n) returns (o: real^n);
+function test_map(a,b: real^n) returns (c: real^n);
 let
-	o = titi<<real>>(x,y);
+	c = titi<<real>>(a,b);
 tel
diff --git a/test/should_work/trivial_array.lus b/test/should_work/trivial_array.lus
index e42e52fb..8df13225 100644
--- a/test/should_work/trivial_array.lus
+++ b/test/should_work/trivial_array.lus
@@ -3,3 +3,16 @@ let
 	y =  [x]|[x]|[x]|[x];
 tel
 
+function trivial_array2(x:int^3) returns (y: int);
+let
+	y =  x[0]+x[2]*x[1];
+tel
+
+function trivial_array3(i:int) returns (y: int);
+var 
+  x : int^3;
+let
+  x = i^3;
+	y =  x[0]+x[2]*x[1];
+tel
+
diff --git a/test/should_work/when_tuple.lus b/test/should_work/when_tuple.lus
index e355b947..f1e4a94d 100644
--- a/test/should_work/when_tuple.lus
+++ b/test/should_work/when_tuple.lus
@@ -3,7 +3,7 @@ node when_tuple(a, b,  c: bool) returns (x: bool when a; y: bool when a);
 
 let 
   -- XXX should we accept that ?
-  (x, y) = toto((b, c) when a);
+  (x, y) = tutu((b, c) when a);
 
 tel
 
@@ -14,3 +14,8 @@ let
   (a, b, c)= (x, x, x) when clk;
 tel
 extern node toto(u: bool; v: bool) returns (x: bool; y: bool);
+
+node tutu(u: bool; v: bool) returns (x: bool; y: bool);
+let
+  (x,y)= (u,v);
+tel
\ No newline at end of file
-- 
GitLab