Project

General

Profile

Download (4.19 KB) Statistics
| Branch: | Tag: | Revision:
1
open LustreSpec
2
open Corelang
3
open Machine_code
4
open Format
5
open C_backend_common
6

    
7
module type MODIFIERS_MAINSRC =
8
sig
9
end
10

    
11
module EmptyMod =
12
struct
13
end
14

    
15
module Main = functor (Mod: MODIFIERS_MAINSRC) -> 
16
struct
17

    
18
(********************************************************************************************)
19
(*                         Main related functions                                           *)
20
(********************************************************************************************)
21

    
22
let print_get_input fmt v =
23
  match v.var_type.Types.tdesc with
24
    | Types.Tint -> fprintf fmt "_get_int(\"%s\")" v.var_id
25
    | Types.Tbool -> fprintf fmt "_get_bool(\"%s\")" v.var_id
26
    | Types.Treal -> fprintf fmt "_get_double(\"%s\")" v.var_id
27
    | _ -> assert false
28

    
29
let print_put_outputs fmt ol = 
30
  let po fmt o =
31
    match o.var_type.Types.tdesc with
32
    | Types.Tint -> fprintf fmt "_put_int(\"%s\", %s)" o.var_id o.var_id
33
    | Types.Tbool -> fprintf fmt "_put_bool(\"%s\", %s)" o.var_id o.var_id
34
    | Types.Treal -> fprintf fmt "_put_double(\"%s\", %s)" o.var_id o.var_id
35
    | _ -> assert false
36
  in
37
  List.iter (fprintf fmt "@ %a;" po) ol
38

    
39
let print_main_fun machines m fmt =
40
  let mname = m.mname.node_id in
41
  let main_mem =
42
    if (!Options.static_mem && !Options.main_node <> "")
43
    then "&main_mem"
44
    else "main_mem" in
45
  fprintf fmt "@[<v 2>int main (int argc, char *argv[]) {@ ";
46
  fprintf fmt "/* Declaration of inputs/outputs variables */@ ";
47
  List.iter 
48
    (fun v -> fprintf fmt "%a = %a;@ " (pp_c_type v.var_id) v.var_type pp_c_initialize v.var_type
49
    ) m.mstep.step_inputs;
50
  List.iter 
51
    (fun v -> fprintf fmt "%a = %a;@ " (pp_c_type v.var_id) v.var_type pp_c_initialize v.var_type
52
    ) m.mstep.step_outputs;
53
  fprintf fmt "@ /* Main memory allocation */@ ";
54
  if (!Options.static_mem && !Options.main_node <> "")
55
  then (fprintf fmt "%a(static,main_mem);@ " pp_machine_static_alloc_name mname)
56
  else (fprintf fmt "%a *main_mem = %a();@ " pp_machine_memtype_name mname pp_machine_alloc_name mname);
57
  fprintf fmt "@ /* Initialize the main memory */@ ";
58
  fprintf fmt "%a(%s);@ " pp_machine_reset_name mname main_mem;
59
  fprintf fmt "@ ISATTY = isatty(0);@ ";
60
  fprintf fmt "@ /* Infinite loop */@ ";
61
  fprintf fmt "@[<v 2>while(1){@ ";
62
  fprintf fmt  "fflush(stdout);@ ";
63
  List.iter 
64
    (fun v -> fprintf fmt "%s = %a;@ "
65
      v.var_id
66
      print_get_input v
67
    ) m.mstep.step_inputs;
68
  (match m.mstep.step_outputs with
69
    (* | [] -> ( *)
70
    (*   fprintf fmt "%a(%a%t%s);@ "  *)
71
    (* 	pp_machine_step_name mname *)
72
    (* 	(Utils.fprintf_list ~sep:", " (fun fmt v -> pp_print_string fmt v.var_id)) m.mstep.step_inputs *)
73
    (* 	(pp_final_char_if_non_empty ", " m.mstep.step_inputs) *)
74
    (* 	main_mem *)
75
    (* ) *)
76
    (* | [o] -> ( *)
77
    (*   fprintf fmt "%s = %a(%a%t%a, %s);%a" *)
78
    (* 	o.var_id *)
79
    (* 	pp_machine_step_name mname *)
80
    (* 	(Utils.fprintf_list ~sep:", " (fun fmt v -> pp_print_string fmt v.var_id)) m.mstep.step_inputs *)
81
    (* 	(pp_final_char_if_non_empty ", " m.mstep.step_inputs) *)
82
    (* 	(Utils.fprintf_list ~sep:", " (fun fmt v -> fprintf fmt "&%s" v.var_id)) m.mstep.step_outputs *)
83
    (* 	main_mem *)
84
    (* 	print_put_outputs [o]) *)
85
    | _ -> (
86
      fprintf fmt "%a(%a%t%a, %s);%a"
87
	pp_machine_step_name mname
88
	(Utils.fprintf_list ~sep:", " (fun fmt v -> pp_print_string fmt v.var_id)) m.mstep.step_inputs
89
	(Utils.pp_final_char_if_non_empty ", " m.mstep.step_inputs)
90
	(Utils.fprintf_list ~sep:", " (fun fmt v -> fprintf fmt "&%s" v.var_id)) m.mstep.step_outputs
91
	main_mem
92
	print_put_outputs m.mstep.step_outputs)
93
  );
94
  fprintf fmt "@]@ }@ ";
95
  fprintf fmt "return 1;";
96
  fprintf fmt "@]@ }@."       
97

    
98
let print_main_header fmt =
99
  fprintf fmt "#include <stdio.h>@.#include <unistd.h>@.#include \"%s/include/lustrec/io_frontend.h\"@." Version.prefix
100

    
101

    
102
let print_main_c main_fmt main_machine basename prog machines dependencies =
103
  print_main_header main_fmt;
104
  fprintf main_fmt "#include <stdlib.h>@.#include <assert.h>@.#include \"%s\"@.@." (basename^".h");
105
  (* Print the svn version number and the supported C standard (C90 or C99) *)
106
  print_version main_fmt;
107
  print_main_fun machines main_machine main_fmt
108
end  
109

    
110
(* Local Variables: *)
111
(* compile-command:"make -C ../../.." *)
112
(* End: *)
(4-4/7)