164 lines
6.6 KiB
Ruby
164 lines
6.6 KiB
Ruby
|
# -*- coding: utf-8 -*- #
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
module Rouge
|
||
|
module Lexers
|
||
|
class Verilog < RegexLexer
|
||
|
title "Verilog and System Verilog"
|
||
|
desc "The System Verilog hardware description language"
|
||
|
tag 'verilog'
|
||
|
filenames '*.v', '*.sv', '*.svh'
|
||
|
mimetypes 'text/x-verilog', 'text/x-systemverilog'
|
||
|
|
||
|
id = /[a-zA-Z_][a-zA-Z0-9_]*/
|
||
|
|
||
|
def self.keywords
|
||
|
@keywords ||= Set.new %w(
|
||
|
alias always always_comb always_ff always_latch assert assert_strobe
|
||
|
assign assume automatic attribute before begin bind bins binsof break
|
||
|
case casex casez clocking config constraint context continue cover
|
||
|
covergroup coverpoint cross deassign defparam default design dist do
|
||
|
else end endattribute endcase endclass endclocking endconfig
|
||
|
endfunction endgenerate endgroup endinterface endmodule endpackage
|
||
|
endprimitive endprogram endproperty endspecify endsequence endtable
|
||
|
endtask expect export extends extern final first_match for force
|
||
|
foreach fork forkjoin forever function generate genvar if iff ifnone
|
||
|
ignore_bins illegal_bins import incdir include initial inside instance
|
||
|
interface intersect join join_any join_none liblist library local
|
||
|
localparam matches module modport new noshowcancelled null package
|
||
|
parameter primitive priority program property protected
|
||
|
pulsestyle_onevent pulsestyle_ondetect pure rand randc randcase
|
||
|
randsequence release return sequence showcancelled solve specify super
|
||
|
table task this throughout timeprecision timeunit type typedef unique
|
||
|
use wait wait_order while wildcard with within
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def self.keywords_type
|
||
|
@keywords_type ||= Set.new %w(
|
||
|
and bit buf bufif0 bufif1 byte cell chandle class cmos const disable
|
||
|
edge enum event highz0 highz1 initial inout input int integer join
|
||
|
logic longint macromodule medium nand negedge nmos nor not
|
||
|
notif0 notif1 or output packed parameter pmos posedge pull0 pull1
|
||
|
pulldown pullup rcmos real realtime ref reg repeat rnmos rpmos rtran
|
||
|
rtranif0 rtranif1 scalared shortint shortreal signed specparam
|
||
|
static string strength strong0 strong1 struct supply0 supply1 tagged
|
||
|
time tran tranif0 tranif1 tri tri0 tri1 triand trior trireg union
|
||
|
unsigned uwire var vectored virtual void wait wand weak[01] wire wor
|
||
|
xnor xor
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def self.keywords_system_task
|
||
|
@keyword_system_task ||= Set.new %w(
|
||
|
acos acosh asin asinh assertfailoff assertfailon assertkill
|
||
|
assertnonvacuouson assertoff asserton assertpassoff assertpasson
|
||
|
assertvacuousoff atan atan2 atanh bits bitstoreal bitstoshortreal
|
||
|
cast ceil changed changed_gclk changing_gclk clog2 cos cosh countones
|
||
|
coverage_control coverage_get coverage_get_max coverage_merge
|
||
|
coverage_save dimensions display displayb displayh displayo
|
||
|
dist_chi_square dist_erlang dist_exponential dist_normal dist_poisson
|
||
|
dist_t dist_uniform dumpall dumpfile dumpflush dumplimit dumpoff
|
||
|
dumpon dumpports dumpportsall dumpportsflush dumpportslimit
|
||
|
dumpportsoff dumpportson dumpvars error exit exp falling_gclk fclose
|
||
|
fdisplay fdisplayb fdisplayh fdisplayo fell fell_gclk feof ferror
|
||
|
fflush fgetc fgets finish floor fmonitor fmonitorb fmonitorh fmonitoro
|
||
|
fopen fread fscanf fseek fstrobe fstrobeb fstrobeh fstrobeo ftell
|
||
|
future_gclk fwrite fwriteb fwriteh fwriteo get_coverage high hypot
|
||
|
increment info isunbounded isunknown itor left ln load_coverage_db
|
||
|
log10 low monitor monitorb monitorh monitoro monitoroff monitoron
|
||
|
onehot onehot0 past past_gclk pow printtimescale q_add q_exam q_full
|
||
|
q_initialize q_remove random readmemb readmemh realtime realtobits
|
||
|
rewind right rising_gclk rose rose_gclk rtoi sampled
|
||
|
set_coverage_db_name sformat sformatf shortrealtobits signed sin sinh
|
||
|
size sqrt sscanf stable stable_gclk steady_gclk stime stop strobe
|
||
|
strobeb strobeh strobeo swrite swriteb swriteh swriteo system tan tanh
|
||
|
time timeformat typename ungetc unpacked_dimensions unsigned warning
|
||
|
write writeb writeh writememb writememh writeo
|
||
|
)
|
||
|
end
|
||
|
|
||
|
state :expr_bol do
|
||
|
mixin :inline_whitespace
|
||
|
rule %r/`define/, Comment::Preproc, :macro
|
||
|
|
||
|
rule(//) { pop! }
|
||
|
end
|
||
|
|
||
|
# :expr_bol is the same as :bol but without labels, since
|
||
|
# labels can only appear at the beginning of a statement.
|
||
|
state :bol do
|
||
|
rule %r/#{id}:(?!:)/, Name::Label
|
||
|
mixin :expr_bol
|
||
|
end
|
||
|
|
||
|
state :inline_whitespace do
|
||
|
rule %r/[ \t\r]+/, Text
|
||
|
rule %r/\\\n/, Text # line continuation
|
||
|
rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
|
||
|
end
|
||
|
|
||
|
state :whitespace do
|
||
|
rule %r/\n+/m, Text, :bol
|
||
|
rule %r(//(\\.|.)*?\n), Comment::Single, :bol
|
||
|
mixin :inline_whitespace
|
||
|
end
|
||
|
|
||
|
state :expr_whitespace do
|
||
|
rule %r/\n+/m, Text, :expr_bol
|
||
|
mixin :whitespace
|
||
|
end
|
||
|
|
||
|
state :string do
|
||
|
rule %r/"/, Str, :pop!
|
||
|
rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
|
||
|
rule %r/[^\\"\n]+/, Str
|
||
|
rule %r/\\\n/, Str
|
||
|
rule %r/\\/, Str # stray backslash
|
||
|
end
|
||
|
|
||
|
state :statement do
|
||
|
mixin :whitespace
|
||
|
rule %r/L?"/, Str, :string
|
||
|
rule %r/([0-9_]+\.[0-9_]*|[0-9_]*\.[0-9_]+)(e[+-]?[0-9_]+)?/i, Num::Float
|
||
|
rule %r/[0-9_]+e[+-]?[0-9_]+/i, Num::Float
|
||
|
rule %r/[0-9]*'h[0-9a-fA-F_?]+/, Num::Hex
|
||
|
rule %r/[0-9]*'b?[01xz_?]+/, Num::Bin
|
||
|
rule %r/[0-9]*'d[0-9_?]+/, Num::Integer
|
||
|
rule %r/[0-9_]+[lu]*/i, Num::Integer
|
||
|
rule %r([-~!%^&*+=\|?:<>/@{}]), Operator
|
||
|
rule %r/[()\[\],.$\#;]/, Punctuation
|
||
|
rule %r/`(\w+)/, Comment::Preproc
|
||
|
|
||
|
rule id do |m|
|
||
|
name = m[0]
|
||
|
|
||
|
if self.class.keywords.include? name
|
||
|
token Keyword
|
||
|
elsif self.class.keywords_type.include? name
|
||
|
token Keyword::Type
|
||
|
elsif self.class.keywords_system_task.include? name
|
||
|
token Name::Builtin
|
||
|
else
|
||
|
token Name
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
state :root do
|
||
|
mixin :expr_whitespace
|
||
|
rule(//) { push :statement }
|
||
|
end
|
||
|
|
||
|
state :macro do
|
||
|
rule %r/\n/, Comment::Preproc, :pop!
|
||
|
mixin :inline_whitespace
|
||
|
rule %r/;/, Punctuation
|
||
|
rule %r/\=/, Operator
|
||
|
rule %r/(\w+)/, Text
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
end
|