1
|
(********************************************************************)
|
2
|
(* *)
|
3
|
(* The LustreC compiler toolset / The LustreC Development Team *)
|
4
|
(* Copyright 2012 - -- ONERA - CNRS - INPT *)
|
5
|
(* *)
|
6
|
(* LustreC is free software, distributed WITHOUT ANY WARRANTY *)
|
7
|
(* under the terms of the GNU Lesser General Public License *)
|
8
|
(* version 2.1. *)
|
9
|
(* *)
|
10
|
(********************************************************************)
|
11
|
|
12
|
(* The compilation presented here was first defined in Garoche, Gurfinkel,
|
13
|
Kahsai, HCSV'14.
|
14
|
|
15
|
This is a modified version that handles reset and automaton
|
16
|
*)
|
17
|
|
18
|
open Format
|
19
|
open LustreSpec
|
20
|
open Corelang
|
21
|
open Machine_code
|
22
|
|
23
|
open Horn_backend_common
|
24
|
open Horn_backend_printers
|
25
|
open Horn_backend_collecting_sem
|
26
|
|
27
|
(*
|
28
|
TODO:
|
29
|
- gerer les traces. Ca merde pour l'instant dans le calcul des memoires sur les arrows
|
30
|
|
31
|
- gerer le reset --- DONE
|
32
|
- reconstruire les rechable states DONE
|
33
|
- reintroduire le cex/traces ... DONE
|
34
|
- traiter les types enum et les branchements sur ces types enum (en particulier les traitements des resets qui ont lieu dans certaines branches et pas dans d'autres )
|
35
|
*)
|
36
|
|
37
|
let main_print machines fmt =
|
38
|
if !Options.main_node <> "" then
|
39
|
begin
|
40
|
let node = !Options.main_node in
|
41
|
let machine = get_machine machines node in
|
42
|
if !Options.horn_cex then(
|
43
|
cex_computation machines fmt node machine;
|
44
|
get_cex machines fmt node machine)
|
45
|
else (
|
46
|
collecting_semantics machines fmt node machine;
|
47
|
check_prop machines fmt node machine;
|
48
|
)
|
49
|
end
|
50
|
|
51
|
|
52
|
let load_file f =
|
53
|
let ic = open_in f in
|
54
|
let n = in_channel_length ic in
|
55
|
let s = String.create n in
|
56
|
really_input ic s 0 n;
|
57
|
close_in ic;
|
58
|
(s)
|
59
|
|
60
|
let print_type_definitions fmt =
|
61
|
let cpt_type = ref 0 in
|
62
|
Hashtbl.iter (fun typ decl ->
|
63
|
match typ with
|
64
|
| Tydec_const var ->
|
65
|
(match decl.top_decl_desc with
|
66
|
| TypeDef tdef -> (
|
67
|
match tdef.tydef_desc with
|
68
|
| Tydec_enum tl ->
|
69
|
incr cpt_type;
|
70
|
fprintf fmt "(declare-datatypes () ((%s %a)));@.@."
|
71
|
var
|
72
|
(Utils.fprintf_list ~sep:" " pp_print_string) tl
|
73
|
| _ -> assert false
|
74
|
)
|
75
|
| _ -> assert false
|
76
|
)
|
77
|
| _ -> ()) type_table
|
78
|
|
79
|
|
80
|
|
81
|
|
82
|
let print_dep fmt prog =
|
83
|
Log.report ~level:1 (fun fmt -> fprintf fmt "@[<v 2>.. extracting Horn libraries@,");
|
84
|
fprintf fmt "; Statically linked libraries@";
|
85
|
let dependencies = Corelang.get_dependencies prog in
|
86
|
List.iter
|
87
|
(fun dep ->
|
88
|
let (local, s) = Corelang.dependency_of_top dep in
|
89
|
let basename = ((if local then !Options.dest_dir else !Options.include_dir)) ^ s ^ ".smt2" in
|
90
|
Log.report ~level:1 (fun fmt -> Format.fprintf fmt "@[<v 0> Horn Library %s@," basename);
|
91
|
let horn = load_file basename in
|
92
|
fprintf fmt "@.%s@." horn;
|
93
|
)
|
94
|
dependencies
|
95
|
|
96
|
let check_sfunction mannot =
|
97
|
(*Check if its an sfunction*)
|
98
|
match mannot with
|
99
|
[] -> false
|
100
|
| [x] -> match x.annots with
|
101
|
[] -> false
|
102
|
|[(key,va)] -> match key with
|
103
|
[] -> false
|
104
|
| ["c_code"] -> true
|
105
|
| ["matlab"] -> true
|
106
|
| _ -> false
|
107
|
| _ -> false
|
108
|
|
109
|
let translate fmt basename prog machines=
|
110
|
(* We print typedef *)
|
111
|
print_dep fmt prog; (*print static library e.g. math*)
|
112
|
print_type_definitions fmt;
|
113
|
(*List.iter (print_machine machines fmt) (List.rev machines);*)
|
114
|
List.iter(fun m ->
|
115
|
let is_sfunction = check_sfunction m.mannot in
|
116
|
if is_sfunction then(
|
117
|
Log.report ~level:1 (fun fmt -> fprintf fmt ".. detected sfunction: %s@," m.mname.node_id);
|
118
|
print_sfunction machines fmt m
|
119
|
) else (
|
120
|
print_machine machines fmt m)
|
121
|
)
|
122
|
(List.rev machines);
|
123
|
main_print machines fmt
|
124
|
|
125
|
(* Local Variables: *)
|
126
|
(* compile-command:"make -C ../.." *)
|
127
|
(* End: *)
|