Skip to content
Snippets Groups Projects
Commit 90cc3b8e authored by BRUN Lelio's avatar BRUN Lelio
Browse files

some rewriting in C backend pretty-printer

parent 1df55e58
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
(* *) (* *)
(********************************************************************) (********************************************************************)
open Format open Utils.Format
open C_backend_mauve open C_backend_mauve
(******************************************************************************) (******************************************************************************)
(* Translation function *) (* Translation function *)
...@@ -26,12 +26,6 @@ let makefile_opt print basename dependencies makefile_fmt machines = ...@@ -26,12 +26,6 @@ let makefile_opt print basename dependencies makefile_fmt machines =
) )
*) *)
let with_out_file file f =
let oc = open_out file in
let fmt = formatter_of_out_channel oc in
f fmt;
close_out oc
let c_or_cpp f = let c_or_cpp f =
if !Options.cpp then f ^ ".cpp" else f ^ ".c" (* Could be changed *) if !Options.cpp then f ^ ".cpp" else f ^ ".c" (* Could be changed *)
......
This diff is collapsed.
This diff is collapsed.
open Lusic open Lusic
open Utils.Format
let print_lusic_to_h basename extension = let print_lusic_to_h basename extension =
let module HeaderMod = C_backend_header.EmptyMod in let module HeaderMod = C_backend_header.EmptyMod in
let module Header = C_backend_header.Main (HeaderMod) in let module Header = C_backend_header.Main (HeaderMod) in
let lusic = read_lusic basename extension in let lusic = read_lusic basename extension in
let header_name = basename ^ ".h" in let header_name = basename ^ ".h" in
let h_out = open_out header_name in with_out_file header_name @@ fun h_fmt ->
let h_fmt = Format.formatter_of_out_channel h_out in assert (not lusic.obsolete);
begin (*Format.eprintf "lusic to h: %i items.@." (List.length lusic.contents);*)
assert (not lusic.obsolete); (* Typing.uneval_prog_generics lusic.contents;
(*Format.eprintf "lusic to h: %i items.@." (List.length lusic.contents);*)
(* Typing.uneval_prog_generics lusic.contents;
* Clock_calculus.uneval_prog_generics lusic.contents; *) * Clock_calculus.uneval_prog_generics lusic.contents; *)
Header.print_header_from_header h_fmt (Filename.basename basename) lusic.contents; Header.print_header_from_header
close_out h_out h_fmt
end (Filename.basename basename)
lusic.contents
...@@ -12,209 +12,375 @@ ...@@ -12,209 +12,375 @@
open Lustre_types open Lustre_types
open Machine_code_types open Machine_code_types
open Machine_code_common open Machine_code_common
open Format open Utils.Format
open C_backend_common open C_backend_common
open Utils open Utils
module type MODIFIERS_MAINSRC = module type MODIFIERS_MAINSRC = sig
sig
end end
module EmptyMod = module EmptyMod = struct
struct
end end
module Main = functor (Mod: MODIFIERS_MAINSRC) -> module Main = functor (Mod: MODIFIERS_MAINSRC) -> struct
struct
(********************************************************************************************) (********************************************************************************************)
(* Main related functions *) (* Main related functions *)
(********************************************************************************************) (********************************************************************************************)
let pp_c_main_var_input fmt id =
fprintf fmt "%s" id.var_id
let print_put_outputs fmt m = let pp_c_main_var_output fmt id =
let po fmt (id, o', o) = if Types.is_address_type id.var_type
let suff = string_of_int id in then
fprintf fmt "%s" id.var_id
else
fprintf fmt "&%s" id.var_id
let print_put_output fmt id o' o =
let suff = string_of_int (id + 1) in
print_put_var fmt suff o'.var_id o.var_type o.var_id print_put_var fmt suff o'.var_id o.var_type o.var_id
in
List.iteri2 (fun idx v' v -> fprintf fmt "@ %a;" po ((idx+1), v', v)) m.mname.node_outputs m.mstep.step_outputs
let print_main_inout_declaration m fmt =
fprintf fmt "/* Declaration of inputs/outputs variables */@ ";
List.iteri (fun idx v ->
fprintf fmt "%a;@ " (pp_c_type v.var_id) v.var_type;
ignore (pp_file_decl fmt "in" idx)
) m.mstep.step_inputs;
List.iteri (fun idx v ->
fprintf fmt "%a;@ " (pp_c_type v.var_id) v.var_type;
ignore (pp_file_decl fmt "out" idx)
) m.mstep.step_outputs;
fprintf fmt "@[<v 2>if (traces) {@ ";
List.iteri (fun idx _ ->
ignore (pp_file_open fmt "in" idx)
) m.mstep.step_inputs;
List.iteri (fun idx _ ->
ignore (pp_file_open fmt "out" idx)
) m.mstep.step_outputs;
fprintf fmt "@]}@ "
let print_main_memory_allocation mname main_mem fmt m =
if not (fst (get_stateless_status m)) then
begin
fprintf fmt "@ /* Main memory allocation */@ ";
if (!Options.static_mem && !Options.main_node <> "")
then (fprintf fmt "%a(static,main_mem);@ " pp_machine_static_alloc_name mname)
else (fprintf fmt "%a *main_mem = %a();@ " pp_machine_memtype_name mname pp_machine_alloc_name mname);
fprintf fmt "@ /* Initialize the main memory */@ ";
fprintf fmt "%a(%s);@ " pp_machine_reset_name mname main_mem;
end
let print_global_initialize fmt basename =
let mNAME = file_to_module_name basename in
fprintf fmt "@ /* Initialize global constants */@ %a();@ "
pp_global_init_name mNAME
let print_global_clear fmt basename =
let mNAME = file_to_module_name basename in
fprintf fmt "@ /* Clear global constants */@ %a();@ "
pp_global_clear_name mNAME
let print_main_initialize mname main_mem fmt m =
if not (fst (get_stateless_status m))
then
fprintf fmt "@ /* Initialize inputs, outputs and memories */@ %a%t%a%t%a(%s);@ "
(Utils.fprintf_list ~sep:"@ " (pp_initialize m main_mem (pp_c_var_read m))) m.mstep.step_inputs
(Utils.pp_newline_if_non_empty m.mstep.step_inputs)
(Utils.fprintf_list ~sep:"@ " (pp_initialize m main_mem (pp_c_var_read m))) m.mstep.step_outputs
(Utils.pp_newline_if_non_empty m.mstep.step_inputs)
pp_machine_init_name mname
main_mem
else
fprintf fmt "@ /* Initialize inputs and outputs */@ %a%t%a@ "
(Utils.fprintf_list ~sep:"@ " (pp_initialize m main_mem (pp_c_var_read m))) m.mstep.step_inputs
(Utils.pp_newline_if_non_empty m.mstep.step_inputs)
(Utils.fprintf_list ~sep:"@ " (pp_initialize m main_mem (pp_c_var_read m))) m.mstep.step_outputs
let print_main_clear mname main_mem fmt m = let print_main_inout_declaration fmt m =
if not (fst (get_stateless_status m)) fprintf fmt
"/* Declaration of inputs/outputs variables */@,\
%a%a\
@[<v 2>if (traces) {@,\
%a%a@]@,\
}"
(pp_print_list_i
~pp_open_box:pp_open_vbox0
~pp_epilogue:pp_print_cut
(fun fmt idx v ->
fprintf fmt "%a; %a"
(pp_c_type v.var_id) v.var_type
(fun fmt () -> pp_file_decl fmt "in" idx) ())) m.mstep.step_inputs
(pp_print_list_i
~pp_open_box:pp_open_vbox0
~pp_epilogue:pp_print_cut
(fun fmt idx v ->
fprintf fmt "%a; %a"
(pp_c_type v.var_id) v.var_type
(fun fmt () -> pp_file_decl fmt "out" idx) ())) m.mstep.step_outputs
(pp_print_list_i
~pp_epilogue:pp_print_cut
(fun fmt idx _ ->
ignore (pp_file_open fmt "in" idx))) m.mstep.step_inputs
(pp_print_list_i
(fun fmt idx _ ->
ignore (pp_file_open fmt "out" idx))) m.mstep.step_outputs
let print_main_memory_allocation mname main_mem fmt m =
if not (fst (get_stateless_status m)) then
fprintf fmt
"@[<v>/* Main memory allocation */@,\
%a@,\
@,\
/* Initialize the main memory */@,\
%a(%s);@]"
(fun fmt () ->
if !Options.static_mem && !Options.main_node <> "" then
fprintf fmt "%a(static,main_mem);"
pp_machine_static_alloc_name mname
else
fprintf fmt "%a *main_mem = %a();"
pp_machine_memtype_name mname
pp_machine_alloc_name mname) ()
pp_machine_reset_name mname
main_mem
let print_global_initialize fmt basename =
let mNAME = file_to_module_name basename in
fprintf fmt "/* Initialize global constants */@,%a();"
pp_global_init_name mNAME
let print_global_clear fmt basename =
let mNAME = file_to_module_name basename in
fprintf fmt "/* Clear global constants */@,%a();"
pp_global_clear_name mNAME
let print_main_initialize mname main_mem fmt m =
let inputs = mpfr_vars m.mstep.step_inputs in
let outputs = mpfr_vars m.mstep.step_outputs in
if not (fst (get_stateless_status m))
then
fprintf fmt
"/* Initialize inputs, outputs and memories */@,\
%a%a%a(%s);"
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_initialize m main_mem (pp_c_var_read m))) inputs
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_initialize m main_mem (pp_c_var_read m))) outputs
pp_machine_init_name mname
main_mem
else
fprintf fmt
"/* Initialize inputs and outputs */@,\
%a%a@ "
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_initialize m main_mem (pp_c_var_read m))) inputs
(pp_print_list
~pp_open_box:pp_open_vbox0
(pp_initialize m main_mem (pp_c_var_read m))) outputs
let print_main_clear mname main_mem fmt m =
let inputs = mpfr_vars m.mstep.step_inputs in
let outputs = mpfr_vars m.mstep.step_outputs in
if not (fst (get_stateless_status m))
then
fprintf fmt
"@[<v>/* Clear inputs, outputs and memories */@,\
%a%a%a(%s);@]"
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_clear m main_mem (pp_c_var_read m))) inputs
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_clear m main_mem (pp_c_var_read m))) outputs
pp_machine_clear_name mname
main_mem
else
fprintf fmt
"@[<v>/* Clear inputs and outputs */@,\
%a%a@]"
(pp_print_list
~pp_open_box:pp_open_vbox0
~pp_eol:pp_print_cut
(pp_clear m main_mem (pp_c_var_read m))) inputs
(pp_print_list
~pp_open_box:pp_open_vbox0
(pp_clear m main_mem (pp_c_var_read m))) outputs
let print_get_input fmt id v' v =
let pp_file = pp_print_file ("in" ^ string_of_int (id + 1)) in
let unclocked_t = Types.unclock_type v.var_type in
fprintf fmt "@[<v>%a@]"
(fun fmt () ->
if Types.is_int_type unclocked_t then
fprintf fmt "%s = _get_int(\"%s\");@,%a"
v.var_id v'.var_id
pp_file ("d", v.var_id)
else if Types.is_bool_type unclocked_t then
fprintf fmt "%s = _get_bool(\"%s\");@,%a"
v.var_id v'.var_id
pp_file ("i", v.var_id)
else if Types.is_real_type unclocked_t then
if !Options.mpfr then
fprintf fmt "double %s_tmp = _get_double(\"%s\");@,\
%a@,\
mpfr_set_d(%s, %s_tmp, %i);"
v.var_id v'.var_id
pp_file ("f", v.var_id ^ "_tmp")
v.var_id v.var_id (Mpfr.mpfr_prec ())
else
fprintf fmt "%s = _get_double(\"%s\");@,%a"
v.var_id v'.var_id
pp_file ("f", v.var_id)
else begin
Global.main_node := !Options.main_node;
eprintf "Code generation error: %a%a@."
Error.pp_error_msg Error.Main_wrong_kind
Location.pp_loc v'.var_loc;
raise (Error.Error (v'.var_loc, Error.Main_wrong_kind))
end) ()
let pp_main_call mname self fmt m (inputs: value_t list) (outputs: var_decl list) =
if fst (Machine_code_common.get_stateless_status m)
then then
fprintf fmt "@ /* Clear inputs, outputs and memories */@ %a%t%a%t%a(%s);@ " fprintf fmt "%a (%a%a);"
(Utils.fprintf_list ~sep:"@ " (pp_clear m main_mem (pp_c_var_read m))) m.mstep.step_inputs pp_machine_step_name mname
(Utils.pp_newline_if_non_empty m.mstep.step_inputs) (pp_print_list ~pp_sep:pp_print_comma ~pp_eol:pp_print_comma
(Utils.fprintf_list ~sep:"@ " (pp_clear m main_mem (pp_c_var_read m))) m.mstep.step_outputs (pp_c_val m self pp_c_main_var_input)) inputs
(Utils.pp_newline_if_non_empty m.mstep.step_inputs) (pp_print_list ~pp_sep:pp_print_comma pp_c_main_var_output) outputs
pp_machine_clear_name mname
main_mem
else else
fprintf fmt "@ /* Clear inputs and outputs */@ %a%t%a@ " fprintf fmt "%a (%a%a%s);"
(Utils.fprintf_list ~sep:"@ " (pp_clear m main_mem (pp_c_var_read m))) m.mstep.step_inputs pp_machine_step_name mname
(Utils.pp_newline_if_non_empty m.mstep.step_inputs) (pp_print_list ~pp_sep:pp_print_comma ~pp_eol:pp_print_comma
(Utils.fprintf_list ~sep:"@ " (pp_clear m main_mem (pp_c_var_read m))) m.mstep.step_outputs (pp_c_val m self pp_c_main_var_input)) inputs
(pp_print_list ~pp_sep:pp_print_comma ~pp_eol:pp_print_comma
let print_main_loop mname main_mem fmt m = pp_c_main_var_output) outputs
let input_values = self
List.map (fun v -> mk_val (Var v) v.var_type)
m.mstep.step_inputs in let print_main_loop mname main_mem fmt m =
begin let input_values = List.map (fun v ->
fprintf fmt "@ ISATTY = isatty(0);@ "; mk_val (Var v) v.var_type) m.mstep.step_inputs in
fprintf fmt "@ /* Infinite loop */@ "; fprintf fmt
fprintf fmt "@[<v 2>while(1){@ "; "ISATTY = isatty(0);@,\
fprintf fmt "fflush(stdout);@ "; @,\
fprintf fmt "@[<v 2>if (traces) {@ "; /* Infinite loop */@,\
List.iteri (fun idx _ -> fprintf fmt "fflush(f_in%i);@ " (idx+1)) m.mstep.step_inputs; @[<v 2>while(1){@,\
List.iteri (fun idx _ -> fprintf fmt "fflush(f_out%i);@ " (idx+1)) m.mstep.step_outputs; fflush(stdout);@,\
fprintf fmt "@]}@ "; @[<v 2>if (traces) {@,\
fprintf fmt "%a@ %t%a" %a%a\
print_get_inputs m @]@,\
(fun fmt -> pp_main_call mname main_mem fmt m input_values m.mstep.step_outputs) }@,\
print_put_outputs m %a%a%a"
end
(pp_print_list_i
let print_usage fmt = ~pp_open_box:pp_open_vbox0
fprintf fmt "@[<v 2>void usage(char *argv[]) {@ "; ~pp_epilogue:pp_print_cut
fprintf fmt "printf(\"Usage: %%s\\n\", argv[0]);@ "; (fun fmt idx _ -> fprintf fmt "fflush(f_in%i);" (idx + 1)))
fprintf fmt "printf(\" -t: produce trace files for input/output flows\\n\");@ "; m.mstep.step_inputs
fprintf fmt "printf(\" -d<dir>: directory containing traces (default: _traces)\\n\");@ ";
fprintf fmt "printf(\" -p<prefix>: prefix_simu.scope<id> (default: file_node)\\n\");@ "; (pp_print_list_i
fprintf fmt "exit (8);@ "; ~pp_open_box:pp_open_vbox0
fprintf fmt "@]}@ " (fun fmt idx _ -> fprintf fmt "fflush(f_out%i);" (idx + 1)))
m.mstep.step_outputs
let print_options fmt name =
fprintf fmt "int traces = 0;@ "; (pp_print_list_i2
fprintf fmt "char* prefix = \"%s\";@ " name; ~pp_open_box:pp_open_vbox0
fprintf fmt "char* dir = \".\";@ "; ~pp_epilogue:pp_print_cut
fprintf fmt "@[<v 2>while ((argc > 1) && (argv[1][0] == '-')) {@ "; print_get_input)
fprintf fmt "@[<v 2>switch (argv[1][1]) {@ "; (m.mname.node_inputs, m.mstep.step_inputs)
fprintf fmt "@[<v 2>case 't':@ ";
fprintf fmt "traces = 1;@ "; (fun fmt () ->
fprintf fmt "break;@ "; pp_main_call mname main_mem fmt m input_values m.mstep.step_outputs) ()
fprintf fmt "@]@ ";
fprintf fmt "@[<v 2>case 'd':@ "; (pp_print_list_i2
fprintf fmt "dir = &argv[1][2];@ "; ~pp_open_box:pp_open_vbox0
fprintf fmt "break;@ "; ~pp_prologue:pp_print_cut
fprintf fmt "@]@ "; print_put_output)
fprintf fmt "@[<v 2>case 'p':@ "; (m.mname.node_outputs, m.mstep.step_outputs)
fprintf fmt "prefix = &argv[1][2];@ ";
fprintf fmt "break;@ "; let print_usage fmt () =
fprintf fmt "@]@ "; fprintf fmt
fprintf fmt "@[<v 2>default:@ "; "@[<v 2>\
fprintf fmt "printf(\"Wrong Argument: %%s\\n\", argv[1]);@ "; void usage(char *argv[]) {@,\
fprintf fmt "usage(argv);@ "; printf(\"Usage: %%s\\n\", argv[0]);@,\
fprintf fmt "@]@ "; printf(\" -t: produce trace files for input/output flows\\n\");@,\
fprintf fmt "@]}@ "; printf(\" -d<dir>: directory containing traces (default: _traces)\\n\");@,\
fprintf fmt "++argv;@ "; printf(\" -p<prefix>: prefix_simu.scope<id> (default: file_node)\\n\");@,\
fprintf fmt "--argc;@ "; exit (8);@]@,\
fprintf fmt "@]}@ " }"
let print_main_code fmt basename m = let print_options fmt name =
let mname = m.mname.node_id in fprintf fmt
(* TODO: find a proper way to shorthen long names. This causes segfault in the binary when trying to fprintf in them *) "@[<v>int traces = 0;@,\
let mname = if String.length mname > 50 then string_of_int (Hashtbl.hash mname) else mname in char* prefix = \"%s\";@,\
char* dir = \".\";@,\
let main_mem = @[<v 2>while ((argc > 1) && (argv[1][0] == '-')) {@,\
if (!Options.static_mem && !Options.main_node <> "") @[<v 2>switch (argv[1][1]) {@,\
then "&main_mem" @[<v 2>case 't':@,\
else "main_mem" in traces = 1;@,\
print_usage fmt; break;@,\
@]@,\
fprintf fmt "@[<v 2>int main (int argc, char *argv[]) {@ "; @[<v 2>case 'd':@,\
print_options fmt (basename ^ "_" ^ mname); dir = &argv[1][2];@,\
print_main_inout_declaration m fmt; break;@,\
Plugins.c_backend_main_loop_body_prefix basename mname fmt (); @]@,\
print_main_memory_allocation mname main_mem fmt m; @[<v 2>case 'p':@,\
if !Options.mpfr then prefix = &argv[1][2];@,\
begin break;@,\
print_global_initialize fmt basename; @]@,\
print_main_initialize mname main_mem fmt m; @[<v 2>default:@,\
end; printf(\"Wrong Argument: %%s\\n\", argv[1]);@,\
print_main_loop mname main_mem fmt m; usage(argv);@]@]@,\
}@,\
Plugins.c_backend_main_loop_body_suffix fmt (); ++argv;@,\
fprintf fmt "@]@ }@ @ "; --argc;@]@,\
if !Options.mpfr then }@]"
begin name
print_main_clear mname main_mem fmt m;
print_global_clear fmt basename; let print_main_code fmt (basename, m) =
end; let mname = m.mname.node_id in
fprintf fmt "@ return 1;"; (* TODO: find a proper way to shorthen long names. This causes segfault in the binary when trying to fprintf in them *)
fprintf fmt "@]@ }@." let mname = if String.length mname > 50
then string_of_int (Hashtbl.hash mname) else mname in
let print_main_header fmt = let main_mem =
fprintf fmt (if !Options.cpp then "#include <stdio.h>@.#include <unistd.h>@.#include \"%s/io_frontend.hpp\"@." else "#include <stdio.h>@.#include <unistd.h>@.#include <string.h>@.#include \"%s/io_frontend.h\"@.") if !Options.static_mem && !Options.main_node <> ""
(Options_management.core_dependency "io_frontend") then "&main_mem"
else "main_mem" in
let print_main_c main_fmt main_machine basename _prog _machines _dependencies =
print_main_header main_fmt; fprintf fmt
fprintf main_fmt "#include <stdlib.h>@.#include <assert.h>@."; "@[<v>\
print_import_alloc_prototype main_fmt {local=true; name=basename; content=[]; is_stateful=true} (* assuming it is stateful*) ; %a@,\
pp_print_newline main_fmt (); @,\
@[<v 2>int main (int argc, char *argv[]) {@,\
(* Print the svn version number and the supported C standard (C90 or C99) *) %a@,\
print_version main_fmt; @,\
print_main_code main_fmt basename main_machine %a@,\
end %a@,\
%a@,\
%a@,\
%a@,\
%a@]@,\
}@,\
%areturn 1;@]@,}@]@."
print_usage ()
print_options (basename ^ "_" ^ mname)
print_main_inout_declaration m
(Plugins.c_backend_main_loop_body_prefix basename mname) ()
(print_main_memory_allocation mname main_mem) m
(fun fmt () ->
if !Options.mpfr then
fprintf fmt "@[<v>%a@,%a@]@,"
print_global_initialize basename
(print_main_initialize mname main_mem) m) ()
(print_main_loop mname main_mem) m
Plugins.c_backend_main_loop_body_suffix ()
(fun fmt () ->
if !Options.mpfr then
fprintf fmt "@[<v>%a@,%a@]@,"
(print_main_clear mname main_mem) m
print_global_clear basename) ()
let print_main_header fmt () =
fprintf fmt
"@[<v>#include <stdio.h>@,\
#include <unistd.h>@,\
%a@]"
(fun fmt () -> fprintf fmt
(if !Options.cpp then
"#include \"%s/io_frontend.hpp\""
else
"#include <string.h>@,\
#include \"%s/io_frontend.h\"")
(Options_management.core_dependency "io_frontend")) ()
let print_main_c main_fmt main_machine basename _prog _machines _dependencies =
fprintf main_fmt
"@[<v>\
%a@,\
#include <stdlib.h>@,\
#include <assert.h>@,\
%a@,\
@,\
%a@,\
%a
@]@."
print_main_header ()
print_import_alloc_prototype
{
local = true;
name = basename;
content = [];
is_stateful = true (* assuming it is stateful*)
}
(* Print the svn version number and the supported C standard (C90 or C99) *)
pp_print_version ()
print_main_code (basename, main_machine)
end
(* Local Variables: *) (* Local Variables: *)
(* compile-command:"make -C ../../.." *) (* compile-command:"make -C ../../.." *)
......
This diff is collapsed.
...@@ -84,18 +84,16 @@ let read_lusic basename extension = ...@@ -84,18 +84,16 @@ let read_lusic basename extension =
} }
end end
let print_lusic_to_h basename extension = (* let print_lusic_to_h basename extension =
let lusic = read_lusic basename extension in * let lusic = read_lusic basename extension in
let header_name = basename ^ ".h" in * let header_name = basename ^ ".h" in
let h_out = open_out header_name in * let h_out = open_out header_name in
let h_fmt = formatter_of_out_channel h_out in * let h_fmt = formatter_of_out_channel h_out in
begin * begin
assert (not lusic.obsolete); * assert (not lusic.obsolete);
(*Format.eprintf "lusic to h: %i items.@." (List.length lusic.contents);*) * (\*Format.eprintf "lusic to h: %i items.@." (List.length lusic.contents);*\)
Typing.uneval_prog_generics lusic.contents; * Typing.uneval_prog_generics lusic.contents;
Clock_calculus.uneval_prog_generics lusic.contents; * Clock_calculus.uneval_prog_generics lusic.contents;
Header.print_header_from_header h_fmt (Filename.basename basename) lusic.contents; * Header.print_header_from_header h_fmt (Filename.basename basename) lusic.contents;
close_out h_out * close_out h_out
end * end *)
...@@ -11,15 +11,16 @@ ...@@ -11,15 +11,16 @@
open Options open Options
let print_version () = let print_version () =
Format.printf let open Utils.Format in
printf
"@[<v>\ "@[<v>\
Lustrec compiler, version %s (%s)@;\ Lustrec compiler, version %s (%s)@,\
Standard lib: %s@;\ Standard lib: %s@,\
User provided include directory: @[<h>%a@]\ User provided include directory: @[<h>%a@]\
@]@." @]@."
version codename version codename
Version.include_path Version.include_path
(Utils.fprintf_list ~sep:"@ " Format.pp_print_string) !include_dirs (pp_print_list ~pp_sep:pp_print_space pp_print_string) !include_dirs
let add_include_dir dir = let add_include_dir dir =
let removed_slash_suffix = let removed_slash_suffix =
......
...@@ -47,7 +47,7 @@ let inject_id_id expr = ...@@ -47,7 +47,7 @@ let inject_id_id expr =
expr_clock = expr.expr_clock; expr_clock = expr.expr_clock;
} }
let pp_inject_real pp_var pp_val fmt var value = let pp_inject_real pp_var pp_val fmt (var, value) =
Format.fprintf fmt "%s(%a, %a, %s);" Format.fprintf fmt "%s(%a, %a, %s);"
inject_real_id inject_real_id
pp_var var pp_var var
...@@ -61,19 +61,19 @@ let inject_assign expr = ...@@ -61,19 +61,19 @@ let inject_assign expr =
expr_clock = expr.expr_clock; expr_clock = expr.expr_clock;
} }
let pp_inject_copy pp_var fmt var value = let pp_inject_copy pp_var fmt (var, value) =
Format.fprintf fmt "%s(%a, %a, %s);" Format.fprintf fmt "%s(%a, %a, %s);"
inject_copy_id inject_copy_id
pp_var var pp_var var
pp_var value pp_var value
(mpfr_rnd ()) (mpfr_rnd ())
let pp_inject_assign pp_var fmt var value = let pp_inject_assign pp_var fmt (_, value as vv) =
if is_const_value value if is_const_value value
then then
pp_inject_real pp_var pp_var fmt var value pp_inject_real pp_var pp_var fmt vv
else else
pp_inject_copy pp_var fmt var value pp_inject_copy pp_var fmt vv
let pp_inject_init pp_var fmt var = let pp_inject_init pp_var fmt var =
Format.fprintf fmt "%s(%a, %i);" Format.fprintf fmt "%s(%a, %i);"
......
...@@ -67,7 +67,7 @@ let position pred l = ...@@ -67,7 +67,7 @@ let position pred l =
(* TODO: Lélio: why n+1? cf former def below *) (* TODO: Lélio: why n+1? cf former def below *)
(* if n < 0 then [] else x :: duplicate x (n - 1) *) (* if n < 0 then [] else x :: duplicate x (n - 1) *)
let duplicate x n = List.init (n+1) (fun i -> x) let duplicate x n = List.init (n+1) (fun _ -> x)
let enumerate n = List.init n (fun i -> i) let enumerate n = List.init n (fun i -> i)
...@@ -251,12 +251,91 @@ let print_rat fmt (a,b) = ...@@ -251,12 +251,91 @@ let print_rat fmt (a,b) =
(* Generic pretty printing *) (* Generic pretty printing *)
let pp_final_char_if_non_empty c l = let pp_final_char_if_non_empty c l =
(fun fmt -> match l with [] -> () | _ -> Format.fprintf fmt "%(%)" c) (fun fmt -> match l with [] -> () | _ -> Format.fprintf fmt "%(%)" c)
let pp_newline_if_non_empty l = let pp_newline_if_non_empty l =
(fun fmt -> match l with [] -> () | _ -> Format.fprintf fmt "@,") (fun fmt -> match l with [] -> () | _ -> Format.fprintf fmt "@,")
module Format = struct
include Format
open Format
let with_out_file file f =
let oc = open_out file in
let fmt = formatter_of_out_channel oc in
f fmt;
close_out oc
let pp_print_nothing _fmt _ = ()
let pp_print_cutcut fmt () = fprintf fmt "@,@,"
let pp_print_endcut s fmt () = fprintf fmt "%s@," s
let pp_print_opar fmt () = pp_print_string fmt "("
let pp_print_cpar fmt () = pp_print_string fmt ")"
let pp_print_obrace fmt () = pp_print_string fmt "{"
let pp_print_cbrace fmt () = pp_print_string fmt "}"
let pp_print_comma fmt () = fprintf fmt ",@ "
let pp_print_semicolon fmt () = fprintf fmt ";@ "
let pp_print_comma' fmt () = fprintf fmt ","
let pp_print_semicolon' fmt () = fprintf fmt ";"
let pp_open_vbox0 fmt () = pp_open_vbox fmt 0
let pp_print_list
?(pp_prologue=pp_print_nothing) ?(pp_epilogue=pp_print_nothing)
?(pp_op=pp_print_nothing) ?(pp_cl=pp_print_nothing)
?(pp_open_box=fun fmt () -> pp_open_box fmt 0)
?(pp_eol=pp_print_nothing) ?pp_sep pp_v fmt l =
fprintf fmt "%a%a%a%a%a@]%a%a"
(fun fmt l -> if l <> [] then pp_prologue fmt ()) l
pp_op ()
pp_open_box ()
(pp_print_list ?pp_sep pp_v) l
(fun fmt l -> if l <> [] then pp_eol fmt ()) l
pp_cl ()
(fun fmt l -> if l <> [] then pp_epilogue fmt ()) l
let pp_print_list_i
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
pp_v =
let i = ref 0 in
pp_print_list
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
(fun fmt x -> pp_v fmt !i x; incr i)
let pp_print_list2
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
pp_v fmt (l1, l2) =
pp_print_list
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
pp_v fmt (List.combine l1 l2)
let pp_print_list_i2
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
pp_v fmt (l1, l2) =
pp_print_list_i
?pp_prologue ?pp_epilogue ?pp_op ?pp_cl ?pp_open_box ?pp_eol ?pp_sep
(fun fmt i (x1, x2) -> pp_v fmt i x1 x2) fmt (List.combine l1 l2)
let pp_print_parenthesized ?(pp_sep=pp_print_comma) =
pp_print_list
~pp_op:pp_print_opar
~pp_cl:pp_print_cpar
~pp_sep
let pp_print_braced ?(pp_sep=pp_print_comma) =
pp_print_list
~pp_op:pp_print_obrace
~pp_cl:pp_print_cbrace
~pp_sep
end
let fprintf_list ?(eol:('a, formatter, unit) format = "") ~sep:sep f fmt l = let fprintf_list ?(eol:('a, formatter, unit) format = "") ~sep:sep f fmt l =
Format.(pp_print_list ~pp_sep:(fun fmt () -> fprintf fmt "%(%)" sep) f fmt l); Format.(pp_print_list ~pp_sep:(fun fmt () -> fprintf fmt "%(%)" sep) f fmt l);
if l <> [] then Format.fprintf fmt "%(%)" eol if l <> [] then Format.fprintf fmt "%(%)" eol
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment