From e93f39d2e6b56319511f778e85da32ba05359668 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Mon, 8 May 2017 13:44:47 -0400 Subject: [PATCH] Fix various verilog-mode.el issues. * lisp/progmodes/verilog-mode.el (verilog-read-decls): Fix SystemVerilog 2012 import breaking AUTOINST. Reported by Johannes Schaefer. (verilog-auto-wire-type, verilog-insert-definition): Fix AUTOWIRE using logic in top-level non-SystemVerilog module, bug1142. Reported by Marcin K. (verilog-define-abbrev-table) (verilog-mode-abbrev-table): Don't expand abbrev inside comment/strings, bug1102. Reported by Slava Yuzhaninov. (verilog-auto): Fix AUTORESET widths pulling from AUTOREGINPUT, msg2143. Reported by Galen Seitz. (verilog-modify-compile-command): Fix expansion of __FLAGS__ when compile-command is globally set, bug1119. Reported by Galen Seitz. --- lisp/progmodes/verilog-mode.el | 91 +++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el index 4860ea25998..ea1ad7c064e 100644 --- a/lisp/progmodes/verilog-mode.el +++ b/lisp/progmodes/verilog-mode.el @@ -123,7 +123,7 @@ ;; ;; This variable will always hold the version number of the mode -(defconst verilog-mode-version "2016-11-14-26d3540-vpo-GNU" +(defconst verilog-mode-version "2017-05-08-b240c8f-vpo-GNU" "Version of this Verilog mode.") (defconst verilog-mode-release-emacs t "If non-nil, this version of Verilog mode was released with Emacs itself.") @@ -387,6 +387,14 @@ wherever possible, since it is slow." ;; `("Verilog" ("MA" ["SAA" nil :help "Help SAA"] ["SAB" nil :help "Help SAA"]) ;; "----" ["MB" nil :help "Help MB"])) +(defun verilog-define-abbrev-table (tablename definitions &optional docstring &rest props) + "Filter `define-abbrev-table' TABLENAME DEFINITIONS +Provides DOCSTRING PROPS in newer Emacs (23.1)." + (condition-case nil + (apply 'define-abbrev-table tablename definitions docstring props) + (error + (define-abbrev-table tablename definitions)))) + (defun verilog-define-abbrev (table name expansion &optional hook) "Filter `define-abbrev' TABLE NAME EXPANSION and call HOOK. Provides SYSTEM-FLAG in newer Emacs." @@ -762,10 +770,13 @@ mode is experimental." (defcustom verilog-auto-wire-type nil "Non-nil specifies the data type to use with `verilog-auto-wire' etc. -Set this to \"logic\" for SystemVerilog code, or use `verilog-auto-logic'." +Set this to \"logic\" for SystemVerilog code, or use `verilog-auto-logic'. +Set this to \"wire\" to force use of wire when logic is otherwise appropriate; +this is generally only appropriate when making a non-SystemVerilog wrapper +containing SystemVerilog cells." :version "24.1" ; rev673 :group 'verilog-mode-actions - :type 'boolean) + :type 'string) (put 'verilog-auto-wire-type 'safe-local-variable `stringp) (defcustom verilog-auto-endcomments t @@ -1356,13 +1367,13 @@ See also `verilog-case-fold'." :type 'hook) (defcustom verilog-before-save-font-hook nil - "Hook run before `verilog-save-font-mods' removes highlighting." + "Hook run before `verilog-save-font-no-change-functions' removes highlighting." :version "24.3" ; rev735 :group 'verilog-mode-auto :type 'hook) (defcustom verilog-after-save-font-hook nil - "Hook run after `verilog-save-font-mods' restores highlighting." + "Hook run after `verilog-save-font-no-change-functions' restores highlighting." :version "24.3" ; rev735 :group 'verilog-mode-auto :type 'hook) @@ -1702,7 +1713,13 @@ If set will become buffer local.") (defvar verilog-mode-abbrev-table nil "Abbrev table in use in Verilog-mode buffers.") -(define-abbrev-table 'verilog-mode-abbrev-table ()) +;;(makunbound 'verilog-mode-abbrev-table) ; For testing, clear out old defvar +(verilog-define-abbrev-table + 'verilog-mode-abbrev-table () + "Abbrev table for Verilog mode skeletons." + :case-fixed t + ;; Only expand in code. + :enable-function (lambda () (not (verilog-in-comment-or-string-p)))) (verilog-define-abbrev verilog-mode-abbrev-table "class" "" 'verilog-sk-ovm-class) (verilog-define-abbrev verilog-mode-abbrev-table "always" "" 'verilog-sk-always) (verilog-define-abbrev verilog-mode-abbrev-table "begin" nil `verilog-sk-begin) @@ -1943,13 +1960,29 @@ be substituted." t t command)) command) +;; Eliminate compile warning +(defvar verilog-compile-command-pre-mod) +(defvar verilog-compile-command-post-mod) + (defun verilog-modify-compile-command () "Update `compile-command' using `verilog-expand-command'." - (when (and - (stringp compile-command) - (string-match "\\b\\(__FLAGS__\\|__FILE__\\)\\b" compile-command)) - (set (make-local-variable 'compile-command) - (verilog-expand-command compile-command)))) + ;; Entry into verilog-mode a call to this before Local Variables exist + ;; Likewise user may have hook or something that changes the flags. + ;; So, remember we're responsible for the expansion and on re-entry + ;; recompute __FLAGS__ on each reentry. + (when (stringp compile-command) + (when (and + (boundp 'verilog-compile-command-post-mod) + (equal compile-command verilog-compile-command-post-mod)) + (setq compile-command verilog-compile-command-pre-mod)) + (when (and + (string-match "\\b\\(__FLAGS__\\|__FILE__\\)\\b" compile-command)) + (set (make-local-variable 'verilog-compile-command-pre-mod) + compile-command) + (set (make-local-variable 'compile-command) + (verilog-expand-command compile-command)) + (set (make-local-variable 'verilog-compile-command-post-mod) + compile-command)))) (if (featurep 'xemacs) ;; Following code only gets called from compilation-mode-hook on XEmacs to add error handling. @@ -8428,13 +8461,13 @@ Return an array of [outputs inouts inputs wire reg assign const]." ;;(if dbg (setq dbg (concat dbg (format "Pt %s Vec %s C%c Kwd'%s'\n" (point) vec (following-char) keywd)))) (cond ((looking-at "//") - (if (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") - (setq enum (match-string 2))) + (when (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") + (setq enum (match-string 2))) (search-forward "\n")) ((looking-at "/\\*") (forward-char 2) - (if (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") - (setq enum (match-string 2))) + (when (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") + (setq enum (match-string 2))) (or (search-forward "*/") (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point)))) ((looking-at "(\\*") @@ -8447,7 +8480,7 @@ Return an array of [outputs inouts inputs wire reg assign const]." (error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point)))) ((eq ?\; (following-char)) (cond (in-ign-to-semi ; Such as inside a "import ...;" in a module header - (setq in-ign-to-semi nil)) + (setq in-ign-to-semi nil rvalue nil)) ((and in-modport (not (eq in-modport t))) ; end of a modport declaration (verilog-modport-decls-set in-modport @@ -8503,7 +8536,8 @@ Return an array of [outputs inouts inputs wire reg assign const]." (when (string-match "^\\\\" (match-string 1)) (setq keywd (concat keywd " "))) ; Escaped ID needs space at end ;; Add any :: package names to same identifier - (while (looking-at "\\s-*::\\s-*\\([a-zA-Z0-9`_$]+\\|\\\\[^ \t\n\f]+\\)") + ;; '*' here is for "import x::*" + (while (looking-at "\\s-*::\\s-*\\(\\*\\|[a-zA-Z0-9`_$]+\\|\\\\[^ \t\n\f]+\\)") (goto-char (match-end 0)) (setq keywd (concat keywd "::" (match-string 1))) (when (string-match "^\\\\" (match-string 1)) @@ -8568,8 +8602,8 @@ Return an array of [outputs inouts inputs wire reg assign const]." (not (equal last-keywd "default"))) (setq in-clocking t)) ((equal keywd "import") - (if v2kargs-ok ; import in module header, not a modport import - (setq in-ign-to-semi t rvalue t))) + (when v2kargs-ok ; import in module header, not a modport import + (setq in-ign-to-semi t rvalue t))) ((equal keywd "type") (setq ptype t)) ((equal keywd "var")) @@ -10358,13 +10392,21 @@ When MODI is non-null, also add to modi-cache, for tracking." (verilog-insert-one-definition sig ;; Want "type x" or "output type x", not "wire type x" - (cond ((or (verilog-sig-type sig) + (cond ((and (equal "wire" verilog-auto-wire-type) + (or (not (verilog-sig-type sig)) + (equal "logic" (verilog-sig-type sig)))) + (if (member direction '("input" "output" "inout")) + direction + "wire")) + ;; + ((or (verilog-sig-type sig) verilog-auto-wire-type) (concat (when (member direction '("input" "output" "inout")) (concat direction " ")) - (or (verilog-sig-type sig) + (or (verilog-sig-type sig) verilog-auto-wire-type))) + ;; ((and verilog-auto-declare-nettype (member direction '("input" "output" "inout"))) (concat direction " " verilog-auto-declare-nettype)) @@ -13761,9 +13803,6 @@ Wilson Snyder (wsnyder@wsnyder.org)." (verilog-auto-re-search-do "/\\*AUTOINSTPARAM\\*/" 'verilog-auto-inst-param) (verilog-auto-re-search-do "/\\*AUTOINST\\*/" 'verilog-auto-inst) (verilog-auto-re-search-do "\\.\\*" 'verilog-auto-star) - ;; Doesn't matter when done, but combine it with a common changer - (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense) - (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset) ;; Must be done before autoin/out as creates a reg (verilog-auto-re-search-do "/\\*AUTOASCIIENUM(.*?)\\*/" 'verilog-auto-ascii-enum) ;; @@ -13789,6 +13828,10 @@ Wilson Snyder (wsnyder@wsnyder.org)." (verilog-auto-re-search-do "/\\*AUTOREGINPUT\\*/" 'verilog-auto-reg-input) ;; outputevery needs AUTOOUTPUTs done first (verilog-auto-re-search-do "/\\*AUTOOUTPUTEVERY\\((.*?)\\)?\\*/" 'verilog-auto-output-every) + ;; Doesn't matter when done, but combine it with a common changer + (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense) + ;; After AUTOREG*, as they may have set signal widths + (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset) ;; After we've created all new variables (verilog-auto-re-search-do "/\\*AUTOUNUSED\\*/" 'verilog-auto-unused) ;; Must be after all inputs outputs are generated -- 2.39.2