%{
/* Command-line: gperf -o -i 1 -C -k 1-3,$ -L C -H keyword_hash -N check_identifier -tT lexor_keyword.gperf */

#include "config.h"
#include "parse_misc.h"
#include "parse.h"
#include <string.h>
#include "lexor_keyword.h"
#include "compiler.h"

%}
struct lexor_keyword { const char*name; int mask; int tokenType; };
%%
above,			GN_KEYWORDS_VAMS_2_3,		K_above
abs,			GN_KEYWORDS_VAMS_2_3,		K_abs
absdelay,		GN_KEYWORDS_VAMS_2_3,		K_absdelay
abstol,			GN_KEYWORDS_VAMS_2_3,		K_abstol
access,			GN_KEYWORDS_VAMS_2_3,		K_access
acos,			GN_KEYWORDS_VAMS_2_3,		K_acos
acosh,			GN_KEYWORDS_VAMS_2_3,		K_acosh
ac_stim,		GN_KEYWORDS_VAMS_2_3,		K_ac_stim
alias,			GN_KEYWORDS_1800_2005,		K_alias
aliasparam,		GN_KEYWORDS_VAMS_2_3,		K_aliasparam
always,			GN_KEYWORDS_1364_1995,		K_always
always_comb,		GN_KEYWORDS_1800_2005,		K_always_comb
always_ff,		GN_KEYWORDS_1800_2005,		K_always_ff
always_latch,		GN_KEYWORDS_1800_2005,		K_always_latch
analog,			GN_KEYWORDS_VAMS_2_3,		K_analog
analysis,		GN_KEYWORDS_VAMS_2_3,		K_analysis
and,			GN_KEYWORDS_1364_1995,		K_and
asin,			GN_KEYWORDS_VAMS_2_3,		K_asin
asinh,			GN_KEYWORDS_VAMS_2_3,		K_asinh
# This is defined by both SystemVerilog 1800-2005 and Verilog-AMS 2.3
assert,	GN_KEYWORDS_1800_2005|GN_KEYWORDS_VAMS_2_3,	K_assert
assign,			GN_KEYWORDS_1364_1995,		K_assign
assume,			GN_KEYWORDS_1800_2005,		K_assume
atan,			GN_KEYWORDS_VAMS_2_3,		K_atan
atan2,			GN_KEYWORDS_VAMS_2_3,		K_atan2
atanh,			GN_KEYWORDS_VAMS_2_3,		K_atanh
automatic,		GN_KEYWORDS_1364_2001,		K_automatic
before,			GN_KEYWORDS_1800_2005,		K_before
begin,			GN_KEYWORDS_1364_1995,		K_begin
bind,			GN_KEYWORDS_1800_2005,		K_bind
bins,			GN_KEYWORDS_1800_2005,		K_bins
binsof,			GN_KEYWORDS_1800_2005,		K_binsof
bit,			GN_KEYWORDS_1800_2005,		K_bit
branch,			GN_KEYWORDS_VAMS_2_3,		K_branch
break,			GN_KEYWORDS_1800_2005,		K_break
bool,			GN_KEYWORDS_ICARUS,		K_bool
buf,			GN_KEYWORDS_1364_1995,		K_buf
bufif0,			GN_KEYWORDS_1364_1995,		K_bufif0
bufif1,			GN_KEYWORDS_1364_1995,		K_bufif1
byte,			GN_KEYWORDS_1800_2005,		K_byte
case,			GN_KEYWORDS_1364_1995,		K_case
casex,			GN_KEYWORDS_1364_1995,		K_casex
casez,			GN_KEYWORDS_1364_1995,		K_casez
ceil,			GN_KEYWORDS_VAMS_2_3,		K_ceil
cell,			GN_KEYWORDS_1364_2001_CONFIG,	K_cell
chandle,		GN_KEYWORDS_1800_2005,		K_chandle
class,			GN_KEYWORDS_1800_2005,		K_class
clocking,		GN_KEYWORDS_1800_2005,		K_clocking
cmos,			GN_KEYWORDS_1364_1995,		K_cmos
config,			GN_KEYWORDS_1364_2001_CONFIG,	K_config
connect,		GN_KEYWORDS_VAMS_2_3,		K_connect
connectmodule,		GN_KEYWORDS_VAMS_2_3,		K_connectmodule
connectrules,		GN_KEYWORDS_VAMS_2_3,		K_connectrules
const,			GN_KEYWORDS_1800_2005,		K_const
constraint,		GN_KEYWORDS_1800_2005,		K_constraint
context,		GN_KEYWORDS_1800_2005,		K_context
continue,		GN_KEYWORDS_1800_2005,		K_continue
continuous,		GN_KEYWORDS_VAMS_2_3,		K_continuous
cos,			GN_KEYWORDS_VAMS_2_3,		K_cos
cosh,			GN_KEYWORDS_VAMS_2_3,		K_cosh
cover,			GN_KEYWORDS_1800_2005,		K_cover
covergroup,		GN_KEYWORDS_1800_2005,		K_covergroup
coverpoint,		GN_KEYWORDS_1800_2005,		K_coverpoint
cross,			GN_KEYWORDS_1800_2005,		K_cross
ddt,			GN_KEYWORDS_VAMS_2_3,		K_ddt
ddt_nature,		GN_KEYWORDS_VAMS_2_3,		K_ddt_nature
ddx,			GN_KEYWORDS_VAMS_2_3,		K_ddx
deassign,		GN_KEYWORDS_1364_1995,		K_deassign
default,		GN_KEYWORDS_1364_1995,		K_default
defparam,		GN_KEYWORDS_1364_1995,		K_defparam
design,			GN_KEYWORDS_1364_2001_CONFIG,	K_design
disable,		GN_KEYWORDS_1364_1995,		K_disable
discipline,		GN_KEYWORDS_VAMS_2_3,		K_discipline
discrete,		GN_KEYWORDS_VAMS_2_3,		K_discrete
dist,			GN_KEYWORDS_1800_2005,		K_dist
do,			GN_KEYWORDS_1800_2005,		K_do
domain,			GN_KEYWORDS_VAMS_2_3,		K_domain
driver_update,		GN_KEYWORDS_VAMS_2_3,		K_driver_update
edge,			GN_KEYWORDS_1364_1995,		K_edge
else,			GN_KEYWORDS_1364_1995,		K_else
end,			GN_KEYWORDS_1364_1995,		K_end
endcase,		GN_KEYWORDS_1364_1995,		K_endcase
endconfig,		GN_KEYWORDS_1364_2001_CONFIG,	K_endconfig
endclass,		GN_KEYWORDS_1800_2005,		K_endclass
endclocking,		GN_KEYWORDS_1800_2005,		K_endclocking
endconnectrules,	GN_KEYWORDS_VAMS_2_3,		K_endconnectrules
enddiscipline,		GN_KEYWORDS_VAMS_2_3,		K_enddiscipline
endfunction,		GN_KEYWORDS_1364_1995,		K_endfunction
endgenerate,		GN_KEYWORDS_1364_2001,		K_endgenerate
endgroup,		GN_KEYWORDS_1800_2005,		K_endgroup
endinterface,		GN_KEYWORDS_1800_2005,		K_endinterface
endmodule,		GN_KEYWORDS_1364_1995,		K_endmodule
endnature,		GN_KEYWORDS_VAMS_2_3,		K_endnature
endpackage,		GN_KEYWORDS_1800_2005,		K_endpackage
endparamset,		GN_KEYWORDS_VAMS_2_3,		K_endparamset
endprimitive,		GN_KEYWORDS_1364_1995,		K_endprimitive
endprogram,		GN_KEYWORDS_1800_2005,		K_endprogram
endproperty,		GN_KEYWORDS_1800_2005,		K_endproperty
endspecify,		GN_KEYWORDS_1364_1995,		K_endspecify
endsequence,		GN_KEYWORDS_1800_2005,		K_endsequence
endtable,		GN_KEYWORDS_1364_1995,		K_endtable
endtask,		GN_KEYWORDS_1364_1995,		K_endtask
enum,			GN_KEYWORDS_1800_2005,		K_enum
event,			GN_KEYWORDS_1364_1995,		K_event
exclude,		GN_KEYWORDS_VAMS_2_3,		K_exclude
exp,			GN_KEYWORDS_VAMS_2_3,		K_exp
expect,			GN_KEYWORDS_1800_2005,		K_expect
export,			GN_KEYWORDS_1800_2005,		K_export
extends,		GN_KEYWORDS_1800_2005,		K_extends
extern,			GN_KEYWORDS_1800_2005,		K_extern
final,			GN_KEYWORDS_1800_2005,		K_final
final_step,		GN_KEYWORDS_VAMS_2_3,		K_final_step
first_match,		GN_KEYWORDS_1800_2005,		K_first_match
flicker_noise,		GN_KEYWORDS_VAMS_2_3,		K_flicker_noise
floor,			GN_KEYWORDS_VAMS_2_3,		K_floor
flow,			GN_KEYWORDS_VAMS_2_3,		K_flow
for,			GN_KEYWORDS_1364_1995,		K_for
foreach,		GN_KEYWORDS_1800_2005,		K_foreach
force,			GN_KEYWORDS_1364_1995,		K_force
forever,		GN_KEYWORDS_1364_1995,		K_forever
fork,			GN_KEYWORDS_1364_1995,		K_fork
forkjoin,		GN_KEYWORDS_1800_2005,		K_forkjoin
from,			GN_KEYWORDS_VAMS_2_3,		K_from
function,		GN_KEYWORDS_1364_1995,		K_function
generate,		GN_KEYWORDS_1364_2001,		K_generate
genvar,			GN_KEYWORDS_1364_2001,		K_genvar
ground,			GN_KEYWORDS_VAMS_2_3,		K_ground
highz0,			GN_KEYWORDS_1364_1995,		K_highz0
highz1,			GN_KEYWORDS_1364_1995,		K_highz1
hypot,			GN_KEYWORDS_VAMS_2_3,		K_hypot
idt,			GN_KEYWORDS_VAMS_2_3,		K_idt
idtmod,			GN_KEYWORDS_VAMS_2_3,		K_idtmod
idt_nature,		GN_KEYWORDS_VAMS_2_3,		K_idt_nature
if,			GN_KEYWORDS_1364_1995,		K_if
iff,			GN_KEYWORDS_1800_2005,		K_iff
ifnone,			GN_KEYWORDS_1364_1995,		K_ifnone
ignore_bins,		GN_KEYWORDS_1800_2005,		K_ignore_bins
illegal_bins,		GN_KEYWORDS_1800_2005,		K_illegal_bins
import,			GN_KEYWORDS_1800_2005,		K_import
incdir,			GN_KEYWORDS_1364_2001_CONFIG,	K_incdir
include,		GN_KEYWORDS_1364_2001_CONFIG,	K_include
inf,			GN_KEYWORDS_VAMS_2_3,		K_inf
initial,		GN_KEYWORDS_1364_1995,		K_initial
initial_step,		GN_KEYWORDS_VAMS_2_3,		K_initial_step
inout,			GN_KEYWORDS_1364_1995,		K_inout
input,			GN_KEYWORDS_1364_1995,		K_input
inside,			GN_KEYWORDS_1800_2005,		K_inside
instance,		GN_KEYWORDS_1364_2001_CONFIG,	K_instance
int,			GN_KEYWORDS_1800_2005,		K_int
integer,		GN_KEYWORDS_1364_1995,		K_integer
interface,		GN_KEYWORDS_1800_2005,		K_interface
intersect,		GN_KEYWORDS_1800_2005,		K_intersect
join,			GN_KEYWORDS_1364_1995,		K_join
join_any,		GN_KEYWORDS_1800_2005,		K_join_any
join_none,		GN_KEYWORDS_1800_2005,		K_join_none
laplace_nd,		GN_KEYWORDS_VAMS_2_3,		K_laplace_nd
laplace_np,		GN_KEYWORDS_VAMS_2_3,		K_laplace_np
laplace_zd,		GN_KEYWORDS_VAMS_2_3,		K_laplace_zd
laplace_zp,		GN_KEYWORDS_VAMS_2_3,		K_laplace_zp
large,			GN_KEYWORDS_1364_1995,		K_large
last_crossing,		GN_KEYWORDS_VAMS_2_3,		K_last_crossing
liblist,		GN_KEYWORDS_1364_2001_CONFIG,	K_liblist
library,		GN_KEYWORDS_1364_2001_CONFIG,	K_library
limexp,			GN_KEYWORDS_VAMS_2_3,		K_limexp
ln,			GN_KEYWORDS_VAMS_2_3,		K_ln
local,			GN_KEYWORDS_1800_2005,		K_local
localparam,		GN_KEYWORDS_1364_2001,		K_localparam
log,			GN_KEYWORDS_VAMS_2_3,		K_log
# This is defined by SystemVerilog 1800-2005 and as an Icarus extension.
logic,	GN_KEYWORDS_1800_2005|GN_KEYWORDS_ICARUS,	K_logic
longint,		GN_KEYWORDS_1800_2005,		K_longint
macromodule,		GN_KEYWORDS_1364_1995,		K_macromodule
matches,		GN_KEYWORDS_1800_2005,		K_matches
max,			GN_KEYWORDS_VAMS_2_3,		K_max
medium,			GN_KEYWORDS_1364_1995,		K_medium
merged,			GN_KEYWORDS_VAMS_2_3,		K_merged
min,			GN_KEYWORDS_VAMS_2_3,		K_min
modport,		GN_KEYWORDS_1800_2005,		K_modport
module,			GN_KEYWORDS_1364_1995,		K_module
nand,			GN_KEYWORDS_1364_1995,		K_nand
nature,			GN_KEYWORDS_VAMS_2_3,		K_nature
negedge,		GN_KEYWORDS_1364_1995,		K_negedge
net_resolution,		GN_KEYWORDS_VAMS_2_3,		K_net_resolution
new,			GN_KEYWORDS_1800_2005,		K_new
nmos,			GN_KEYWORDS_1364_1995,		K_nmos
noise_table,		GN_KEYWORDS_VAMS_2_3,		K_noise_table
nor,			GN_KEYWORDS_1364_1995,		K_nor
noshowcancelled,	GN_KEYWORDS_1364_2001,		K_noshowcancelled
not,			GN_KEYWORDS_1364_1995,		K_not
notif0,			GN_KEYWORDS_1364_1995,		K_notif0
notif1,			GN_KEYWORDS_1364_1995,		K_notif1
null,			GN_KEYWORDS_1800_2005,		K_null
or,			GN_KEYWORDS_1364_1995,		K_or
output,			GN_KEYWORDS_1364_1995,		K_output
package,		GN_KEYWORDS_1800_2005,		K_package
packed,			GN_KEYWORDS_1800_2005,		K_packed
parameter,		GN_KEYWORDS_1364_1995,		K_parameter
paramset,		GN_KEYWORDS_VAMS_2_3,		K_paramset
pmos,			GN_KEYWORDS_1364_1995,		K_pmos
posedge,		GN_KEYWORDS_1364_1995,		K_posedge
potential,		GN_KEYWORDS_VAMS_2_3,		K_potential
pow,			GN_KEYWORDS_VAMS_2_3,		K_pow
primitive,		GN_KEYWORDS_1364_1995,		K_primitive
priority,		GN_KEYWORDS_1800_2005,		K_priority
program,		GN_KEYWORDS_1800_2005,		K_program
property,		GN_KEYWORDS_1800_2005,		K_property
protected,		GN_KEYWORDS_1800_2005,		K_protected
pull0,			GN_KEYWORDS_1364_1995,		K_pull0
pull1,			GN_KEYWORDS_1364_1995,		K_pull1
pulldown,		GN_KEYWORDS_1364_1995,		K_pulldown
pullup,			GN_KEYWORDS_1364_1995,		K_pullup
pulsestyle_onevent,	GN_KEYWORDS_1364_2001,		K_pulsestyle_onevent
pulsestyle_ondetect,	GN_KEYWORDS_1364_2001,		K_pulsestyle_ondetect
pure,			GN_KEYWORDS_1800_2005,		K_pure
rand,			GN_KEYWORDS_1800_2005,		K_rand
randc,			GN_KEYWORDS_1800_2005,		K_randc
randcase,		GN_KEYWORDS_1800_2005,		K_randcase
randsequence,		GN_KEYWORDS_1800_2005,		K_randsequence
rcmos,			GN_KEYWORDS_1364_1995,		K_rcmos
real,			GN_KEYWORDS_1364_1995,		K_real
realtime,		GN_KEYWORDS_1364_1995,		K_realtime
ref,			GN_KEYWORDS_1800_2005,		K_ref
reg,			GN_KEYWORDS_1364_1995,		K_reg
release,		GN_KEYWORDS_1364_1995,		K_release
repeat,			GN_KEYWORDS_1364_1995,		K_repeat
resolveto,		GN_KEYWORDS_VAMS_2_3,		K_resolveto
return,			GN_KEYWORDS_1800_2005,		K_return
rnmos,			GN_KEYWORDS_1364_1995,		K_rnmos
rpmos,			GN_KEYWORDS_1364_1995,		K_rpmos
rtran,			GN_KEYWORDS_1364_1995,		K_rtran
rtranif0,		GN_KEYWORDS_1364_1995,		K_rtranif0
rtranif1,		GN_KEYWORDS_1364_1995,		K_rtranif1
scalared,		GN_KEYWORDS_1364_1995,		K_scalared
sequence,		GN_KEYWORDS_1800_2005,		K_sequence
shortint,		GN_KEYWORDS_1800_2005,		K_shortint
shortreal,		GN_KEYWORDS_1800_2005,		K_shortreal
showcancelled,		GN_KEYWORDS_1364_2001,		K_showcancelled
signed,			GN_KEYWORDS_1364_2001,		K_signed
sin,			GN_KEYWORDS_VAMS_2_3,		K_sin
sinh,			GN_KEYWORDS_VAMS_2_3,		K_sinh
slew,			GN_KEYWORDS_VAMS_2_3,		K_slew
small,			GN_KEYWORDS_1364_1995,		K_small
solve,			GN_KEYWORDS_1800_2005,		K_solve
specify,		GN_KEYWORDS_1364_1995,		K_specify
specparam,		GN_KEYWORDS_1364_1995,		K_specparam
split,			GN_KEYWORDS_VAMS_2_3,		K_split
sqrt,			GN_KEYWORDS_VAMS_2_3,		K_sqrt
static,			GN_KEYWORDS_1800_2005,		K_static
# This is defined by both SystemVerilog 1800-2005 and Verilog-AMS 2.3
string,	GN_KEYWORDS_1800_2005|GN_KEYWORDS_VAMS_2_3,	K_string
strong0,		GN_KEYWORDS_1364_1995,		K_strong0
strong1,		GN_KEYWORDS_1364_1995,		K_strong1
struct,			GN_KEYWORDS_1800_2005,		K_struct
super,			GN_KEYWORDS_1800_2005,		K_super
supply0,		GN_KEYWORDS_1364_1995,		K_supply0
supply1,		GN_KEYWORDS_1364_1995,		K_supply1
table,			GN_KEYWORDS_1364_1995,		K_table
tagged,			GN_KEYWORDS_1800_2005,		K_tagged
tan,			GN_KEYWORDS_VAMS_2_3,		K_tan
tanh,			GN_KEYWORDS_VAMS_2_3,		K_tanh
task,			GN_KEYWORDS_1364_1995,		K_task
this,			GN_KEYWORDS_1800_2005,		K_this
throughout,		GN_KEYWORDS_1800_2005,		K_throughout
time,			GN_KEYWORDS_1364_1995,		K_time
timeprecision,		GN_KEYWORDS_1800_2005,		K_timeprecision
timer,			GN_KEYWORDS_VAMS_2_3,		K_timer
timeunit,		GN_KEYWORDS_1800_2005,		K_timeunit
tran,			GN_KEYWORDS_1364_1995,		K_tran
tranif0,		GN_KEYWORDS_1364_1995,		K_tranif0
tranif1,		GN_KEYWORDS_1364_1995,		K_tranif1
transition,		GN_KEYWORDS_VAMS_2_3,		K_transition
tri,			GN_KEYWORDS_1364_1995,		K_tri
tri0,			GN_KEYWORDS_1364_1995,		K_tri0
tri1,			GN_KEYWORDS_1364_1995,		K_tri1
triand,			GN_KEYWORDS_1364_1995,		K_triand
trior,			GN_KEYWORDS_1364_1995,		K_trior
trireg,			GN_KEYWORDS_1364_1995,		K_trireg
type,			GN_KEYWORDS_1800_2005,		K_type
typedef,		GN_KEYWORDS_1800_2005,		K_typedef
union,			GN_KEYWORDS_1800_2005,		K_union
unique,			GN_KEYWORDS_1800_2005,		K_unique
units,			GN_KEYWORDS_VAMS_2_3,		K_units
# Reserved for future use!
unsigned,		GN_KEYWORDS_1364_2001,		K_unsigned
use,			GN_KEYWORDS_1364_2001_CONFIG,	K_use
uwire,			GN_KEYWORDS_1364_2005,		K_uwire
var,			GN_KEYWORDS_1800_2005,		K_var
vectored,		GN_KEYWORDS_1364_1995,		K_vectored
virtual,		GN_KEYWORDS_1800_2005,		K_virtual
void,			GN_KEYWORDS_1800_2005,		K_void
wait,			GN_KEYWORDS_1364_1995,		K_wait
wait_order,		GN_KEYWORDS_1800_2005,		K_wait_order
wand,			GN_KEYWORDS_1364_1995,		K_wand
weak0,			GN_KEYWORDS_1364_1995,		K_weak0
weak1,			GN_KEYWORDS_1364_1995,		K_weak1
while,			GN_KEYWORDS_1364_1995,		K_while
white_noise,		GN_KEYWORDS_VAMS_2_3,		K_white_noise
wildcard,		GN_KEYWORDS_1800_2005,		K_wildcard
wire,			GN_KEYWORDS_1364_1995,		K_wire
with,			GN_KEYWORDS_1800_2005,		K_with
within,			GN_KEYWORDS_1800_2005,		K_within
# This is the name originally proposed for uwire and is deprecated!
wone,			GN_KEYWORDS_1364_2005,		K_wone
wor,			GN_KEYWORDS_1364_1995,		K_wor
wreal,			GN_KEYWORDS_VAMS_2_3,		K_wreal
xnor,			GN_KEYWORDS_1364_1995,		K_xnor
xor,			GN_KEYWORDS_1364_1995,		K_xor
zi_nd,			GN_KEYWORDS_VAMS_2_3,		K_zi_nd
zi_np,			GN_KEYWORDS_VAMS_2_3,		K_zi_np
zi_zd,			GN_KEYWORDS_VAMS_2_3,		K_zi_zd
zi_zp,			GN_KEYWORDS_VAMS_2_3,		K_zi_zp
%%

int lexor_keyword_mask = 0;

int lexor_keyword_code(const char*str, unsigned nstr)
{
      const struct lexor_keyword*rc = check_identifier(str, nstr);
      if (rc == 0)
	  return IDENTIFIER;
      else if ((rc->mask & lexor_keyword_mask) == 0)
          return IDENTIFIER;
      else
	  return rc->tokenType;
}
