Skip to main content

scarf_syntax/behavioral_statements/
procedural_blocks_and_assignments.rs

1// =======================================================================
2// procedural_blocks_and_assignments.rs
3// =======================================================================
4//! CST Nodes from 1800-2023 A.6.2
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct InitialConstruct<'a>(
9    pub Metadata<'a>, // initial
10    pub StatementOrNull<'a>,
11);
12
13#[derive(Clone, Debug, PartialEq)]
14pub struct AlwaysConstruct<'a>(pub AlwaysKeyword<'a>, pub Statement<'a>);
15
16#[derive(Clone, Debug, PartialEq)]
17pub enum AlwaysKeyword<'a> {
18    Always(Metadata<'a>),
19    AlwaysComb(Metadata<'a>),
20    AlwaysLatch(Metadata<'a>),
21    AlwaysFf(Metadata<'a>),
22}
23
24#[derive(Clone, Debug, PartialEq)]
25pub struct FinalConstruct<'a>(
26    pub Metadata<'a>, // final
27    pub FunctionStatement<'a>,
28);
29
30#[derive(Clone, Debug, PartialEq)]
31pub enum ImplicitClassHandleOrClassScopeOrPackageScope<'a> {
32    ImplicitClassHandle(
33        Box<(
34            ImplicitClassHandle<'a>,
35            Metadata<'a>, // .
36        )>,
37    ),
38    Class(Box<ClassScope<'a>>),
39    Package(Box<PackageScope<'a>>),
40}
41
42#[derive(Clone, Debug, PartialEq)]
43pub enum BlockingAssignment<'a> {
44    Variable(
45        Box<(
46            VariableLvalue<'a>,
47            Metadata<'a>, // =
48            DelayOrEventControl<'a>,
49            Expression<'a>,
50        )>,
51    ),
52    Dynamic(
53        Box<(
54            NonrangeVariableLvalue<'a>,
55            Metadata<'a>, // =
56            DynamicArrayNew<'a>,
57        )>,
58    ),
59    Class(
60        Box<(
61            ImplicitClassHandleOrClassScopeOrPackageScope<'a>,
62            HierarchicalVariableIdentifier<'a>,
63            Select<'a>,
64            Metadata<'a>, // =
65            ClassNew<'a>,
66        )>,
67    ),
68    Operator(Box<OperatorAssignment<'a>>),
69    IncOrDec(Box<IncOrDecExpression<'a>>),
70}
71
72#[derive(Clone, Debug, PartialEq)]
73pub struct OperatorAssignment<'a>(
74    pub VariableLvalue<'a>,
75    pub AssignmentOperator<'a>,
76    pub Expression<'a>,
77);
78
79#[derive(Clone, Debug, PartialEq)]
80pub enum AssignmentOperator<'a> {
81    Eq(Metadata<'a>),
82    PlusEq(Metadata<'a>),
83    MinusEq(Metadata<'a>),
84    StarEq(Metadata<'a>),
85    SlashEq(Metadata<'a>),
86    PercentEq(Metadata<'a>),
87    AmpEq(Metadata<'a>),
88    PipeEq(Metadata<'a>),
89    CaretEq(Metadata<'a>),
90    LtLtEq(Metadata<'a>),
91    GtGtEq(Metadata<'a>),
92    LtLtLtEq(Metadata<'a>),
93    GtGtGtEq(Metadata<'a>),
94}
95
96#[derive(Clone, Debug, PartialEq)]
97pub struct NonblockingAssignment<'a>(
98    pub VariableLvalue<'a>,
99    pub Metadata<'a>, // <=
100    pub Option<DelayOrEventControl<'a>>,
101    pub Expression<'a>,
102);
103
104#[derive(Clone, Debug, PartialEq)]
105pub enum ProceduralContinuousAssignment<'a> {
106    Assign(
107        Box<(
108            Metadata<'a>, // assign
109            VariableAssignment<'a>,
110        )>,
111    ),
112    Deassign(
113        Box<(
114            Metadata<'a>, // deassign
115            VariableLvalue<'a>,
116        )>,
117    ),
118    ForceVar(
119        Box<(
120            Metadata<'a>, // force
121            VariableAssignment<'a>,
122        )>,
123    ),
124    ForceNet(
125        Box<(
126            Metadata<'a>, // force
127            NetAssignment<'a>,
128        )>,
129    ),
130    ReleaseVar(
131        Box<(
132            Metadata<'a>, // release
133            VariableLvalue<'a>,
134        )>,
135    ),
136    ReleaseNet(
137        Box<(
138            Metadata<'a>, // release
139            NetLvalue<'a>,
140        )>,
141    ),
142}
143
144#[derive(Clone, Debug, PartialEq)]
145pub struct VariableAssignment<'a>(
146    pub VariableLvalue<'a>,
147    pub Metadata<'a>, // =
148    pub Expression<'a>,
149);