scarf_syntax/source_text/
system_verilog_source_text.rs

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