codekingpro/portable-devtools
114k
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 