Skip to content

Commit 9fb7fef

Browse files
authored
Merge pull request vhda#206 from vhda/indent/standalone_blocks
Indent: Allow disabling of standalone blocks
2 parents 898f60e + a36b688 commit 9fb7fef

File tree

8 files changed

+1192
-21
lines changed

8 files changed

+1192
-21
lines changed

autoload/verilog_systemverilog.vim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,8 @@ function verilog_systemverilog#CompleteCommand(lead, command, cursor)
601601
\ 'method',
602602
\ 'preproc',
603603
\ 'conditional',
604-
\ 'eos'
604+
\ 'eos',
605+
\ 'standalone'
605606
\ ]
606607
for item in current_values
607608
call filter(valid_completions, 'v:val !=# item')

doc/tags

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
:VerilogReturnInstance verilog_systemverilog.txt /*:VerilogReturnInstance*
1010
b:verilog_disable_indent_lst verilog_systemverilog.txt /*b:verilog_disable_indent_lst*
1111
b:verilog_indent_assign_fix verilog_systemverilog.txt /*b:verilog_indent_assign_fix*
12+
b:verilog_indent_block_on_keyword verilog_systemverilog.txt /*b:verilog_indent_block_on_keyword*
1213
b:verilog_indent_width verilog_systemverilog.txt /*b:verilog_indent_width*
1314
b:verilog_syntax_custom verilog_systemverilog.txt /*b:verilog_syntax_custom*
1415
b:verilog_syntax_fold_lst verilog_systemverilog.txt /*b:verilog_syntax_fold_lst*
@@ -20,6 +21,7 @@ g:verilog_efm_level verilog_systemverilog.txt /*g:verilog_efm_level*
2021
g:verilog_efm_quickfix_clean verilog_systemverilog.txt /*g:verilog_efm_quickfix_clean*
2122
g:verilog_efm_uvm_lst verilog_systemverilog.txt /*g:verilog_efm_uvm_lst*
2223
g:verilog_indent_assign_fix verilog_systemverilog.txt /*g:verilog_indent_assign_fix*
24+
g:verilog_indent_block_on_keyword verilog_systemverilog.txt /*g:verilog_indent_block_on_keyword*
2325
g:verilog_indent_width verilog_systemverilog.txt /*g:verilog_indent_width*
2426
g:verilog_navigate_split verilog_systemverilog.txt /*g:verilog_navigate_split*
2527
g:verilog_navigate_split_close verilog_systemverilog.txt /*g:verilog_navigate_split_close*

doc/verilog_systemverilog.txt

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,10 +384,43 @@ Example:
384384
let b:verilog_indent_assign_fix = 1
385385
<
386386

387+
*b:verilog_indent_block_on_keyword* *g:verilog_indent_block_on_keyword*
388+
b:verilog_indent_block_on_keyword~
389+
g:verilog_indent_block_on_keyword~
390+
Default: undefined
391+
392+
Always indent lines following a block start on the "begin" keyword.
393+
By default, the indentation script will use the indent of the line where
394+
the block starts:
395+
>
396+
case (value)
397+
default : begin
398+
x <= y;
399+
y <= z;
400+
end
401+
endcase
402+
<
403+
When this option is enabled the indentation will be offset to the start of
404+
the "begin" keyword, as following:
405+
>
406+
case (value)
407+
default : begin
408+
x <= y;
409+
y <= z;
410+
end
411+
endcase
412+
<
413+
414+
Example:
415+
416+
>
417+
let b:verilog_indent_block_on_keyword = 1
418+
<
419+
387420
*b:verilog_disable_indent_lst* *g:verilog_disable_indent_lst*
388421
b:verilog_disable_indent_lst~
389422
g:verilog_disable_indent_lst~
390-
Default: "eos"
423+
Default: "eos,standalone"
391424

392425
Disables indent for specific Verilog/SystemVerilog contexts.
393426
The following contexts are supported:
@@ -404,25 +437,26 @@ Default: "eos"
404437
- `preproc`
405438
- `conditional`
406439
- `eos`
440+
- `standalone`
407441

408-
Example:
442+
Examples:
409443

410444
>
411445
let g:verilog_disable_indent_lst = "module,class,interface"
412446
<
413447
Disabling indentation of `conditional` will change the following:
414448
>
415-
// Default indent
416-
assign a = cond ? b :
417-
c ;
418-
// Disabling 'conditional'
419-
assign a = cond ? b :
420-
c ;
449+
// Default indent
450+
assign a = cond ? b :
451+
c ;
452+
// Disabling 'conditional'
453+
assign a = cond ? b :
454+
c ;
421455
<
422456

423457
Disabling indentation of `eos` will affect how the closing parentheses of
424458
modules, functions, tasks, etc. are indented.
425-
By default:
459+
When enabled:
426460
>
427461
module mod(
428462
input wire a,
@@ -437,6 +471,23 @@ Example:
437471
);
438472
<
439473

474+
Disabling indentation of `standalone` will affect how standalone blocks,
475+
like begin..end or {..} are indented.
476+
When enabled:
477+
>
478+
if (expr)
479+
begin
480+
func();
481+
end
482+
<
483+
When disabled:
484+
>
485+
if (expr)
486+
begin
487+
func();
488+
end
489+
<
490+
440491
Note: The commands |:VerilogIndentAdd| and |:VerilogIndentRemove| are
441492
provided to allow an easier management of this variable.
442493

indent/verilog_systemverilog.vim

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ let s:vlog_define = '^\s*`define\>'
5151
let s:vlog_case = '\<case[zx]\?\>\s*('
5252
let s:vlog_join = '\<join\(_any\|_none\)\?\>'
5353

54-
let s:vlog_block_decl = '\(\<\(while\|if\|foreach\|for\)\>\s*(\)\|\<\(else\|do\)\>\|' . s:vlog_always
54+
let s:vlog_block_decl = '\(\<\(while\|if\|foreach\|for\|repeat\)\>\s*(\)\|\<\(initial\|forever\|else\|do\)\>\|' . s:vlog_always
5555

5656
let s:vlog_context_end = '\<end\(package\|function\|class\|module\|group\|generate\|program\|property\|sequence\|clocking\|interface\|task\)\>\|`endif\>'
5757

@@ -126,7 +126,15 @@ function! GetVerilogSystemVerilogIndent()
126126
elseif s:curr_line =~ '^\s*\<endclass\>'
127127
return indent(s:SearchForBlockStart('\<class\>' , '', '\<endclass\>' , v:lnum, 0))
128128
elseif s:curr_line =~ '^\s*\<end\>'
129-
return indent(s:SearchForBlockStart('\<begin\>' , '', '\<end\>' , v:lnum, 1))
129+
let l:start_lnum = s:SearchForBlockStart('\<begin\>' , '', '\<end\>' , v:lnum, 1)
130+
let l:start_indent = indent(l:start_lnum)
131+
if (verilog_systemverilog#VariableExists("verilog_indent_block_on_keyword"))
132+
let l:block_offset = match(getline(l:start_lnum)[l:start_indent:], 'begin')
133+
call verilog_systemverilog#Verbose('Return indent to start of block keyword (offset=' . l:block_offset . ')')
134+
return l:start_indent + l:block_offset
135+
else
136+
return l:start_indent
137+
endif
130138
elseif s:curr_line =~ '^\s*\<endcase\>'
131139
return indent(s:SearchForBlockStart(s:vlog_case , '', '\<endcase\>' , v:lnum, 0))
132140
endif
@@ -202,7 +210,7 @@ function! s:SearchForBlockStart(start_wd, mid_wd, end_wd, current_line_no, skip_
202210
endif
203211

204212
let l:lnum = searchpair(a:start_wd, a:mid_wd, a:end_wd, 'bnW', l:skip_arg)
205-
call verilog_systemverilog#Verbose('SearchForBlockStart: returning l:lnum ' . l:lnum)
213+
call verilog_systemverilog#Verbose('SearchForBlockStart: ' . a:start_wd . ' returning l:lnum ' . l:lnum)
206214
return l:lnum
207215
endfunction
208216

@@ -290,7 +298,12 @@ function! s:GetContextIndent()
290298

291299
if l:line =~ '\<begin\>' && l:line !~ '\<begin\>.*\<end\>'
292300
call verilog_systemverilog#Verbose("Inside a 'begin end' block.")
293-
return indent(l:lnum) + s:offset + l:open_offset
301+
let l:block_offset = 0
302+
if (verilog_systemverilog#VariableExists("verilog_indent_block_on_keyword"))
303+
call verilog_systemverilog#Verbose("Matching start of block keyword")
304+
let l:block_offset = match(l:line[indent(l:lnum):], 'begin')
305+
endif
306+
return indent(l:lnum) + s:offset + l:open_offset + l:block_offset
294307
elseif l:line =~ '^\s*\<fork\>'
295308
call verilog_systemverilog#Verbose("Inside a 'fork join' block.")
296309
return indent(l:lnum) + s:offset + l:open_offset
@@ -357,15 +370,20 @@ function! s:GetContextIndent()
357370
call verilog_systemverilog#Verbose("'begin'..'end' pair.")
358371
return indent(l:lnum)
359372
elseif l:oneline_mode == 1 && l:line =~ s:vlog_block_decl && l:line !~ '\<begin\>.*\<end\>'
373+
if index(s:verilog_disable_indent, 'standalone') < 0
374+
let l:standalone = s:offset
375+
else
376+
let l:standalone = 0
377+
endif
360378
if s:curr_line =~ '^\s*\<begin\>'
361379
call verilog_systemverilog#Verbose("Standalone 'begin' after block declaration.")
362-
return indent(l:lnum)
380+
return indent(l:lnum) + l:standalone
363381
elseif s:curr_line =~ '^\s*{\s*$' && l:cbracket_level == 0
364382
call verilog_systemverilog#Verbose("Standalone '{' after block declaration.")
365-
return indent(l:lnum)
383+
return indent(l:lnum) + l:standalone
366384
elseif s:curr_line =~ '^\s*(\s*$' && l:bracket_level == 0
367385
call verilog_systemverilog#Verbose("Standalone '(' after block declaration.")
368-
return indent(l:lnum)
386+
return indent(l:lnum) + l:standalone
369387
else
370388
call verilog_systemverilog#Verbose("Indenting a single line block.")
371389
return indent(l:lnum) + s:offset + l:open_offset

plugin/verilog_systemverilog.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
" Global plugin settings
2-
let g:verilog_disable_indent_lst="eos"
2+
let g:verilog_disable_indent_lst="eos,standalone"
33

44
" Command definitions
55
command! -nargs=* VerilogErrorFormat call verilog_systemverilog#VerilogErrorFormat(<f-args>)

test/functions.vim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ function! TestIndent()
6363
endwhile
6464

6565
if (fail == 1)
66-
echo 'Indent test failed:'
66+
echo 'Indent test failed (' . g:verilog_disable_indent_lst . '):'
6767
echo fail_lines
6868
return 1
6969
else
70-
echo 'Indent test passed'
70+
echo 'Indent test passed (' . g:verilog_disable_indent_lst . ')'
7171
return 0
7272
endif
7373

0 commit comments

Comments
 (0)