From b6f4768364e252569aa13fc54a0cd87d6dee045c Mon Sep 17 00:00:00 2001
From: Leandre Lacourt <lacourtl@santel.imag.fr>
Date: Tue, 10 Sep 2024 16:01:37 +0200
Subject: [PATCH] =?UTF-8?q?mise=20en=20place=20d'un=20fichier=20para=20vid?=
 =?UTF-8?q?e=20si=20compil=C3=A9=20sans=20t=C3=A2che?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 bin/lustre-mt/main.ml   | 265 ++++++++++++++++++++--------------------
 bin/lustre-mt/parser.ml |  13 +-
 lib/soc2yaml.ml         |   4 +-
 3 files changed, 142 insertions(+), 140 deletions(-)

diff --git a/bin/lustre-mt/main.ml b/bin/lustre-mt/main.ml
index 637473a..4a0a6a9 100644
--- a/bin/lustre-mt/main.ml
+++ b/bin/lustre-mt/main.ml
@@ -31,144 +31,145 @@ let main () =
 
   (* creates the files *)
   let cfile = open_out ("para.c") in
-
-  (* includes *)
-  fprintf cfile "#include <stdio.h>\n";
-  fprintf cfile "#include <pthread.h>\n";
-  fprintf cfile "#include <semaphore.h>\n";
-  fprintf cfile "#include <errno.h>\n";
-  fprintf cfile "#include <time.h>\n";
-  fprintf cfile "#include <sys/time.h>\n";
-
-  fprintf cfile "#include \"%s.h\"\n" !Parser.name;
-  fprintf cfile "\n";
-
-  (* semaphores macro *)
-  fprintf cfile "/* Initialize the semaphore with the given count.  */\n";
-  fprintf cfile "#define SEM_INIT(sem, v, max_v) sem_init(&(sem), 0, (v))\n";
-  fprintf cfile "/* wait for the semaphore to be active (i.e. equal to 1) and then decrement it by one. */\n";
-  fprintf cfile "#define SEM_WAIT(sem) while (sem_wait(&sem) != 0 && errno == EINTR) continue\n";
-  fprintf cfile "/* make the semaphore active (i.e. equal to 1) */\n";
-  fprintf cfile "#define SEM_SIGNAL(sem) sem_post(&(sem))\n";
-  fprintf cfile "\n";
-
-
-
-  fprintf cfile "/* task structures */\n";
-  let print_task_structs task =
-    fprintf cfile "typedef struct {\n";
-    fprintf cfile "\t%s_ctx_type ctx;\n" task.name;
-    fprintf cfile "\tsem_t sem_start;\n";
-    fprintf cfile "\tsem_t sem_join;\n";
-    fprintf cfile "pthread_t thr;\n}";
-    fprintf cfile "%s_TASK_struct;" task.name;
-    fprintf cfile "\n\n"
-  in
-  List.iter print_task_structs !tasks;
-
-  fprintf cfile "/* runners */\n";
-  let print_task_runners task = 
-    fprintf cfile "void* %s_runner(void* cd) {\n" task.name;
-    fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) cd;\n" task.name task.name;
-    fprintf cfile "\twhile(1){\n";
-    fprintf cfile "\t\tSEM_WAIT(ts->sem_start);\n";
-    fprintf cfile "\t\t%s_step(&ts->ctx);\n" task.name;
-    fprintf cfile "\t\tSEM_SIGNAL(ts->sem_join);\n";
-    fprintf cfile "\t}\n";
-    fprintf cfile "}\n\n"
-  in
-  List.iter print_task_runners !tasks;
-
-  fprintf cfile "/* task Initializers */\n";
-  let print_task_inits task = 
-    fprintf cfile "%s_TASK_type %s_TASK_init() {\n" task.name task.name;
-    fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*)calloc(1, sizeof(%s_TASK_struct));\n" task.name task.name task.name;
-    if task.memory then fprintf cfile "\t%s_ctx_init(&ts->ctx);\n" task.name;
-    fprintf cfile "\tSEM_INIT(ts->sem_start, 0, 1);\n";
-    fprintf cfile "\tSEM_INIT(ts->sem_join, 0, 1);\n";
-    fprintf cfile "\tpthread_create(&(ts->thr), NULL, %s_runner, ts);\n" task.name;
-    fprintf cfile "\treturn (void*) ts;\n";
-    fprintf cfile "}\n\n"
-  in
-  List.iter print_task_inits !tasks;
-  
-  fprintf cfile "/* task resets */\n";
-  let print_task_resets task =
-    if task.memory then 
-      (fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
-      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
-      fprintf cfile "\t%s_ctx_reset(&ts->ctx);\n" task.name;
-      fprintf cfile "}\n\n")
-    else
-      (fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
-      fprintf cfile "}\n\n")
-  in
-  List.iter print_task_resets !tasks; 
-
-  fprintf cfile "/* task start */\n";
-  let print_task_starts task =
-    fprintf cfile "void %s_TASK_START(%s_TASK_type tD) {\n" task.name task.name;
-    fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
-    fprintf cfile "\tSEM_SIGNAL(ts->sem_start);\n";
-    fprintf cfile "}\n\n"
-  in
-  List.iter print_task_starts !tasks; 
-
-  fprintf cfile "/* task join */\n";
-  let print_task_joins task =
-    fprintf cfile "void %s_TASK_JOIN(%s_TASK_type tD) {\n" task.name task.name;
-    fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
-    fprintf cfile "\tSEM_WAIT(ts->sem_join);\n";
-    fprintf cfile "}\n\n"
-  in
-  List.iter print_task_joins !tasks; 
+  let hfile = open_out ("para.h") in
   
-  fprintf cfile "/* task inputs */\n";
-  let print_task_inputs task = 
-    let (print_var_inputs : string -> variable -> unit) = 
-      fun name var -> 
-      fprintf cfile "void %s_TASK_setin_%s(%s_TASK_type tD, %s %s) {\n" name var.name name var.var_type var.name;
-      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
-      fprintf cfile "\tts->ctx.%s = %s;\n" var.name var.name;
-      fprintf cfile "}\n\n";
+  if((List.length !tasks) > 0) then
+  (* includes *)
+    fprintf cfile "#include <stdio.h>\n";
+    fprintf cfile "#include <pthread.h>\n";
+    fprintf cfile "#include <semaphore.h>\n";
+    fprintf cfile "#include <errno.h>\n";
+    fprintf cfile "#include <time.h>\n";
+    fprintf cfile "#include <sys/time.h>\n";
+
+    fprintf cfile "#include \"%s.h\"\n" !Parser.name;
+    fprintf cfile "\n";
+
+    (* semaphores macro *)
+    fprintf cfile "/* Initialize the semaphore with the given count.  */\n";
+    fprintf cfile "#define SEM_INIT(sem, v, max_v) sem_init(&(sem), 0, (v))\n";
+    fprintf cfile "/* wait for the semaphore to be active (i.e. equal to 1) and then decrement it by one. */\n";
+    fprintf cfile "#define SEM_WAIT(sem) while (sem_wait(&sem) != 0 && errno == EINTR) continue\n";
+    fprintf cfile "/* make the semaphore active (i.e. equal to 1) */\n";
+    fprintf cfile "#define SEM_SIGNAL(sem) sem_post(&(sem))\n";
+    fprintf cfile "\n";
+
+
+
+    fprintf cfile "/* task structures */\n";
+    let print_task_structs task =
+      fprintf cfile "typedef struct {\n";
+      fprintf cfile "\t%s_ctx_type ctx;\n" task.name;
+      fprintf cfile "\tsem_t sem_start;\n";
+      fprintf cfile "\tsem_t sem_join;\n";
+      fprintf cfile "pthread_t thr;\n}";
+      fprintf cfile "%s_TASK_struct;" task.name;
+      fprintf cfile "\n\n"
+    in
+    List.iter print_task_structs !tasks;
+
+    fprintf cfile "/* runners */\n";
+    let print_task_runners task = 
+      fprintf cfile "void* %s_runner(void* cd) {\n" task.name;
+      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) cd;\n" task.name task.name;
+      fprintf cfile "\twhile(1){\n";
+      fprintf cfile "\t\tSEM_WAIT(ts->sem_start);\n";
+      fprintf cfile "\t\t%s_step(&ts->ctx);\n" task.name;
+      fprintf cfile "\t\tSEM_SIGNAL(ts->sem_join);\n";
+      fprintf cfile "\t}\n";
+      fprintf cfile "}\n\n"
     in
-    List.iter (print_var_inputs task.name) task.var_in;
-  in
-  List.iter print_task_inputs !tasks;
-
-  fprintf cfile "/* task outputs */\n";
-  let print_task_outputs task = 
-    let (print_var_outputs : string -> variable -> unit) = 
-      fun name var -> 
-      fprintf cfile "void %s_TASK_getout_%s(%s_TASK_type tD, %s* p%s) {\n" name var.name name var.var_type var.name;
-      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
-      fprintf cfile "\t*p%s = ts->ctx.%s;\n" var.name var.name;
-      fprintf cfile "}\n\n";
+    List.iter print_task_runners !tasks;
+
+    fprintf cfile "/* task Initializers */\n";
+    let print_task_inits task = 
+      fprintf cfile "%s_TASK_type %s_TASK_init() {\n" task.name task.name;
+      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*)calloc(1, sizeof(%s_TASK_struct));\n" task.name task.name task.name;
+      if task.memory then fprintf cfile "\t%s_ctx_init(&ts->ctx);\n" task.name;
+      fprintf cfile "\tSEM_INIT(ts->sem_start, 0, 1);\n";
+      fprintf cfile "\tSEM_INIT(ts->sem_join, 0, 1);\n";
+      fprintf cfile "\tpthread_create(&(ts->thr), NULL, %s_runner, ts);\n" task.name;
+      fprintf cfile "\treturn (void*) ts;\n";
+      fprintf cfile "}\n\n"
     in
-    List.iter (print_var_outputs task.name) task.var_out;
-  in
-  List.iter print_task_outputs !tasks;
+    List.iter print_task_inits !tasks;
+    
+    fprintf cfile "/* task resets */\n";
+    let print_task_resets task =
+      if task.memory then 
+        (fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
+        fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
+        fprintf cfile "\t%s_ctx_reset(&ts->ctx);\n" task.name;
+        fprintf cfile "}\n\n")
+      else
+        (fprintf cfile "void %s_TASK_reset(%s_TASK_type tD) {\n" task.name task.name;
+        fprintf cfile "}\n\n")
+    in
+    List.iter print_task_resets !tasks; 
 
-  let hfile = open_out ("para.h") in
-  fprintf hfile "#ifndef _PARA_H\n#define _PARA_H\n\n";
-
-  let print_h_tasks task =
-    fprintf hfile "typedef void* %s_TASK_type;\n" task.name;
-    fprintf hfile "extern %s_TASK_type %s_TASK_init();\n" task.name task.name;
-    fprintf hfile "extern void %s_TASK_reset(%s_TASK_type tD);\n" task.name task.name;
-    fprintf hfile "extern void %s_TASK_START(%s_TASK_type tD);\n" task.name task.name;
-    fprintf hfile "extern void %s_TASK_JOIN(%s_TASK_type tD);\n" task.name task.name;
-    let (print_h_task_inputs : Types.variable -> unit) = fun var ->
-      fprintf hfile "extern void %s_TASK_setin_%s(%s_TASK_type tD, %s %s);\n" task.name var.name task.name var.var_type var.name
+    fprintf cfile "/* task start */\n";
+    let print_task_starts task =
+      fprintf cfile "void %s_TASK_START(%s_TASK_type tD) {\n" task.name task.name;
+      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
+      fprintf cfile "\tSEM_SIGNAL(ts->sem_start);\n";
+      fprintf cfile "}\n\n"
+    in
+    List.iter print_task_starts !tasks; 
+
+    fprintf cfile "/* task join */\n";
+    let print_task_joins task =
+      fprintf cfile "void %s_TASK_JOIN(%s_TASK_type tD) {\n" task.name task.name;
+      fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" task.name task.name;
+      fprintf cfile "\tSEM_WAIT(ts->sem_join);\n";
+      fprintf cfile "}\n\n"
+    in
+    List.iter print_task_joins !tasks; 
+    
+    fprintf cfile "/* task inputs */\n";
+    let print_task_inputs task = 
+      let (print_var_inputs : string -> variable -> unit) = 
+        fun name var -> 
+        fprintf cfile "void %s_TASK_setin_%s(%s_TASK_type tD, %s %s) {\n" name var.name name var.var_type var.name;
+        fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
+        fprintf cfile "\tts->ctx.%s = %s;\n" var.name var.name;
+        fprintf cfile "}\n\n";
+      in
+      List.iter (print_var_inputs task.name) task.var_in;
     in
-    List.iter print_h_task_inputs task.var_in;
-    let (print_h_task_outputs : Types.variable -> unit) = fun var ->
-      fprintf hfile "extern void %s_TASK_getout_%s(%s_TASK_type td, %s* %s);\n" task.name var.name task.name var.var_type var.name
+    List.iter print_task_inputs !tasks;
+
+    fprintf cfile "/* task outputs */\n";
+    let print_task_outputs task = 
+      let (print_var_outputs : string -> variable -> unit) = 
+        fun name var -> 
+        fprintf cfile "void %s_TASK_getout_%s(%s_TASK_type tD, %s* p%s) {\n" name var.name name var.var_type var.name;
+        fprintf cfile "\t%s_TASK_struct* ts = (%s_TASK_struct*) tD;\n" name name;
+        fprintf cfile "\t*p%s = ts->ctx.%s;\n" var.name var.name;
+        fprintf cfile "}\n\n";
+      in
+      List.iter (print_var_outputs task.name) task.var_out;
     in
-    List.iter print_h_task_outputs task.var_out
-  in  
-  List.iter print_h_tasks !tasks;
-  fprintf hfile "#endif";
+    List.iter print_task_outputs !tasks;
+
+    fprintf hfile "#ifndef _PARA_H\n#define _PARA_H\n\n";
+
+    let print_h_tasks task =
+      fprintf hfile "typedef void* %s_TASK_type;\n" task.name;
+      fprintf hfile "extern %s_TASK_type %s_TASK_init();\n" task.name task.name;
+      fprintf hfile "extern void %s_TASK_reset(%s_TASK_type tD);\n" task.name task.name;
+      fprintf hfile "extern void %s_TASK_START(%s_TASK_type tD);\n" task.name task.name;
+      fprintf hfile "extern void %s_TASK_JOIN(%s_TASK_type tD);\n" task.name task.name;
+      let (print_h_task_inputs : Types.variable -> unit) = fun var ->
+        fprintf hfile "extern void %s_TASK_setin_%s(%s_TASK_type tD, %s %s);\n" task.name var.name task.name var.var_type var.name
+      in
+      List.iter print_h_task_inputs task.var_in;
+      let (print_h_task_outputs : Types.variable -> unit) = fun var ->
+        fprintf hfile "extern void %s_TASK_getout_%s(%s_TASK_type td, %s* %s);\n" task.name var.name task.name var.var_type var.name
+      in
+      List.iter print_h_task_outputs task.var_out
+    in  
+    List.iter print_h_tasks !tasks;
+    fprintf hfile "#endif";
 
 
 
diff --git a/bin/lustre-mt/parser.ml b/bin/lustre-mt/parser.ml
index a41b0ce..847943c 100644
--- a/bin/lustre-mt/parser.ml
+++ b/bin/lustre-mt/parser.ml
@@ -83,19 +83,17 @@ let (save_variable_attributes : Types.variable -> (string * Yaml.value) -> unit)
   |_ -> assert false
 
 let (save_variables_in : Types.task -> Yaml.value -> unit) = fun task x ->
-  let v = {name = ""; var_type = ""}::[]
-  in
+  let v = {name = ""; var_type = ""}::[] in
   match x with
-  |`O l ->
+  |`O l -> assert (v <> []);
     List.iter (save_variable_attributes (List.hd v)) l;
     task.var_in <- v @ task.var_in
   |_ -> assert false
 
 let (save_variables_out : Types.task -> Yaml.value -> unit) = fun task x ->
-  let v = {name = ""; var_type = ""}::[]
-  in
+  let v = {name = ""; var_type = ""}::[] in
   match x with
-  |`O l ->
+  |`O l -> assert (v <> []);
     List.iter (save_variable_attributes (List.hd v)) l;
     task.var_out <- v @ task.var_out
   |_ -> assert false
@@ -119,7 +117,7 @@ let (save_data_task : Types.task -> (string * Yaml.value) -> unit) =
 let (save_data_tasks : Yaml.value -> unit) = fun x ->
   let task = {name = ""; var_in = []; var_out = []; memory = true}::[] in
   match x with
-  |`O l -> 
+  |`O l -> assert (task <> []);
     List.iter (save_data_task (List.hd task)) l;
     tasks := !tasks @ task
   |_ -> assert false
@@ -127,6 +125,7 @@ let (save_data_tasks : Yaml.value -> unit) = fun x ->
 let (save_data : (string * Yaml.value) -> unit) = fun (key, value) ->
   match (key, value) with
   |"all_para_nodes", `A l -> List.iter save_data_tasks l;
+  |"all_para_nodes", `Null -> assert true
   |"main_node",  `String n -> name := n
   |_ -> assert false
 
diff --git a/lib/soc2yaml.ml b/lib/soc2yaml.ml
index aa3c6cd..ee6f1ce 100644
--- a/lib/soc2yaml.ml
+++ b/lib/soc2yaml.ml
@@ -95,7 +95,9 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename ->
   in
   
   let (main2yaml : unit -> unit) = fun () ->
-    let s = "main_node: " ^ basename in
+    let (name, _, _) = main_soc.key in
+    let main_name = Str.replace_first (Str.regexp "::") "_" name in
+    let s = "main_node: " ^ main_name in
     fprintf yaml_file "\n%s" s
   in
   
-- 
GitLab