Project

General

Profile

« Previous | Next » 

Revision d3f0059e

Added by Arnaud Dieumegard about 5 years ago

New version of the VHDL importer with pretty printing based on ppx_show

View differences:

src/tools/importer/main_lustre_importer.ml
14 14
open Vhdl_test
15 15
  *)
16 16
open Yojson.Safe
17
open Vhdl_ast_utils
18
open Vhdl_ast_map
17 19
open Vhdl_ast
20
open Ppxlib_traverse_builtins
18 21
open Printf
19 22

  
20 23
let _ =
......
24 27
  (* Create VHDL values *)
25 28
  let vhdl = vhdl_file_t_of_yojson vhdl_json in
26 29

  
30
  (* Simplify VHDL values *)
27 31
  match vhdl with
28 32
    Ok x ->
29
      Format.printf "Parsed VHDL: \n%s\n" (pretty_to_string (vhdl_file_t_to_yojson x))
33
      Format.printf "Parsed VHDL: \n%s\n" (pretty_to_string (vhdl_file_t_to_yojson x));
34
      let folded = replace_op_expr#vhdl_file_t x in
35
      Format.printf "PP VHDL: \n%s\n" (show_vhdl_file_t folded);
30 36
  | Error e -> Format.printf "Error: %s\n" e;
37

  
src/tools/importer/vhdl_ast.ml
22 22
    CstInt of int 
23 23
  | CstStdLogic of string
24 24
  | CstLiteral of string [@name "CST_LITERAL"]
25
[@@deriving yojson {strict = false}];;
25
[@@deriving show { with_path = false }, yojson {strict = false}];;
26

  
27
(*
28
let pp_cst_val fmt c =
29
  match c with
30
  | CstInt i -> Format.fprintf fmt "%i" i
31
  | CstStdLogic s -> if List.mem s std_logic_cst then Format.fprintf fmt "%s" s else assert false
32
  | CstLiteral s -> Format.fprintf fmt "%s" s
33
*)
26 34

  
27 35
type vhdl_type_t =
28 36
  | Base of string
......
58 66
  | IsNull [@name "IsNull"]
59 67
  | Time of { value: int; phy_unit: string [@default ""]}
60 68
  | Sig of { name: vhdl_name_t; att: vhdl_signal_attributes_t option }
61
  | SuffixMod of { expr : vhdl_expr_t; selection : suffix_selection_t }
69
  | SuffixMod of { expr : vhdl_expr_t; selection : vhdl_suffix_selection_t }
62 70
  | Aggregate of { elems : vhdl_element_assoc_t list } [@name "AGGREGATE"]
63 71
  | Others [@name "OTHERS"]
64 72
and vhdl_name_t =
......
88 96
  | AAttAscending
89 97
and vhdl_signal_attributes_t = SigAtt of string
90 98
and vhdl_string_attributes_t = StringAtt of string
91
and suffix_selection_t = Idx of int | SuffixRange of int * int
92
[@@deriving yojson {strict = false}];;
99
and vhdl_suffix_selection_t = Idx of int | SuffixRange of int * int
100
[@@deriving show { with_path = false }, yojson {strict = false}];;
101

  
102
(*
103
let rec pp_vhdl_type fmt t =
104
  match t with
105
  | Base s -> Format.fprintf fmt "%s" s 
106
  | Range(base, n, m) -> Format.fprintf fmt "%trange %i to %i" (fun fmt -> match base with Some s -> Format.fprintf fmt "%s " s | None -> ()) n m
107
  | Bit_vector (n,m) -> Format.fprintf fmt "bit_vector(%i downto %i)" n m
108
  | Array (n, m, base) -> Format.fprintf fmt "array (%i to %i) of %a" n m pp_vhdl_type base
109
  | Enumerated sl -> Format.fprintf fmt "(%a)" (Utils.fprintf_list ~sep:", " Format.pp_print_string) sl
110
  | Void -> Format.fprintf fmt ""
111
*)
93 112

  
94 113
(************************************************************************************)		   
95 114
(*            Attributes for types, arrays, signals and strings                     *)
......
100 119
  | TAttIntArg of { id: string; arg: int }
101 120
  | TAttValArg of { id: string; arg: 'basetype }
102 121
  | TAttStringArg of { id: string; arg: string }
103
[@@deriving yojson {strict = false}];;
122
[@@deriving show { with_path = false }, yojson {strict = false}];;
104 123

  
105 124
let typ_att_noarg = ["base"; "left"; "right"; "high"; "low"]
106 125
let typ_att_intarg = ["pos"; "val"; "succ"; "pred"; "leftof"; "rightof"]
......
116 135
    typ: vhdl_subtype_indication_t;
117 136
    init_val: cst_val_t option [@default Some (CstInt (0))];
118 137
  }
119
[@@deriving yojson {strict = false}];;
138
[@@deriving show { with_path = false }, yojson {strict = false}];;
120 139

  
121 140
type vhdl_subprogram_spec_t =
122 141
  {
......
125 144
    parameters: vhdl_parameter_t list;
126 145
    isPure: bool [@default false];
127 146
  }
128
[@@deriving yojson {strict = false}];;
147
[@@deriving show { with_path = false }, yojson {strict = false}];;
129 148

  
130 149
(************************************************************************************)		   
131 150
(*                        Expressions  / Statements                                 *)
......
157 176
    when_cond: vhdl_expr_t list;
158 177
    when_stmt: vhdl_sequential_stmt_t list;
159 178
  }
160
[@@deriving yojson {strict = false}];;
179
[@@deriving show { with_path = false }, yojson {strict = false}];;
161 180

  
162 181
type vhdl_declaration_t =
163 182
  | VarDecl of {
......
182 201
      decl_part: vhdl_declaration_t list [@default []]; 
183 202
      stmts: vhdl_sequential_stmt_t list [@default []]
184 203
    } [@name "SUBPROGRAM_BODY"]
185
[@@deriving yojson {strict = false}];;
204
[@@deriving show { with_path = false }, yojson {strict = false}];;
186 205

  
187
type signal_condition_t =
206
type vhdl_signal_condition_t =
188 207
  {                            
189 208
    expr: vhdl_expr_t list;              (* when expression *)
190 209
    cond: vhdl_expr_t [@default IsNull];  (* optional else case expression. 
191 210
                                             If None, could be a latch  *)
192 211
  }
193
[@@deriving yojson {strict = false}];;
212
[@@deriving show { with_path = false }, yojson {strict = false}];;
194 213

  
195
type signal_selection_t =
214
type vhdl_signal_selection_t =
196 215
  {
197 216
    expr : vhdl_expr_t;
198 217
    when_sel: vhdl_expr_t list [@default []];
199 218
  }
200
[@@deriving yojson {strict = false}];;
219
[@@deriving show { with_path = false }, yojson {strict = false}];;
201 220

  
202
type conditional_signal_t =
221
type vhdl_conditional_signal_t =
203 222
  {
204 223
    postponed: bool [@default false];
205 224
    label: vhdl_name_t [@default NoName];
206 225
    lhs: vhdl_name_t;        (* assigned signal = target*)
207
    rhs: signal_condition_t list;                   (* expression *)
226
    rhs: vhdl_signal_condition_t list;                   (* expression *)
208 227
    cond: vhdl_expr_t [@default IsNull];
209 228
    delay: vhdl_expr_t [@default IsNull];
210 229
  }
211
[@@deriving yojson {strict = false}];;
230
[@@deriving show { with_path = false }, yojson {strict = false}];;
212 231

  
213
type process_t =
232
type vhdl_process_t =
214 233
  { 
215 234
    id: vhdl_name_t [@default NoName];
216 235
    declarations: vhdl_declaration_t list option [@key "PROCESS_DECLARATIVE_PART"] [@default Some []];
217 236
    active_sigs: vhdl_name_t list [@default []];
218 237
    body: vhdl_sequential_stmt_t list [@key "PROCESS_STATEMENT_PART"] [@default []]
219 238
  }
220
[@@deriving yojson {strict = false}];;
239
[@@deriving show { with_path = false }, yojson {strict = false}];;
221 240

  
222
type selected_signal_t = 
241
type vhdl_selected_signal_t = 
223 242
  { 
224 243
    postponed: bool [@default false];
225 244
    label: vhdl_name_t [@default NoName];
226 245
    lhs: vhdl_name_t;      (* assigned signal = target *)
227 246
    sel: vhdl_expr_t;  
228
    branches: signal_selection_t list [@default []];
247
    branches: vhdl_signal_selection_t list [@default []];
229 248
    delay: vhdl_expr_t option;
230 249
  }
231
[@@deriving yojson {strict = false}];;
250
[@@deriving show { with_path = false }, yojson {strict = false}];;
232 251
			   
233 252
type vhdl_concurrent_stmt_t =
234
  | SigAssign of conditional_signal_t [@name "CONDITIONAL_SIGNAL_ASSIGNMENT"]
235
  | Process of process_t [@name "PROCESS_STATEMENT"]
236
  | SelectedSig of selected_signal_t [@name "SELECTED_SIGNAL_ASSIGNMENT"]
237
[@@deriving yojson {strict = false}];;
253
  | SigAssign of vhdl_conditional_signal_t [@name "CONDITIONAL_SIGNAL_ASSIGNMENT"]
254
  | Process of vhdl_process_t [@name "PROCESS_STATEMENT"]
255
  | SelectedSig of vhdl_selected_signal_t [@name "SELECTED_SIGNAL_ASSIGNMENT"]
256
[@@deriving show { with_path = false }, yojson {strict = false}];;
238 257
  (*
239 258
type vhdl_statement_t =
240 259
  
......
252 271
  | OutPort    [@name "out"]
253 272
  | InoutPort  [@name "inout"]
254 273
  | BufferPort [@name "buffer"]
255
[@@deriving yojson];;
274
[@@deriving show { with_path = false }, yojson];;
256 275
	     
257 276
type vhdl_port_t =
258 277
  {
......
261 280
    typ: vhdl_subtype_indication_t;
262 281
    expr: vhdl_expr_t [@default IsNull];
263 282
  }
264
[@@deriving yojson {strict = false}];;
283
[@@deriving show { with_path = false }, yojson {strict = false}];;
265 284

  
266 285
type vhdl_entity_t =
267 286
  {
......
271 290
    declaration: vhdl_declaration_t list [@key "ENTITY_DECLARATIVE_PART"] [@default []];
272 291
    stmts: vhdl_concurrent_stmt_t list [@key "ENTITY_STATEMENT_PART"] [@default []]; 
273 292
  }
274
[@@deriving yojson {strict = false}];;
293
[@@deriving show { with_path = false }, yojson {strict = false}];;
275 294

  
276 295
(************************************************************************************)		   
277 296
(*                    Packages / Library loading                                    *)
......
283 302
    name: vhdl_name_t [@default NoName];
284 303
    shared_defs: vhdl_definition_t list [@default []];
285 304
  }
286
[@@deriving yojson {strict = false}];;
305
[@@deriving show { with_path = false }, yojson {strict = false}];;
287 306

  
288 307
type vhdl_load_t = 
289 308
    Library of vhdl_name_t list [@name "LIBRARY_CLAUSE"] [@default []]
290 309
  | Use of vhdl_name_t list [@name "USE_CLAUSE"] [@default []]
291
[@@deriving yojson];;
310
[@@deriving show { with_path = false }, yojson];;
292 311

  
293 312
(************************************************************************************)		   
294 313
(*                        Architecture / VHDL Design                                *)
......
301 320
    declarations: vhdl_declaration_t list [@key "ARCHITECTURE_DECLARATIVE_PART"] [@default []];
302 321
    body: vhdl_concurrent_stmt_t list [@key "ARCHITECTURE_STATEMENT_PART"] [@default []]; 
303 322
  }
304
[@@deriving yojson {strict = false}];;
323
[@@deriving show { with_path = false }, yojson {strict = false}];;
305 324
    
306 325
(* TODO. Configuration is optional *)
307 326
type vhdl_configuration_t = unit
308
[@@deriving yojson {strict = false}];;
327
[@@deriving show { with_path = false }, yojson {strict = false}];;
309 328

  
310 329
type vhdl_library_unit_t = (* TODO: PACKAGE_BODY *)
311 330
    Package of vhdl_package_t [@name "PACKAGE_DECLARATION"]
312 331
  | Entities of vhdl_entity_t [@name "ENTITY_DECLARATION"]
313 332
  | Architecture of vhdl_architecture_t [@name "ARCHITECTURE_BODY"]
314 333
  | Configuration of vhdl_configuration_t [@name "CONFIGURATION_DECLARATION"]
315
[@@deriving yojson {strict = false}];;
334
[@@deriving show { with_path = false }, yojson {strict = false}];;
316 335

  
317 336
type vhdl_design_unit_t =
318 337
  {
319 338
    contexts: vhdl_load_t list [@default []];
320 339
    library: vhdl_library_unit_t;
321 340
  }
322
[@@deriving yojson {strict = false}];;
341
[@@deriving show { with_path = false }, yojson {strict = false}];;
323 342

  
324 343
type vhdl_design_file_t =
325 344
  {
326 345
    design_units: vhdl_design_unit_t list [@default []];
327 346
  }
328
[@@deriving yojson {strict = false}];;
347
[@@deriving show { with_path = false }, yojson {strict = false}];;
329 348

  
330 349
type vhdl_file_t = 
331 350
  {
332 351
    design_file: vhdl_design_file_t [@default {design_units=[]}] [@key "DESIGN_FILE"];
333 352
  }
334
[@@deriving yojson];;
353
[@@deriving show { with_path = false }, yojson];;
src/tools/importer/vhdl_ast_map.ml
1
open Vhdl_ast
2

  
3
let _ = fun (_ : cst_val_t)  -> () 
4
let _ = fun (_ : vhdl_type_t)  -> () 
5
let _ = fun (_ : vhdl_subtype_indication_t)  -> () 
6
let _ = fun (_ : vhdl_discrete_range_t)  -> () 
7
let _ = fun (_ : vhdl_constraint_t)  -> () 
8
let _ = fun (_ : vhdl_definition_t)  -> () 
9
let _ = fun (_ : vhdl_expr_t)  -> () 
10
let _ = fun (_ : vhdl_name_t)  -> () 
11
let _ = fun (_ : vhdl_assoc_element_t)  -> () 
12
let _ = fun (_ : vhdl_element_assoc_t)  -> () 
13
let _ = fun (_ : vhdl_array_attributes_t)  -> () 
14
let _ = fun (_ : vhdl_signal_attributes_t)  -> () 
15
let _ = fun (_ : vhdl_string_attributes_t)  -> () 
16
let _ = fun (_ : vhdl_suffix_selection_t)  -> () 
17
let _ = fun (_ : 'basetype vhdl_type_attributes_t)  -> () 
18
let _ = fun (_ : vhdl_parameter_t)  -> () 
19
let _ = fun (_ : vhdl_subprogram_spec_t)  -> () 
20
let _ = fun (_ : vhdl_sequential_stmt_t)  -> () 
21
let _ = fun (_ : vhdl_if_case_t)  -> () 
22
let _ = fun (_ : vhdl_case_item_t)  -> () 
23
let _ = fun (_ : vhdl_declaration_t)  -> () 
24
let _ = fun (_ : vhdl_signal_selection_t)  -> () 
25
let _ = fun (_ : vhdl_signal_condition_t)  -> () 
26
let _ = fun (_ : vhdl_conditional_signal_t)  -> () 
27
let _ = fun (_ : vhdl_process_t)  -> () 
28
let _ = fun (_ : vhdl_selected_signal_t)  -> () 
29
let _ = fun (_ : vhdl_port_mode_t)  -> () 
30
let _ = fun (_ : vhdl_concurrent_stmt_t)  -> () 
31
let _ = fun (_ : vhdl_port_t)  -> () 
32
let _ = fun (_ : vhdl_entity_t)  -> () 
33
let _ = fun (_ : vhdl_package_t)  -> () 
34
let _ = fun (_ : vhdl_load_t)  -> () 
35
let _ = fun (_ : vhdl_architecture_t)  -> () 
36
let _ = fun (_ : vhdl_configuration_t)  -> () 
37
let _ = fun (_ : vhdl_library_unit_t)  -> () 
38
let _ = fun (_ : vhdl_design_unit_t)  -> () 
39
let _ = fun (_ : vhdl_design_file_t)  -> () 
40
let _ = fun (_ : vhdl_file_t)  -> () 
41

  
42
class virtual vhdl_map =
43
  object (self)
44
    method virtual  string : string -> string
45
    method virtual  list : 'a . ('a -> 'a) -> 'a list -> 'a list
46
    method virtual  unit : unit -> unit
47
    method virtual  bool : bool -> bool
48
    method virtual  option : 'a . ('a -> 'a) -> 'a option -> 'a option
49
    method virtual  int : int -> int
50
    method virtual  vhdl_name_t : vhdl_name_t -> vhdl_name_t
51
    method virtual  vhdl_definition_t : vhdl_definition_t -> vhdl_definition_t
52
    method virtual  vhdl_port_t : vhdl_port_t -> vhdl_port_t
53
    method virtual  vhdl_expr_t : vhdl_expr_t -> vhdl_expr_t
54
    method virtual  vhdl_port_mode_t : vhdl_port_mode_t -> vhdl_port_mode_t
55
    method virtual  vhdl_subtype_indication_t : vhdl_subtype_indication_t -> vhdl_subtype_indication_t
56
    method virtual  vhdl_conditional_signal_t : vhdl_conditional_signal_t -> vhdl_conditional_signal_t
57
    method virtual  vhdl_process_t : vhdl_process_t -> vhdl_process_t
58
    method virtual  vhdl_selected_signal_t : vhdl_selected_signal_t -> vhdl_selected_signal_t
59
    method virtual  vhdl_signal_selection_t : vhdl_signal_selection_t -> vhdl_signal_selection_t
60
    method virtual  vhdl_suffix_selection_t : vhdl_suffix_selection_t -> vhdl_suffix_selection_t
61
    method virtual  vhdl_declaration_t : vhdl_declaration_t -> vhdl_declaration_t
62
    method virtual  vhdl_sequential_stmt_t : vhdl_sequential_stmt_t -> vhdl_sequential_stmt_t
63
    method virtual  vhdl_signal_condition_t : vhdl_signal_condition_t -> vhdl_signal_condition_t
64
    method virtual  cst_val_t : cst_val_t -> cst_val_t
65
    method virtual  vhdl_subprogram_spec_t : vhdl_subprogram_spec_t -> vhdl_subprogram_spec_t
66
    method virtual  vhdl_discrete_range_t : vhdl_discrete_range_t -> vhdl_discrete_range_t
67
    method virtual  vhdl_parameter_t : vhdl_parameter_t -> vhdl_parameter_t
68
    method virtual  vhdl_concurrent_stmt_t : vhdl_concurrent_stmt_t -> vhdl_concurrent_stmt_t
69
    method virtual  vhdl_declaration_t : vhdl_declaration_t -> vhdl_declaration_t
70
    method virtual  vhdl_architecture_t : vhdl_architecture_t -> vhdl_architecture_t
71
    method virtual  vhdl_configuration_t : vhdl_configuration_t -> vhdl_configuration_t
72
    method virtual  vhdl_entity_t : vhdl_entity_t -> vhdl_entity_t
73
    method virtual  vhdl_package_t : vhdl_package_t -> vhdl_package_t
74
    method virtual  vhdl_library_unit_t : vhdl_library_unit_t -> vhdl_library_unit_t
75
    method virtual  vhdl_load_t : vhdl_load_t -> vhdl_load_t
76
    method virtual  vhdl_design_unit_t : vhdl_design_unit_t -> vhdl_design_unit_t
77
    method virtual  vhdl_design_file_t : vhdl_design_file_t -> vhdl_design_file_t
78

  
79
    method cst_val_t : cst_val_t -> cst_val_t=
80
      fun x  ->
81
        match x with
82
        | CstInt a -> let a = self#int a  in CstInt a
83
        | CstStdLogic a -> let a = self#string a  in CstStdLogic a
84
        | CstLiteral a -> let a = self#string a  in CstLiteral a
85

  
86
    method vhdl_type_t : vhdl_type_t -> vhdl_type_t=
87
      fun x  ->
88
        match x with
89
        | Base a -> let a = self#string a  in Base a
90
        | Range (a,b,c) ->
91
            let a = self#option self#string a  in
92
            let b = self#int b  in let c = self#int c  in Range (a, b, c)
93
        | Bit_vector (a,b) ->
94
            let a = self#int a  in let b = self#int b  in Bit_vector (a, b)
95
        | Array (a,b,c) ->
96
            let a = self#int a  in
97
            let b = self#int b  in
98
            let c = self#vhdl_type_t c  in Array (a, b, c)
99
        | Enumerated a -> let a = self#list self#string a  in Enumerated a
100
        | Void  -> Void
101
    method vhdl_subtype_indication_t :
102
      vhdl_subtype_indication_t -> vhdl_subtype_indication_t=
103
      fun { name; functionName; const }  ->
104
        let name = self#vhdl_name_t name  in
105
        let functionName = self#vhdl_name_t functionName  in
106
        let const = self#vhdl_constraint_t const  in
107
        { name; functionName; const }
108
    method vhdl_discrete_range_t :
109
      vhdl_discrete_range_t -> vhdl_discrete_range_t=
110
      fun x  ->
111
        match x with
112
        | SubDiscreteRange a ->
113
            let a = self#vhdl_subtype_indication_t a  in SubDiscreteRange a
114
        | NamedRange a -> let a = self#vhdl_name_t a  in NamedRange a
115
        | DirectedRange { direction; from; _to } ->
116
            let direction = self#string direction  in
117
            let from = self#vhdl_expr_t from  in
118
            let _to = self#vhdl_expr_t _to  in
119
            DirectedRange { direction; from; _to }
120

  
121
    method vhdl_constraint_t : vhdl_constraint_t -> vhdl_constraint_t=
122
      fun x  ->
123
        match x with
124
        | RefConstraint { ref_name } ->
125
            let ref_name = self#vhdl_name_t ref_name  in
126
            RefConstraint { ref_name }
127
        | RangeConstraint { range } ->
128
            let range = self#vhdl_discrete_range_t range  in
129
            RangeConstraint { range }
130
        | IndexConstraint { ranges } ->
131
            let ranges = self#list self#vhdl_discrete_range_t ranges  in
132
            IndexConstraint { ranges }
133
        | ArrayConstraint { ranges; sub } ->
134
            let ranges = self#list self#vhdl_discrete_range_t ranges  in
135
            let sub = self#vhdl_constraint_t sub  in
136
            ArrayConstraint { ranges; sub }
137
        | RecordConstraint  -> RecordConstraint
138
        | NoConstraint  -> NoConstraint
139

  
140
    method vhdl_definition_t : vhdl_definition_t -> vhdl_definition_t=
141
      fun x  ->
142
        match x with
143
        | Type { name; definition } ->
144
            let name = self#vhdl_name_t name  in
145
            let definition = self#vhdl_type_t definition  in
146
            Type { name; definition }
147
        | Subtype { name; typ } ->
148
            let name = self#vhdl_name_t name  in
149
            let typ = self#vhdl_subtype_indication_t typ  in
150
            Subtype { name; typ }
151
    method vhdl_expr_t : vhdl_expr_t -> vhdl_expr_t=
152
      fun x  ->
153
        match x with
154
        | Call a -> let a = self#vhdl_name_t a  in Call a
155
        | Cst a -> let a = self#cst_val_t a  in Cst a
156
        | Op { id; args } ->
157
            let id = self#string id  in
158
            let args = self#list self#vhdl_expr_t args  in Op { id; args }
159
        | IsNull  -> IsNull
160
        | Time { value; phy_unit } ->
161
            let value = self#int value  in
162
            let phy_unit = self#string phy_unit  in Time { value; phy_unit }
163
        | Sig { name; att } ->
164
            let name = self#vhdl_name_t name  in
165
            let att = self#option self#vhdl_signal_attributes_t att  in
166
            Sig { name; att }
167
        | SuffixMod { expr; selection } ->
168
            let expr = self#vhdl_expr_t expr  in
169
            let selection = self#vhdl_suffix_selection_t selection  in
170
            SuffixMod { expr; selection }
171
        | Aggregate { elems } ->
172
            let elems = self#list self#vhdl_element_assoc_t elems  in
173
            Aggregate { elems }
174
        | Others  -> Others
175
    method vhdl_name_t : vhdl_name_t -> vhdl_name_t=
176
      fun x  ->
177
        match x with
178
        | Simple a -> let a = self#string a  in Simple a
179
        | Identifier a -> let a = self#string a  in Identifier a
180
        | Selected a -> let a = self#list self#vhdl_name_t a  in Selected a
181
        | Index { id; exprs } ->
182
            let id = self#vhdl_name_t id  in
183
            let exprs = self#list self#vhdl_expr_t exprs  in
184
            Index { id; exprs }
185
        | Slice { id; range } ->
186
            let id = self#vhdl_name_t id  in
187
            let range = self#vhdl_discrete_range_t range  in
188
            Slice { id; range }
189
        | Attribute { id; designator; expr } ->
190
            let id = self#vhdl_name_t id  in
191
            let designator = self#vhdl_name_t designator  in
192
            let expr = self#vhdl_expr_t expr  in
193
            Attribute { id; designator; expr }
194
        | Function { id; assoc_list } ->
195
            let id = self#vhdl_name_t id  in
196
            let assoc_list = self#list self#vhdl_assoc_element_t assoc_list
197
               in
198
            Function { id; assoc_list }
199
        | NoName  -> NoName
200
    method vhdl_assoc_element_t :
201
      vhdl_assoc_element_t -> vhdl_assoc_element_t=
202
      fun
203
        { formal_name; formal_arg; actual_name; actual_designator;
204
          actual_expr }
205
         ->
206
        let formal_name = self#option self#vhdl_name_t formal_name  in
207
        let formal_arg = self#option self#vhdl_name_t formal_arg  in
208
        let actual_name = self#option self#vhdl_name_t actual_name  in
209
        let actual_designator =
210
          self#option self#vhdl_name_t actual_designator  in
211
        let actual_expr = self#option self#vhdl_expr_t actual_expr  in
212
        {
213
          formal_name;
214
          formal_arg;
215
          actual_name;
216
          actual_designator;
217
          actual_expr
218
        }
219
    method vhdl_element_assoc_t :
220
      vhdl_element_assoc_t -> vhdl_element_assoc_t=
221
      fun { choices; expr }  ->
222
        let choices = self#list self#vhdl_expr_t choices  in
223
        let expr = self#vhdl_expr_t expr  in { choices; expr }
224
    method vhdl_array_attributes_t :
225
      vhdl_array_attributes_t -> vhdl_array_attributes_t=
226
      fun x  ->
227
        match x with
228
        | AAttInt { id; arg } ->
229
            let id = self#string id  in
230
            let arg = self#int arg  in AAttInt { id; arg }
231
        | AAttAscending  -> AAttAscending
232
    method vhdl_signal_attributes_t :
233
      vhdl_signal_attributes_t -> vhdl_signal_attributes_t=
234
      fun x  -> match x with | SigAtt a -> let a = self#string a  in SigAtt a
235
    method vhdl_string_attributes_t :
236
      vhdl_string_attributes_t -> vhdl_string_attributes_t=
237
      fun x  ->
238
        match x with | StringAtt a -> let a = self#string a  in StringAtt a
239
    method vhdl_suffix_selection_t : vhdl_suffix_selection_t -> vhdl_suffix_selection_t=
240
      fun x  ->
241
        match x with
242
        | Idx a -> let a = self#int a  in Idx a
243
        | SuffixRange (a,b) ->
244
            let a = self#int a  in let b = self#int b  in SuffixRange (a, b)
245

  
246
    method vhdl_type_attributes_t :
247
      'a .
248
        ('a -> 'a) -> 'a vhdl_type_attributes_t -> 'a vhdl_type_attributes_t=
249
      fun _basetype  ->
250
        fun x  ->
251
          match x with
252
          | TAttNoArg { id } -> let id = self#string id  in TAttNoArg { id }
253
          | TAttIntArg { id; arg } ->
254
              let id = self#string id  in
255
              let arg = self#int arg  in TAttIntArg { id; arg }
256
          | TAttValArg { id; arg } ->
257
              let id = self#string id  in
258
              let arg = _basetype arg  in TAttValArg { id; arg }
259
          | TAttStringArg { id; arg } ->
260
              let id = self#string id  in
261
              let arg = self#string arg  in TAttStringArg { id; arg }
262

  
263
    method vhdl_parameter_t : vhdl_parameter_t -> vhdl_parameter_t=
264
      fun { names; mode; typ; init_val }  ->
265
        let names = self#list self#vhdl_name_t names  in
266
        let mode = self#list self#string mode  in
267
        let typ = self#vhdl_subtype_indication_t typ  in
268
        let init_val = self#option self#cst_val_t init_val  in
269
        { names; mode; typ; init_val }
270

  
271
    method vhdl_subprogram_spec_t :
272
      vhdl_subprogram_spec_t -> vhdl_subprogram_spec_t=
273
      fun { name; typeMark; parameters; isPure }  ->
274
        let name = self#string name  in
275
        let typeMark = self#vhdl_name_t typeMark  in
276
        let parameters = self#list self#vhdl_parameter_t parameters  in
277
        let isPure = self#bool isPure  in
278
        { name; typeMark; parameters; isPure }
279

  
280
    method vhdl_sequential_stmt_t :
281
      vhdl_sequential_stmt_t -> vhdl_sequential_stmt_t=
282
      fun x  ->
283
        match x with
284
        | VarAssign { label; lhs; rhs } ->
285
            let label = self#vhdl_name_t label  in
286
            let lhs = self#vhdl_name_t lhs  in
287
            let rhs = self#vhdl_expr_t rhs  in VarAssign { label; lhs; rhs }
288
        | SigSeqAssign { label; lhs; rhs } ->
289
            let label = self#vhdl_name_t label  in
290
            let lhs = self#vhdl_name_t lhs  in
291
            let rhs = self#list self#vhdl_expr_t rhs  in
292
            SigSeqAssign { label; lhs; rhs }
293
        | If { label; if_cases; default } ->
294
            let label = self#vhdl_name_t label  in
295
            let if_cases = self#list self#vhdl_if_case_t if_cases  in
296
            let default = self#list self#vhdl_sequential_stmt_t default  in
297
            If { label; if_cases; default }
298
        | Case { label; guard; branches } ->
299
            let label = self#vhdl_name_t label  in
300
            let guard = self#vhdl_expr_t guard  in
301
            let branches = self#list self#vhdl_case_item_t branches  in
302
            Case { label; guard; branches }
303
        | Exit { label; loop_label; condition } ->
304
            let label = self#vhdl_name_t label  in
305
            let loop_label = self#option self#string loop_label  in
306
            let condition = self#option self#vhdl_expr_t condition  in
307
            Exit { label; loop_label; condition }
308
        | Assert { label; cond; report; severity } ->
309
            let label = self#vhdl_name_t label  in
310
            let cond = self#vhdl_expr_t cond  in
311
            let report = self#vhdl_expr_t report  in
312
            let severity = self#vhdl_expr_t severity  in
313
            Assert { label; cond; report; severity }
314
        | Wait  -> Wait
315
        | Null { label } ->
316
            let label = self#vhdl_name_t label  in Null { label }
317
        | Return { label } ->
318
            let label = self#vhdl_name_t label  in Return { label }
319
    method vhdl_if_case_t : vhdl_if_case_t -> vhdl_if_case_t=
320
      fun { if_cond; if_block }  ->
321
        let if_cond = self#vhdl_expr_t if_cond  in
322
        let if_block = self#list self#vhdl_sequential_stmt_t if_block  in
323
        { if_cond; if_block }
324
    method vhdl_case_item_t : vhdl_case_item_t -> vhdl_case_item_t=
325
      fun { when_cond; when_stmt }  ->
326
        let when_cond = self#list self#vhdl_expr_t when_cond  in
327
        let when_stmt = self#list self#vhdl_sequential_stmt_t when_stmt  in
328
        { when_cond; when_stmt }
329

  
330
    method vhdl_declaration_t : vhdl_declaration_t -> vhdl_declaration_t=
331
      fun x  ->
332
        match x with
333
        | VarDecl { names; typ; init_val } ->
334
            let names = self#list self#vhdl_name_t names  in
335
            let typ = self#vhdl_subtype_indication_t typ  in
336
            let init_val = self#option self#cst_val_t init_val  in
337
            VarDecl { names; typ; init_val }
338
        | CstDecl { names; typ; init_val } ->
339
            let names = self#list self#vhdl_name_t names  in
340
            let typ = self#vhdl_subtype_indication_t typ  in
341
            let init_val = self#cst_val_t init_val  in
342
            CstDecl { names; typ; init_val }
343
        | SigDecl { names; typ; init_val } ->
344
            let names = self#list self#vhdl_name_t names  in
345
            let typ = self#vhdl_subtype_indication_t typ  in
346
            let init_val = self#option self#cst_val_t init_val  in
347
            SigDecl { names; typ; init_val }
348
        | Subprogram { name; kind; spec; decl_part; stmts } ->
349
            let name = self#vhdl_name_t name  in
350
            let kind = self#string kind  in
351
            let spec = self#vhdl_subprogram_spec_t spec  in
352
            let decl_part = self#list self#vhdl_declaration_t decl_part  in
353
            let stmts = self#list self#vhdl_sequential_stmt_t stmts  in
354
            Subprogram { name; kind; spec; decl_part; stmts }
355

  
356
    method vhdl_signal_condition_t : vhdl_signal_condition_t -> vhdl_signal_condition_t=
357
      fun { expr; cond }  ->
358
        let expr = self#list self#vhdl_expr_t expr  in
359
        let cond = self#vhdl_expr_t cond  in { expr; cond }
360

  
361
    method vhdl_signal_selection_t : vhdl_signal_selection_t -> vhdl_signal_selection_t=
362
      fun { expr; when_sel }  ->
363
        let expr = self#vhdl_expr_t expr  in
364
        let when_sel = self#list self#vhdl_expr_t when_sel  in
365
        { expr; when_sel }
366

  
367
    method vhdl_conditional_signal_t :
368
      vhdl_conditional_signal_t -> vhdl_conditional_signal_t=
369
      fun { postponed; label; lhs; rhs; cond; delay }  ->
370
        let postponed = self#bool postponed  in
371
        let label = self#vhdl_name_t label  in
372
        let lhs = self#vhdl_name_t lhs  in
373
        let rhs = self#list self#vhdl_signal_condition_t rhs  in
374
        let cond = self#vhdl_expr_t cond  in
375
        let delay = self#vhdl_expr_t delay  in
376
        { postponed; label; lhs; rhs; cond; delay }
377

  
378

  
379
    method vhdl_process_t : vhdl_process_t -> vhdl_process_t=
380
      fun { id; declarations; active_sigs; body }  ->
381
        let id = self#vhdl_name_t id  in
382
        let declarations =
383
          self#option (self#list self#vhdl_declaration_t) declarations  in
384
        let active_sigs = self#list self#vhdl_name_t active_sigs  in
385
        let body = self#list self#vhdl_sequential_stmt_t body  in
386
        { id; declarations; active_sigs; body }
387

  
388
    method vhdl_selected_signal_t : vhdl_selected_signal_t -> vhdl_selected_signal_t=
389
      fun { postponed; label; lhs; sel; branches; delay }  ->
390
        let postponed = self#bool postponed  in
391
        let label = self#vhdl_name_t label  in
392
        let lhs = self#vhdl_name_t lhs  in
393
        let sel = self#vhdl_expr_t sel  in
394
        let branches = self#list self#vhdl_signal_selection_t branches  in
395
        let delay = self#option self#vhdl_expr_t delay  in
396
        { postponed; label; lhs; sel; branches; delay }
397

  
398
    method vhdl_port_mode_t : vhdl_port_mode_t -> vhdl_port_mode_t=
399
      fun x  -> x
400

  
401
    method vhdl_concurrent_stmt_t :
402
      vhdl_concurrent_stmt_t -> vhdl_concurrent_stmt_t=
403
      fun x  ->
404
        match x with
405
        | SigAssign a -> let a = self#vhdl_conditional_signal_t a  in SigAssign a
406
        | Process a -> let a = self#vhdl_process_t a  in Process a
407
        | SelectedSig a -> let a = self#vhdl_selected_signal_t a  in SelectedSig a
408

  
409
    method vhdl_port_t : vhdl_port_t -> vhdl_port_t=
410
      fun { names; mode; typ; expr }  ->
411
        let names = self#list self#vhdl_name_t names  in
412
        let mode = self#vhdl_port_mode_t mode  in
413
        let typ = self#vhdl_subtype_indication_t typ  in
414
        let expr = self#vhdl_expr_t expr  in { names; mode; typ; expr }
415

  
416
    method vhdl_entity_t : vhdl_entity_t -> vhdl_entity_t=
417
      fun { name; generics; ports; declaration; stmts }  ->
418
        let name = self#vhdl_name_t name  in
419
        let generics = self#list self#vhdl_port_t generics  in
420
        let ports = self#list self#vhdl_port_t ports  in
421
        let declaration = self#list self#vhdl_declaration_t declaration  in
422
        let stmts = self#list self#vhdl_concurrent_stmt_t stmts  in
423
        { name; generics; ports; declaration; stmts }
424

  
425
    method vhdl_package_t : vhdl_package_t -> vhdl_package_t=
426
      fun { name; shared_defs }  ->
427
        let name = self#vhdl_name_t name  in
428
        let shared_defs = self#list self#vhdl_definition_t shared_defs  in
429
        { name; shared_defs }
430

  
431
    method vhdl_load_t : vhdl_load_t -> vhdl_load_t=
432
      fun x  ->
433
        match x with
434
        | Library a -> let a = self#list self#vhdl_name_t a  in Library a
435
        | Use a -> let a = self#list self#vhdl_name_t a  in Use a
436

  
437
    method vhdl_architecture_t : vhdl_architecture_t -> vhdl_architecture_t=
438
      fun { name; entity; declarations; body }  ->
439
        let name = self#vhdl_name_t name  in
440
        let entity = self#vhdl_name_t entity  in
441
        let declarations = self#list self#vhdl_declaration_t declarations  in
442
        let body = self#list self#vhdl_concurrent_stmt_t body  in
443
        { name; entity; declarations; body }
444

  
445
    method vhdl_configuration_t :
446
      vhdl_configuration_t -> vhdl_configuration_t= self#unit
447

  
448
    method vhdl_library_unit_t : vhdl_library_unit_t -> vhdl_library_unit_t=
449
      fun x  ->
450
        match x with
451
        | Package a -> let a = self#vhdl_package_t a  in Package a
452
        | Entities a -> let a = self#vhdl_entity_t a  in Entities a
453
        | Architecture a ->
454
            let a = self#vhdl_architecture_t a  in Architecture a
455
        | Configuration a ->
456
            let a = self#vhdl_configuration_t a  in Configuration a
457

  
458
    method vhdl_design_unit_t : vhdl_design_unit_t -> vhdl_design_unit_t=
459
      fun { contexts; library }  ->
460
        let contexts = self#list self#vhdl_load_t contexts  in
461
        let library = self#vhdl_library_unit_t library  in
462
        { contexts; library }
463

  
464
    method vhdl_design_file_t : vhdl_design_file_t -> vhdl_design_file_t=
465
      fun { design_units }  ->
466
        let design_units = self#list self#vhdl_design_unit_t design_units  in
467
        { design_units }
468

  
469
    method vhdl_file_t : vhdl_file_t -> vhdl_file_t=
470
      fun { design_file }  ->
471
        let design_file = self#vhdl_design_file_t design_file  in
472
        { design_file }
473
  end
src/tools/importer/vhdl_ast_utils.ml
1
open Vhdl_ast_map
2
open Vhdl_ast
3
open Ppxlib_traverse_builtins
4

  
5
let any x = x
6

  
7
let replace_op_expr = object (self)
8
  inherit Ppxlib_traverse_builtins.map
9
  inherit vhdl_map as super
10

  
11
  method unit: unit T.map = any
12

  
13
  method vhdl_expr_t = function
14
    | Op ({id=""; args=hd::[]}) -> self#vhdl_expr_t hd
15
    | x -> super#vhdl_expr_t x
16
end
17

  
src/tools/importer/vhdl_json_lib.ml
1
open Yojson.Safe
2
open Yojson.Safe.Util
3

  
4
let rec assoc_map_except_str l f str =
5
  match l with
6
  | (s,x)::y -> 
7
    if (String.equal s str) then 
8
      assoc_map_except_str y f str
9
    else
10
      (s,f str x)::assoc_map_except_str y f str
11
  | [] -> []
12

  
13
let rec map_2_args f l arg1 =
14
  match l with
15
  | hd::tl -> (f arg1 hd)::(map_2_args f tl arg1)
16
  | [] -> []
17

  
18
(*
19
Remove `Assoc nodes with tag 'str' in json j
20
*)
21
let rec prune_str str json =
22
  match json with
23
    | `Assoc ((t,hd)::tl) -> 
24
      if (String.equal str t) then
25
        `Assoc (assoc_map_except_str tl prune_str str)
26
      else
27
        `Assoc ((t, prune_str str hd)::(assoc_map_except_str tl prune_str str))
28
    | `List (hd::tl) -> `List ((prune_str str hd)::(map_2_args prune_str tl str))
29
    | `String (s) -> if (String.equal str s) then `String ("") else `String (s)
30
    | x -> x
31

  
32
(*******************)
33

  
34
let rec name_pair_list_to_string l =
35
  match l with
36
  | (t, `String(x))::tl -> 
37
    if (String.equal t "name") then 
38
      (x::name_pair_list_to_string tl) 
39
    else 
40
      (name_pair_list_to_string tl)
41
  | _ -> []
42

  
43
let rec assoc_filter_string l str =
44
  match l with
45
  | `Assoc (x) -> name_pair_list_to_string x
46
  | _ -> []
47

  
48
(********************)
49

  
50
let rec pairlist_remove str l f =
51
  match l with
52
  | (t,j)::tl ->
53
    if (String.equal t str) then
54
      (f j)::(pairlist_remove str tl f)
55
    else
56
      `Assoc ((t, f j)::[])::(pairlist_remove str tl f)
57
  | [] -> []
58

  
59
(******************)
60
let rec assoc_elem_fst pair_list = 
61
  match pair_list with 
62
  | (t,j)::tl -> t::(assoc_elem_fst tl)
63
  | [] -> []
64

  
65
let rec assoc_elem_snd pair_list = 
66
  match pair_list with 
67
  | (t,j)::tl -> j::(assoc_elem_snd tl) 
68
  | [] -> []
69

  
70
let rec assoc_elem_filter pair_list str = 
71
  match pair_list with 
72
  | (t,j)::tl -> if (String.equal t str) then 
73
                    (t,j)::(assoc_elem_filter tl str) 
74
                  else assoc_elem_filter tl str
75
  | [] -> []
76

  
77
let rec assoc_elem_filternot pair_list str = 
78
  match pair_list with 
79
  | (t,j)::tl -> if (not (String.equal t str)) then 
80
                    (t,j)::(assoc_elem_filternot tl str) 
81
                  else assoc_elem_filternot tl str
82
  | [] -> []
83

  
84
let rec assoc_elem_filter_snd pair_list str = 
85
  match pair_list with 
86
  | (t,j)::tl -> if (String.equal t str) then 
87
                    j::(assoc_elem_filter_snd tl str) 
88
                  else assoc_elem_filter_snd tl str
89
  | [] -> []
90

  
91
let rec assoc_elem_filternot_snd pair_list str = 
92
  match pair_list with 
93
  | (t,j)::tl -> if (not (String.equal t str)) then 
94
                    j::(assoc_elem_filter_snd tl str) 
95
                  else assoc_elem_filter_snd tl str
96
  | [] -> []
97

  
98
let rec pairlist_snd_as_list pair_list str = 
99
  match pair_list with 
100
  | (t,j)::tl -> if (String.equal t str) then 
101
                    (t,`List (j::[]))::(pairlist_snd_as_list tl str)
102
                  else (t,j)::(pairlist_snd_as_list tl str)
103
  | [] -> []
104

  
105
let all_members str json =
106
  match json with
107
  | `Assoc (l) -> assoc_elem_filter_snd l str
108
  | _ -> []
109

  
110
let retain_other_members str json =
111
  match json with
112
  | `Assoc (l) -> `Assoc (assoc_elem_filter l str)
113
  | _ -> `Null
114

  
115
(*
116
DESIGN_UNIT as lists
117
*)
118
let vhdl_json_designunits_content_as_list json =
119
  let designunits_contents = json |> member "DESIGN_FILE" |> all_members "DESIGN_UNIT" in
120
  `List designunits_contents
121

  
122
let vhdl_json_designfile_content_excluding json str =
123
  json |> member "DESIGN_FILE" |> retain_other_members "DESIGN_UNIT" 
124

  
125
let vhdl_json_list_designunits json =
126
  let designunits_list = vhdl_json_designunits_content_as_list json in
127
  `Assoc (("DESIGN_FILE", (`Assoc (("DESIGN_UNIT", designunits_list)::[])))::[])
128

  
129
let rec pairlist_contains_str str l =
130
  match l with
131
  | (t,j)::tl -> if (String.equal t str) then true else pairlist_contains_str str tl
132
  | [] -> false
133

  
134
(*
135
ITEM element content as list
136
*)
137
let assoc_elem_as_list str json =
138
  match json with
139
  | `Assoc (l) -> `Assoc (pairlist_snd_as_list l str)
140
  | x -> x
141

  
142
let rec map_list map_f l f =
143
  match l with
144
  | hd::tl -> (map_f (f hd) f)::(map_list map_f tl f)
145
  | [] -> []
146

  
147
let rec map_pairlist map_f l f =
148
  match l with
149
  | (t,j)::tl -> (t, map_f (f j) f)::(map_pairlist map_f tl f)
150
  | [] -> []
151

  
152
let rec map_snd f l =
153
  match l with
154
  | (t,j)::tl -> (t,f j)::(map_snd f tl)
155
  | [] -> []
156

  
157
let rec map_all json f =
158
  match json with
159
  | `Assoc ((t,j)::tl) -> 
160
    `Assoc ((t,(map_all (f j) f))::(map_pairlist map_all tl f))
161
  | `List (hd::tl) -> 
162
    `List ((map_all (f hd) f)::(map_list map_all tl f))
163
  | x -> x
164

  
165
let numeric_literal_simpl json =
166
  match json with
167
  | `Assoc (("NUMERIC_LITERAL", `Assoc (("TOKEN", `Assoc (("text", `String(x))::[]))::[]))::[]) -> `String (x)
168
  | x -> x
169

  
170
let flatten_numeric_literal json =
171
  map_all json (numeric_literal_simpl)
172

  
173
let to_list_str str json =
174
  map_all json (assoc_elem_as_list str)
175

  
176
let rec to_list_content_str str json =
177
  match json with
178
  | `Assoc (l) -> if (pairlist_contains_str str l) then
179
      `Assoc (
180
         (str, to_list_content_str str (`List (assoc_elem_filter_snd l str)))
181
         ::(assoc_elem_filternot (map_snd (to_list_content_str str) l) str)
182
      )
183
    else 
184
      `Assoc (map_snd (to_list_content_str str) l)
185
  | `List (hd::tl) -> `List ((to_list_content_str str hd)::(List.map (to_list_content_str str) tl))
186
  | x -> x
187

  
188
let rec prune_null_assoc json =
189
  match json with
190
  | `Assoc ((t, `Assoc([]))::tl) -> prune_null_assoc (`Assoc tl)
191
  | `Assoc ((t, `Null)::tl) -> prune_null_assoc (`Assoc tl)
192
  | `Assoc ((t, j)::tl) -> `Assoc ((t, (prune_null_assoc j))::(map_snd prune_null_assoc tl))
193
  | `List (`Null::[]) -> `Null
194
  | `List (l) -> `List (List.map prune_null_assoc l)
195
  | x -> x
196

  
197
(*
198
Value printers
199
*)
200
let rec print_depth json depth indent =
201
  if (depth > 0) then
202
    match json with
203
    | `Assoc ((t,j)::tl) -> 
204
      (indent^t)::(List.append (print_depth j (depth-1) (indent^"  "))
205
                               (print_depth (`Assoc (tl)) depth indent))
206
    | `List (hd::tl) ->
207
      List.append (print_depth hd depth indent)
208
                  (print_depth (`List (tl)) depth indent)
209
    | `String (s) -> (indent^s)::[]
210
    | _ -> []
211
  else
212
    []
213

  
214
let rec flatten_ivd json =
215
  match json with
216
  | `Assoc ((t, `List (l))::[]) -> if (String.equal t "INTERFACE_VARIABLE_DECLARATION") then
217
      `List (List.map flatten_ivd l) else `Assoc ((t, flatten_ivd (`List(l)))::[])
218
  | `Assoc (l) -> `Assoc (map_snd flatten_ivd l)
219
  | `List (hd::tl) -> `List((flatten_ivd hd)::(List.map flatten_ivd tl))
220
  | x -> x
221

  
222
(*
223
let do_stuff json =
224
  match json with
225
  | `Assoc ((t,j)::tl) -> 
226
  | `List (hd::tl) ->
227
  | `String (s) ->
228
  | _ -> x
229
*)

Also available in: Unified diff