Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
verilog.vim233 linesDownload Raw Back to indent
1" Language:     Verilog HDL2" Maintainer:	Chih-Tsun Huang <cthuang@cs.nthu.edu.tw>3" Last Change:	2017 Aug 25 by Chih-Tsun Huang4" 		2023 Aug 28 by Vim Project (undo_indent)5" URL:		    http://www.cs.nthu.edu.tw/~cthuang/vim/indent/verilog.vim6"7" Credits:8"   Suggestions for improvement, bug reports by9"     Takuya Fujiwara <tyru.exe@gmail.com>10"     Thilo Six <debian@Xk2c.de>11"     Leo Butlero <lbutler@brocade.com>12"13" Buffer Variables:14"     b:verilog_indent_modules : indenting after the declaration15"				 of module blocks16"     b:verilog_indent_width   : indenting width17"     b:verilog_indent_verbose : verbose to each indenting18"19 20" Only load this indent file when no other was loaded.21if exists("b:did_indent")22  finish23endif24let b:did_indent = 125 26setlocal indentexpr=GetVerilogIndent()27setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase28setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify29setlocal indentkeys+==endconfig,=endgenerate,=endprimitive,=endtable30setlocal indentkeys+==`else,=`elsif,=`endif31 32let b:undo_indent = "setlocal indentexpr< indentkeys<"33 34" Only define the function once.35if exists("*GetVerilogIndent")36  finish37endif38 39let s:cpo_save = &cpo40set cpo&vim41 42function GetVerilogIndent()43 44  if exists('b:verilog_indent_width')45    let offset = b:verilog_indent_width46  else47    let offset = shiftwidth()48  endif49  if exists('b:verilog_indent_modules')50    let indent_modules = offset51  else52    let indent_modules = 053  endif54 55  " Find a non-blank line above the current line.56  let lnum = prevnonblank(v:lnum - 1)57 58  " At the start of the file use zero indent.59  if lnum == 060    return 061  endif62 63  let lnum2 = prevnonblank(lnum - 1)64  let curr_line  = getline(v:lnum)65  let last_line  = getline(lnum)66  let last_line2 = getline(lnum2)67  let ind  = indent(lnum)68  let ind2 = indent(lnum - 1)69  let offset_comment1 = 170  " Define the condition of an open statement71  "   Exclude the match of //, /* or */72  let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)'73  " Define the condition when the statement ends with a one-line comment74  let vlog_comment = '\(//.*\|/\*.*\*/\s*\)'75  if exists('b:verilog_indent_verbose')76    let vverb_str = 'INDENT VERBOSE:'77    let vverb = 178  else79    let vverb = 080  endif81 82  " Indent according to last line83  " End of multiple-line comment84  if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/'85    let ind = ind - offset_comment186    if vverb87      echo vverb_str "De-indent after a multiple-line comment."88    endif89 90  " Indent after if/else/for/case/always/initial/specify/fork blocks91  " Note: We exclude '`if' or '`else' and consider 'end else' 92  "       'end if' is redundant here93  elseif last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' ||94    \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' ||95    \ last_line =~ '^\s*\<\(always\|initial\)\>' ||96    \ last_line =~ '^\s*\<\(specify\|fork\)\>'97    if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' ||98      \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'99      let ind = ind + offset100      if vverb | echo vverb_str "Indent after a block statement." | endif101    endif102  " Indent after function/task/config/generate/primitive/table blocks103  elseif last_line =~ '^\s*\<\(function\|task\|config\|generate\|primitive\|table\)\>'104    if last_line !~ '\<end\>\s*' . vlog_comment . '*$' ||105      \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'106      let ind = ind + offset107      if vverb108	echo vverb_str "Indent after function/task block statement."109      endif110    endif111 112  " Indent after module/function/task/specify/fork blocks113  elseif last_line =~ '^\s*\<module\>'114    let ind = ind + indent_modules115    if vverb && indent_modules116      echo vverb_str "Indent after module statement."117    endif118    if last_line =~ '[(,]\s*' . vlog_comment . '*$' &&119      \ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$'120      let ind = ind + offset121      if vverb122	echo vverb_str "Indent after a multiple-line module statement."123      endif124    endif125 126  " Indent after a 'begin' statement127  elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' &&128    \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' &&129    \ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' ||130    \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' )131    let ind = ind + offset132    if vverb | echo vverb_str "Indent after begin statement." | endif133 134  " De-indent for the end of one-line block135  elseif ( last_line !~ '\<begin\>' ||136    \ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&137    \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' .138      \ vlog_comment . '*$' &&139    \ last_line2 !~140      \ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' &&141    \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&142    \ ( last_line2 !~ '\<begin\>' ||143    \ last_line2 =~ '\(//\|/\*\).*\<begin\>' )144    let ind = ind - offset145    if vverb146      echo vverb_str "De-indent after the end of one-line statement."147    endif148 149    " Multiple-line statement (including case statement)150    " Open statement151    "   Ident the first open line152    elseif  last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&153      \ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' &&154      \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$'155      let ind = ind + offset156      if vverb | echo vverb_str "Indent after an open statement." | endif157 158    " Close statement159    "   De-indent for an optional close parenthesis and a semicolon, and only160    "   if there exists precedent non-whitespace char161    elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' &&162      \ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' &&163      \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' &&164      \ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&165      \ last_line2 !~ ';\s*//.*$') &&166      \ last_line2 !~ '^\s*' . vlog_comment . '$'167      let ind = ind - offset168      if vverb | echo vverb_str "De-indent after a close statement." | endif169 170  " `ifdef or `ifndef or `elsif or `else171  elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>'172    let ind = ind + offset173    if vverb174      echo vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement."175    endif176 177  endif178 179  " Re-indent current line180 181  " De-indent on the end of the block182  " join/end/endcase/endfunction/endtask/endspecify183  if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' ||184    \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>' ||185    \ curr_line =~ '^\s*\<\(endconfig\|endgenerate\|endprimitive\|endtable\)\>'186    let ind = ind - offset187    if vverb | echo vverb_str "De-indent the end of a block." | endif188  elseif curr_line =~ '^\s*\<endmodule\>'189    let ind = ind - indent_modules190    if vverb && indent_modules191      echo vverb_str "De-indent the end of a module."192    endif193 194  " De-indent on a stand-alone 'begin'195  elseif curr_line =~ '^\s*\<begin\>'196    if last_line !~ '^\s*\<\(function\|task\|specify\|module\|config\|generate\|primitive\|table\)\>' &&197      \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' &&198      \ ( last_line =~199	\ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' ||200      \ last_line =~ ')\s*' . vlog_comment . '*$' ||201      \ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' )202      let ind = ind - offset203      if vverb204	echo vverb_str "De-indent a stand alone begin statement."205      endif206    endif207 208  " De-indent after the end of multiple-line statement209  elseif curr_line =~ '^\s*)' &&210    \ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ||211    \ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&212    \ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' )213    let ind = ind - offset214    if vverb215      echo vverb_str "De-indent the end of a multiple statement."216    endif217 218  " De-indent `elsif or `else or `endif219  elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>'220    let ind = ind - offset221    if vverb | echo vverb_str "De-indent `elsif or `else or `endif statement." | endif222 223  endif224 225  " Return the indentation226  return ind227endfunction228 229let &cpo = s:cpo_save230unlet s:cpo_save231 232" vim:sw=2233 
codekingpro/portable-devtools · Team Ai