1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn class_item(s: Span) -> IResult<Span, ClassItem> {
8 alt((
9 class_item_property,
10 class_item_method,
11 class_item_constraint,
12 class_item_declaration,
13 class_item_covergroup,
14 map(pair(local_parameter_declaration, symbol(";")), |x| {
15 ClassItem::LocalParameterDeclaration(Box::new(x))
16 }),
17 map(pair(parameter_declaration, symbol(";")), |x| {
18 ClassItem::ParameterDeclaration(Box::new(x))
19 }),
20 map(symbol(";"), |x| ClassItem::Empty(Box::new(x))),
21 ))(s)
22}
23
24#[tracable_parser]
25#[packrat_parser]
26pub(crate) fn class_item_property(s: Span) -> IResult<Span, ClassItem> {
27 let (s, a) = many0(attribute_instance)(s)?;
28 let (s, b) = class_property(s)?;
29 Ok((
30 s,
31 ClassItem::Property(Box::new(ClassItemProperty { nodes: (a, b) })),
32 ))
33}
34
35#[tracable_parser]
36#[packrat_parser]
37pub(crate) fn class_item_method(s: Span) -> IResult<Span, ClassItem> {
38 let (s, a) = many0(attribute_instance)(s)?;
39 let (s, b) = class_method(s)?;
40 Ok((
41 s,
42 ClassItem::Method(Box::new(ClassItemMethod { nodes: (a, b) })),
43 ))
44}
45
46#[tracable_parser]
47#[packrat_parser]
48pub(crate) fn class_item_constraint(s: Span) -> IResult<Span, ClassItem> {
49 let (s, a) = many0(attribute_instance)(s)?;
50 let (s, b) = class_constraint(s)?;
51 Ok((
52 s,
53 ClassItem::Constraint(Box::new(ClassItemConstraint { nodes: (a, b) })),
54 ))
55}
56
57#[tracable_parser]
58#[packrat_parser]
59pub(crate) fn class_item_declaration(s: Span) -> IResult<Span, ClassItem> {
60 let (s, a) = many0(attribute_instance)(s)?;
61 let (s, b) = class_declaration(s)?;
62 Ok((
63 s,
64 ClassItem::Declaration(Box::new(ClassItemDeclaration { nodes: (a, b) })),
65 ))
66}
67
68#[tracable_parser]
69#[packrat_parser]
70pub(crate) fn class_item_covergroup(s: Span) -> IResult<Span, ClassItem> {
71 let (s, a) = many0(attribute_instance)(s)?;
72 let (s, b) = covergroup_declaration(s)?;
73 Ok((
74 s,
75 ClassItem::Covergroup(Box::new(ClassItemCovergroup { nodes: (a, b) })),
76 ))
77}
78
79#[tracable_parser]
80#[packrat_parser]
81pub(crate) fn class_property(s: Span) -> IResult<Span, ClassProperty> {
82 alt((class_property_non_const, class_property_const))(s)
83}
84
85#[tracable_parser]
86#[packrat_parser]
87pub(crate) fn class_property_non_const(s: Span) -> IResult<Span, ClassProperty> {
88 let (s, a) = many0(property_qualifier)(s)?;
89 let (s, b) = data_declaration(s)?;
90 Ok((
91 s,
92 ClassProperty::NonConst(Box::new(ClassPropertyNonConst { nodes: (a, b) })),
93 ))
94}
95
96#[tracable_parser]
97#[packrat_parser]
98pub(crate) fn class_property_const(s: Span) -> IResult<Span, ClassProperty> {
99 let (s, a) = keyword("const")(s)?;
100 let (s, b) = many0(class_item_qualifier)(s)?;
101 let (s, c) = data_type(s)?;
102 let (s, d) = const_identifier(s)?;
103 let (s, e) = opt(pair(symbol("="), class_property_const_expression))(s)?;
106 let (s, f) = symbol(";")(s)?;
107 Ok((
108 s,
109 ClassProperty::Const(Box::new(ClassPropertyConst {
110 nodes: (a, b, c, d, e, f),
111 })),
112 ))
113}
114
115#[tracable_parser]
116#[packrat_parser]
117pub(crate) fn class_property_const_expression(
118 s: Span,
119) -> IResult<Span, ClassPropertyConstExpression> {
120 alt((
121 map(constant_expression, |x| {
122 ClassPropertyConstExpression::ConstantExpression(Box::new(x))
123 }),
124 map(class_new, |x| {
125 ClassPropertyConstExpression::ClassNew(Box::new(x))
126 }),
127 ))(s)
128}
129
130#[tracable_parser]
131#[packrat_parser]
132pub(crate) fn class_method(s: Span) -> IResult<Span, ClassMethod> {
133 alt((
134 class_method_task,
135 class_method_function,
136 class_method_pure_virtual,
137 class_method_extern_method,
138 class_method_constructor,
139 class_method_extern_constructor,
140 ))(s)
141}
142
143#[tracable_parser]
144#[packrat_parser]
145pub(crate) fn class_method_task(s: Span) -> IResult<Span, ClassMethod> {
146 let (s, a) = many0(method_qualifier)(s)?;
147 let (s, b) = task_declaration(s)?;
148 Ok((
149 s,
150 ClassMethod::Task(Box::new(ClassMethodTask { nodes: (a, b) })),
151 ))
152}
153
154#[tracable_parser]
155#[packrat_parser]
156pub(crate) fn class_method_function(s: Span) -> IResult<Span, ClassMethod> {
157 let (s, a) = many0(method_qualifier)(s)?;
158 let (s, b) = function_declaration(s)?;
159 Ok((
160 s,
161 ClassMethod::Function(Box::new(ClassMethodFunction { nodes: (a, b) })),
162 ))
163}
164
165#[tracable_parser]
166#[packrat_parser]
167pub(crate) fn class_method_pure_virtual(s: Span) -> IResult<Span, ClassMethod> {
168 let (s, a) = keyword("pure")(s)?;
169 let (s, b) = keyword("virtual")(s)?;
170 let (s, c) = many0(class_item_qualifier)(s)?;
171 let (s, d) = method_prototype(s)?;
172 let (s, e) = symbol(";")(s)?;
173 Ok((
174 s,
175 ClassMethod::PureVirtual(Box::new(ClassMethodPureVirtual {
176 nodes: (a, b, c, d, e),
177 })),
178 ))
179}
180
181#[tracable_parser]
182#[packrat_parser]
183pub(crate) fn class_method_extern_method(s: Span) -> IResult<Span, ClassMethod> {
184 let (s, a) = keyword("extern")(s)?;
185 let (s, b) = many0(method_qualifier)(s)?;
186 let (s, c) = method_prototype(s)?;
187 let (s, d) = symbol(";")(s)?;
188 Ok((
189 s,
190 ClassMethod::ExternMethod(Box::new(ClassMethodExternMethod {
191 nodes: (a, b, c, d),
192 })),
193 ))
194}
195
196#[tracable_parser]
197#[packrat_parser]
198pub(crate) fn class_method_constructor(s: Span) -> IResult<Span, ClassMethod> {
199 let (s, a) = many0(method_qualifier)(s)?;
200 let (s, b) = class_constructor_declaration(s)?;
201 Ok((
202 s,
203 ClassMethod::Constructor(Box::new(ClassMethodConstructor { nodes: (a, b) })),
204 ))
205}
206
207#[tracable_parser]
208#[packrat_parser]
209pub(crate) fn class_method_extern_constructor(s: Span) -> IResult<Span, ClassMethod> {
210 let (s, a) = keyword("extern")(s)?;
211 let (s, b) = many0(method_qualifier)(s)?;
212 let (s, c) = class_constructor_prototype(s)?;
213 Ok((
214 s,
215 ClassMethod::ExternConstructor(Box::new(ClassMethodExternConstructor { nodes: (a, b, c) })),
216 ))
217}
218
219#[tracable_parser]
220#[packrat_parser]
221pub(crate) fn class_constructor_prototype(s: Span) -> IResult<Span, ClassConstructorPrototype> {
222 let (s, a) = keyword("function")(s)?;
223 let (s, b) = keyword("new")(s)?;
224 let (s, c) = opt(paren(opt(tf_port_list)))(s)?;
225 let (s, d) = symbol(";")(s)?;
226 Ok((
227 s,
228 ClassConstructorPrototype {
229 nodes: (a, b, c, d),
230 },
231 ))
232}
233
234#[tracable_parser]
235#[packrat_parser]
236pub(crate) fn class_constraint(s: Span) -> IResult<Span, ClassConstraint> {
237 alt((
238 map(constraint_prototype, |x| {
239 ClassConstraint::ConstraintPrototype(Box::new(x))
240 }),
241 map(constraint_declaration, |x| {
242 ClassConstraint::ConstraintDeclaration(Box::new(x))
243 }),
244 ))(s)
245}
246
247#[tracable_parser]
248#[packrat_parser]
249pub(crate) fn class_item_qualifier(s: Span) -> IResult<Span, ClassItemQualifier> {
250 alt((
251 map(keyword("static"), |x| {
252 ClassItemQualifier::Static(Box::new(x))
253 }),
254 map(keyword("protected"), |x| {
255 ClassItemQualifier::Protected(Box::new(x))
256 }),
257 map(keyword("local"), |x| ClassItemQualifier::Local(Box::new(x))),
258 ))(s)
259}
260
261#[tracable_parser]
262#[packrat_parser]
263pub(crate) fn property_qualifier(s: Span) -> IResult<Span, PropertyQualifier> {
264 alt((
265 map(random_qualifier, |x| {
266 PropertyQualifier::RandomQualifier(Box::new(x))
267 }),
268 map(class_item_qualifier, |x| {
269 PropertyQualifier::ClassItemQualifier(Box::new(x))
270 }),
271 ))(s)
272}
273
274#[tracable_parser]
275#[packrat_parser]
276pub(crate) fn random_qualifier(s: Span) -> IResult<Span, RandomQualifier> {
277 alt((
278 map(keyword("randc"), |x| RandomQualifier::Randc(Box::new(x))),
279 map(keyword("rand"), |x| RandomQualifier::Rand(Box::new(x))),
280 ))(s)
281}
282
283#[tracable_parser]
284#[packrat_parser]
285pub(crate) fn method_qualifier(s: Span) -> IResult<Span, MethodQualifier> {
286 alt((
287 map(pair(keyword("pure"), keyword("virtual")), |x| {
288 MethodQualifier::PureVirtual(Box::new(x))
289 }),
290 map(keyword("virtual"), |x| {
291 MethodQualifier::Virtual(Box::new(x))
292 }),
293 map(class_item_qualifier, |x| {
294 MethodQualifier::ClassItemQualifier(Box::new(x))
295 }),
296 ))(s)
297}
298
299#[tracable_parser]
300#[packrat_parser]
301pub(crate) fn method_prototype(s: Span) -> IResult<Span, MethodPrototype> {
302 alt((
303 map(task_prototype, |x| {
304 MethodPrototype::TaskPrototype(Box::new(x))
305 }),
306 map(function_prototype, |x| {
307 MethodPrototype::FunctionPrototype(Box::new(x))
308 }),
309 ))(s)
310}
311
312#[tracable_parser]
313#[packrat_parser]
314pub(crate) fn class_constructor_declaration(s: Span) -> IResult<Span, ClassConstructorDeclaration> {
315 let (s, a) = keyword("function")(s)?;
316 let (s, b) = opt(class_scope)(s)?;
317 let (s, c) = keyword("new")(s)?;
318 let (s, d) = opt(paren(opt(tf_port_list)))(s)?;
319 let (s, e) = symbol(";")(s)?;
320 let (s, f) = many0(block_item_declaration)(s)?;
321 let (s, g) = opt(tuple((
322 keyword("super"),
323 symbol("."),
324 keyword("new"),
325 opt(paren(list_of_arguments)),
326 symbol(";"),
327 )))(s)?;
328 let (s, (h, i)) = many_till(function_statement_or_null, keyword("endfunction"))(s)?;
329 let (s, j) = opt(pair(symbol(":"), new))(s)?;
330 Ok((
331 s,
332 ClassConstructorDeclaration {
333 nodes: (a, b, c, d, e, f, g, h, i, j),
334 },
335 ))
336}
337
338#[tracable_parser]
339#[packrat_parser]
340pub(crate) fn new(s: Span) -> IResult<Span, New> {
341 let (s, a) = keyword("new")(s)?;
342 Ok((s, New { nodes: (a,) }))
343}