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