Function: vhdl-get-visible-signals

vhdl-get-visible-signals is a byte-compiled function defined in vhdl-mode.el.gz.

Signature

(vhdl-get-visible-signals)

Documentation

Get all signals visible in the current block.

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/vhdl-mode.el.gz
(defun vhdl-get-visible-signals ()
  "Get all signals visible in the current block."
  (let (beg end signal-list entity-name file-name)
    (vhdl-prepare-search-2
     ;; get entity name
     (save-excursion
       (unless (and (re-search-backward "^\\(architecture\\s-+\\w+\\s-+of\\s-+\\(\\w+\\)\\|end\\)\\>" nil t)
		    (not (equal "END" (upcase (match-string 1))))
		    (setq entity-name (match-string 2)))
	 (error "ERROR:  Not within an architecture")))
     ;; search for signals declared in entity port clause
     (save-excursion
       (goto-char (point-min))
       (unless (re-search-forward (concat "^entity\\s-+" entity-name "\\>") nil t)
	 (setq file-name
	       (concat (vhdl-replace-string vhdl-entity-file-name entity-name t)
		       "." (file-name-extension (buffer-file-name)))))
       (vhdl-visit-file
	   file-name t
	(vhdl-prepare-search-2
	 (goto-char (point-min))
	 (if (not (re-search-forward (concat "^entity\\s-+" entity-name "\\>") nil t))
	     (error "ERROR:  Entity \"%s\" not found:\n  --> see option `vhdl-entity-file-name'" entity-name)
	   (when (setq beg (vhdl-re-search-forward
			    "\\<port[ \t\n\r\f]*("
			    (save-excursion
			      (re-search-forward "^end\\>" nil t))
			    t))
	     (setq end (save-excursion
			 (backward-char) (forward-sexp) (point)))
	     (vhdl-forward-syntactic-ws)
	     (while (< (point) end)
	       (when (looking-at "signal[ \t\n\r\f]+")
		 (goto-char (match-end 0)))
	       (while (looking-at "\\([a-zA-Z]\\w*\\)[ \t\n\r\f,]+")
		 (setq signal-list
		       (cons (downcase (match-string 1)) signal-list))
		 (goto-char (match-end 0))
		 (vhdl-forward-syntactic-ws))
	       (re-search-forward ";" end 1)
	       (vhdl-forward-syntactic-ws)))))))
     ;; search for signals declared in architecture declarative part
     (save-excursion
       (if (not (and (setq beg (re-search-backward "^\\(architecture\\s-+\\w+\\s-+of\\s-+\\(\\w+\\)\\|end\\)\\>" nil t))
		     (not (equal "END" (upcase (match-string 1))))
		     (setq end (re-search-forward "^begin\\>" nil t))))
	   (error "ERROR:  No architecture declarative part found")
	 ;; scan for all declared signal and alias names
	 (goto-char beg)
	 (while (re-search-forward "^\\s-*\\(\\(signal\\)\\|alias\\)\\>" end t)
	   (when (= 0 (nth 0 (parse-partial-sexp beg (point))))
	     (if (match-string 2)
		 ;; scan signal name
		 (while (looking-at "[ \t\n\r\f,]+\\([a-zA-Z]\\w*\\)")
		   (setq signal-list
			 (cons (downcase (match-string 1)) signal-list))
		   (goto-char (match-end 0)))
	       ;; scan alias name, check is alias of (declared) signal
	       (when (and (looking-at "[ \t\n\r\f]+\\([a-zA-Z]\\w*\\)[^;]*\\<is[ \t\n\r\f]+\\([a-zA-Z]\\w*\\)")
			  (member (downcase (match-string 2)) signal-list))
		 (setq signal-list
		       (cons (downcase (match-string 1)) signal-list))
		 (goto-char (match-end 0))))
	     (setq beg (point))))))
     ;; search for signals declared in surrounding block declarative parts
     (save-excursion
       (while (and (progn (while (and (setq beg (re-search-backward "^\\s-*\\(\\w+\\s-*:\\s-*\\(block\\|\\(for\\|if\\).*\\<generate\\>\\)\\|\\(end\\)\\s-+block\\)\\>" nil t))
				      (match-string 4))
			    (goto-char (match-end 4))
			    (vhdl-backward-sexp)
			    (re-search-backward "^\\s-*\\w+\\s-*:\\s-*\\(block\\|generate\\)\\>" nil t))
			  beg)
		   (setq end (re-search-forward "^\\s-*begin\\>" nil t)))
	 ;; scan for all declared signal names
	 (goto-char beg)
	 (while (re-search-forward "^\\s-*\\(\\(signal\\)\\|alias\\)\\>" end t)
	   (when (= 0 (nth 0 (parse-partial-sexp beg (point))))
	     (if (match-string 2)
		 ;; scan signal name
		 (while (looking-at "[ \t\n,]+\\(\\w+\\)")
		   (setq signal-list
			 (cons (downcase (match-string 1)) signal-list))
		   (goto-char (match-end 0)))
	       ;; scan alias name, check is alias of (declared) signal
	       (when (and (looking-at "[ \t\n]+\\(\\w+\\)[^;]*\\<is[ \t\n]+\\(\\w+\\)")
			  (member (downcase (match-string 2)) signal-list))
		 (setq signal-list
		       (cons (downcase (match-string 1)) signal-list))
		 (goto-char (match-end 0))))))
	 (goto-char beg)))
     signal-list)))