1
|
open Vhdl_ast
|
2
|
open Mini_vhdl_ast
|
3
|
|
4
|
let mini_vhdl_declaration_t_names decl=
|
5
|
match decl with
|
6
|
| MiniSigDecl { names; typ; init_val } -> names
|
7
|
| _ -> []
|
8
|
|
9
|
let rec remove_opt l=
|
10
|
match l with
|
11
|
| [] -> []
|
12
|
| (None)::tl -> remove_opt tl
|
13
|
| (Some a)::tl -> a::(remove_opt tl)
|
14
|
|
15
|
let rec get_ports: vhdl_port_t list -> vhdl_port_mode_t -> vhdl_port_t list=
|
16
|
fun l -> fun m -> match l with
|
17
|
| [] -> []
|
18
|
| hd::tl -> if hd.port_mode = m then hd::(get_ports tl m) else get_ports tl m
|
19
|
|
20
|
let rec get_ports_pos: vhdl_port_t list -> vhdl_port_mode_t -> int -> int list=
|
21
|
fun l -> fun m -> fun index -> match l with
|
22
|
| [] -> []
|
23
|
| hd::tl -> if hd.port_mode = m then index::(get_ports_pos tl m (index+1)) else get_ports_pos tl m (index+1)
|
24
|
|
25
|
let get_names : vhdl_port_t -> vhdl_name_t list= fun x -> x.port_names
|
26
|
|
27
|
let rec duplicates l1=
|
28
|
match l1 with
|
29
|
| [] -> []
|
30
|
| hd::tl -> if List.mem hd tl then hd::(duplicates (List.filter (fun x -> List.mem x tl) tl)) else duplicates tl
|
31
|
|
32
|
let equals n1 n2=
|
33
|
match (n1,n2) with
|
34
|
| (Simple a, Identifier b) -> a = b
|
35
|
| (Identifier a, Simple b) -> a = b
|
36
|
| (Simple a, Selected ((Simple b)::[])) -> a = b
|
37
|
| (Simple a, Selected ((Identifier b)::[])) -> a = b
|
38
|
| (Identifier a, Selected ((Simple b)::[])) -> a = b
|
39
|
| (Identifier a, Selected ((Identifier b)::[])) -> a = b
|
40
|
| (Selected ((Simple b)::[]), Simple a) -> a = b
|
41
|
| (Selected ((Identifier b)::[]), Simple a) -> a = b
|
42
|
| (Selected ((Simple b)::[]), Identifier a) -> a = b
|
43
|
| (Selected ((Identifier b)::[]), Identifier a) -> a = b
|
44
|
| (a,b) -> a = b
|
45
|
|
46
|
let find_vhdl_name_t l x =
|
47
|
let rec find_vhdl_name_t_aux x l index =
|
48
|
match l with
|
49
|
| [] -> -1
|
50
|
| hd::tl -> if (equals x hd) then index else find_vhdl_name_t_aux x tl (index+1) in
|
51
|
find_vhdl_name_t_aux x l 0
|
52
|
|
53
|
let rec vhdl_name_t_mem x l =
|
54
|
match l with
|
55
|
| [] -> false
|
56
|
| hd::tl -> equals x hd || vhdl_name_t_mem x tl
|
57
|
|
58
|
let rec diff l1 l2 =
|
59
|
match l1 with
|
60
|
| [] -> []
|
61
|
| hd::tl ->
|
62
|
if vhdl_name_t_mem hd l2 then diff tl l2 else hd::(diff tl l2)
|
63
|
|
64
|
let n_intersection ll =
|
65
|
let rec n_intersection_aux e_inter l =
|
66
|
match e_inter with
|
67
|
| [] -> l
|
68
|
| hd::tl -> if (vhdl_name_t_mem hd l) then hd::(n_intersection_aux tl l) else n_intersection_aux tl l
|
69
|
in
|
70
|
List.fold_left n_intersection_aux [] ll
|
71
|
|
72
|
let rec times : 'a list list -> 'a list list -> 'a list list=
|
73
|
fun a ->
|
74
|
fun b ->
|
75
|
match a with
|
76
|
| [] -> b
|
77
|
| hda::tla -> match b with
|
78
|
| [] -> a
|
79
|
| hdb::tlb -> [hdb@hda]@(times tla tlb)
|
80
|
|
81
|
(* Signals lattice *)
|
82
|
let build_signals_lattice = object (self)
|
83
|
inherit [_] mini_vhdl_iter as super
|
84
|
|
85
|
(* method! visit_vhdl_expr_t env e =
|
86
|
match e with
|
87
|
| Op ({id=""; args=hd::[]}) -> self#visit_vhdl_expr_t env hd
|
88
|
| _ -> super#visit_vhdl_expr_t env e*)
|
89
|
end
|
90
|
|
91
|
|