sv_parser_parser/source_text/
interface_items.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn interface_or_generate_item(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
8    alt((
9        interface_or_generate_item_module,
10        interface_or_generate_item_extern,
11    ))(s)
12}
13
14#[recursive_parser]
15#[tracable_parser]
16#[packrat_parser]
17pub(crate) fn interface_or_generate_item_module(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
18    let (s, a) = many0(attribute_instance)(s)?;
19    let (s, b) = module_common_item(s)?;
20    Ok((
21        s,
22        InterfaceOrGenerateItem::Module(Box::new(InterfaceOrGenerateItemModule { nodes: (a, b) })),
23    ))
24}
25
26#[tracable_parser]
27#[packrat_parser]
28pub(crate) fn interface_or_generate_item_extern(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
29    let (s, a) = many0(attribute_instance)(s)?;
30    let (s, b) = extern_tf_declaration(s)?;
31    Ok((
32        s,
33        InterfaceOrGenerateItem::Extern(Box::new(InterfaceOrGenerateItemExtern { nodes: (a, b) })),
34    ))
35}
36
37#[tracable_parser]
38#[packrat_parser]
39pub(crate) fn extern_tf_declaration(s: Span) -> IResult<Span, ExternTfDeclaration> {
40    alt((extern_tf_declaration_method, extern_tf_declaration_task))(s)
41}
42
43#[tracable_parser]
44#[packrat_parser]
45pub(crate) fn extern_tf_declaration_method(s: Span) -> IResult<Span, ExternTfDeclaration> {
46    let (s, a) = keyword("extern")(s)?;
47    let (s, b) = method_prototype(s)?;
48    let (s, c) = symbol(";")(s)?;
49    Ok((
50        s,
51        ExternTfDeclaration::Method(Box::new(ExternTfDeclarationMethod { nodes: (a, b, c) })),
52    ))
53}
54
55#[tracable_parser]
56#[packrat_parser]
57pub(crate) fn extern_tf_declaration_task(s: Span) -> IResult<Span, ExternTfDeclaration> {
58    let (s, a) = keyword("extern")(s)?;
59    let (s, b) = keyword("forkjoin")(s)?;
60    let (s, c) = task_prototype(s)?;
61    let (s, d) = symbol(";")(s)?;
62    Ok((
63        s,
64        ExternTfDeclaration::Task(Box::new(ExternTfDeclarationTask {
65            nodes: (a, b, c, d),
66        })),
67    ))
68}
69
70#[tracable_parser]
71#[packrat_parser]
72pub(crate) fn interface_item(s: Span) -> IResult<Span, InterfaceItem> {
73    alt((
74        map(pair(port_declaration, symbol(";")), |x| {
75            InterfaceItem::PortDeclaration(Box::new(x))
76        }),
77        map(non_port_interface_item, |x| {
78            InterfaceItem::NonPortInterfaceItem(Box::new(x))
79        }),
80    ))(s)
81}
82
83#[tracable_parser]
84#[packrat_parser]
85pub(crate) fn non_port_interface_item(s: Span) -> IResult<Span, NonPortInterfaceItem> {
86    alt((
87        map(generate_region, |x| {
88            NonPortInterfaceItem::GenerateRegion(Box::new(x))
89        }),
90        map(interface_or_generate_item, |x| {
91            NonPortInterfaceItem::InterfaceOrGenerateItem(Box::new(x))
92        }),
93        map(program_declaration, |x| {
94            NonPortInterfaceItem::ProgramDeclaration(Box::new(x))
95        }),
96        map(modport_declaration, |x| {
97            NonPortInterfaceItem::ModportDeclaration(Box::new(x))
98        }),
99        map(interface_declaration, |x| {
100            NonPortInterfaceItem::InterfaceDeclaration(Box::new(x))
101        }),
102        map(timeunits_declaration, |x| {
103            NonPortInterfaceItem::TimeunitsDeclaration(Box::new(x))
104        }),
105    ))(s)
106}