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