diff --git a/src/soc2c.ml b/src/soc2c.ml index 2f7c835f7742d7553c33a446042a7c90d86108ff..67afbbee5ab9553eb3bc40f15b1d7db74a6cf038 100644 --- a/src/soc2c.ml +++ b/src/soc2c.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 02/06/2014 (at 15:54) by Erwan Jahier> *) +(* Time-stamp: <modified the 04/06/2014 (at 17:22) by Erwan Jahier> *) (* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *) @@ -177,17 +177,7 @@ let (soc2c: int -> out_channel -> out_channel -> Soc.tbl -> Soc.t -> unit) = let hput str = output_string hfile str in let cput str = output_string cfile str in let put str = cput str; hput str in - let fmt f str = cfmt f str; hfmt f str in - let string_of_instance (id,sk) = - let (sk_id,tl,init_opt) = sk in - let init = match init_opt with - | Soc.Nomore -> "" - | Soc.Slic(_,_,_) -> assert false (* fixme *) - | Soc.MemInit(ve) -> Printf.sprintf " = %s" (string_of_var_expr soc ve) - in - Printf.sprintf " %s_type %s%s;\n" (get_ctx_name sk) (id2s id) init - in - + let fmt f str = cfmt f str; hfmt f str in let name, _,_ = soc.key in let name = id2s name in let il,ol = soc.profile in @@ -195,22 +185,6 @@ let (soc2c: int -> out_channel -> out_channel -> Soc.tbl -> Soc.t -> unit) = let ctx_name = get_ctx_name soc.key in let ctx_name_type = ctx_name^"_type" in if pass=1 then ( - hfmt "/* %s */\ntypedef struct {\n /*INPUTS*/\n" ctx_name; - List.iter (fun v -> hput (string_of_flow_decl v)) il ; - - hput " /*OUTPUTS*/\n"; - List.iter (fun v -> hput (string_of_flow_decl v)) ol ; - - (match soc.have_mem with - | None -> () - | Some t -> - hput " /*Memory cell*/\n"; - hfmt " %s mem_pre;\n" (id2s (Data.type_to_string t)); - ); - - if soc.instances <> [] then hput " /*INSTANCES*/\n"; - List.iter (fun inst -> hput (string_of_instance inst)) soc.instances; - hfmt "} %s;\n\n" ctx_name_type; (* Only for ctx of memoryless nodes + main node *) if is_memory_less soc then cfmt "%s %s;\n" ctx_name_type ctx_name; ) else ( @@ -231,6 +205,18 @@ let (soc2c: int -> out_channel -> out_channel -> Soc.tbl -> Soc.t -> unit) = () ) +(****************************************************************************) +let (type_to_format_string : Data.t -> string) = + function + | Bool -> "%d" + | Int -> "%d" + | Real-> "%g" + | Extern s -> assert false + | Enum (s, sl) -> "%d" + | Struct (sid,_) -> assert false + | Array (ty, sz) -> assert false + | Alpha nb -> assert false + (****************************************************************************) let rec (lic_type_to_c: Lic.type_ -> string) = function @@ -253,15 +239,78 @@ let rec (lic_type_to_c: Lic.type_ -> string) = | (TypeVar AnyNum) -> assert false -let (typedef : LicPrg.t -> string) = - fun licprg -> - let to_c k t = - Printf.sprintf "typedef %s %s;\n" - (lic_type_to_c t) - (long2s k) +(****************************************************************************) + +let (typedef_of_soc : Soc.t -> string) = + fun soc -> + let ctx_name = get_ctx_name soc.key in + let ctx_name_type = ctx_name^"_type" in + let il,ol = soc.profile in + let str = Printf.sprintf "/* %s */\ntypedef struct {\n /*INPUTS*/\n" ctx_name in + let str = List.fold_left (fun acc v -> acc^ (string_of_flow_decl v)) str il in + let str = str ^ " /*OUTPUTS*/\n" in + let str = List.fold_left (fun acc v -> acc^ (string_of_flow_decl v)) str ol in + let str = str ^ + (match soc.have_mem with + | None -> "" + | Some t -> + Printf.sprintf " /*Memory cell*/\n %s mem_pre;\n" (id2s (Data.type_to_string t)) + ) + in + let str = str ^ (if soc.instances <> [] then " /*INSTANCES*/\n" else "") in + let string_of_instance (id,sk) = + let (sk_id,tl,init_opt) = sk in + let init = match init_opt with + | Soc.Nomore -> "" + | Soc.Slic(_,_,_) -> assert false (* fixme *) + | Soc.MemInit(ve) -> Printf.sprintf " = %s" (string_of_var_expr soc ve) + in + Printf.sprintf " %s_type %s%s;\n" (get_ctx_name sk) (id2s id) init in - LicPrg.fold_types (fun k t acc -> acc ^ (to_c k t)) licprg "// Type definitions \n" + let str = List.fold_left (fun acc inst -> acc^(string_of_instance inst)) str soc.instances in + let str = Printf.sprintf "%s} %s;\n\n" str ctx_name_type in + str +let (typedef : LicPrg.t -> Soc.tbl -> Soc.t -> string) = + fun licprg soc_tbl main_soc -> + (* We need to print the ctx typedef a good order + (w.r.t. typedef dependancies). To do that, we traverse + the tree of soc instances which root is the main soc. *) + let rec (soc_with_mem : string -> Soc.t -> string) = + fun acc soc -> + let acc = (typedef_of_soc soc) ^ acc in + List.fold_left + (fun acc (iname, sk) -> + let soc = SocUtils.find_no_exc sk soc_tbl in + soc_with_mem acc soc + ) + acc soc.instances + in + let soc_ctx_typedef_with = soc_with_mem "" main_soc in + (* Then we still have to print memoryless soc that can not appear + as a soc instance *) + let soc_ctx_typedef_without = + let socs = Soc.SocMap.bindings soc_tbl in + let socs = snd (List.split socs) in + let memless_soc_to_string acc soc = + if is_memory_less soc then acc^(typedef_of_soc soc) else acc + in + List.fold_left memless_soc_to_string "" socs + in + (* There are also typedef that comes from user in Lustre V6 *) + let user_typedef = + let to_c k t = + Printf.sprintf "typedef %s %s;\n" (lic_type_to_c t) (long2s k) + in + LicPrg.fold_types (fun k t acc -> acc ^ (to_c k t)) licprg "// Type definitions \n" + in + "// user type def \n"^user_typedef + ^"// Memoryless soc ctx typedef \n"^soc_ctx_typedef_without + ^"// Memoryfull soc ctx typedef \n"^soc_ctx_typedef_with + + + +(****************************************************************************) let rec (const_to_c: Lic.const -> string) = function | Bool_const_eff true -> "1" @@ -428,13 +477,20 @@ int main(){ fflush(stdout); ++s; "); + let inputs,outputs = soc.profile in List.iter (fun (id,t) -> let t = Data.type_to_string t in let str = Printf.sprintf " ctx->%s = _get_%s(\"%s\");\n" id t id in putc str - ) - (fst soc.profile); + ) + inputs; + let inputs_fmt = List.map (fun (_,t) -> type_to_format_string t) inputs in + let outputs_fmt = List.map (fun (_,t) -> type_to_format_string t) outputs in putc (" " ^ step^"(ctx); + printf(\"" ^ (String.concat " " inputs_fmt)^ " #outs " ^ + (String.concat " " outputs_fmt)^ "\\n\"," ^ + (String.concat "," (List.map (fun (id,_) -> "ctx->"^id ) (inputs@outputs)))^ + "); first_step=_false; } return 1; @@ -458,11 +514,11 @@ let (f : Lv6MainArgs.t -> Soc.key -> Soc.tbl -> LicPrg.t -> unit) = let och = open_out hfile in let putc s = output_string occ s ; flush occ in let puth s = output_string och s ; flush och in - + let main_soc = Soc.SocMap.find msoc stbl in Lv6util.entete occ "/*" "*/" ; Lv6util.entete och "/*" "*/"; - gen_loop_file (Soc.SocMap.find msoc stbl); + gen_loop_file main_soc; output_string och " #include <stdlib.h> @@ -482,11 +538,10 @@ typedef float _float; "; putc "#include \"hfile.h\"\n"; - puth (typedef licprg); + puth (typedef licprg stbl main_soc ); putc (constdef licprg); puth "/////////////////////////////////////////////////\n"; puth "// ctx type definitions\n"; - putc "/////////////////////////////////////////////////\n"; putc "// Allocating memoryless ctx\n"; List.iter (soc2c 1 och occ stbl) socs; puth "/////////////////////////////////////////////////\n";