summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/verilog/hdl_checker.vim5
-rw-r--r--ale_linters/vhdl/hdl_checker.vim5
-rw-r--r--autoload/ale/handlers/hdl_checker.vim71
-rw-r--r--doc/ale-verilog.txt18
-rw-r--r--doc/ale-vhdl.txt75
-rw-r--r--doc/ale.txt2
-rw-r--r--test/command_callback/hdl_server/foo.vhd0
-rw-r--r--test/command_callback/hdl_server/with_config_file/.hdl_checker.config0
-rw-r--r--test/command_callback/hdl_server/with_config_file/_hdl_checker.config0
-rw-r--r--test/command_callback/hdl_server/with_config_file/foo.vhd0
-rw-r--r--test/command_callback/hdl_server/with_git/files/foo.vhd1
-rw-r--r--test/test_filetype_linter_defaults.vader2
-rw-r--r--test/test_hdl_checker_options.vader78
13 files changed, 250 insertions, 7 deletions
diff --git a/ale_linters/verilog/hdl_checker.vim b/ale_linters/verilog/hdl_checker.vim
new file mode 100644
index 00000000..b05d8565
--- /dev/null
+++ b/ale_linters/verilog/hdl_checker.vim
@@ -0,0 +1,5 @@
+" Author: suoto <andre820@gmail.com>
+" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl
+" or xvhdl. More info on https://github.com/suoto/hdl_checker
+
+call ale#handlers#hdl_checker#DefineLinter('verilog')
diff --git a/ale_linters/vhdl/hdl_checker.vim b/ale_linters/vhdl/hdl_checker.vim
new file mode 100644
index 00000000..c9d306b3
--- /dev/null
+++ b/ale_linters/vhdl/hdl_checker.vim
@@ -0,0 +1,5 @@
+" Author: suoto <andre820@gmail.com>
+" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl
+" or xvhdl. More info on https://github.com/suoto/hdl_checker
+
+call ale#handlers#hdl_checker#DefineLinter('vhdl')
diff --git a/autoload/ale/handlers/hdl_checker.vim b/autoload/ale/handlers/hdl_checker.vim
new file mode 100644
index 00000000..36dbd259
--- /dev/null
+++ b/autoload/ale/handlers/hdl_checker.vim
@@ -0,0 +1,71 @@
+" Author: suoto <andre820@gmail.com>
+" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl
+" or xvhdl. More info on https://github.com/suoto/hdl_checker
+
+call ale#Set('hdl_checker_executable', 'hdl_checker')
+call ale#Set('hdl_checker_config_file', has('unix') ? '.hdl_checker.config' : '_hdl_checker.config')
+call ale#Set('hdl_checker_options', '')
+
+" Use this as a function so we can mock it on testing. Need to do this because
+" test files are inside /testplugin (which refers to the ale repo), which will
+" always have a .git folder
+function! ale#handlers#hdl_checker#IsDotGit(path) abort
+ return ! empty(a:path) && isdirectory(a:path)
+endfunction
+
+" Sould return (in order of preference)
+" 1. Nearest config file
+" 2. Nearest .git directory
+" 3. The current path
+function! ale#handlers#hdl_checker#GetProjectRoot(buffer) abort
+ let l:project_root = ale#path#FindNearestFile(
+ \ a:buffer,
+ \ ale#Var(a:buffer, 'hdl_checker_config_file'))
+
+ if !empty(l:project_root)
+ return fnamemodify(l:project_root, ':h')
+ endif
+
+ " Search for .git to use as root
+ let l:project_root = ale#path#FindNearestDirectory(a:buffer, '.git')
+
+ if ale#handlers#hdl_checker#IsDotGit(l:project_root)
+ return fnamemodify(l:project_root, ':h:h')
+ endif
+endfunction
+
+function! ale#handlers#hdl_checker#GetExecutable(buffer) abort
+ return ale#Var(a:buffer, 'hdl_checker_executable')
+endfunction
+
+function! ale#handlers#hdl_checker#GetCommand(buffer) abort
+ let l:command = ale#Escape(ale#handlers#hdl_checker#GetExecutable(a:buffer)) . ' --lsp'
+
+ " Add extra parameters only if config has been set
+ let l:options = ale#Var(a:buffer, 'hdl_checker_options')
+
+ if ! empty(l:options)
+ let l:command = l:command . ' ' . l:options
+ endif
+
+ return l:command
+endfunction
+
+" To allow testing
+function! ale#handlers#hdl_checker#GetInitOptions(buffer) abort
+ return {'project_file': ale#Var(a:buffer, 'hdl_checker_config_file')}
+endfunction
+
+" Define the hdl_checker linter for a given filetype.
+function! ale#handlers#hdl_checker#DefineLinter(filetype) abort
+ call ale#linter#Define(a:filetype, {
+ \ 'name': 'hdl-checker',
+ \ 'lsp': 'stdio',
+ \ 'language': a:filetype,
+ \ 'executable': function('ale#handlers#hdl_checker#GetExecutable'),
+ \ 'command': function('ale#handlers#hdl_checker#GetCommand'),
+ \ 'project_root': function('ale#handlers#hdl_checker#GetProjectRoot'),
+ \ 'initialization_options': function('ale#handlers#hdl_checker#GetInitOptions'),
+ \ })
+endfunction
+
diff --git a/doc/ale-verilog.txt b/doc/ale-verilog.txt
index 94b820b8..01af63c2 100644
--- a/doc/ale-verilog.txt
+++ b/doc/ale-verilog.txt
@@ -3,7 +3,10 @@ ALE Verilog/SystemVerilog Integration *ale-verilog-options*
===============================================================================
-ALE can use four different linters for Verilog HDL:
+ALE can use five different linters for Verilog HDL:
+
+ HDL Checker
+ Using `hdl_checker --lsp`
iverilog:
Using `iverilog -t null -Wall`
@@ -26,6 +29,9 @@ defining 'g:ale_linters' variable:
\ let g:ale_linters = {'systemverilog' : ['verilator'],}
<
+===============================================================================
+General notes
+
Linters/compilers that utilize a "work" directory for analyzing designs- such
as ModelSim and Vivado- can be passed the location of these directories as
part of their respective option strings listed below. This is useful for
@@ -40,6 +46,16 @@ changing. This can happen in the form of hangs or crashes. To help prevent
this when using these linters, it may help to run linting less frequently; for
example, only when a file is saved.
+HDL Checker is an alternative for some of the issues described above. It wraps
+around ghdl, Vivado and ModelSim/Questa and, when using the latter, it can
+handle mixed language (VHDL, Verilog, SystemVerilog) designs.
+
+===============================================================================
+hdl-checker *ale-verilog-hdl-checker*
+
+See |ale-vhdl-hdl-checker|
+
+
===============================================================================
iverilog *ale-verilog-iverilog*
diff --git a/doc/ale-vhdl.txt b/doc/ale-vhdl.txt
index 3fea947d..c2870240 100644
--- a/doc/ale-vhdl.txt
+++ b/doc/ale-vhdl.txt
@@ -3,10 +3,10 @@ ALE VHDL Integration *ale-vhdl-options*
===============================================================================
-ALE can use three different linters for VHDL:
+ALE can use four different linters for VHDL:
- iverilog:
- Using `iverilog -t null -Wall`
+ ghdl:
+ Using `ghdl --std=08`
ModelSim/Questa
Using `vcom -2008 -quiet -lint`
@@ -14,8 +14,15 @@ ALE can use three different linters for VHDL:
Vivado
Using `xvhdl --2008`
-Note all linters default to VHDL-2008 support. This, and other options, can be
-changed with each linter's respective option variable.
+ HDL Checker
+ Using `hdl_checker --lsp`
+
+===============================================================================
+General notes
+
+ghdl, ModelSim/Questa and Vivado linters default to VHDL-2008 support. This,
+and other options, can be changed with each linter's respective option
+variable.
Linters/compilers that utilize a "work" directory for analyzing designs- such
as ModelSim and Vivado- can be passed the location of these directories as
@@ -31,6 +38,10 @@ changing. This can happen in the form of hangs or crashes. To help prevent
this when using these linters, it may help to run linting less frequently; for
example, only when a file is saved.
+HDL Checker is an alternative for some of the issues described above. It wraps
+around ghdl, Vivado and ModelSim/Questa and, when using the latter, it can
+handle mixed language (VHDL, Verilog, SystemVerilog) designs.
+
===============================================================================
ghdl *ale-vhdl-ghdl*
@@ -51,6 +62,60 @@ g:ale_vhdl_ghdl_options *g:ale_vhdl_ghdl_options*
===============================================================================
+hdl-checker *ale-vhdl-hdl-checker*
+
+HDL Checker is a wrapper for VHDL/Verilg/SystemVerilog tools that aims to
+reduce the boilerplate code needed to set things up. It can automatically
+infer libraries for VHDL sources, determine the compilation order and provide
+some static checks.
+
+You can install it using pip:
+>
+ $ pip install hdl-checker
+
+`hdl-checker` will be run from a detected project root, determined by the
+following methods, in order:
+
+1. Find the first directory containing a configuration file (see
+ |g:ale_hdl_checker_config_file|)
+2. If no configuration file can be found, find the first directory containing
+ a folder named `'.git'
+3. If no such folder is found, use the directory of the current buffer
+
+
+g:ale_hdl_checker_executable
+ *g:ale_hdl_checker_executable*
+ *b:ale_hdl_checker_executable*
+ Type: |String|
+ Default: `'hdl_checker'`
+
+ This variable can be changed to the path to the 'hdl_checker' executable.
+
+
+g:ale_hdl_checker_options *g:ale_hdl_checker_options*
+ *b:ale_hdl_checker_options*
+ Type: |String|
+ Default: `''`
+
+ This variable can be changed to modify the flags/options passed to the
+ 'hdl_checker' server startup command.
+
+
+g:ale_hdl_checker_config_file *g:ale_hdl_checker_config_file*
+ *b:ale_hdl_checker_config_file*
+ Type: |String|
+ Default: `'.hdl_checker.config'` (Unix),
+ `'_hdl_checker.config'` (Windows)
+
+ This variable can be changed to modify the config file HDL Checker will try
+ to look for. It will also affect how the project's root directory is
+ determined (see |ale-vhdl-hdl-checker|).
+
+ More info on the configuration file format can be found at:
+ https://github.com/suoto/hdl_checker/wiki/Setting-up-a-project
+
+
+===============================================================================
vcom *ale-vhdl-vcom*
g:ale_vhdl_vcom_executable *g:ale_vhdl_vcom_executable*
diff --git a/doc/ale.txt b/doc/ale.txt
index c12d4208..e6b3e58d 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -2675,12 +2675,14 @@ documented in additional help files.
vala....................................|ale-vala-options|
uncrustify............................|ale-vala-uncrustify|
verilog/systemverilog...................|ale-verilog-options|
+ hdl-checker...........................|ale-verilog-hdl-checker|
iverilog..............................|ale-verilog-iverilog|
verilator.............................|ale-verilog-verilator|
vlog..................................|ale-verilog-vlog|
xvlog.................................|ale-verilog-xvlog|
vhdl....................................|ale-vhdl-options|
ghdl..................................|ale-vhdl-ghdl|
+ hdl-checker...........................|ale-vhdl-hdl-checker|
vcom..................................|ale-vhdl-vcom|
xvhdl.................................|ale-vhdl-xvhdl|
vim.....................................|ale-vim-options|
diff --git a/test/command_callback/hdl_server/foo.vhd b/test/command_callback/hdl_server/foo.vhd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/hdl_server/foo.vhd
diff --git a/test/command_callback/hdl_server/with_config_file/.hdl_checker.config b/test/command_callback/hdl_server/with_config_file/.hdl_checker.config
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/hdl_server/with_config_file/.hdl_checker.config
diff --git a/test/command_callback/hdl_server/with_config_file/_hdl_checker.config b/test/command_callback/hdl_server/with_config_file/_hdl_checker.config
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/hdl_server/with_config_file/_hdl_checker.config
diff --git a/test/command_callback/hdl_server/with_config_file/foo.vhd b/test/command_callback/hdl_server/with_config_file/foo.vhd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/hdl_server/with_config_file/foo.vhd
diff --git a/test/command_callback/hdl_server/with_git/files/foo.vhd b/test/command_callback/hdl_server/with_git/files/foo.vhd
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/test/command_callback/hdl_server/with_git/files/foo.vhd
@@ -0,0 +1 @@
+
diff --git a/test/test_filetype_linter_defaults.vader b/test/test_filetype_linter_defaults.vader
index 9c40cb23..95ec3b9a 100644
--- a/test/test_filetype_linter_defaults.vader
+++ b/test/test_filetype_linter_defaults.vader
@@ -61,7 +61,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 ['iverilog', 'verilator', 'vlog', 'xvlog'], GetLinterNames('verilog')
+ AssertEqual ['hdl-checker', 'iverilog', 'verilator', 'vlog', 'xvlog'], GetLinterNames('verilog')
let g:ale_linters_explicit = 1
diff --git a/test/test_hdl_checker_options.vader b/test/test_hdl_checker_options.vader
new file mode 100644
index 00000000..4bee0f55
--- /dev/null
+++ b/test/test_hdl_checker_options.vader
@@ -0,0 +1,78 @@
+Before:
+ call ale#assert#SetUpLinterTest('vhdl', 'hdl_checker')
+
+ Save g:ale_hdl_checker_config_file
+ Save g:ale_hdl_checker_options
+
+ let g:default_config_file = has('unix') ? '.hdl_checker.config' : '_hdl_checker.config'
+
+After:
+ Restore
+ call ale#assert#TearDownLinterTest()
+ unlet! g:default_config_file
+
+Execute(Get default initialization dict):
+ AssertEqual
+ \ {'project_file': g:default_config_file},
+ \ ale#handlers#hdl_checker#GetInitOptions(bufnr(''))
+
+Execute(Get custom initialization dict):
+ let g:ale_hdl_checker_config_file = 'some_file_name'
+
+ AssertEqual
+ \ {'project_file': 'some_file_name'},
+ \ ale#handlers#hdl_checker#GetInitOptions(bufnr(''))
+
+Execute(Get the checker command without extra user parameters):
+ AssertEqual
+ \ ale#Escape('hdl_checker') . ' --lsp',
+ \ ale#handlers#hdl_checker#GetCommand(bufnr(''))
+
+Execute(Get the checker command with user configured parameters):
+ let g:ale_hdl_checker_options = '--log-level DEBUG'
+
+ AssertEqual
+ \ ale#Escape('hdl_checker') . ' --lsp --log-level DEBUG',
+ \ ale#handlers#hdl_checker#GetCommand(bufnr(''))
+
+Execute(Customize executable):
+ let g:ale_hdl_checker_executable = '/some/other/path'
+ AssertEqual
+ \ ale#Escape('/some/other/path') . ' --lsp',
+ \ ale#handlers#hdl_checker#GetCommand(bufnr(''))
+
+Execute(Get project root based on .git):
+ call ale#test#SetFilename('hdl_server/with_git/files/foo.vhd')
+ " Create .git file
+ silent! call mkdir(g:dir . '/hdl_server/with_git/.git')
+ AssertNotEqual '', glob(g:dir . '/hdl_server/with_git/.git')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/hdl_server/with_git'),
+ \ ale#handlers#hdl_checker#GetProjectRoot(bufnr(''))
+
+Execute(Get project root based on config file):
+ call ale#test#SetFilename('hdl_server/with_config_file/foo.vhd')
+
+ AssertEqual
+ \ ale#path#Simplify(g:dir . '/hdl_server/with_config_file'),
+ \ ale#handlers#hdl_checker#GetProjectRoot(bufnr(''))
+
+Execute(Return no project root if neither .git or config file are found):
+ let g:call_count = 0
+
+ " Mock this command to avoid the test to find ale's own .git folder
+ function! ale#handlers#hdl_checker#IsDotGit(path) abort
+ let g:call_count += 1
+ return 0
+ endfunction
+
+ call ale#test#SetFilename('hdl_server/foo.vhd')
+
+ AssertEqual
+ \ '',
+ \ ale#handlers#hdl_checker#GetProjectRoot(bufnr(''))
+
+ AssertEqual g:call_count, 1
+
+ unlet! g:call_count