This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
# -*- 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(//(\\.|.)*?$), 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
|
||||
Reference in New Issue
Block a user