Skip to main content

scarf_syntax/source_text/
module_parameters_and_ports.rs

1// =======================================================================
2// module_parameters_and_ports.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.1.3
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum ParameterPortList<'a> {
9    Defaults(
10        Metadata<'a>, // #
11        Metadata<'a>, // (
12        ListOfParamAssignments<'a>,
13        Vec<(Metadata<'a>, ParameterPortDeclaration<'a>)>,
14        Metadata<'a>, // )
15    ),
16    NoDefaults(
17        Metadata<'a>, // #
18        Metadata<'a>, // (
19        ParameterPortDeclaration<'a>,
20        Vec<(Metadata<'a>, ParameterPortDeclaration<'a>)>,
21        Metadata<'a>, // )
22    ),
23    Empty(Metadata<'a>, Metadata<'a>, Metadata<'a>),
24}
25
26#[derive(Clone, Debug, PartialEq)]
27pub enum ParameterPortDeclaration<'a> {
28    ParameterDeclaration(Box<ParameterDeclaration<'a>>),
29    LocalParameterDeclaration(Box<LocalParameterDeclaration<'a>>),
30    DataAssignments(Box<(DataType<'a>, ListOfParamAssignments<'a>)>),
31    TypeParameterDeclaration(Box<TypeParameterDeclaration<'a>>),
32}
33
34#[derive(Clone, Debug, PartialEq)]
35pub struct ListOfPorts<'a>(
36    pub Metadata<'a>, // (
37    pub Port<'a>,
38    pub Vec<(Metadata<'a>, Port<'a>)>,
39    pub Metadata<'a>,
40);
41
42#[derive(Clone, Debug, PartialEq)]
43pub struct ListOfPortDeclarations<'a>(
44    pub Metadata<'a>, // (
45    pub  Option<(
46        Vec<AttributeInstance<'a>>,
47        AnsiPortDeclaration<'a>,
48        Vec<(
49            Metadata<'a>, // ,
50            Vec<AttributeInstance<'a>>,
51            AnsiPortDeclaration<'a>,
52        )>,
53    )>,
54    pub Metadata<'a>, // )
55);
56
57#[derive(Clone, Debug, PartialEq)]
58pub enum PortDeclaration<'a> {
59    InoutDeclaration(Box<(Vec<AttributeInstance<'a>>, InoutDeclaration<'a>)>),
60    InputDeclaration(Box<(Vec<AttributeInstance<'a>>, InputDeclaration<'a>)>),
61    OutputDeclaration(Box<(Vec<AttributeInstance<'a>>, OutputDeclaration<'a>)>),
62    RefDeclaration(Box<(Vec<AttributeInstance<'a>>, RefDeclaration<'a>)>),
63    InterfacePortDeclaration(
64        Box<(Vec<AttributeInstance<'a>>, InterfacePortDeclaration<'a>)>,
65    ),
66}
67
68#[derive(Clone, Debug, PartialEq)]
69pub enum Port<'a> {
70    PortExpression(Box<Option<PortExpression<'a>>>),
71    PortIdentifier(
72        Box<(
73            Metadata<'a>, // .
74            PortIdentifier<'a>,
75            Metadata<'a>, // (
76            Option<PortExpression<'a>>,
77            Metadata<'a>, // )
78        )>,
79    ),
80}
81
82#[derive(Clone, Debug, PartialEq)]
83pub enum PortExpression<'a> {
84    SinglePortReference(Box<PortReference<'a>>),
85    MultiPortReference(
86        Box<(
87            Metadata<'a>, // {
88            PortReference<'a>,
89            Vec<(Metadata<'a>, PortReference<'a>)>,
90            Metadata<'a>, // }
91        )>,
92    ),
93}
94
95#[derive(Clone, Debug, PartialEq)]
96pub struct PortReference<'a>(pub PortIdentifier<'a>, pub ConstantSelect<'a>);
97
98#[derive(Clone, Debug, PartialEq)]
99pub enum PortDirection<'a> {
100    Input(Metadata<'a>),
101    Output(Metadata<'a>),
102    Inout(Metadata<'a>),
103    Ref(Metadata<'a>),
104}
105
106#[derive(Clone, Debug, PartialEq)]
107pub struct NetPortHeader<'a>(
108    pub Option<PortDirection<'a>>,
109    pub NetPortType<'a>,
110);
111
112#[derive(Clone, Debug, PartialEq)]
113pub struct VariablePortHeader<'a>(
114    pub Option<PortDirection<'a>>,
115    pub VariablePortType<'a>,
116);
117
118#[derive(Clone, Debug, PartialEq)]
119pub enum InterfacePortHeader<'a> {
120    InterfaceIdentifier(
121        (
122            InterfaceIdentifier<'a>,
123            Option<(Metadata<'a>, ModportIdentifier<'a>)>,
124        ),
125    ),
126    Interface((Metadata<'a>, Option<(Metadata<'a>, ModportIdentifier<'a>)>)),
127}
128
129#[derive(Clone, Debug, PartialEq)]
130pub enum AnsiPortDeclaration<'a> {
131    NetPort(Box<AnsiNetPortDeclaration<'a>>),
132    VariablePort(Box<AnsiVariablePortDeclaration<'a>>),
133    ConstantPort(Box<AnsiConstantPortDeclaration<'a>>),
134}
135
136#[derive(Clone, Debug, PartialEq)]
137pub enum NetOrInterfacePortHeader<'a> {
138    NetPortHeader(Box<NetPortHeader<'a>>),
139    InterfacePortHeader(Box<InterfacePortHeader<'a>>),
140}
141
142#[derive(Clone, Debug, PartialEq)]
143pub struct AnsiNetPortDeclaration<'a>(
144    pub Option<NetOrInterfacePortHeader<'a>>,
145    pub PortIdentifier<'a>,
146    pub Vec<UnpackedDimension<'a>>,
147    pub Option<(Metadata<'a>, ConstantExpression<'a>)>,
148);
149
150#[derive(Clone, Debug, PartialEq)]
151pub struct AnsiVariablePortDeclaration<'a>(
152    pub Option<VariablePortHeader<'a>>,
153    pub PortIdentifier<'a>,
154    pub Vec<VariableDimension<'a>>,
155    pub Option<(Metadata<'a>, ConstantExpression<'a>)>,
156);
157
158#[derive(Clone, Debug, PartialEq)]
159pub struct AnsiConstantPortDeclaration<'a>(
160    pub Option<PortDirection<'a>>,
161    pub Metadata<'a>, // .
162    pub PortIdentifier<'a>,
163    pub Metadata<'a>, // (
164    pub Option<Expression<'a>>,
165    pub Metadata<'a>, // )
166);