aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Nicolaescu2009-06-28 17:52:45 +0000
committerDan Nicolaescu2009-06-28 17:52:45 +0000
commita3a8b0029ae828d1079140db91798783ea54632e (patch)
tree9eb87497d09eff1567d847ffd706bf24345591de
parentf7c0d93167355a7601de56f9fc21c1fd2f2b0f22 (diff)
downloademacs-a3a8b0029ae828d1079140db91798783ea54632e.tar.gz
emacs-a3a8b0029ae828d1079140db91798783ea54632e.zip
* verilog-mode.el (verilog-beg-of-statement)
(verilog-endcomment-reason-re): Support unique case and priority case. (verilog-basic-complete-re): Support localparam lineup. (verilog-beg-of-statement-1): Fix for robustness, unique case. (verilog-set-auto-endcomments): Fix for unique case, always_comb commenting. (verilog-leap-to-case-head): Now support *nested* unique & priority case statements. (verilog-auto-lineup): Make just declarations the default (as it had been). (verilog-leap-to-case-head): Support priority/unique case statements. (verilog-auto-lineup): Rework to give users radio buttons to select the various styles of automatic lineup (verilog-error-regexp-alist): Rework to support the XEmacs style of error regular expressions from compilers, lint tools & simulators. Note that GNU Emacs has made it impossible for a mode to load such things. (electric-verilog-terminate-line, verilog-indent-declaration) (verilog-auto-wiure): Rework for radio button selection of auto-lineup selection of specification of auto lineup. (verilog-beg-of-statement-1): Redesign to support proper operation in additional code, based on testing with auto-lineup. (verilog-calculate-indent, assignments & declarations) (verilog-backward-token): Enhance to support auto-lineup of assignments & declarations. (verilog-in-directive-p, verilog-at-struct-p): New function for easy test of whether we are. (verilog-pretty-declarations, verilog-pretty-expr): Massive rework to support safe execution at almost anyline. (verilog-calc-1): Properly support indenting deep inside generate blocks. (verilog-init-font) Remove definition & use of verilog-init-font, as it is redundant with font-lock-defaults. (verilog-mode): Alter the definition of verilog-font-lock-defualts to avoid circular calls if syntax-ppss is a function (as is the case now in 22.x GNU Emacs) as that function would sometimes call itself, leading to (nearly) infinite recursion (verilog-ovm-begin-re, verilog-ovm-end-re) (verilog-ovm-statement-re, verilog-leap-to-head) (verilog-backward-token): Add support for OVM macros. Some are complete statements, and others open and close scopes like begin and end. (verilog-defun-level-not-generate-re, verilog-defun-level-re) (verilog-defun-level-generate-only-re): Really fix the defun-list compilation issue (verilog-calc-1) (verilog-beg-of-statement): Enhance support for coverpoint, constraint and cross statements (verilog-defun-level-list, verilog-generate-defun-level-list) (verilog-all-defun-level-list): Redo these specifications - it is too hard to support eval-when compile aggregation of lists also built at when-compile time. (verilog-defun-level-list): Place defconsts of variables used in building regular expressions which are built in eval-when-compile bodies in the same eval-when-compile body to facilitate compile without load. (verilog-beg-block-re-ordered): Support indenting virtual/protected tasks and functions. (verilog-defun-level-list,verilog-in-generate-region-p) (verilog-backward-ws&directives, verilog-calc-1): Speed up indentation of some module items (generate items). (verilog-forward-sexp, verilog-leap-to-head): Support stepping across virtual/protected tasks and functions. * verilog-mode.el (verilog-auto-arg, verilog-auto-arg-sort): Allow sorting AUTOARG lists. Suggested by Andrea Fedeli. (verilog-read-sub-decls-line): Fix AUTOWIRE signals getting lost in concatenations. Reported by Yishay Belkind. (verilog-auto-ascii-enum): Support one-hot state machines in AUTOASCIIENUM. Suggested by Lloyd Gomez. (verilog-auto-inst, verilog-auto-inst-port): Include interface modport in AUTOINST and add vl-modport for users. Reported by David Rogoff. (verilog-auto-inout-module, verilog-auto-inst) (verilog-decls-get-interfaces, verilog-insert-definition) (verilog-insert-one-definition, verilog-read-decls) (verilog-read-sub-decls, verilog-read-sub-decls-sig) (verilog-sig-modport, verilog-signals-combine-bus) (verilog-subdecls-get-interfaces): Fix expansion of SystemVerilog interfaces in AUTOINOUTMODULE, AUTOINOUTCOMP, and AUTOINST. Suggested by David Rogoff. (verilog-repair-open-comma): Fix non-insertion of comma when `DEFINE occurs in V2K argument list. Reported by Lane Brooks. (verilog-make-width-expression): Simplify [A-1:0] expression widths to just {A{1'b0}}. (verilog-mode): Cleanup checkdoc warnings. (verilog-auto-inout-module, verilog-signals-matching-dir-re): Add third optional regexp to AUTOINOUTMODULE to allow selecting only inputs/outputs or data type. Suggested by Vasu Kandadi. (next-error-last-buffer): Fix byte-compiler warning. (verilog-auto, verilog-auto-insert-lisp, verilog-auto-inst) (verilog-delete-auto): Add AUTOINSERTLISP to insert arbitrary lisp or shell command text during AUTO expansion. Suggested by Tad Truex. (verilog-read-sub-decls-expr, verilog-read-sub-decls-line) (verilog-read-sub-decls-sig, verilog-symbol-detick-text): Fix dotted nets {a.b,c.d} and excaped identifiers being mis-included in AUTOINOUT. Reported by Matthew Lovell. (verilog-read-always-signals-recurse): Fix AUTORESET "if (a<=b)" causing use of <= assignments. Reported by Alex Reed. (verilog-read-decls): Fix triand, trior, wand, wor to be recognized by AUTOWIRE. Reported by Spencer Isaacson. (verilog-extended-complete-re): Support import "DPI-C" functions. (verilog-read-always-signals-recurse): Fix AUTORESET of "x <= y[a+1:a+1]" to not include a in reset list. Reported by Dan Dever. (verilog-insert-date, verilog-insert-year) (verilog-sk-header-tmpl): Fix verilog-header inserting error on Windows systems. Reported by Michael Potts. (verilog-read-module-name): Fix AUTOINST when the child module declaration's name is a tick define. Reported by Elliot Mednick. (verilog-read-decls): Fix V2K parameter bit subscripts getting passed to next parameter's definition. Reported by Bruce T. (verilog-read-decls): Fix detecting "parameter int" when using AUTOINSTPARAM. Reported by Bruce T. (verilog-goto-defun): Fix goto not finding modules unless first perform a verilog-auto expansion. Suggested by Lawrence Butcher. (verilog-mode): Expand -f flag arguments on entry to mode so verilog-goto-defun will work. Reported by Lawrence Butcher. (verilog-getopt): Expand environment variables in -f file arguments. Suggested by Lawrence Butcher. (verilog-set-define): Fix "Symbol's value as variable is void" when reading enumerations. (verilog-auto-ascii-enum): Fix duplicate labels in AUTOASCIIENUM. Suggested by Stephen Peltan. (verilog-read-defines): Fix reading of enumerations in include files. Reported by Steve Peltan.
-rw-r--r--lisp/ChangeLog133
-rw-r--r--lisp/progmodes/verilog-mode.el1907
2 files changed, 1343 insertions, 697 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index be9ac8a6e97..1adda939100 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,136 @@
12009-06-28 Michael McNamara <mac@mail.brushroad.com>
2
3 * verilog-mode.el (verilog-beg-of-statement)
4 (verilog-endcomment-reason-re): Support unique case and priority
5 case.
6 (verilog-basic-complete-re): Support localparam lineup.
7 (verilog-beg-of-statement-1): Fix for robustness, unique case.
8 (verilog-set-auto-endcomments): Fix for unique case, always_comb
9 commenting.
10 (verilog-leap-to-case-head): Now support *nested* unique &
11 priority case statements.
12 (verilog-auto-lineup): Make just declarations the default (as it
13 had been).
14 (verilog-leap-to-case-head): Support priority/unique case
15 statements.
16 (verilog-auto-lineup): Rework to give users radio buttons to
17 select the various styles of automatic lineup
18 (verilog-error-regexp-alist): Rework to support the XEmacs style
19 of error regular expressions from compilers, lint tools &
20 simulators. Note that GNU Emacs has made it impossible for a mode
21 to load such things.
22 (electric-verilog-terminate-line, verilog-indent-declaration)
23 (verilog-auto-wiure): Rework for radio button selection of
24 auto-lineup selection of specification of auto lineup.
25 (verilog-beg-of-statement-1): Redesign to support proper operation
26 in additional code, based on testing with auto-lineup.
27 (verilog-calculate-indent, assignments & declarations)
28 (verilog-backward-token): Enhance to support auto-lineup of
29 assignments & declarations.
30 (verilog-in-directive-p, verilog-at-struct-p): New function for
31 easy test of whether we are.
32 (verilog-pretty-declarations, verilog-pretty-expr): Massive rework
33 to support safe execution at almost anyline.
34 (verilog-calc-1): Properly support indenting deep inside generate
35 blocks.
36 (verilog-init-font) Remove definition & use of verilog-init-font,
37 as it is redundant with font-lock-defaults.
38 (verilog-mode): Alter the definition of verilog-font-lock-defualts
39 to avoid circular calls if syntax-ppss is a function (as is the
40 case now in 22.x GNU Emacs) as that function would sometimes call
41 itself, leading to (nearly) infinite recursion
42 (verilog-ovm-begin-re, verilog-ovm-end-re)
43 (verilog-ovm-statement-re, verilog-leap-to-head)
44 (verilog-backward-token): Add support for OVM macros. Some are
45 complete statements, and others open and close scopes like begin
46 and end.
47 (verilog-defun-level-not-generate-re, verilog-defun-level-re)
48 (verilog-defun-level-generate-only-re): Really fix the defun-list
49 compilation issue
50 (verilog-calc-1) (verilog-beg-of-statement): Enhance support for
51 coverpoint, constraint and cross statements
52 (verilog-defun-level-list, verilog-generate-defun-level-list)
53 (verilog-all-defun-level-list): Redo these specifications - it is
54 too hard to support eval-when compile aggregation of lists also
55 built at when-compile time.
56 (verilog-defun-level-list): Place defconsts of variables used in
57 building regular expressions which are built in eval-when-compile
58 bodies in the same eval-when-compile body to facilitate compile
59 without load.
60 (verilog-beg-block-re-ordered): Support indenting
61 virtual/protected tasks and functions.
62 (verilog-defun-level-list,verilog-in-generate-region-p)
63 (verilog-backward-ws&directives, verilog-calc-1): Speed up
64 indentation of some module items (generate items).
65 (verilog-forward-sexp, verilog-leap-to-head): Support stepping
66 across virtual/protected tasks and functions.
67
682009-06-28 Wilson Snyder <wsnyder@wsnyder.org>
69
70 * verilog-mode.el (verilog-auto-arg, verilog-auto-arg-sort): Allow
71 sorting AUTOARG lists. Suggested by Andrea Fedeli.
72 (verilog-read-sub-decls-line): Fix AUTOWIRE signals getting lost
73 in concatenations. Reported by Yishay Belkind.
74 (verilog-auto-ascii-enum): Support one-hot state machines in
75 AUTOASCIIENUM. Suggested by Lloyd Gomez.
76 (verilog-auto-inst, verilog-auto-inst-port): Include interface
77 modport in AUTOINST and add vl-modport for users. Reported by
78 David Rogoff.
79 (verilog-auto-inout-module, verilog-auto-inst)
80 (verilog-decls-get-interfaces, verilog-insert-definition)
81 (verilog-insert-one-definition, verilog-read-decls)
82 (verilog-read-sub-decls, verilog-read-sub-decls-sig)
83 (verilog-sig-modport, verilog-signals-combine-bus)
84 (verilog-subdecls-get-interfaces): Fix expansion of SystemVerilog
85 interfaces in AUTOINOUTMODULE, AUTOINOUTCOMP, and AUTOINST.
86 Suggested by David Rogoff.
87 (verilog-repair-open-comma): Fix non-insertion of comma when
88 `DEFINE occurs in V2K argument list. Reported by Lane Brooks.
89 (verilog-make-width-expression): Simplify [A-1:0] expression
90 widths to just {A{1'b0}}.
91 (verilog-mode): Cleanup checkdoc warnings.
92 (verilog-auto-inout-module, verilog-signals-matching-dir-re): Add
93 third optional regexp to AUTOINOUTMODULE to allow selecting only
94 inputs/outputs or data type. Suggested by Vasu Kandadi.
95 (next-error-last-buffer): Fix byte-compiler warning.
96 (verilog-auto, verilog-auto-insert-lisp, verilog-auto-inst)
97 (verilog-delete-auto): Add AUTOINSERTLISP to insert arbitrary lisp
98 or shell command text during AUTO expansion. Suggested by Tad
99 Truex.
100 (verilog-read-sub-decls-expr, verilog-read-sub-decls-line)
101 (verilog-read-sub-decls-sig, verilog-symbol-detick-text): Fix
102 dotted nets {a.b,c.d} and excaped identifiers being mis-included
103 in AUTOINOUT. Reported by Matthew Lovell.
104 (verilog-read-always-signals-recurse): Fix AUTORESET "if (a<=b)"
105 causing use of <= assignments. Reported by Alex Reed.
106 (verilog-read-decls): Fix triand, trior, wand, wor to be
107 recognized by AUTOWIRE. Reported by Spencer Isaacson.
108 (verilog-extended-complete-re): Support import "DPI-C" functions.
109 (verilog-read-always-signals-recurse): Fix AUTORESET of "x <=
110 y[a+1:a+1]" to not include a in reset list. Reported by Dan
111 Dever.
112 (verilog-insert-date, verilog-insert-year)
113 (verilog-sk-header-tmpl): Fix verilog-header inserting error on
114 Windows systems. Reported by Michael Potts.
115 (verilog-read-module-name): Fix AUTOINST when the child module
116 declaration's name is a tick define. Reported by Elliot Mednick.
117 (verilog-read-decls): Fix V2K parameter bit subscripts getting
118 passed to next parameter's definition. Reported by Bruce T.
119 (verilog-read-decls): Fix detecting "parameter int" when using
120 AUTOINSTPARAM. Reported by Bruce T.
121 (verilog-goto-defun): Fix goto not finding modules unless first
122 perform a verilog-auto expansion. Suggested by Lawrence Butcher.
123 (verilog-mode): Expand -f flag arguments on entry to mode so
124 verilog-goto-defun will work. Reported by Lawrence Butcher.
125 (verilog-getopt): Expand environment variables in -f file
126 arguments. Suggested by Lawrence Butcher.
127 (verilog-set-define): Fix "Symbol's value as variable is void"
128 when reading enumerations.
129 (verilog-auto-ascii-enum): Fix duplicate labels in AUTOASCIIENUM.
130 Suggested by Stephen Peltan.
131 (verilog-read-defines): Fix reading of enumerations in include
132 files. Reported by Steve Peltan.
133
12009-06-28 David De La Harpe Golden <david@harpegolden.net> 1342009-06-28 David De La Harpe Golden <david@harpegolden.net>
2 135
3 * files.el (trash-directory): Fix defcustom type. 136 * files.el (trash-directory): Fix defcustom type.
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 330b8145d6d..6e0c046976f 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -54,7 +54,8 @@
54 54
55;; Verilog is a rapidly evolving language, and hence this mode is 55;; Verilog is a rapidly evolving language, and hence this mode is
56;; under continuous development. Hence this is beta code, and likely 56;; under continuous development. Hence this is beta code, and likely
57;; has bugs. Please report any and all bugs to me at mac@verilog.com. 57;; has bugs. Please report any issues to the issue tracker at
58;; http://www.veripool.org/verilog-mode
58;; Please use verilog-submit-bug-report to submit a report; type C-c 59;; Please use verilog-submit-bug-report to submit a report; type C-c
59;; C-b to invoke this and as a result I will have a much easier time 60;; C-b to invoke this and as a result I will have a much easier time
60;; of reproducing the bug you find, and hence fixing it. 61;; of reproducing the bug you find, and hence fixing it.
@@ -102,7 +103,7 @@
102; verilog-auto-endcomments t 103; verilog-auto-endcomments t
103; verilog-minimum-comment-distance 40 104; verilog-minimum-comment-distance 40
104; verilog-indent-begin-after-if t 105; verilog-indent-begin-after-if t
105; verilog-auto-lineup '(all) 106; verilog-auto-lineup 'declarations
106; verilog-highlight-p1800-keywords nil 107; verilog-highlight-p1800-keywords nil
107; verilog-linter "my_lint_shell_command" 108; verilog-linter "my_lint_shell_command"
108; ) 109; )
@@ -117,9 +118,9 @@
117;;; Code: 118;;; Code:
118 119
119;; This variable will always hold the version number of the mode 120;; This variable will always hold the version number of the mode
120(defconst verilog-mode-version "436" 121(defconst verilog-mode-version "520"
121 "Version of this Verilog mode.") 122 "Version of this Verilog mode.")
122(defconst verilog-mode-release-date "2008-09-02-GNU" 123(defconst verilog-mode-release-date "2009-06-12-GNU"
123 "Release date of this Verilog mode.") 124 "Release date of this Verilog mode.")
124(defconst verilog-mode-release-emacs t 125(defconst verilog-mode-release-emacs t
125 "If non-nil, this version of Verilog mode was released with Emacs itself.") 126 "If non-nil, this version of Verilog mode was released with Emacs itself.")
@@ -265,7 +266,7 @@ STRING should be given if the last search was by `string-match' on STRING."
265 (concat "\\<" (verilog-regexp-opt a t) "\\>"))) 266 (concat "\\<" (verilog-regexp-opt a t) "\\>")))
266 267
267(defun verilog-easy-menu-filter (menu) 268(defun verilog-easy-menu-filter (menu)
268 "Filter a easy-menu-define to support new features." 269 "Filter `easy-menu-define' MENU to support new features."
269 (cond ((not (featurep 'xemacs)) 270 (cond ((not (featurep 'xemacs))
270 menu) ;; GNU Emacs - passthru 271 menu) ;; GNU Emacs - passthru
271 ;; Xemacs doesn't support :help. Strip it. 272 ;; Xemacs doesn't support :help. Strip it.
@@ -299,10 +300,18 @@ STRING should be given if the last search was by `string-match' on STRING."
299 300
300(defun verilog-booleanp (value) 301(defun verilog-booleanp (value)
301 "Return t if VALUE is boolean. 302 "Return t if VALUE is boolean.
302 This implements GNU Emacs 22.1's `booleanp' function in earlier Emacs. 303This implements GNU Emacs 22.1's `booleanp' function in earlier Emacs.
303 This function may be removed when Emacs 21 is no longer supported." 304This function may be removed when Emacs 21 is no longer supported."
304 (or (equal value t) (equal value nil))) 305 (or (equal value t) (equal value nil)))
305 306
307(defun verilog-insert-last-command-event ()
308 "Insert the `last-command-event'."
309 (insert (if (featurep 'xemacs)
310 ;; XEmacs 21.5 doesn't like last-command-event
311 last-command-char
312 ;; And GNU Emacs 22 has obsoleted last-command-char
313 last-command-event)))
314
306(defalias 'verilog-syntax-ppss 315(defalias 'verilog-syntax-ppss
307 (if (fboundp 'syntax-ppss) 'syntax-ppss 316 (if (fboundp 'syntax-ppss) 'syntax-ppss
308 (lambda (&optional pos) (parse-partial-sexp (point-min) (or pos (point)))))) 317 (lambda (&optional pos) (parse-partial-sexp (point-min) (or pos (point))))))
@@ -390,6 +399,37 @@ entry \"Fontify Buffer\"). XEmacs: turn off and on font locking."
390;; Note we don't use :safe, as that would break on Emacsen before 22.0. 399;; Note we don't use :safe, as that would break on Emacsen before 22.0.
391(put 'verilog-highlight-translate-off 'safe-local-variable 'verilog-booleanp) 400(put 'verilog-highlight-translate-off 'safe-local-variable 'verilog-booleanp)
392 401
402(defcustom verilog-auto-lineup 'declarations
403 "*Type of statements to lineup across multiple lines.
404If 'all' is selected, then all line ups described below are done.
405
406If 'declaration', then just declarations are lined up with any
407preceding declarations, taking into account widths and the like,
408so or example the code:
409 reg [31:0] a;
410 reg b;
411would become
412 reg [31:0] a;
413 reg b;
414
415If 'assignment', then assignments are lined up with any preceding
416assignments, so for example the code
417 a_long_variable <= b + c;
418 d = e + f;
419would become
420 a_long_variable <= b + c;
421 d = e + f;
422
423In order to speed up editing, large blocks of statements are lined up
424only when a \\[verilog-pretty-expr] is typed; and large blocks of declarations
425are lineup only when \\[verilog-pretty-declarations] is typed."
426
427 :type '(radio (const :tag "Line up Assignments and Declarations" all)
428 (const :tag "Line up Assignment statements" assignments )
429 (const :tag "Line up Declarartions" declarations)
430 (function :tag "Other"))
431 :group 'verilog-mode-indent )
432
393(defcustom verilog-indent-level 3 433(defcustom verilog-indent-level 3
394 "*Indentation of Verilog statements with respect to containing block." 434 "*Indentation of Verilog statements with respect to containing block."
395 :group 'verilog-mode-indent 435 :group 'verilog-mode-indent
@@ -512,47 +552,6 @@ default avoids too many redundant comments in tight quarters."
512 :type 'integer) 552 :type 'integer)
513(put 'verilog-minimum-comment-distance 'safe-local-variable 'integerp) 553(put 'verilog-minimum-comment-distance 'safe-local-variable 'integerp)
514 554
515(defcustom verilog-auto-lineup '(declaration)
516 "*Algorithm for lining up statements on multiple lines.
517
518If this list contains the symbol 'all', then all line ups described below
519are done.
520
521If this list contains the symbol 'declaration', then declarations are lined up
522with any preceding declarations, taking into account widths and the like, so
523for example the code:
524 reg [31:0] a;
525 reg b;
526would become
527 reg [31:0] a;
528 reg b;
529
530If this list contains the symbol 'assignment', then assignments are lined up
531with any preceding assignments, so for example the code
532 a_long_variable = b + c;
533 d = e + f;
534would become
535 a_long_variable = b + c;
536 d = e + f;"
537
538;; The following is not implemented:
539;If this list contains the symbol 'case', then case items are lined up
540;with any preceding case items, so for example the code
541; case (a) begin
542; a_long_state : a = 3;
543; b: a = 4;
544; endcase
545;would become
546; case (a) begin
547; a_long_state : a = 3;
548; b : a = 4;
549; endcase
550;
551
552 :group 'verilog-mode-indent
553 :type 'list)
554(put 'verilog-auto-lineup 'safe-local-variable 'listp)
555
556(defcustom verilog-highlight-p1800-keywords nil 555(defcustom verilog-highlight-p1800-keywords nil
557 "*True means highlight words newly reserved by IEEE-1800. 556 "*True means highlight words newly reserved by IEEE-1800.
558These will appear in `verilog-font-lock-p1800-face' in order to gently 557These will appear in `verilog-font-lock-p1800-face' in order to gently
@@ -566,8 +565,8 @@ to see the effect as font color choices are cached by Emacs."
566 565
567(defcustom verilog-highlight-grouping-keywords nil 566(defcustom verilog-highlight-grouping-keywords nil
568 "*True means highlight grouping keywords 'begin' and 'end' more dramatically. 567 "*True means highlight grouping keywords 'begin' and 'end' more dramatically.
569If false, these words are in the font-lock-type-face; if True then they are in 568If false, these words are in the `font-lock-type-face'; if True then they are in
570`verilog-font-lock-ams-face'. Some find that special highlighting on these 569`verilog-font-lock-ams-face'. Some find that special highlighting on these
571grouping constructs allow the structure of the code to be understood at a glance." 570grouping constructs allow the structure of the code to be understood at a glance."
572 :group 'verilog-mode-indent 571 :group 'verilog-mode-indent
573 :type 'boolean) 572 :type 'boolean)
@@ -630,38 +629,42 @@ always be saved."
630 629
631(defvar verilog-error-regexp-add-didit nil) 630(defvar verilog-error-regexp-add-didit nil)
632(defvar verilog-error-regexp nil) 631(defvar verilog-error-regexp nil)
633(setq verilog-error-regexp-add-didit nil 632;;; Compile support
634 verilog-error-regexp 633(require 'compile)
635 '( 634(make-variable-buffer-local 'compilation-error-regexp-systems-list)
636 ; SureLint 635(defvar compilation-error-regexp-alist) ; in case not
637;; ("[^\n]*\\[\\([^:]+\\):\\([0-9]+\\)\\]" 1 2) 636(make-variable-buffer-local 'compilation-error-regexp-alist)
638 ; Most SureFire tools 637
639 ("\\(WARNING\\|ERROR\\|INFO\\)[^:]*: \\([^,]+\\), \\(line \\|\\)\\([0-9]+\\):" 2 4 ) 638; List of regexps for Verilog compilers, like verilint. See compilation-error-regexp-alist
640 ("\ 639; for the formatting.
640(defvar verilog-error-regexp-alist
641 '(verilog
642; SureLint
643 ("[^\n]*\\[\\([^:]+\\):\\([0-9]+\\)\\]" 1 2)
644 ("\\(WARNING\\|ERROR\\|INFO\\)[^:]*: \\([^,]+\\), \\(line \\|\\)\\([0-9]+\\):" 2 4 )
645 ("\
641\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\ 646\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\
642:\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5) 647:\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5)
643 ; xsim 648; xsim
644 ; Error! in file /homes/mac/Axis/Xsim/test.v at line 13 [OBJ_NOT_DECLARED] 649; Error! in file /homes/mac/Axis/Xsim/test.v at line 13 [OBJ_NOT_DECLARED]
645 ("\\(Error\\|Warning\\).*in file (\\([^ \t]+\\) at line *\\([0-9]+\\))" 2 3) 650 ("\\(Error\\|Warning\\).*in file (\\([^ \t]+\\) at line *\\([0-9]+\\))" 2 3)
646 ; vcs 651; vcs
647 ("\\(Error\\|Warning\\):[^(]*(\\([^ \t]+\\) line *\\([0-9]+\\))" 2 3) 652 ("\\(Error\\|Warning\\):[^(]*(\\([^ \t]+\\) line *\\([0-9]+\\))" 2 3)
648 ("Warning:.*(port.*(\\([^ \t]+\\) line \\([0-9]+\\))" 1 2) 653 ("Warning:.*(port.*(\\([^ \t]+\\) line \\([0-9]+\\))" 1 2)
649 ("\\(Error\\|Warning\\):[\n.]*\\([^ \t]+\\) *\\([0-9]+\\):" 2 3) 654 ("\\(Error\\|Warning\\):[\n.]*\\([^ \t]+\\) *\\([0-9]+\\):" 2 3)
650 ("syntax error:.*\n\\([^ \t]+\\) *\\([0-9]+\\):" 1 2) 655 ("syntax error:.*\n\\([^ \t]+\\) *\\([0-9]+\\):" 1 2)
651 ; Verilator 656; Verilator
652 ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4) 657 ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4)
653 ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4) 658 ("%?\\(Error\\|Warning\\)\\(-[^:]+\\|\\):[\n ]*\\([^ \t:]+\\):\\([0-9]+\\):" 3 4)
654 ; vxl 659; verilog-xl
655 ("\\(Error\\|Warning\\)!.*\n?.*\"\\([^\"]+\\)\", \\([0-9]+\\)" 2 3) 660 ("\\(Error\\|Warning\\)!.*\n?.*\"\\([^\"]+\\)\", \\([0-9]+\\)" 2 3)
656 ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+\\([0-9]+\\):.*$" 1 2) ; vxl 661 ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+\\([0-9]+\\):.*$" 1 2) ; vxl
657 ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+line[ \t]+\\([0-9]+\\):.*$" 1 2) 662 ("([WE][0-9A-Z]+)[ \t]+\\([^ \t\n,]+\\)[, \t]+line[ \t]+\\([0-9]+\\):.*$" 1 2)
658 ; nc-verilog 663; nc-verilog
659 (".*\\*[WE],[0-9A-Z]+ (\\([^ \t,]+\\),\\([0-9]+\\)|" 1 2) 664 (".*\\*[WE],[0-9A-Z]+ (\\([^ \t,]+\\),\\([0-9]+\\)|" 1 2)
660 ; Leda 665; Leda
661 ("In file \\([^ \t]+\\)[ \t]+line[ \t]+\\([0-9]+\\):\n[^\n]*\n[^\n]*\n\\[\\(Warning\\|Error\\|Failure\\)\\][^\n]*" 1 2) 666 ("In file \\([^ \t]+\\)[ \t]+line[ \t]+\\([0-9]+\\):\n[^\n]*\n[^\n]*\n\\[\\(Warning\\|Error\\|Failure\\)\\][^\n]*" 1 2)
662 ) 667 ))
663; "*List of regexps for Verilog compilers, like verilint. See compilation-error-regexp-alist for the formatting."
664)
665 668
666(defvar verilog-error-font-lock-keywords 669(defvar verilog-error-font-lock-keywords
667 '( 670 '(
@@ -834,6 +837,16 @@ the MSB or LSB of a signal inside an AUTORESET."
834 :type 'string) 837 :type 'string)
835(put 'verilog-assignment-delay 'safe-local-variable 'stringp) 838(put 'verilog-assignment-delay 'safe-local-variable 'stringp)
836 839
840(defcustom verilog-auto-arg-sort nil
841 "*If set, AUTOARG will sort signal names, rather than leave them in
842declaration order. Declaration order is advantageous with order based
843instantiations and is the default for backward compatibility. Sorted order
844reduces changes when declarations are moved around in a file, and it's bad
845practice to rely on order based instantiations anyhow."
846 :group 'verilog-mode-auto
847 :type 'boolean)
848(put 'verilog-auto-arg-sort 'safe-local-variable 'verilog-booleanp)
849
837(defcustom verilog-auto-inst-param-value nil 850(defcustom verilog-auto-inst-param-value nil
838 "*If set, AUTOINST will replace parameters with the parameter value. 851 "*If set, AUTOINST will replace parameters with the parameter value.
839If nil, leave parameters as symbolic names. 852If nil, leave parameters as symbolic names.
@@ -1153,6 +1166,8 @@ If set will become buffer local.")
1153 :help "Help on AUTOINOUTCOMP - copying complemented i/o from another file"] 1166 :help "Help on AUTOINOUTCOMP - copying complemented i/o from another file"]
1154 ["AUTOINOUTMODULE" (describe-function 'verilog-auto-inout-module) 1167 ["AUTOINOUTMODULE" (describe-function 'verilog-auto-inout-module)
1155 :help "Help on AUTOINOUTMODULE - copying i/o from another file"] 1168 :help "Help on AUTOINOUTMODULE - copying i/o from another file"]
1169 ["AUTOINSERTLISP" (describe-function 'verilog-auto-insert-lisp)
1170 :help "Help on AUTOINSERTLISP - insert text from a lisp function"]
1156 ["AUTOINOUT" (describe-function 'verilog-auto-inout) 1171 ["AUTOINOUT" (describe-function 'verilog-auto-inout)
1157 :help "Help on AUTOINOUT - adding inouts from cells"] 1172 :help "Help on AUTOINOUT - adding inouts from cells"]
1158 ["AUTOINPUT" (describe-function 'verilog-auto-input) 1173 ["AUTOINPUT" (describe-function 'verilog-auto-input)
@@ -1408,26 +1423,47 @@ without the directory portion, will be substituted."
1408 "\\b__FILE__\\b" (file-name-nondirectory (buffer-file-name)) 1423 "\\b__FILE__\\b" (file-name-nondirectory (buffer-file-name))
1409 t t compile-command)))) 1424 t t compile-command))))
1410 1425
1411;; Following code only gets called from compilation-mode-hook. 1426;; Following code only gets called from compilation-mode-hook on XEmacs to add error handling.
1412(defvar compilation-error-regexp-alist) 1427;; There is no way to add this on the fly to Emacs; instead we must update compile.el
1413 1428(if (featurep 'xemacs)
1414(defun verilog-error-regexp-add () 1429 (defun verilog-error-regexp-add-xemacs ()
1415 "Add the messages to the `compilation-error-regexp-alist'. 1430 "Teach XEmacs about verilog errors.
1416Called by `compilation-mode-hook'. This allows \\[next-error] to 1431Called by `compilation-mode-hook'. This allows \\[next-error] to
1417find the errors." 1432find the errors."
1418 (if (not verilog-error-regexp-add-didit) 1433 (interactive)
1419 (progn 1434 (if 't ; (not verilog-error-regexp-add-didit)
1420 (setq verilog-error-regexp-add-didit t) 1435 (progn
1421 (setq-default compilation-error-regexp-alist 1436 (if (or (equal compilation-error-regexp-systems-list 'all)
1422 (append verilog-error-regexp 1437 (not (member 'verilog compilation-error-regexp-systems-list)))
1423 (default-value 'compilation-error-regexp-alist))) 1438 (setq compilation-error-regexp-systems-list
1424 ;; Could be buffer local at this point; maybe also in let; change all three 1439 (if (listp compilation-error-regexp-systems-list)
1425 (setq compilation-error-regexp-alist 1440 (nconc compilation-error-regexp-systems-list 'verilog)
1426 (default-value 'compilation-error-regexp-alist)) 1441 'verilog)))
1427 (set (make-local-variable 'compilation-error-regexp-alist) 1442 (if (not (assoc 'verilog compilation-error-regexp-alist-alist))
1428 (default-value 'compilation-error-regexp-alist))))) 1443 (setcdr compilation-error-regexp-alist-alist
1429 1444 (cons verilog-error-regexp-alist
1430(add-hook 'compilation-mode-hook 'verilog-error-regexp-add) 1445 (cdr compilation-error-regexp-alist-alist))))
1446 ;; Need to re-run compilation-error-regexp builder
1447 (compilation-build-compilation-error-regexp-alist))))
1448 )
1449(defun verilog-error-regexp-add-emacs ()
1450 "Tell Emacs compile that we are Verilog.
1451Called by `compilation-mode-hook'. This allows \\[next-error] to
1452find the errors."
1453 (interactive)
1454;; Turned off because there seems no way to do this outside of compile.el
1455;;
1456;; (if (or (equal compilation-error-regexp-alist 'all)
1457;; (not (member 'verilog compilation-error-regexp-alist)))
1458;; (setq compilation-error-regexp-alist
1459;; (if (listp compilation-error-regexp-alist)
1460;; (append '(verilog) compilation-error-regexp-alist)
1461;; '(verilog) )))
1462 )
1463
1464(if (featurep 'xemacs)
1465 (add-hook 'compilation-mode-hook 'verilog-error-regexp-add-xemacs)
1466 (add-hook 'compilation-mode-hook 'verilog-error-regexp-add-emacs))
1431 1467
1432(defconst verilog-directive-re 1468(defconst verilog-directive-re
1433 ;; "`case" "`default" "`define" "`define" "`else" "`endfor" "`endif" 1469 ;; "`case" "`default" "`define" "`define" "`else" "`endfor" "`endif"
@@ -1436,6 +1472,9 @@ find the errors."
1436 ;; "`time_scale" "`undef" "`while" 1472 ;; "`time_scale" "`undef" "`while"
1437 "\\<`\\(case\\|def\\(ault\\|ine\\(\\)?\\)\\|e\\(lse\\|nd\\(for\\|if\\|protect\\|switch\\|while\\)\\)\\|for\\(mat\\)?\\|i\\(f\\(def\\|ndef\\)?\\|nclude\\)\\|let\\|protect\\|switch\\|time\\(_scale\\|scale\\)\\|undef\\|while\\)\\>") 1473 "\\<`\\(case\\|def\\(ault\\|ine\\(\\)?\\)\\|e\\(lse\\|nd\\(for\\|if\\|protect\\|switch\\|while\\)\\)\\|for\\(mat\\)?\\|i\\(f\\(def\\|ndef\\)?\\|nclude\\)\\|let\\|protect\\|switch\\|time\\(_scale\\|scale\\)\\|undef\\|while\\)\\>")
1438 1474
1475(defconst verilog-directive-re-1
1476 (concat "[ \t]*" verilog-directive-re))
1477
1439(defconst verilog-directive-begin 1478(defconst verilog-directive-begin
1440 "\\<`\\(for\\|i\\(f\\|fdef\\|fndef\\)\\|switch\\|while\\)\\>") 1479 "\\<`\\(for\\|i\\(f\\|fdef\\|fndef\\)\\|switch\\|while\\)\\>")
1441 1480
@@ -1445,14 +1484,138 @@ find the errors."
1445(defconst verilog-directive-end 1484(defconst verilog-directive-end
1446 "`\\(endfor\\|endif\\|endswitch\\|endwhile\\)\\>") 1485 "`\\(endfor\\|endif\\|endswitch\\|endwhile\\)\\>")
1447 1486
1448(defconst verilog-directive-re-1 1487(defconst verilog-ovm-begin-re
1449 (concat "[ \t]*" verilog-directive-re)) 1488 (eval-when-compile
1489 (verilog-regexp-opt
1490 '(
1491 "`ovm_component_utils_begin"
1492 "`ovm_field_utils_begin"
1493 "`ovm_object_utils_begin"
1494 "`ovm_sequence_utils_begin"
1495 "`ovm_sequencer_utils_begin"
1496 ) nil )))
1497
1498(defconst verilog-ovm-end-re
1499 (eval-when-compile
1500 (verilog-regexp-opt
1501 '(
1502 "`ovm_component_utils_end"
1503 "`ovm_field_utils_end"
1504 "`ovm_object_utils_end"
1505 "`ovm_sequence_utils_end"
1506 "`ovm_sequencer_utils_end"
1507 ) nil )))
1508
1509(defconst verilog-ovm-statement-re
1510 (eval-when-compile
1511 (verilog-regexp-opt
1512 '(
1513 ;; Statements
1514 "`DUT_ERROR"
1515 "`MESSAGE"
1516 "`dut_error"
1517 "`message"
1518 "`ovm_analysis_imp_decl"
1519 "`ovm_blocking_get_imp_decl"
1520 "`ovm_blocking_get_peek_imp_decl"
1521 "`ovm_blocking_master_imp_decl"
1522 "`ovm_blocking_peek_imp_decl"
1523 "`ovm_blocking_put_imp_decl"
1524 "`ovm_blocking_slave_imp_decl"
1525 "`ovm_blocking_transport_imp_decl"
1526 "`ovm_component_registry"
1527 "`ovm_component_registry_param"
1528 "`ovm_component_utils"
1529 "`ovm_create"
1530 "`ovm_create_seq"
1531 "`ovm_declare_sequence_lib"
1532 "`ovm_do"
1533 "`ovm_do_seq"
1534 "`ovm_do_seq_with"
1535 "`ovm_do_with"
1536 "`ovm_error"
1537 "`ovm_fatal"
1538 "`ovm_field_aa_int_byte"
1539 "`ovm_field_aa_int_byte_unsigned"
1540 "`ovm_field_aa_int_int"
1541 "`ovm_field_aa_int_int_unsigned"
1542 "`ovm_field_aa_int_integer"
1543 "`ovm_field_aa_int_integer_unsigned"
1544 "`ovm_field_aa_int_key"
1545 "`ovm_field_aa_int_longint"
1546 "`ovm_field_aa_int_longint_unsigned"
1547 "`ovm_field_aa_int_shortint"
1548 "`ovm_field_aa_int_shortint_unsigned"
1549 "`ovm_field_aa_int_string"
1550 "`ovm_field_aa_object_int"
1551 "`ovm_field_aa_object_string"
1552 "`ovm_field_aa_string_int"
1553 "`ovm_field_aa_string_string"
1554 "`ovm_field_array_int"
1555 "`ovm_field_array_object"
1556 "`ovm_field_array_string"
1557 "`ovm_field_enum"
1558 "`ovm_field_event"
1559 "`ovm_field_int"
1560 "`ovm_field_object"
1561 "`ovm_field_queue_int"
1562 "`ovm_field_queue_object"
1563 "`ovm_field_queue_string"
1564 "`ovm_field_sarray_int"
1565 "`ovm_field_string"
1566 "`ovm_field_utils"
1567 "`ovm_file"
1568 "`ovm_get_imp_decl"
1569 "`ovm_get_peek_imp_decl"
1570 "`ovm_info"
1571 "`ovm_info1"
1572 "`ovm_info2"
1573 "`ovm_info3"
1574 "`ovm_info4"
1575 "`ovm_line"
1576 "`ovm_master_imp_decl"
1577 "`ovm_msg_detail"
1578 "`ovm_non_blocking_transport_imp_decl"
1579 "`ovm_nonblocking_get_imp_decl"
1580 "`ovm_nonblocking_get_peek_imp_decl"
1581 "`ovm_nonblocking_master_imp_decl"
1582 "`ovm_nonblocking_peek_imp_decl"
1583 "`ovm_nonblocking_put_imp_decl"
1584 "`ovm_nonblocking_slave_imp_decl"
1585 "`ovm_object_registry"
1586 "`ovm_object_registry_param"
1587 "`ovm_object_utils"
1588 "`ovm_peek_imp_decl"
1589 "`ovm_phase_func_decl"
1590 "`ovm_phase_task_decl"
1591 "`ovm_print_aa_int_object"
1592 "`ovm_print_aa_string_int"
1593 "`ovm_print_aa_string_object"
1594 "`ovm_print_aa_string_string"
1595 "`ovm_print_array_int"
1596 "`ovm_print_array_object"
1597 "`ovm_print_array_string"
1598 "`ovm_print_object_queue"
1599 "`ovm_print_queue_int"
1600 "`ovm_print_string_queue"
1601 "`ovm_put_imp_decl"
1602 "`ovm_rand_send"
1603 "`ovm_rand_send_with"
1604 "`ovm_send"
1605 "`ovm_sequence_utils"
1606 "`ovm_slave_imp_decl"
1607 "`ovm_transport_imp_decl"
1608 "`ovm_update_sequence_lib"
1609 "`ovm_update_sequence_lib_and_item"
1610 "`ovm_warning"
1611 "`static_dut_error"
1612 "`static_message") nil )))
1613
1450 1614
1451;; 1615;;
1452;; Regular expressions used to calculate indent, etc. 1616;; Regular expressions used to calculate indent, etc.
1453;; 1617;;
1454(defconst verilog-symbol-re "\\<[a-zA-Z_][a-zA-Z_0-9.]*\\>") 1618(defconst verilog-symbol-re "\\<[a-zA-Z_][a-zA-Z_0-9.]*\\>")
1455(defconst verilog-case-re "\\(\\<case[xz]?\\>\\|\\<randcase\\>\\)")
1456;; Want to match 1619;; Want to match
1457;; aa : 1620;; aa :
1458;; aa,bb : 1621;; aa,bb :
@@ -1477,7 +1640,14 @@ find the errors."
1477 "\\(\\<endgenerate\\>\\)\\|" ; 9 1640 "\\(\\<endgenerate\\>\\)\\|" ; 9
1478 "\\(\\<join\\(_any\\|_none\\)?\\>\\)\\|" ; 10 1641 "\\(\\<join\\(_any\\|_none\\)?\\>\\)\\|" ; 10
1479 "\\(\\<endclass\\>\\)\\|" ; 11 1642 "\\(\\<endclass\\>\\)\\|" ; 11
1480 "\\(\\<endgroup\\>\\)" ; 12 1643 "\\(\\<endgroup\\>\\)\\|" ; 12
1644 ;; OVM
1645 "\\(\\<`ovm_component_utils_end\\>\\)\\|"
1646 "\\(\\<`ovm_field_utils_end\\>\\)\\|"
1647 "\\(\\<`ovm_object_utils_end\\>\\)\\|"
1648 "\\(\\<`ovm_sequence_utils_end\\>\\)\\|"
1649 "\\(\\<`ovm_sequencer_utils_end\\>\\)"
1650
1481 )) 1651 ))
1482 1652
1483(defconst verilog-auto-end-comment-lines-re 1653(defconst verilog-auto-end-comment-lines-re
@@ -1553,28 +1723,35 @@ find the errors."
1553 "endprogram" 1723 "endprogram"
1554 "endsequence" 1724 "endsequence"
1555 "endclocking" 1725 "endclocking"
1726 ;; OVM
1727 "`ovm_component_utils_end"
1728 "`ovm_field_utils_end"
1729 "`ovm_object_utils_end"
1730 "`ovm_sequence_utils_end"
1731 "`ovm_sequencer_utils_end"
1732
1556 )))) 1733 ))))
1557 1734
1558 1735
1559(defconst verilog-endcomment-reason-re 1736(defconst verilog-endcomment-reason-re
1560 ;; Parenthesis indicate type of keyword found 1737 ;; Parenthesis indicate type of keyword found
1561 (concat 1738 (concat
1562 "\\(\\<fork\\>\\)\\|" 1739 "\\(\\<begin\\>\\)\\|" ; 1
1563 "\\(\\<begin\\>\\)\\|" 1740 "\\(\\<else\\>\\)\\|" ; 2
1741 "\\(\\<end\\>\\s-+\\<else\\>\\)\\|" ; 3
1742 "\\(\\<always_comb\\>\\(\[ \t\]*@\\)?\\)\\|" ; 4
1743 "\\(\\<always_ff\\>\\(\[ \t\]*@\\)?\\)\\|" ; 5
1744 "\\(\\<always_latch\\>\\(\[ \t\]*@\\)?\\)\\|" ; 6
1745 "\\(\\<fork\\>\\)\\|" ; 7
1746 "\\(\\<always\\>\\(\[ \t\]*@\\)?\\)\\|"
1564 "\\(\\<if\\>\\)\\|" 1747 "\\(\\<if\\>\\)\\|"
1565 "\\(\\<clocking\\>\\)\\|" 1748 "\\(\\<clocking\\>\\)\\|"
1566 "\\(\\<else\\>\\)\\|" 1749 "\\(\\<task\\>\\)\\|"
1567 "\\(\\<end\\>.*\\<else\\>\\)\\|" 1750 "\\(\\<function\\>\\)\\|"
1568 "\\(\\<task\\>\\)\\|"
1569 "\\(\\<function\\>\\)\\|"
1570 "\\(\\<initial\\>\\)\\|" 1751 "\\(\\<initial\\>\\)\\|"
1571 "\\(\\<interface\\>\\)\\|" 1752 "\\(\\<interface\\>\\)\\|"
1572 "\\(\\<package\\>\\)\\|" 1753 "\\(\\<package\\>\\)\\|"
1573 "\\(\\<final\\>\\)\\|" 1754 "\\(\\<final\\>\\)\\|"
1574 "\\(\\<always\\>\\(\[ \t\]*@\\)?\\)\\|"
1575 "\\(\\<always_comb\\>\\(\[ \t\]*@\\)?\\)\\|"
1576 "\\(\\<always_ff\\>\\(\[ \t\]*@\\)?\\)\\|"
1577 "\\(\\<always_latch\\>\\(\[ \t\]*@\\)?\\)\\|"
1578 "\\(@\\)\\|" 1755 "\\(@\\)\\|"
1579 "\\(\\<while\\>\\)\\|" 1756 "\\(\\<while\\>\\)\\|"
1580 "\\(\\<for\\(ever\\|each\\)?\\>\\)\\|" 1757 "\\(\\<for\\(ever\\|each\\)?\\>\\)\\|"
@@ -1599,11 +1776,17 @@ find the errors."
1599 "specify" 1776 "specify"
1600 "table" 1777 "table"
1601 "task" 1778 "task"
1779 ;;; OVM
1780 "`ovm_component_utils_begin"
1781 "`ovm_field_utils_begin"
1782 "`ovm_object_utils_begin"
1783 "`ovm_sequence_utils_begin"
1784 "`ovm_sequencer_utils_begin"
1785
1602 )))) 1786 ))))
1603;; These are the same words, in a specific order in the regular 1787;; These are the same words, in a specific order in the regular
1604;; expression so that matching will work nicely for 1788;; expression so that matching will work nicely for
1605;; verilog-forward-sexp and verilog-calc-indent 1789;; verilog-forward-sexp and verilog-calc-indent
1606
1607(defconst verilog-beg-block-re-ordered 1790(defconst verilog-beg-block-re-ordered
1608 ( concat "\\(\\<begin\\>\\)" ;1 1791 ( concat "\\(\\<begin\\>\\)" ;1
1609 "\\|\\(\\<randcase\\>\\|\\(\\<unique\\s-+\\|priority\\s-+\\)?case[xz]?\\>\\)" ; 2,3 1792 "\\|\\(\\<randcase\\>\\|\\(\\<unique\\s-+\\|priority\\s-+\\)?case[xz]?\\>\\)" ; 2,3
@@ -1612,13 +1795,17 @@ find the errors."
1612 "\\|\\(\\<table\\>\\)" ;7 1795 "\\|\\(\\<table\\>\\)" ;7
1613 "\\|\\(\\<specify\\>\\)" ;8 1796 "\\|\\(\\<specify\\>\\)" ;8
1614 "\\|\\(\\<function\\>\\)" ;9 1797 "\\|\\(\\<function\\>\\)" ;9
1615 "\\|\\(\\<task\\>\\)" ;10 1798 "\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)*\\<function\\>\\)" ;10
1616 "\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)*\\<task\\>\\)" ;11 1799 "\\|\\(\\<task\\>\\)" ;14
1617 "\\|\\(\\<generate\\>\\)" ;15 1800 "\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)*\\<task\\>\\)" ;15
1618 "\\|\\(\\<covergroup\\>\\)" ;16 1801 "\\|\\(\\<generate\\>\\)" ;18
1619 "\\|\\(\\(\\(\\<cover\\>\\s-+\\)\\|\\(\\<assert\\>\\s-+\\)\\)*\\<property\\>\\)" ;17 1802 "\\|\\(\\<covergroup\\>\\)" ;16 20
1620 "\\|\\(\\<\\(rand\\)?sequence\\>\\)" ;21 1803 "\\|\\(\\(\\(\\<cover\\>\\s-+\\)\\|\\(\\<assert\\>\\s-+\\)\\)*\\<property\\>\\)" ;17 21
1621 "\\|\\(\\<clocking\\>\\)" ;22 1804 "\\|\\(\\<\\(rand\\)?sequence\\>\\)" ;21 25
1805 "\\|\\(\\<clocking\\>\\)" ;22 27
1806 "\\|\\(\\<`ovm_[a-z_]+_begin\\>\\)" ;28
1807 ;;
1808
1622 )) 1809 ))
1623 1810
1624(defconst verilog-end-block-ordered-rry 1811(defconst verilog-end-block-ordered-rry
@@ -1731,7 +1918,7 @@ find the errors."
1731(defconst verilog-behavioral-block-beg-re 1918(defconst verilog-behavioral-block-beg-re
1732 (eval-when-compile (verilog-regexp-words `("initial" "final" "always" "always_comb" "always_latch" "always_ff" 1919 (eval-when-compile (verilog-regexp-words `("initial" "final" "always" "always_comb" "always_latch" "always_ff"
1733 "function" "task")))) 1920 "function" "task"))))
1734 1921(defconst verilog-coverpoint-re "\\w+\\s*:\\s*\\(coverpoint\\|cross\\constraint\\)" )
1735(defconst verilog-indent-re 1922(defconst verilog-indent-re
1736 (eval-when-compile 1923 (eval-when-compile
1737 (verilog-regexp-words 1924 (verilog-regexp-words
@@ -1774,21 +1961,40 @@ find the errors."
1774 "`switch" "`endswitch" 1961 "`switch" "`endswitch"
1775 "`timescale" 1962 "`timescale"
1776 "`time_scale" 1963 "`time_scale"
1964 ;; OVM Begin tokens
1965 "`ovm_component_utils_begin"
1966 "`ovm_field_utils_begin"
1967 "`ovm_object_utils_begin"
1968 "`ovm_sequence_utils_begin"
1969 "`ovm_sequencer_utils_begin"
1970 ;; OVM End tokens
1971 "`ovm_component_utils_end"
1972 "`ovm_field_utils_end"
1973 "`ovm_object_utils_end"
1974 "`ovm_sequence_utils_end"
1975 "`ovm_sequencer_utils_end"
1777 )))) 1976 ))))
1778 1977
1978(defconst verilog-defun-level-not-generate-re
1979 (eval-when-compile
1980 (verilog-regexp-words
1981 `( "module" "macromodule" "primitive" "class" "program"
1982 "interface" "package" "config"))))
1983
1779(defconst verilog-defun-level-re 1984(defconst verilog-defun-level-re
1780 (eval-when-compile 1985 (eval-when-compile
1781 (verilog-regexp-words 1986 (verilog-regexp-words
1782 `( 1987 (append
1783 "module" "macromodule" "primitive" "class" "program" "initial" "final" "always" "always_comb" 1988 `( "module" "macromodule" "primitive" "class" "program"
1784 "always_ff" "always_latch" "endtask" "endfunction" "interface" "package" 1989 "interface" "package" "config")
1785 "config")))) 1990 `( "initial" "final" "always" "always_comb" "always_ff"
1991 "always_latch" "endtask" "endfunction" )))))
1786 1992
1787(defconst verilog-defun-level-not-generate-re 1993(defconst verilog-defun-level-generate-only-re
1788 (eval-when-compile 1994 (eval-when-compile
1789 (verilog-regexp-words 1995 (verilog-regexp-words
1790 `( 1996 `( "initial" "final" "always" "always_comb" "always_ff"
1791 "module" "macromodule" "primitive" "class" "program" "interface" "package" "config")))) 1997 "always_latch" "endtask" "endfunction" ))))
1792 1998
1793(defconst verilog-cpp-level-re 1999(defconst verilog-cpp-level-re
1794 (eval-when-compile 2000 (eval-when-compile
@@ -1801,6 +2007,7 @@ find the errors."
1801(defconst verilog-extended-complete-re 2007(defconst verilog-extended-complete-re
1802 (concat "\\(\\<extern\\s-+\\|\\<virtual\\s-+\\|\\<protected\\s-+\\)*\\(\\<function\\>\\|\\<task\\>\\)" 2008 (concat "\\(\\<extern\\s-+\\|\\<virtual\\s-+\\|\\<protected\\s-+\\)*\\(\\<function\\>\\|\\<task\\>\\)"
1803 "\\|\\(\\<typedef\\>\\s-+\\)*\\(\\<struct\\>\\|\\<union\\>\\|\\<class\\>\\)" 2009 "\\|\\(\\<typedef\\>\\s-+\\)*\\(\\<struct\\>\\|\\<union\\>\\|\\<class\\>\\)"
2010 "\\|\\(\\<import\\>\\s-+\\)?\"DPI-C\"\\s-+\\(function\\>\\|task\\>\\)"
1804 "\\|" verilog-extended-case-re )) 2011 "\\|" verilog-extended-case-re ))
1805(defconst verilog-basic-complete-re 2012(defconst verilog-basic-complete-re
1806 (eval-when-compile 2013 (eval-when-compile
@@ -1808,7 +2015,7 @@ find the errors."
1808 `( 2015 `(
1809 "always" "assign" "always_latch" "always_ff" "always_comb" "constraint" 2016 "always" "assign" "always_latch" "always_ff" "always_comb" "constraint"
1810 "import" "initial" "final" "module" "macromodule" "repeat" "randcase" "while" 2017 "import" "initial" "final" "module" "macromodule" "repeat" "randcase" "while"
1811 "if" "for" "forever" "foreach" "else" "parameter" "do" 2018 "if" "for" "forever" "foreach" "else" "parameter" "do" "localparam"
1812 )))) 2019 ))))
1813(defconst verilog-complete-reg 2020(defconst verilog-complete-reg
1814 (concat 2021 (concat
@@ -1821,7 +2028,7 @@ find the errors."
1821 verilog-end-block-re "\\)")) 2028 verilog-end-block-re "\\)"))
1822 2029
1823(defconst verilog-endcase-re 2030(defconst verilog-endcase-re
1824 (concat verilog-case-re "\\|" 2031 (concat verilog-extended-case-re "\\|"
1825 "\\(endcase\\)\\|" 2032 "\\(endcase\\)\\|"
1826 verilog-defun-re 2033 verilog-defun-re
1827 )) 2034 ))
@@ -2260,7 +2467,7 @@ Use filename, if current buffer being edited shorten to just buffer name."
2260 ) 2467 )
2261 ((match-end 4) 2468 ((match-end 4)
2262 ;; might be "disable fork" 2469 ;; might be "disable fork"
2263 (if (or 2470 (if (or
2264 (looking-at verilog-disable-fork-re) 2471 (looking-at verilog-disable-fork-re)
2265 (and (looking-at "fork") 2472 (and (looking-at "fork")
2266 (progn 2473 (progn
@@ -2268,7 +2475,7 @@ Use filename, if current buffer being edited shorten to just buffer name."
2268 (looking-at verilog-disable-fork-re)))) 2475 (looking-at verilog-disable-fork-re))))
2269 (progn 2476 (progn
2270 (goto-char (match-end 0)) 2477 (goto-char (match-end 0))
2271 (forward-word) 2478 (forward-word 1)
2272 (setq reg nil)) 2479 (setq reg nil))
2273 (progn 2480 (progn
2274 ;; Search forward for matching join 2481 ;; Search forward for matching join
@@ -2276,7 +2483,7 @@ Use filename, if current buffer being edited shorten to just buffer name."
2276 ((match-end 6) 2483 ((match-end 6)
2277 ;; Search forward for matching endclass 2484 ;; Search forward for matching endclass
2278 (setq reg "\\(\\<class\\>\\)\\|\\(\\<endclass\\>\\)" )) 2485 (setq reg "\\(\\<class\\>\\)\\|\\(\\<endclass\\>\\)" ))
2279 2486
2280 ((match-end 7) 2487 ((match-end 7)
2281 ;; Search forward for matching endtable 2488 ;; Search forward for matching endtable
2282 (setq reg "\\<endtable\\>" ) 2489 (setq reg "\\<endtable\\>" )
@@ -2289,33 +2496,37 @@ Use filename, if current buffer being edited shorten to just buffer name."
2289 (setq reg "\\<endfunction\\>" ) 2496 (setq reg "\\<endfunction\\>" )
2290 (setq nest 'no)) 2497 (setq nest 'no))
2291 ((match-end 10) 2498 ((match-end 10)
2499 ;; Search forward for matching endfunction
2500 (setq reg "\\<endfunction\\>" )
2501 (setq nest 'no))
2502 ((match-end 14)
2292 ;; Search forward for matching endtask 2503 ;; Search forward for matching endtask
2293 (setq reg "\\<endtask\\>" ) 2504 (setq reg "\\<endtask\\>" )
2294 (setq nest 'no)) 2505 (setq nest 'no))
2295 ((match-end 11) 2506 ((match-end 15)
2296 ;; Search forward for matching endtask 2507 ;; Search forward for matching endtask
2297 (setq reg "\\<endtask\\>" ) 2508 (setq reg "\\<endtask\\>" )
2298 (setq nest 'no)) 2509 (setq nest 'no))
2299 ((match-end 15) 2510 ((match-end 19)
2300 ;; Search forward for matching endgenerate 2511 ;; Search forward for matching endgenerate
2301 (setq reg "\\(\\<generate\\>\\)\\|\\(\\<endgenerate\\>\\)" )) 2512 (setq reg "\\(\\<generate\\>\\)\\|\\(\\<endgenerate\\>\\)" ))
2302 ((match-end 16) 2513 ((match-end 20)
2303 ;; Search forward for matching endgroup 2514 ;; Search forward for matching endgroup
2304 (setq reg "\\(\\<covergroup\\>\\)\\|\\(\\<endgroup\\>\\)" )) 2515 (setq reg "\\(\\<covergroup\\>\\)\\|\\(\\<endgroup\\>\\)" ))
2305 ((match-end 17) 2516 ((match-end 21)
2306 ;; Search forward for matching endproperty 2517 ;; Search forward for matching endproperty
2307 (setq reg "\\(\\<property\\>\\)\\|\\(\\<endproperty\\>\\)" )) 2518 (setq reg "\\(\\<property\\>\\)\\|\\(\\<endproperty\\>\\)" ))
2308 ((match-end 18) 2519 ((match-end 25)
2309 ;; Search forward for matching endsequence 2520 ;; Search forward for matching endsequence
2310 (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\<endsequence\\>\\)" ) 2521 (setq reg "\\(\\<\\(rand\\)?sequence\\>\\)\\|\\(\\<endsequence\\>\\)" )
2311 (setq md 3)) ; 3 to get to endsequence in the reg above 2522 (setq md 3)) ; 3 to get to endsequence in the reg above
2312 ((match-end 19) 2523 ((match-end 27)
2313 ;; Search forward for matching endclocking 2524 ;; Search forward for matching endclocking
2314 (setq reg "\\(\\<clocking\\>\\)\\|\\(\\<endclocking\\>\\)" ))) 2525 (setq reg "\\(\\<clocking\\>\\)\\|\\(\\<endclocking\\>\\)" )))
2315 (if (and reg 2526 (if (and reg
2316 (forward-word 1)) 2527 (forward-word 1))
2317 (catch 'skip 2528 (catch 'skip
2318 (if (eq nest 'yes) 2529 (if (eq nest 'yes)
2319 (let ((depth 1)) 2530 (let ((depth 1))
2320 (while (verilog-re-search-forward reg nil 'move) 2531 (while (verilog-re-search-forward reg nil 'move)
2321 (cond 2532 (cond
@@ -2327,7 +2538,7 @@ Use filename, if current buffer being edited shorten to just buffer name."
2327 (setq depth (1+ depth)))))) 2538 (setq depth (1+ depth))))))
2328 (if (verilog-re-search-forward reg nil 'move) 2539 (if (verilog-re-search-forward reg nil 'move)
2329 (throw 'skip 1)))))) 2540 (throw 'skip 1))))))
2330 2541
2331 ((looking-at (concat 2542 ((looking-at (concat
2332 "\\(\\<\\(macro\\)?module\\>\\)\\|" 2543 "\\(\\<\\(macro\\)?module\\>\\)\\|"
2333 "\\(\\<primitive\\>\\)\\|" 2544 "\\(\\<primitive\\>\\)\\|"
@@ -2362,33 +2573,6 @@ Use filename, if current buffer being edited shorten to just buffer name."
2362(defun verilog-declaration-beg () 2573(defun verilog-declaration-beg ()
2363 (verilog-re-search-backward verilog-declaration-re (bobp) t)) 2574 (verilog-re-search-backward verilog-declaration-re (bobp) t))
2364 2575
2365(defun verilog-font-lock-init ()
2366 "Initialize fontification."
2367 ;; highlight keywords and standardized types, attributes, enumeration
2368 ;; values, and subprograms
2369 (setq verilog-font-lock-keywords-3
2370 (append verilog-font-lock-keywords-2
2371 (when verilog-highlight-translate-off
2372 (list
2373 ;; Fontify things in translate off regions
2374 '(verilog-match-translate-off
2375 (0 'verilog-font-lock-translate-off-face prepend))))))
2376 ;; FIXME: This XEmacs setting is redundant with the setting done later
2377 ;; for Emacs (because XEmacs obeys Emacs's setting as well).
2378 (put 'verilog-mode 'font-lock-defaults
2379 '((verilog-font-lock-keywords
2380 verilog-font-lock-keywords-1
2381 verilog-font-lock-keywords-2
2382 verilog-font-lock-keywords-3)
2383 nil ; nil means highlight strings & comments as well as keywords
2384 nil ; nil means keywords must match case
2385 nil ; syntax table handled elsewhere
2386 ;; Function to move to beginning of reasonable region to highlight
2387 verilog-beg-of-defun)))
2388
2389;; initialize fontification for Verilog Mode
2390(verilog-font-lock-init)
2391
2392;; 2576;;
2393;; 2577;;
2394;; Mode 2578;; Mode
@@ -2460,7 +2644,7 @@ Variables controlling indentation/edit style:
2460 will be inserted. Setting this variable to zero results in every 2644 will be inserted. Setting this variable to zero results in every
2461 end acquiring a comment; the default avoids too many redundant 2645 end acquiring a comment; the default avoids too many redundant
2462 comments in tight quarters. 2646 comments in tight quarters.
2463 `verilog-auto-lineup' (default `(all)) 2647 `verilog-auto-lineup' (default 'declarations)
2464 List of contexts where auto lineup of code should be done. 2648 List of contexts where auto lineup of code should be done.
2465 2649
2466Variables controlling other actions: 2650Variables controlling other actions:
@@ -2566,13 +2750,13 @@ Key bindings specific to `verilog-mode-map' are:
2566 verilog-font-lock-keywords-2 2750 verilog-font-lock-keywords-2
2567 verilog-font-lock-keywords-3) 2751 verilog-font-lock-keywords-3)
2568 nil nil nil 2752 nil nil nil
2569 ,(if (functionp 'syntax-ppss) 2753 ,(if (functionp 'syntax-ppss)
2570 ;; verilog-beg-of-defun uses syntax-ppss, and syntax-ppss uses 2754 ;; verilog-beg-of-defun uses syntax-ppss, and syntax-ppss uses
2571 ;; font-lock-beginning-of-syntax-function, so 2755 ;; font-lock-beginning-of-syntax-function, so
2572 ;; font-lock-beginning-of-syntax-function, can't use 2756 ;; font-lock-beginning-of-syntax-function, can't use
2573 ;; verilog-beg-of-defun. 2757 ;; verilog-beg-of-defun.
2574 nil 2758 nil
2575 'verilog-beg-of-defun))) 2759 'verilog-beg-of-defun)))
2576 ;;------------------------------------------------------------ 2760 ;;------------------------------------------------------------
2577 ;; now hook in 'verilog-colorize-include-files (eldo-mode.el&spice-mode.el) 2761 ;; now hook in 'verilog-colorize-include-files (eldo-mode.el&spice-mode.el)
2578 ;; all buffer local: 2762 ;; all buffer local:
@@ -2600,8 +2784,6 @@ Key bindings specific to `verilog-mode-map' are:
2600 2784
2601 ;; Stuff for autos 2785 ;; Stuff for autos
2602 (add-hook 'write-contents-hooks 'verilog-auto-save-check) ; already local 2786 (add-hook 'write-contents-hooks 'verilog-auto-save-check) ; already local
2603;; (verilog-auto-reeval-locals t) ; Save locals in case user changes them
2604;; (verilog-getopt-flags)
2605 (run-hooks 'verilog-mode-hook)) 2787 (run-hooks 'verilog-mode-hook))
2606 2788
2607 2789
@@ -2651,9 +2833,9 @@ With optional ARG, remove existing end of line comments."
2651 't))) 2833 't)))
2652 ;; see if we should line up assignments 2834 ;; see if we should line up assignments
2653 (progn 2835 (progn
2654 (if (or (memq 'all verilog-auto-lineup) 2836 (if (or (eq 'all verilog-auto-lineup)
2655 (memq 'assignments verilog-auto-lineup)) 2837 (eq 'assignments verilog-auto-lineup))
2656 (verilog-pretty-expr)) 2838 (verilog-pretty-expr t "\\(<\\|:\\)?=" ))
2657 (newline)) 2839 (newline))
2658 (forward-line 1)) 2840 (forward-line 1))
2659 ;; Indent next line 2841 ;; Indent next line
@@ -2670,7 +2852,7 @@ With optional ARG, remove existing end of line comments."
2670(defun electric-verilog-semi () 2852(defun electric-verilog-semi ()
2671 "Insert `;' character and reindent the line." 2853 "Insert `;' character and reindent the line."
2672 (interactive) 2854 (interactive)
2673 (insert last-command-event) 2855 (verilog-insert-last-command-event)
2674 2856
2675 (if (or (verilog-in-comment-or-string-p) 2857 (if (or (verilog-in-comment-or-string-p)
2676 (verilog-in-escaped-name-p)) 2858 (verilog-in-escaped-name-p))
@@ -2695,7 +2877,7 @@ With optional ARG, remove existing end of line comments."
2695(defun electric-verilog-colon () 2877(defun electric-verilog-colon ()
2696 "Insert `:' and do all indentations except line indent on this line." 2878 "Insert `:' and do all indentations except line indent on this line."
2697 (interactive) 2879 (interactive)
2698 (insert last-command-event) 2880 (verilog-insert-last-command-event)
2699 ;; Do nothing if within string. 2881 ;; Do nothing if within string.
2700 (if (or 2882 (if (or
2701 (verilog-within-string) 2883 (verilog-within-string)
@@ -2714,7 +2896,7 @@ With optional ARG, remove existing end of line comments."
2714;;(defun electric-verilog-equal () 2896;;(defun electric-verilog-equal ()
2715;; "Insert `=', and do indentation if within block." 2897;; "Insert `=', and do indentation if within block."
2716;; (interactive) 2898;; (interactive)
2717;; (insert last-command-event) 2899;; (verilog-insert-last-command-event)
2718;; Could auto line up expressions, but not yet 2900;; Could auto line up expressions, but not yet
2719;; (if (eq (car (verilog-calculate-indent)) 'block) 2901;; (if (eq (car (verilog-calculate-indent)) 'block)
2720;; (let ((verilog-tab-always-indent nil)) 2902;; (let ((verilog-tab-always-indent nil))
@@ -2724,12 +2906,10 @@ With optional ARG, remove existing end of line comments."
2724(defun electric-verilog-tick () 2906(defun electric-verilog-tick ()
2725 "Insert back-tick, and indent to column 0 if this is a CPP directive." 2907 "Insert back-tick, and indent to column 0 if this is a CPP directive."
2726 (interactive) 2908 (interactive)
2727 (insert last-command-event) 2909 (verilog-insert-last-command-event)
2728 (save-excursion 2910 (save-excursion
2729 (if (progn 2911 (if (verilog-in-directive-p)
2730 (beginning-of-line) 2912 (verilog-indent-line))))
2731 (looking-at verilog-directive-re-1))
2732 (verilog-indent-line))))
2733 2913
2734(defun electric-verilog-tab () 2914(defun electric-verilog-tab ()
2735 "Function called when TAB is pressed in Verilog mode." 2915 "Function called when TAB is pressed in Verilog mode."
@@ -2767,7 +2947,7 @@ With optional ARG, remove existing end of line comments."
2767 (skip-chars-backward " \t") 2947 (skip-chars-backward " \t")
2768 (kill-region (point) oldpnt))))))) 2948 (kill-region (point) oldpnt)))))))
2769 (t (progn (insert "\t"))))) 2949 (t (progn (insert "\t")))))
2770 2950
2771 2951
2772 2952
2773;; 2953;;
@@ -3025,6 +3205,7 @@ With ARG, first kill any existing labels."
3025 (not (or 3205 (not (or
3026 (bolp) 3206 (bolp)
3027 (= (preceding-char) ?\;) 3207 (= (preceding-char) ?\;)
3208 (looking-at "\\w+\\W*:\\W*\\(coverpoint\\|cross\\|constraint\\)")
3028 (not (or 3209 (not (or
3029 (looking-at "\\<") 3210 (looking-at "\\<")
3030 (forward-word -1))) 3211 (forward-word -1)))
@@ -3047,55 +3228,85 @@ With ARG, first kill any existing labels."
3047(defun verilog-beg-of-statement-1 () 3228(defun verilog-beg-of-statement-1 ()
3048 "Move backward to beginning of statement." 3229 "Move backward to beginning of statement."
3049 (interactive) 3230 (interactive)
3231 (if (verilog-in-comment-p)
3232 (verilog-backward-syntactic-ws))
3050 (let ((pt (point))) 3233 (let ((pt (point)))
3051 3234 (catch 'done
3052 (while (and (not (looking-at verilog-complete-reg)) 3235 (while (not (looking-at verilog-complete-reg))
3053 (setq pt (point)) 3236 (setq pt (point))
3054 (verilog-backward-token) 3237 (verilog-backward-syntactic-ws)
3055 (not (looking-at verilog-complete-reg)) 3238 (if (or (bolp)
3056 (verilog-backward-syntactic-ws) 3239 (= (preceding-char) ?\;))
3057 (setq pt (point)) 3240 (progn
3058 (not (bolp)) 3241 (goto-char pt)
3059 (not (= (preceding-char) ?\;)))) 3242 (throw 'done t))
3060 (goto-char pt) 3243 (verilog-backward-token))))
3061 (verilog-forward-ws&directives))) 3244 (verilog-forward-syntactic-ws)))
3245;
3246; (while (and
3247; (not (looking-at verilog-complete-reg))
3248; (not (bolp))
3249; (not (= (preceding-char) ?\;)))
3250; (verilog-backward-token)
3251; (verilog-backward-syntactic-ws)
3252; (setq pt (point)))
3253; (goto-char pt)
3254; ;(verilog-forward-syntactic-ws)
3062 3255
3063(defun verilog-end-of-statement () 3256(defun verilog-end-of-statement ()
3064 "Move forward to end of current statement." 3257 "Move forward to end of current statement."
3065 (interactive) 3258 (interactive)
3066 (let ((nest 0) pos) 3259 (let ((nest 0) pos)
3067 (or (looking-at verilog-beg-block-re) 3260 (cond
3068 ;; Skip to end of statement 3261 ((verilog-in-directive-p)
3069 (setq pos (catch 'found 3262 (forward-line 1)
3070 (while t 3263 (backward-char 1))
3071 (forward-sexp 1) 3264
3072 (verilog-skip-forward-comment-or-string) 3265 ((looking-at verilog-beg-block-re)
3073 (cond ((looking-at "[ \t]*;") 3266 (verilog-forward-sexp))
3074 (skip-chars-forward "^;") 3267
3075 (forward-char 1) 3268 ((equal (char-after) ?\})
3076 (throw 'found (point))) 3269 (forward-char))
3077 ((save-excursion 3270
3078 (forward-sexp -1) 3271 ;; Skip to end of statement
3079 (looking-at verilog-beg-block-re)) 3272 ((condition-case nil
3080 (goto-char (match-beginning 0)) 3273 (setq pos
3081 (throw 'found nil)) 3274 (catch 'found
3082 ((looking-at "[ \t]*)") 3275 (while t
3083 (throw 'found (point))) 3276 (forward-sexp 1)
3084 ((eobp) 3277 (verilog-skip-forward-comment-or-string)
3085 (throw 'found (point)))))))) 3278 (if (eolp)
3086 (if (not pos) 3279 (forward-line 1))
3087 ;; Skip a whole block 3280 (cond ((looking-at "[ \t]*;")
3088 (catch 'found 3281 (skip-chars-forward "^;")
3089 (while t 3282 (forward-char 1)
3090 (verilog-re-search-forward verilog-end-statement-re nil 'move) 3283 (throw 'found (point)))
3091 (setq nest (if (match-end 1) 3284 ((save-excursion
3092 (1+ nest) 3285 (forward-sexp -1)
3093 (1- nest))) 3286 (looking-at verilog-beg-block-re))
3094 (cond ((eobp) 3287 (goto-char (match-beginning 0))
3095 (throw 'found (point))) 3288 (throw 'found nil))
3096 ((= 0 nest) 3289 ((looking-at "[ \t]*)")
3097 (throw 'found (verilog-end-of-statement)))))) 3290 (throw 'found (point)))
3098 pos))) 3291 ((eobp)
3292 (throw 'found (point)))
3293 )))
3294
3295 )
3296 (error nil))
3297 (if (not pos)
3298 ;; Skip a whole block
3299 (catch 'found
3300 (while t
3301 (verilog-re-search-forward verilog-end-statement-re nil 'move)
3302 (setq nest (if (match-end 1)
3303 (1+ nest)
3304 (1- nest)))
3305 (cond ((eobp)
3306 (throw 'found (point)))
3307 ((= 0 nest)
3308 (throw 'found (verilog-end-of-statement))))))
3309 pos)))))
3099 3310
3100(defun verilog-in-case-region-p () 3311(defun verilog-in-case-region-p ()
3101 "Return true if in a case region. 3312 "Return true if in a case region.
@@ -3140,17 +3351,20 @@ More specifically, in a list after a struct|union keyword."
3140 "Return true if in a generate region. 3351 "Return true if in a generate region.
3141More specifically, after a generate and before an endgenerate." 3352More specifically, after a generate and before an endgenerate."
3142 (interactive) 3353 (interactive)
3143 (let ((lim (save-excursion (verilog-beg-of-defun) (point))) 3354 (let ((nest 1))
3144 (nest 1))
3145 (save-excursion 3355 (save-excursion
3146 (while (and 3356 (catch 'done
3147 (/= nest 0) 3357 (while (and
3148 (verilog-re-search-backward "\\<\\(generate\\)\\|\\(endgenerate\\)\\>" lim 'move) 3358 (/= nest 0)
3149 (cond 3359 (verilog-re-search-backward
3150 ((match-end 1) ; generate 3360 "\\<\\(module\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\>" nil 'move)
3151 (setq nest (1- nest))) 3361 (cond
3152 ((match-end 2) ; endgenerate 3362 ((match-end 1) ; module - we have crawled out
3153 (setq nest (1+ nest))))))) 3363 (throw 'done 1))
3364 ((match-end 2) ; generate
3365 (setq nest (1- nest)))
3366 ((match-end 3) ; endgenerate
3367 (setq nest (1+ nest))))))))
3154 (= nest 0) )) ; return nest 3368 (= nest 0) )) ; return nest
3155 3369
3156(defun verilog-in-fork-region-p () 3370(defun verilog-in-fork-region-p ()
@@ -3337,18 +3551,11 @@ primitive or interface named NAME."
3337 ((looking-at "\\<randcase\\>") 3551 ((looking-at "\\<randcase\\>")
3338 (setq str "randcase") 3552 (setq str "randcase")
3339 (setq err nil)) 3553 (setq err nil))
3340 ((match-end 0) 3554 ((looking-at "\\(\\(unique\\s-+\\|priority\\s-+\\)?case[xz]?\\)")
3341 (goto-char (match-end 1)) 3555 (goto-char (match-end 0))
3342 (if nil 3556 (setq str (concat (match-string 0) " " (verilog-get-expr)))
3343 (let (s f) 3557 (setq err nil))
3344 (setq s (match-beginning 1)) 3558 ))
3345 (setq f (progn (end-of-line)
3346 (point)))
3347 (setq str (buffer-substring s f)))
3348 (setq err nil))
3349 (setq str (concat (buffer-substring (match-beginning 1) (match-end 1))
3350 " "
3351 (verilog-get-expr))))))
3352 (end-of-line) 3559 (end-of-line)
3353 (if kill-existing-comment 3560 (if kill-existing-comment
3354 (verilog-kill-existing-comment)) 3561 (verilog-kill-existing-comment))
@@ -3405,11 +3612,10 @@ primitive or interface named NAME."
3405 (setq str "")) 3612 (setq str ""))
3406 ((looking-at verilog-endcomment-reason-re) 3613 ((looking-at verilog-endcomment-reason-re)
3407 (setq there (match-end 0)) 3614 (setq there (match-end 0))
3408 (setq cntx (concat 3615 (setq cntx (concat (match-string 0) " "))
3409 (buffer-substring (match-beginning 0) (match-end 0)) " "))
3410 (cond 3616 (cond
3411 (;- begin 3617 (;- begin
3412 (match-end 2) 3618 (match-end 1)
3413 (setq err nil) 3619 (setq err nil)
3414 (save-excursion 3620 (save-excursion
3415 (if (and (verilog-continued-line) 3621 (if (and (verilog-continued-line)
@@ -3418,13 +3624,11 @@ primitive or interface named NAME."
3418 (goto-char (match-end 0)) 3624 (goto-char (match-end 0))
3419 (setq there (point)) 3625 (setq there (point))
3420 (setq str 3626 (setq str
3421 (concat " // " 3627 (concat " // " (match-string 0) " " (verilog-get-expr))))
3422 (buffer-substring (match-beginning 0) (match-end 0)) " "
3423 (verilog-get-expr))))
3424 (setq str "")))) 3628 (setq str ""))))
3425 3629
3426 (;- else 3630 (;- else
3427 (match-end 4) 3631 (match-end 2)
3428 (let ((nest 0) 3632 (let ((nest 0)
3429 ( reg "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|\\(\\<if\\>\\)")) 3633 ( reg "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|\\(\\<if\\>\\)"))
3430 (catch 'skip 3634 (catch 'skip
@@ -3445,7 +3649,7 @@ primitive or interface named NAME."
3445 (throw 'skip 1))))))))) 3649 (throw 'skip 1)))))))))
3446 3650
3447 (;- end else 3651 (;- end else
3448 (match-end 5) 3652 (match-end 3)
3449 (goto-char there) 3653 (goto-char there)
3450 (let ((nest 0) 3654 (let ((nest 0)
3451 (reg "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|\\(\\<if\\>\\)")) 3655 (reg "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|\\(\\<if\\>\\)"))
@@ -3465,6 +3669,12 @@ primitive or interface named NAME."
3465 (setq str (verilog-get-expr)) 3669 (setq str (verilog-get-expr))
3466 (setq str (concat " // else: !if" str )) 3670 (setq str (concat " // else: !if" str ))
3467 (throw 'skip 1))))))))) 3671 (throw 'skip 1)))))))))
3672 (; always_comb, always_ff, always_latch
3673 (or (match-end 4) (match-end 5) (match-end 6))
3674 (goto-char (match-end 0))
3675 (setq there (point))
3676 (setq err nil)
3677 (setq str (concat " // " cntx )))
3468 3678
3469 (;- task/function/initial et cetera 3679 (;- task/function/initial et cetera
3470 t 3680 t
@@ -3472,8 +3682,7 @@ primitive or interface named NAME."
3472 (goto-char (match-end 0)) 3682 (goto-char (match-end 0))
3473 (setq there (point)) 3683 (setq there (point))
3474 (setq err nil) 3684 (setq err nil)
3475 (setq str (verilog-get-expr)) 3685 (setq str (concat " // " cntx (verilog-get-expr))))
3476 (setq str (concat " // " cntx str )))
3477 3686
3478 (;-- otherwise... 3687 (;-- otherwise...
3479 (setq str " // auto-endcomment confused ")))) 3688 (setq str " // auto-endcomment confused "))))
@@ -3782,6 +3991,7 @@ See \\[verilog-surelint-off] and \\[verilog-verilint-off]."
3782 (t (error "Linter name not set"))))) 3991 (t (error "Linter name not set")))))
3783 3992
3784(defvar compilation-last-buffer) 3993(defvar compilation-last-buffer)
3994(defvar next-error-last-buffer)
3785 3995
3786(defun verilog-surelint-off () 3996(defun verilog-surelint-off ()
3787 "Convert a SureLint warning line into a disable statement. 3997 "Convert a SureLint warning line into a disable statement.
@@ -4010,17 +4220,23 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
4010 (throw 'nesting 'comment)) 4220 (throw 'nesting 'comment))
4011 4221
4012 ;; if we have a directive, done. 4222 ;; if we have a directive, done.
4013 (if (save-excursion (beginning-of-line) (looking-at verilog-directive-re-1)) 4223 (if (save-excursion (beginning-of-line)
4224 (and (looking-at verilog-directive-re-1)
4225 (not (looking-at "[ \t]*`ovm_"))))
4014 (throw 'nesting 'directive)) 4226 (throw 'nesting 'directive))
4227 ;; indent structs as if there were module level
4228 (if (verilog-in-struct-p)
4229 (throw 'nesting 'block))
4015 4230
4016 ;; unless we are in the newfangled coverpoint or constraint blocks 4231 ;; unless we are in the newfangled coverpoint or constraint blocks
4017 ;; if we are in a parenthesized list, and the user likes to indent these, return. 4232 ;; if we are in a parenthesized list, and the user likes to indent these, return.
4018 (if (and 4233 (if (and
4019 verilog-indent-lists 4234 verilog-indent-lists
4020 (not (verilog-in-coverage)) 4235 (verilog-in-paren)
4021 (verilog-in-paren)) 4236 (not (verilog-in-coverage-p))
4237 )
4022 (progn (setq par 1) 4238 (progn (setq par 1)
4023 (throw 'nesting 'block))) 4239 (throw 'nesting 'block)))
4024 4240
4025 ;; See if we are continuing a previous line 4241 ;; See if we are continuing a previous line
4026 (while t 4242 (while t
@@ -4143,7 +4359,8 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
4143 (setq type 'cpp)) 4359 (setq type 'cpp))
4144 (if (and 4360 (if (and
4145 verilog-indent-lists 4361 verilog-indent-lists
4146 (not (verilog-in-coverage)) 4362 (not(or (verilog-in-coverage-p)
4363 (verilog-in-struct-p)))
4147 (verilog-in-paren)) 4364 (verilog-in-paren))
4148 (setq depth 1) 4365 (setq depth 1)
4149 (cond 4366 (cond
@@ -4159,38 +4376,44 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
4159 4376
4160(defun verilog-calc-1 () 4377(defun verilog-calc-1 ()
4161 (catch 'nesting 4378 (catch 'nesting
4162 (while (verilog-re-search-backward (concat "\\({\\|}\\|" verilog-indent-re "\\)") nil 'move) 4379 (let ((re (concat "\\({\\|}\\|" verilog-indent-re "\\)")))
4163 (cond 4380 (while (verilog-re-search-backward re nil 'move)
4164 ((equal (char-after) ?\{) 4381 (catch 'continue
4165 (if (verilog-at-constraint-p) 4382 (cond
4166 (throw 'nesting 'block))) 4383 ((equal (char-after) ?\{)
4167 ((equal (char-after) ?\}) 4384 (if (verilog-at-constraint-p)
4385 (throw 'nesting 'block)))
4168 4386
4169 (let ((there (verilog-at-close-constraint-p))) 4387 ((equal (char-after) ?\})
4170 (if there (goto-char there)))) 4388 (let ((there (verilog-at-close-constraint-p)))
4389 (if there ;; we are at the } that closes a constraing. Find the { that opens it
4390 (progn
4391 (forward-char 1)
4392 (backward-list 1)
4393 (verilog-beg-of-statement)))))
4171 4394
4172 ((looking-at verilog-beg-block-re-ordered) 4395 ((looking-at verilog-beg-block-re-ordered)
4173 (cond 4396 (cond
4174 ((match-end 2) ; *sigh* could be "unique case" or "priority casex" 4397 ((match-end 2) ; *sigh* could be "unique case" or "priority casex"
4175 (let ((here (point))) 4398 (let ((here (point)))
4176 (verilog-beg-of-statement) 4399 (verilog-beg-of-statement)
4177 (if (looking-at verilog-extended-case-re) 4400 (if (looking-at verilog-extended-case-re)
4178 (throw 'nesting 'case) 4401 (throw 'nesting 'case)
4179 (goto-char here))) 4402 (goto-char here)))
4180 (throw 'nesting 'case)) 4403 (throw 'nesting 'case))
4181 4404
4182 ((match-end 4) ; *sigh* could be "disable fork" 4405 ((match-end 4) ; *sigh* could be "disable fork"
4183 (let ((here (point))) 4406 (let ((here (point)))
4184 (verilog-beg-of-statement) 4407 (verilog-beg-of-statement)
4185 (if (looking-at verilog-disable-fork-re) 4408 (if (looking-at verilog-disable-fork-re)
4186 t ; is disable fork, this is a normal statement 4409 t ; is disable fork, this is a normal statement
4187 (progn ; or is fork, starts a new block 4410 (progn ; or is fork, starts a new block
4188 (goto-char here) 4411 (goto-char here)
4189 (throw 'nesting 'block))))) 4412 (throw 'nesting 'block)))))
4190 4413
4191 4414
4192 ;; need to consider typedef struct here... 4415 ;; need to consider typedef struct here...
4193 ((looking-at "\\<class\\|struct\\|function\\|task\\>") 4416 ((looking-at "\\<class\\|struct\\|function\\|task\\>")
4194 ; *sigh* These words have an optional prefix: 4417 ; *sigh* These words have an optional prefix:
4195 ; extern {virtual|protected}? function a(); 4418 ; extern {virtual|protected}? function a();
4196 ; typedef class foo; 4419 ; typedef class foo;
@@ -4199,43 +4422,46 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
4199 ; property 4422 ; property
4200 ; ... 4423 ; ...
4201 ; endfunction 4424 ; endfunction
4202 (verilog-beg-of-statement) 4425 (verilog-beg-of-statement)
4203 (if (looking-at verilog-beg-block-re-ordered) 4426 (if (looking-at verilog-beg-block-re-ordered)
4204 (throw 'nesting 'block) 4427 (throw 'nesting 'block)
4205 (throw 'nesting 'defun))) 4428 (throw 'nesting 'defun)))
4206 4429
4207 ((looking-at "\\<property\\>") 4430 ((looking-at "\\<property\\>")
4208 ; *sigh* 4431 ; *sigh*
4209 ; {assert|assume|cover} property (); are complete 4432 ; {assert|assume|cover} property (); are complete
4210 ; but 4433 ; but
4211 ; property ID () ... needs end_property 4434 ; property ID () ... needs end_property
4212 (verilog-beg-of-statement) 4435 (verilog-beg-of-statement)
4213 (if (looking-at "\\(assert\\|assume\\|cover\\)\\s-+property\\>") 4436 (if (looking-at "\\(assert\\|assume\\|cover\\)\\s-+property\\>")
4214 (throw 'nesting 'statement) ; We don't need an endproperty for these 4437 (throw 'nesting 'statement) ; We don't need an endproperty for these
4215 (throw 'nesting 'block) ;We still need a endproperty 4438 (throw 'nesting 'block) ;We still need a endproperty
4216 )) 4439 ))
4217
4218 (t (throw 'nesting 'block))))
4219
4220 ((looking-at verilog-end-block-re)
4221 (verilog-leap-to-head)
4222 (if (verilog-in-case-region-p)
4223 (progn
4224 (verilog-leap-to-case-head)
4225 (if (looking-at verilog-case-re)
4226 (throw 'nesting 'case)))))
4227 4440
4228 ((looking-at (if (verilog-in-generate-region-p) 4441 (t (throw 'nesting 'block))))
4229 verilog-defun-level-not-generate-re
4230 verilog-defun-level-re))
4231 (throw 'nesting 'defun))
4232 4442
4233 ((looking-at verilog-cpp-level-re) 4443 ((looking-at verilog-end-block-re)
4234 (throw 'nesting 'cpp)) 4444 (verilog-leap-to-head)
4445 (if (verilog-in-case-region-p)
4446 (progn
4447 (verilog-leap-to-case-head)
4448 (if (looking-at verilog-extended-case-re)
4449 (throw 'nesting 'case)))))
4235 4450
4236 ((bobp) 4451 ((looking-at verilog-defun-level-re)
4237 (throw 'nesting 'cpp)))) 4452 (if (looking-at verilog-defun-level-generate-only-re)
4238 (throw 'nesting 'cpp))) 4453 (if (verilog-in-generate-region-p)
4454 (throw 'continue 'foo) ; always block in a generate
4455 (throw 'nesting 'defun))
4456 (throw 'nesting 'defun)))
4457
4458 ((looking-at verilog-cpp-level-re)
4459 (throw 'nesting 'cpp))
4460
4461 ((bobp)
4462 (throw 'nesting 'cpp)))))
4463
4464 (throw 'nesting 'cpp))))
4239 4465
4240(defun verilog-calculate-indent-directive () 4466(defun verilog-calculate-indent-directive ()
4241 "Return indentation level for directive. 4467 "Return indentation level for directive.
@@ -4271,11 +4497,19 @@ of the appropriate enclosing block."
4271(defun verilog-leap-to-case-head () 4497(defun verilog-leap-to-case-head ()
4272 (let ((nest 1)) 4498 (let ((nest 1))
4273 (while (/= 0 nest) 4499 (while (/= 0 nest)
4274 (verilog-re-search-backward "\\(\\<randcase\\>\\|\\<case[xz]?\\>[^:]\\)\\|\\(\\<endcase\\>\\)" nil 'move) 4500 (verilog-re-search-backward
4501 (concat
4502 "\\(\\<randcase\\>\\|\\(\\<unique\\s-+\\|priority\\s-+\\)?\\<case[xz]?\\>\\)"
4503 "\\|\\(\\<endcase\\>\\)" )
4504 nil 'move)
4275 (cond 4505 (cond
4276 ((match-end 1) 4506 ((match-end 1)
4507 (let ((here (point)))
4508 (verilog-beg-of-statement)
4509 (unless (looking-at verilog-extended-case-re)
4510 (goto-char here)))
4277 (setq nest (1- nest))) 4511 (setq nest (1- nest)))
4278 ((match-end 2) 4512 ((match-end 3)
4279 (setq nest (1+ nest))) 4513 (setq nest (1+ nest)))
4280 ((bobp) 4514 ((bobp)
4281 (ding 't) 4515 (ding 't)
@@ -4294,27 +4528,32 @@ Jump from end to matching begin, from endcase to matching case, and so on."
4294 (setq reg (concat "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|" 4528 (setq reg (concat "\\(\\<begin\\>\\)\\|\\(\\<end\\>\\)\\|"
4295 "\\(\\<endcase\\>\\)\\|\\(\\<join\\(_any\\|_none\\)?\\>\\)" ))) 4529 "\\(\\<endcase\\>\\)\\|\\(\\<join\\(_any\\|_none\\)?\\>\\)" )))
4296 ((looking-at "\\<endtask\\>") 4530 ((looking-at "\\<endtask\\>")
4297 ;; 9: Search back for matching task 4531 ;; 2: Search back for matching task
4298 (setq reg "\\(\\<task\\>\\)\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)+\\<task\\>\\)") 4532 (setq reg "\\(\\<task\\>\\)\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)+\\<task\\>\\)")
4299 (setq nesting 'no)) 4533 (setq nesting 'no))
4300 ((looking-at "\\<endcase\\>") 4534 ((looking-at "\\<endcase\\>")
4301 ;; 2: Search back for matching case 4535 (catch 'nesting
4302 (setq reg "\\(\\<randcase\\>\\|\\<case[xz]?\\>\\)\\|\\(\\<endcase\\>\\)" )) 4536 (verilog-leap-to-case-head) )
4537 (setq reg nil) ; to force skip
4538 )
4539
4303 ((looking-at "\\<join\\(_any\\|_none\\)?\\>") 4540 ((looking-at "\\<join\\(_any\\|_none\\)?\\>")
4304 ;; 3: Search back for matching fork 4541 ;; 4: Search back for matching fork
4305 (setq reg "\\(\\<fork\\>\\)\\|\\(\\<join\\(_any\\|_none\\)?\\>\\)" )) 4542 (setq reg "\\(\\<fork\\>\\)\\|\\(\\<join\\(_any\\|_none\\)?\\>\\)" ))
4306 ((looking-at "\\<endclass\\>") 4543 ((looking-at "\\<endclass\\>")
4307 ;; 4: Search back for matching class 4544 ;; 5: Search back for matching class
4308 (setq reg "\\(\\<class\\>\\)\\|\\(\\<endclass\\>\\)" )) 4545 (setq reg "\\(\\<class\\>\\)\\|\\(\\<endclass\\>\\)" ))
4309 ((looking-at "\\<endtable\\>") 4546 ((looking-at "\\<endtable\\>")
4310 ;; 5: Search back for matching table 4547 ;; 6: Search back for matching table
4311 (setq reg "\\(\\<table\\>\\)\\|\\(\\<endtable\\>\\)" )) 4548 (setq reg "\\(\\<table\\>\\)\\|\\(\\<endtable\\>\\)" ))
4312 ((looking-at "\\<endspecify\\>") 4549 ((looking-at "\\<endspecify\\>")
4313 ;; 6: Search back for matching specify 4550 ;; 7: Search back for matching specify
4314 (setq reg "\\(\\<specify\\>\\)\\|\\(\\<endspecify\\>\\)" )) 4551 (setq reg "\\(\\<specify\\>\\)\\|\\(\\<endspecify\\>\\)" ))
4315 ((looking-at "\\<endfunction\\>") 4552 ((looking-at "\\<endfunction\\>")
4316 ;; 7: Search back for matching function 4553 ;; 8: Search back for matching function
4317 (setq reg "\\(\\<function\\>\\)\\|\\(\\<endfunction\\>\\)" )) 4554 (setq reg "\\(\\<function\\>\\)\\|\\(\\(\\(\\<virtual\\>\\s-+\\)\\|\\(\\<protected\\>\\s-+\\)\\)+\\<function\\>\\)")
4555 (setq nesting 'no))
4556 ;;(setq reg "\\(\\<function\\>\\)\\|\\(\\<endfunction\\>\\)" ))
4318 ((looking-at "\\<endgenerate\\>") 4557 ((looking-at "\\<endgenerate\\>")
4319 ;; 8: Search back for matching generate 4558 ;; 8: Search back for matching generate
4320 (setq reg "\\(\\<generate\\>\\)\\|\\(\\<endgenerate\\>\\)" )) 4559 (setq reg "\\(\\<generate\\>\\)\\|\\(\\<endgenerate\\>\\)" ))
@@ -4324,6 +4563,9 @@ Jump from end to matching begin, from endcase to matching case, and so on."
4324 ((looking-at "\\<endproperty\\>") 4563 ((looking-at "\\<endproperty\\>")
4325 ;; 11: Search back for matching property 4564 ;; 11: Search back for matching property
4326 (setq reg "\\(\\<property\\>\\)\\|\\(\\<endproperty\\>\\)" )) 4565 (setq reg "\\(\\<property\\>\\)\\|\\(\\<endproperty\\>\\)" ))
4566 ((looking-at verilog-ovm-end-re)
4567 ;; 12: Search back for matching sequence
4568 (setq reg (concat "\\(" verilog-ovm-begin-re "\\|" verilog-ovm-end-re "\\)")))
4327 ((looking-at "\\<endinterface\\>") 4569 ((looking-at "\\<endinterface\\>")
4328 ;; 12: Search back for matching interface 4570 ;; 12: Search back for matching interface
4329 (setq reg "\\(\\<interface\\>\\)\\|\\(\\<endinterface\\>\\)" )) 4571 (setq reg "\\(\\<interface\\>\\)\\|\\(\\<endinterface\\>\\)" ))
@@ -4364,7 +4606,7 @@ Jump from end to matching begin, from endcase to matching case, and so on."
4364 ))) 4606 )))
4365 ;no nesting 4607 ;no nesting
4366 (if (and 4608 (if (and
4367 (verilog-re-search-backward reg nil 'move) 4609 (verilog-re-search-backward reg nil 'move)
4368 (match-end 1)) ; task -> could be virtual and/or protected 4610 (match-end 1)) ; task -> could be virtual and/or protected
4369 (progn 4611 (progn
4370 (verilog-beg-of-statement) 4612 (verilog-beg-of-statement)
@@ -4390,7 +4632,7 @@ Set point to where line starts."
4390 continued)) 4632 continued))
4391 4633
4392(defun verilog-backward-token () 4634(defun verilog-backward-token ()
4393 "Step backward token, returning true if we are now at an end of line token." 4635 "Step backward token, returing true if nil if continued line."
4394 (interactive) 4636 (interactive)
4395 (verilog-backward-syntactic-ws) 4637 (verilog-backward-syntactic-ws)
4396 (cond 4638 (cond
@@ -4404,13 +4646,25 @@ Set point to where line starts."
4404 (= (preceding-char) ?\}) 4646 (= (preceding-char) ?\})
4405 (progn 4647 (progn
4406 (backward-char) 4648 (backward-char)
4407 (verilog-at-close-constraint-p))) 4649 (not(verilog-at-close-constraint-p))))
4408 (;-- constraint foo { a = b } 4650 (;-- constraint foo { a = b }
4409 ; is a complete statement. *sigh* 4651 ; is a complete statement. *sigh*
4410 (= (preceding-char) ?\{) 4652 (= (preceding-char) ?\{)
4411 (progn 4653 (progn
4412 (backward-char) 4654 (backward-char)
4413 (not (verilog-at-constraint-p)))) 4655 (not (verilog-at-constraint-p))))
4656 (;" string "
4657 (= (preceding-char) ?\")
4658 (backward-char)
4659 (verilog-skip-backward-comment-or-string)
4660 nil)
4661
4662 (; [3:4]
4663 (= (preceding-char) ?\])
4664 (backward-char)
4665 (verilog-backward-open-bracket)
4666 t)
4667
4414 (;-- Could be 'case (foo)' or 'always @(bar)' which is complete 4668 (;-- Could be 'case (foo)' or 'always @(bar)' which is complete
4415 ; also could be simply '@(foo)' 4669 ; also could be simply '@(foo)'
4416 ; or foo u1 #(a=8) 4670 ; or foo u1 #(a=8)
@@ -4424,8 +4678,15 @@ Set point to where line starts."
4424 (let ((back (point))) 4678 (let ((back (point)))
4425 (forward-word -1) 4679 (forward-word -1)
4426 (cond 4680 (cond
4681 ;;XX
4427 ((looking-at "\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\|case\\(\\|[xz]\\)\\|for\\(\\|each\\|ever\\)\\|i\\(f\\|nitial\\)\\|repeat\\|while\\)\\>") 4682 ((looking-at "\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\|case\\(\\|[xz]\\)\\|for\\(\\|each\\|ever\\)\\|i\\(f\\|nitial\\)\\|repeat\\|while\\)\\>")
4428 (not (looking-at "\\<randcase\\>\\|\\<case[xz]?\\>[^:]"))) 4683 (not (looking-at "\\<randcase\\>\\|\\<case[xz]?\\>[^:]")))
4684 ((looking-at verilog-ovm-statement-re)
4685 nil)
4686 ((looking-at verilog-ovm-begin-re)
4687 t)
4688 ((looking-at verilog-ovm-end-re)
4689 t)
4429 (t 4690 (t
4430 (goto-char back) 4691 (goto-char back)
4431 (cond 4692 (cond
@@ -4521,7 +4782,8 @@ Optional BOUND limits search."
4521 (save-excursion 4782 (save-excursion
4522 (beginning-of-line) 4783 (beginning-of-line)
4523 (cond 4784 (cond
4524 ((verilog-within-translate-off) 4785 ((and verilog-highlight-translate-off
4786 (verilog-within-translate-off))
4525 (verilog-back-to-start-translate-off (point-min))) 4787 (verilog-back-to-start-translate-off (point-min)))
4526 ((looking-at verilog-directive-re-1) 4788 ((looking-at verilog-directive-re-1)
4527 (point)) 4789 (point))
@@ -4588,13 +4850,29 @@ Optional BOUND limits search."
4588 (if (equal (char-after (point) ) ?\\ ) 4850 (if (equal (char-after (point) ) ?\\ )
4589 t 4851 t
4590 nil))) 4852 nil)))
4853(defun verilog-in-directive-p ()
4854 "Return true if in a star or // comment."
4855 (save-excursion
4856 (beginning-of-line)
4857 (looking-at verilog-directive-re-1)))
4591 4858
4592(defun verilog-in-paren () 4859(defun verilog-in-paren ()
4593 "Return true if in a parenthetical expression." 4860 "Return true if in a parenthetical expression."
4594 (let ((state (save-excursion (verilog-syntax-ppss)))) 4861 (let ((state (save-excursion (verilog-syntax-ppss))))
4595 (> (nth 0 state) 0 ))) 4862 (> (nth 0 state) 0 )))
4596 4863
4597(defun verilog-in-coverage () 4864(defun verilog-in-struct-p ()
4865 "Return true if in a struct declaration."
4866 (interactive)
4867 (save-excursion
4868 (if (verilog-in-paren)
4869 (progn
4870 (backward-up-list 1)
4871 (verilog-at-struct-p)
4872 )
4873 nil)))
4874
4875(defun verilog-in-coverage-p ()
4598 "Return true if in a constraint or coverpoint expression." 4876 "Return true if in a constraint or coverpoint expression."
4599 (interactive) 4877 (interactive)
4600 (save-excursion 4878 (save-excursion
@@ -4630,6 +4908,14 @@ Optional BOUND limits search."
4630 ;; not 4908 ;; not
4631 nil)) 4909 nil))
4632 4910
4911(defun verilog-at-struct-p ()
4912 "If at the { of a struct, return true, moving point to struct."
4913 (save-excursion
4914 (if (and (equal (char-after) ?\{)
4915 (verilog-backward-token))
4916 (looking-at "\\<struct\\|union\\|packed\\>")
4917 nil)))
4918
4633(defun verilog-parenthesis-depth () 4919(defun verilog-parenthesis-depth ()
4634 "Return non zero if in parenthetical-expression." 4920 "Return non zero if in parenthetical-expression."
4635 (save-excursion (nth 1 (verilog-syntax-ppss)))) 4921 (save-excursion (nth 1 (verilog-syntax-ppss))))
@@ -4806,7 +5092,7 @@ Only look at a few lines to determine indent level."
4806 (current-column)))) 5092 (current-column))))
4807 (indent-line-to val) 5093 (indent-line-to val)
4808 )) 5094 ))
4809 5095
4810 (;-- Handle the ends 5096 (;-- Handle the ends
4811 (or 5097 (or
4812 (looking-at verilog-end-block-re ) 5098 (looking-at verilog-end-block-re )
@@ -4869,7 +5155,7 @@ Do not count named blocks or case-statements."
4869 (cond 5155 (cond
4870 ((looking-at verilog-named-block-re) 5156 ((looking-at verilog-named-block-re)
4871 (current-column)) 5157 (current-column))
4872 ((and (not (looking-at verilog-case-re)) 5158 ((and (not (looking-at verilog-extended-case-re))
4873 (looking-at "^[^:;]+[ \t]*:")) 5159 (looking-at "^[^:;]+[ \t]*:"))
4874 (verilog-re-search-forward ":" nil t) 5160 (verilog-re-search-forward ":" nil t)
4875 (skip-chars-forward " \t") 5161 (skip-chars-forward " \t")
@@ -4937,101 +5223,111 @@ ARG is ignored, for `comment-indent-function' compatibility."
4937;; 5223;;
4938 5224
4939(defun verilog-pretty-declarations (&optional quiet) 5225(defun verilog-pretty-declarations (&optional quiet)
4940 "Line up declarations around point." 5226 "Line up declarations around point.
5227Be verbose about progress unless optional QUIET set."
4941 (interactive) 5228 (interactive)
4942 (save-excursion 5229 (save-excursion
4943 (if (progn 5230 (if (progn
4944 (verilog-beg-of-statement-1) 5231 (verilog-beg-of-statement-1)
4945 (looking-at verilog-declaration-re)) 5232 (and (not (verilog-in-directive-p)) ;; could have `define input foo
4946 (let* ((m1 (make-marker)) 5233 (not (verilog-parenthesis-depth)) ;; could be in a #(param block )
4947 (e) (r) 5234 (looking-at verilog-declaration-re)))
4948 (here (point)) 5235 (let* ((m1 (make-marker))
4949 ;; Start of declaration range 5236 (e (point))
4950 (start 5237 (r)
4951 (progn 5238 (here (point))
4952 (verilog-beg-of-statement-1) 5239 ;; Start of declaration range
4953 (while (looking-at verilog-declaration-re) 5240 (start
4954 (beginning-of-line) 5241 (progn
4955 (setq e (point)) 5242 (verilog-beg-of-statement-1)
4956 (verilog-backward-syntactic-ws) 5243 (while (and (looking-at verilog-declaration-re)
4957 (backward-char) 5244 (not (bobp)))
4958 (verilog-beg-of-statement-1)) ;Ack, need to grok `define 5245 (skip-chars-backward " \t")
4959 e)) 5246 (setq e (point))
4960 ;; End of declaration range 5247 (beginning-of-line)
4961 (end 5248 (verilog-backward-syntactic-ws)
4962 (progn 5249 (backward-char)
4963 (goto-char here) 5250 (verilog-beg-of-statement-1))
4964 (verilog-end-of-statement) 5251 e))
4965 (setq e (point)) ;Might be on last line 5252 ;; End of declaration range
4966 (verilog-forward-syntactic-ws) 5253 (end
4967 (while (looking-at verilog-declaration-re) 5254 (progn
4968 (beginning-of-line) 5255 (goto-char here)
4969 (verilog-end-of-statement) 5256 (verilog-end-of-statement)
4970 (setq e (point)) 5257 (setq e (point)) ;Might be on last line
4971 (verilog-forward-syntactic-ws)) 5258 (verilog-forward-syntactic-ws)
4972 e)) 5259 (while (looking-at verilog-declaration-re)
4973 (edpos (set-marker (make-marker) end)) 5260 ;;(beginning-of-line)
4974 (ind) 5261 (verilog-end-of-statement)
4975 (base-ind 5262 (setq e (point))
4976 (progn 5263 (verilog-forward-syntactic-ws))
4977 (goto-char start) 5264 e))
4978 (verilog-do-indent (verilog-calculate-indent)) 5265 (edpos (set-marker (make-marker) end))
4979 (verilog-forward-ws&directives) 5266 (ind)
4980 (current-column)))) 5267 (base-ind
4981 (goto-char end) 5268 (progn
4982 (goto-char start) 5269 (goto-char start)
4983 (if (and (not quiet) 5270 (verilog-do-indent (verilog-calculate-indent))
4984 (> (- end start) 100)) 5271 (verilog-forward-ws&directives)
4985 (message "Lining up declarations..(please stand by)")) 5272 (current-column))))
4986 ;; Get the beginning of line indent first 5273 (goto-char start)
4987 (while (progn (setq e (marker-position edpos)) 5274 (if (and (not quiet)
4988 (< (point) e)) 5275 (> (- end start) 100))
4989 (cond 5276 (message "Lining up declarations..(please stand by)"))
4990 ( (save-excursion (skip-chars-backward " \t") 5277 ;; Get the beginning of line indent first
4991 (bolp)) 5278 (while (progn (setq e (marker-position edpos))
4992 (verilog-forward-ws&directives) 5279 (< (point) e))
4993 (indent-line-to base-ind) 5280 (cond
4994 (verilog-forward-ws&directives) 5281 ( (save-excursion (skip-chars-backward " \t")
4995 (verilog-re-search-forward "[ \t\n\f]" e 'move)) 5282 (bolp))
4996 (t 5283 (verilog-forward-ws&directives)
4997 (just-one-space) 5284 (indent-line-to base-ind)
4998 (verilog-re-search-forward "[ \t\n\f]" e 'move))) 5285 (verilog-forward-ws&directives)
4999 ;;(forward-line) 5286 (verilog-re-search-forward "[ \t\n\f]" e 'move))
5000 ) 5287 (t
5001 ;; Now find biggest prefix 5288 (just-one-space)
5002 (setq ind (verilog-get-lineup-indent start edpos)) 5289 (verilog-re-search-forward "[ \t\n\f]" e 'move)))
5003 ;; Now indent each line. 5290 ;;(forward-line)
5004 (goto-char start) 5291 )
5005 (while (progn (setq e (marker-position edpos)) 5292 ;; Now find biggest prefix
5006 (setq r (- e (point))) 5293 (setq ind (verilog-get-lineup-indent start edpos))
5007 (> r 0)) 5294 ;; Now indent each line.
5008 (setq e (point)) 5295 (goto-char start)
5009 (unless quiet (message "%d" r)) 5296 (while (progn (setq e (marker-position edpos))
5010 (cond 5297 (setq r (- e (point)))
5011 ((or (and verilog-indent-declaration-macros 5298 (> r 0))
5012 (looking-at verilog-declaration-re-1-macro)) 5299 (setq e (point))
5013 (looking-at verilog-declaration-re-1-no-macro)) 5300 (unless quiet (message "%d" r))
5014 (let ((p (match-end 0))) 5301 (verilog-indent-line)
5015 (set-marker m1 p) 5302 (cond
5016 (if (verilog-re-search-forward "[[#`]" p 'move) 5303 ((or (and verilog-indent-declaration-macros
5017 (progn 5304 (looking-at verilog-declaration-re-2-macro))
5018 (forward-char -1) 5305 (looking-at verilog-declaration-re-2-no-macro))
5019 (just-one-space) 5306 (let ((p (match-end 0)))
5020 (goto-char (marker-position m1)) 5307 (set-marker m1 p)
5021 (just-one-space) 5308 (if (verilog-re-search-forward "[[#`]" p 'move)
5022 (indent-to ind)) 5309 (progn
5023 (progn 5310 (forward-char -1)
5024 (just-one-space) 5311 (just-one-space)
5025 (indent-to ind))))) 5312 (goto-char (marker-position m1))
5026 ((verilog-continued-line-1 start) 5313 (just-one-space)
5027 (goto-char e) 5314 (indent-to ind))
5028 (indent-line-to ind)) 5315 (progn
5029 (t ; Must be comment or white space 5316 (just-one-space)
5030 (goto-char e) 5317 (indent-to ind)))))
5031 (verilog-forward-ws&directives) 5318 ((verilog-continued-line-1 start)
5032 (forward-line -1))) 5319 (goto-char e)
5033 (forward-line 1)) 5320 (indent-line-to ind))
5034 (unless quiet (message "")))))) 5321 ((verilog-in-struct-p)
5322 ;; could have a declaration of a user defined item
5323 (goto-char e)
5324 (verilog-end-of-statement))
5325 (t ; Must be comment or white space
5326 (goto-char e)
5327 (verilog-forward-ws&directives)
5328 (forward-line -1)))
5329 (forward-line 1))
5330 (unless quiet (message ""))))))
5035 5331
5036(defun verilog-pretty-expr (&optional quiet myre) 5332(defun verilog-pretty-expr (&optional quiet myre)
5037 "Line up expressions around point, or optional regexp MYRE." 5333 "Line up expressions around point, or optional regexp MYRE."
@@ -5040,89 +5336,95 @@ ARG is ignored, for `comment-indent-function' compatibility."
5040 (if (or (eq myre nil) 5336 (if (or (eq myre nil)
5041 (string-equal myre "")) 5337 (string-equal myre ""))
5042 (setq myre "\\(<\\|:\\)?=")) 5338 (setq myre "\\(<\\|:\\)?="))
5043 (setq myre (concat "\\(^[^;#<=>]*\\)\\(" myre "\\)")) 5339 (setq myre (concat "\\(^[^;#:<=>]*\\)\\(" myre "\\)"))
5044 (let ((rexp(concat "^\\s-*" verilog-complete-reg))) 5340 (let ((rexp(concat "^\\s-*" verilog-complete-reg)))
5045 (beginning-of-line) 5341 (beginning-of-line)
5046 (if (and (not (looking-at rexp )) 5342 (if (and (not (looking-at rexp ))
5047 (looking-at myre)) 5343 (looking-at myre)
5048 (let* ((here (point)) 5344 (save-excursion
5049 (e) (r) 5345 (goto-char (match-beginning 2))
5050 (start 5346 (not (verilog-in-comment-or-string-p))))
5051 (progn 5347 (let* ((here (point))
5052 (beginning-of-line) 5348 (e) (r)
5053 (setq e (point)) 5349 (start
5054 (verilog-backward-syntactic-ws) 5350 (progn
5055 (beginning-of-line) 5351 (beginning-of-line)
5056 (while (and (not (looking-at rexp )) 5352 (setq e (point))
5057 (looking-at myre) 5353 (verilog-backward-syntactic-ws)
5058 (not (bobp)) 5354 (beginning-of-line)
5059 ) 5355 (while (and (not (looking-at rexp ))
5060 (setq e (point)) 5356 (looking-at myre)
5061 (verilog-backward-syntactic-ws) 5357 (not (bobp))
5062 (beginning-of-line) 5358 )
5063 ) ;Ack, need to grok `define 5359 (setq e (point))
5064 e)) 5360 (verilog-backward-syntactic-ws)
5065 (end 5361 (beginning-of-line)
5066 (progn 5362 ) ;Ack, need to grok `define
5067 (goto-char here) 5363 e))
5068 (end-of-line) 5364 (end
5069 (setq e (point)) ;Might be on last line 5365 (progn
5070 (verilog-forward-syntactic-ws) 5366 (goto-char here)
5071 (beginning-of-line) 5367 (end-of-line)
5072 (while (and (not (looking-at rexp )) 5368 (setq e (point)) ;Might be on last line
5073 (looking-at myre)) 5369 (verilog-forward-syntactic-ws)
5074 (end-of-line) 5370 (beginning-of-line)
5075 (setq e (point)) 5371 (while (and
5076 (verilog-forward-syntactic-ws) 5372 (not (looking-at rexp ))
5077 (beginning-of-line) 5373 (looking-at myre)
5078 ) 5374 (progn
5079 e)) 5375 (end-of-line)
5080 (edpos (set-marker (make-marker) end)) 5376 (not (eq e (point)))))
5081 (ind) 5377 (setq e (point))
5082 ) 5378 (verilog-forward-syntactic-ws)
5083 (goto-char start) 5379 (beginning-of-line)
5084 (verilog-do-indent (verilog-calculate-indent)) 5380 )
5085 (if (and (not quiet) 5381 e))
5086 (> (- end start) 100)) 5382 (edpos (set-marker (make-marker) end))
5087 (message "Lining up expressions..(please stand by)")) 5383 (ind)
5088 5384 )
5089 ;; Set indent to minimum throughout region 5385 (goto-char start)
5090 (while (< (point) (marker-position edpos)) 5386 (verilog-do-indent (verilog-calculate-indent))
5091 (beginning-of-line) 5387 (if (and (not quiet)
5092 (verilog-just-one-space myre) 5388 (> (- end start) 100))
5093 (end-of-line) 5389 (message "Lining up expressions..(please stand by)"))
5094 (verilog-forward-syntactic-ws) 5390
5095 ) 5391 ;; Set indent to minimum throughout region
5096 5392 (while (< (point) (marker-position edpos))
5097 ;; Now find biggest prefix 5393 (beginning-of-line)
5098 (setq ind (verilog-get-lineup-indent-2 myre start edpos)) 5394 (verilog-just-one-space myre)
5099 5395 (end-of-line)
5100 ;; Now indent each line. 5396 (verilog-forward-syntactic-ws)
5101 (goto-char start) 5397 )
5102 (while (progn (setq e (marker-position edpos)) 5398
5103 (setq r (- e (point))) 5399 ;; Now find biggest prefix
5104 (> r 0)) 5400 (setq ind (verilog-get-lineup-indent-2 myre start edpos))
5105 (setq e (point)) 5401
5106 (if (not quiet) (message "%d" r)) 5402 ;; Now indent each line.
5107 (cond 5403 (goto-char start)
5108 ((looking-at myre) 5404 (while (progn (setq e (marker-position edpos))
5109 (goto-char (match-end 1)) 5405 (setq r (- e (point)))
5110 (if (not (verilog-parenthesis-depth)) ;; ignore parenthsized exprs 5406 (> r 0))
5111 (if (eq (char-after) ?=) 5407 (setq e (point))
5112 (indent-to (1+ ind)) ; line up the = of the <= with surrounding = 5408 (if (not quiet) (message "%d" r))
5113 (indent-to ind) 5409 (cond
5114 ))) 5410 ((looking-at myre)
5115 ((verilog-continued-line-1 start) 5411 (goto-char (match-beginning 2))
5116 (goto-char e) 5412 (if (not (verilog-parenthesis-depth)) ;; ignore parenthsized exprs
5117 (indent-line-to ind)) 5413 (if (eq (char-after) ?=)
5118 (t ; Must be comment or white space 5414 (indent-to (1+ ind)) ; line up the = of the <= with surrounding =
5119 (goto-char e) 5415 (indent-to ind)
5120 (verilog-forward-ws&directives) 5416 )))
5121 (forward-line -1)) 5417 ((verilog-continued-line-1 start)
5122 ) 5418 (goto-char e)
5123 (forward-line 1)) 5419 (indent-line-to ind))
5124 (unless quiet (message "")) 5420 (t ; Must be comment or white space
5125 ))))) 5421 (goto-char e)
5422 (verilog-forward-ws&directives)
5423 (forward-line -1))
5424 )
5425 (forward-line 1))
5426 (unless quiet (message ""))
5427 )))))
5126 5428
5127(defun verilog-just-one-space (myre) 5429(defun verilog-just-one-space (myre)
5128 "Remove extra spaces around regular expression MYRE." 5430 "Remove extra spaces around regular expression MYRE."
@@ -5157,8 +5459,8 @@ BASEIND is the base indent to offset everything."
5157 (indent-line-to val) 5459 (indent-line-to val)
5158 5460
5159 ;; Use previous declaration (in this module) as template. 5461 ;; Use previous declaration (in this module) as template.
5160 (if (or (memq 'all verilog-auto-lineup) 5462 (if (or (eq 'all verilog-auto-lineup)
5161 (memq 'declaration verilog-auto-lineup)) 5463 (eq 'declarations verilog-auto-lineup))
5162 (if (verilog-re-search-backward 5464 (if (verilog-re-search-backward
5163 (or (and verilog-indent-declaration-macros 5465 (or (and verilog-indent-declaration-macros
5164 verilog-declaration-re-1-macro) 5466 verilog-declaration-re-1-macro)
@@ -5697,12 +5999,16 @@ If search fails, other files are checked based on
5697 (verilog-buffer-to-use (current-buffer)) 5999 (verilog-buffer-to-use (current-buffer))
5698 (label (if (not (string= default "")) 6000 (label (if (not (string= default ""))
5699 ;; Do completion with default 6001 ;; Do completion with default
5700 (completing-read (concat "Label: (default " default ") ") 6002 (completing-read (concat "Goto-Label: (default "
6003 default ") ")
5701 'verilog-comp-defun nil nil "") 6004 'verilog-comp-defun nil nil "")
5702 ;; There is no default value. Complete without it 6005 ;; There is no default value. Complete without it
5703 (completing-read "Label: " 6006 (completing-read "Goto-Label: "
5704 'verilog-comp-defun nil nil ""))) 6007 'verilog-comp-defun nil nil "")))
5705 pt) 6008 pt)
6009 ;; Make sure library paths are correct, in case need to resolve module
6010 (verilog-auto-reeval-locals)
6011 (verilog-getopt-flags)
5706 ;; If there was no response on prompt, use default value 6012 ;; If there was no response on prompt, use default value
5707 (if (string= label "") 6013 (if (string= label "")
5708 (setq label default)) 6014 (setq label default))
@@ -5846,7 +6152,8 @@ Bound search by LIMIT. Adapted from
5846;; Added by Subbu Meiyappan for Header 6152;; Added by Subbu Meiyappan for Header
5847 6153
5848(defun verilog-header () 6154(defun verilog-header ()
5849 "Insert a standard Verilog file header." 6155 "Insert a standard Verilog file header.
6156See also `verilog-sk-header' for an alternative format."
5850 (interactive) 6157 (interactive)
5851 (let ((start (point))) 6158 (let ((start (point)))
5852 (insert "\ 6159 (insert "\
@@ -5911,26 +6218,14 @@ Bound search by LIMIT. Adapted from
5911(defun verilog-insert-date () 6218(defun verilog-insert-date ()
5912 "Insert date from the system." 6219 "Insert date from the system."
5913 (interactive) 6220 (interactive)
5914 (let ((timpos)) 6221 (if verilog-date-scientific-format
5915 (setq timpos (point)) 6222 (insert (format-time-string "%Y/%m/%d"))
5916 (if verilog-date-scientific-format 6223 (insert (format-time-string "%d.%m.%Y"))))
5917 (shell-command "date \"+@%Y/%m/%d\"" t)
5918 (shell-command "date \"+@%d.%m.%Y\"" t))
5919 (search-forward "@")
5920 (delete-region timpos (point))
5921 (end-of-line))
5922 (delete-char 1))
5923 6224
5924(defun verilog-insert-year () 6225(defun verilog-insert-year ()
5925 "Insert year from the system." 6226 "Insert year from the system."
5926 (interactive) 6227 (interactive)
5927 (let ((timpos)) 6228 (insert (format-time-string "%Y")))
5928 (setq timpos (point))
5929 (shell-command "date \"+@%Y\"" t)
5930 (search-forward "@")
5931 (delete-region timpos (point))
5932 (end-of-line))
5933 (delete-char 1))
5934 6229
5935 6230
5936;; 6231;;
@@ -5961,6 +6256,8 @@ Bound search by LIMIT. Adapted from
5961 (setq str (concat str (car args))) 6256 (setq str (concat str (car args)))
5962 (setq args (cdr args))) 6257 (setq args (cdr args)))
5963 str))) 6258 str)))
6259(defsubst verilog-sig-modport (sig)
6260 (nth 8 sig))
5964(defsubst verilog-sig-width (sig) 6261(defsubst verilog-sig-width (sig)
5965 (verilog-make-width-expression (verilog-sig-bits sig))) 6262 (verilog-make-width-expression (verilog-sig-bits sig)))
5966 6263
@@ -6026,6 +6323,7 @@ Duplicate signals are also removed. For example A[2] and A[1] become A[2:1]."
6026 sig highbit lowbit ; Temp information about current signal 6323 sig highbit lowbit ; Temp information about current signal
6027 sv-name sv-highbit sv-lowbit ; Details about signal we are forming 6324 sv-name sv-highbit sv-lowbit ; Details about signal we are forming
6028 sv-comment sv-memory sv-enum sv-signed sv-type sv-multidim sv-busstring 6325 sv-comment sv-memory sv-enum sv-signed sv-type sv-multidim sv-busstring
6326 sv-modport
6029 bus) 6327 bus)
6030 ;; Shove signals so duplicated signals will be adjacent 6328 ;; Shove signals so duplicated signals will be adjacent
6031 (setq in-list (sort in-list `verilog-signals-sort-compare)) 6329 (setq in-list (sort in-list `verilog-signals-sort-compare))
@@ -6042,6 +6340,7 @@ Duplicate signals are also removed. For example A[2] and A[1] become A[2:1]."
6042 sv-signed (verilog-sig-signed sig) 6340 sv-signed (verilog-sig-signed sig)
6043 sv-type (verilog-sig-type sig) 6341 sv-type (verilog-sig-type sig)
6044 sv-multidim (verilog-sig-multidim sig) 6342 sv-multidim (verilog-sig-multidim sig)
6343 sv-modport (verilog-sig-modport sig)
6045 combo "" 6344 combo ""
6046 buswarn "")) 6345 buswarn ""))
6047 ;; Extract bus details 6346 ;; Extract bus details
@@ -6080,7 +6379,8 @@ Duplicate signals are also removed. For example A[2] and A[1] become A[2:1]."
6080 sv-enum (or sv-enum (verilog-sig-enum sig)) 6379 sv-enum (or sv-enum (verilog-sig-enum sig))
6081 sv-signed (or sv-signed (verilog-sig-signed sig)) 6380 sv-signed (or sv-signed (verilog-sig-signed sig))
6082 sv-type (or sv-type (verilog-sig-type sig)) 6381 sv-type (or sv-type (verilog-sig-type sig))
6083 sv-multidim (or sv-multidim (verilog-sig-multidim sig)))) 6382 sv-multidim (or sv-multidim (verilog-sig-multidim sig))
6383 sv-modport (or sv-modport (verilog-sig-modport sig))))
6084 ;; Doesn't match next signal, add to queue, zero in prep for next 6384 ;; Doesn't match next signal, add to queue, zero in prep for next
6085 ;; Note sig may also be nil for the last signal in the list 6385 ;; Note sig may also be nil for the last signal in the list
6086 (t 6386 (t
@@ -6092,7 +6392,7 @@ Duplicate signals are also removed. For example A[2] and A[1] become A[2:1]."
6092 (concat "[" (int-to-string sv-highbit) ":" 6392 (concat "[" (int-to-string sv-highbit) ":"
6093 (int-to-string sv-lowbit) "]"))) 6393 (int-to-string sv-lowbit) "]")))
6094 (concat sv-comment combo buswarn) 6394 (concat sv-comment combo buswarn)
6095 sv-memory sv-enum sv-signed sv-type sv-multidim) 6395 sv-memory sv-enum sv-signed sv-type sv-multidim sv-modport)
6096 out-list) 6396 out-list)
6097 sv-name nil)))) 6397 sv-name nil))))
6098 ;; 6398 ;;
@@ -6162,7 +6462,8 @@ Ignore width if optional NO-WIDTH is set."
6162 (skip-chars-backward "a-zA-Z0-9`_$") 6462 (skip-chars-backward "a-zA-Z0-9`_$")
6163 (looking-at "[a-zA-Z0-9`_\$]+") 6463 (looking-at "[a-zA-Z0-9`_\$]+")
6164 ;; Important: don't use match string, this must work with Emacs 19 font-lock on 6464 ;; Important: don't use match string, this must work with Emacs 19 font-lock on
6165 (buffer-substring-no-properties (match-beginning 0) (match-end 0)))) 6465 (verilog-symbol-detick
6466 (buffer-substring-no-properties (match-beginning 0) (match-end 0)) t)))
6166 6467
6167(defun verilog-read-inst-param-value () 6468(defun verilog-read-inst-param-value ()
6168 "Return list of parameters and values when point is inside instantiation." 6469 "Return list of parameters and values when point is inside instantiation."
@@ -6214,9 +6515,11 @@ Optional NUM-PARAM and MAX-PARAM check for a specific number of parameters."
6214 "Compute signal declaration information for the current module at point. 6515 "Compute signal declaration information for the current module at point.
6215Return a array of [outputs inouts inputs wire reg assign const]." 6516Return a array of [outputs inouts inputs wire reg assign const]."
6216 (let ((end-mod-point (or (verilog-get-end-of-defun t) (point-max))) 6517 (let ((end-mod-point (or (verilog-get-end-of-defun t) (point-max)))
6217 (functask 0) (paren 0) (sig-paren 0) 6518 (functask 0) (paren 0) (sig-paren 0) (v2kargs-ok t)
6218 sigs-in sigs-out sigs-inout sigs-wire sigs-reg sigs-assign sigs-const sigs-gparam 6519 sigs-in sigs-out sigs-inout sigs-wire sigs-reg sigs-assign sigs-const
6219 vec expect-signal keywd newsig rvalue enum io signed typedefed multidim) 6520 sigs-gparam sigs-intf
6521 vec expect-signal keywd newsig rvalue enum io signed typedefed multidim
6522 modport)
6220 (save-excursion 6523 (save-excursion
6221 (verilog-beg-of-defun) 6524 (verilog-beg-of-defun)
6222 (setq sigs-const (verilog-read-auto-constants (point) end-mod-point)) 6525 (setq sigs-const (verilog-read-auto-constants (point) end-mod-point))
@@ -6235,14 +6538,15 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6235 (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point)))) 6538 (error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point))))
6236 ((looking-at "(\\*") 6539 ((looking-at "(\\*")
6237 (forward-char 2) 6540 (forward-char 2)
6238 (or (looking-at "\\s-*)") ; It's a "always @ (*)" 6541 (or (looking-at "\\s-*)") ; It's an "always @ (*)"
6239 (search-forward "*)") 6542 (search-forward "*)")
6240 (error "%s: Unmatched (* *), at char %d" (verilog-point-text) (point)))) 6543 (error "%s: Unmatched (* *), at char %d" (verilog-point-text) (point))))
6241 ((eq ?\" (following-char)) 6544 ((eq ?\" (following-char))
6242 (or (re-search-forward "[^\\]\"" nil t) ;; don't forward-char first, since we look for a non backslash first 6545 (or (re-search-forward "[^\\]\"" nil t) ;; don't forward-char first, since we look for a non backslash first
6243 (error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point)))) 6546 (error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point))))
6244 ((eq ?\; (following-char)) 6547 ((eq ?\; (following-char))
6245 (setq vec nil io nil expect-signal nil newsig nil paren 0 rvalue nil) 6548 (setq vec nil io nil expect-signal nil newsig nil paren 0 rvalue nil
6549 v2kargs-ok nil)
6246 (forward-char 1)) 6550 (forward-char 1))
6247 ((eq ?= (following-char)) 6551 ((eq ?= (following-char))
6248 (setq rvalue t newsig nil) 6552 (setq rvalue t newsig nil)
@@ -6283,57 +6587,61 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6283 (setq keywd (concat keywd " "))) ;; Escaped ID needs space at end 6587 (setq keywd (concat keywd " "))) ;; Escaped ID needs space at end
6284 (cond ((equal keywd "input") 6588 (cond ((equal keywd "input")
6285 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren 6589 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren
6286 expect-signal 'sigs-in io t)) 6590 expect-signal 'sigs-in io t modport nil))
6287 ((equal keywd "output") 6591 ((equal keywd "output")
6288 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren 6592 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren
6289 expect-signal 'sigs-out io t)) 6593 expect-signal 'sigs-out io t modport nil))
6290 ((equal keywd "inout") 6594 ((equal keywd "inout")
6291 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren 6595 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed nil multidim nil sig-paren paren
6292 expect-signal 'sigs-inout io t)) 6596 expect-signal 'sigs-inout io t modport nil))
6293 ((or (equal keywd "wire") 6597 ((equal keywd "parameter")
6294 (equal keywd "tri") 6598 (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6295 (equal keywd "tri0") 6599 expect-signal 'sigs-gparam io t modport nil))
6296 (equal keywd "tri1")) 6600 ((member keywd '("wire" "tri" "tri0" "tri1" "triand" "trior" "wand" "wor"))
6297 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren 6601 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6298 expect-signal 'sigs-wire))) 6602 expect-signal 'sigs-wire modport nil)))
6299 ((member keywd (list "reg" "trireg" 6603 ((member keywd '("reg" "trireg"
6300 "byte" "shortint" "int" "longint" "integer" "time" 6604 "byte" "shortint" "int" "longint" "integer" "time"
6301 "bit" "logic")) 6605 "bit" "logic"))
6302 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren 6606 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6303 expect-signal 'sigs-reg))) 6607 expect-signal 'sigs-reg modport nil)))
6304 ((equal keywd "assign") 6608 ((equal keywd "assign")
6305 (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren 6609 (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6306 expect-signal 'sigs-assign)) 6610 expect-signal 'sigs-assign modport nil))
6307 ((or (equal keywd "supply0") 6611 ((member keywd '("supply0" "supply1" "supply"
6308 (equal keywd "supply1") 6612 "localparam" "genvar"))
6309 (equal keywd "supply")
6310 (equal keywd "localparam")
6311 (equal keywd "genvar"))
6312 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren 6613 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6313 expect-signal 'sigs-const))) 6614 expect-signal 'sigs-const modport nil)))
6314 ((or (equal keywd "parameter"))
6315 (unless io (setq vec nil enum nil rvalue nil signed nil typedefed nil multidim nil sig-paren paren
6316 expect-signal 'sigs-gparam)))
6317 ((equal keywd "signed") 6615 ((equal keywd "signed")
6318 (setq signed "signed")) 6616 (setq signed "signed"))
6319 ((or (equal keywd "function") 6617 ((member keywd '("class" "clocking" "covergroup" "function"
6320 (equal keywd "task")) 6618 "property" "randsequence" "sequence" "task"))
6321 (setq functask (1+ functask))) 6619 (setq functask (1+ functask)))
6322 ((or (equal keywd "endfunction") 6620 ((member keywd '("endclass" "endclocking" "endgroup" "endfunction"
6323 (equal keywd "endtask")) 6621 "endproperty" "endsequence" "endtask"))
6324 (setq functask (1- functask))) 6622 (setq functask (1- functask)))
6325 ((or (equal keywd "`ifdef") 6623 ;; Ifdef? Ignore name of define
6326 (equal keywd "`ifndef")) 6624 ((member keywd '("`ifdef" "`ifndef"))
6327 (setq rvalue t)) 6625 (setq rvalue t))
6626 ;; Type?
6328 ((verilog-typedef-name-p keywd) 6627 ((verilog-typedef-name-p keywd)
6329 (setq typedefed keywd)) 6628 (setq typedefed keywd))
6629 ;; Interface with optional modport in v2k arglist?
6630 ;; Skip over parsing modport, and take the interface name as the type
6631 ((and v2kargs-ok
6632 (eq paren 1)
6633 (looking-at "\\s-*\\(\\.\\(\\s-*[a-zA-Z0-9`_$]+\\)\\|\\)\\s-*[a-zA-Z0-9`_$]+"))
6634 (when (match-end 2) (goto-char (match-end 2)))
6635 (setq vec nil enum nil rvalue nil newsig nil signed nil typedefed keywd multidim nil sig-paren paren
6636 expect-signal 'sigs-intf io t modport (match-string 2)))
6637 ;; New signal, maybe?
6330 ((and expect-signal 6638 ((and expect-signal
6331 (eq functask 0) 6639 (eq functask 0)
6332 (not rvalue) 6640 (not rvalue)
6333 (eq paren sig-paren) 6641 (eq paren sig-paren)
6334 (not (member keywd verilog-keywords))) 6642 (not (member keywd verilog-keywords)))
6335 ;; Add new signal to expect-signal's variable 6643 ;; Add new signal to expect-signal's variable
6336 (setq newsig (list keywd vec nil nil enum signed typedefed multidim)) 6644 (setq newsig (list keywd vec nil nil enum signed typedefed multidim modport))
6337 (set expect-signal (cons newsig 6645 (set expect-signal (cons newsig
6338 (symbol-value expect-signal)))))) 6646 (symbol-value expect-signal))))))
6339 (t 6647 (t
@@ -6347,7 +6655,8 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6347 (nreverse sigs-reg) 6655 (nreverse sigs-reg)
6348 (nreverse sigs-assign) 6656 (nreverse sigs-assign)
6349 (nreverse sigs-const) 6657 (nreverse sigs-const)
6350 (nreverse sigs-gparam))))) 6658 (nreverse sigs-gparam)
6659 (nreverse sigs-intf)))))
6351 6660
6352(eval-when-compile 6661(eval-when-compile
6353 ;; Prevent compile warnings; these are let's, not globals 6662 ;; Prevent compile warnings; these are let's, not globals
@@ -6355,7 +6664,8 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6355 ;; - we want a error when we are debugging this code if they are refed. 6664 ;; - we want a error when we are debugging this code if they are refed.
6356 (defvar sigs-in) 6665 (defvar sigs-in)
6357 (defvar sigs-inout) 6666 (defvar sigs-inout)
6358 (defvar sigs-out)) 6667 (defvar sigs-out)
6668 (defvar sigs-intf))
6359 6669
6360 6670
6361(defsubst verilog-modi-get-decls (modi) 6671(defsubst verilog-modi-get-decls (modi)
@@ -6384,12 +6694,16 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6384 (aref decls 6)) 6694 (aref decls 6))
6385(defsubst verilog-decls-get-gparams (decls) 6695(defsubst verilog-decls-get-gparams (decls)
6386 (aref decls 7)) 6696 (aref decls 7))
6697(defsubst verilog-decls-get-interfaces (decls)
6698 (aref decls 8))
6387(defsubst verilog-subdecls-get-outputs (subdecls) 6699(defsubst verilog-subdecls-get-outputs (subdecls)
6388 (aref subdecls 0)) 6700 (aref subdecls 0))
6389(defsubst verilog-subdecls-get-inouts (subdecls) 6701(defsubst verilog-subdecls-get-inouts (subdecls)
6390 (aref subdecls 1)) 6702 (aref subdecls 1))
6391(defsubst verilog-subdecls-get-inputs (subdecls) 6703(defsubst verilog-subdecls-get-inputs (subdecls)
6392 (aref subdecls 2)) 6704 (aref subdecls 2))
6705(defsubst verilog-subdecls-get-interfaces (subdecls)
6706 (aref subdecls 3))
6393 6707
6394 6708
6395(defun verilog-read-sub-decls-sig (submoddecls comment port sig vec multidim) 6709(defun verilog-read-sub-decls-sig (submoddecls comment port sig vec multidim)
@@ -6398,7 +6712,7 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6398 (when sig 6712 (when sig
6399 (setq port (verilog-symbol-detick-denumber port)) 6713 (setq port (verilog-symbol-detick-denumber port))
6400 (setq sig (verilog-symbol-detick-denumber sig)) 6714 (setq sig (verilog-symbol-detick-denumber sig))
6401 (if sig (setq sig (verilog-string-replace-matches "^[---+~!|&]+" "" nil nil sig))) 6715 (if sig (setq sig (verilog-string-replace-matches "^\\s-*[---+~!|&]+\\s-*" "" nil nil sig)))
6402 (if vec (setq vec (verilog-symbol-detick-denumber vec))) 6716 (if vec (setq vec (verilog-symbol-detick-denumber vec)))
6403 (if multidim (setq multidim (mapcar `verilog-symbol-detick-denumber multidim))) 6717 (if multidim (setq multidim (mapcar `verilog-symbol-detick-denumber multidim)))
6404 (unless (or (not sig) 6718 (unless (or (not sig)
@@ -6421,13 +6735,57 @@ Return a array of [outputs inouts inputs wire reg assign const]."
6421 (verilog-sig-type portdata) 6735 (verilog-sig-type portdata)
6422 multidim) 6736 multidim)
6423 sigs-in))) 6737 sigs-in)))
6738 ((setq portdata (assoc port (verilog-decls-get-interfaces submoddecls)))
6739 (setq sigs-intf (cons (list sig vec (concat "To/From " comment) nil nil
6740 (verilog-sig-signed portdata)
6741 (verilog-sig-type portdata)
6742 multidim)
6743 sigs-intf)))
6424 ;; (t -- warning pin isn't defined.) ; Leave for lint tool 6744 ;; (t -- warning pin isn't defined.) ; Leave for lint tool
6425 ))))) 6745 )))))
6426 6746
6747(defun verilog-read-sub-decls-expr (submoddecls comment port expr)
6748 "For `verilog-read-sub-decls-line', parse a subexpression and add signals."
6749 ;;(message "vrsde: '%s'" expr)
6750 ;; Replace special /*[....]*/ comments inserted by verilog-auto-inst-port
6751 (setq expr (verilog-string-replace-matches "/\\*\\(\\[[^*]+\\]\\)\\*/" "\\1" nil nil expr))
6752 ;; Remove front operators
6753 (setq expr (verilog-string-replace-matches "^\\s-*[---+~!|&]+\\s-*" "" nil nil expr))
6754 ;;
6755 (cond
6756 ;; {..., a, b} requires us to recurse on a,b
6757 ((string-match "^\\s-*{\\([^{}]*\\)}\\s-*$" expr)
6758 (let ((mlst (split-string (match-string 1 expr) ","))
6759 mstr)
6760 (while (setq mstr (pop mlst))
6761 (verilog-read-sub-decls-expr submoddecls comment port mstr))))
6762 (t
6763 (let (sig vec multidim)
6764 (cond ;; Find \signal. Final space is part of escaped signal name
6765 ((string-match "^\\s-*\\(\\\\[^ \t\n\f]+\\s-\\)" expr)
6766 ;;(message "vrsde-s: '%s'" (match-string 1 expr))
6767 (setq sig (match-string 1 expr)
6768 expr (substring expr (match-end 0))))
6769 ;; Find signal
6770 ((string-match "^\\s-*\\([^[({).\\]+\\)" expr)
6771 ;;(message "vrsde-s: '%s'" (match-string 1 expr))
6772 (setq sig (verilog-string-remove-spaces (match-string 1 expr))
6773 expr (substring expr (match-end 0)))))
6774 ;; Find [vector] or [multi][multi][multi][vector]
6775 (while (string-match "^\\s-*\\(\\[[^]]+\\]\\)" expr)
6776 ;;(message "vrsde-v: '%s'" (match-string 1 expr))
6777 (when vec (setq multidim (cons vec multidim)))
6778 (setq vec (match-string 1 expr)
6779 expr (substring expr (match-end 0))))
6780 ;; If found signal, and nothing unrecognized, add the signal
6781 ;;(message "vrsde-rem: '%s'" expr)
6782 (when (and sig (string-match "^\\s-*$" expr))
6783 (verilog-read-sub-decls-sig submoddecls comment port sig vec multidim))))))
6784
6427(defun verilog-read-sub-decls-line (submoddecls comment) 6785(defun verilog-read-sub-decls-line (submoddecls comment)
6428 "For `verilog-read-sub-decls', read lines of port defs until none match anymore. 6786 "For `verilog-read-sub-decls', read lines of port defs until none match anymore.
6429Return the list of signals found, using submodi to look up each port." 6787Return the list of signals found, using submodi to look up each port."
6430 (let (done port sig vec multidim) 6788 (let (done port)
6431 (save-excursion 6789 (save-excursion
6432 (forward-line 1) 6790 (forward-line 1)
6433 (while (not done) 6791 (while (not done)
@@ -6443,52 +6801,29 @@ Return the list of signals found, using submodi to look up each port."
6443 (goto-char (match-end 0))) 6801 (goto-char (match-end 0)))
6444 (t 6802 (t
6445 (setq port nil done t))) ;; Unknown, ignore rest of line 6803 (setq port nil done t))) ;; Unknown, ignore rest of line
6446 ;; Get signal name 6804 ;; Get signal name. Point is at the first-non-space after (
6805 ;; We intentionally ignore (non-escaped) signals with .s in them
6806 ;; this prevents AUTOWIRE etc from noticing hierarchical sigs.
6447 (when port 6807 (when port
6448 (setq multidim nil) 6808 (cond ((looking-at "\\([^[({).\\]*\\)\\s-*)")
6449 (cond ((looking-at "\\(\\\\[^ \t\n\f]*\\)\\s-*)") 6809 (verilog-read-sub-decls-sig
6450 (setq sig (concat (match-string 1) " ") ;; escaped id's need trailing space 6810 submoddecls comment port
6451 vec nil)) 6811 (verilog-string-remove-spaces (match-string 1)) ; sig
6452 ; We intentionally ignore (non-escaped) signals with .s in them 6812 nil nil)) ; vec multidim
6453 ; this prevents AUTOWIRE etc from noticing hierarchical sigs. 6813 ;;
6454 ((looking-at "\\([^[({).]*\\)\\s-*)") 6814 ((looking-at "\\([^[({).\\]*\\)\\s-*\\(\\[[^]]+\\]\\)\\s-*)")
6455 (setq sig (verilog-string-remove-spaces (match-string 1)) 6815 (verilog-read-sub-decls-sig
6456 vec nil)) 6816 submoddecls comment port
6457 ((looking-at "\\([^[({).]*\\)\\s-*\\(\\[[^]]+\\]\\)\\s-*)") 6817 (verilog-string-remove-spaces (match-string 1)) ; sig
6458 (setq sig (verilog-string-remove-spaces (match-string 1)) 6818 (match-string 2) nil)) ; vec multidim
6459 vec (match-string 2))) 6819 ;; Fastpath was above looking-at's.
6460 ((looking-at "\\([^[({).]*\\)\\s-*/\\*\\(\\[[^*]+\\]\\)\\*/\\s-*)") 6820 ;; For something more complicated invoke a parser
6461 (setq sig (verilog-string-remove-spaces (match-string 1)) 6821 ((looking-at "[^)]+")
6462 vec nil) 6822 (verilog-read-sub-decls-expr
6463 (let ((parse (match-string 2))) 6823 submoddecls comment port
6464 (while (string-match "^\\(\\[[^]]+\\]\\)\\(.*\\)$" parse) 6824 (buffer-substring
6465 (when vec (setq multidim (cons vec multidim))) 6825 (point) (1- (progn (backward-char 1) ; start at (
6466 (setq vec (match-string 1 parse)) 6826 (forward-sexp 1) (point)))))))) ; expr
6467 (setq parse (match-string 2 parse)))))
6468 ((looking-at "{\\(.*\\)}.*\\s-*)")
6469 (let ((mlst (split-string (match-string 1) ","))
6470 mstr)
6471 (while (setq mstr (pop mlst))
6472 ;;(unless noninteractive (message "sig: %s " mstr))
6473 (cond
6474 ((string-match "\\(['`a-zA-Z0-9_$]+\\)\\s-*$" mstr)
6475 (setq sig (verilog-string-remove-spaces (match-string 1 mstr))
6476 vec nil)
6477 ;;(unless noninteractive (message "concat sig1: %s %s" mstr (match-string 1 mstr)))
6478 )
6479 ((string-match "\\([^[({).]+\\)\\s-*\\(\\[[^]]+\\]\\)\\s-*" mstr)
6480 (setq sig (verilog-string-remove-spaces (match-string 1 mstr))
6481 vec (match-string 2 mstr))
6482 ;;(unless noninteractive (message "concat sig2: '%s' '%s' '%s'" mstr (match-string 1 mstr) (match-string 2 mstr)))
6483 )
6484 (t
6485 (setq sig nil)))
6486 ;; Process signals
6487 (verilog-read-sub-decls-sig submoddecls comment port sig vec multidim))))
6488 (t
6489 (setq sig nil)))
6490 ;; Process signals
6491 (verilog-read-sub-decls-sig submoddecls comment port sig vec multidim))
6492 ;; 6827 ;;
6493 (forward-line 1))))) 6828 (forward-line 1)))))
6494 6829
@@ -6514,7 +6849,7 @@ Outputs comments above subcell signals, for example:
6514 (let ((end-mod-point (verilog-get-end-of-defun t)) 6849 (let ((end-mod-point (verilog-get-end-of-defun t))
6515 st-point end-inst-point 6850 st-point end-inst-point
6516 ;; below 3 modified by verilog-read-sub-decls-line 6851 ;; below 3 modified by verilog-read-sub-decls-line
6517 sigs-out sigs-inout sigs-in) 6852 sigs-out sigs-inout sigs-in sigs-intf)
6518 (verilog-beg-of-defun) 6853 (verilog-beg-of-defun)
6519 (while (verilog-re-search-forward "\\(/\\*AUTOINST\\*/\\|\\.\\*\\)" end-mod-point t) 6854 (while (verilog-re-search-forward "\\(/\\*AUTOINST\\*/\\|\\.\\*\\)" end-mod-point t)
6520 (save-excursion 6855 (save-excursion
@@ -6532,6 +6867,9 @@ Outputs comments above subcell signals, for example:
6532 (verilog-backward-open-paren) 6867 (verilog-backward-open-paren)
6533 (setq end-inst-point (save-excursion (forward-sexp 1) (point)) 6868 (setq end-inst-point (save-excursion (forward-sexp 1) (point))
6534 st-point (point)) 6869 st-point (point))
6870 (while (re-search-forward "\\s *(?\\s *// Interfaces" end-inst-point t)
6871 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-out
6872 (goto-char st-point)
6535 (while (re-search-forward "\\s *(?\\s *// Outputs" end-inst-point t) 6873 (while (re-search-forward "\\s *(?\\s *// Outputs" end-inst-point t)
6536 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-out 6874 (verilog-read-sub-decls-line submoddecls comment)) ;; Modifies sigs-out
6537 (goto-char st-point) 6875 (goto-char st-point)
@@ -6545,7 +6883,8 @@ Outputs comments above subcell signals, for example:
6545 ;;(setq rr (vector sigs-out sigs-inout sigs-in)) 6883 ;;(setq rr (vector sigs-out sigs-inout sigs-in))
6546 (vector (verilog-signals-combine-bus (nreverse sigs-out)) 6884 (vector (verilog-signals-combine-bus (nreverse sigs-out))
6547 (verilog-signals-combine-bus (nreverse sigs-inout)) 6885 (verilog-signals-combine-bus (nreverse sigs-inout))
6548 (verilog-signals-combine-bus (nreverse sigs-in)))))) 6886 (verilog-signals-combine-bus (nreverse sigs-in))
6887 (verilog-signals-combine-bus (nreverse sigs-intf))))))
6549 6888
6550(defun verilog-read-inst-pins () 6889(defun verilog-read-inst-pins ()
6551 "Return an array of [ pins ] for the current instantiation at point. 6890 "Return an array of [ pins ] for the current instantiation at point.
@@ -6677,13 +7016,16 @@ IGNORE-NEXT is true to ignore next token, fake from inside case statement."
6677 (setq ignore-next nil rvalue nil)) 7016 (setq ignore-next nil rvalue nil))
6678 ((equal "?" exit-keywd) ;; x?y:z rvalue 7017 ((equal "?" exit-keywd) ;; x?y:z rvalue
6679 ) ;; NOP 7018 ) ;; NOP
7019 ((equal "]" exit-keywd) ;; [x:y] rvalue
7020 ) ;; NOP
6680 (got-sig ;; label: statement 7021 (got-sig ;; label: statement
6681 (setq ignore-next nil rvalue semi-rvalue got-sig nil)) 7022 (setq ignore-next nil rvalue semi-rvalue got-sig nil))
6682 ((not rvalue) ;; begin label 7023 ((not rvalue) ;; begin label
6683 (setq ignore-next t rvalue nil))) 7024 (setq ignore-next t rvalue nil)))
6684 (forward-char 1)) 7025 (forward-char 1))
6685 ((equal keywd "=") 7026 ((equal keywd "=")
6686 (if (eq (char-before) ?< ) 7027 (if (and (eq (char-before) ?< )
7028 (not rvalue))
6687 (setq uses-delayed 1)) 7029 (setq uses-delayed 1))
6688 (setq ignore-next nil rvalue t) 7030 (setq ignore-next nil rvalue t)
6689 (forward-char 1)) 7031 (forward-char 1))
@@ -6881,6 +7223,7 @@ Optionally associate it with the specified enumeration ENUMNAME."
6881 (if enumname 7223 (if enumname
6882 (let ((enumvar (intern (concat "venum-" enumname)))) 7224 (let ((enumvar (intern (concat "venum-" enumname))))
6883 ;;(message "Define %s=%s" defname defvalue) (sleep-for 1) 7225 ;;(message "Define %s=%s" defname defvalue) (sleep-for 1)
7226 (unless (boundp enumvar) (set enumvar nil))
6884 (make-variable-buffer-local enumvar) 7227 (make-variable-buffer-local enumvar)
6885 (add-to-list enumvar defname))))) 7228 (add-to-list enumvar defname)))))
6886 7229
@@ -6952,16 +7295,12 @@ warning message, you need to add to your .emacs file:
6952 ;; Hack: Read parameters 7295 ;; Hack: Read parameters
6953 (goto-char (point-min)) 7296 (goto-char (point-min))
6954 (while (re-search-forward 7297 (while (re-search-forward
6955 "^\\s-*\\(parameter\\|localparam\\)\\(\\(\\s-*\\[[^]]*\\]\\|\\)\\s-+\\([a-zA-Z0-9_$]+\\)\\s-*=\\s-*\\([^;,]*\\),?\\|\\)\\s-*" nil t) 7298 "^\\s-*\\(parameter\\|localparam\\)\\(\\s-*\\[[^]]*\\]\\)?\\s-+" nil t)
6956 (let ((var (match-string-no-properties 4)) 7299 (let (enumname)
6957 (val (match-string-no-properties 5))
6958 enumname)
6959 ;; The primary way of getting defines is verilog-read-decls 7300 ;; The primary way of getting defines is verilog-read-decls
6960 ;; However, that isn't called yet for included files, so we'll add another scheme 7301 ;; However, that isn't called yet for included files, so we'll add another scheme
6961 (if (looking-at "[^\n]*synopsys\\s +enum\\s +\\([a-zA-Z0-9_]+\\)") 7302 (if (looking-at "[^\n]*synopsys\\s +enum\\s +\\([a-zA-Z0-9_]+\\)")
6962 (setq enumname (match-string-no-properties 1))) 7303 (setq enumname (match-string-no-properties 1)))
6963 (if var
6964 (verilog-set-define var val origbuf enumname))
6965 (forward-comment 999) 7304 (forward-comment 999)
6966 (while (looking-at "\\s-*,?\\s-*\\([a-zA-Z0-9_$]+\\)\\s-*=\\s-*\\([^;,]*\\),?\\s-*") 7305 (while (looking-at "\\s-*,?\\s-*\\([a-zA-Z0-9_$]+\\)\\s-*=\\s-*\\([^;,]*\\),?\\s-*")
6967 (verilog-set-define (match-string-no-properties 1) (match-string-no-properties 2) origbuf enumname) 7306 (verilog-set-define (match-string-no-properties 1) (match-string-no-properties 2) origbuf enumname)
@@ -7081,23 +7420,26 @@ Some macros and such are also found and included. For dinotrace.el."
7081 ((or (string-match "^\\+incdir\\+\\(.*\\)" arg) ;; +incdir+dir 7420 ((or (string-match "^\\+incdir\\+\\(.*\\)" arg) ;; +incdir+dir
7082 (string-match "^-I\\(.*\\)" arg)) ;; -Idir 7421 (string-match "^-I\\(.*\\)" arg)) ;; -Idir
7083 (verilog-add-list-unique `verilog-library-directories 7422 (verilog-add-list-unique `verilog-library-directories
7084 (match-string 1 arg))) 7423 (match-string 1 (substitute-in-file-name arg))))
7085 ;; Ignore 7424 ;; Ignore
7086 ((equal "+librescan" arg)) 7425 ((equal "+librescan" arg))
7087 ((string-match "^-U\\(.*\\)" arg)) ;; -Udefine 7426 ((string-match "^-U\\(.*\\)" arg)) ;; -Udefine
7088 ;; Second parameters 7427 ;; Second parameters
7089 ((equal next-param "-f") 7428 ((equal next-param "-f")
7090 (setq next-param nil) 7429 (setq next-param nil)
7091 (verilog-getopt-file arg)) 7430 (verilog-getopt-file (substitute-in-file-name arg)))
7092 ((equal next-param "-v") 7431 ((equal next-param "-v")
7093 (setq next-param nil) 7432 (setq next-param nil)
7094 (verilog-add-list-unique `verilog-library-files arg)) 7433 (verilog-add-list-unique `verilog-library-files
7434 (substitute-in-file-name arg)))
7095 ((equal next-param "-y") 7435 ((equal next-param "-y")
7096 (setq next-param nil) 7436 (setq next-param nil)
7097 (verilog-add-list-unique `verilog-library-directories arg)) 7437 (verilog-add-list-unique `verilog-library-directories
7438 (substitute-in-file-name arg)))
7098 ;; Filename 7439 ;; Filename
7099 ((string-match "^[^-+]" arg) 7440 ((string-match "^[^-+]" arg)
7100 (verilog-add-list-unique `verilog-library-files arg)) 7441 (verilog-add-list-unique `verilog-library-files
7442 (substitute-in-file-name arg)))
7101 ;; Default - ignore; no warning 7443 ;; Default - ignore; no warning
7102 )))) 7444 ))))
7103;;(verilog-getopt (list "+libext+.a+.b" "+incdir+foodir" "+define+a+aval" "-f" "otherf" "-v" "library" "-y" "dir")) 7445;;(verilog-getopt (list "+libext+.a+.b" "+incdir+foodir" "+define+a+aval" "-f" "otherf" "-v" "library" "-y" "dir"))
@@ -7279,7 +7621,7 @@ If the variable vh-{symbol} is defined, substitute that value."
7279 (let ((ok t) symbol val) 7621 (let ((ok t) symbol val)
7280 (while (and ok (string-match "`\\([a-zA-Z0-9_]+\\)" text)) 7622 (while (and ok (string-match "`\\([a-zA-Z0-9_]+\\)" text))
7281 (setq symbol (match-string 1 text)) 7623 (setq symbol (match-string 1 text))
7282 (message symbol) 7624 ;;(message symbol)
7283 (cond ((and 7625 (cond ((and
7284 (boundp (intern (concat "vh-" symbol))) 7626 (boundp (intern (concat "vh-" symbol)))
7285 ;; Emacs has a bug where boundp on a buffer-local 7627 ;; Emacs has a bug where boundp on a buffer-local
@@ -7571,7 +7913,7 @@ and invalidating the cache."
7571 7913
7572(defun verilog-signals-matching-regexp (in-list regexp) 7914(defun verilog-signals-matching-regexp (in-list regexp)
7573 "Return all signals in IN-LIST matching the given REGEXP, if non-nil." 7915 "Return all signals in IN-LIST matching the given REGEXP, if non-nil."
7574 (if (not regexp) 7916 (if (or (not regexp) (equal regexp ""))
7575 in-list 7917 in-list
7576 (let (out-list) 7918 (let (out-list)
7577 (while in-list 7919 (while in-list
@@ -7582,7 +7924,7 @@ and invalidating the cache."
7582 7924
7583(defun verilog-signals-not-matching-regexp (in-list regexp) 7925(defun verilog-signals-not-matching-regexp (in-list regexp)
7584 "Return all signals in IN-LIST not matching the given REGEXP, if non-nil." 7926 "Return all signals in IN-LIST not matching the given REGEXP, if non-nil."
7585 (if (not regexp) 7927 (if (or (not regexp) (equal regexp ""))
7586 in-list 7928 in-list
7587 (let (out-list) 7929 (let (out-list)
7588 (while in-list 7930 (while in-list
@@ -7591,6 +7933,24 @@ and invalidating the cache."
7591 (setq in-list (cdr in-list))) 7933 (setq in-list (cdr in-list)))
7592 (nreverse out-list)))) 7934 (nreverse out-list))))
7593 7935
7936(defun verilog-signals-matching-dir-re (in-list decl-type regexp)
7937 "Return all signals in IN-LIST matching the given directional REGEXP,
7938if non-nil."
7939 (if (or (not regexp) (equal regexp ""))
7940 in-list
7941 (let (out-list to-match)
7942 (while in-list
7943 ;; Note verilog-insert-one-definition matches on this order
7944 (setq to-match (concat
7945 decl-type
7946 " " (verilog-sig-signed (car in-list))
7947 " " (verilog-sig-multidim (car in-list))
7948 (verilog-sig-bits (car in-list))))
7949 (if (string-match regexp to-match)
7950 (setq out-list (cons (car in-list) out-list)))
7951 (setq in-list (cdr in-list)))
7952 (nreverse out-list))))
7953
7594;; Combined 7954;; Combined
7595(defun verilog-decls-get-signals (decls) 7955(defun verilog-decls-get-signals (decls)
7596 (append 7956 (append
@@ -7639,7 +7999,10 @@ and invalidating the cache."
7639 "Print out a definition for SIG of the given TYPE, 7999 "Print out a definition for SIG of the given TYPE,
7640with appropriate INDENT-PT indentation." 8000with appropriate INDENT-PT indentation."
7641 (indent-to indent-pt) 8001 (indent-to indent-pt)
8002 ;; Note verilog-signals-matching-dir-re matches on this order
7642 (insert type) 8003 (insert type)
8004 (when (verilog-sig-modport sig)
8005 (insert "." (verilog-sig-modport sig)))
7643 (when (verilog-sig-signed sig) 8006 (when (verilog-sig-signed sig)
7644 (insert " " (verilog-sig-signed sig))) 8007 (insert " " (verilog-sig-signed sig)))
7645 (when (verilog-sig-multidim sig) 8008 (when (verilog-sig-multidim sig)
@@ -7664,7 +8027,7 @@ format. Sort unless DONT-SORT. DIRECTION is normally wire/reg/output."
7664 ;; Want "type x" or "output type x", not "wire type x" 8027 ;; Want "type x" or "output type x", not "wire type x"
7665 (cond ((verilog-sig-type sig) 8028 (cond ((verilog-sig-type sig)
7666 (concat 8029 (concat
7667 (if (not (equal direction "wire")) 8030 (if (not (member direction '("wire" "interface")))
7668 (concat direction " ")) 8031 (concat direction " "))
7669 (verilog-sig-type sig))) 8032 (verilog-sig-type sig)))
7670 (t direction)) 8033 (t direction))
@@ -7694,16 +8057,19 @@ Presumes that any newlines end a list element."
7694;;(let ((indent-pt 10)) (verilog-insert-indent "hello\n" "addon" "there\n")) 8057;;(let ((indent-pt 10)) (verilog-insert-indent "hello\n" "addon" "there\n"))
7695 8058
7696(defun verilog-repair-open-comma () 8059(defun verilog-repair-open-comma ()
7697 "If backwards-from-point is other than a open parenthesis insert comma." 8060 "Insert comma if previous argument is other than a open parenthesis or endif."
8061 ;; We can't just search backward for ) as it might be inside another expression.
8062 ;; Also want "`ifdef X input foo `endif" to just leave things to the human to deal with
7698 (save-excursion 8063 (save-excursion
7699 (verilog-backward-syntactic-ws) 8064 (verilog-backward-syntactic-ws)
7700 (when (save-excursion 8065 (when (and (not (save-excursion ;; Not beginning (, or existing ,
7701 (backward-char 1) 8066 (backward-char 1)
7702 (and (not (looking-at "[(,]")) 8067 (looking-at "[(,]")))
7703 (progn 8068 (not (save-excursion ;; Not `endif, or user define
7704 (verilog-re-search-backward "[(`]" nil t) 8069 (backward-char 1)
7705 (looking-at "(")))) 8070 (skip-chars-backward "[a-zA-Z0-9_`]")
7706 (insert ",")))) 8071 (looking-at "`"))))
8072 (insert ","))))
7707 8073
7708(defun verilog-repair-close-comma () 8074(defun verilog-repair-close-comma ()
7709 "If point is at a comma followed by a close parenthesis, fix it. 8075 "If point is at a comma followed by a close parenthesis, fix it.
@@ -7740,11 +8106,16 @@ This repairs those mis-inserted by a AUTOARG."
7740 (setq range-exp (match-string 1 range-exp))) 8106 (setq range-exp (match-string 1 range-exp)))
7741 (cond ((not range-exp) 8107 (cond ((not range-exp)
7742 "1") 8108 "1")
8109 ;; [#:#] We can compute a numeric result
7743 ((string-match "^\\s *\\([0-9]+\\)\\s *:\\s *\\([0-9]+\\)\\s *$" 8110 ((string-match "^\\s *\\([0-9]+\\)\\s *:\\s *\\([0-9]+\\)\\s *$"
7744 range-exp) 8111 range-exp)
7745 (int-to-string 8112 (int-to-string
7746 (1+ (abs (- (string-to-number (match-string 1 range-exp)) 8113 (1+ (abs (- (string-to-number (match-string 1 range-exp))
7747 (string-to-number (match-string 2 range-exp))))))) 8114 (string-to-number (match-string 2 range-exp)))))))
8115 ;; [PARAM-1:0] can just return PARAM
8116 ((string-match "^\\s *\\([a-zA-Z_][a-zA-Z0-9_]*\\)\\s *-\\s *1\\s *:\\s *0\\s *$" range-exp)
8117 (match-string 1 range-exp))
8118 ;; [arbitrary] need math
7748 ((string-match "^\\(.*\\)\\s *:\\s *\\(.*\\)\\s *$" range-exp) 8119 ((string-match "^\\(.*\\)\\s *:\\s *\\(.*\\)\\s *$" range-exp)
7749 (concat "(1+(" (match-string 1 range-exp) ")" 8120 (concat "(1+(" (match-string 1 range-exp) ")"
7750 (if (equal "0" (match-string 2 range-exp)) 8121 (if (equal "0" (match-string 2 range-exp))
@@ -7763,12 +8134,12 @@ This repairs those mis-inserted by a AUTOARG."
7763 (while (string-match "(\\<\\([0-9A-Z-az_]+\\)\\>)" out) 8134 (while (string-match "(\\<\\([0-9A-Z-az_]+\\)\\>)" out)
7764 (setq out (replace-match "\\1" nil nil out))) 8135 (setq out (replace-match "\\1" nil nil out)))
7765 (while (string-match "\\<\\([0-9]+\\)\\>\\s *\\+\\s *\\<\\([0-9]+\\)\\>" out) 8136 (while (string-match "\\<\\([0-9]+\\)\\>\\s *\\+\\s *\\<\\([0-9]+\\)\\>" out)
7766 (setq out (replace-match 8137 (setq out (replace-match
7767 (int-to-string (+ (string-to-number (match-string 1 out)) 8138 (int-to-string (+ (string-to-number (match-string 1 out))
7768 (string-to-number (match-string 2 out)))) 8139 (string-to-number (match-string 2 out))))
7769 nil nil out))) 8140 nil nil out)))
7770 (while (string-match "\\<\\([0-9]+\\)\\>\\s *\\-\\s *\\<\\([0-9]+\\)\\>" out) 8141 (while (string-match "\\<\\([0-9]+\\)\\>\\s *\\-\\s *\\<\\([0-9]+\\)\\>" out)
7771 (setq out (replace-match 8142 (setq out (replace-match
7772 (int-to-string (- (string-to-number (match-string 1 out)) 8143 (int-to-string (- (string-to-number (match-string 1 out))
7773 (string-to-number (match-string 2 out)))) 8144 (string-to-number (match-string 2 out))))
7774 nil nil out)))) 8145 nil nil out))))
@@ -7915,10 +8286,11 @@ called before and after this function, respectively."
7915 (verilog-regexp-words 8286 (verilog-regexp-words
7916 `("AUTOASCIIENUM" "AUTOCONCATCOMMENT" "AUTODEFINEVALUE" 8287 `("AUTOASCIIENUM" "AUTOCONCATCOMMENT" "AUTODEFINEVALUE"
7917 "AUTOINOUT" "AUTOINOUTCOMP" "AUTOINOUTMODULE" 8288 "AUTOINOUT" "AUTOINOUTCOMP" "AUTOINOUTMODULE"
7918 "AUTOINPUT" "AUTOOUTPUT" "AUTOOUTPUTEVERY" 8289 "AUTOINPUT" "AUTOINSERTLISP" "AUTOOUTPUT" "AUTOOUTPUTEVERY"
7919 "AUTOREG" "AUTOREGINPUT" "AUTORESET" "AUTOTIEOFF" 8290 "AUTOREG" "AUTOREGINPUT" "AUTORESET" "AUTOTIEOFF"
7920 "AUTOUNUSED" "AUTOWIRE"))) 8291 "AUTOUNUSED" "AUTOWIRE")))
7921 "\\(\\|([^)]*)\\|(\"[^\"]*\")\\)" ; Optional parens or quoted parameter 8292 ;; Optional parens or quoted parameter or .* for (((...)))
8293 "\\(\\|([^)]*)\\|(\"[^\"]*\")\\|.*?\\)"
7922 "\\*/") 8294 "\\*/")
7923 'verilog-delete-autos-lined) 8295 'verilog-delete-autos-lined)
7924 ;; Remove those that are in parenthesis 8296 ;; Remove those that are in parenthesis
@@ -8106,7 +8478,8 @@ If FORCE, always reread it."
8106 (let ((curlocal (verilog-auto-read-locals))) 8478 (let ((curlocal (verilog-auto-read-locals)))
8107 (when (or force (not (equal verilog-auto-last-file-locals curlocal))) 8479 (when (or force (not (equal verilog-auto-last-file-locals curlocal)))
8108 (setq verilog-auto-last-file-locals curlocal) 8480 (setq verilog-auto-last-file-locals curlocal)
8109 ;; Note this may cause this function to be recursively invoked. 8481 ;; Note this may cause this function to be recursively invoked,
8482 ;; because hack-local-variables may call (verilog-mode)
8110 ;; The above when statement will prevent it from recursing forever. 8483 ;; The above when statement will prevent it from recursing forever.
8111 (hack-local-variables) 8484 (hack-local-variables)
8112 t))) 8485 t)))
@@ -8119,6 +8492,8 @@ If FORCE, always reread it."
8119 "Print a list of ports for a AUTOINST. 8492 "Print a list of ports for a AUTOINST.
8120Takes SIGS list, adds MESSAGE to front and inserts each at INDENT-PT." 8493Takes SIGS list, adds MESSAGE to front and inserts each at INDENT-PT."
8121 (when sigs 8494 (when sigs
8495 (when verilog-auto-arg-sort
8496 (setq sigs (sort (copy-alist sigs) `verilog-signals-sort-compare)))
8122 (insert "\n") 8497 (insert "\n")
8123 (indent-to indent-pt) 8498 (indent-to indent-pt)
8124 (insert message) 8499 (insert message)
@@ -8167,6 +8542,10 @@ Typing \\[verilog-auto] will make this into:
8167 output o; 8542 output o;
8168 endmodule 8543 endmodule
8169 8544
8545The argument declarations may be printed in declaration order to best suit
8546order based instantiations, or alphabetically, based on the
8547`verilog-auto-arg-sort' variable.
8548
8170Any ports declared between the ( and /*AUTOARG*/ are presumed to be 8549Any ports declared between the ( and /*AUTOARG*/ are presumed to be
8171predeclared and are not redeclared by AUTOARG. AUTOARG will make a 8550predeclared and are not redeclared by AUTOARG. AUTOARG will make a
8172conservative guess on adding a comma for the first signal, if you have 8551conservative guess on adding a comma for the first signal, if you have
@@ -8204,6 +8583,7 @@ Avoid declaring ports manually, as it makes code harder to maintain."
8204 8583
8205(defvar vl-cell-type nil "See `verilog-auto-inst'.") ; Prevent compile warning 8584(defvar vl-cell-type nil "See `verilog-auto-inst'.") ; Prevent compile warning
8206(defvar vl-cell-name nil "See `verilog-auto-inst'.") ; Prevent compile warning 8585(defvar vl-cell-name nil "See `verilog-auto-inst'.") ; Prevent compile warning
8586(defvar vl-modport nil "See `verilog-auto-inst'.") ; Prevent compile warning
8207(defvar vl-name nil "See `verilog-auto-inst'.") ; Prevent compile warning 8587(defvar vl-name nil "See `verilog-auto-inst'.") ; Prevent compile warning
8208(defvar vl-width nil "See `verilog-auto-inst'.") ; Prevent compile warning 8588(defvar vl-width nil "See `verilog-auto-inst'.") ; Prevent compile warning
8209(defvar vl-dir nil "See `verilog-auto-inst'.") ; Prevent compile warning 8589(defvar vl-dir nil "See `verilog-auto-inst'.") ; Prevent compile warning
@@ -8221,6 +8601,7 @@ If PAR-VALUES replace final strings with these parameter values."
8221 ;; vl-* are documented for user use 8601 ;; vl-* are documented for user use
8222 (vl-name (verilog-sig-name port-st)) 8602 (vl-name (verilog-sig-name port-st))
8223 (vl-width (verilog-sig-width port-st)) 8603 (vl-width (verilog-sig-width port-st))
8604 (vl-modport (verilog-sig-modport port-st))
8224 (vl-bits (if (or verilog-auto-inst-vector 8605 (vl-bits (if (or verilog-auto-inst-vector
8225 (not (assoc port vector-skip-list)) 8606 (not (assoc port vector-skip-list))
8226 (not (equal (verilog-sig-bits port-st) 8607 (not (equal (verilog-sig-bits port-st)
@@ -8241,10 +8622,12 @@ If PAR-VALUES replace final strings with these parameter values."
8241 check-values (cdr check-values))) 8622 check-values (cdr check-values)))
8242 (setq vl-bits (verilog-simplify-range-expression vl-bits))) ; Not in the loop for speed 8623 (setq vl-bits (verilog-simplify-range-expression vl-bits))) ; Not in the loop for speed
8243 ;; Default net value if not found 8624 ;; Default net value if not found
8244 (setq tpl-net (if (verilog-sig-multidim port-st) 8625 (setq tpl-net (concat port
8245 (concat port "/*" (verilog-sig-multidim-string port-st) 8626 (if vl-modport (concat "." vl-modport) "")
8246 vl-bits "*/") 8627 (if (verilog-sig-multidim port-st)
8247 (concat port vl-bits))) 8628 (concat "/*" (verilog-sig-multidim-string port-st)
8629 vl-bits "*/")
8630 (concat vl-bits))))
8248 ;; Find template 8631 ;; Find template
8249 (cond (tpl-ass ; Template of exact port name 8632 (cond (tpl-ass ; Template of exact port name
8250 (setq tpl-net (nth 1 tpl-ass))) 8633 (setq tpl-net (nth 1 tpl-ass)))
@@ -8566,7 +8949,8 @@ Lisp Templates:
8566 vl-bits Bus bits portion of the input/output port ('[2:0]'). 8949 vl-bits Bus bits portion of the input/output port ('[2:0]').
8567 vl-width Width of the input/output port ('3' for [2:0]). 8950 vl-width Width of the input/output port ('3' for [2:0]).
8568 May be a (...) expression if bits isn't a constant. 8951 May be a (...) expression if bits isn't a constant.
8569 vl-dir Direction of the pin input/output/inout. 8952 vl-dir Direction of the pin input/output/inout/interface.
8953 vl-modport The modport, if an interface with a modport.
8570 vl-cell-type Module name/type of the cell ('InstModule'). 8954 vl-cell-type Module name/type of the cell ('InstModule').
8571 vl-cell-name Instance name of the cell ('instName'). 8955 vl-cell-name Instance name of the cell ('instName').
8572 8956
@@ -8579,6 +8963,8 @@ Lisp Templates:
8579 will evaluate any Lisp expression inside the parenthesis between the 8963 will evaluate any Lisp expression inside the parenthesis between the
8580 beginning of the buffer and the point of the AUTOINST. This allows 8964 beginning of the buffer and the point of the AUTOINST. This allows
8581 functions to be defined or variables to be changed between instantiations. 8965 functions to be defined or variables to be changed between instantiations.
8966 (See also `verilog-auto-insert-lisp' if you want the output from your
8967 lisp function to be inserted.)
8582 8968
8583 Note that when using lisp expressions errors may occur when @ is not a 8969 Note that when using lisp expressions errors may occur when @ is not a
8584 number; you may need to use the standard Emacs Lisp functions 8970 number; you may need to use the standard Emacs Lisp functions
@@ -8629,13 +9015,25 @@ Lisp Templates:
8629 tpl-list (aref tpl-info 1))) 9015 tpl-list (aref tpl-info 1)))
8630 ;; Find submodule's signals and dump 9016 ;; Find submodule's signals and dump
8631 (let ((sig-list (verilog-signals-not-in 9017 (let ((sig-list (verilog-signals-not-in
9018 (verilog-decls-get-interfaces submoddecls)
9019 skip-pins))
9020 (vl-dir "interface"))
9021 (when sig-list
9022 (when (not did-first) (verilog-auto-inst-first) (setq did-first t))
9023 (indent-to indent-pt)
9024 ;; Note these are searched for in verilog-read-sub-decls.
9025 (insert "// Interfaces\n")
9026 (mapc (lambda (port)
9027 (verilog-auto-inst-port port indent-pt
9028 tpl-list tpl-num for-star par-values))
9029 sig-list)))
9030 (let ((sig-list (verilog-signals-not-in
8632 (verilog-decls-get-outputs submoddecls) 9031 (verilog-decls-get-outputs submoddecls)
8633 skip-pins)) 9032 skip-pins))
8634 (vl-dir "output")) 9033 (vl-dir "output"))
8635 (when sig-list 9034 (when sig-list
8636 (when (not did-first) (verilog-auto-inst-first) (setq did-first t)) 9035 (when (not did-first) (verilog-auto-inst-first) (setq did-first t))
8637 (indent-to indent-pt) 9036 (indent-to indent-pt)
8638 ;; Note these are searched for in verilog-read-sub-decls.
8639 (insert "// Outputs\n") 9037 (insert "// Outputs\n")
8640 (mapc (lambda (port) 9038 (mapc (lambda (port)
8641 (verilog-auto-inst-port port indent-pt 9039 (verilog-auto-inst-port port indent-pt
@@ -8957,7 +9355,7 @@ Typing \\[verilog-auto] will make this into:
8957 (setq pnt (point)) 9355 (setq pnt (point))
8958 (verilog-pretty-declarations quiet) 9356 (verilog-pretty-declarations quiet)
8959 (goto-char pnt) 9357 (goto-char pnt)
8960 (verilog-pretty-expr "//")))))) 9358 (verilog-pretty-expr t "//"))))))
8961 9359
8962(defun verilog-auto-output (&optional with-params) 9360(defun verilog-auto-output (&optional with-params)
8963 "Expand AUTOOUTPUT statements, as part of \\[verilog-auto]. 9361 "Expand AUTOOUTPUT statements, as part of \\[verilog-auto].
@@ -9293,11 +9691,25 @@ You may also provide an optional regular expression, in which case only
9293signals matching the regular expression will be included. For example the 9691signals matching the regular expression will be included. For example the
9294same expansion will result from only extracting signals starting with i: 9692same expansion will result from only extracting signals starting with i:
9295 9693
9296 /*AUTOINOUTMODULE(\"ExampMain\",\"^i\")*/" 9694 /*AUTOINOUTMODULE(\"ExampMain\",\"^i\")*/
9695
9696You may also provide an optional second regulat expression, in
9697which case only signals which have that pin direction and data
9698type will be included. This matches against everything before
9699the signal name in the declaration, for example against
9700\"input\" (single bit), \"output logic\" (direction and type) or
9701\"output [1:0]\" (direction and implicit type). You also
9702probably want to skip spaces in your regexp.
9703
9704For example, the below will result in matching the output \"o\"
9705against the previous example's module:
9706
9707 /*AUTOINOUTMODULE(\"ExampMain\",\"\",\"^output.*\")*/"
9297 (save-excursion 9708 (save-excursion
9298 (let* ((params (verilog-read-auto-params 1 2)) 9709 (let* ((params (verilog-read-auto-params 1 3))
9299 (submod (nth 0 params)) 9710 (submod (nth 0 params))
9300 (regexp (nth 1 params)) 9711 (regexp (nth 1 params))
9712 (direction-re (nth 2 params))
9301 submodi) 9713 submodi)
9302 ;; Lookup position, etc of co-module 9714 ;; Lookup position, etc of co-module
9303 ;; Note this may raise an error 9715 ;; Note this may raise an error
@@ -9319,15 +9731,23 @@ same expansion will result from only extracting signals starting with i:
9319 (append (verilog-decls-get-outputs moddecls)))) 9731 (append (verilog-decls-get-outputs moddecls))))
9320 (sig-list-io (verilog-signals-not-in 9732 (sig-list-io (verilog-signals-not-in
9321 (verilog-decls-get-inouts submoddecls) 9733 (verilog-decls-get-inouts submoddecls)
9322 (append (verilog-decls-get-inouts moddecls))))) 9734 (append (verilog-decls-get-inouts moddecls))))
9735 (sig-list-if (verilog-signals-not-in
9736 (verilog-decls-get-interfaces submoddecls)
9737 (append (verilog-decls-get-interfaces moddecls)))))
9323 (forward-line 1) 9738 (forward-line 1)
9324 (when regexp 9739 (setq sig-list-i (verilog-signals-matching-dir-re
9325 (setq sig-list-i (verilog-signals-matching-regexp 9740 (verilog-signals-matching-regexp sig-list-i regexp)
9326 sig-list-i regexp) 9741 "input" direction-re)
9327 sig-list-o (verilog-signals-matching-regexp 9742 sig-list-o (verilog-signals-matching-dir-re
9328 sig-list-o regexp) 9743 (verilog-signals-matching-regexp sig-list-o regexp)
9329 sig-list-io (verilog-signals-matching-regexp 9744 "output" direction-re)
9330 sig-list-io regexp))) 9745 sig-list-io (verilog-signals-matching-dir-re
9746 (verilog-signals-matching-regexp sig-list-io regexp)
9747 "inout" direction-re)
9748 sig-list-if (verilog-signals-matching-dir-re
9749 (verilog-signals-matching-regexp sig-list-if regexp)
9750 "interface" direction-re))
9331 (when v2k (verilog-repair-open-comma)) 9751 (when v2k (verilog-repair-open-comma))
9332 (when (or sig-list-i sig-list-o sig-list-io) 9752 (when (or sig-list-i sig-list-o sig-list-io)
9333 (verilog-insert-indent "// Beginning of automatic in/out/inouts (from specific module)\n") 9753 (verilog-insert-indent "// Beginning of automatic in/out/inouts (from specific module)\n")
@@ -9335,6 +9755,7 @@ same expansion will result from only extracting signals starting with i:
9335 (verilog-insert-definition sig-list-o "output" indent-pt v2k t) 9755 (verilog-insert-definition sig-list-o "output" indent-pt v2k t)
9336 (verilog-insert-definition sig-list-io "inout" indent-pt v2k t) 9756 (verilog-insert-definition sig-list-io "inout" indent-pt v2k t)
9337 (verilog-insert-definition sig-list-i "input" indent-pt v2k t) 9757 (verilog-insert-definition sig-list-i "input" indent-pt v2k t)
9758 (verilog-insert-definition sig-list-if "interface" indent-pt v2k t)
9338 (verilog-modi-cache-add-inputs modi sig-list-i) 9759 (verilog-modi-cache-add-inputs modi sig-list-i)
9339 (verilog-modi-cache-add-outputs modi sig-list-o) 9760 (verilog-modi-cache-add-outputs modi sig-list-o)
9340 (verilog-modi-cache-add-inouts modi sig-list-io) 9761 (verilog-modi-cache-add-inouts modi sig-list-io)
@@ -9392,6 +9813,69 @@ same expansion will result from only extracting signals starting with i:
9392 /*AUTOINOUTCOMP(\"ExampMain\",\"^i\")*/" 9813 /*AUTOINOUTCOMP(\"ExampMain\",\"^i\")*/"
9393 (verilog-auto-inout-module t)) 9814 (verilog-auto-inout-module t))
9394 9815
9816(defun verilog-auto-insert-lisp ()
9817 "Expand AUTOINSERTLISP statements, as part of \\[verilog-auto].
9818The Lisp code provided is called, and the Lisp code calls
9819`insert` to insert text into the current file beginning on the
9820line after the AUTOINSERTLISP.
9821
9822See also AUTO_LISP, which takes a Lisp expression and evaluates
9823it during `verilog-auto-inst' but does not insert any text.
9824
9825An example:
9826
9827 module ExampInsertLisp;
9828 /*AUTOINSERTLISP(my-verilog-insert-hello \"world\")*/
9829 endmodule
9830
9831 // For this example we declare the function in the
9832 // module's file itself. Often you'd define it instead
9833 // in a site-start.el or .emacs file.
9834 /*
9835 Local Variables:
9836 eval:
9837 (defun my-verilog-insert-hello (who)
9838 (insert (concat \"initial $write(\\\"hello \" who \"\\\");\\n\")))
9839 End:
9840 */
9841
9842Typing \\[verilog-auto] will call my-verilog-insert-hello and
9843expand the above into:
9844
9845 // Beginning of automatic insert lisp
9846 initial $write(\"hello world\");
9847 // End of automatics
9848
9849You can also call an external program and insert the returned
9850text:
9851
9852 /*AUTOINSERTLISP(insert (shell-command-to-string \"echo //hello\"))*/
9853 // Beginning of automatic insert lisp
9854 //hello
9855 // End of automatics"
9856 (save-excursion
9857 ;; Point is at end of /*AUTO...*/
9858 (let* ((indent-pt (current-indentation))
9859 (cmd-end-pt (save-excursion (search-backward ")")
9860 (forward-char)
9861 (point))) ;; Closing paren
9862 (cmd-beg-pt (save-excursion (goto-char cmd-end-pt)
9863 (backward-sexp 1)
9864 (point))) ;; Beginning paren
9865 (cmd (buffer-substring-no-properties cmd-beg-pt cmd-end-pt)))
9866 (forward-line 1)
9867 (let ((pre-eval-pt (point)))
9868 ;;Debug: (insert cmd)
9869 ;; Don't use eval-region as Xemacs has a bug where it goto-char's begin-pt
9870 (eval (read cmd))
9871 ;; If inserted something add the begin/end blocks
9872 (when (not (equal pre-eval-pt (point)))
9873 (when (not (bolp)) (insert "\n")) ;; If user forgot final newline, add it
9874 (save-excursion
9875 (goto-char pre-eval-pt)
9876 (verilog-insert-indent "// Beginning of automatic insert lisp\n"))
9877 (verilog-insert-indent "// End of automatics\n"))))))
9878
9395(defun verilog-auto-sense-sigs (moddecls presense-sigs) 9879(defun verilog-auto-sense-sigs (moddecls presense-sigs)
9396 "Return list of signals for current AUTOSENSE block." 9880 "Return list of signals for current AUTOSENSE block."
9397 (let* ((sigss (verilog-read-always-signals)) 9881 (let* ((sigss (verilog-read-always-signals))
@@ -9510,7 +9994,8 @@ registers set elsewhere in the always block.
9510Limitations: 9994Limitations:
9511 AUTORESET will not clear memories. 9995 AUTORESET will not clear memories.
9512 9996
9513 AUTORESET uses <= if there are any <= in the block, else it uses =. 9997 AUTORESET uses <= if there are any <= assigmnents in the block,
9998 else it uses =.
9514 9999
9515/*AUTORESET*/ presumes that any signals mentioned between the previous 10000/*AUTORESET*/ presumes that any signals mentioned between the previous
9516begin/case/if statement and the AUTORESET comment are being reset manually 10001begin/case/if statement and the AUTORESET comment are being reset manually
@@ -9770,6 +10255,10 @@ doesn't care.
9770Finally, a AUTOASCIIENUM command is used. 10255Finally, a AUTOASCIIENUM command is used.
9771 10256
9772 The first parameter is the name of the signal to be decoded. 10257 The first parameter is the name of the signal to be decoded.
10258 If and only if the first parameter width is 2^(number of states
10259 in enum) and does NOT match the width of the enum, the signal
10260 is assumed to be a one hot decode. Otherwise, it's a normal
10261 encoded state vector.
9773 10262
9774 The second parameter is the name to store the ASCII code into. For the 10263 The second parameter is the name to store the ASCII code into. For the
9775 signal foo, I suggest the name _foo__ascii, where the leading _ indicates 10264 signal foo, I suggest the name _foo__ascii, where the leading _ indicates
@@ -9787,12 +10276,10 @@ An example:
9787 SM_SEND = 3'b001, 10276 SM_SEND = 3'b001,
9788 SM_WAIT1 = 3'b010; 10277 SM_WAIT1 = 3'b010;
9789 //== State variables 10278 //== State variables
9790 reg [2:0] /* synopsys enum state_info */ 10279 reg [2:0] /* synopsys enum state_info */
9791 state_r; /* synopsys state_vector state_r */ 10280 state_r; /* synopsys state_vector state_r */
9792 reg [2:0] /* synopsys enum state_info */ 10281 reg [2:0] /* synopsys enum state_info */
9793 state_e1; 10282 state_e1;
9794
9795 //== ASCII state decoding
9796 10283
9797 /*AUTOASCIIENUM(\"state_r\", \"state_ascii_r\", \"SM_\")*/ 10284 /*AUTOASCIIENUM(\"state_r\", \"state_ascii_r\", \"SM_\")*/
9798 10285
@@ -9835,10 +10322,19 @@ Typing \\[verilog-auto] will make this into:
9835 (undecode-enum (or (verilog-sig-enum undecode-sig) 10322 (undecode-enum (or (verilog-sig-enum undecode-sig)
9836 (error "%s: Signal %s does not have a enum tag" (verilog-point-text) undecode-name))) 10323 (error "%s: Signal %s does not have a enum tag" (verilog-point-text) undecode-name)))
9837 ;; 10324 ;;
9838 (enum-sigs (or (verilog-signals-matching-enum sig-list-consts undecode-enum) 10325 (enum-sigs (verilog-signals-not-in
9839 (error "%s: No state definitions for %s" (verilog-point-text) undecode-enum))) 10326 (or (verilog-signals-matching-enum sig-list-consts undecode-enum)
10327 (error "%s: No state definitions for %s" (verilog-point-text) undecode-enum))
10328 nil))
9840 ;; 10329 ;;
9841 (enum-chars 0) 10330 (one-hot (and ;; width(enum) != width(sig)
10331 (or (not (verilog-sig-bits (car enum-sigs)))
10332 (not (equal (verilog-sig-width (car enum-sigs))
10333 (verilog-sig-width undecode-sig))))
10334 ;; count(enums) == width(sig)
10335 (equal (number-to-string (length enum-sigs))
10336 (verilog-sig-width undecode-sig))))
10337 (enum-chars 0)
9842 (ascii-chars 0)) 10338 (ascii-chars 0))
9843 ;; 10339 ;;
9844 ;; Find number of ascii chars needed 10340 ;; Find number of ascii chars needed
@@ -9864,14 +10360,23 @@ Typing \\[verilog-auto] will make this into:
9864 (setq indent-pt (+ indent-pt verilog-case-indent)) 10360 (setq indent-pt (+ indent-pt verilog-case-indent))
9865 ;; 10361 ;;
9866 (let ((tmp-sigs enum-sigs) 10362 (let ((tmp-sigs enum-sigs)
9867 (chrfmt (format "%%-%ds %s = \"%%-%ds\";\n" (1+ (max 8 enum-chars)) 10363 (chrfmt (format "%%-%ds %s = \"%%-%ds\";\n"
10364 (+ (if one-hot 9 1) (max 8 enum-chars))
9868 ascii-name ascii-chars)) 10365 ascii-name ascii-chars))
9869 (errname (substring "%Error" 0 (min 6 ascii-chars)))) 10366 (errname (substring "%Error" 0 (min 6 ascii-chars))))
9870 (while tmp-sigs 10367 (while tmp-sigs
9871 (verilog-insert-indent 10368 (verilog-insert-indent
9872 (format chrfmt (concat (verilog-sig-name (car tmp-sigs)) ":") 10369 (concat
9873 (verilog-enum-ascii (verilog-sig-name (car tmp-sigs)) 10370 (format chrfmt
9874 elim-regexp))) 10371 (concat (if one-hot "(")
10372 (if one-hot (verilog-sig-width undecode-sig))
10373 ;; We use a shift instead of var[index]
10374 ;; so that a non-one hot value will show as error.
10375 (if one-hot "'b1<<")
10376 (verilog-sig-name (car tmp-sigs))
10377 (if one-hot ")") ":")
10378 (verilog-enum-ascii (verilog-sig-name (car tmp-sigs))
10379 elim-regexp))))
9875 (setq tmp-sigs (cdr tmp-sigs))) 10380 (setq tmp-sigs (cdr tmp-sigs)))
9876 (verilog-insert-indent (format chrfmt "default:" errname))) 10381 (verilog-insert-indent (format chrfmt "default:" errname)))
9877 ;; 10382 ;;
@@ -9946,6 +10451,7 @@ Using \\[describe-function], see also:
9946 `verilog-auto-inout-module' for AUTOINOUTMODULE copying i/o from elsewhere 10451 `verilog-auto-inout-module' for AUTOINOUTMODULE copying i/o from elsewhere
9947 `verilog-auto-inout' for AUTOINOUT making hierarchy inouts 10452 `verilog-auto-inout' for AUTOINOUT making hierarchy inouts
9948 `verilog-auto-input' for AUTOINPUT making hierarchy inputs 10453 `verilog-auto-input' for AUTOINPUT making hierarchy inputs
10454 `verilog-auto-insert-lisp' for AUTOINSERTLISP insert code from lisp function
9949 `verilog-auto-inst' for AUTOINST instantiation pins 10455 `verilog-auto-inst' for AUTOINST instantiation pins
9950 `verilog-auto-star' for AUTOINST .* SystemVerilog pins 10456 `verilog-auto-star' for AUTOINST .* SystemVerilog pins
9951 `verilog-auto-inst-param' for AUTOINSTPARAM instantiation params 10457 `verilog-auto-inst-param' for AUTOINSTPARAM instantiation params
@@ -9962,8 +10468,9 @@ Using \\[describe-function], see also:
9962 `verilog-read-defines' for reading `define values 10468 `verilog-read-defines' for reading `define values
9963 `verilog-read-includes' for reading `includes 10469 `verilog-read-includes' for reading `includes
9964 10470
9965If you have bugs with these autos, try contacting the AUTOAUTHOR 10471If you have bugs with these autos, please file an issue at
9966Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.org." 10472http://www.veripool.org/verilog-mode or contact the AUTOAUTHOR
10473Wilson Snyder (wsnyder@wsnyder.org)."
9967 (interactive) 10474 (interactive)
9968 (unless noninteractive (message "Updating AUTOs...")) 10475 (unless noninteractive (message "Updating AUTOs..."))
9969 (if (fboundp 'dinotrace-unannotate-all) 10476 (if (fboundp 'dinotrace-unannotate-all)
@@ -10006,6 +10513,11 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.org."
10006 (verilog-inject-sense) 10513 (verilog-inject-sense)
10007 (verilog-inject-arg)) 10514 (verilog-inject-arg))
10008 ;; 10515 ;;
10516 ;; Do user inserts first, so their code can insert AUTOs
10517 ;; We may provide a AUTOINSERTLISPLAST if another cleanup pass is needed
10518 (verilog-auto-re-search-do "/\\*AUTOINSERTLISP(.*?)\\*/"
10519 'verilog-auto-insert-lisp)
10520 ;; Expand instances before need the signals the instances input/output
10009 (verilog-auto-re-search-do "/\\*AUTOINSTPARAM\\*/" 'verilog-auto-inst-param) 10521 (verilog-auto-re-search-do "/\\*AUTOINSTPARAM\\*/" 'verilog-auto-inst-param)
10010 (verilog-auto-re-search-do "/\\*AUTOINST\\*/" 'verilog-auto-inst) 10522 (verilog-auto-re-search-do "/\\*AUTOINST\\*/" 'verilog-auto-inst)
10011 (verilog-auto-re-search-do "\\.\\*" 'verilog-auto-star) 10523 (verilog-auto-re-search-do "\\.\\*" 'verilog-auto-star)
@@ -10158,7 +10670,8 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.org."
10158 (if (> (point) verilog-sk-p) "] " " "))) 10670 (if (> (point) verilog-sk-p) "] " " ")))
10159 10671
10160(defun verilog-sk-header () 10672(defun verilog-sk-header ()
10161 "Insert a descriptive header at the top of the file." 10673 "Insert a descriptive header at the top of the file.
10674See also `verilog-header' for an alternative format."
10162 (interactive "*") 10675 (interactive "*")
10163 (save-excursion 10676 (save-excursion
10164 (goto-char (point-min)) 10677 (goto-char (point-min))
@@ -10172,8 +10685,8 @@ Wilson Snyder (wsnyder@wsnyder.org), and/or see http://www.veripool.org."
10172 "\n// Description : " str 10685 "\n// Description : " str
10173 "\n// Author : " (user-full-name) 10686 "\n// Author : " (user-full-name)
10174 "\n// Created On : " (current-time-string) 10687 "\n// Created On : " (current-time-string)
10175 "\n// Last Modified By: ." 10688 "\n// Last Modified By: " (user-full-name)
10176 "\n// Last Modified On: ." 10689 "\n// Last Modified On: " (current-time-string)
10177 "\n// Update Count : 0" 10690 "\n// Update Count : 0"
10178 "\n// Status : Unknown, Use with caution!" 10691 "\n// Status : Unknown, Use with caution!"
10179 "\n") 10692 "\n")
@@ -10269,7 +10782,7 @@ for sensitivity list."
10269and the case items." 10782and the case items."
10270 "[selector expression]: " 10783 "[selector expression]: "
10271 > "case (" str ") " \n 10784 > "case (" str ") " \n
10272 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) 10785 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n > )
10273 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) 10786 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil))
10274 10787
10275(define-skeleton verilog-sk-casex 10788(define-skeleton verilog-sk-casex
@@ -10277,7 +10790,7 @@ and the case items."
10277and the case items." 10790and the case items."
10278 "[selector expression]: " 10791 "[selector expression]: "
10279 > "casex (" str ") " \n 10792 > "casex (" str ") " \n
10280 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) 10793 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n > )
10281 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) 10794 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil))
10282 10795
10283(define-skeleton verilog-sk-casez 10796(define-skeleton verilog-sk-casez
@@ -10285,7 +10798,7 @@ and the case items."
10285and the case items." 10798and the case items."
10286 "[selector expression]: " 10799 "[selector expression]: "
10287 > "casez (" str ") " \n 10800 > "casez (" str ") " \n
10288 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n ) 10801 > ("case selector: " str ": begin" \n > _ \n > (- verilog-indent-level-behavioral) "end" \n > )
10289 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil)) 10802 resume: > (- verilog-case-indent) "endcase" (progn (electric-verilog-terminate-line) nil))
10290 10803
10291(define-skeleton verilog-sk-if 10804(define-skeleton verilog-sk-if