scarf_parser/lexer/
keywords.rs

1// =======================================================================
2// keywords.rs
3// =======================================================================
4// The keywords used for various SystemVerilog standards
5
6use crate::*;
7
8#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
9pub enum StandardVersion {
10    IEEE1364_1995,
11    IEEE1364_2001Noconfig,
12    IEEE1364_2001,
13    IEEE1364_2005,
14    IEEE1800_2005,
15    IEEE1800_2009,
16    IEEE1800_2012,
17    IEEE1800_2017,
18    IEEE1800_2023,
19}
20
21// -----------------------------------------------------------------------
22// keyword_replace
23// -----------------------------------------------------------------------
24// Whether the token is a keyword that needs to be replaced, based on the
25// current standard
26
27impl<'a> Token<'a> {
28    pub fn keyword_replace(&self, standard: StandardVersion) -> bool {
29        let valid_in_standard = match self {
30            Token::Automatic
31            | Token::Endgenerate
32            | Token::Generate
33            | Token::Genvar
34            | Token::Localparam
35            | Token::Noshowcancelled
36            | Token::PulsestyleOndetect
37            | Token::PulsestyleOnevent
38            | Token::Showcancelled
39            | Token::Signed
40            | Token::Unsigned => standard > StandardVersion::IEEE1364_2001,
41            Token::Cell
42            | Token::Config
43            | Token::Design
44            | Token::Endconfig
45            | Token::Incdir
46            | Token::Include
47            | Token::Instance
48            | Token::Liblist
49            | Token::Library
50            | Token::Use => {
51                (standard >= StandardVersion::IEEE1364_2001)
52                    & (standard != StandardVersion::IEEE1364_2001Noconfig)
53            }
54            Token::Uwire => standard >= StandardVersion::IEEE1364_2005,
55            Token::Alias
56            | Token::AlwaysComb
57            | Token::AlwaysFf
58            | Token::AlwaysLatch
59            | Token::Assert
60            | Token::Assume
61            | Token::Before
62            | Token::Bind
63            | Token::Bins
64            | Token::Binsof
65            | Token::Bit
66            | Token::Break
67            | Token::Byte
68            | Token::Chandle
69            | Token::Class
70            | Token::Clocking
71            | Token::Const
72            | Token::Constraint
73            | Token::Context
74            | Token::Continue
75            | Token::Cover
76            | Token::Covergroup
77            | Token::Coverpoint
78            | Token::Cross
79            | Token::Dist
80            | Token::Do
81            | Token::Endclass
82            | Token::Endclocking
83            | Token::Endgroup
84            | Token::Endinterface
85            | Token::Endpackage
86            | Token::Endprogram
87            | Token::Endproperty
88            | Token::Endsequence
89            | Token::Enum
90            | Token::Expect
91            | Token::Export
92            | Token::Extends
93            | Token::Extern
94            | Token::Final
95            | Token::FirstMatch
96            | Token::Foreach
97            | Token::Forkjoin
98            | Token::Iff
99            | Token::IgnoreBins
100            | Token::IllegalBins
101            | Token::Import
102            | Token::Inside
103            | Token::Int
104            | Token::Interface
105            | Token::Intersect
106            | Token::JoinAny
107            | Token::JoinNone
108            | Token::Local
109            | Token::Logic
110            | Token::Longint
111            | Token::Matches
112            | Token::Modport
113            | Token::New
114            | Token::Null
115            | Token::Package
116            | Token::Packed
117            | Token::Priority
118            | Token::Program
119            | Token::Property
120            | Token::Protected
121            | Token::Pure
122            | Token::Rand
123            | Token::Randc
124            | Token::Randcase
125            | Token::Randsequence
126            | Token::Ref
127            | Token::Return
128            | Token::Sequence
129            | Token::Shortint
130            | Token::Shortreal
131            | Token::Solve
132            | Token::Static
133            | Token::String
134            | Token::Struct
135            | Token::Super
136            | Token::Tagged
137            | Token::This
138            | Token::Throughout
139            | Token::Timeprecision
140            | Token::Timeunit
141            | Token::Type
142            | Token::Typedef
143            | Token::Union
144            | Token::Unique
145            | Token::Var
146            | Token::Virtual
147            | Token::Void
148            | Token::WaitOrder
149            | Token::Wildcard
150            | Token::With
151            | Token::Within => standard >= StandardVersion::IEEE1800_2005,
152            Token::AcceptOn
153            | Token::Checker
154            | Token::Endchecker
155            | Token::Eventually
156            | Token::Global
157            | Token::Implies
158            | Token::Let
159            | Token::Nexttime
160            | Token::RejectOn
161            | Token::Restrict
162            | Token::SAlways
163            | Token::SEventually
164            | Token::SNexttime
165            | Token::SUntil
166            | Token::SUntilWith
167            | Token::Strong
168            | Token::SyncAcceptOn
169            | Token::SyncRejectOn
170            | Token::Unique0
171            | Token::Until
172            | Token::UntilWith
173            | Token::Untyped
174            | Token::Weak => standard >= StandardVersion::IEEE1800_2009,
175            Token::Implements | Token::Interconnect | Token::Nettype | Token::Soft => {
176                standard >= StandardVersion::IEEE1800_2012
177            }
178            _ => true,
179        };
180        !valid_in_standard
181    }
182}