From 777c3f4f839962d0463e57ac2da67509c445ff1a Mon Sep 17 00:00:00 2001
From: Erwan Jahier <erwan.jahier@univ-grenoble-alpes.fr>
Date: Fri, 13 Mar 2020 11:53:37 +0100
Subject: [PATCH] fix: try to do a better job with extern types.

In the -2c mode, in presence of extern types, I was defining them as int.
The idea was to have something that compiles, and then to ask the user
to redefine its extern types.

Now I define extern types as string (char*).

The rationale of this change is that before, the generated code was only
working for int, which is pretty useless as an extern type.

Have string by default is actually much more useful, for instance to use
string in a Lustre program.

Also, adapt to changes done in lutils, where the string type has ben added.
(sha:8619aa285ca8322ab9, i.e., > lutils  1.49.10)
---
 .gitignore              |  1 +
 bin/main.ml             | 31 +++++++++--------
 bin/soc2c.ml            | 77 +++++++++++++++++++++++++++--------------
 bin/soc2cExtern.ml      | 40 +++++++++++++--------
 bin/soc2cExtern.mli     |  4 +--
 bin/soc2cGenAssign.ml   |  7 ++--
 bin/soc2cHeap.ml        |  5 +--
 bin/soc2cStack.ml       |  3 +-
 bin/soc2cUtil.ml        |  4 ++-
 bin/socPredef2cStack.ml |  4 +--
 lib/actionsDeps.ml      |  6 ++--
 lib/soc2cIdent.ml       |  4 +--
 lib/socExecValue.ml     |  3 +-
 lib/socVar.ml           |  9 ++---
 test/lus2lic.sum        | 28 +++++++--------
 15 files changed, 138 insertions(+), 88 deletions(-)

diff --git a/.gitignore b/.gitignore
index 851359aa..e87f1c7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -177,3 +177,4 @@ Makefile.version
 *.cmx
 *.cmxs
 *.o
+*.bak
\ No newline at end of file
diff --git a/bin/main.ml b/bin/main.ml
index 96243c52..0388a4e0 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:07) by Erwan Jahier> *)
+(* Time-stamp: <modified the 12/03/2020 (at 11:45) by Erwan Jahier> *)
 
 open AstV6
 open Lxm
@@ -40,19 +40,19 @@ let find_a_node opt =
 
 
 let (gen_rif_interface : LicPrg.t -> Lv6Id.idref option -> Lv6MainArgs.t -> unit) =
-  fun lic_prg main_node opt -> 
+  fun lic_prg main_node opt ->
   let nk = 
     match main_node with
     | None -> (
-      let name = find_a_node opt in
-      let main_node = Lv6Id.to_idref name in
-      let nk = (Lic.node_key_of_idref main_node) in
-      if LicPrg.node_exists lic_prg nk then nk else (
-        output_string opt.oc ("Error: no node is specified.\nbye\n");
-        flush opt.oc;
-        my_exit opt 2
+        let name = find_a_node opt in
+        let main_node = Lv6Id.to_idref name in
+        let nk = (Lic.node_key_of_idref main_node) in
+        if LicPrg.node_exists lic_prg nk then nk else (
+          output_string opt.oc ("Error: no node is specified.\nbye\n");
+          flush opt.oc;
+          my_exit opt 2
+        )
       )
-    )
     | Some main_node -> Lic.node_key_of_idref main_node
   in
   let invars,outvars = 
@@ -61,9 +61,12 @@ let (gen_rif_interface : LicPrg.t -> Lv6Id.idref option -> Lv6MainArgs.t -> unit
     | Some node_def -> Lic2soc.soc_profile_of_node node_def
   in
   let my_type_to_string t =
-    let str = Data.type_to_string t in
-    let idref = Lv6Id.idref_of_string str in
-    (idref.Lv6Id.id_id)
+    match t with
+    | Data.Extern _ -> "string" (* what else can i do with extern type for RIF? *)
+    | _ ->
+      let str = Data.type_to_string t in
+      let idref = Lv6Id.idref_of_string str in
+      (idref.Lv6Id.id_id)
   in
   let invars  = SocVar.expand_profile true false invars in
   let outvars = SocVar.expand_profile true false outvars in
@@ -254,7 +257,7 @@ let main () = (
   let main_node = 
     if opt.main_node = "" then None else Some (Lv6Id.idref_of_string opt.main_node)
   in
-  if opt.outfile <> "" then opt.oc <- open_out opt.outfile;
+  if opt.outfile <> "" then opt.oc <- open_out opt.outfile; 
   (try (
     let nsl = Lv6Compile.get_source_list opt opt.infiles in
     let lic_prg = Lv6Compile.doit opt nsl main_node in
diff --git a/bin/soc2c.ml b/bin/soc2c.ml
index dd94a6e6..214e3773 100644
--- a/bin/soc2c.ml
+++ b/bin/soc2c.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 14/02/2020 (at 14:03) by Erwan Jahier> *)
+(* Time-stamp: <modified the 13/03/2020 (at 11:44) by Erwan Jahier> *)
 
 
 (* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *)
@@ -9,17 +9,18 @@ open Soc2cIdent
 open Data
 
 
-let rec (type_to_string2 : Data.t -> string) = 
+let rec (type_to_string_rif : Data.t -> string) = 
   fun v -> 
     let str =
       match v with
+        | String -> "string"
         | Bool -> "bool"
         | Int  -> "int"
         | Real -> "real"
-        | Extern s -> id2s s
+        | Extern _s ->  (* view extern type as strings *) "string" (*id2s s*)
         | Enum  (s, _sl) -> id2s s
         | Struct (sid,_) -> (id2s sid)
-        | Array (ty, sz) -> Printf.sprintf "%s_%d" (type_to_string2 ty) sz 
+        | Array (ty, sz) -> Printf.sprintf "%s_%d" (type_to_string_rif ty) sz 
         | Alpha nb -> "alpha_"^(string_of_int nb) 
         | Alias(n,_) -> n
     in
@@ -300,9 +301,9 @@ let (soc2c : int -> out_channel -> out_channel -> Soc.tbl -> Soc.key ->
         hfmt "#endif /* _%s_H_FILE */" base;
         close_out hfile;
         close_out cfile;
-        Printf.printf "%s.h has been generated.\n" base;
-        Printf.printf "%s.c has been generated.\n" base;
-        flush stdout
+        Printf.eprintf "W: %s.h has been generated.\n" base;
+        Printf.eprintf "W: %s.c has been generated.\n" base;
+        flush stderr
       );
       cfiles_acc
       )
@@ -310,10 +311,11 @@ let (soc2c : int -> out_channel -> out_channel -> Soc.tbl -> Soc.key ->
 (****************************************************************************)
 let (type_to_format_string : Data.t -> string) =
   function
+    | String -> "%s"
     | Bool -> "%d"
     | Int -> "%d"
     | Real-> "%f"
-    | Extern _s -> "%d"
+    | Extern _s -> "%s"
     | Enum  (_s, _sl) -> "%d" 
     | Struct (_sid,_) -> "%s"
     | Array (_ty, _sz) -> "%s"
@@ -606,17 +608,16 @@ int main(){" ^ (gen_main_loop_body inputs outputs soc ctx));
 "
         );
     );
-    Printf.printf "%s has been generated.\n" mainfile; flush stdout;
+    Printf.eprintf "W: %s has been generated.\n" mainfile; flush stderr;
     close_out oc
 
 
-let (gen_loop_file : LicPrg.t -> Soc.t -> string -> out_channel -> Soc.tbl -> unit) =
-  fun licprg soc base oc stbl -> 
+let (gen_loop_file : string -> LicPrg.t -> Soc.t -> string -> out_channel -> Soc.tbl
+     -> unit) =
+  fun fn licprg soc base oc stbl -> 
     let putc s = output_string oc s in
     let ctx = get_ctx_name soc.key in
     let step = Soc2cDep.step_name soc.key "step" in
-    let (n,_,_) = soc.key in
-    let n = id2s n in
     let inputs,outputs = soc.profile in
     let inputs_io  = SocVar.expand_profile true false inputs  in
     let outputs_io = SocVar.expand_profile true false outputs in
@@ -730,6 +731,27 @@ _real _get_real("^(
    } while(s != 1);
    return r;
 }
+char* _get_string("^(
+             if SocUtils.is_memory_less soc then "" else
+               ctx^"_type* ctx,"
+           ) ^"char* n){
+   char b[512];
+   char* r;
+   int s = 1;
+   do {
+      if(ISATTY) {
+         if(s != 1) printf(\"\\a\");
+         //printf(\"%s (real) ? \", n);
+      }
+      if(scanf(\"%s\", b)==EOF) exit(0);
+      if(*b == '#') {
+         _read_pragma("^
+           (if SocUtils.is_memory_less soc then "" else "ctx,")^"b);
+      }
+   } while(s != 1);
+   r =  b;
+   return r;
+}
 /* Standard Output procedures **************/
 void _put_bottom(char* n){
    if(ISATTY) printf(\"%s = \", n);
@@ -750,17 +772,20 @@ void _put_real(char* n, _real _V){
    if(ISATTY) printf(\"%s = \", n);
    printf(\"%f \", _V);
    if(ISATTY) printf(\"\\n\");
-}"^(Soc2cExtern.gen_getters licprg)^"
+}
+void _put_string(char* n, char* _V){
+   if(ISATTY) printf(\"%s = \", n);
+   printf(\"%s \", _V);
+   if(ISATTY) printf(\"\\n\");
+}
+"^(Soc2cExtern.gen_getters fn licprg soc)^"
 /* Output procedures **********************/
 #ifdef CKCHECK
 void %s_BOT_n(void* cdata){
    _put_bottom(\"n\");
 }
 #endif
-/* Output procedures **********************/
-void "^n^"_O_n(void* cdata, _integer _V) {
-   _put_int(\"n\", _V);
-}"^ (gen_memoryless_ctx stbl) ^
+"^ (gen_memoryless_ctx stbl) ^
 "
 /* Main procedure *************************/
 int main(){
@@ -768,7 +793,7 @@ int main(){
   (gen_main_loop_body inputs outputs soc ctx)
            )
     );
-    let to_rif_decl (n,t) = ("\\\""^n^"\\\":" ^(type_to_string t)) in
+    let to_rif_decl (n,t) = ("\\\""^n^"\\\":" ^(type_to_string_rif t)) in
     let inputs_t  = List.map to_rif_decl inputs_io in
     let outputs_t = List.map to_rif_decl outputs_io in
     let inputs_decl = Printf.sprintf "#inputs %s" (String.concat " " inputs_t) in
@@ -787,7 +812,7 @@ int main(){
     ++_s;
 ");
     List.iter (fun (id,t) -> 
-        let t = type_to_string2 t in
+        let t = type_to_string_rif t in
         let clk = "" in (* XXX finish me: get the clock if id using soc.clock_profile
                          and set this string to something like "if (clk_id)" 
                          *)
@@ -978,7 +1003,7 @@ typedef float _float;
       gen_main_wcet_file main_soc base stbl
     )
     else
-      gen_loop_file licprg main_soc base ocl stbl;
+      gen_loop_file loopfile licprg main_soc base ocl stbl;
     
     output_string och "
 #include <stdlib.h>
@@ -1009,7 +1034,7 @@ typedef float _float;
     
     puth "/////////////////////////////////////////////////\n";
     if assign_ext_types_list <> [] then (
-      output_string types_h_oc "// Defining array and extern types assignments \n";
+      output_string types_h_oc "\n// Defining array and extern types assignments \n";
       if Lv6MainArgs.global_opt.Lv6MainArgs.gen_wcet then 
         List.iter (fun t -> output_string types_h_oc (Soc2cGenAssign.f_forloop t))
                   assign_ext_types_list
@@ -1023,10 +1048,10 @@ typedef float _float;
     flush ocl; close_out ocl;
     flush consts_h_oc; close_out consts_h_oc;
     flush consts_c_oc; close_out consts_c_oc;
-    Printf.printf "%s has been generated.\n" loopfile;
-    Printf.printf "%s has been generated.\n" hfile;
-    Printf.printf "%s has been generated.\n" cfile;
-    flush stdout;
+    Printf.eprintf "W: %s has been generated.\n" loopfile;
+    Printf.eprintf "W: %s has been generated.\n" hfile;
+    Printf.eprintf "W: %s has been generated.\n" cfile;
+    flush stderr;
     let node =
       if args.Lv6MainArgs.main_node <> "" then args.Lv6MainArgs.main_node else
         Filename.basename (Filename.chop_extension (List.hd args.Lv6MainArgs.infiles))
diff --git a/bin/soc2cExtern.ml b/bin/soc2cExtern.ml
index f8f88c2e..49d52b6a 100644
--- a/bin/soc2cExtern.ml
+++ b/bin/soc2cExtern.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:04) by Erwan Jahier> *)
+(* Time-stamp: <modified the 13/03/2020 (at 11:44) by Erwan Jahier> *)
 
 open Soc2cIdent
 
@@ -20,7 +20,7 @@ let (type_decl : LicPrg.t -> string) =
       else acc
     in
     let preambule = "\n/* XXX FIXME: The following types must be defined/fixed */" ^
-      "\n#define FAKE_TYPE_DEF_2FIX int\n" 
+      "\n#define FAKE_TYPE_DEF_2FIX char*\n" 
     in
     let str = LicPrg.fold_types type_to_string prg "" in
     if str = "" then "" else (preambule^""^str^"\n")
@@ -94,16 +94,24 @@ let (const_declaration : LicPrg.t -> string) =
     let str = LicPrg.fold_consts const_to_string prg "" in
     if str = "" then "" else (preambule^str^"\n")
 
-let (gen_getters : LicPrg.t -> string) =
-  fun prg -> 
-    let type_to_string k t acc =
-      if is_extern_type t then
+let (gen_getters : string -> LicPrg.t -> Soc.t -> string) =
+  fun fn prg soc ->
+  let ctx = get_ctx_name soc.key in
+  let type_to_string k t acc =
+    if is_extern_type t then (
+        Printf.eprintf "W: please check the def of _get_%s in %s.\n%!" (long2s k) fn;
         Printf.sprintf "%s 
-_integer _get_%s(char* n) {
-  _integer r; 
-  r = _get_int(n);
+%s _get_%s(%schar* n) {
+  %s r; 
+  // XXX the code below is just a guess: you should check it is ok
+  r = _get_string(%sn);
   return r;
-}" acc  (long2s k)
+}" acc (long2s k) (long2s k)
+          (if SocUtils.is_memory_less soc then "" else
+             (Printf.sprintf "%s_type * ctx, " ctx))
+          (long2s k)
+          (if SocUtils.is_memory_less soc then "" else "ctx, ")
+      )
       else acc
     in
     let preambule = "\n/* XXX FIXME: The getters may need to be fixed too */" in
@@ -136,6 +144,9 @@ let (gen_files : Soc.t -> Soc.tbl -> LicPrg.t -> string -> string -> string ->
 
       if not (Sys.file_exists ext_hfile) && needs_hfile then (
         let ext_och = open_out ext_hfile in
+
+        Printf.eprintf "W: please check the def of FAKE_TYPE_DEF_2FIX in %s.\n%!"
+          ext_hfile;
         output_string ext_och (type_decl licprg);
 (*         output_string ext_och (cpy_decl licprg); *)
 
@@ -145,14 +156,15 @@ let (gen_files : Soc.t -> Soc.tbl -> LicPrg.t -> string -> string -> string ->
           output_string ext_och proto_decl; 
         ) extern_steps;
         close_out ext_och;
-        print_string (Printf.sprintf "%s has been generated.\n" ext_hfile);
-        
+        Printf.eprintf "W: %s has been generated.\n%!" ext_hfile;
       );
       if not (Sys.file_exists ext_cfile)  && needs_cfile then (
         let ext_occ = open_out ext_cfile in
         if needs_hfile then 
           output_string ext_occ (Printf.sprintf "#include \"%s\"\n" hfile);
-(*         output_string ext_occ (cpy_def licprg); *)
+        (*         output_string ext_occ (cpy_def licprg); *)
+        Printf.eprintf "W: please check the def of FAKE_CONST_DEF_2FIX in %s.\n%!"
+          ext_cfile;
         output_string ext_occ (const_def licprg);
         List.iter (fun (sm,soc) -> 
                    (* let sname = Soc2cDep.step_name soc.key sm.name in *)
@@ -161,7 +173,7 @@ let (gen_files : Soc.t -> Soc.tbl -> LicPrg.t -> string -> string -> string ->
           output_string ext_occ (Printf.sprintf "   /* finish me! */\n}\n")
         ) extern_steps;
         close_out ext_occ;
-        print_string (Printf.sprintf "%s has been generated.\n" ext_cfile);
+        Printf.eprintf "W: %s has been generated.\n" ext_cfile;
       );
       needs_cfile, needs_hfile
 
diff --git a/bin/soc2cExtern.mli b/bin/soc2cExtern.mli
index 560fe3e0..7abc4386 100644
--- a/bin/soc2cExtern.mli
+++ b/bin/soc2cExtern.mli
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 05/05/2017 (at 11:31) by Erwan Jahier> *)
+(* Time-stamp: <modified the 13/03/2020 (at 11:32) by Erwan Jahier> *)
 
 
 (* [gen_files main_soc licprg cfile hfile] returns a pair of bool that
@@ -23,4 +23,4 @@ val gen_files : Soc.t -> Soc.tbl -> LicPrg.t -> string -> string -> string -> bo
 val const_declaration : LicPrg.t -> string
 
 (* ext type getters for the _loop.c file *)
-val gen_getters : LicPrg.t -> string
+val gen_getters : string -> LicPrg.t -> Soc.t -> string
diff --git a/bin/soc2cGenAssign.ml b/bin/soc2cGenAssign.ml
index 4c821647..26a7ba61 100644
--- a/bin/soc2cGenAssign.ml
+++ b/bin/soc2cGenAssign.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:07) by Erwan Jahier> *)
+(* Time-stamp: <modified the 11/03/2020 (at 16:51) by Erwan Jahier> *)
 
 open Data
 
@@ -51,16 +51,17 @@ let (f: Data.t -> string) =
     let t_str = Soc2cIdent.type_to_short_string t in
     let t_def =
       match t with
-      | Bool | Int | Real | Enum _-> 
+      | Bool | Int | Real | Enum _ -> 
                       Printf.sprintf "
 #ifndef _assign_%s 
 #define _assign_%s(dest, source, size) dest = source 
 #endif
 " t_str t_str
+      | String
       | Extern _ -> 
          Printf.sprintf "
 #ifndef _assign_%s 
-#define _assign_%s(dest, source, size) dest = source // XXX fixme if not a basic type
+#define _assign_%s(dest, source, size) dest = source // XXX fixme?  
 #endif
 " t_str t_str
         
diff --git a/bin/soc2cHeap.ml b/bin/soc2cHeap.ml
index 4e1b4ad5..16ccd9bb 100644
--- a/bin/soc2cHeap.ml
+++ b/bin/soc2cHeap.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:05) by Erwan Jahier> *)
+(* Time-stamp: <modified the 06/03/2020 (at 13:34) by Erwan Jahier> *)
 
 open Soc2cUtil
 open Soc2cIdent
@@ -37,7 +37,8 @@ let rec (gen_assign : Data.t  -> string -> string -> string) =
       | Data.Struct(_) (* should I rather use memcpy for struct? *)
       | Data.Bool | Data.Int | Data.Real -> 
         Printf.sprintf "  %s = %s;\n" vi vo
-      | Data.Alpha(_) (* dead code ? *) 
+      | Data.Alpha(_) (* dead code ? *)
+      | Data.String 
       | Data.Array(_) -> 
         let t_str_short = Soc2cIdent.type_to_short_string t in
         Printf.sprintf "  _assign_%s(%s, %s, sizeof(%s));\n" t_str_short vi vo t_str
diff --git a/bin/soc2cStack.ml b/bin/soc2cStack.ml
index fb13d06b..85fefe0c 100644
--- a/bin/soc2cStack.ml
+++ b/bin/soc2cStack.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:07) by Erwan Jahier> *)
+(* Time-stamp: <modified the 06/03/2020 (at 13:36) by Erwan Jahier> *)
 
 open Soc2cUtil
 open Soc2cIdent
@@ -77,6 +77,7 @@ let rec (gen_assign : Data.t  -> string -> string -> string) =
       | Data.Struct(_) (* should I rather use memcpy for struct? *)
       | Data.Bool | Data.Int | Data.Real -> Printf.sprintf "  %s = %s;\n" vi vo
       | Data.Alpha(_) (* dead code ? *) 
+      | Data.String 
       | Data.Array(_) -> 
         let t_str_short = Soc2cIdent.type_to_short_string t in
         Printf.sprintf "  _assign_%s(%s, %s, sizeof(%s));\n" t_str_short vi vo t_str
diff --git a/bin/soc2cUtil.ml b/bin/soc2cUtil.ml
index 9f4e5c23..a9a89021 100644
--- a/bin/soc2cUtil.ml
+++ b/bin/soc2cUtil.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:08) by Erwan Jahier> *)
+(* Time-stamp: <modified the 06/03/2020 (at 13:35) by Erwan Jahier> *)
 
 open Soc2cIdent
 open Data
@@ -25,6 +25,7 @@ let (type_to_string : Data.t -> string -> string) =
         | Bool -> finish acc ("_boolean "^n)
         | Int -> finish acc ("_integer "^n)
         | Real-> finish acc ("_real "^n)
+        | String -> finish acc ("_string "^n)
         | Extern s -> finish acc ((id2s s)^" "^n)
         | Enum  (s, _sl) -> finish acc (id2s s ^" "^n)
         | Struct (sid,_) -> finish acc ((id2s sid)^" "^n)
@@ -206,6 +207,7 @@ let (data_type_to_c: Data.t  -> string -> string) =
         | Bool -> finish acc ("_boolean "^n)
         | Int -> finish acc ("_integer "^n)
         | Real-> finish acc ("_real "^n)
+        | String-> finish acc ("_string "^n)
         | Extern s -> finish acc ((id2s s)^" "^n)
         | Enum  (s, _sl) -> finish acc (id2s s ^" "^n)
         | Struct (sid,_) -> finish acc ((id2s sid)^" "^n)
diff --git a/bin/socPredef2cStack.ml b/bin/socPredef2cStack.ml
index d4245b1a..fb65e237 100644
--- a/bin/socPredef2cStack.ml
+++ b/bin/socPredef2cStack.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 17:11) by Erwan Jahier> *)
+(* Time-stamp: <modified the 06/03/2020 (at 13:36) by Erwan Jahier> *)
 
 open Data
 open Soc
@@ -287,7 +287,7 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) =
         (* arg passed by value are copied into the stack, so it's safe
            to use the same variable *)
         true
-      | Alias _ | Alpha _ -> assert false 
+        | String | Alias _ | Alpha _ -> assert false 
       (* ougth to be deadcode; true is the safe value anyway *)
       | Extern _
       | Array _ -> false
diff --git a/lib/actionsDeps.ml b/lib/actionsDeps.ml
index be2c39ed..6d785584 100644
--- a/lib/actionsDeps.ml
+++ b/lib/actionsDeps.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 29/08/2019 (at 15:23) by Erwan Jahier> *)
+(** Time-stamp: <modified the 06/03/2020 (at 13:32) by Erwan Jahier> *)
   
 let dbg = (Lv6Verbose.get_flag "deps")
 
@@ -136,7 +136,9 @@ let rec (_get_top_var : Soc.var_expr  -> Soc.var_expr) =
 let rec (gen_children: Soc.var_expr -> Soc.var_expr list) =
   fun v ->
   match Soc.data_type_of_var_expr v with
-  | Data.Alpha _ | Data.Extern _ | Data.Enum _  | Data.Bool | Data.Int | Data.Real -> [v]
+  | Data.Alpha _ | Data.Extern _ | Data.Enum _ | Data.String
+  | Data.Bool | Data.Int | Data.Real
+    -> [v]
   | Data.Struct(_ident, ident_t_list) ->
      List.fold_left
        (fun acc (id,t) ->
diff --git a/lib/soc2cIdent.ml b/lib/soc2cIdent.ml
index b1488081..63f2714a 100644
--- a/lib/soc2cIdent.ml
+++ b/lib/soc2cIdent.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 14:41) by Erwan Jahier> *)
+(* Time-stamp: <modified the 12/03/2020 (at 09:30) by Erwan Jahier> *)
 
 let colcol = Str.regexp "::"
 let prime = Str.regexp "'"
@@ -23,6 +23,7 @@ let rec (type_to_short_string : Data.t -> string) =
   fun v -> 
     let str =
       match v with
+        | Data.String -> "s"
         | Data.Bool -> "b"
         | Data.Int -> "i"
         | Data.Real-> "r"
@@ -93,7 +94,6 @@ let _ =
   Hashtbl.clear key_table; 
   ()
 
-
 let (get_ctx_name : Soc.key -> string) =
   fun sk -> (get_base_name sk) ^ "_ctx"
 
diff --git a/lib/socExecValue.ml b/lib/socExecValue.ml
index 9ca3287f..a800ea55 100644
--- a/lib/socExecValue.ml
+++ b/lib/socExecValue.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 16:40) by Erwan Jahier> *)
+(* Time-stamp: <modified the 06/03/2020 (at 13:30) by Erwan Jahier> *)
 
 let dbg = (Lv6Verbose.get_flag "exec")
 
@@ -277,6 +277,7 @@ let rec (get_value : ctx -> var_expr -> Data.v) =
       | Const(id,Enum(_,idl)) -> E(id, Lv6util.pos_in_list 0 id idl)
       | Const(id,Array(_vt,_i)) -> get_val id ctx
       | Const(id,Struct _) -> get_val id ctx
+      | Const(_id, String) -> assert false
       | Const(_id, Bool) -> assert false
       | Const(_id, Extern _) -> assert false
       | Const(_id, Alias _) -> assert false
diff --git a/lib/socVar.ml b/lib/socVar.ml
index 81b8d0e4..fdd92a10 100644
--- a/lib/socVar.ml
+++ b/lib/socVar.ml
@@ -1,4 +1,4 @@
-(* Time-stamp: <modified the 29/08/2019 (at 14:17) by Erwan Jahier> *)
+(* Time-stamp: <modified the 12/03/2020 (at 15:02) by Erwan Jahier> *)
 
 open Data
 
@@ -26,6 +26,7 @@ and expand_var enum_flag c_access var = match var with
   | (_vn,Extern _id) -> [var]
   | (vn,Alias(_n, t)) -> expand_var enum_flag c_access (vn,t)
   | (_vn,Alpha _) -> assert false (* should not occur *) 
+  | (_vn, String) -> assert false (* should not occur *) 
 
 let (_int_to_enum : Data.v -> Soc.ident list -> Data.v) =
   fun v el ->
@@ -38,7 +39,7 @@ let (expand_subst: Data.subst -> Data.subst list) =
   fun s ->
     let rec aux acc (n,v) =
       match v with
-        | U | I _ | F _ | B _  -> (n,v)::acc
+        | U | I _ | F _ | B _ | Str _  -> (n,v)::acc
         | E(_e,i) -> (n,I i)::acc
         | S fl -> 
           let f (fn,fv) = n^"_"^fn, fv in
@@ -77,7 +78,8 @@ let (unexpand_profile : sl -> Soc.var list -> sl) =
         match sl_todo, vl with
           | [],_::_ -> sl_done,[] 
           | _,[] -> sl_done, sl_todo
-          | s::sl, (_, (Bool| Int | Real))::vl -> aux (s::sl_done) sl vl
+          | s::sl, (_, (Bool| Int | Real | Extern _ | String ))::vl ->
+            aux (s::sl_done) sl vl
           | (id,v)::sl, (_,Enum(_n,el))::vl -> 
             let s =  (id, int_to_enum v el) in
             aux (s::sl_done) sl vl 
@@ -101,7 +103,6 @@ let (unexpand_profile : sl -> Soc.var list -> sl) =
             let sl_done = (vn, S fl)::sl_done in
             aux sl_done sl_todo vl
 
-          | _, (_vn,Extern _id)::_ -> assert false (* finish me! *)
           | _, (_vn,Alpha _  )::_ -> assert false (* should not occur *) 
           | _, (_, Alias _)::_ -> assert false (* should not occur *) 
 
diff --git a/test/lus2lic.sum b/test/lus2lic.sum
index 9a238b18..3f153b25 100644
--- a/test/lus2lic.sum
+++ b/test/lus2lic.sum
@@ -1,5 +1,5 @@
 ==> lus2lic0.sum <==
-Test run by jahier on Tue Mar  3 17:07:25 
+Test run by jahier on Fri Mar 13 11:51:14 
 Native configuration is x86_64-pc-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 Tue Mar  3 17:07:26 
+Test run by jahier on Fri Mar 13 11:51:15 
 Native configuration is x86_64-pc-linux-gnu
 
 		=== lus2lic1 tests ===
@@ -413,7 +413,7 @@ PASS: ./lus2lic  {-2c multipar.lus -n multipar}
 PASS: sh multipar.sh 
 
 ==> lus2lic2.sum <==
-Test run by jahier on Tue Mar  3 17:08:00 
+Test run by jahier on Fri Mar 13 11:51:48 
 Native configuration is x86_64-pc-linux-gnu
 
 		=== lus2lic2 tests ===
@@ -753,7 +753,7 @@ PASS: sh zzz2.sh
 PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz2.lus  {}
 
 ==> lus2lic3.sum <==
-Test run by jahier on Tue Mar  3 17:08:40 
+Test run by jahier on Fri Mar 13 11:52:27 
 Native configuration is x86_64-pc-linux-gnu
 
 		=== lus2lic3 tests ===
@@ -1267,7 +1267,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {}
 
 
 ==> lus2lic4.sum <==
-Test run by jahier on Tue Mar  3 17:09:26 
+Test run by jahier on Fri Mar 13 11:53:12 
 Native configuration is x86_64-pc-linux-gnu
 
 		=== lus2lic4 tests ===
@@ -1759,7 +1759,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node zzz2.lus {}
 # of expected failures		54
 
 ==> lus2lic1.sum <==
-PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus 33749 {}
+PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus 33421 {}
 
 		=== lus2lic1 Summary ===
 
@@ -1788,13 +1788,13 @@ PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus 33749
 ===============================
 # Total number of failures: 10
 lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds
-lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 34 seconds
-lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 40 seconds
-lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 46 seconds
-lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 26 seconds
+lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 33 seconds
+lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 39 seconds
+lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 45 seconds
+lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 25 seconds
 * Ref time: 
-86.77user 27.75system 2:26.54elapsed 78%CPU (0avgtext+0avgdata 284268maxresident)k
-0inputs+146792outputs (0major+11400569minor)pagefaults 0swaps
+82.98user 26.19system 2:22.66elapsed 76%CPU (0avgtext+0avgdata 283996maxresident)k
+0inputs+149888outputs (0major+11433733minor)pagefaults 0swaps
 * Quick time (-j 4):
-107.58user 29.57system 1:26.81elapsed 157%CPU (0avgtext+0avgdata 282988maxresident)k
-0inputs+141688outputs (0major+11114687minor)pagefaults 0swaps
+104.96user 28.76system 1:25.60elapsed 156%CPU (0avgtext+0avgdata 283296maxresident)k
+0inputs+147480outputs (0major+11277942minor)pagefaults 0swaps
-- 
GitLab