Skip to main content

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