aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Nicolaescu2008-05-06 15:54:16 +0000
committerDan Nicolaescu2008-05-06 15:54:16 +0000
commit5509c6add4c2bf1430c1ed0eb5770e259e1afcf9 (patch)
treee45481583c335e47ecbcd19591dbde2a4aa784e7
parentdbf2c858da40235083535f36d0b8a174248d5908 (diff)
downloademacs-5509c6add4c2bf1430c1ed0eb5770e259e1afcf9.tar.gz
emacs-5509c6add4c2bf1430c1ed0eb5770e259e1afcf9.zip
(verilog-getopt-file): Cleanup warning message format.
(verilog-auto, verilog-auto-arg, verilog-auto-ascii-enum) (verilog-auto-inout, verilog-auto-inout-module) (verilog-auto-input, verilog-auto-inst, verilog-auto-inst-param) (verilog-auto-output, verilog-auto-output-every, verilog-auto-reg) (verilog-auto-reg-input, verilog-auto-reset, verilog-auto-sense) (verilog-auto-sense-sigs, verilog-auto-tieoff) (verilog-auto-unused, verilog-auto-wire) (verilog-decls-get-assigns, verilog-decls-get-consts) (verilog-decls-get-gparams, verilog-decls-get-inouts) (verilog-decls-get-inputs, verilog-decls-get-outputs) (verilog-decls-get-ports, verilog-decls-get-regs) (verilog-decls-get-signals, verilog-decls-get-wires) (verilog-dir-cache-lib-filenames, verilog-dir-cache-list) (verilog-dir-cache-preserving, verilog-dir-file-exists-p) (verilog-dir-files, verilog-expand-dirnames, verilog-getopt-file) (verilog-inject-sense, verilog-library-filenames) (verilog-mode-release-date, verilog-mode-version) (verilog-modi-cache-add, verilog-modi-cache-preserve-buffer) (verilog-modi-cache-preserve-tick, verilog-modi-cache-results) (verilog-modi-get-assigns, verilog-modi-get-consts) (verilog-modi-get-gparams, verilog-modi-get-inouts) (verilog-modi-get-inputs, verilog-modi-get-outputs) (verilog-modi-get-ports, verilog-modi-get-regs) (verilog-modi-get-signals, verilog-modi-get-sub-inouts) (verilog-modi-get-sub-inputs, verilog-modi-get-sub-outputs) (verilog-modi-get-wires, verilog-preserve-cache) (verilog-preserve-dir-cache, verilog-preserve-modi-cache) (verilog-read-sub-decls, verilog-read-sub-decls-line) (verilog-read-sub-decls-sig, verilog-subdecls-get-inouts) (verilog-subdecls-get-inputs, verilog-subdecls-get-outputs): Add caching of additional state, and rework signal extraction routines to improve AUTO expansion performance by 300%++.
-rw-r--r--lisp/ChangeLog36
-rw-r--r--lisp/progmodes/verilog-mode.el495
2 files changed, 341 insertions, 190 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 465b1fb948e..67f9174a5bd 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,39 @@
12008-05-06 Wilson Snyder <wsnyder@wsnyder.org>
2
3 * verilog-mode.el (verilog-getopt-file): Cleanup warning message format.
4 (verilog-auto, verilog-auto-arg, verilog-auto-ascii-enum)
5 (verilog-auto-inout, verilog-auto-inout-module)
6 (verilog-auto-input, verilog-auto-inst, verilog-auto-inst-param)
7 (verilog-auto-output, verilog-auto-output-every, verilog-auto-reg)
8 (verilog-auto-reg-input, verilog-auto-reset, verilog-auto-sense)
9 (verilog-auto-sense-sigs, verilog-auto-tieoff)
10 (verilog-auto-unused, verilog-auto-wire)
11 (verilog-decls-get-assigns, verilog-decls-get-consts)
12 (verilog-decls-get-gparams, verilog-decls-get-inouts)
13 (verilog-decls-get-inputs, verilog-decls-get-outputs)
14 (verilog-decls-get-ports, verilog-decls-get-regs)
15 (verilog-decls-get-signals, verilog-decls-get-wires)
16 (verilog-dir-cache-lib-filenames, verilog-dir-cache-list)
17 (verilog-dir-cache-preserving, verilog-dir-file-exists-p)
18 (verilog-dir-files, verilog-expand-dirnames, verilog-getopt-file)
19 (verilog-inject-sense, verilog-library-filenames)
20 (verilog-mode-release-date, verilog-mode-version)
21 (verilog-modi-cache-add, verilog-modi-cache-preserve-buffer)
22 (verilog-modi-cache-preserve-tick, verilog-modi-cache-results)
23 (verilog-modi-get-assigns, verilog-modi-get-consts)
24 (verilog-modi-get-gparams, verilog-modi-get-inouts)
25 (verilog-modi-get-inputs, verilog-modi-get-outputs)
26 (verilog-modi-get-ports, verilog-modi-get-regs)
27 (verilog-modi-get-signals, verilog-modi-get-sub-inouts)
28 (verilog-modi-get-sub-inputs, verilog-modi-get-sub-outputs)
29 (verilog-modi-get-wires, verilog-preserve-cache)
30 (verilog-preserve-dir-cache, verilog-preserve-modi-cache)
31 (verilog-read-sub-decls, verilog-read-sub-decls-line)
32 (verilog-read-sub-decls-sig, verilog-subdecls-get-inouts)
33 (verilog-subdecls-get-inputs, verilog-subdecls-get-outputs):
34 Add caching of additional state, and rework signal extraction
35 routines to improve AUTO expansion performance by 300%++.
36
12008-05-06 Chong Yidong <cyd@stupidchicken.com> 372008-05-06 Chong Yidong <cyd@stupidchicken.com>
2 38
3 * progmodes/compile.el (compilation-error-regexp-alist-alist): 39 * progmodes/compile.el (compilation-error-regexp-alist-alist):
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 280c2270dde..e7720bfc1da 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -6220,31 +6220,31 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6220;; Signal reading for given module 6220;; Signal reading for given module
6221;; Note these all take modi's - as returned from the 6221;; Note these all take modi's - as returned from the
6222;; verilog-modi-current function. 6222;; verilog-modi-current function.
6223(defsubst verilog-modi-get-outputs (modi) 6223(defsubst verilog-decls-get-outputs (decls)
6224 (aref (verilog-modi-get-decls modi) 0)) 6224 (aref decls 0))
6225(defsubst verilog-modi-get-inouts (modi) 6225(defsubst verilog-decls-get-inouts (decls)
6226 (aref (verilog-modi-get-decls modi) 1)) 6226 (aref decls 1))
6227(defsubst verilog-modi-get-inputs (modi) 6227(defsubst verilog-decls-get-inputs (decls)
6228 (aref (verilog-modi-get-decls modi) 2)) 6228 (aref decls 2))
6229(defsubst verilog-modi-get-wires (modi) 6229(defsubst verilog-decls-get-wires (decls)
6230 (aref (verilog-modi-get-decls modi) 3)) 6230 (aref decls 3))
6231(defsubst verilog-modi-get-regs (modi) 6231(defsubst verilog-decls-get-regs (decls)
6232 (aref (verilog-modi-get-decls modi) 4)) 6232 (aref decls 4))
6233(defsubst verilog-modi-get-assigns (modi) 6233(defsubst verilog-decls-get-assigns (decls)
6234 (aref (verilog-modi-get-decls modi) 5)) 6234 (aref decls 5))
6235(defsubst verilog-modi-get-consts (modi) 6235(defsubst verilog-decls-get-consts (decls)
6236 (aref (verilog-modi-get-decls modi) 6)) 6236 (aref decls 6))
6237(defsubst verilog-modi-get-gparams (modi) 6237(defsubst verilog-decls-get-gparams (decls)
6238 (aref (verilog-modi-get-decls modi) 7)) 6238 (aref decls 7))
6239(defsubst verilog-modi-get-sub-outputs (modi) 6239(defsubst verilog-subdecls-get-outputs (subdecls)
6240 (aref (verilog-modi-get-sub-decls modi) 0)) 6240 (aref subdecls 0))
6241(defsubst verilog-modi-get-sub-inouts (modi) 6241(defsubst verilog-subdecls-get-inouts (subdecls)
6242 (aref (verilog-modi-get-sub-decls modi) 1)) 6242 (aref subdecls 1))
6243(defsubst verilog-modi-get-sub-inputs (modi) 6243(defsubst verilog-subdecls-get-inputs (subdecls)
6244 (aref (verilog-modi-get-sub-decls modi) 2)) 6244 (aref subdecls 2))
6245 6245
6246 6246
6247(defun verilog-read-sub-decls-sig (submodi comment port sig vec multidim) 6247(defun verilog-read-sub-decls-sig (submoddecls comment port sig vec multidim)
6248 "For `verilog-read-sub-decls-line', add a signal." 6248 "For `verilog-read-sub-decls-line', add a signal."
6249 (let (portdata) 6249 (let (portdata)
6250 (when sig 6250 (when sig
@@ -6255,19 +6255,19 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6255 (if multidim (setq multidim (mapcar `verilog-symbol-detick-denumber multidim))) 6255 (if multidim (setq multidim (mapcar `verilog-symbol-detick-denumber multidim)))
6256 (unless (or (not sig) 6256 (unless (or (not sig)
6257 (equal sig "")) ;; Ignore .foo(1'b1) assignments 6257 (equal sig "")) ;; Ignore .foo(1'b1) assignments
6258 (cond ((setq portdata (assoc port (verilog-modi-get-inouts submodi))) 6258 (cond ((setq portdata (assoc port (verilog-decls-get-inouts submoddecls)))
6259 (setq sigs-inout (cons (list sig vec (concat "To/From " comment) nil nil 6259 (setq sigs-inout (cons (list sig vec (concat "To/From " comment) nil nil
6260 (verilog-sig-signed portdata) 6260 (verilog-sig-signed portdata)
6261 (verilog-sig-type portdata) 6261 (verilog-sig-type portdata)
6262 multidim) 6262 multidim)
6263 sigs-inout))) 6263 sigs-inout)))
6264 ((setq portdata (assoc port (verilog-modi-get-outputs submodi))) 6264 ((setq portdata (assoc port (verilog-decls-get-outputs submoddecls)))
6265 (setq sigs-out (cons (list sig vec (concat "From " comment) nil nil 6265 (setq sigs-out (cons (list sig vec (concat "From " comment) nil nil
6266 (verilog-sig-signed portdata) 6266 (verilog-sig-signed portdata)
6267 (verilog-sig-type portdata) 6267 (verilog-sig-type portdata)
6268 multidim) 6268 multidim)
6269 sigs-out))) 6269 sigs-out)))
6270 ((setq portdata (assoc port (verilog-modi-get-inputs submodi))) 6270 ((setq portdata (assoc port (verilog-decls-get-inputs submoddecls)))
6271 (setq sigs-in (cons (list sig vec (concat "To " comment) nil nil 6271 (setq sigs-in (cons (list sig vec (concat "To " comment) nil nil
6272 (verilog-sig-signed portdata) 6272 (verilog-sig-signed portdata)
6273 (verilog-sig-type portdata) 6273 (verilog-sig-type portdata)
@@ -6276,7 +6276,7 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6276 ;; (t -- warning pin isn't defined.) ; Leave for lint tool 6276 ;; (t -- warning pin isn't defined.) ; Leave for lint tool
6277 ))))) 6277 )))))
6278 6278
6279(defun verilog-read-sub-decls-line (submodi comment) 6279(defun verilog-read-sub-decls-line (submoddecls comment)
6280 "For `verilog-read-sub-decls', read lines of port defs until none match anymore. 6280 "For `verilog-read-sub-decls', read lines of port defs until none match anymore.
6281Return the list of signals found, using submodi to look up each port." 6281Return the list of signals found, using submodi to look up each port."
6282 (let (done port sig vec multidim) 6282 (let (done port sig vec multidim)
@@ -6336,11 +6336,11 @@ Return the list of signals found, using submodi to look up each port."
6336 (t 6336 (t
6337 (setq sig nil))) 6337 (setq sig nil)))
6338 ;; Process signals 6338 ;; Process signals
6339 (verilog-read-sub-decls-sig submodi comment port sig vec multidim)))) 6339 (verilog-read-sub-decls-sig submoddecls comment port sig vec multidim))))
6340 (t 6340 (t
6341 (setq sig nil))) 6341 (setq sig nil)))
6342 ;; Process signals 6342 ;; Process signals
6343 (verilog-read-sub-decls-sig submodi comment port sig vec multidim)) 6343 (verilog-read-sub-decls-sig submoddecls comment port sig vec multidim))
6344 ;; 6344 ;;
6345 (forward-line 1))))) 6345 (forward-line 1)))))
6346 6346
@@ -6375,21 +6375,23 @@ Outputs comments above subcell signals, for example:
6375 ;; Attempt to snarf a comment 6375 ;; Attempt to snarf a comment
6376 (let* ((submod (verilog-read-inst-module)) 6376 (let* ((submod (verilog-read-inst-module))
6377 (inst (verilog-read-inst-name)) 6377 (inst (verilog-read-inst-name))
6378 (comment (concat inst " of " submod ".v")) submodi) 6378 (comment (concat inst " of " submod ".v"))
6379 submodi submoddecls)
6379 (when (setq submodi (verilog-modi-lookup submod t)) 6380 (when (setq submodi (verilog-modi-lookup submod t))
6381 (setq submoddecls (verilog-modi-get-decls submodi))
6380 ;; This could have used a list created by verilog-auto-inst 6382 ;; This could have used a list created by verilog-auto-inst
6381 ;; However I want it to be runnable even on user's manually added signals 6383 ;; However I want it to be runnable even on user's manually added signals
6382 (verilog-backward-open-paren) 6384 (verilog-backward-open-paren)
6383 (setq end-inst-point (save-excursion (forward-sexp 1) (point)) 6385 (setq end-inst-point (save-excursion (forward-sexp 1) (point))
6384 st-point (point)) 6386 st-point (point))
6385 (while (re-search-forward "\\s *(?\\s *// Outputs" end-inst-point t) 6387 (while (re-search-forward "\\s *(?\\s *// Outputs" end-inst-point t)
6386 (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-out 6388 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-out
6387 (goto-char st-point) 6389 (goto-char st-point)
6388 (while (re-search-forward "\\s *// Inouts" end-inst-point t) 6390 (while (re-search-forward "\\s *// Inouts" end-inst-point t)
6389 (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-inout 6391 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-inout
6390 (goto-char st-point) 6392 (goto-char st-point)
6391 (while (re-search-forward "\\s *// Inputs" end-inst-point t) 6393 (while (re-search-forward "\\s *// Inputs" end-inst-point t)
6392 (verilog-read-sub-decls-line submodi comment)) ;; Modifies sigs-in 6394 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-in
6393 ))))) 6395 )))))
6394 ;; Combine duplicate bits 6396 ;; Combine duplicate bits
6395 ;;(setq rr (vector sigs-out sigs-inout sigs-in)) 6397 ;;(setq rr (vector sigs-out sigs-inout sigs-in))
@@ -6961,7 +6963,7 @@ Some macros and such are also found and included. For dinotrace.el."
6961 (if fns 6963 (if fns
6962 (set-buffer (find-file-noselect (car fns))) 6964 (set-buffer (find-file-noselect (car fns)))
6963 (error (concat (verilog-point-text) 6965 (error (concat (verilog-point-text)
6964 "Can't find verilog-getopt-file -f file: " filename))) 6966 ": Can't find verilog-getopt-file -f file: " filename)))
6965 (goto-char (point-min)) 6967 (goto-char (point-min))
6966 (while (not (eobp)) 6968 (while (not (eobp))
6967 (setq line (buffer-substring (point) 6969 (setq line (buffer-substring (point)
@@ -6998,6 +7000,69 @@ unless it is already a member of the variable's list."
6998 7000
6999 7001
7000;; 7002;;
7003;; Cached directory support
7004;;
7005
7006(defvar verilog-dir-cache-preserving nil
7007 "If set, the directory cache is enabled, and file system changes are ignored.
7008See `verilog-dir-exists-p' and `verilog-dir-files'.")
7009
7010;; If adding new cached variable, add also to verilog-preserve-dir-cache
7011(defvar verilog-dir-cache-list nil
7012 "Alist of (((Cwd Dirname) Results)...) for caching `verilog-dir-files'.")
7013(defvar verilog-dir-cache-lib-filenames nil
7014 "Cached data for `verilog-library-filenames'.")
7015
7016(defmacro verilog-preserve-dir-cache (&rest body)
7017 "Execute the BODY forms, allowing directory cache preservation within BODY.
7018This means that changes inside BODY made to the file system will not be
7019seen by the `verilog-dir-files' and related functions."
7020 `(let ((verilog-dir-cache-preserving t)
7021 verilog-dir-cache-list
7022 verilog-dir-cache-lib-filenames)
7023 (progn ,@body)))
7024
7025(defun verilog-dir-files (dirname)
7026 "Return all filenames in the DIRNAME directory.
7027Relative paths depend on the `default-directory'.
7028Results are cached if inside `verilog-preserve-dir-cache'."
7029 (unless verilog-dir-cache-preserving
7030 (setq verilog-dir-cache-list nil)) ;; Cache disabled
7031 ;; We don't use expand-file-name on the dirname to make key, as it's slow
7032 (let* ((cache-key (list dirname default-directory))
7033 (fass (assoc cache-key verilog-dir-cache-list))
7034 exp-dirname data)
7035 (cond (fass ;; Return data from cache hit
7036 (nth 1 fass))
7037 (t
7038 (setq exp-dirname (expand-file-name dirname)
7039 data (and (file-directory-p exp-dirname)
7040 (directory-files exp-dirname nil nil nil)))
7041 ;; Note we also encache nil for non-existing dirs.
7042 (setq verilog-dir-cache-list (cons (list cache-key data)
7043 verilog-dir-cache-list))
7044 data))))
7045;; Miss-and-hit test:
7046;;(verilog-preserve-dir-cache (prin1 (verilog-dir-files "."))
7047;; (prin1 (verilog-dir-files ".")) nil)
7048
7049(defun verilog-dir-file-exists-p (filename)
7050 "Return true if FILENAME exists.
7051Like `file-exists-p' but results are cached if inside
7052`verilog-preserve-dir-cache'."
7053 (let* ((dirname (file-name-directory filename))
7054 ;; Correct for file-name-nondirectory returning same if no slash.
7055 (dirnamed (if (or (not dirname) (equal dirname filename))
7056 default-directory dirname))
7057 (flist (verilog-dir-files dirnamed)))
7058 (and flist
7059 (member (file-name-nondirectory filename) flist)
7060 t)))
7061;;(verilog-dir-file-exists-p "verilog-mode.el")
7062;;(verilog-dir-file-exists-p "../verilog-mode/verilog-mode.el")
7063
7064
7065;;
7001;; Module name lookup 7066;; Module name lookup
7002;; 7067;;
7003 7068
@@ -7081,11 +7146,13 @@ If the variable vh-{symbol} is defined, substitute that value."
7081(defun verilog-expand-dirnames (&optional dirnames) 7146(defun verilog-expand-dirnames (&optional dirnames)
7082 "Return a list of existing directories given a list of wildcarded DIRNAMES. 7147 "Return a list of existing directories given a list of wildcarded DIRNAMES.
7083Or, just the existing dirnames themselves if there are no wildcards." 7148Or, just the existing dirnames themselves if there are no wildcards."
7149 ;; Note this function is performance critical.
7150 ;; Do not call anything that requires disk access that cannot be cached.
7084 (interactive) 7151 (interactive)
7085 (unless dirnames (error "`verilog-library-directories' should include at least '.'")) 7152 (unless dirnames (error "`verilog-library-directories' should include at least '.'"))
7086 (setq dirnames (reverse dirnames)) ; not nreverse 7153 (setq dirnames (reverse dirnames)) ; not nreverse
7087 (let ((dirlist nil) 7154 (let ((dirlist nil)
7088 pattern dirfile dirfiles dirname root filename rest) 7155 pattern dirfile dirfiles dirname root filename rest basefile)
7089 (while dirnames 7156 (while dirnames
7090 (setq dirname (substitute-in-file-name (car dirnames)) 7157 (setq dirname (substitute-in-file-name (car dirnames))
7091 dirnames (cdr dirnames)) 7158 dirnames (cdr dirnames))
@@ -7099,18 +7166,19 @@ Or, just the existing dirnames themselves if there are no wildcards."
7099 pattern filename) 7166 pattern filename)
7100 ;; now replace those * and ? with .+ and . 7167 ;; now replace those * and ? with .+ and .
7101 ;; use ^ and /> to get only whole file names 7168 ;; use ^ and /> to get only whole file names
7102 ;;verilog-string-replace-matches
7103 (setq pattern (verilog-string-replace-matches "[*]" ".+" nil nil pattern) 7169 (setq pattern (verilog-string-replace-matches "[*]" ".+" nil nil pattern)
7104 pattern (verilog-string-replace-matches "[?]" "." nil nil pattern) 7170 pattern (verilog-string-replace-matches "[?]" "." nil nil pattern)
7105 7171 pattern (concat "^" pattern "$")
7106 ;; Unfortunately allows abc/*/rtl to match abc/rtl 7172 dirfiles (verilog-dir-files root))
7107 ;; because abc/.. shows up in dirfiles. Solutions welcome.
7108 dirfiles (if (file-directory-p root) ; Ignore version control external
7109 (directory-files root t pattern nil)))
7110 (while dirfiles 7173 (while dirfiles
7111 (setq dirfile (expand-file-name (concat (car dirfiles) rest)) 7174 (setq basefile (car dirfiles)
7175 dirfile (expand-file-name (concat root basefile rest))
7112 dirfiles (cdr dirfiles)) 7176 dirfiles (cdr dirfiles))
7113 (if (file-directory-p dirfile) 7177 (if (and (string-match pattern basefile)
7178 ;; Don't allow abc/*/rtl to match abc/rtl via ..
7179 (not (equal basefile "."))
7180 (not (equal basefile ".."))
7181 (file-directory-p dirfile))
7114 (setq dirlist (cons dirfile dirlist))))) 7182 (setq dirlist (cons dirfile dirlist)))))
7115 ;; Defaults 7183 ;; Defaults
7116 (t 7184 (t
@@ -7120,23 +7188,40 @@ Or, just the existing dirnames themselves if there are no wildcards."
7120;;(verilog-expand-dirnames (list "." ".." "nonexist" "../*" "/home/wsnyder/*/v")) 7188;;(verilog-expand-dirnames (list "." ".." "nonexist" "../*" "/home/wsnyder/*/v"))
7121 7189
7122(defun verilog-library-filenames (filename current &optional check-ext) 7190(defun verilog-library-filenames (filename current &optional check-ext)
7123 "Return a search path to find the given FILENAME name. 7191 "Return a search path to find the given FILENAME or module name.
7124Uses the CURRENT filename, `verilog-library-directories' and 7192Uses the CURRENT filename, `verilog-library-directories' and
7125`verilog-library-extensions' variables to build the path. 7193`verilog-library-extensions' variables to build the path.
7126With optional CHECK-EXT also check `verilog-library-extensions'." 7194With optional CHECK-EXT also check `verilog-library-extensions'."
7127 (let ((ckdir (verilog-expand-dirnames verilog-library-directories)) 7195 (unless verilog-dir-cache-preserving
7128 fn outlist) 7196 (setq verilog-dir-cache-lib-filenames nil))
7129 (while ckdir 7197 (let* ((cache-key (list filename current check-ext))
7130 (let ((ckext (if check-ext verilog-library-extensions `("")))) 7198 (fass (assoc cache-key verilog-dir-cache-lib-filenames))
7131 (while ckext 7199 chkdirs chkdir chkexts fn outlist)
7132 (setq fn (expand-file-name 7200 (cond (fass ;; Return data from cache hit
7133 (concat filename (car ckext)) 7201 (nth 1 fass))
7134 (expand-file-name (car ckdir) (file-name-directory current)))) 7202 (t
7135 (if (file-exists-p fn) 7203 ;; Note this expand can't be easily cached, as we need to
7136 (setq outlist (cons fn outlist))) 7204 ;; pick up buffer-local variables for newly read sub-module files
7137 (setq ckext (cdr ckext)))) 7205 (setq chkdirs (verilog-expand-dirnames verilog-library-directories))
7138 (setq ckdir (cdr ckdir))) 7206 (while chkdirs
7139 (nreverse outlist))) 7207 (setq chkdir (expand-file-name (car chkdirs)
7208 (file-name-directory current))
7209 chkexts (if check-ext verilog-library-extensions `("")))
7210 (while chkexts
7211 (setq fn (expand-file-name (concat filename (car chkexts))
7212 chkdir))
7213 ;;(message "Check for %s" fn)
7214 (if (verilog-dir-file-exists-p fn)
7215 (setq outlist (cons (expand-file-name
7216 fn (file-name-directory current))
7217 outlist)))
7218 (setq chkexts (cdr chkexts)))
7219 (setq chkdirs (cdr chkdirs)))
7220 (setq outlist (nreverse outlist))
7221 (setq verilog-dir-cache-lib-filenames
7222 (cons (list cache-key outlist)
7223 verilog-dir-cache-lib-filenames))
7224 outlist))))
7140 7225
7141(defun verilog-module-filenames (module current) 7226(defun verilog-module-filenames (module current)
7142 "Return a search path to find the given MODULE name. 7227 "Return a search path to find the given MODULE name.
@@ -7166,10 +7251,10 @@ Buffer-local.")
7166 7251
7167(defvar verilog-modi-cache-preserve-tick nil 7252(defvar verilog-modi-cache-preserve-tick nil
7168 "Modification tick after which the cache is still considered valid. 7253 "Modification tick after which the cache is still considered valid.
7169Use `verilog-preserve-cache' to set it.") 7254Use `verilog-preserve-modi-cache' to set it.")
7170(defvar verilog-modi-cache-preserve-buffer nil 7255(defvar verilog-modi-cache-preserve-buffer nil
7171 "Modification tick after which the cache is still considered valid. 7256 "Modification tick after which the cache is still considered valid.
7172Use `verilog-preserve-cache' to set it.") 7257Use `verilog-preserve-modi-cache' to set it.")
7173 7258
7174(defun verilog-modi-current () 7259(defun verilog-modi-current ()
7175 "Return the modi structure for the module currently at point." 7260 "Return the modi structure for the module currently at point."
@@ -7260,10 +7345,10 @@ Return modi if successful, else print message unless IGNORE-ERROR is true."
7260(defun verilog-modi-cache-results (modi function) 7345(defun verilog-modi-cache-results (modi function)
7261 "Run on MODI the given FUNCTION. Locate the module in a file. 7346 "Run on MODI the given FUNCTION. Locate the module in a file.
7262Cache the output of function so next call may have faster access." 7347Cache the output of function so next call may have faster access."
7263 (let (func-returns fass) 7348 (let (fass)
7264 (save-excursion 7349 (save-excursion ;; Cache is buffer-local so can't avoid this.
7265 (verilog-modi-goto modi) 7350 (verilog-modi-goto modi)
7266 (if (and (setq fass (assoc (list (verilog-modi-name modi) function) 7351 (if (and (setq fass (assoc (list modi function)
7267 verilog-modi-cache-list)) 7352 verilog-modi-cache-list))
7268 ;; Destroy caching when incorrect; Modified or file changed 7353 ;; Destroy caching when incorrect; Modified or file changed
7269 (not (and verilog-cache-enabled 7354 (not (and verilog-cache-enabled
@@ -7275,26 +7360,26 @@ Cache the output of function so next call may have faster access."
7275 (setq verilog-modi-cache-list nil 7360 (setq verilog-modi-cache-list nil
7276 fass nil)) 7361 fass nil))
7277 (cond (fass 7362 (cond (fass
7278 ;; Found 7363 ;; Return data from cache hit
7279 (setq func-returns (nth 3 fass))) 7364 (nth 3 fass))
7280 (t 7365 (t
7281 ;; Read from file 7366 ;; Read from file
7282 ;; Clear then restore any hilighting to make Emacs 19 happy 7367 ;; Clear then restore any hilighting to make emacs19 happy
7283 (let ((fontlocked (when (and (boundp 'font-lock-mode) 7368 (let ((fontlocked (when (and (boundp 'font-lock-mode)
7284 font-lock-mode) 7369 font-lock-mode)
7285 (font-lock-mode nil) 7370 (font-lock-mode nil)
7286 t))) 7371 t))
7372 func-returns)
7287 (setq func-returns (funcall function)) 7373 (setq func-returns (funcall function))
7288 (when fontlocked (font-lock-mode t))) 7374 (when fontlocked (font-lock-mode t))
7289 ;; Cache for next time 7375 ;; Cache for next time
7290 (setq verilog-modi-cache-list 7376 (setq verilog-modi-cache-list
7291 (cons (list (list (verilog-modi-name modi) function) 7377 (cons (list (list modi function)
7292 (buffer-modified-tick) 7378 (buffer-modified-tick)
7293 (visited-file-modtime) 7379 (visited-file-modtime)
7294 func-returns) 7380 func-returns)
7295 verilog-modi-cache-list))))) 7381 verilog-modi-cache-list))
7296 ;; 7382 func-returns))))))
7297 func-returns))
7298 7383
7299(defun verilog-modi-cache-add (modi function element sig-list) 7384(defun verilog-modi-cache-add (modi function element sig-list)
7300 "Add function return results to the module cache. 7385 "Add function return results to the module cache.
@@ -7303,13 +7388,13 @@ function now contains the additional SIG-LIST parameters."
7303 (let (fass) 7388 (let (fass)
7304 (save-excursion 7389 (save-excursion
7305 (verilog-modi-goto modi) 7390 (verilog-modi-goto modi)
7306 (if (setq fass (assoc (list (verilog-modi-name modi) function) 7391 (if (setq fass (assoc (list modi function)
7307 verilog-modi-cache-list)) 7392 verilog-modi-cache-list))
7308 (let ((func-returns (nth 3 fass))) 7393 (let ((func-returns (nth 3 fass)))
7309 (aset func-returns element 7394 (aset func-returns element
7310 (append sig-list (aref func-returns element)))))))) 7395 (append sig-list (aref func-returns element))))))))
7311 7396
7312(defmacro verilog-preserve-cache (&rest body) 7397(defmacro verilog-preserve-modi-cache (&rest body)
7313 "Execute the BODY forms, allowing cache preservation within BODY. 7398 "Execute the BODY forms, allowing cache preservation within BODY.
7314This means that changes to the buffer will not result in the cache being 7399This means that changes to the buffer will not result in the cache being
7315flushed. If the changes affect the modsig state, they must call the 7400flushed. If the changes affect the modsig state, they must call the
@@ -7359,22 +7444,22 @@ and invalidating the cache."
7359 (nreverse out-list)))) 7444 (nreverse out-list))))
7360 7445
7361;; Combined 7446;; Combined
7362(defun verilog-modi-get-signals (modi) 7447(defun verilog-decls-get-signals (decls)
7363 (append 7448 (append
7364 (verilog-modi-get-outputs modi) 7449 (verilog-decls-get-outputs decls)
7365 (verilog-modi-get-inouts modi) 7450 (verilog-decls-get-inouts decls)
7366 (verilog-modi-get-inputs modi) 7451 (verilog-decls-get-inputs decls)
7367 (verilog-modi-get-wires modi) 7452 (verilog-decls-get-wires decls)
7368 (verilog-modi-get-regs modi) 7453 (verilog-decls-get-regs decls)
7369 (verilog-modi-get-assigns modi) 7454 (verilog-decls-get-assigns decls)
7370 (verilog-modi-get-consts modi) 7455 (verilog-decls-get-consts decls)
7371 (verilog-modi-get-gparams modi))) 7456 (verilog-decls-get-gparams decls)))
7372 7457
7373(defun verilog-modi-get-ports (modi) 7458(defun verilog-decls-get-ports (decls)
7374 (append 7459 (append
7375 (verilog-modi-get-outputs modi) 7460 (verilog-decls-get-outputs decls)
7376 (verilog-modi-get-inouts modi) 7461 (verilog-decls-get-inouts decls)
7377 (verilog-modi-get-inputs modi))) 7462 (verilog-decls-get-inputs decls)))
7378 7463
7379(defsubst verilog-modi-cache-add-outputs (modi sig-list) 7464(defsubst verilog-modi-cache-add-outputs (modi sig-list)
7380 (verilog-modi-cache-add modi 'verilog-read-decls 0 sig-list)) 7465 (verilog-modi-cache-add modi 'verilog-read-decls 0 sig-list))
@@ -7402,10 +7487,6 @@ and invalidating the cache."
7402 (while (verilog-re-search-forward search-for nil t) 7487 (while (verilog-re-search-forward search-for nil t)
7403 (funcall func))) 7488 (funcall func)))
7404 7489
7405(defun verilog-auto-search-do (search-for func)
7406 "Search for the given auto text SEARCH-FOR, and perform FUNC where it occurs."
7407 (verilog-auto-re-search-do (regexp-quote search-for) func))
7408
7409(defun verilog-insert-one-definition (sig type indent-pt) 7490(defun verilog-insert-one-definition (sig type indent-pt)
7410 "Print out a definition for SIG of the given TYPE, 7491 "Print out a definition for SIG of the given TYPE,
7411with appropriate INDENT-PT indentation." 7492with appropriate INDENT-PT indentation."
@@ -7760,8 +7841,9 @@ Typing \\[verilog-inject-auto] will make this into:
7760 (save-excursion 7841 (save-excursion
7761 (goto-char (point-min)) 7842 (goto-char (point-min))
7762 (while (verilog-re-search-forward-quick "\\<always\\s *@\\s *(" nil t) 7843 (while (verilog-re-search-forward-quick "\\<always\\s *@\\s *(" nil t)
7763 (let ((start-pt (point)) 7844 (let* ((start-pt (point))
7764 (modi (verilog-modi-current)) 7845 (modi (verilog-modi-current))
7846 (moddecls (verilog-modi-get-decls modi))
7765 pre-sigs 7847 pre-sigs
7766 got-sigs) 7848 got-sigs)
7767 (backward-char 1) 7849 (backward-char 1)
@@ -7770,7 +7852,7 @@ Typing \\[verilog-inject-auto] will make this into:
7770 (when (not (verilog-re-search-backward "/\\*\\(AUTOSENSE\\|AS\\)\\*/" start-pt t)) 7852 (when (not (verilog-re-search-backward "/\\*\\(AUTOSENSE\\|AS\\)\\*/" start-pt t))
7771 (setq pre-sigs (verilog-signals-from-signame 7853 (setq pre-sigs (verilog-signals-from-signame
7772 (verilog-read-signals start-pt (point))) 7854 (verilog-read-signals start-pt (point)))
7773 got-sigs (verilog-auto-sense-sigs modi nil)) 7855 got-sigs (verilog-auto-sense-sigs moddecls nil))
7774 (when (not (or (verilog-signals-not-in pre-sigs got-sigs) ; Both are equal? 7856 (when (not (or (verilog-signals-not-in pre-sigs got-sigs) ; Both are equal?
7775 (verilog-signals-not-in got-sigs pre-sigs))) 7857 (verilog-signals-not-in got-sigs pre-sigs)))
7776 (delete-region start-pt (point)) 7858 (delete-region start-pt (point))
@@ -7923,21 +8005,22 @@ to choose the comma yourself.
7923 8005
7924Avoid declaring ports manually, as it makes code harder to maintain." 8006Avoid declaring ports manually, as it makes code harder to maintain."
7925 (save-excursion 8007 (save-excursion
7926 (let ((modi (verilog-modi-current)) 8008 (let* ((modi (verilog-modi-current))
8009 (moddecls (verilog-modi-get-decls modi))
7927 (skip-pins (aref (verilog-read-arg-pins) 0))) 8010 (skip-pins (aref (verilog-read-arg-pins) 0)))
7928 (verilog-repair-open-comma) 8011 (verilog-repair-open-comma)
7929 (verilog-auto-arg-ports (verilog-signals-not-in 8012 (verilog-auto-arg-ports (verilog-signals-not-in
7930 (verilog-modi-get-outputs modi) 8013 (verilog-decls-get-outputs moddecls)
7931 skip-pins) 8014 skip-pins)
7932 "// Outputs" 8015 "// Outputs"
7933 verilog-indent-level-declaration) 8016 verilog-indent-level-declaration)
7934 (verilog-auto-arg-ports (verilog-signals-not-in 8017 (verilog-auto-arg-ports (verilog-signals-not-in
7935 (verilog-modi-get-inouts modi) 8018 (verilog-decls-get-inouts moddecls)
7936 skip-pins) 8019 skip-pins)
7937 "// Inouts" 8020 "// Inouts"
7938 verilog-indent-level-declaration) 8021 verilog-indent-level-declaration)
7939 (verilog-auto-arg-ports (verilog-signals-not-in 8022 (verilog-auto-arg-ports (verilog-signals-not-in
7940 (verilog-modi-get-inputs modi) 8023 (verilog-decls-get-inputs moddecls)
7941 skip-pins) 8024 skip-pins)
7942 "// Inputs" 8025 "// Inputs"
7943 verilog-indent-level-declaration) 8026 verilog-indent-level-declaration)
@@ -8325,9 +8408,11 @@ Lisp Templates:
8325 (verilog-auto-inst-column (max verilog-auto-inst-column 8408 (verilog-auto-inst-column (max verilog-auto-inst-column
8326 (+ 16 (* 8 (/ (+ indent-pt 7) 8))))) 8409 (+ 16 (* 8 (/ (+ indent-pt 7) 8)))))
8327 (modi (verilog-modi-current)) 8410 (modi (verilog-modi-current))
8411 (moddecls (verilog-modi-get-decls modi))
8328 (vector-skip-list (unless verilog-auto-inst-vector 8412 (vector-skip-list (unless verilog-auto-inst-vector
8329 (verilog-modi-get-signals modi))) 8413 (verilog-decls-get-signals moddecls)))
8330 submod submodi inst skip-pins tpl-list tpl-num did-first) 8414 submod submodi submoddecls
8415 inst skip-pins tpl-list tpl-num did-first)
8331 ;; Find module name that is instantiated 8416 ;; Find module name that is instantiated
8332 (setq submod (verilog-read-inst-module) 8417 (setq submod (verilog-read-inst-module)
8333 inst (verilog-read-inst-name) 8418 inst (verilog-read-inst-name)
@@ -8341,6 +8426,7 @@ Lisp Templates:
8341 ;; Lookup position, etc of submodule 8426 ;; Lookup position, etc of submodule
8342 ;; Note this may raise an error 8427 ;; Note this may raise an error
8343 (when (setq submodi (verilog-modi-lookup submod t)) 8428 (when (setq submodi (verilog-modi-lookup submod t))
8429 (setq submoddecls (verilog-modi-get-decls submodi))
8344 ;; If there's a number in the instantiation, it may be a argument to the 8430 ;; If there's a number in the instantiation, it may be a argument to the
8345 ;; automatic variable instantiation program. 8431 ;; automatic variable instantiation program.
8346 (let* ((tpl-info (verilog-read-auto-template submod)) 8432 (let* ((tpl-info (verilog-read-auto-template submod))
@@ -8351,7 +8437,7 @@ Lisp Templates:
8351 tpl-list (aref tpl-info 1))) 8437 tpl-list (aref tpl-info 1)))
8352 ;; Find submodule's signals and dump 8438 ;; Find submodule's signals and dump
8353 (let ((sig-list (verilog-signals-not-in 8439 (let ((sig-list (verilog-signals-not-in
8354 (verilog-modi-get-outputs submodi) 8440 (verilog-decls-get-outputs submoddecls)
8355 skip-pins)) 8441 skip-pins))
8356 (vl-dir "output")) 8442 (vl-dir "output"))
8357 (when sig-list 8443 (when sig-list
@@ -8364,7 +8450,7 @@ Lisp Templates:
8364 tpl-list tpl-num for-star)) 8450 tpl-list tpl-num for-star))
8365 sig-list))) 8451 sig-list)))
8366 (let ((sig-list (verilog-signals-not-in 8452 (let ((sig-list (verilog-signals-not-in
8367 (verilog-modi-get-inouts submodi) 8453 (verilog-decls-get-inouts submoddecls)
8368 skip-pins)) 8454 skip-pins))
8369 (vl-dir "inout")) 8455 (vl-dir "inout"))
8370 (when sig-list 8456 (when sig-list
@@ -8376,7 +8462,7 @@ Lisp Templates:
8376 tpl-list tpl-num for-star)) 8462 tpl-list tpl-num for-star))
8377 sig-list))) 8463 sig-list)))
8378 (let ((sig-list (verilog-signals-not-in 8464 (let ((sig-list (verilog-signals-not-in
8379 (verilog-modi-get-inputs submodi) 8465 (verilog-decls-get-inputs submoddecls)
8380 skip-pins)) 8466 skip-pins))
8381 (vl-dir "input")) 8467 (vl-dir "input"))
8382 (when sig-list 8468 (when sig-list
@@ -8447,9 +8533,11 @@ Templates:
8447 (verilog-auto-inst-column (max verilog-auto-inst-column 8533 (verilog-auto-inst-column (max verilog-auto-inst-column
8448 (+ 16 (* 8 (/ (+ indent-pt 7) 8))))) 8534 (+ 16 (* 8 (/ (+ indent-pt 7) 8)))))
8449 (modi (verilog-modi-current)) 8535 (modi (verilog-modi-current))
8536 (moddecls (verilog-modi-get-decls modi))
8450 (vector-skip-list (unless verilog-auto-inst-vector 8537 (vector-skip-list (unless verilog-auto-inst-vector
8451 (verilog-modi-get-signals modi))) 8538 (verilog-decls-get-signals moddecls)))
8452 submod submodi inst skip-pins tpl-list tpl-num did-first) 8539 submod submodi submoddecls
8540 inst skip-pins tpl-list tpl-num did-first)
8453 ;; Find module name that is instantiated 8541 ;; Find module name that is instantiated
8454 (setq submod (save-excursion 8542 (setq submod (save-excursion
8455 ;; Get to the point where AUTOINST normally is to read the module 8543 ;; Get to the point where AUTOINST normally is to read the module
@@ -8469,6 +8557,7 @@ Templates:
8469 ;; Lookup position, etc of submodule 8557 ;; Lookup position, etc of submodule
8470 ;; Note this may raise an error 8558 ;; Note this may raise an error
8471 (when (setq submodi (verilog-modi-lookup submod t)) 8559 (when (setq submodi (verilog-modi-lookup submod t))
8560 (setq submoddecls (verilog-modi-get-decls submodi))
8472 ;; If there's a number in the instantiation, it may be a argument to the 8561 ;; If there's a number in the instantiation, it may be a argument to the
8473 ;; automatic variable instantiation program. 8562 ;; automatic variable instantiation program.
8474 (let* ((tpl-info (verilog-read-auto-template submod)) 8563 (let* ((tpl-info (verilog-read-auto-template submod))
@@ -8479,7 +8568,7 @@ Templates:
8479 tpl-list (aref tpl-info 1))) 8568 tpl-list (aref tpl-info 1)))
8480 ;; Find submodule's signals and dump 8569 ;; Find submodule's signals and dump
8481 (let ((sig-list (verilog-signals-not-in 8570 (let ((sig-list (verilog-signals-not-in
8482 (verilog-modi-get-gparams submodi) 8571 (verilog-decls-get-gparams submoddecls)
8483 skip-pins)) 8572 skip-pins))
8484 (vl-dir "parameter")) 8573 (vl-dir "parameter"))
8485 (when sig-list 8574 (when sig-list
@@ -8536,15 +8625,17 @@ Typing \\[verilog-auto] will make this into:
8536 ;; Point must be at insertion point. 8625 ;; Point must be at insertion point.
8537 (let* ((indent-pt (current-indentation)) 8626 (let* ((indent-pt (current-indentation))
8538 (modi (verilog-modi-current)) 8627 (modi (verilog-modi-current))
8628 (moddecls (verilog-modi-get-decls modi))
8629 (modsubdecls (verilog-modi-get-sub-decls modi))
8539 (sig-list (verilog-signals-not-in 8630 (sig-list (verilog-signals-not-in
8540 (verilog-modi-get-outputs modi) 8631 (verilog-decls-get-outputs moddecls)
8541 (append (verilog-modi-get-wires modi) 8632 (append (verilog-decls-get-wires moddecls)
8542 (verilog-modi-get-regs modi) 8633 (verilog-decls-get-regs moddecls)
8543 (verilog-modi-get-assigns modi) 8634 (verilog-decls-get-assigns moddecls)
8544 (verilog-modi-get-consts modi) 8635 (verilog-decls-get-consts moddecls)
8545 (verilog-modi-get-gparams modi) 8636 (verilog-decls-get-gparams moddecls)
8546 (verilog-modi-get-sub-outputs modi) 8637 (verilog-subdecls-get-outputs modsubdecls)
8547 (verilog-modi-get-sub-inouts modi))))) 8638 (verilog-subdecls-get-inouts modsubdecls)))))
8548 (forward-line 1) 8639 (forward-line 1)
8549 (when sig-list 8640 (when sig-list
8550 (verilog-insert-indent "// Beginning of automatic regs (for this module's undeclared outputs)\n") 8641 (verilog-insert-indent "// Beginning of automatic regs (for this module's undeclared outputs)\n")
@@ -8593,11 +8684,13 @@ Typing \\[verilog-auto] will make this into:
8593 ;; Point must be at insertion point. 8684 ;; Point must be at insertion point.
8594 (let* ((indent-pt (current-indentation)) 8685 (let* ((indent-pt (current-indentation))
8595 (modi (verilog-modi-current)) 8686 (modi (verilog-modi-current))
8687 (moddecls (verilog-modi-get-decls modi))
8688 (modsubdecls (verilog-modi-get-sub-decls modi))
8596 (sig-list (verilog-signals-combine-bus 8689 (sig-list (verilog-signals-combine-bus
8597 (verilog-signals-not-in 8690 (verilog-signals-not-in
8598 (append (verilog-modi-get-sub-inputs modi) 8691 (append (verilog-subdecls-get-inputs modsubdecls)
8599 (verilog-modi-get-sub-inouts modi)) 8692 (verilog-subdecls-get-inouts modsubdecls))
8600 (verilog-modi-get-signals modi))))) 8693 (verilog-decls-get-signals moddecls)))))
8601 (forward-line 1) 8694 (forward-line 1)
8602 (when sig-list 8695 (when sig-list
8603 (verilog-insert-indent "// Beginning of automatic reg inputs (for undeclared instantiated-module inputs)\n") 8696 (verilog-insert-indent "// Beginning of automatic reg inputs (for undeclared instantiated-module inputs)\n")
@@ -8654,11 +8747,13 @@ Typing \\[verilog-auto] will make this into:
8654 ;; Point must be at insertion point. 8747 ;; Point must be at insertion point.
8655 (let* ((indent-pt (current-indentation)) 8748 (let* ((indent-pt (current-indentation))
8656 (modi (verilog-modi-current)) 8749 (modi (verilog-modi-current))
8750 (moddecls (verilog-modi-get-decls modi))
8751 (modsubdecls (verilog-modi-get-sub-decls modi))
8657 (sig-list (verilog-signals-combine-bus 8752 (sig-list (verilog-signals-combine-bus
8658 (verilog-signals-not-in 8753 (verilog-signals-not-in
8659 (append (verilog-modi-get-sub-outputs modi) 8754 (append (verilog-subdecls-get-outputs modsubdecls)
8660 (verilog-modi-get-sub-inouts modi)) 8755 (verilog-subdecls-get-inouts modsubdecls))
8661 (verilog-modi-get-signals modi))))) 8756 (verilog-decls-get-signals moddecls)))))
8662 (forward-line 1) 8757 (forward-line 1)
8663 (when sig-list 8758 (when sig-list
8664 (verilog-insert-indent "// Beginning of automatic wires (for undeclared instantiated-module outputs)\n") 8759 (verilog-insert-indent "// Beginning of automatic wires (for undeclared instantiated-module outputs)\n")
@@ -8728,12 +8823,14 @@ same expansion will result from only extracting outputs starting with ov:
8728 (nth 0 (verilog-read-auto-params 1)))) 8823 (nth 0 (verilog-read-auto-params 1))))
8729 (v2k (verilog-in-paren)) 8824 (v2k (verilog-in-paren))
8730 (modi (verilog-modi-current)) 8825 (modi (verilog-modi-current))
8826 (moddecls (verilog-modi-get-decls modi))
8827 (modsubdecls (verilog-modi-get-sub-decls modi))
8731 (sig-list (verilog-signals-not-in 8828 (sig-list (verilog-signals-not-in
8732 (verilog-modi-get-sub-outputs modi) 8829 (verilog-subdecls-get-outputs modsubdecls)
8733 (append (verilog-modi-get-outputs modi) 8830 (append (verilog-decls-get-outputs moddecls)
8734 (verilog-modi-get-inouts modi) 8831 (verilog-decls-get-inouts moddecls)
8735 (verilog-modi-get-sub-inputs modi) 8832 (verilog-subdecls-get-inputs modsubdecls)
8736 (verilog-modi-get-sub-inouts modi))))) 8833 (verilog-subdecls-get-inouts modsubdecls)))))
8737 (when regexp 8834 (when regexp
8738 (setq sig-list (verilog-signals-matching-regexp 8835 (setq sig-list (verilog-signals-matching-regexp
8739 sig-list regexp))) 8836 sig-list regexp)))
@@ -8785,10 +8882,11 @@ Typing \\[verilog-auto] will make this into:
8785 (let* ((indent-pt (current-indentation)) 8882 (let* ((indent-pt (current-indentation))
8786 (v2k (verilog-in-paren)) 8883 (v2k (verilog-in-paren))
8787 (modi (verilog-modi-current)) 8884 (modi (verilog-modi-current))
8885 (moddecls (verilog-modi-get-decls modi))
8788 (sig-list (verilog-signals-combine-bus 8886 (sig-list (verilog-signals-combine-bus
8789 (verilog-signals-not-in 8887 (verilog-signals-not-in
8790 (verilog-modi-get-signals modi) 8888 (verilog-decls-get-signals moddecls)
8791 (verilog-modi-get-ports modi))))) 8889 (verilog-decls-get-ports moddecls)))))
8792 (forward-line 1) 8890 (forward-line 1)
8793 (when v2k (verilog-repair-open-comma)) 8891 (when v2k (verilog-repair-open-comma))
8794 (when sig-list 8892 (when sig-list
@@ -8853,16 +8951,18 @@ same expansion will result from only extracting inputs starting with i:
8853 (nth 0 (verilog-read-auto-params 1)))) 8951 (nth 0 (verilog-read-auto-params 1))))
8854 (v2k (verilog-in-paren)) 8952 (v2k (verilog-in-paren))
8855 (modi (verilog-modi-current)) 8953 (modi (verilog-modi-current))
8954 (moddecls (verilog-modi-get-decls modi))
8955 (modsubdecls (verilog-modi-get-sub-decls modi))
8856 (sig-list (verilog-signals-not-in 8956 (sig-list (verilog-signals-not-in
8857 (verilog-modi-get-sub-inputs modi) 8957 (verilog-subdecls-get-inputs modsubdecls)
8858 (append (verilog-modi-get-inputs modi) 8958 (append (verilog-decls-get-inputs moddecls)
8859 (verilog-modi-get-inouts modi) 8959 (verilog-decls-get-inouts moddecls)
8860 (verilog-modi-get-wires modi) 8960 (verilog-decls-get-wires moddecls)
8861 (verilog-modi-get-regs modi) 8961 (verilog-decls-get-regs moddecls)
8862 (verilog-modi-get-consts modi) 8962 (verilog-decls-get-consts moddecls)
8863 (verilog-modi-get-gparams modi) 8963 (verilog-decls-get-gparams moddecls)
8864 (verilog-modi-get-sub-outputs modi) 8964 (verilog-subdecls-get-outputs modsubdecls)
8865 (verilog-modi-get-sub-inouts modi))))) 8965 (verilog-subdecls-get-inouts modsubdecls)))))
8866 (when regexp 8966 (when regexp
8867 (setq sig-list (verilog-signals-matching-regexp 8967 (setq sig-list (verilog-signals-matching-regexp
8868 sig-list regexp))) 8968 sig-list regexp)))
@@ -8932,13 +9032,15 @@ same expansion will result from only extracting inouts starting with i:
8932 (nth 0 (verilog-read-auto-params 1)))) 9032 (nth 0 (verilog-read-auto-params 1))))
8933 (v2k (verilog-in-paren)) 9033 (v2k (verilog-in-paren))
8934 (modi (verilog-modi-current)) 9034 (modi (verilog-modi-current))
9035 (moddecls (verilog-modi-get-decls modi))
9036 (modsubdecls (verilog-modi-get-sub-decls modi))
8935 (sig-list (verilog-signals-not-in 9037 (sig-list (verilog-signals-not-in
8936 (verilog-modi-get-sub-inouts modi) 9038 (verilog-subdecls-get-inouts modsubdecls)
8937 (append (verilog-modi-get-outputs modi) 9039 (append (verilog-decls-get-outputs moddecls)
8938 (verilog-modi-get-inouts modi) 9040 (verilog-decls-get-inouts moddecls)
8939 (verilog-modi-get-inputs modi) 9041 (verilog-decls-get-inputs moddecls)
8940 (verilog-modi-get-sub-inputs modi) 9042 (verilog-subdecls-get-inputs modsubdecls)
8941 (verilog-modi-get-sub-outputs modi))))) 9043 (verilog-subdecls-get-outputs modsubdecls)))))
8942 (when regexp 9044 (when regexp
8943 (setq sig-list (verilog-signals-matching-regexp 9045 (setq sig-list (verilog-signals-matching-regexp
8944 sig-list regexp))) 9046 sig-list regexp)))
@@ -9011,15 +9113,17 @@ same expansion will result from only extracting signals starting with i:
9011 (let* ((indent-pt (current-indentation)) 9113 (let* ((indent-pt (current-indentation))
9012 (v2k (verilog-in-paren)) 9114 (v2k (verilog-in-paren))
9013 (modi (verilog-modi-current)) 9115 (modi (verilog-modi-current))
9116 (moddecls (verilog-modi-get-decls modi))
9117 (submoddecls (verilog-modi-get-decls submodi))
9014 (sig-list-i (verilog-signals-not-in 9118 (sig-list-i (verilog-signals-not-in
9015 (verilog-modi-get-inputs submodi) 9119 (verilog-decls-get-inputs submoddecls)
9016 (append (verilog-modi-get-inputs modi)))) 9120 (append (verilog-decls-get-inputs moddecls))))
9017 (sig-list-o (verilog-signals-not-in 9121 (sig-list-o (verilog-signals-not-in
9018 (verilog-modi-get-outputs submodi) 9122 (verilog-decls-get-outputs submoddecls)
9019 (append (verilog-modi-get-outputs modi)))) 9123 (append (verilog-decls-get-outputs moddecls))))
9020 (sig-list-io (verilog-signals-not-in 9124 (sig-list-io (verilog-signals-not-in
9021 (verilog-modi-get-inouts submodi) 9125 (verilog-decls-get-inouts submoddecls)
9022 (append (verilog-modi-get-inouts modi))))) 9126 (append (verilog-decls-get-inouts moddecls)))))
9023 (forward-line 1) 9127 (forward-line 1)
9024 (when regexp 9128 (when regexp
9025 (setq sig-list-i (verilog-signals-matching-regexp 9129 (setq sig-list-i (verilog-signals-matching-regexp
@@ -9041,15 +9145,15 @@ same expansion will result from only extracting signals starting with i:
9041 (verilog-insert-indent "// End of automatics\n")) 9145 (verilog-insert-indent "// End of automatics\n"))
9042 (when v2k (verilog-repair-close-comma))))))) 9146 (when v2k (verilog-repair-close-comma)))))))
9043 9147
9044(defun verilog-auto-sense-sigs (modi presense-sigs) 9148(defun verilog-auto-sense-sigs (moddecls presense-sigs)
9045 "Return list of signals for current AUTOSENSE block." 9149 "Return list of signals for current AUTOSENSE block."
9046 (let* ((sigss (verilog-read-always-signals)) 9150 (let* ((sigss (verilog-read-always-signals))
9047 (sig-list (verilog-signals-not-params 9151 (sig-list (verilog-signals-not-params
9048 (verilog-signals-not-in (verilog-alw-get-inputs sigss) 9152 (verilog-signals-not-in (verilog-alw-get-inputs sigss)
9049 (append (and (not verilog-auto-sense-include-inputs) 9153 (append (and (not verilog-auto-sense-include-inputs)
9050 (verilog-alw-get-outputs sigss)) 9154 (verilog-alw-get-outputs sigss))
9051 (verilog-modi-get-consts modi) 9155 (verilog-decls-get-consts moddecls)
9052 (verilog-modi-get-gparams modi) 9156 (verilog-decls-get-gparams moddecls)
9053 presense-sigs))))) 9157 presense-sigs)))))
9054 sig-list)) 9158 sig-list))
9055 9159
@@ -9116,16 +9220,17 @@ operator. (This was added to the language in part due to AUTOSENSE!)
9116 (or (and (goto-char start-pt) (1+ (current-column))) 9220 (or (and (goto-char start-pt) (1+ (current-column)))
9117 (current-indentation)))) 9221 (current-indentation))))
9118 (modi (verilog-modi-current)) 9222 (modi (verilog-modi-current))
9223 (moddecls (verilog-modi-get-decls modi))
9119 (sig-memories (verilog-signals-memory 9224 (sig-memories (verilog-signals-memory
9120 (append 9225 (append
9121 (verilog-modi-get-regs modi) 9226 (verilog-decls-get-regs moddecls)
9122 (verilog-modi-get-wires modi)))) 9227 (verilog-decls-get-wires moddecls))))
9123 sig-list not-first presense-sigs) 9228 sig-list not-first presense-sigs)
9124 ;; Read signals in always, eliminate outputs from sense list 9229 ;; Read signals in always, eliminate outputs from sense list
9125 (setq presense-sigs (verilog-signals-from-signame 9230 (setq presense-sigs (verilog-signals-from-signame
9126 (save-excursion 9231 (save-excursion
9127 (verilog-read-signals start-pt (point))))) 9232 (verilog-read-signals start-pt (point)))))
9128 (setq sig-list (verilog-auto-sense-sigs modi presense-sigs)) 9233 (setq sig-list (verilog-auto-sense-sigs moddecls presense-sigs))
9129 (when sig-memories 9234 (when sig-memories
9130 (let ((tlen (length sig-list))) 9235 (let ((tlen (length sig-list)))
9131 (setq sig-list (verilog-signals-not-in sig-list sig-memories)) 9236 (setq sig-list (verilog-signals-not-in sig-list sig-memories))
@@ -9210,7 +9315,8 @@ Typing \\[verilog-auto] will make this into:
9210 ;; Find beginning 9315 ;; Find beginning
9211 (let* ((indent-pt (current-indentation)) 9316 (let* ((indent-pt (current-indentation))
9212 (modi (verilog-modi-current)) 9317 (modi (verilog-modi-current))
9213 (all-list (verilog-modi-get-signals modi)) 9318 (moddecls (verilog-modi-get-decls modi))
9319 (all-list (verilog-decls-get-signals moddecls))
9214 sigss sig-list prereset-sigs assignment-str) 9320 sigss sig-list prereset-sigs assignment-str)
9215 ;; Read signals in always, eliminate outputs from reset list 9321 ;; Read signals in always, eliminate outputs from reset list
9216 (setq prereset-sigs (verilog-signals-from-signame 9322 (setq prereset-sigs (verilog-signals-from-signame
@@ -9290,15 +9396,17 @@ Typing \\[verilog-auto] will make this into:
9290 ;; Find beginning 9396 ;; Find beginning
9291 (let* ((indent-pt (current-indentation)) 9397 (let* ((indent-pt (current-indentation))
9292 (modi (verilog-modi-current)) 9398 (modi (verilog-modi-current))
9399 (moddecls (verilog-modi-get-decls modi))
9400 (modsubdecls (verilog-modi-get-sub-decls modi))
9293 (sig-list (verilog-signals-not-in 9401 (sig-list (verilog-signals-not-in
9294 (verilog-modi-get-outputs modi) 9402 (verilog-decls-get-outputs moddecls)
9295 (append (verilog-modi-get-wires modi) 9403 (append (verilog-decls-get-wires moddecls)
9296 (verilog-modi-get-regs modi) 9404 (verilog-decls-get-regs moddecls)
9297 (verilog-modi-get-assigns modi) 9405 (verilog-decls-get-assigns moddecls)
9298 (verilog-modi-get-consts modi) 9406 (verilog-decls-get-consts moddecls)
9299 (verilog-modi-get-gparams modi) 9407 (verilog-decls-get-gparams moddecls)
9300 (verilog-modi-get-sub-outputs modi) 9408 (verilog-subdecls-get-outputs modsubdecls)
9301 (verilog-modi-get-sub-inouts modi))))) 9409 (verilog-subdecls-get-inouts modsubdecls)))))
9302 (when sig-list 9410 (when sig-list
9303 (forward-line 1) 9411 (forward-line 1)
9304 (verilog-insert-indent "// Beginning of automatic tieoffs (for this module's unterminated outputs)\n") 9412 (verilog-insert-indent "// Beginning of automatic tieoffs (for this module's unterminated outputs)\n")
@@ -9371,11 +9479,13 @@ Typing \\[verilog-auto] will make this into:
9371 ;; Find beginning 9479 ;; Find beginning
9372 (let* ((indent-pt (progn (search-backward "/*") (current-column))) 9480 (let* ((indent-pt (progn (search-backward "/*") (current-column)))
9373 (modi (verilog-modi-current)) 9481 (modi (verilog-modi-current))
9482 (moddecls (verilog-modi-get-decls modi))
9483 (modsubdecls (verilog-modi-get-sub-decls modi))
9374 (sig-list (verilog-signals-not-in 9484 (sig-list (verilog-signals-not-in
9375 (append (verilog-modi-get-inputs modi) 9485 (append (verilog-decls-get-inputs moddecls)
9376 (verilog-modi-get-inouts modi)) 9486 (verilog-decls-get-inouts moddecls))
9377 (append (verilog-modi-get-sub-inputs modi) 9487 (append (verilog-subdecls-get-inputs modsubdecls)
9378 (verilog-modi-get-sub-inouts modi))))) 9488 (verilog-subdecls-get-inouts modsubdecls)))))
9379 (setq sig-list (verilog-signals-not-matching-regexp 9489 (setq sig-list (verilog-signals-not-matching-regexp
9380 sig-list verilog-auto-unused-ignore-regexp)) 9490 sig-list verilog-auto-unused-ignore-regexp))
9381 (when sig-list 9491 (when sig-list
@@ -9463,14 +9573,15 @@ Typing \\[verilog-auto] will make this into:
9463 ;; 9573 ;;
9464 (indent-pt (current-indentation)) 9574 (indent-pt (current-indentation))
9465 (modi (verilog-modi-current)) 9575 (modi (verilog-modi-current))
9576 (moddecls (verilog-modi-get-decls modi))
9466 ;; 9577 ;;
9467 (sig-list-consts (append (verilog-modi-get-consts modi) 9578 (sig-list-consts (append (verilog-decls-get-consts moddecls)
9468 (verilog-modi-get-gparams modi))) 9579 (verilog-decls-get-gparams moddecls)))
9469 (sig-list-all (append (verilog-modi-get-regs modi) 9580 (sig-list-all (append (verilog-decls-get-regs moddecls)
9470 (verilog-modi-get-outputs modi) 9581 (verilog-decls-get-outputs moddecls)
9471 (verilog-modi-get-inouts modi) 9582 (verilog-decls-get-inouts moddecls)
9472 (verilog-modi-get-inputs modi) 9583 (verilog-decls-get-inputs moddecls)
9473 (verilog-modi-get-wires modi))) 9584 (verilog-decls-get-wires moddecls)))
9474 ;; 9585 ;;
9475 (undecode-sig (or (assoc undecode-name sig-list-all) 9586 (undecode-sig (or (assoc undecode-name sig-list-all)
9476 (error "%s: Signal %s not found in design" (verilog-point-text) undecode-name))) 9587 (error "%s: Signal %s not found in design" (verilog-point-text) undecode-name)))
@@ -9617,7 +9728,9 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com."
9617 (fontlocked (when (and (boundp 'font-lock-mode) 9728 (fontlocked (when (and (boundp 'font-lock-mode)
9618 font-lock-mode) 9729 font-lock-mode)
9619 (font-lock-mode nil) 9730 (font-lock-mode nil)
9620 t))) 9731 t))
9732 ;; Cache directories; we don't write new files, so can't change
9733 (verilog-dir-cache-preserving t))
9621 (unwind-protect 9734 (unwind-protect
9622 (save-excursion 9735 (save-excursion
9623 ;; If we're not in verilog-mode, change syntax table so parsing works right 9736 ;; If we're not in verilog-mode, change syntax table so parsing works right
@@ -9628,13 +9741,15 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com."
9628 (verilog-auto-reeval-locals) 9741 (verilog-auto-reeval-locals)
9629 (verilog-read-auto-lisp (point-min) (point-max)) 9742 (verilog-read-auto-lisp (point-min) (point-max))
9630 (verilog-getopt-flags) 9743 (verilog-getopt-flags)
9744 ;; From here on out, we can cache anything we read from disk
9745 (verilog-preserve-dir-cache
9631 ;; These two may seem obvious to do always, but on large includes it can be way too slow 9746 ;; These two may seem obvious to do always, but on large includes it can be way too slow
9632 (when verilog-auto-read-includes 9747 (when verilog-auto-read-includes
9633 (verilog-read-includes) 9748 (verilog-read-includes)
9634 (verilog-read-defines nil nil t)) 9749 (verilog-read-defines nil nil t))
9635 ;; This particular ordering is important 9750 ;; This particular ordering is important
9636 ;; INST: Lower modules correct, no internal dependencies, FIRST 9751 ;; INST: Lower modules correct, no internal dependencies, FIRST
9637 (verilog-preserve-cache 9752 (verilog-preserve-modi-cache
9638 ;; Clear existing autos else we'll be screwed by existing ones 9753 ;; Clear existing autos else we'll be screwed by existing ones
9639 (verilog-delete-auto) 9754 (verilog-delete-auto)
9640 ;; Injection if appropriate 9755 ;; Injection if appropriate
@@ -9643,9 +9758,9 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com."
9643 (verilog-inject-sense) 9758 (verilog-inject-sense)
9644 (verilog-inject-arg)) 9759 (verilog-inject-arg))
9645 ;; 9760 ;;
9646 (verilog-auto-search-do "/*AUTOINSTPARAM*/" 'verilog-auto-inst-param) 9761 (verilog-auto-re-search-do "/\\*AUTOINSTPARAM\\*/" 'verilog-auto-inst-param)
9647 (verilog-auto-search-do "/*AUTOINST*/" 'verilog-auto-inst) 9762 (verilog-auto-re-search-do "/\\*AUTOINST\\*/" 'verilog-auto-inst)
9648 (verilog-auto-search-do ".*" 'verilog-auto-star) 9763 (verilog-auto-re-search-do "\\.\\*" 'verilog-auto-star)
9649 ;; Doesn't matter when done, but combine it with a common changer 9764 ;; Doesn't matter when done, but combine it with a common changer
9650 (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense) 9765 (verilog-auto-re-search-do "/\\*\\(AUTOSENSE\\|AS\\)\\*/" 'verilog-auto-sense)
9651 (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset) 9766 (verilog-auto-re-search-do "/\\*AUTORESET\\*/" 'verilog-auto-reset)
@@ -9665,19 +9780,19 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com."
9665 '(lambda () (verilog-auto-inout t))) 9780 '(lambda () (verilog-auto-inout t)))
9666 (verilog-auto-re-search-do "/\\*AUTOINOUT\\*/" 'verilog-auto-inout) 9781 (verilog-auto-re-search-do "/\\*AUTOINOUT\\*/" 'verilog-auto-inout)
9667 ;; Then tie off those in/outs 9782 ;; Then tie off those in/outs
9668 (verilog-auto-search-do "/*AUTOTIEOFF*/" 'verilog-auto-tieoff) 9783 (verilog-auto-re-search-do "/\\*AUTOTIEOFF\\*/" 'verilog-auto-tieoff)
9669 ;; Wires/regs must be after inputs/outputs 9784 ;; Wires/regs must be after inputs/outputs
9670 (verilog-auto-search-do "/*AUTOWIRE*/" 'verilog-auto-wire) 9785 (verilog-auto-re-search-do "/\\*AUTOWIRE\\*/" 'verilog-auto-wire)
9671 (verilog-auto-search-do "/*AUTOREG*/" 'verilog-auto-reg) 9786 (verilog-auto-re-search-do "/\\*AUTOREG\\*/" 'verilog-auto-reg)
9672 (verilog-auto-search-do "/*AUTOREGINPUT*/" 'verilog-auto-reg-input) 9787 (verilog-auto-re-search-do "/\\*AUTOREGINPUT\\*/" 'verilog-auto-reg-input)
9673 ;; outputevery needs AUTOOUTPUTs done first 9788 ;; outputevery needs AUTOOUTPUTs done first
9674 (verilog-auto-search-do "/*AUTOOUTPUTEVERY*/" 'verilog-auto-output-every) 9789 (verilog-auto-re-search-do "/\\*AUTOOUTPUTEVERY\\*/" 'verilog-auto-output-every)
9675 ;; After we've created all new variables 9790 ;; After we've created all new variables
9676 (verilog-auto-search-do "/*AUTOUNUSED*/" 'verilog-auto-unused) 9791 (verilog-auto-re-search-do "/\\*AUTOUNUSED\\*/" 'verilog-auto-unused)
9677 ;; Must be after all inputs outputs are generated 9792 ;; Must be after all inputs outputs are generated
9678 (verilog-auto-search-do "/*AUTOARG*/" 'verilog-auto-arg) 9793 (verilog-auto-re-search-do "/\\*AUTOARG\\*/" 'verilog-auto-arg)
9679 ;; Fix line numbers (comments only) 9794 ;; Fix line numbers (comments only)
9680 (verilog-auto-templated-rel)) 9795 (verilog-auto-templated-rel)))
9681 ;; 9796 ;;
9682 (run-hooks 'verilog-auto-hook) 9797 (run-hooks 'verilog-auto-hook)
9683 ;; 9798 ;;
@@ -9687,11 +9802,11 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.com."
9687 (cond ((and oldbuf (equal oldbuf (buffer-string))) 9802 (cond ((and oldbuf (equal oldbuf (buffer-string)))
9688 (set-buffer-modified-p nil) 9803 (set-buffer-modified-p nil)
9689 (unless noninteractive (message "Updating AUTOs...done (no changes)"))) 9804 (unless noninteractive (message "Updating AUTOs...done (no changes)")))
9690 (t (unless noninteractive (message "Updating AUTOs...done"))))) 9805 (t (unless noninteractive (message "Updating AUTOs...done"))))))
9691 ;; Unwind forms 9806 ;; Unwind forms
9692 (progn 9807 (progn
9693 ;; Restore font-lock 9808 ;; Restore font-lock
9694 (when fontlocked (font-lock-mode t)))))) 9809 (when fontlocked (font-lock-mode t)))))
9695 9810
9696 9811
9697;; 9812;;