From: Wilson Snyder Date: Tue, 9 Dec 2014 07:14:30 +0000 (-0800) Subject: Sync with upstream verilog-mode revision aa4b777 X-Git-Tag: emacs-25.0.90~2635^2~135 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d282d6a59590c43d6c50c097c233325c17ea4f0c;p=emacs.git Sync with upstream verilog-mode revision aa4b777 * lisp/progmodes/verilog-mode.el (verilog-mode-version): Update. (verilog-auto-end-comment-lines-re, verilog-end-block-ordered-re) (verilog-set-auto-endcomments): Automatically comment property/ endproperty blocks to match other similar blocks like sequence/ endsequence, function/endfunction, etc. Reported by Alex Reed. (verilog-set-auto-endcomments): Fix end comments for functions of type void, etc. Detect the function- or task-name when auto-commenting blocks that lack an explicit portlist. Reported by Alex Reed. (verilog-nameable-item-re): Fix nameable items that can have an end-identifier to include endchecker, endgroup, endprogram, endproperty, and endsequence. Reported by Alex Reed. (verilog-preprocessor-re, verilog-beg-of-statement): Fix indentation of property/endproperty around pre-processor directives. Reported by Alex Reed. (verilog-label-be): When auto-commenting a buffer, consider auto-comments on all known keywords (not just a subset thereof). Reported by Alex Reed. (verilog-beg-of-statement): Fix labeling do-while blocks, bug842. Reported by Alex Reed. (verilog-beg-of-statement-1, verilog-at-constraint-p): Fix hanging with many curly-bracket pairs, bug663. (verilog-do-indent): Fix electric tab deleting form-feeds. Note caused by indent-line-to deleting tabls pre 24.5. (verilog-auto-output, verilog-auto-input, verilog-auto-inout) (verilog-auto-inout-module, verilog-auto-inout-in): Doc fixes. (verilog-read-always-signals, verilog-auto-sense-sigs) (verilog-auto-reset): Fix AUTORESET with always_comb and always_latch, bug844. Reported by Greg Hilton. Author: Alex Reed (tiny change) * lisp/progmodes/verilog-mode.el (verilog-no-indent-begin-re): Fix `verilog-indent-begin-after-if' nil not honoring 'forever', 'foreach', and 'do' keywords. (verilog-endcomment-reason-re, verilog-beg-of-statement): Fix labeling do-while blocks, bug842. (verilog-backward-token): Fix indenting sensitivity lists with named events, bug840. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4fa27b6abc7..81afe8a5ccc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,46 @@ +2014-12-09 Wilson Snyder + + Sync with upstream verilog-mode revision aa4b777. + * progmodes/verilog-mode.el (verilog-mode-version): Update. + (verilog-auto-end-comment-lines-re, verilog-end-block-ordered-re) + (verilog-set-auto-endcomments): Automatically comment property/ + endproperty blocks to match other similar blocks like sequence/ + endsequence, function/endfunction, etc. Reported by Alex Reed. + (verilog-set-auto-endcomments): Fix end comments for functions of + type void, etc. Detect the function- or task-name when + auto-commenting blocks that lack an explicit portlist. + Reported by Alex Reed. + (verilog-nameable-item-re): Fix nameable items that can have an + end-identifier to include endchecker, endgroup, endprogram, + endproperty, and endsequence. Reported by Alex Reed. + (verilog-preprocessor-re, verilog-beg-of-statement): + Fix indentation of property/endproperty around pre-processor + directives. Reported by Alex Reed. + (verilog-label-be): When auto-commenting a buffer, consider + auto-comments on all known keywords (not just a subset thereof). + Reported by Alex Reed. + (verilog-beg-of-statement): Fix labeling do-while blocks, bug842. + Reported by Alex Reed. + (verilog-beg-of-statement-1, verilog-at-constraint-p): + Fix hanging with many curly-bracket pairs, bug663. + (verilog-do-indent): Fix electric tab deleting form-feeds. + Note caused by indent-line-to deleting tabls pre 24.5. + (verilog-auto-output, verilog-auto-input, verilog-auto-inout) + (verilog-auto-inout-module, verilog-auto-inout-in): Doc fixes. + (verilog-read-always-signals, verilog-auto-sense-sigs) + (verilog-auto-reset): Fix AUTORESET with always_comb and always_latch, + bug844. Reported by Greg Hilton. + +2014-12-09 Alex Reed (tiny change) + + * progmodes/verilog-mode.el (verilog-no-indent-begin-re): + Fix `verilog-indent-begin-after-if' nil not honoring 'forever', + 'foreach', and 'do' keywords. + (verilog-endcomment-reason-re, verilog-beg-of-statement): + Fix labeling do-while blocks, bug842. + (verilog-backward-token): Fix indenting sensitivity lists with + named events, bug840. + 2014-12-09 Reto Zimmermann Sync with upstream vhdl mode v3.36.1. diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 71af582578d..a7d833cb151 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -123,7 +123,7 @@ ;;; Code: ;; This variable will always hold the version number of the mode -(defconst verilog-mode-version "2014-10-03-c075a49-vpo" +(defconst verilog-mode-version "2014-11-12-aa4b777-vpo" "Version of this Verilog mode.") (defconst verilog-mode-release-emacs t "If non-nil, this version of Verilog mode was released with Emacs itself.") @@ -2269,8 +2269,9 @@ find the errors." (defconst verilog-no-indent-begin-re (eval-when-compile (verilog-regexp-words - '( "if" "else" "while" "for" "repeat" "always" "always_comb" "always_ff" "always_latch" - "initial" "final")))) + '("always" "always_comb" "always_ff" "always_latch" "initial" "final" ;; procedural blocks + "if" "else" ;; conditional statements + "while" "for" "foreach" "repeat" "do" "forever" )))) ;; loop statements (defconst verilog-ends-re ;; Parenthesis indicate type of keyword found @@ -2328,6 +2329,7 @@ find the errors." "endinterface" "endpackage" "endsequence" + "endproperty" "endspecify" "endtable" "endtask" @@ -2360,6 +2362,7 @@ find the errors." "\\(program\\)\\|" ; 13 "\\(sequence\\)\\|" ; 14 "\\(clocking\\)\\|" ; 15 + "\\(property\\)\\|" ; 16 "\\)\\>\\)")) (defconst verilog-end-block-re (eval-when-compile @@ -2424,7 +2427,7 @@ find the errors." "\\(\\\\)\\|" "\\(\\\\)\\|" "\\(@\\)\\|" - "\\(\\\\)\\|" + "\\(\\\\)\\|\\(\\\\)\\|" "\\(\\\\)\\|" "\\(\\\\)\\|\\(\\\\)\\|" "#")) @@ -2518,15 +2521,20 @@ find the errors." "join" "join_any" "join_none" "end" "endcase" - "endconfig" + "endchecker" "endclass" "endclocking" + "endconfig" "endfunction" "endgenerate" + "endgroup" "endmodule" "endprimitive" "endinterface" "endpackage" + "endprogram" + "endproperty" + "endsequence" "endspecify" "endtable" "endtask" ) @@ -2756,10 +2764,45 @@ find the errors." "String used to mark end of excluded text.") (defconst verilog-preprocessor-re (eval-when-compile - (verilog-regexp-words - `( - "`define" "`include" "`ifdef" "`ifndef" "`if" "`endif" "`else" - )))) + (concat + ;; single words + "\\(?:" + (verilog-regexp-words + `("`__FILE__" + "`__LINE__" + "`celldefine" + "`else" + "`end_keywords" + "`endcelldefine" + "`endif" + "`nounconnected_drive" + "`resetall" + "`unconnected_drive" + "`undefineall")) + "\\)\\|\\(?:" + ;; two words: i.e. `ifdef DEFINE + "\\<\\(`elsif\\|`ifn?def\\|`undef\\|`default_nettype\\|`begin_keywords\\)\\>\\s-" + "\\)\\|\\(?:" + ;; `line number "filename" level + "\\<\\(`line\\)\\>\\s-+[0-9]+\\s-+\"[^\"]+\"\\s-+[012]" + "\\)\\|\\(?:" + ;;`include "file" or `include + "\\<\\(`include\\)\\>\\s-+\\(?:\"[^\"]+\"\\|<[^>]+>\\)" + "\\)\\|\\(?:" + ;; `pragma (no mention in IEEE 1800-2012 that pragma can span multiple lines + "\\<\\(`pragma\\)\\>\\s-+.+$" + "\\)\\|\\(?:" + ;; `timescale time_unit / time_precision + "\\<\\(`timescale\\)\\>\\s-+10\\{0,2\\}\\s-*[munpf]?s\\s-*\\/\\s-*10\\{0,2\\}\\s-*[munpf]?s" + "\\)\\|\\(?:" + ;; `define and `if can span multiple lines if line ends in '\'. NOTE: `if is not IEEE 1800-2012 + ;; from http://www.emacswiki.org/emacs/MultilineRegexp + (concat "\\<\\(`define\\|`if\\)\\>" ;; directive + "\\s-+" ;; separator + "\\(.*\\(?:\n.*\\)*?\\)" ;; definition: to tend of line, the maybe more lines (excludes any trailing \n) + "\\(?:\n\\s-*\n\\|\\'\\)") ;; blank line or EOF + "\\)" + ))) (defconst verilog-keywords '( "`case" "`default" "`define" "`else" "`endfor" "`endif" @@ -4126,9 +4169,7 @@ Uses `verilog-scan' cache." (while (and (> (marker-position e) (point)) (verilog-re-search-forward - (concat - "\\" - "\\|\\(`endif\\)\\|\\(`else\\)") + verilog-auto-end-comment-lines-re nil 'move)) (goto-char (match-beginning 0)) (let ((indent-str (verilog-indent-line))) @@ -4157,45 +4198,47 @@ Uses `verilog-scan' cache." ;; or the token before us unambiguously ends a statement, ;; then move back a token and test again. (not (or - ;; stop if beginning of buffer - (bolp) - ;; stop if we find a ; + ;; stop if beginning of buffer + (bobp) + ;; stop if we find a ; (= (preceding-char) ?\;) - ;; stop if we see a named coverpoint + ;; stop if we see a named coverpoint (looking-at "\\w+\\W*:\\W*\\(coverpoint\\|cross\\|constraint\\)") - ;; keep going if we are in the middle of a word + ;; keep going if we are in the middle of a word (not (or (looking-at "\\<") (forward-word -1))) - ;; stop if we see an assertion (perhaps labeled) + ;; stop if we see an assertion (perhaps labeled) (and (looking-at "\\(\\<\\(assert\\|assume\\|cover\\)\\>\\s-+\\\\)\\|\\(\\\\)") (progn - (setq h (point)) - (save-excursion - (verilog-backward-token) - (if (looking-at verilog-label-re) - (setq h (point)))) - (goto-char h))) - ;; stop if we see an extended complete reg, perhaps a complete one + (setq h (point)) + (save-excursion + (verilog-backward-token) + (if (looking-at verilog-label-re) + (setq h (point)))) + (goto-char h))) + ;; stop if we see an extended complete reg, perhaps a complete one (and - (looking-at verilog-complete-reg) - (let* ((p (point))) - (while (and (looking-at verilog-extended-complete-re) - (progn (setq p (point)) - (verilog-backward-token) - (/= p (point))))) - (goto-char p))) - ;; stop if we see a complete reg (previous found extended ones) + (looking-at verilog-complete-reg) + (let* ((p (point))) + (while (and (looking-at verilog-extended-complete-re) + (progn (setq p (point)) + (verilog-backward-token) + (/= p (point))))) + (goto-char p))) + ;; stop if we see a complete reg (previous found extended ones) (looking-at verilog-basic-complete-re) - ;; stop if previous token is an ender + ;; stop if previous token is an ender (save-excursion - (verilog-backward-token) - (or - (looking-at verilog-end-block-re) - (looking-at verilog-preprocessor-re))))) ;; end of test - (verilog-backward-syntactic-ws) - (verilog-backward-token)) + (verilog-backward-token) + (looking-at verilog-end-block-re)))) + (verilog-backward-syntactic-ws) + (verilog-backward-token)) ;; Now point is where the previous line ended. - (verilog-forward-syntactic-ws))) + (verilog-forward-syntactic-ws) + ;; Skip forward over any preprocessor directives, as they have wacky indentation + (if (looking-at verilog-preprocessor-re) + (progn (goto-char (match-end 0)) + (verilog-forward-syntactic-ws))))) (defun verilog-beg-of-statement-1 () "Move backward to beginning of statement." @@ -4209,13 +4252,12 @@ Uses `verilog-scan' cache." (verilog-backward-syntactic-ws) (if (or (bolp) (= (preceding-char) ?\;) - (save-excursion + (progn (verilog-backward-token) (looking-at verilog-ends-re))) (progn (goto-char pt) - (throw 'done t)) - (verilog-backward-token)))) + (throw 'done t))))) (verilog-forward-syntactic-ws))) ; ; (while (and @@ -4773,10 +4815,10 @@ primitive or interface named NAME." (cond ((match-end 5) ;; of verilog-end-block-ordered-re (setq reg "\\(\\\\)\\|\\(\\<\\(endfunction\\|task\\|\\(macro\\)?module\\|primitive\\)\\>\\)") - (setq name-re "\\w+\\s-*(")) + (setq name-re "\\w+\\(?:\n\\|\\s-\\)*[(;]")) ((match-end 6) ;; of verilog-end-block-ordered-re (setq reg "\\(\\\\)\\|\\(\\<\\(endtask\\|function\\|\\(macro\\)?module\\|primitive\\)\\>\\)") - (setq name-re "\\w+\\s-*(")) + (setq name-re "\\w+\\(?:\n\\|\\s-\\)*[(;]")) ((match-end 7) ;; of verilog-end-block-ordered-re (setq reg "\\(\\<\\(macro\\)?module\\>\\)\\|\\")) ((match-end 8) ;; of verilog-end-block-ordered-re @@ -4795,6 +4837,8 @@ primitive or interface named NAME." (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\<\\(endsequence\\|primitive\\|interface\\|\\(macro\\)?module\\)\\>\\)")) ((match-end 15) ;; of verilog-end-block-ordered-re (setq reg "\\(\\\\)\\|\\")) + ((match-end 16) ;; of verilog-end-block-ordered-re + (setq reg "\\(\\\\)\\|\\")) (t (error "Problem in verilog-set-auto-endcomments"))) (let (b e) @@ -5849,7 +5893,9 @@ Set point to where line starts." (;-- any of begin|initial|while are complete statements; 'begin : foo' is also complete t (forward-word -1) - (while (= (preceding-char) ?\_) + (while (or (= (preceding-char) ?\_) + (= (preceding-char) ?\@) + (= (preceding-char) ?\.)) (forward-word -1)) (cond ((looking-at "\\") @@ -6103,14 +6149,18 @@ Return >0 for nested struct." (defun verilog-at-constraint-p () "If at the { of a constraint or coverpoint definition, return true, moving point to constraint." (if (save-excursion + (let ((p (point))) (and (equal (char-after) ?\{) (forward-list) (progn (backward-char 1) (verilog-backward-ws&directives) + (and (or (equal (char-before) ?\{) ;; empty case (equal (char-before) ?\;) - (equal (char-before) ?\}))))) + (equal (char-before) ?\})) + ;; skip what looks like bus repitition operator {#{ + (not (string-match "^{\\s-*[0-9]+\\s-*{" (buffer-substring p (point))))))))) (progn (let ( (pt (point)) (pass 0)) (verilog-backward-ws&directives) @@ -6429,6 +6479,9 @@ Only look at a few lines to determine indent level." (looking-at verilog-declaration-re)) (verilog-indent-declaration ind)) + (;-- form feeds - ignored as bug in indent-line-to in < 24.5 + (looking-at "\f")) + (;-- Everything else t (let ((val (eval (cdr (assoc type verilog-indent-alist))))) @@ -8894,7 +8947,6 @@ IGNORE-NEXT is true to ignore next token, fake from inside case statement." (save-excursion (let* (;;(dbg "") sigs-out-d sigs-out-i sigs-out-unk sigs-temp sigs-in) - (search-forward ")") (verilog-read-always-signals-recurse nil nil nil) (setq sigs-out-i (append sigs-out-i sigs-out-unk) sigs-out-unk nil) @@ -11731,6 +11783,9 @@ Limitations: Typedefs must match `verilog-typedef-regexp', which is disabled by default. + Types are added to declarations if an AUTOLOGIC or + `verilog-auto-wire-type' is set to logic. + Signals matching `verilog-auto-output-ignore-regexp' are not included. An example (see `verilog-auto-inst' for what else is going on here): @@ -11872,6 +11927,9 @@ Limitations: Typedefs must match `verilog-typedef-regexp', which is disabled by default. + Types are added to declarations if an AUTOLOGIC or + `verilog-auto-wire-type' is set to logic. + Signals matching `verilog-auto-input-ignore-regexp' are not included. An example (see `verilog-auto-inst' for what else is going on here): @@ -11952,6 +12010,9 @@ Limitations: Typedefs must match `verilog-typedef-regexp', which is disabled by default. + Types are added to declarations if an AUTOLOGIC or + `verilog-auto-wire-type' is set to logic. + Signals matching `verilog-auto-inout-ignore-regexp' are not included. An example (see `verilog-auto-inst' for what else is going on here): @@ -12068,13 +12129,14 @@ same expansion will result from only extracting signals starting with i: /*AUTOINOUTMODULE(\"ExampMain\",\"^i\")*/ -You may also provide an optional second regular expression, in -which case only signals which have that pin direction and data -type will be included. This matches against everything before -the signal name in the declaration, for example against -\"input\" (single bit), \"output logic\" (direction and type) or -\"output [1:0]\" (direction and implicit type). You also -probably want to skip spaces in your regexp. +You may also provide an optional third argument regular +expression, in which case only signals which have that pin +direction and data type matching that regular expression will be +included. This matches against everything before the signal name +in the declaration, for example against \"input\" (single bit), +\"output logic\" (direction and type) or \"output +[1:0]\" (direction and implicit type). You also probably want to +skip spaces in your regexp. For example, the below will result in matching the output \"o\" against the previous example's module: @@ -12193,7 +12255,21 @@ You may also provide an optional regular expression, in which case only signals matching the regular expression will be included. For example the same expansion will result from only extracting signals starting with i: - /*AUTOINOUTCOMP(\"ExampMain\",\"^i\")*/" + /*AUTOINOUTCOMP(\"ExampMain\",\"^i\")*/ + +You may also provide an optional third argument regular +expression, in which case only signals which have that pin +direction and data type matching that regular expression will be +included. This matches against everything before the signal name +in the declaration, for example against \"input\" (single bit), +\"output logic\" (direction and type) or \"output +[1:0]\" (direction and implicit type). You also probably want to +skip spaces in your regexp. + +For example, the below will result in matching the output \"o\" +against the previous example's module: + + /*AUTOINOUTCOMP(\"ExampMain\",\"\",\"^output.*\")*/" (verilog-auto-inout-module t nil)) (defun verilog-auto-inout-in () @@ -12244,7 +12320,7 @@ You may also provide an optional regular expression, in which case only signals matching the regular expression will be included. For example the same expansion will result from only extracting signals starting with i: - /*AUTOINOUTCOMP(\"ExampMain\",\"^i\")*/" + /*AUTOINOUTIN(\"ExampMain\",\"^i\")*/" (verilog-auto-inout-module nil t)) (defun verilog-auto-inout-param () @@ -12516,7 +12592,9 @@ See `verilog-auto-insert-lisp' for examples." (defun verilog-auto-sense-sigs (moddecls presense-sigs) "Return list of signals for current AUTOSENSE block." - (let* ((sigss (verilog-read-always-signals)) + (let* ((sigss (save-excursion + (search-forward ")") + (verilog-read-always-signals))) (sig-list (verilog-signals-not-params (verilog-signals-not-in (verilog-alw-get-inputs sigss) (append (and (not verilog-auto-sense-include-inputs) @@ -12706,11 +12784,12 @@ Typing \\[verilog-auto] will make this into: (save-excursion (verilog-read-signals (save-excursion - (verilog-re-search-backward-quick "\\(@\\|\\\\|\\\\|\\\\)" nil t) + (verilog-re-search-backward-quick + "\\(@\\|\\<\\(begin\\|if\\|case\\|always\\(_latch\\|_ff\\|_comb\\)?\\)\\>\\)" nil t) (point)) (point))))) (save-excursion - (verilog-re-search-backward-quick "@" nil t) + (verilog-re-search-backward-quick "\\(@\\|\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\)\\>\\)" nil t) (setq sigss (verilog-read-always-signals))) (setq dly-list (verilog-alw-get-outputs-delayed sigss)) (setq sig-list (verilog-signals-not-in (append