Function: verilog-read-decls
verilog-read-decls is a byte-compiled function defined in
verilog-mode.el.gz.
Signature
(verilog-read-decls)
Documentation
Compute signal declaration information for the current module at point.
Return an array of [outputs inouts inputs wire reg assign const gparam intf].
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/verilog-mode.el.gz
(defun verilog-read-decls ()
"Compute signal declaration information for the current module at point.
Return an array of [outputs inouts inputs wire reg assign const gparam intf]."
(verilog--suppressed-warnings
((lexical sigs-intf sigs-var sigs-const sigs-assign sigs-var
sigs-gparam sigs-inout sigs-out sigs-in))
;; The local variable below are accessed via (symbol-value expect-signal).
(defvar sigs-intf) (defvar sigs-var) (defvar sigs-const)
(defvar sigs-assign) (defvar sigs-var) (defvar sigs-gparam)
(defvar sigs-inout) (defvar sigs-out) (defvar sigs-in))
(let ((end-mod-point (or (verilog-get-end-of-defun) (point-max)))
(functask 0) (paren 0) (sig-paren 0) (v2kargs-ok t)
in-modport in-clocking in-ign-to-semi ptype ign-prop
sigs-in sigs-out sigs-inout sigs-var sigs-assign sigs-const
sigs-gparam sigs-intf sigs-modports
vec expect-signal keywd last-keywd newsig rvalue enum io
signed typedefed multidim
modport
varstack tmp)
;;(if dbg (setq dbg (concat dbg (format "\n\nverilog-read-decls START PT %s END %s\n" (point) end-mod-point))))
(save-excursion
(verilog-beg-of-defun-quick)
(setq sigs-const (verilog-read-auto-constants (point) end-mod-point))
(while (< (point) end-mod-point)
;;(if dbg (setq dbg (concat dbg (format "Pt %s Vec %s C%c Kwd'%s'\n" (point) vec (following-char) keywd))))
(cond
((looking-at "//")
(when (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)")
(setq enum (match-string-no-properties 2)))
(search-forward "\n"))
((looking-at "/\\*")
(forward-char 2)
(when (looking-at "[^\n]*\\(auto\\|synopsys\\)\\s +enum\\s +\\([a-zA-Z0-9_]+\\)")
(setq enum (match-string-no-properties 2)))
(or (search-forward "*/")
(error "%s: Unmatched /* */, at char %d" (verilog-point-text) (point))))
;; Skip over protected sections with Base64-encoded data
((looking-at "^\\s *`pragma\\s +protect\\s +begin_protected")
(or (re-search-forward "^\\s *`pragma\\s +protect\\s +end_protected" nil t)
(forward-line)))
((looking-at "^\\s *`protected\\>")
(or (re-search-forward "^\\s *`endprotected\\>" nil t)
(forward-line)))
((looking-at "(\\*")
;; To advance past either "(*)" or "(* ... *)" don't forward past first *
(forward-char 1)
(or (search-forward "*)")
(error "%s: Unmatched (* *), at char %d" (verilog-point-text) (point))))
((eq ?\" (following-char))
(or (re-search-forward "[^\\]\"" nil t) ; don't forward-char first, since we look for a non backslash first
(error "%s: Unmatched quotes, at char %d" (verilog-point-text) (point))))
((eq ?\; (following-char))
(cond (in-ign-to-semi ; Such as inside a "import ...;" in a module header
(setq in-ign-to-semi nil rvalue nil))
((and in-modport (not (eq in-modport t))) ; end of a modport declaration
(verilog-modport-decls-set
in-modport
(verilog-decls-new sigs-out sigs-inout sigs-in
nil nil nil nil nil nil))
;; Pop from varstack to restore state to pre-clocking
(setq tmp (car varstack)
varstack (cdr varstack)
sigs-out (aref tmp 0)
sigs-inout (aref tmp 1)
sigs-in (aref tmp 2))
(setq vec nil io nil expect-signal nil newsig nil paren 0 rvalue nil
v2kargs-ok nil in-modport nil ign-prop nil))
(t
(setq vec nil io nil expect-signal nil newsig nil paren 0 rvalue nil
v2kargs-ok nil in-modport nil ign-prop nil)))
(forward-char 1))
((eq ?= (following-char))
(setq rvalue t newsig nil)
(forward-char 1))
((and (eq ?, (following-char))
(eq paren sig-paren))
(setq rvalue nil)
(forward-char 1))
;; ,'s can occur inside {} & funcs
((looking-at "[{(]")
(setq paren (1+ paren))
(forward-char 1))
((looking-at "[})]")
(setq paren (1- paren))
(forward-char 1)
(when (< paren sig-paren)
(setq expect-signal nil rvalue nil))) ; ) that ends variables inside v2k arg list
((looking-at "\\[")
(setq keywd (buffer-substring-no-properties
(point)
(progn (forward-sexp 1) (point))))
(cond (newsig ; Memory, not just width. Patch last signal added's memory (nth 3)
(setcar (cdr (cdr (cdr newsig)))
(if (verilog-sig-memory newsig)
(concat (verilog-sig-memory newsig)
keywd)
keywd)))
(vec ; Multidimensional
(setq multidim (cons vec multidim))
(setq vec (verilog-string-replace-matches
"\\s-+" "" nil nil keywd)))
(t ; Bit width
(setq vec (verilog-string-replace-matches
"\\s-+" "" nil nil keywd)))))
;; Normal or escaped identifier -- note we remember the \ if escaped
((looking-at "\\s-*\\([a-zA-Z0-9`_$]+\\|\\\\[^ \t\n\f]+\\)")
(goto-char (match-end 0))
(setq last-keywd keywd
keywd (match-string-no-properties 1))
(when (string-match "^\\\\" (match-string-no-properties 1))
(setq keywd (concat keywd " "))) ; Escaped ID needs space at end
;; Add any :: package names to same identifier
;; '*' here is for "import x::*"
(while (looking-at "\\s-*::\\s-*\\(\\*\\|[a-zA-Z0-9`_$]+\\|\\\\[^ \t\n\f]+\\)")
(goto-char (match-end 0))
(setq keywd (concat keywd "::" (match-string-no-properties 1)))
(when (string-match "^\\\\" (match-string-no-properties 1))
(setq keywd (concat keywd " ")))) ; Escaped ID needs space at end
(cond ((equal keywd "input")
(setq vec nil enum nil rvalue nil newsig nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-in io t sig-paren paren))
((equal keywd "output")
(setq vec nil enum nil rvalue nil newsig nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-out io t sig-paren paren))
((equal keywd "inout")
(setq vec nil enum nil rvalue nil newsig nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-inout io t sig-paren paren))
((equal keywd "parameter")
(setq vec nil enum nil rvalue nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-gparam io t sig-paren paren))
((member keywd '("wire" "reg" ; Fast
;; net_type
"tri" "tri0" "tri1" "triand" "trior" "trireg"
"uwire" "wand" "wor"
;; integer_atom_type
"byte" "shortint" "int" "longint" "integer" "time"
"supply0" "supply1"
;; integer_vector_type - "reg" above
"bit" "logic"
;; non_integer_type
"shortreal" "real" "realtime"
;; data_type
"string" "event" "chandle"))
(cond (io
(setq typedefed
(if typedefed (concat typedefed " " keywd) keywd)))
(t (setq vec nil enum nil rvalue nil signed nil
typedefed nil multidim nil sig-paren paren
expect-signal 'sigs-var modport nil))))
((equal keywd "assign")
(setq vec nil enum nil rvalue nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-assign sig-paren paren))
((member keywd '("localparam" "genvar"))
(setq vec nil enum nil rvalue nil signed nil
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-const sig-paren paren))
((member keywd '("signed" "unsigned"))
(setq signed keywd))
((member keywd '("assert" "assume" "cover" "expect" "restrict"))
(setq ign-prop t))
((member keywd '("class" "covergroup" "function"
"property" "randsequence" "sequence" "task"))
(unless ign-prop
(setq functask (1+ functask))))
((member keywd '("endclass" "endgroup" "endfunction"
"endproperty" "endsequence" "endtask"))
(setq functask (1- functask)))
((equal keywd "modport")
(setq in-modport t))
((and (equal keywd "clocking")
(not (equal last-keywd "default")))
(setq in-clocking t))
((equal keywd "import")
(when v2kargs-ok ; import in module header, not a modport import
(setq in-ign-to-semi t rvalue t)))
((equal keywd "type")
(setq ptype t))
((equal keywd "var"))
;; Ifdef? Ignore name of define
((member keywd '("`ifdef" "`ifndef" "`elsif"))
(setq rvalue t))
;; Line directive? Skip over the rest of the line
((equal keywd "`line")
(forward-line))
;; Type?
((unless ptype
(verilog-typedef-name-p keywd))
(cond (io
(setq typedefed
(if typedefed (concat typedefed " " keywd) keywd)))
(t (setq vec nil enum nil rvalue nil signed nil
typedefed keywd ; Have a type
multidim nil sig-paren paren
expect-signal 'sigs-var modport nil))))
;; Interface with optional modport in v2k arglist?
;; Skip over parsing modport, and take the interface name as the type
((and v2kargs-ok
(eq paren 1)
(not rvalue)
(or (looking-at "\\s-*#")
(looking-at "\\s-*\\(\\.\\(\\s-*[a-zA-Z`_$][a-zA-Z0-9`_$]*\\)\\|\\)\\s-*[a-zA-Z`_$][a-zA-Z0-9`_$]*")))
(when (match-end 2) (goto-char (match-end 2)))
(setq vec nil enum nil rvalue nil signed nil
typedefed keywd multidim nil ptype nil
modport (match-string-no-properties 2)
newsig nil sig-paren paren
expect-signal 'sigs-intf io t ))
;; Ignore dotted LHS assignments: "assign foo.bar = z;"
((looking-at "\\s-*\\.")
(goto-char (match-end 0))
(when (not rvalue)
(setq expect-signal nil)))
;; "modport <keywd>"
((and (eq in-modport t)
(not (member keywd verilog-keywords)))
(setq in-modport (verilog-modport-new keywd nil nil))
(setq sigs-modports (cons in-modport sigs-modports))
;; Push old sig values to stack and point to new signal list
(setq varstack (cons (vector sigs-out sigs-inout sigs-in)
varstack))
(setq sigs-in nil sigs-inout nil sigs-out nil))
;; "modport x (clocking <keywd>)"
((and in-modport in-clocking)
(verilog-modport-clockings-add in-modport keywd)
(setq in-clocking nil))
;; endclocking
((and in-clocking
(equal keywd "endclocking"))
(unless (eq in-clocking t)
(verilog-modport-decls-set
in-clocking
(verilog-decls-new sigs-out sigs-inout sigs-in
nil nil nil nil nil nil))
;; Pop from varstack to restore state to pre-clocking
(setq tmp (car varstack)
varstack (cdr varstack)
sigs-out (aref tmp 0)
sigs-inout (aref tmp 1)
sigs-in (aref tmp 2)))
(setq in-clocking nil))
;; "clocking <keywd>"
((and (eq in-clocking t)
(not (member keywd verilog-keywords)))
(setq in-clocking (verilog-modport-new keywd nil nil))
(setq sigs-modports (cons in-clocking sigs-modports))
;; Push old sig values to stack and point to new signal list
(setq varstack (cons (vector sigs-out sigs-inout sigs-in)
varstack))
(setq sigs-in nil sigs-inout nil sigs-out nil))
;; New signal, maybe?
((and expect-signal
(not rvalue)
(eq functask 0)
(not (member keywd verilog-keywords))
(or (not io) (eq paren sig-paren)))
;; Add new signal to expect-signal's variable
;;(if dbg (setq dbg (concat dbg (format "Pt %s New sig %s'\n" (point) keywd))))
(setq newsig (verilog-sig-new keywd vec nil nil enum signed typedefed multidim modport))
(set expect-signal (cons newsig
(symbol-value expect-signal))))))
(t
(forward-char 1)))
(skip-syntax-forward " "))
;; Return arguments
(setq tmp (verilog-decls-new (nreverse sigs-out)
(nreverse sigs-inout)
(nreverse sigs-in)
(nreverse sigs-var)
(nreverse sigs-modports)
(nreverse sigs-assign)
(nreverse sigs-const)
(nreverse sigs-gparam)
(nreverse sigs-intf)))
;;(if dbg (verilog-decls-princ tmp))
tmp)))