diff --git a/ale_linters/verilog/verible_ls.vim b/ale_linters/verilog/verible_ls.vim new file mode 100644 index 00000000..0c7774ec --- /dev/null +++ b/ale_linters/verilog/verible_ls.vim @@ -0,0 +1,43 @@ +" Author: Nicolas Derumigny +" Description: Verible LSP for verilog + +call ale#Set('verilog_verible_ls_options', '--rules_config_search') +call ale#Set('verilog_verible_ls_rules', '') +call ale#Set('verilog_verible_ls_executable', 'verible-verilog-ls') +call ale#Set('verilog_verible_ls_config', {}) + +function! ale_linters#verilog#verible_ls#GetProjectRoot(buffer) abort + let l:git_dir = ale#path#FindNearestFile(a:buffer, 'verible.filelist') + + if !empty(l:git_dir) + return fnamemodify(l:git_dir, ':p:h') + else + return fnamemodify('', ':h') + endif +endfunction + +function! ale_linters#verilog#verible_ls#GetCommand(buffer) abort + let l:command = ale#Escape(ale#Var(a:buffer, 'verilog_verible_ls_executable')) + let l:options = ale#Var(a:buffer, 'verilog_verible_ls_options') + let l:rules = ale#Var(a:buffer, 'verilog_verible_ls_rules') + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + if l:rules isnot# '' + let l:command .= ' --rules=' . l:rules + endif + + return l:command +endfunction + + +call ale#linter#Define('verilog', { +\ 'name': 'verible_ls', +\ 'lsp': 'stdio', +\ 'lsp_config': {b -> ale#Var(b, 'verilog_verible_ls_config')}, +\ 'executable': {b -> ale#Var(b, 'verilog_verible_ls_executable')}, +\ 'command': function('ale_linters#verilog#verible_ls#GetCommand') , +\ 'project_root': function('ale_linters#verilog#verible_ls#GetProjectRoot'), +\}) diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim index 03df1a83..8288b1a9 100644 --- a/autoload/ale/fix/registry.vim +++ b/autoload/ale/fix/registry.vim @@ -742,6 +742,11 @@ let s:default_registry = { \ 'suggested_filetypes': ['toml'], \ 'description': 'Lints TOML files', \ }, +\ 'verible_format': { +\ 'function': 'ale#fixers#verible_format#Fix', +\ 'suggested_filetypes': ['verilog'], +\ 'description': 'Formats verilog files using verible.', +\ }, \} " Reset the function registry to the default entries. diff --git a/autoload/ale/fixers/verible_format.vim b/autoload/ale/fixers/verible_format.vim new file mode 100644 index 00000000..c78c3cfd --- /dev/null +++ b/autoload/ale/fixers/verible_format.vim @@ -0,0 +1,17 @@ +" Author: Nicolas Derumigny +" Description: verible formatter for verilog. + +call ale#Set('verilog_verible_format_executable', 'verible-verilog-format') +call ale#Set('verilog_verible_format_options', '') + +function! ale#fixers#verible_format#Fix(buffer) abort + let l:executable = ale#Escape(ale#Var(a:buffer, 'verilog_verible_format_executable')) + let l:command = l:executable + let l:options = ale#Var(a:buffer, 'verilog_verible_format_options') + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + return {'command': l:command . ' -'} +endfunction diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt index 39b24295..19c83f26 100644 --- a/doc/ale-supported-languages-and-tools.txt +++ b/doc/ale-supported-languages-and-tools.txt @@ -724,6 +724,7 @@ Notes: * `hdl-checker` * `iverilog` * slang + * `verible` * `verilator` * `vlog` * `xvlog` diff --git a/doc/ale-verilog.txt b/doc/ale-verilog.txt index 481b51cd..9081ecdf 100644 --- a/doc/ale-verilog.txt +++ b/doc/ale-verilog.txt @@ -3,7 +3,7 @@ ALE Verilog/SystemVerilog Integration *ale-verilog-options* =============================================================================== -ALE can use seven different linters for Verilog HDL: +ALE can use eight different linters for Verilog HDL: HDL Checker Using `hdl_checker --lsp` @@ -14,6 +14,9 @@ ALE can use seven different linters for Verilog HDL: slang: Using `slang -Weverything` + verible_ls + Using `verible-verilog-ls` + verilator Using `verilator --lint-only -Wall` @@ -35,6 +38,12 @@ defining 'g:ale_linters' variable: > \ let g:ale_linters = {'systemverilog' : ['verilator'],} < +=============================================================================== +ALE can use one fixer for Verilog HDL: + + + verible_fomat + Using `verible-verilog-format` =============================================================================== General notes @@ -80,8 +89,74 @@ g:ale_verilog_slang_option This variable can be changed to modify 'slang' command arguments. +=============================================================================== +verible_ls *ale-verilog-verible-ls* + + *ale-config.verilog_verible_ls_executable* + *g:ale_verilog_verible_ls_executable* + *b:ale_verilog_verible_ls_executable* +verilog_verible_ls_executable +g:ale_verilog_verible_ls_executable + Type: |String| + Default: `'verible-verilog-ls'` + + This variable can be modifies to change the executable path for `verible_ls` + + *ale-config.verilog_verible_ls_config* + *g:ale_verilog_verible_ls_config* + *b:ale_verilog_verible_ls_config* +verilog_verible_ls_config +g:ale_verilog_verible_ls_config + Type: |Dictionary| + Default: `{}` + + Dictionary with configuration settings for `verible_ls` + + *ale-config.verilog_verible_ls_options* + *g:ale_verilog_verible_ls_options* + *b:ale_verilog_verible_ls_options* +verilog_verible_ls_options +g:ale_verilog_verible_ls_options + Type: |String| + Default: `'--rules_config_search'` + + Additional flags for `verible_ls` + + *ale-config.verilog_verible_ls_rules* + *g:ale_verilog_verible_ls_rules* + *b:ale_verilog_verible_ls_rules* +verilog_verible_ls_rules +g:ale_verilog_verible_ls_rules + Type: |String| + Default: `''` + + Additional rules applied by `verible_ls` =============================================================================== +verible_format *ale-verilog-verible-format* + + *ale-config.verilog_verible_format_executable* + *g:ale_verilog_verible_format_executable* + *b:ale_verilog_verible_format_executable* +verilog_verible_format_executable +g:ale_verilog_verible_format_executable + Type: |String| + Default: `'verible-verilog-format'` + + This variable can be modifies to change the executable path for + `verible_format` + + *ale-config.verilog_verible_format_options* + *g:ale_verilog_verible_format_options* + *b:ale_verilog_verible_format_options* +verilog_verible_format_options +g:ale_verilog_verible_format_options + Type: |String| + Default: `''` + + Additional flags for `verible_format` +=============================================================================== + verilator *ale-verilog-verilator* *ale-options.verilog_verilator_options* diff --git a/doc/ale.txt b/doc/ale.txt index 64969a2f..68116a57 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -3984,6 +3984,8 @@ documented in additional help files. hdl-checker...........................|ale-verilog-hdl-checker| iverilog..............................|ale-verilog-iverilog| slang.................................|ale-verilog-slang| + verible_ls............................|ale-verilog-verible-ls| + verible_format........................|ale-verilog-verible-format| verilator.............................|ale-verilog-verilator| vlog..................................|ale-verilog-vlog| xvlog.................................|ale-verilog-xvlog| diff --git a/supported-tools.md b/supported-tools.md index bf0e729e..310b7d4a 100644 --- a/supported-tools.md +++ b/supported-tools.md @@ -734,6 +734,7 @@ formatting. * [hdl-checker](https://pypi.org/project/hdl-checker) * [iverilog](https://github.com/steveicarus/iverilog) * [slang](https://github.com/MikePopoloski/slang) + * [verible](https://github.com/chipsalliance/verible/tree/master) * [verilator](http://www.veripool.org/projects/verilator/wiki/Intro) * [vlog](https://www.mentor.com/products/fv/questa/) * [xvlog](https://www.xilinx.com/products/design-tools/vivado.html) :speech_balloon: diff --git a/test/fixers/test_verible_format_fixer_callback.vader b/test/fixers/test_verible_format_fixer_callback.vader new file mode 100644 index 00000000..a8dcf5e8 --- /dev/null +++ b/test/fixers/test_verible_format_fixer_callback.vader @@ -0,0 +1,16 @@ +Before: + call ale#assert#SetUpFixerTest('verilog', 'verible_format') + +After: + call ale#assert#TearDownFixerTest() + +Execute(The verible format callback should return the correct default values): + AssertFixer {'command': ale#Escape('verible-verilog-format') .' -'} + +Execute(The verible format callback should allow a custom executable): + let g:ale_verilog_verible_format_executable = 'foo/bar' + AssertFixer {'command': ale#Escape('foo/bar') . ' -'} + +Execute(The verible format callback should allow custom options): + let g:ale_verilog_verible_format_options = '--foo --bar' + AssertFixer {'command': ale#Escape('verible-verilog-format') .' --foo --bar -'} diff --git a/test/linter/test_verilog_verible_ls.vader b/test/linter/test_verilog_verible_ls.vader new file mode 100644 index 00000000..b2a518ec --- /dev/null +++ b/test/linter/test_verilog_verible_ls.vader @@ -0,0 +1,33 @@ +Before: + call ale#assert#SetUpLinterTest('verilog', 'verible_ls') + +After: + call ale#assert#TearDownLinterTest() + +Execute(The default executable path and arguments should be correct): + AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --rules_config_search' + +Execute(The project root should be detected correctly in empty directory): + AssertLSPProject '.' + +Execute(The project root should be detected correctly with verible.filelist): + call ale#test#SetFilename('../test-files/verilog/verible/module.sv') + AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/verilog/verible') + +Execute(The LSP values should be set correctly): + call ale#test#SetFilename('../test-files/verilog/verible/module.sv') + + AssertLSPLanguage 'verilog' + AssertLSPOptions {} + AssertLSPConfig {} + AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/verilog/verible') + + +Execute(The verible LSP callback should allow custom options): + let g:ale_verilog_verible_ls_options = '--foo --bar' + AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --foo --bar' + + +Execute(The verible LSP callback should allow custom rules): + let g:ale_verilog_verible_ls_rules = '+foo,-bar' + AssertLinter 'verible-verilog-ls', ale#Escape('verible-verilog-ls') . ' --rules_config_search --rules=+foo,-bar' diff --git a/test/test-files/verilog/verible/module.sv b/test/test-files/verilog/verible/module.sv new file mode 100644 index 00000000..e69de29b diff --git a/test/test-files/verilog/verible/verible.filelist b/test/test-files/verilog/verible/verible.filelist new file mode 100644 index 00000000..36928fa4 --- /dev/null +++ b/test/test-files/verilog/verible/verible.filelist @@ -0,0 +1 @@ +./module.sv diff --git a/test/test_filetype_linter_defaults.vader b/test/test_filetype_linter_defaults.vader index 69d83d84..ee4a5df0 100644 --- a/test/test_filetype_linter_defaults.vader +++ b/test/test_filetype_linter_defaults.vader @@ -119,7 +119,7 @@ Execute(The defaults for the zsh filetype should be correct): Execute(The defaults for the verilog filetype should be correct): " This filetype isn't configured with default, so we can test loading all " available linters with this. - AssertEqual ['hdl_checker', 'iverilog', 'slang', 'verilator', 'vlog', 'xvlog', 'yosys'], GetLinterNames('verilog') + AssertEqual ['hdl_checker', 'iverilog', 'slang', 'verible_ls', 'verilator', 'vlog', 'xvlog', 'yosys'], GetLinterNames('verilog') let g:ale_linters_explicit = 1