Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

lustrec / src / tools / importer / vhdl_ast.ml @ e1102543

History | View | Annotate | Download (14.8 KB)

1 55963629 Arnaud Dieumegard
let base_types = ["integer"; "character"; "bit"; "real"; "natural"; "positive"; "std_logic"; "std_logic_vector" ]
2 62b6a61c Arnaud Dieumegard
 
3 55963629 Arnaud Dieumegard
(************************************************************************************)		   
4
(*                     Constants                                                    *)
5
(************************************************************************************)		   
6
7
(* Std_logic values :
8
    'U': uninitialized. This signal hasn't been set yet.
9
    'X': unknown. Impossible to determine this value/result.
10
    '0': logic 0
11
    '1': logic 1
12
    'Z': High Impedance
13
    'W': Weak signal, can't tell if it should be 0 or 1.
14
    'L': Weak signal that should probably go to 0
15
    'H': Weak signal that should probably go to 1
16
    '-': Don't care. *)			       
17
let std_logic_cst = ["U"; "X"; "0"; "1"; "Z"; "W"; "L"; "H"; "-" ]
18 fbc571e6 Arnaud Dieumegard
let literal_base = ["B"; "O"; "X"; "UB"; "UO"; "UX"; "SB"; "SO"; "SX"; "D"] (* Prefix of CstLiteral *)
19 55963629 Arnaud Dieumegard
20
(* TODO: do we need more constructors ? *)
21 e1102543 Arnaud Dieumegard
type vhdl_cst_val_t = 
22 fbc571e6 Arnaud Dieumegard
    CstInt of int 
23
  | CstStdLogic of string
24
  | CstLiteral of string [@name "CST_LITERAL"]
25 d3f0059e Arnaud Dieumegard
[@@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
*)
34 55963629 Arnaud Dieumegard
35 62b6a61c Arnaud Dieumegard
type vhdl_type_t =
36
  | Base of string
37
  | Range of string option * int * int
38
  | Bit_vector of int * int
39
  | Array of int * int * vhdl_type_t
40
  | Enumerated of string list
41
  | Void
42
and vhdl_subtype_indication_t =
43 d77323b8 Arnaud Dieumegard
  {
44 62b6a61c Arnaud Dieumegard
    name : vhdl_name_t [@default NoName];
45
    functionName : vhdl_name_t [@default NoName];
46
    const: vhdl_constraint_t [@default NoConstraint];
47 d77323b8 Arnaud Dieumegard
  }
48 62b6a61c Arnaud Dieumegard
and vhdl_discrete_range_t =
49
  | SubDiscreteRange of vhdl_subtype_indication_t [@name "SUB_DISCRETE_RANGE"]
50
  | NamedRange of vhdl_name_t [@name "NAMED_RANGE"]
51
  | DirectedRange of { direction: string; from: vhdl_expr_t; _to: vhdl_expr_t } [@name "RANGE_WITH_DIRECTION"]
52
and vhdl_constraint_t =
53
  | RefConstraint of { ref_name: vhdl_name_t; }
54
  | RangeConstraint of { range: vhdl_discrete_range_t } [@name "RANGE_CONSTRAINT"]
55
  | IndexConstraint of { ranges: vhdl_discrete_range_t list; } [@name "INDEX_CONSTRAINT"]
56
  | ArrayConstraint of { ranges: vhdl_discrete_range_t list; sub: vhdl_constraint_t } [@name "ARRAY_CONSTRAINT"]
57
  | RecordConstraint
58
  | NoConstraint
59
and vhdl_definition_t =
60
  | Type of {name : vhdl_name_t ; definition: vhdl_type_t} [@name "TYPE_DECLARATION"]
61
  | Subtype of {name : vhdl_name_t ; typ : vhdl_subtype_indication_t} [@name "SUBTYPE_DECLARATION"]
62
and vhdl_expr_t =
63
  | Call of vhdl_name_t [@name "CALL"]
64 e1102543 Arnaud Dieumegard
  | Cst of vhdl_cst_val_t [@name "CONSTANT_VALUE"]
65 62b6a61c Arnaud Dieumegard
  | Op of { id: string [@default ""]; args: vhdl_expr_t list [@default []]} [@name "EXPRESSION"]
66
  | IsNull [@name "IsNull"]
67
  | Time of { value: int; phy_unit: string [@default ""]}
68
  | Sig of { name: vhdl_name_t; att: vhdl_signal_attributes_t option }
69 d3f0059e Arnaud Dieumegard
  | SuffixMod of { expr : vhdl_expr_t; selection : vhdl_suffix_selection_t }
70 62b6a61c Arnaud Dieumegard
  | Aggregate of { elems : vhdl_element_assoc_t list } [@name "AGGREGATE"]
71
  | Others [@name "OTHERS"]
72
and vhdl_name_t =
73
  | Simple of string [@name "SIMPLE_NAME"]
74
  | Identifier of string [@name "IDENTIFIER"]
75
  | Selected of vhdl_name_t list [@name "SELECTED_NAME"]
76
  | Index of { id: vhdl_name_t; exprs: vhdl_expr_t list } [@name "INDEXED_NAME"]
77
  | Slice of { id: vhdl_name_t; range: vhdl_discrete_range_t } [@name "SLICE_NAME"]
78
  | Attribute of { id: vhdl_name_t; designator: vhdl_name_t; expr: vhdl_expr_t [@default IsNull]} [@name "ATTRIBUTE_NAME"]
79
  | Function of { id: vhdl_name_t; assoc_list: vhdl_assoc_element_t list } [@name "FUNCTION_CALL"]
80
  | NoName
81
and vhdl_assoc_element_t =
82 eb07b479 Arnaud Dieumegard
  {
83 62b6a61c Arnaud Dieumegard
    formal_name: vhdl_name_t option [@default Some NoName];
84
    formal_arg: vhdl_name_t option [@default Some NoName];
85
    actual_name: vhdl_name_t option [@default Some NoName];
86
    actual_designator: vhdl_name_t option [@default Some NoName];
87
    actual_expr: vhdl_expr_t option [@default Some IsNull];
88 eb07b479 Arnaud Dieumegard
  }
89 62b6a61c Arnaud Dieumegard
and vhdl_element_assoc_t =
90 eb07b479 Arnaud Dieumegard
  {
91 62b6a61c Arnaud Dieumegard
    choices: vhdl_expr_t list;
92
    expr: vhdl_expr_t;
93 eb07b479 Arnaud Dieumegard
  }
94 62b6a61c Arnaud Dieumegard
and vhdl_array_attributes_t = 
95
  | AAttInt of { id: string; arg: int; } 
96
  | AAttAscending
97
and vhdl_signal_attributes_t = SigAtt of string
98
and vhdl_string_attributes_t = StringAtt of string
99 d3f0059e Arnaud Dieumegard
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
*)
112 55963629 Arnaud Dieumegard
113
(************************************************************************************)		   
114
(*            Attributes for types, arrays, signals and strings                     *)
115
(************************************************************************************)		   
116
117
type 'basetype vhdl_type_attributes_t =
118
  | TAttNoArg of { id: string }
119
  | TAttIntArg of { id: string; arg: int }
120
  | TAttValArg of { id: string; arg: 'basetype }
121
  | TAttStringArg of { id: string; arg: string }
122 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
123 55963629 Arnaud Dieumegard
124
let typ_att_noarg = ["base"; "left"; "right"; "high"; "low"]
125
let typ_att_intarg = ["pos"; "val"; "succ"; "pred"; "leftof"; "rightof"]
126
let typ_att_valarg = ["image"]
127
let typ_att_stringarg = ["value"]
128
  
129
let array_att_intarg = ["left"; "right"; "high"; "low"; "range"; "reverse_range"; "length"]  
130
131 62b6a61c Arnaud Dieumegard
type vhdl_parameter_t =
132
  {
133
    names: vhdl_name_t list;
134
    mode: string list [@default []];
135
    typ: vhdl_subtype_indication_t;
136 e1102543 Arnaud Dieumegard
    init_val: vhdl_cst_val_t option [@default Some (CstInt (0))];
137 62b6a61c Arnaud Dieumegard
  }
138 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
139 55963629 Arnaud Dieumegard
140 62b6a61c Arnaud Dieumegard
type vhdl_subprogram_spec_t =
141
  {
142
    name: string [@default ""];
143
    typeMark: vhdl_name_t [@default NoName];
144
    parameters: vhdl_parameter_t list;
145
    isPure: bool [@default false];
146
  }
147 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
148 55963629 Arnaud Dieumegard
149
(************************************************************************************)		   
150
(*                        Expressions  / Statements                                 *)
151
(************************************************************************************)		   
152
153 fbc571e6 Arnaud Dieumegard
let arith_funs = ["+";"-";"*";"/";"mod"; "rem";"abs";"**";"&"]
154
let bool_funs  = ["and"; "or"; "nand"; "nor"; "xor"; "not"]
155
let rel_funs   = ["<";">";"<=";">=";"/=";"=";"?=";"?/=";"?<";"?<=";"?>";"?>=";"??"]
156
let shift_funs = ["sll";"srl";"sla";"sra";"rol";"ror"]
157
158
type vhdl_sequential_stmt_t = 
159 62b6a61c Arnaud Dieumegard
  | VarAssign of { label: vhdl_name_t [@default NoName]; lhs: vhdl_name_t; rhs: vhdl_expr_t } [@name "VARIABLE_ASSIGNMENT_STATEMENT"]
160
  | SigSeqAssign of { label: vhdl_name_t [@default NoName]; lhs: vhdl_name_t; rhs: vhdl_expr_t list} [@name "SIGNAL_ASSIGNMENT_STATEMENT"]
161
  | If of { label: vhdl_name_t [@default NoName]; if_cases: vhdl_if_case_t list;
162 fbc571e6 Arnaud Dieumegard
    default: vhdl_sequential_stmt_t list [@default []]; } [@name "IF_STATEMENT"]
163 62b6a61c Arnaud Dieumegard
  | Case of { label: vhdl_name_t [@default NoName]; guard: vhdl_expr_t; branches: vhdl_case_item_t list } [@name "CASE_STATEMENT_TREE"]
164
  | Exit of { label: vhdl_name_t [@default NoName]; loop_label: string option [@default Some ""]; condition: vhdl_expr_t option [@default Some IsNull]} [@name "EXIT_STATEMENT"]
165
  | Assert of { label: vhdl_name_t [@default NoName]; cond: vhdl_expr_t; report: vhdl_expr_t [@default IsNull]; severity: vhdl_expr_t [@default IsNull]} [@name "ASSERTION_STATEMENT"]
166 fbc571e6 Arnaud Dieumegard
  | Wait [@name "WAIT_STATEMENT"]
167 62b6a61c Arnaud Dieumegard
  | Null of { label: vhdl_name_t [@default NoName]} [@name "NULL_STATEMENT"]
168
  | Return of { label: vhdl_name_t [@default NoName]} [@name "RETURN_STATEMENT"]
169 fbc571e6 Arnaud Dieumegard
and vhdl_if_case_t = 
170 fae1790f Arnaud Dieumegard
  {
171
    if_cond: vhdl_expr_t;
172
    if_block: vhdl_sequential_stmt_t list;
173 fbc571e6 Arnaud Dieumegard
  }
174 fae1790f Arnaud Dieumegard
and vhdl_case_item_t = 
175
  {
176 fbc571e6 Arnaud Dieumegard
    when_cond: vhdl_expr_t list;
177
    when_stmt: vhdl_sequential_stmt_t list;
178 fae1790f Arnaud Dieumegard
  }
179 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
180 eb07b479 Arnaud Dieumegard
181
type vhdl_declaration_t =
182 62b6a61c Arnaud Dieumegard
  | VarDecl of {
183
      names : vhdl_name_t list; 
184
      typ : vhdl_subtype_indication_t; 
185 e1102543 Arnaud Dieumegard
      init_val : vhdl_cst_val_t option [@default Some (CstInt (0))] 
186 62b6a61c Arnaud Dieumegard
    } [@name "VARIABLE_DECLARATION"]
187
  | CstDecl of { 
188
      names : vhdl_name_t list; 
189
      typ : vhdl_subtype_indication_t; 
190 e1102543 Arnaud Dieumegard
      init_val : vhdl_cst_val_t 
191 62b6a61c Arnaud Dieumegard
    } [@name "CONSTANT_DECLARATION"]
192
  | SigDecl of { 
193
      names : vhdl_name_t list; 
194
      typ : vhdl_subtype_indication_t; 
195 e1102543 Arnaud Dieumegard
      init_val : vhdl_cst_val_t option [@default Some (CstInt (0))] 
196 62b6a61c Arnaud Dieumegard
    } [@name "SIGNAL_DECLARATION"]
197
  | Subprogram of {
198
      name: vhdl_name_t [@default NoName]; 
199
      kind: string [@default ""]; 
200
      spec: vhdl_subprogram_spec_t [@default {name="";typeMark=NoName;parameters=[];isPure=false}]; 
201
      decl_part: vhdl_declaration_t list [@default []]; 
202
      stmts: vhdl_sequential_stmt_t list [@default []]
203
    } [@name "SUBPROGRAM_BODY"]
204 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
205 62b6a61c Arnaud Dieumegard
206 d3f0059e Arnaud Dieumegard
type vhdl_signal_condition_t =
207 55963629 Arnaud Dieumegard
  {                            
208 fbc571e6 Arnaud Dieumegard
    expr: vhdl_expr_t list;              (* when expression *)
209
    cond: vhdl_expr_t [@default IsNull];  (* optional else case expression. 
210 55963629 Arnaud Dieumegard
                                             If None, could be a latch  *)
211
  }
212 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
213 55963629 Arnaud Dieumegard
214 d3f0059e Arnaud Dieumegard
type vhdl_signal_selection_t =
215 55963629 Arnaud Dieumegard
  {
216
    expr : vhdl_expr_t;
217 fbc571e6 Arnaud Dieumegard
    when_sel: vhdl_expr_t list [@default []];
218 55963629 Arnaud Dieumegard
  }
219 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
220 55963629 Arnaud Dieumegard
221 d3f0059e Arnaud Dieumegard
type vhdl_conditional_signal_t =
222 55963629 Arnaud Dieumegard
  {
223 fbc571e6 Arnaud Dieumegard
    postponed: bool [@default false];
224 62b6a61c Arnaud Dieumegard
    label: vhdl_name_t [@default NoName];
225 fbc571e6 Arnaud Dieumegard
    lhs: vhdl_name_t;        (* assigned signal = target*)
226 d3f0059e Arnaud Dieumegard
    rhs: vhdl_signal_condition_t list;                   (* expression *)
227 fbc571e6 Arnaud Dieumegard
    cond: vhdl_expr_t [@default IsNull];
228
    delay: vhdl_expr_t [@default IsNull];
229 55963629 Arnaud Dieumegard
  }
230 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
231 55963629 Arnaud Dieumegard
232 d3f0059e Arnaud Dieumegard
type vhdl_process_t =
233 55963629 Arnaud Dieumegard
  { 
234 62b6a61c Arnaud Dieumegard
    id: vhdl_name_t [@default NoName];
235 fae1790f Arnaud Dieumegard
    declarations: vhdl_declaration_t list option [@key "PROCESS_DECLARATIVE_PART"] [@default Some []];
236 fbc571e6 Arnaud Dieumegard
    active_sigs: vhdl_name_t list [@default []];
237 fae1790f Arnaud Dieumegard
    body: vhdl_sequential_stmt_t list [@key "PROCESS_STATEMENT_PART"] [@default []]
238 55963629 Arnaud Dieumegard
  }
239 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
240 55963629 Arnaud Dieumegard
241 d3f0059e Arnaud Dieumegard
type vhdl_selected_signal_t = 
242 55963629 Arnaud Dieumegard
  { 
243 fbc571e6 Arnaud Dieumegard
    postponed: bool [@default false];
244 62b6a61c Arnaud Dieumegard
    label: vhdl_name_t [@default NoName];
245 fbc571e6 Arnaud Dieumegard
    lhs: vhdl_name_t;      (* assigned signal = target *)
246 55963629 Arnaud Dieumegard
    sel: vhdl_expr_t;  
247 d3f0059e Arnaud Dieumegard
    branches: vhdl_signal_selection_t list [@default []];
248 fbc571e6 Arnaud Dieumegard
    delay: vhdl_expr_t option;
249 55963629 Arnaud Dieumegard
  }
250 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
251 55963629 Arnaud Dieumegard
			   
252
type vhdl_concurrent_stmt_t =
253 d3f0059e Arnaud Dieumegard
  | 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}];;
257 55963629 Arnaud Dieumegard
  (*
258
type vhdl_statement_t =
259
  
260
  (* | DeclarationStmt of declaration_stmt_t *)
261
  | ConcurrentStmt of vhdl_concurrent_stmt_t
262
  | SequentialStmt of vhdl_sequential_stmt_t
263
   *)
264
		     
265
(************************************************************************************)		   
266
(*                     Entities                                                     *)
267
(************************************************************************************)		   
268
			     
269 62b6a61c Arnaud Dieumegard
type vhdl_port_mode_t = 
270 55963629 Arnaud Dieumegard
    InPort     [@name "in"]
271
  | OutPort    [@name "out"]
272
  | InoutPort  [@name "inout"]
273
  | BufferPort [@name "buffer"]
274 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson];;
275 55963629 Arnaud Dieumegard
	     
276
type vhdl_port_t =
277
  {
278 62b6a61c Arnaud Dieumegard
    names: vhdl_name_t list [@default []];
279
    mode: vhdl_port_mode_t [@default InPort];
280
    typ: vhdl_subtype_indication_t;
281
    expr: vhdl_expr_t [@default IsNull];
282 55963629 Arnaud Dieumegard
  }
283 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
284 55963629 Arnaud Dieumegard
285
type vhdl_entity_t =
286
  {
287 62b6a61c Arnaud Dieumegard
    name: vhdl_name_t [@default NoName];
288
    generics: vhdl_port_t list [@default []];
289
    ports: vhdl_port_t list [@default []];
290
    declaration: vhdl_declaration_t list [@key "ENTITY_DECLARATIVE_PART"] [@default []];
291
    stmts: vhdl_concurrent_stmt_t list [@key "ENTITY_STATEMENT_PART"] [@default []]; 
292 55963629 Arnaud Dieumegard
  }
293 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
294 55963629 Arnaud Dieumegard
295
(************************************************************************************)		   
296
(*                    Packages / Library loading                                    *)
297
(************************************************************************************)		   
298
				
299
(* Optional. Describes shared definitions *)
300
type vhdl_package_t =
301
  {
302 62b6a61c Arnaud Dieumegard
    name: vhdl_name_t [@default NoName];
303 55963629 Arnaud Dieumegard
    shared_defs: vhdl_definition_t list [@default []];
304
  }
305 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
306 55963629 Arnaud Dieumegard
307
type vhdl_load_t = 
308 62b6a61c Arnaud Dieumegard
    Library of vhdl_name_t list [@name "LIBRARY_CLAUSE"] [@default []]
309
  | Use of vhdl_name_t list [@name "USE_CLAUSE"] [@default []]
310 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson];;
311 55963629 Arnaud Dieumegard
312
(************************************************************************************)		   
313
(*                        Architecture / VHDL Design                                *)
314
(************************************************************************************)		   
315
				       
316
type vhdl_architecture_t =
317
  {
318 62b6a61c Arnaud Dieumegard
    name: vhdl_name_t [@default NoName];
319
    entity: vhdl_name_t [@default NoName];
320
    declarations: vhdl_declaration_t list [@key "ARCHITECTURE_DECLARATIVE_PART"] [@default []];
321
    body: vhdl_concurrent_stmt_t list [@key "ARCHITECTURE_STATEMENT_PART"] [@default []]; 
322 55963629 Arnaud Dieumegard
  }
323 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
324 55963629 Arnaud Dieumegard
    
325
(* TODO. Configuration is optional *)
326
type vhdl_configuration_t = unit
327 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
328 55963629 Arnaud Dieumegard
329 62b6a61c Arnaud Dieumegard
type vhdl_library_unit_t = (* TODO: PACKAGE_BODY *)
330
    Package of vhdl_package_t [@name "PACKAGE_DECLARATION"]
331
  | Entities of vhdl_entity_t [@name "ENTITY_DECLARATION"]
332
  | Architecture of vhdl_architecture_t [@name "ARCHITECTURE_BODY"]
333
  | Configuration of vhdl_configuration_t [@name "CONFIGURATION_DECLARATION"]
334 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
335 62b6a61c Arnaud Dieumegard
336
type vhdl_design_unit_t =
337 55963629 Arnaud Dieumegard
  {
338 62b6a61c Arnaud Dieumegard
    contexts: vhdl_load_t list [@default []];
339
    library: vhdl_library_unit_t;
340 55963629 Arnaud Dieumegard
  }
341 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
342 55963629 Arnaud Dieumegard
343
type vhdl_design_file_t =
344
  {
345 62b6a61c Arnaud Dieumegard
    design_units: vhdl_design_unit_t list [@default []];
346 55963629 Arnaud Dieumegard
  }
347 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson {strict = false}];;
348 55963629 Arnaud Dieumegard
349
type vhdl_file_t = 
350
  {
351 62b6a61c Arnaud Dieumegard
    design_file: vhdl_design_file_t [@default {design_units=[]}] [@key "DESIGN_FILE"];
352 55963629 Arnaud Dieumegard
  }
353 d3f0059e Arnaud Dieumegard
[@@deriving show { with_path = false }, yojson];;