sv_parser_parser/source_text/
program_items.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn program_item(s: Span) -> IResult<Span, ProgramItem> {
8    alt((
9        map(pair(port_declaration, symbol(";")), |x| {
10            ProgramItem::PortDeclaration(Box::new(x))
11        }),
12        map(non_port_program_item, |x| {
13            ProgramItem::NonPortProgramItem(Box::new(x))
14        }),
15    ))(s)
16}
17
18#[tracable_parser]
19#[packrat_parser]
20pub(crate) fn non_port_program_item(s: Span) -> IResult<Span, NonPortProgramItem> {
21    alt((
22        non_port_program_item_assign,
23        non_port_program_item_module,
24        non_port_program_item_initial,
25        non_port_program_item_final,
26        non_port_program_item_assertion,
27        map(timeunits_declaration, |x| {
28            NonPortProgramItem::TimeunitsDeclaration(Box::new(x))
29        }),
30        map(program_generate_item, |x| {
31            NonPortProgramItem::ProgramGenerateItem(Box::new(x))
32        }),
33    ))(s)
34}
35
36#[tracable_parser]
37#[packrat_parser]
38pub(crate) fn non_port_program_item_assign(s: Span) -> IResult<Span, NonPortProgramItem> {
39    let (s, a) = many0(attribute_instance)(s)?;
40    let (s, b) = continuous_assign(s)?;
41    Ok((
42        s,
43        NonPortProgramItem::Assign(Box::new(NonPortProgramItemAssign { nodes: (a, b) })),
44    ))
45}
46
47#[recursive_parser]
48#[tracable_parser]
49#[packrat_parser]
50pub(crate) fn non_port_program_item_module(s: Span) -> IResult<Span, NonPortProgramItem> {
51    let (s, a) = many0(attribute_instance)(s)?;
52    let (s, b) = module_or_generate_item_declaration(s)?;
53    Ok((
54        s,
55        NonPortProgramItem::Module(Box::new(NonPortProgramItemModule { nodes: (a, b) })),
56    ))
57}
58
59#[tracable_parser]
60#[packrat_parser]
61pub(crate) fn non_port_program_item_initial(s: Span) -> IResult<Span, NonPortProgramItem> {
62    let (s, a) = many0(attribute_instance)(s)?;
63    let (s, b) = initial_construct(s)?;
64    Ok((
65        s,
66        NonPortProgramItem::Initial(Box::new(NonPortProgramItemInitial { nodes: (a, b) })),
67    ))
68}
69
70#[tracable_parser]
71#[packrat_parser]
72pub(crate) fn non_port_program_item_final(s: Span) -> IResult<Span, NonPortProgramItem> {
73    let (s, a) = many0(attribute_instance)(s)?;
74    let (s, b) = final_construct(s)?;
75    Ok((
76        s,
77        NonPortProgramItem::Final(Box::new(NonPortProgramItemFinal { nodes: (a, b) })),
78    ))
79}
80
81#[tracable_parser]
82#[packrat_parser]
83pub(crate) fn non_port_program_item_assertion(s: Span) -> IResult<Span, NonPortProgramItem> {
84    let (s, a) = many0(attribute_instance)(s)?;
85    let (s, b) = concurrent_assertion_item(s)?;
86    Ok((
87        s,
88        NonPortProgramItem::Assertion(Box::new(NonPortProgramItemAssertion { nodes: (a, b) })),
89    ))
90}
91
92#[tracable_parser]
93#[packrat_parser]
94pub(crate) fn program_generate_item(s: Span) -> IResult<Span, ProgramGenerateItem> {
95    alt((
96        map(loop_generate_construct, |x| {
97            ProgramGenerateItem::LoopGenerateConstruct(Box::new(x))
98        }),
99        map(conditional_generate_construct, |x| {
100            ProgramGenerateItem::ConditionalGenerateConstruct(Box::new(x))
101        }),
102        map(generate_region, |x| {
103            ProgramGenerateItem::GenerateRegion(Box::new(x))
104        }),
105        map(elaboration_system_task, |x| {
106            ProgramGenerateItem::ElaborationSystemTask(Box::new(x))
107        }),
108    ))(s)
109}