Add support for verible: language server + fixer (#4994)

* Add support for verible: language server + fixer
* verible: add default flag, rules support for verible-ls
This commit is contained in:
Nicolas Derumigny
2025-08-13 16:41:56 +02:00
committed by GitHub
parent 29f1ff2579
commit 6d7bc15d9a
12 changed files with 196 additions and 2 deletions

View File

@@ -0,0 +1,43 @@
" Author: Nicolas Derumigny <https://github.com/nicolasderumigny>
" 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'),
\})

View File

@@ -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.

View File

@@ -0,0 +1,17 @@
" Author: Nicolas Derumigny <https://github.com/nicolasderumigny>
" 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

View File

@@ -724,6 +724,7 @@ Notes:
* `hdl-checker`
* `iverilog`
* slang
* `verible`
* `verilator`
* `vlog`
* `xvlog`

View File

@@ -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*

View File

@@ -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|

View File

@@ -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:

View File

@@ -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 -'}

View File

@@ -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'

View File

@@ -0,0 +1 @@
./module.sv

View File

@@ -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