Skip to main content

scarf_syntax/specify_section/
specify_path_declarations.rs

1// =======================================================================
2// specify_path_declarations.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.7.2
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum PathDeclaration<'a> {
9    Simple(
10        Box<(
11            SimplePathDeclaration<'a>,
12            Metadata<'a>, // ;
13        )>,
14    ),
15    EdgeSensitive(
16        Box<(
17            EdgeSensitivePathDeclaration<'a>,
18            Metadata<'a>, // ;
19        )>,
20    ),
21    StateDependent(
22        Box<(
23            StateDependentPathDeclaration<'a>,
24            Metadata<'a>, // ;
25        )>,
26    ),
27}
28
29#[derive(Clone, Debug, PartialEq)]
30pub enum SimplePathDeclaration<'a> {
31    Parallel(
32        Box<(
33            ParallelPathDescription<'a>,
34            Metadata<'a>, // =
35            PathDelayValue<'a>,
36        )>,
37    ),
38    Full(
39        Box<(
40            FullPathDescription<'a>,
41            Metadata<'a>, // =
42            PathDelayValue<'a>,
43        )>,
44    ),
45}
46
47#[derive(Clone, Debug, PartialEq)]
48pub struct ParallelPathDescription<'a>(
49    pub Metadata<'a>, // (
50    pub SpecifyInputTerminalDescriptor<'a>,
51    pub Option<PolarityOperator<'a>>,
52    pub Metadata<'a>, // =>
53    pub SpecifyOutputTerminalDescriptor<'a>,
54    pub Metadata<'a>, // )
55);
56
57#[derive(Clone, Debug, PartialEq)]
58pub struct FullPathDescription<'a>(
59    pub Metadata<'a>, // (
60    pub ListOfPathInputs<'a>,
61    pub Option<PolarityOperator<'a>>,
62    pub Metadata<'a>, // *>
63    pub ListOfPathOutputs<'a>,
64    pub Metadata<'a>, // )
65);
66
67#[derive(Clone, Debug, PartialEq)]
68pub enum EdgeSensitivePathDeclaration<'a> {
69    Parallel(
70        Box<(
71            ParallelEdgeSensitivePathDescription<'a>,
72            Metadata<'a>, // =
73            PathDelayValue<'a>,
74        )>,
75    ),
76    Full(
77        Box<(
78            FullEdgeSensitivePathDescription<'a>,
79            Metadata<'a>, // =
80            PathDelayValue<'a>,
81        )>,
82    ),
83}
84
85#[derive(Clone, Debug, PartialEq)]
86pub enum ParallelEdgeSensitivePathDescription<'a> {
87    DataSource(
88        Box<(
89            Metadata<'a>, // (
90            Option<EdgeIdentifier<'a>>,
91            SpecifyInputTerminalDescriptor<'a>,
92            Option<PolarityOperator<'a>>,
93            Metadata<'a>, // =>
94            Metadata<'a>, // (
95            SpecifyOutputTerminalDescriptor<'a>,
96            Option<PolarityOperator<'a>>,
97            Metadata<'a>, // :
98            DataSourceExpression<'a>,
99            Metadata<'a>, // )
100            Metadata<'a>, // )
101        )>,
102    ),
103    NoDataSource(
104        Box<(
105            Metadata<'a>, // (
106            Option<EdgeIdentifier<'a>>,
107            SpecifyInputTerminalDescriptor<'a>,
108            Option<PolarityOperator<'a>>,
109            Metadata<'a>, // =>
110            SpecifyOutputTerminalDescriptor<'a>,
111            Metadata<'a>, // )
112        )>,
113    ),
114}
115
116#[derive(Clone, Debug, PartialEq)]
117pub enum FullEdgeSensitivePathDescription<'a> {
118    DataSource(
119        Box<(
120            Metadata<'a>, // (
121            Option<EdgeIdentifier<'a>>,
122            ListOfPathInputs<'a>,
123            Option<PolarityOperator<'a>>,
124            Metadata<'a>, // *>
125            Metadata<'a>, // (
126            ListOfPathOutputs<'a>,
127            Option<PolarityOperator<'a>>,
128            Metadata<'a>, // :
129            DataSourceExpression<'a>,
130            Metadata<'a>, // )
131            Metadata<'a>, // )
132        )>,
133    ),
134    NoDataSource(
135        Box<(
136            Metadata<'a>, // (
137            Option<EdgeIdentifier<'a>>,
138            ListOfPathInputs<'a>,
139            Option<PolarityOperator<'a>>,
140            Metadata<'a>, // *>
141            ListOfPathOutputs<'a>,
142            Metadata<'a>, // )
143        )>,
144    ),
145}
146
147#[derive(Clone, Debug, PartialEq)]
148pub enum StateDependentPathDeclaration<'a> {
149    Simple(
150        Box<(
151            Metadata<'a>, // if
152            Metadata<'a>, // (
153            ModulePathExpression<'a>,
154            Metadata<'a>, // )
155            SimplePathDeclaration<'a>,
156        )>,
157    ),
158    EdgeSensitive(
159        Box<(
160            Metadata<'a>, // if
161            Metadata<'a>, // (
162            ModulePathExpression<'a>,
163            Metadata<'a>, // )
164            EdgeSensitivePathDeclaration<'a>,
165        )>,
166    ),
167    NoCondition(
168        Box<(
169            Metadata<'a>, // ifnone
170            SimplePathDeclaration<'a>,
171        )>,
172    ),
173}
174
175#[derive(Clone, Debug, PartialEq)]
176pub struct DataSourceExpression<'a>(pub Expression<'a>);
177
178#[derive(Clone, Debug, PartialEq)]
179pub enum EdgeIdentifier<'a> {
180    Posedge(Metadata<'a>),
181    Negedge(Metadata<'a>),
182    Edge(Metadata<'a>),
183}
184
185#[derive(Clone, Debug, PartialEq)]
186pub enum PolarityOperator<'a> {
187    Plus(Metadata<'a>),
188    Minus(Metadata<'a>),
189}