sv_parser_parser/source_text/
package_items.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn package_item(s: Span) -> IResult<Span, PackageItem> {
8    alt((
9        map(package_or_generate_item_declaration, |x| {
10            PackageItem::PackageOrGenerateItemDeclaration(Box::new(x))
11        }),
12        map(anonymous_program, |x| {
13            PackageItem::AnonymousProgram(Box::new(x))
14        }),
15        map(package_export_declaration, |x| {
16            PackageItem::PackageExportDeclaration(Box::new(x))
17        }),
18        map(timeunits_declaration, |x| {
19            PackageItem::TimeunitsDeclaration(Box::new(x))
20        }),
21    ))(s)
22}
23
24#[tracable_parser]
25#[packrat_parser]
26pub(crate) fn package_or_generate_item_declaration(
27    s: Span,
28) -> IResult<Span, PackageOrGenerateItemDeclaration> {
29    alt((
30        map(net_declaration, |x| {
31            PackageOrGenerateItemDeclaration::NetDeclaration(Box::new(x))
32        }),
33        map(data_declaration, |x| {
34            PackageOrGenerateItemDeclaration::DataDeclaration(Box::new(x))
35        }),
36        map(task_declaration, |x| {
37            PackageOrGenerateItemDeclaration::TaskDeclaration(Box::new(x))
38        }),
39        map(function_declaration, |x| {
40            PackageOrGenerateItemDeclaration::FunctionDeclaration(Box::new(x))
41        }),
42        map(checker_declaration, |x| {
43            PackageOrGenerateItemDeclaration::CheckerDeclaration(Box::new(x))
44        }),
45        map(dpi_import_export, |x| {
46            PackageOrGenerateItemDeclaration::DpiImportExport(Box::new(x))
47        }),
48        map(extern_constraint_declaration, |x| {
49            PackageOrGenerateItemDeclaration::ExternConstraintDeclaration(Box::new(x))
50        }),
51        map(class_declaration, |x| {
52            PackageOrGenerateItemDeclaration::ClassDeclaration(Box::new(x))
53        }),
54        map(interface_class_declaration, |x| {
55            PackageOrGenerateItemDeclaration::InterfaceClassDeclaration(Box::new(x))
56        }),
57        map(class_constructor_declaration, |x| {
58            PackageOrGenerateItemDeclaration::ClassConstructorDeclaration(Box::new(x))
59        }),
60        map(pair(local_parameter_declaration, symbol(";")), |x| {
61            PackageOrGenerateItemDeclaration::LocalParameterDeclaration(Box::new(x))
62        }),
63        map(pair(parameter_declaration, symbol(";")), |x| {
64            PackageOrGenerateItemDeclaration::ParameterDeclaration(Box::new(x))
65        }),
66        map(covergroup_declaration, |x| {
67            PackageOrGenerateItemDeclaration::CovergroupDeclaration(Box::new(x))
68        }),
69        map(assertion_item_declaration, |x| {
70            PackageOrGenerateItemDeclaration::AssertionItemDeclaration(Box::new(x))
71        }),
72        map(symbol(";"), |x| {
73            PackageOrGenerateItemDeclaration::Empty(Box::new(x))
74        }),
75    ))(s)
76}
77
78#[tracable_parser]
79#[packrat_parser]
80pub(crate) fn anonymous_program(s: Span) -> IResult<Span, AnonymousProgram> {
81    let (s, a) = keyword("program")(s)?;
82    let (s, b) = symbol(";")(s)?;
83    let (s, (c, d)) = many_till(anonymous_program_item, keyword("endprogram"))(s)?;
84    Ok((
85        s,
86        AnonymousProgram {
87            nodes: (a, b, c, d),
88        },
89    ))
90}
91
92#[tracable_parser]
93#[packrat_parser]
94pub(crate) fn anonymous_program_item(s: Span) -> IResult<Span, AnonymousProgramItem> {
95    alt((
96        map(task_declaration, |x| {
97            AnonymousProgramItem::TaskDeclaration(Box::new(x))
98        }),
99        map(function_declaration, |x| {
100            AnonymousProgramItem::FunctionDeclaration(Box::new(x))
101        }),
102        map(class_declaration, |x| {
103            AnonymousProgramItem::ClassDeclaration(Box::new(x))
104        }),
105        map(interface_class_declaration, |x| {
106            AnonymousProgramItem::InterfaceClassDeclaration(Box::new(x))
107        }),
108        map(covergroup_declaration, |x| {
109            AnonymousProgramItem::CovergroupDeclaration(Box::new(x))
110        }),
111        map(class_constructor_declaration, |x| {
112            AnonymousProgramItem::ClassConstructorDeclaration(Box::new(x))
113        }),
114        map(symbol(";"), |x| AnonymousProgramItem::Empty(Box::new(x))),
115    ))(s)
116}