diff --git a/bin/lustre-mt/main.ml b/bin/lustre-mt/main.ml index cca0ff9f0d2e46a42ba57336b2a9f9ed5f79bacd..637473aab5d592348e2c0f581dcfd8c93cf376cd 100644 --- a/bin/lustre-mt/main.ml +++ b/bin/lustre-mt/main.ml @@ -83,7 +83,7 @@ let main () = 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; - fprintf cfile "\t%s_ctx_init(&ts->ctx);\n" 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; @@ -94,10 +94,14 @@ let main () = fprintf cfile "/* task resets */\n"; let print_task_resets task = - 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" + 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; diff --git a/bin/lustre-mt/parser.ml b/bin/lustre-mt/parser.ml index b16937d2d25eff9028000ccedbd764a3716ffcbb..fb8e6981e56bab8bbd4a0448635033c2cd1c2c33 100644 --- a/bin/lustre-mt/parser.ml +++ b/bin/lustre-mt/parser.ml @@ -107,6 +107,7 @@ let (save_data_one_task : Types.task -> (string * Yaml.value) -> unit) = |"name", `String n -> task.name <- n |"var_in" , `A l -> List.iter (save_variables_in task) l |"var_out" , `A l -> List.iter (save_variables_out task) l + |"memory" , `Bool b -> task.memory <- b |_ -> () let (save_data_task : Types.task -> (string * Yaml.value) -> unit) = @@ -116,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 = []}::[] in + let task = {name = ""; var_in = []; var_out = []; memory = true}::[] in match x with |`O l -> List.iter (save_data_task (List.hd task)) l; diff --git a/bin/lustre-mt/types.ml b/bin/lustre-mt/types.ml index 6309f68bab05be485648be388cdc0e2e52f56fed..9290f1e705a5f9e33d84dbc0d88fdd3d1cacbd18 100644 --- a/bin/lustre-mt/types.ml +++ b/bin/lustre-mt/types.ml @@ -37,4 +37,5 @@ type task = { mutable name: string; mutable var_in: variable list; mutable var_out: variable list; + mutable memory: bool; } diff --git a/lib/soc2yaml.ml b/lib/soc2yaml.ml index 899473efac79341b699b714462758025ca9c0f69..252fd0157c1f9435f3736f98bfaa9d17b69f80ce 100644 --- a/lib/soc2yaml.ml +++ b/lib/soc2yaml.ml @@ -74,14 +74,23 @@ let (f : Soc.key -> Soc.tbl -> string -> unit) = fun sk stbl basename -> s in + let (memory2string : bool -> string) = fun mem -> + match mem with + | true -> "true" + | false -> "false" + in + let (tasks2yaml : task_type -> unit) = fun task -> let name = String.concat "_" (Str.split (Str.regexp "::") task.name) in let s_vi = String.concat "" (List.map var2yaml task.var_in) in let s_vo = String.concat "" (List.map var2yaml task.var_out) in + let mem = memory2string task.memory in let s = " - task: " ^ "\n name: " ^ name ^ "\n var_in:\n" ^ s_vi ^ " var_out:\n" ^ s_vo + ^ " memory: " ^ mem + ^ "\n" in fprintf yaml_file "%s" s in diff --git a/lib/socNameC.ml b/lib/socNameC.ml index 4d06de5ba3a8a82c40a2dcad87d0795d4f65f33d..2ada82e50cea2417e6961ab9ba4b7a2b4274bb86 100644 --- a/lib/socNameC.ml +++ b/lib/socNameC.ml @@ -25,7 +25,8 @@ type instance_type = { type task_type = { name: string; var_in: Soc.var list; - var_out: Soc.var list + var_out: Soc.var list; + memory : bool } let get_filename : Soc.t -> string = fun soc -> @@ -178,7 +179,25 @@ let (var_expr_to_index : (string * variable_type) list -> var_expr -> int) = (* List.iter print_instance_type res; *) res - let get_all_soc : Soc.t -> Soc.tbl -> Soc.t list = fun soc stbl -> (*bon j'ai bien tout mais mon remove duplicata marche pas*) + (*let get_literally_all_socs : Soc.t -> Soc.tbl -> Soc.t list = fun soc stbl -> + let gaol = get_gaol soc in + let rec find_soc = function + | Case(_, id_gaol_l, _) -> id_gaol_l |> List.map (fun (_, gaol2) -> List.map find_soc gaol2) |> + List.flatten |> List.flatten + | Call(_, Method((_, sk), _, _), _, _) + | Call(_, Procedure(sk, _, _), _, _) -> + let new_soc = (SocUtils.find (Lxm.dummy "aeaea") sk stbl) in + let new_gaol = get_gaol new_soc in + if ((List.length new_gaol) = 0) then [] + else + [new_soc] @ (List.flatten (List.map find_soc new_gaol)) + | Call(_, _, _, _) -> [] + in + let socs = List.map find_soc gaol in + let x = (socs |> List.flatten) in (*supprimer les duplicatas*) + x*) + + let get_all_soc : Soc.t -> Soc.tbl -> Soc.t list = fun soc stbl -> let gaol = get_gaol soc in let rec find_soc = function | Case(_, id_gaol_l, _) -> id_gaol_l |> List.map (fun (_, gaol2) -> List.map find_soc gaol2) |> @@ -225,15 +244,41 @@ let (var_expr_to_index : (string * variable_type) list -> var_expr -> int) = let soc = List.find (compare_name name) socs in let (var_in, var_out):Soc.var list * Soc.var list = soc.profile in (var_in, var_out) + + (*let memory_soc : Soc.t -> unit = fun soc -> + let (x, _, _) = soc.key in + match soc.memory with + | No_mem -> Printf.printf "aeaeaea %s\n" x + | Mem _ -> Printf.printf "A clamitous disaster indeed %s\n" x (*uniquement dans les lustre pre : trouver si un lustre pre quelque part dans le soc pour dire mem = true*) + | Mem_hidden -> Printf.printf "It's wizard time %s\n" x (*idée : ne pas explorer les méthodes/procédures, juste regarder le nom pour trouver un pre ?*) +*) + let find_memory_soc : Soc.t -> bool = fun soc -> + let gaol = get_gaol soc in + let gao_has_memory = fun gao -> + match gao with + | Call(_,Assign,_,_) -> assert false + | Call(_, Method((_, sk), _, _), _, _) + | Call(_, Procedure (sk, _, _), _, _) -> + let (name, _, _) = sk in + (String.equal "Lustre::pre" name) || (String.equal "Lustre::arrow" name) + | Case(_, _, _) -> assert false + in + List.exists (fun x -> x = true) (List.map gao_has_memory gaol) + + let has_memory : string -> Soc.t list -> bool = fun name socs -> + let soc = List.find (compare_name name) socs in + let has_mem = find_memory_soc soc in + has_mem let get_tasks : Soc.tbl -> Soc.t -> Soc.t -> task_type list = fun stbl main_soc soc -> let gaol = get_gaol soc in + (*let socs_all = (get_literally_all_socs main_soc stbl) @ [main_soc] in*) (*let all_vars = (get_inputs_assoc soc) @ (get_outputs_assoc soc) @ (get_variables_assoc soc) in*) let (gao_to_tasks: gao -> task_type option) = fun gao -> match gao with | Call(_,Assign,_,_) -> assert false | Call(_, Method(_, _, task), _, _) - | Call(_, Procedure (_, _, task) , _, _) -> + | Call(_, Procedure (_, _, task), _, _) -> begin match task with | None -> let t : task_type option = None in t @@ -242,11 +287,13 @@ let (var_expr_to_index : (string * variable_type) list -> var_expr -> int) = let name_task = (*List.nth x ((List.length x)-1)*) n in let socs = (get_all_soc main_soc stbl) @ [main_soc] in let (var_ins, var_outs) = get_task_profile name_task socs in + let mem = has_memory name_task socs in let t = { name = name_task; var_in = var_ins; (*List.map (var_expr_to_index all_vars) args_in;*) - var_out = var_outs (*List.map (var_expr_to_index all_vars) args_out*) + var_out = var_outs; (*List.map (var_expr_to_index all_vars) args_out*) + memory = mem } in Some t end