scarf_syntax/source_text/
module_parameters_and_ports.rs

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