Skip to main content

scarf_syntax/source_text/
system_verilog_source_text.rs

1// =======================================================================
2// system_verilog_source_text.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.1.2
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct SourceText<'a>(
9    pub Vec<NonTriviaToken<'a>>, // Leading whitespace/comments/directives
10    pub Option<TimeunitsDeclaration<'a>>,
11    pub Vec<Description<'a>>,
12);
13
14#[derive(Clone, Debug, PartialEq)]
15pub enum Description<'a> {
16    ModuleDeclaration(Box<ModuleDeclaration<'a>>),
17    UdpDeclaration(Box<UdpDeclaration<'a>>),
18    InterfaceDeclaration(Box<InterfaceDeclaration<'a>>),
19    ProgramDeclaration(Box<ProgramDeclaration<'a>>),
20    PackageDeclaration(Box<PackageDeclaration<'a>>),
21    DescriptionPackageItem(Box<DescriptionPackageItem<'a>>),
22    DescriptionBindDirective(Box<DescriptionBindDirective<'a>>),
23    ConfigDeclaration(Box<ConfigDeclaration<'a>>),
24}
25
26#[derive(Clone, Debug, PartialEq)]
27pub struct DescriptionPackageItem<'a>(
28    pub Vec<AttributeInstance<'a>>,
29    pub PackageItem<'a>,
30);
31
32#[derive(Clone, Debug, PartialEq)]
33pub struct DescriptionBindDirective<'a>(
34    pub Vec<AttributeInstance<'a>>,
35    pub BindDirective<'a>,
36);
37
38#[derive(Clone, Debug, PartialEq)]
39pub struct ModuleNonansiHeader<'a>(
40    pub Vec<AttributeInstance<'a>>,
41    pub ModuleKeyword<'a>,
42    pub Option<Lifetime<'a>>,
43    pub ModuleIdentifier<'a>,
44    pub Vec<PackageImportDeclaration<'a>>,
45    pub Option<ParameterPortList<'a>>,
46    pub ListOfPorts<'a>,
47    pub Metadata<'a>, // ;
48);
49
50#[derive(Clone, Debug, PartialEq)]
51pub struct ModuleAnsiHeader<'a>(
52    pub Vec<AttributeInstance<'a>>,
53    pub ModuleKeyword<'a>,
54    pub Option<Lifetime<'a>>,
55    pub ModuleIdentifier<'a>,
56    pub Vec<PackageImportDeclaration<'a>>,
57    pub Option<ParameterPortList<'a>>,
58    pub Option<ListOfPortDeclarations<'a>>,
59    pub Metadata<'a>, // ;
60);
61
62#[derive(Clone, Debug, PartialEq)]
63pub enum ModuleDeclaration<'a> {
64    Nonansi(Box<ModuleDeclarationNonansi<'a>>),
65    Ansi(Box<ModuleDeclarationAnsi<'a>>),
66    Wildcard(Box<ModuleDeclarationWildcard<'a>>),
67    ExternNonansi(Box<ModuleDeclarationExternNonansi<'a>>),
68    ExternAnsi(Box<ModuleDeclarationExternAnsi<'a>>),
69}
70
71#[derive(Clone, Debug, PartialEq)]
72pub struct ModuleDeclarationNonansi<'a>(
73    pub ModuleNonansiHeader<'a>,
74    pub Option<TimeunitsDeclaration<'a>>,
75    pub Vec<ModuleItem<'a>>,
76    pub Metadata<'a>,
77    pub Option<(Metadata<'a>, ModuleIdentifier<'a>)>,
78);
79
80#[derive(Clone, Debug, PartialEq)]
81pub struct ModuleDeclarationAnsi<'a>(
82    pub ModuleAnsiHeader<'a>,
83    pub Option<TimeunitsDeclaration<'a>>,
84    pub Vec<NonPortModuleItem<'a>>,
85    pub Metadata<'a>,
86    pub Option<(Metadata<'a>, ModuleIdentifier<'a>)>,
87);
88
89#[derive(Clone, Debug, PartialEq)]
90pub struct ModuleDeclarationWildcard<'a>(
91    pub Vec<AttributeInstance<'a>>,
92    pub ModuleKeyword<'a>,
93    pub Option<Lifetime<'a>>,
94    pub ModuleIdentifier<'a>,
95    pub Metadata<'a>, // (
96    pub Metadata<'a>, // .
97    pub Metadata<'a>, // *
98    pub Metadata<'a>, // )
99    pub Metadata<'a>, // ;
100    pub Option<TimeunitsDeclaration<'a>>,
101    pub Vec<ModuleItem<'a>>,
102    pub Metadata<'a>, // endmodule
103    pub Option<(Metadata<'a>, ModuleIdentifier<'a>)>,
104);
105
106#[derive(Clone, Debug, PartialEq)]
107pub struct ModuleDeclarationExternNonansi<'a>(
108    pub Metadata<'a>,
109    pub ModuleNonansiHeader<'a>,
110);
111
112#[derive(Clone, Debug, PartialEq)]
113pub struct ModuleDeclarationExternAnsi<'a>(
114    pub Metadata<'a>,
115    pub ModuleAnsiHeader<'a>,
116);
117
118#[derive(Clone, Debug, PartialEq)]
119pub enum ModuleKeyword<'a> {
120    Module(Metadata<'a>),
121    Macromodule(Metadata<'a>),
122}
123
124#[derive(Clone, Debug, PartialEq)]
125pub enum InterfaceDeclaration<'a> {
126    Nonansi(Box<InterfaceDeclarationNonansi<'a>>),
127    Ansi(Box<InterfaceDeclarationAnsi<'a>>),
128    Wildcard(Box<InterfaceDeclarationWildcard<'a>>),
129    ExternNonansi(Box<InterfaceDeclarationExternNonansi<'a>>),
130    ExternAnsi(Box<InterfaceDeclarationExternAnsi<'a>>),
131}
132
133#[derive(Clone, Debug, PartialEq)]
134pub struct InterfaceDeclarationNonansi<'a>(
135    pub InterfaceNonansiHeader<'a>,
136    pub Option<TimeunitsDeclaration<'a>>,
137    pub Vec<InterfaceItem<'a>>,
138    pub Metadata<'a>, // endinterface
139    pub Option<(Metadata<'a>, InterfaceIdentifier<'a>)>,
140);
141
142#[derive(Clone, Debug, PartialEq)]
143pub struct InterfaceDeclarationAnsi<'a>(
144    pub InterfaceAnsiHeader<'a>,
145    pub Option<TimeunitsDeclaration<'a>>,
146    pub Vec<NonPortInterfaceItem<'a>>,
147    pub Metadata<'a>, // endinterface
148    pub Option<(Metadata<'a>, InterfaceIdentifier<'a>)>,
149);
150
151#[derive(Clone, Debug, PartialEq)]
152pub struct InterfaceDeclarationWildcard<'a>(
153    pub Vec<AttributeInstance<'a>>,
154    pub Metadata<'a>, // interface
155    pub InterfaceIdentifier<'a>,
156    pub Metadata<'a>, // (
157    pub Metadata<'a>, // .
158    pub Metadata<'a>, // *
159    pub Metadata<'a>, // )
160    pub Metadata<'a>, // ;
161    pub Option<TimeunitsDeclaration<'a>>,
162    pub Vec<InterfaceItem<'a>>,
163    pub Metadata<'a>, // endinterface
164    pub Option<(Metadata<'a>, InterfaceIdentifier<'a>)>,
165);
166
167#[derive(Clone, Debug, PartialEq)]
168pub struct InterfaceDeclarationExternNonansi<'a>(
169    pub Metadata<'a>,
170    pub InterfaceNonansiHeader<'a>,
171);
172
173#[derive(Clone, Debug, PartialEq)]
174pub struct InterfaceDeclarationExternAnsi<'a>(
175    pub Metadata<'a>,
176    pub InterfaceAnsiHeader<'a>,
177);
178
179#[derive(Clone, Debug, PartialEq)]
180pub struct InterfaceNonansiHeader<'a>(
181    pub Vec<AttributeInstance<'a>>,
182    pub Metadata<'a>, // interface
183    pub Option<Lifetime<'a>>,
184    pub InterfaceIdentifier<'a>,
185    pub Vec<PackageImportDeclaration<'a>>,
186    pub Option<ParameterPortList<'a>>,
187    pub ListOfPorts<'a>,
188    pub Metadata<'a>, // ;
189);
190
191#[derive(Clone, Debug, PartialEq)]
192pub struct InterfaceAnsiHeader<'a>(
193    pub Vec<AttributeInstance<'a>>,
194    pub Metadata<'a>, // interface
195    pub Option<Lifetime<'a>>,
196    pub InterfaceIdentifier<'a>,
197    pub Vec<PackageImportDeclaration<'a>>,
198    pub Option<ParameterPortList<'a>>,
199    pub Option<ListOfPortDeclarations<'a>>,
200    pub Metadata<'a>, // ;
201);
202
203#[derive(Clone, Debug, PartialEq)]
204pub enum ProgramDeclaration<'a> {
205    Nonansi(Box<ProgramDeclarationNonansi<'a>>),
206    Ansi(Box<ProgramDeclarationAnsi<'a>>),
207    Wildcard(Box<ProgramDeclarationWildcard<'a>>),
208    ExternNonansi(Box<ProgramDeclarationExternNonansi<'a>>),
209    ExternAnsi(Box<ProgramDeclarationExternAnsi<'a>>),
210}
211
212#[derive(Clone, Debug, PartialEq)]
213pub struct ProgramDeclarationNonansi<'a>(
214    pub ProgramNonansiHeader<'a>,
215    pub Option<TimeunitsDeclaration<'a>>,
216    pub Vec<ProgramItem<'a>>,
217    pub Metadata<'a>, // endprogram
218    pub Option<(Metadata<'a>, ProgramIdentifier<'a>)>,
219);
220
221#[derive(Clone, Debug, PartialEq)]
222pub struct ProgramDeclarationAnsi<'a>(
223    pub ProgramAnsiHeader<'a>,
224    pub Option<TimeunitsDeclaration<'a>>,
225    pub Vec<NonPortProgramItem<'a>>,
226    pub Metadata<'a>, // endprogram
227    pub Option<(Metadata<'a>, ProgramIdentifier<'a>)>,
228);
229
230#[derive(Clone, Debug, PartialEq)]
231pub struct ProgramDeclarationWildcard<'a>(
232    pub Vec<AttributeInstance<'a>>,
233    pub Metadata<'a>, // program
234    pub ProgramIdentifier<'a>,
235    pub Metadata<'a>, // (
236    pub Metadata<'a>, // .
237    pub Metadata<'a>, // *
238    pub Metadata<'a>, // )
239    pub Metadata<'a>, // ;
240    pub Option<TimeunitsDeclaration<'a>>,
241    pub Vec<ProgramItem<'a>>,
242    pub Metadata<'a>, // endprogram
243    pub Option<(Metadata<'a>, ProgramIdentifier<'a>)>,
244);
245
246#[derive(Clone, Debug, PartialEq)]
247pub struct ProgramDeclarationExternNonansi<'a>(
248    pub Metadata<'a>,
249    pub ProgramNonansiHeader<'a>,
250);
251
252#[derive(Clone, Debug, PartialEq)]
253pub struct ProgramDeclarationExternAnsi<'a>(
254    pub Metadata<'a>,
255    pub ProgramAnsiHeader<'a>,
256);
257
258#[derive(Clone, Debug, PartialEq)]
259pub struct ProgramNonansiHeader<'a>(
260    pub Vec<AttributeInstance<'a>>,
261    pub Metadata<'a>, // program
262    pub Option<Lifetime<'a>>,
263    pub ProgramIdentifier<'a>,
264    pub Vec<PackageImportDeclaration<'a>>,
265    pub Option<ParameterPortList<'a>>,
266    pub ListOfPorts<'a>,
267    pub Metadata<'a>, // ;
268);
269
270#[derive(Clone, Debug, PartialEq)]
271pub struct ProgramAnsiHeader<'a>(
272    pub Vec<AttributeInstance<'a>>,
273    pub Metadata<'a>, // program
274    pub Option<Lifetime<'a>>,
275    pub ProgramIdentifier<'a>,
276    pub Vec<PackageImportDeclaration<'a>>,
277    pub Option<ParameterPortList<'a>>,
278    pub Option<ListOfPortDeclarations<'a>>,
279    pub Metadata<'a>, // ;
280);
281
282#[derive(Clone, Debug, PartialEq)]
283pub struct CheckerDeclaration<'a>(
284    pub Metadata<'a>, // checker
285    pub CheckerIdentifier<'a>,
286    pub Option<(Metadata<'a>, CheckerPortList<'a>, Metadata<'a>)>,
287    pub Metadata<'a>,
288    pub Vec<(Vec<AttributeInstance<'a>>, CheckerOrGenerateItem<'a>)>,
289    pub Metadata<'a>, // endchecker
290    pub Option<(Metadata<'a>, CheckerIdentifier<'a>)>,
291);
292
293#[derive(Clone, Debug, PartialEq)]
294pub struct ClassDeclaration<'a>(
295    pub Option<Metadata<'a>>, // virtual
296    pub Metadata<'a>,         // class
297    pub Option<FinalSpecifier<'a>>,
298    pub ClassIdentifier<'a>,
299    pub Option<ParameterPortList<'a>>,
300    pub  Option<(
301        Metadata<'a>, // extends
302        ClassType<'a>,
303        Option<(
304            Metadata<'a>, // (
305            ClassDeclarationExtensionArguments<'a>,
306            Metadata<'a>, // )
307        )>,
308    )>,
309    pub  Option<(
310        Metadata<'a>, // implements
311        InterfaceClassType<'a>,
312        Vec<(Metadata<'a>, InterfaceClassType<'a>)>,
313    )>,
314    pub Metadata<'a>, // ;
315    pub Vec<ClassItem<'a>>,
316    pub Metadata<'a>, // endclass
317    pub Option<(Metadata<'a>, ClassIdentifier<'a>)>,
318);
319
320#[derive(Clone, Debug, PartialEq)]
321pub enum ClassDeclarationExtensionArguments<'a> {
322    ListOfArguments(Box<ListOfArguments<'a>>),
323    Default(Metadata<'a>),
324}
325
326#[derive(Clone, Debug, PartialEq)]
327pub struct InterfaceClassDeclaration<'a>(
328    pub Metadata<'a>, // interface
329    pub Metadata<'a>, // class
330    pub ClassIdentifier<'a>,
331    pub Option<ParameterPortList<'a>>,
332    pub  Option<(
333        Metadata<'a>, // extends
334        InterfaceClassType<'a>,
335        Vec<(Metadata<'a>, InterfaceClassType<'a>)>,
336    )>,
337    pub Metadata<'a>, // ;
338    pub Vec<InterfaceClassItem<'a>>,
339    pub Metadata<'a>, // endclass
340    pub Option<(Metadata<'a>, ClassIdentifier<'a>)>,
341);
342
343#[derive(Clone, Debug, PartialEq)]
344pub struct PackageDeclaration<'a>(
345    pub Vec<AttributeInstance<'a>>,
346    pub Metadata<'a>, // package
347    pub Option<Lifetime<'a>>,
348    pub PackageIdentifier<'a>,
349    pub Metadata<'a>, // ;
350    pub Option<TimeunitsDeclaration<'a>>,
351    pub Vec<(Vec<AttributeInstance<'a>>, PackageItem<'a>)>,
352    pub Metadata<'a>, // endpackage
353    pub Option<(Metadata<'a>, PackageIdentifier<'a>)>,
354);
355
356#[derive(Clone, Debug, PartialEq)]
357pub enum TimeunitsDeclaration<'a> {
358    Timeunit(
359        Metadata<'a>, // timeunit
360        TimeLiteral<'a>,
361        Option<(Metadata<'a>, TimeLiteral<'a>)>,
362        Metadata<'a>, // ;
363    ),
364    Timeprecision(
365        Metadata<'a>, // timeprecision
366        TimeLiteral<'a>,
367        Metadata<'a>, // ;
368    ),
369    Timeunitprecision(
370        Metadata<'a>, // timeunit
371        TimeLiteral<'a>,
372        Metadata<'a>, // ;
373        Metadata<'a>, // timeprecision
374        TimeLiteral<'a>,
375        Metadata<'a>, // ;
376    ),
377    Timeprecisionunit(
378        Metadata<'a>, // timeprecision
379        TimeLiteral<'a>,
380        Metadata<'a>, // ;
381        Metadata<'a>, // timeunit
382        TimeLiteral<'a>,
383        Metadata<'a>, // ;
384    ),
385}