Function: vhdl-compose-components-package

vhdl-compose-components-package is an interactive and byte-compiled function defined in vhdl-mode.el.gz.

Signature

(vhdl-compose-components-package)

Documentation

Generate a package containing component declarations for all entities in the current project/directory.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/vhdl-mode.el.gz
(defun vhdl-compose-components-package ()
  "Generate a package containing component declarations for all entities in the
current project/directory."
  (interactive)
  (vhdl-require-hierarchy-info)
  (let* ((project (vhdl-project-p))
	 (pack-name (vhdl-get-components-package-name))
	 (pack-file-name
	  (concat (vhdl-replace-string vhdl-package-file-name pack-name t)
		  "." (file-name-extension (buffer-file-name))))
	 (ent-alist (vhdl-aget vhdl-entity-alist
			       (or project
				   (abbreviate-file-name default-directory))))
	 (lazy-lock-minimum-size 0)
	 clause-pos component-pos)
    (message "Generating components package \"%s\"..." pack-name)
    ;; open package file
    (when (and (file-exists-p pack-file-name)
	       (not (y-or-n-p (concat "File \"" pack-file-name
				      "\" exists; overwrite? "))))
      (error "ERROR:  Generating components package...aborted"))
    (find-file pack-file-name)
    (erase-buffer)
    ;; insert header
    (if vhdl-compose-include-header
	(progn (vhdl-template-header
		(concat "Components package (generated by Emacs VHDL Mode "
			vhdl-version ")"))
	       (goto-char (point-max)))
      (vhdl-comment-display-line) (insert "\n\n"))
    ;; insert std_logic_1164 package
    (vhdl-template-package-std-logic-1164)
    (insert "\n") (setq clause-pos (point-marker))
    (insert "\n") (vhdl-comment-display-line) (insert "\n\n")
    ;; insert package declaration
    (vhdl-insert-keyword "PACKAGE ") (insert pack-name)
    (vhdl-insert-keyword " IS\n\n")
    (indent-to vhdl-basic-offset) (vhdl-comment-display-line) (insert "\n")
    (indent-to vhdl-basic-offset) (insert "-- Component declarations\n")
    (indent-to vhdl-basic-offset) (vhdl-comment-display-line) (insert "\n\n")
    (indent-to vhdl-basic-offset)
    (setq component-pos (point-marker))
    (insert "\n\n") (vhdl-insert-keyword "END ")
    (unless (vhdl-standard-p '87) (vhdl-insert-keyword "PACKAGE "))
    (insert pack-name ";\n\n")
    ;; insert footer
    (if (and vhdl-compose-include-header (not (equal vhdl-file-footer "")))
	(vhdl-template-footer)
      (vhdl-comment-display-line) (insert "\n"))
    ;; insert component declarations
    (while ent-alist
      (vhdl-visit-file (nth 2 (car ent-alist)) nil
	(goto-char (point-min))
	(forward-line (1- (nth 3 (car ent-alist))))
	(end-of-line)
	(vhdl-port-copy))
      (goto-char component-pos)
      (vhdl-port-paste-component t)
      (when (cdr ent-alist) (insert "\n\n") (indent-to vhdl-basic-offset))
      (setq component-pos (point-marker))
      (goto-char clause-pos)
      (vhdl-port-paste-context-clause pack-name)
      (setq clause-pos (point-marker))
      (setq ent-alist (cdr ent-alist)))
    (goto-char (point-min))
    (save-buffer)
    (message "Generating components package \"%s\"...done\n  File created: \"%s\""
	     pack-name pack-file-name)))