Project

General

Profile

Download (7.57 KB) Statistics
| Branch: | Tag: | Revision:
1
open Lustre_types
2
open Machine_code_types
3
open Format
4
open C_backend_common
5
open Printers
6

    
7
(* module type MODIFIERS_MAINSRC = sig end
8

    
9
   module EmptyMod = struct end
10

    
11
   module Mauve = functor (Mod: MODIFIERS_MAINSRC) -> struct end *)
12
(********************************************************************************************)
13
(* Main related functions *)
14
(********************************************************************************************)
15

    
16
let shell_name node = node ^ "Shell"
17

    
18
let core_name node = node ^ "Core"
19

    
20
let fsm_name node = node ^ "FSM"
21

    
22
(* -------------------------------------------------- *)
23
(*                       Hearder                      *)
24
(* -------------------------------------------------- *)
25

    
26
let print_mauve_header fmt basename =
27
  fprintf fmt "#include \"mauve/runtime.hpp\"@.";
28
  pp_import_alloc_prototype
29
    fmt
30
    { local = true; name = basename; content = []; is_stateful = true }
31
  (* assuming it is stateful*);
32
  pp_print_newline fmt ();
33
  pp_print_newline fmt ()
34

    
35
(* -------------------------------------------------- *)
36
(*                       Shell                        *)
37
(* -------------------------------------------------- *)
38

    
39
let mauve_default_value v =
40
  (* let v_name = v.var_id in *)
41
  if Types.is_bool_type v.var_type then "false"
42
  else if Types.is_int_type v.var_type then "0"
43
  else if Types.is_real_type v.var_type then "0.0"
44
  else assert false
45

    
46
let print_mauve_default fmt mauve_machine v =
47
  let v_name : string = v.var_id in
48
  let found = ref false in
49
  let annotations : expr_annot list = mauve_machine.mname.node_annot in
50
  List.iter
51
    (fun (al : expr_annot) ->
52
      List.iter
53
        (fun ((sl, e) : string list * eexpr) ->
54
          if not !found then
55
            match sl with
56
            | [ "mauve"; "default"; name ] ->
57
              if v_name = name then (
58
                pp_expr fmt e.eexpr_qfexpr;
59
                found := true)
60
            | _ ->
61
              ())
62
        al.annots)
63
    annotations;
64
  if not !found then fprintf fmt "%s" (mauve_default_value v)
65

    
66
let print_mauve_shell fmt mauve_machine =
67
  let node_name = mauve_machine.mname.node_id in
68

    
69
  fprintf fmt "/*@.";
70
  fprintf fmt " *          SHELL@.";
71
  fprintf fmt " */@.";
72

    
73
  fprintf fmt "struct %s: public Shell {@." (shell_name node_name);
74

    
75
  (* in ports *)
76
  fprintf fmt "\t// InputPorts@.";
77
  List.iter
78
    (fun v ->
79
      let v_name = v.var_id in
80
      let v_type = pp_c_basic_type_desc v.var_type in
81
      fprintf
82
        fmt
83
        "\tReadPort<%s> & port_%s = mk_readPort<%s>(\"%s\", "
84
        v_type
85
        v_name
86
        v_type
87
        v_name;
88
      print_mauve_default fmt mauve_machine v;
89
      fprintf fmt ");@.")
90
    mauve_machine.mstep.step_inputs;
91
  (* out ports *)
92
  fprintf fmt "\t// OutputPorts@.";
93
  List.iter
94
    (fun v ->
95
      let v_name = v.var_id in
96
      let v_type = pp_c_basic_type_desc v.var_type in
97
      fprintf
98
        fmt
99
        "\tWritePort<%s> & port_%s = mk_writePort<%s>(\"%s\");@."
100
        v_type
101
        v_name
102
        v_type
103
        v_name)
104
    mauve_machine.mstep.step_outputs;
105

    
106
  fprintf fmt "};@.";
107

    
108
  pp_print_newline fmt ()
109

    
110
let print_mauve_step fmt node_name mauve_machine =
111
  fprintf fmt "\t\t%s_step(" node_name;
112
  List.iter
113
    (fun v ->
114
      let v_name = v.var_id in
115
      fprintf fmt "%s, " v_name)
116
    mauve_machine.mstep.step_inputs;
117
  List.iter
118
    (fun v ->
119
      let v_name = v.var_id in
120
      fprintf fmt "&%s, " v_name)
121
    mauve_machine.mstep.step_outputs;
122
  fprintf fmt "node";
123
  fprintf fmt ");@."
124

    
125
(* -------------------------------------------------- *)
126
(*                       Core                      *)
127
(* -------------------------------------------------- *)
128

    
129
let print_mauve_core fmt mauve_machine =
130
  let node_name = mauve_machine.mname.node_id in
131

    
132
  fprintf fmt "/*@.";
133
  fprintf fmt " *          CORE@.";
134
  fprintf fmt " */@.";
135

    
136
  fprintf
137
    fmt
138
    "struct %s: public Core<%s> {@."
139
    (core_name node_name)
140
    (shell_name node_name);
141

    
142
  (* Attribute *)
143
  fprintf fmt "\tstruct %s_mem * node;@." node_name;
144
  pp_print_newline fmt ();
145
  (* Update *)
146
  fprintf fmt "\tvoid update() {@.";
147
  List.iter
148
    (fun v ->
149
      let v_name = v.var_id in
150
      let v_type = pp_c_basic_type_desc v.var_type in
151
      fprintf fmt "\t\t%s %s = port_%s.read();@." v_type v_name v_name)
152
    mauve_machine.mstep.step_inputs;
153
  List.iter
154
    (fun v ->
155
      let v_name = v.var_id in
156
      let v_type = pp_c_basic_type_desc v.var_type in
157
      fprintf fmt "\t\t%s %s;@." v_type v_name)
158
    mauve_machine.mstep.step_outputs;
159
  print_mauve_step fmt node_name mauve_machine;
160
  List.iter
161
    (fun v ->
162
      let v_name = v.var_id in
163
      fprintf fmt "\t\tport_%s.write(%s);@." v_name v_name)
164
    mauve_machine.mstep.step_outputs;
165
  fprintf fmt "\t}@.";
166
  pp_print_newline fmt ();
167
  (* Configure *)
168
  fprintf fmt "\tbool configure_hook() override {@.";
169
  fprintf fmt "\t\tnode = %s_alloc();@." node_name;
170
  fprintf fmt "\t\t%s_reset(node);@." node_name;
171
  fprintf fmt "\t\treturn true;@.";
172
  fprintf fmt "\t}@.";
173
  pp_print_newline fmt ();
174
  (* Cleanup *)
175
  fprintf fmt "\tvoid cleanup_hook() override {@.";
176
  fprintf fmt "\t\t%s_reset(node);@." node_name;
177
  fprintf fmt "\t\t%s_dealloc(node);@." node_name;
178
  fprintf fmt "\t}@.";
179
  fprintf fmt "};@.";
180
  pp_print_newline fmt ()
181

    
182
(* -------------------------------------------------- *)
183
(*                       FSM                          *)
184
(* -------------------------------------------------- *)
185

    
186
let print_period_conversion fmt expr =
187
  match expr.expr_desc with
188
  | Expr_tuple [ p; u ] -> (
189
    match u.expr_desc with
190
    | Expr_ident "s" ->
191
      fprintf fmt "sec_to_ns(";
192
      pp_expr fmt p;
193
      fprintf fmt ")"
194
    | Expr_ident "ssec" ->
195
      fprintf fmt "sec_to_ns(";
196
      pp_expr fmt p;
197
      fprintf fmt ")"
198
    | Expr_ident "ms" ->
199
      fprintf fmt "ms_to_ns(";
200
      pp_expr fmt p;
201
      fprintf fmt ")"
202
    | Expr_ident "ns" ->
203
      pp_expr fmt p
204
    | _ ->
205
      assert false)
206
  | _ ->
207
    assert false
208

    
209
let print_mauve_period fmt mauve_machine =
210
  let found = ref false in
211
  let annotations : expr_annot list = mauve_machine.mname.node_annot in
212
  List.iter
213
    (fun (al : expr_annot) ->
214
      List.iter
215
        (fun ((sl, e) : string list * eexpr) ->
216
          if not !found then
217
            match sl with
218
            | [ "mauve"; "period" ] ->
219
              print_period_conversion fmt e.eexpr_qfexpr;
220
              found := true
221
            | _ ->
222
              ())
223
        al.annots)
224
    annotations;
225
  if not !found then fprintf fmt "0"
226

    
227
let print_mauve_fsm fmt mauve_machine =
228
  let node_name = mauve_machine.mname.node_id in
229

    
230
  fprintf fmt "/*@.";
231
  fprintf fmt " *          FSM@.";
232
  fprintf fmt " */@.";
233

    
234
  fprintf
235
    fmt
236
    "struct %s: public FiniteStateMachine<%s, %s> {@."
237
    (fsm_name node_name)
238
    (shell_name node_name)
239
    (core_name node_name);
240

    
241
  (* Attribute *)
242
  fprintf
243
    fmt
244
    "\tExecState<%s>    & update  = mk_execution      (\"Update\" , \
245
     &%s::update);@."
246
    (core_name node_name)
247
    (core_name node_name);
248
  fprintf
249
    fmt
250
    "\tSynchroState<%s> & synchro = mk_synchronization(\"Synchro\", "
251
    (core_name node_name);
252
  print_mauve_period fmt mauve_machine;
253
  fprintf fmt ");@.";
254
  pp_print_newline fmt ();
255
  (* Configure *)
256
  fprintf fmt "\tbool configure_hook() override {@.";
257
  fprintf fmt "\t\tset_initial(update);@.";
258
  fprintf fmt "\t\tset_next(update, synchro);@.";
259
  fprintf fmt "\t\tset_next(synchro, update);@.";
260
  fprintf fmt "\t\treturn true;@.";
261
  fprintf fmt "\t}@.";
262
  pp_print_newline fmt ();
263
  (* Cleanup *)
264
  fprintf fmt "\tvoid cleanup_hook() override {@.";
265
  fprintf fmt "\t}@.";
266
  fprintf fmt "};@.";
267
  pp_print_newline fmt ()
268

    
269
(* Local Variables: *)
270
(* compile-command:"make -C ../../.." *)
271
(* End: *)
(13-13/18)