mirror of
https://github.com/microsoft/monaco-editor.git
synced 2025-12-22 22:02:55 +01:00
Add Systemverilog language support
Co-authored-by: cinnamontoastmafia <brianna.k.loomis@gmail.com> Co-authored-by: Cinnamontoastmafia <cinnamontoastmafia@users.noreply.github.com> Co-authored-by: elakkiap <elakkiap@users.noreply.github.com> Co-authored-by: Fred Chu <freddychu222@users.noreply.github.com> Co-authored-by: Freddychu222 <43318067+Freddychu222@users.noreply.github.com> Co-authored-by: NeilW2020 <neil.j.wen@gmail.com> Co-authored-by: root <xadegunt@users.noreply.github.com> Co-authored-by: sabalkaw <68864756+sabalkaw@users.noreply.github.com> Co-authored-by: sago5993 <sago5993@users.noreply.github.com> Co-authored-by: Vivian Cheng <vccheng@andrew.cmu.edu> Co-authored-by: xadegunt <62346806+xadegunt@users.noreply.github.com>
This commit is contained in:
parent
618f2cff2d
commit
c77b1099da
4 changed files with 1370 additions and 0 deletions
|
|
@ -61,6 +61,7 @@ import './sophia/sophia.contribution';
|
||||||
import './sql/sql.contribution';
|
import './sql/sql.contribution';
|
||||||
import './st/st.contribution';
|
import './st/st.contribution';
|
||||||
import './swift/swift.contribution';
|
import './swift/swift.contribution';
|
||||||
|
import './systemverilog/systemverilog.contribution';
|
||||||
import './tcl/tcl.contribution';
|
import './tcl/tcl.contribution';
|
||||||
import './twig/twig.contribution';
|
import './twig/twig.contribution';
|
||||||
import './typescript/typescript.contribution';
|
import './typescript/typescript.contribution';
|
||||||
|
|
|
||||||
23
src/systemverilog/systemverilog.contribution.ts
Normal file
23
src/systemverilog/systemverilog.contribution.ts
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import { registerLanguage } from '../_.contribution';
|
||||||
|
|
||||||
|
registerLanguage({
|
||||||
|
id: 'systemverilog',
|
||||||
|
extensions: ['.sv', '.svh'],
|
||||||
|
aliases: ['SV', 'sv', 'SystemVerilog', 'systemverilog'],
|
||||||
|
loader: () => import('./systemverilog')
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
registerLanguage({
|
||||||
|
id: 'verilog',
|
||||||
|
extensions: ['.v', '.vh'],
|
||||||
|
aliases: ['V', 'v', 'Verilog', 'verilog'],
|
||||||
|
loader: () => import('./systemverilog')
|
||||||
|
});
|
||||||
|
|
||||||
1059
src/systemverilog/systemverilog.test.ts
Normal file
1059
src/systemverilog/systemverilog.test.ts
Normal file
File diff suppressed because it is too large
Load diff
287
src/systemverilog/systemverilog.ts
Normal file
287
src/systemverilog/systemverilog.ts
Normal file
|
|
@ -0,0 +1,287 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration;
|
||||||
|
import ILanguage = monaco.languages.IMonarchLanguage;
|
||||||
|
|
||||||
|
export const conf: IRichLanguageConfiguration = {
|
||||||
|
comments: {
|
||||||
|
lineComment: '//',
|
||||||
|
blockComment: ['/*', '*/'],
|
||||||
|
},
|
||||||
|
brackets: [
|
||||||
|
['{', '}'],
|
||||||
|
['[', ']'],
|
||||||
|
['(', ')'],
|
||||||
|
['begin', 'end'],
|
||||||
|
['case', 'endcase'],
|
||||||
|
['casex', 'endcase'],
|
||||||
|
['casez', 'endcase'],
|
||||||
|
['checker', 'endchecker'],
|
||||||
|
['class', 'endclass'],
|
||||||
|
['clocking', 'endclocking'],
|
||||||
|
['config', 'endconfig'],
|
||||||
|
['function', 'endfunction'],
|
||||||
|
['generate', 'endgenerate'],
|
||||||
|
['group', 'endgroup'],
|
||||||
|
['interface', 'endinterface'],
|
||||||
|
['module', 'endmodule'],
|
||||||
|
['package', 'endpackage'],
|
||||||
|
['primitive', 'endprimitive'],
|
||||||
|
['program', 'endprogram'],
|
||||||
|
['property', 'endproperty'],
|
||||||
|
['specify', 'endspecify'],
|
||||||
|
['sequence', 'endsequence'],
|
||||||
|
['table', 'endtable'],
|
||||||
|
['task', 'endtask'],
|
||||||
|
],
|
||||||
|
autoClosingPairs: [
|
||||||
|
{ open: '[', close: ']' },
|
||||||
|
{ open: '{', close: '}' },
|
||||||
|
{ open: '(', close: ')' },
|
||||||
|
{ open: '\'', close: '\'', notIn: ['string', 'comment'] },
|
||||||
|
{ open: '"', close: '"', notIn: ['string'] },
|
||||||
|
],
|
||||||
|
surroundingPairs: [
|
||||||
|
{ open: '{', close: '}' },
|
||||||
|
{ open: '[', close: ']' },
|
||||||
|
{ open: '(', close: ')' },
|
||||||
|
{ open: '"', close: '"' },
|
||||||
|
{ open: '\'', close: '\'' },
|
||||||
|
],
|
||||||
|
folding: {
|
||||||
|
offSide: false,
|
||||||
|
markers: {
|
||||||
|
start: new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:begin|case(x|z)?|class|clocking|config|covergroup|function|generate|interface|module|package|primitive|property|program|sequence|specify|table|task)\\b"),
|
||||||
|
end: new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:end|endcase|endclass|endclocking|endconfig|endgroup|endfunction|endgenerate|endinterface|endmodule|endpackage|endprimitive|endproperty|endprogram|endsequence|endspecify|endtable|endtask)\\b")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const language = <ILanguage>{
|
||||||
|
defaultToken: '',
|
||||||
|
tokenPostfix: '.sv',
|
||||||
|
|
||||||
|
brackets: [
|
||||||
|
{ token: 'delimiter.curly', open: '{', close: '}' },
|
||||||
|
{ token: 'delimiter.parenthesis', open: '(', close: ')' },
|
||||||
|
{ token: 'delimiter.square', open: '[', close: ']' },
|
||||||
|
{ token: 'delimiter.angle', open: '<', close: '>' }
|
||||||
|
],
|
||||||
|
|
||||||
|
keywords: [
|
||||||
|
'accept_on', 'alias', 'always', 'always_comb', 'always_ff', 'always_latch', 'and', 'assert', 'assign', 'assume', 'automatic',
|
||||||
|
'before', 'begin', 'bind','bins', 'binsof', 'bit','break', 'buf', 'bufif0', 'bufif1', 'byte',
|
||||||
|
'case', 'casex', 'casez', 'cell', 'chandle', 'checker', 'class', 'clocking', 'cmos', 'config', 'const', 'constraint', 'context', 'continue',
|
||||||
|
'cover', 'covergroup', 'coverpoint', 'cross',
|
||||||
|
'deassign', 'default', 'defparam', 'design', 'disable', 'dist', 'do',
|
||||||
|
'edge', 'else', 'end', 'endcase', 'endchecker', 'endclass', 'endclocking', 'endconfig', 'endfunction', 'endgenerate', 'endgroup', 'endinterface', 'endmodule', 'endpackage',
|
||||||
|
'endprimitive', 'endprogram', 'endproperty', 'endspecify', 'endsequence', 'endtable', 'endtask', 'enum', 'event', 'eventually', 'expect', 'export', 'extends', 'extern',
|
||||||
|
'final', 'first_match', 'for', 'force', 'foreach', 'forever', 'fork', 'forkjoin', 'function',
|
||||||
|
'generate', 'genvar', 'global',
|
||||||
|
'highz0', 'highz1',
|
||||||
|
'if', 'iff', 'ifnone', 'ignore_bins', 'illegal_bins', 'implements', 'implies', 'import', 'incdir', 'include', 'initial', 'inout', 'input', 'inside',
|
||||||
|
'instance', 'int', 'integer', 'interconnect', 'interface', 'intersect',
|
||||||
|
'join', 'join_any', 'join_none',
|
||||||
|
'large', 'let', 'liblist', 'library', 'local', 'localparam', 'logic', 'longint',
|
||||||
|
'macromodule', 'matches', 'medium', 'modport', 'module',
|
||||||
|
'nand', 'negedge', 'nettype', 'new', 'nexttime', 'nmos', 'nor', 'noshowcancelled', 'not', 'notif0', 'notif1', 'null',
|
||||||
|
'or', 'output',
|
||||||
|
'package', 'packed', 'parameter', 'pmos', 'posedge', 'primitive', 'priority', 'program', 'property', 'protected',
|
||||||
|
'pull0', 'pull1', 'pulldown', 'pullup', 'pulsestyle_ondetect', 'pulsestyle_onevent', 'pure',
|
||||||
|
'rand', 'randc', 'randcase', 'randsequence', 'rcmos', 'real', 'realtime', 'ref', 'reg', 'reject_on', 'release', 'repeat',
|
||||||
|
'restrict', 'return', 'rnmos', 'rpmos', 'rtran', 'rtranif0', 'rtranif1',
|
||||||
|
's_always', 's_eventually', 's_nexttime', 's_until', 's_until_with', 'scalared', 'sequence', 'shortint', 'shortreal', 'showcancelled', 'signed', 'small', 'soft',
|
||||||
|
'solve', 'specify', 'specparam', 'static', 'string', 'strong', 'strong0', 'strong1', 'struct', 'super', 'supply0', 'supply1', 'sync_accept_on', 'sync_reject_on',
|
||||||
|
'table', 'tagged', 'task', 'this', 'throughout', 'time', 'timeprecision', 'timeunit', 'tran', 'tranif0', 'tranif1', 'tri', 'tri0', 'tri1', 'triand', 'trior', 'trireg', 'type', 'typedef',
|
||||||
|
'union', 'unique', 'unique0', 'unsigned','until', 'until_with', 'untyped', 'use', 'uwire',
|
||||||
|
'var', 'vectored', 'virtual', 'void',
|
||||||
|
'wait', 'wait_order', 'wand', 'weak', 'weak0', 'weak1', 'while', 'wildcard', 'wire', 'with', 'within', 'wor',
|
||||||
|
'xnor', 'xor'
|
||||||
|
],
|
||||||
|
|
||||||
|
builtin_gates: [
|
||||||
|
'and',
|
||||||
|
'nand',
|
||||||
|
'nor',
|
||||||
|
'or',
|
||||||
|
'xor',
|
||||||
|
'xnor',
|
||||||
|
'buf',
|
||||||
|
'not',
|
||||||
|
'bufif0',
|
||||||
|
'bufif1',
|
||||||
|
'notif1',
|
||||||
|
'notif0',
|
||||||
|
'cmos',
|
||||||
|
'nmos',
|
||||||
|
'pmos',
|
||||||
|
'rcmos',
|
||||||
|
'rnmos',
|
||||||
|
'rpmos',
|
||||||
|
'tran',
|
||||||
|
'tranif1',
|
||||||
|
'tranif0',
|
||||||
|
'rtran',
|
||||||
|
'rtranif1',
|
||||||
|
'rtranif0'
|
||||||
|
],
|
||||||
|
|
||||||
|
operators: [
|
||||||
|
// assignment operators
|
||||||
|
'=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '<<=',
|
||||||
|
'>>+', '<<<=', '>>>=',
|
||||||
|
// conditional expression
|
||||||
|
'?', ':',
|
||||||
|
// Unary operators
|
||||||
|
'+', '-', '!', '~', '&', '~&', '|', '~|', '^', '~^', '^~',
|
||||||
|
//binary operators
|
||||||
|
'+', '-', '*', '/', '%', '==', '!=', '===', '!==', '==?',
|
||||||
|
'!=?', '&&', '||', '**', '<', '<=', '>', '>=', '&', '|', '^',
|
||||||
|
'>>', '<<', '>>>', '<<<',
|
||||||
|
// increment or decrement operator
|
||||||
|
'++', '--',
|
||||||
|
//binary logical operator
|
||||||
|
'->', '<->',
|
||||||
|
// binary set membership operator
|
||||||
|
'inside',
|
||||||
|
// binary distrubution operator
|
||||||
|
'dist',
|
||||||
|
'::', '+:', '-:', '*>', '&&&',
|
||||||
|
'|->', '|=>',
|
||||||
|
'#=#'
|
||||||
|
],
|
||||||
|
|
||||||
|
// we include these common regular expressions
|
||||||
|
symbols: /[=><!~?:&|+\-*\/\^%#]+/,
|
||||||
|
escapes: /%%|\\(?:[antvf\\"']|x[0-9A-Fa-f]{1,2}|[0-7]{1,3})/,
|
||||||
|
identifier: /(?:[a-zA-Z_][a-zA-Z0-9_$\.]*|\\\S+ )/,
|
||||||
|
systemcall: /[$][a-zA-Z0-9_]+/,
|
||||||
|
timeunits: /s|ms|us|ns|ps|fs/,
|
||||||
|
|
||||||
|
// The main tokenizer for our languages
|
||||||
|
tokenizer: {
|
||||||
|
root: [
|
||||||
|
|
||||||
|
// module instances
|
||||||
|
[/^(\s*)(@identifier)/, ['', {
|
||||||
|
cases: {
|
||||||
|
'@builtin_gates': { token: 'keyword.$2', next: '@module_instance'},
|
||||||
|
'@keywords': { token: 'keyword.$2' },
|
||||||
|
'@default': { token: 'identifier', next: '@module_instance'}
|
||||||
|
}
|
||||||
|
}]],
|
||||||
|
|
||||||
|
// include statements
|
||||||
|
[/^\s*`include/, { token: 'keyword.directive.include', next: '@include' }],
|
||||||
|
|
||||||
|
// Preprocessor directives
|
||||||
|
[/^\s*`\s*\w+/, 'keyword'],
|
||||||
|
|
||||||
|
// identifiers and keywords
|
||||||
|
{ include: '@identifier_or_keyword' },
|
||||||
|
|
||||||
|
// whitespace
|
||||||
|
{ include: '@whitespace' },
|
||||||
|
|
||||||
|
// (* attributes *).
|
||||||
|
[/\(\*.*\*\)/, 'annotation'],
|
||||||
|
|
||||||
|
// Systemcall
|
||||||
|
[/@systemcall/, 'variable.predefined'],
|
||||||
|
|
||||||
|
// delimiters and operators
|
||||||
|
[/[{}()\[\]]/, '@brackets'],
|
||||||
|
[/[<>](?!@symbols)/, '@brackets'],
|
||||||
|
[/@symbols/, {
|
||||||
|
cases: {
|
||||||
|
'@operators': 'delimiter',
|
||||||
|
'@default': ''
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
|
||||||
|
// numbers
|
||||||
|
{ include: '@numbers' },
|
||||||
|
|
||||||
|
// delimiter: after number because of .\d floats
|
||||||
|
[/[;,.]/, 'delimiter'],
|
||||||
|
|
||||||
|
// strings
|
||||||
|
{ include: '@strings' }
|
||||||
|
],
|
||||||
|
|
||||||
|
identifier_or_keyword: [
|
||||||
|
[/@identifier/, {
|
||||||
|
cases: {
|
||||||
|
'@keywords': { token: 'keyword.$0' },
|
||||||
|
'@default': 'identifier'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
|
||||||
|
numbers: [
|
||||||
|
[/\d+?[\d_]*(?:\.[\d_]+)?[eE][\-+]?\d+/, 'number.float'],
|
||||||
|
[/\d+?[\d_]*\.[\d_]+(?:\s*@timeunits)?/, 'number.float'],
|
||||||
|
[/(?:\d+?[\d_]*\s*)?'[sS]?[dD]\s*[0-9xXzZ?]+?[0-9xXzZ?_]*/, 'number'],
|
||||||
|
[/(?:\d+?[\d_]*\s*)?'[sS]?[bB]\s*[0-1xXzZ?]+?[0-1xXzZ?_]*/, 'number.binary'],
|
||||||
|
[/(?:\d+?[\d_]*\s*)?'[sS]?[oO]\s*[0-7xXzZ?]+?[0-7xXzZ?_]*/, 'number.octal'],
|
||||||
|
[/(?:\d+?[\d_]*\s*)?'[sS]?[hH]\s*[0-9a-fA-FxXzZ?]+?[0-9a-fA-FxXzZ?_]*/, 'number.hex'],
|
||||||
|
[/1step/, 'number'],
|
||||||
|
[/[\dxXzZ]+?[\dxXzZ_]*(?:\s*@timeunits)?/, 'number'],
|
||||||
|
[/'[01xXzZ]+/, 'number'],
|
||||||
|
],
|
||||||
|
|
||||||
|
module_instance: [
|
||||||
|
{ include: '@whitespace' },
|
||||||
|
[/(#?)(\()/, ['', {token: '@brackets', next: '@port_connection'}]],
|
||||||
|
[/@identifier\s*[;={}\[\],]/, {token: '@rematch', next: '@pop'}],
|
||||||
|
[/@symbols|[;={}\[\],]/, {token: '@rematch', next: '@pop'}],
|
||||||
|
[/@identifier/, 'type'],
|
||||||
|
[/;/, 'delimiter', '@pop'],
|
||||||
|
],
|
||||||
|
|
||||||
|
port_connection: [
|
||||||
|
{ include: '@identifier_or_keyword' },
|
||||||
|
{ include: '@whitespace' },
|
||||||
|
[/@systemcall/, 'variable.predefined'],
|
||||||
|
{ include: '@numbers' },
|
||||||
|
{ include: '@strings'},
|
||||||
|
[/[,]/, 'delimiter'],
|
||||||
|
[/\(/, '@brackets', '@port_connection'],
|
||||||
|
[/\)/, '@brackets', '@pop'],
|
||||||
|
],
|
||||||
|
|
||||||
|
whitespace: [
|
||||||
|
[/[ \t\r\n]+/, ''],
|
||||||
|
[/\/\*/, 'comment', '@comment'],
|
||||||
|
[/\/\/.*$/, 'comment'],
|
||||||
|
],
|
||||||
|
|
||||||
|
comment: [
|
||||||
|
[/[^\/*]+/, 'comment'],
|
||||||
|
[/\*\//, 'comment', '@pop'],
|
||||||
|
[/[\/*]/, 'comment']
|
||||||
|
],
|
||||||
|
|
||||||
|
strings: [
|
||||||
|
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string
|
||||||
|
[/"/, 'string', '@string'],
|
||||||
|
],
|
||||||
|
|
||||||
|
string: [
|
||||||
|
[/[^\\"]+/, 'string'],
|
||||||
|
[/@escapes/, 'string.escape'],
|
||||||
|
[/\\./, 'string.escape.invalid'],
|
||||||
|
[/"/, 'string', '@pop']
|
||||||
|
],
|
||||||
|
|
||||||
|
include: [
|
||||||
|
[/(\s*)(")([\w*\/*]*)(.\w*)(")/, ['', 'string.include.identifier', 'string.include.identifier', 'string.include.identifier', { token: 'string.include.identifier', next: '@pop'}]],
|
||||||
|
[/(\s*)(<)([\w*\/*]*)(.\w*)(>)/, ['', 'string.include.identifier', 'string.include.identifier', 'string.include.identifier', { token: 'string.include.identifier', next: '@pop'}]]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue