emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/progmodes/vhdl-mode.el


From: Romain Francoise
Subject: [Emacs-diffs] Changes to emacs/lisp/progmodes/vhdl-mode.el
Date: Wed, 31 Aug 2005 15:53:54 -0400

Index: emacs/lisp/progmodes/vhdl-mode.el
diff -c emacs/lisp/progmodes/vhdl-mode.el:1.42 
emacs/lisp/progmodes/vhdl-mode.el:1.43
*** emacs/lisp/progmodes/vhdl-mode.el:1.42      Tue Aug 30 11:18:41 2005
--- emacs/lisp/progmodes/vhdl-mode.el   Wed Aug 31 19:53:52 2005
***************
*** 4,16 ****
  
  ;; Authors:     Reto Zimmermann <address@hidden>
  ;;              Rodney J. Whitby <address@hidden>
! ;; Maintainer:  FSF  (Because Reto Zimmermann seems to have disappeared)
  ;; Keywords:    languages vhdl
  
! (defconst vhdl-version "3.32.12"
    "VHDL Mode version number.")
  
! (defconst vhdl-time-stamp "2003-02-28"
    "VHDL Mode time stamp for last update.")
  
  ;; This file is part of GNU Emacs.
--- 4,17 ----
  
  ;; Authors:     Reto Zimmermann <address@hidden>
  ;;              Rodney J. Whitby <address@hidden>
! ;; Maintainer:  Reto Zimmermann <address@hidden>
  ;; Keywords:    languages vhdl
+ ;; WWW:         http://opensource.ethz.ch/emacs/vhdl-mode.html
  
! (defconst vhdl-version "3.33.6"
    "VHDL Mode version number.")
  
! (defconst vhdl-time-stamp "2005-08-30"
    "VHDL Mode time stamp for last update.")
  
  ;; This file is part of GNU Emacs.
***************
*** 43,48 ****
--- 44,51 ----
  ;;   - Insertion of file headers
  ;;   - Insertion of user-specified models
  ;;   - Port translation / testbench generation
+ ;;   - Structural composition
+ ;;   - Configuration generation
  ;;   - Sensitivity list updating
  ;;   - File browser
  ;;   - Design hierarchy browser
***************
*** 126,132 ****
    "Non-nil if XEmacs is used.")
  ;; Emacs 21+ handling
  (defconst vhdl-emacs-21 (and (<= 21 emacs-major-version) (not vhdl-xemacs))
!   "Non-nil if Emacs 21, 22, ... is used.")
  
  (defvar compilation-file-regexp-alist)
  (defvar itimer-version)
--- 129,137 ----
    "Non-nil if XEmacs is used.")
  ;; Emacs 21+ handling
  (defconst vhdl-emacs-21 (and (<= 21 emacs-major-version) (not vhdl-xemacs))
!   "Non-nil if GNU Emacs 21, 22, ... is used.")
! (defconst vhdl-emacs-22 (and (<= 22 emacs-major-version) (not vhdl-xemacs))
!   "Non-nil if GNU Emacs 22, ... is used.")
  
  (defvar compilation-file-regexp-alist)
  (defvar itimer-version)
***************
*** 180,186 ****
    "Customizations for VHDL Mode."
    :prefix "vhdl-"
    :group 'languages
! ;  :version "20.4"  ; comment out for XEmacs
    )
  
  (defgroup vhdl-mode nil
--- 185,191 ----
    "Customizations for VHDL Mode."
    :prefix "vhdl-"
    :group 'languages
! ;  :version "21.2"  ; comment out for XEmacs
    )
  
  (defgroup vhdl-mode nil
***************
*** 228,234 ****
      ("Cadence NC" "ncvhdl" "-work \\1" "make" "-f \\1"
       nil "mkdir \\1" "./" "work/" "Makefile" "ncvhdl"
       ("ncvhdl_p: \\*E,\\w+ (\\(.+\\),\\([0-9]+\\)|\\([0-9]+\\)):" 1 2 3) ("" 
0)
!      nil)
      ;; Ikos Voyager: analyze test.vhd
      ;; analyze test.vhd
      ;; E L4/C5:        this library unit is inaccessible
--- 233,240 ----
      ("Cadence NC" "ncvhdl" "-work \\1" "make" "-f \\1"
       nil "mkdir \\1" "./" "work/" "Makefile" "ncvhdl"
       ("ncvhdl_p: \\*E,\\w+ (\\(.+\\),\\([0-9]+\\)|\\([0-9]+\\)):" 1 2 3) ("" 
0)
!      ("\\1/entity/pc.db" "\\2/\\1/pc.db" "\\1/configuration/pc.db"
!       "\\1/package/pc.db" "\\1/body/pc.db" downcase))
      ;; Ikos Voyager: analyze test.vhd
      ;; analyze test.vhd
      ;; E L4/C5:        this library unit is inaccessible
***************
*** 343,349 ****
    Makefile name    : name of Makefile (default is \"Makefile\")
    ID string        : compiler identification string (see `vhdl-project-alist')
  Error message:
!   Regexp           : regular expression to match error messages
    File subexp index: index of subexpression that matches the file name
    Line subexp index: index of subexpression that matches the line number
    Column subexp idx: index of subexpression that matches the column number
--- 349,355 ----
    Makefile name    : name of Makefile (default is \"Makefile\")
    ID string        : compiler identification string (see `vhdl-project-alist')
  Error message:
!   Regexp           : regular expression to match error messages (*)
    File subexp index: index of subexpression that matches the file name
    Line subexp index: index of subexpression that matches the line number
    Column subexp idx: index of subexpression that matches the column number
***************
*** 356,361 ****
--- 362,370 ----
                       \"\\2\" inserts the entity name for architectures)
    Case adjustment  : adjust case of inserted unit names
  
+ \(*) The regular expression must match the error message starting from the
+     beginning of the line (but not necessarily to the end of the line). 
+ 
  Compile options allows insertion of the library name (see 
`vhdl-project-alist')
  in order to set the compilers library option (e.g. \"vcom -work my_lib\").
  
***************
*** 385,392 ****
  Please send any missing or erroneous compiler properties to the maintainer for
  updating.
  
! NOTE: Reflect the new setting in the choice list of option `vhdl-compiler'
!       by restarting Emacs."
    :type '(repeat
          (list :tag "Compiler" :indent 2
                (string :tag "Compiler name      ")
--- 394,401 ----
  Please send any missing or erroneous compiler properties to the maintainer for
  updating.
  
! NOTE: Activate new error and file message regexps and reflect the new setting
!       in the choice list of option `vhdl-compiler' by restarting Emacs."
    :type '(repeat
          (list :tag "Compiler" :indent 2
                (string :tag "Compiler name      ")
***************
*** 426,432 ****
                                      (const :tag "Upcase" upcase)
                                      (const :tag "Downcase" downcase))))))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-update-mode-menu))
    :group 'vhdl-compile)
  
  (defcustom vhdl-compiler "ModelSim"
--- 435,441 ----
                                      (const :tag "Upcase" upcase)
                                      (const :tag "Downcase" downcase))))))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-update-mode-menu))
    :group 'vhdl-compile)
  
  (defcustom vhdl-compiler "ModelSim"
***************
*** 589,595 ****
                (string :tag "Description: (type `C-j' for newline)"
                        :format "%t\n%v\n")))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-update-mode-menu
                          'vhdl-speedbar-refresh))
    :group 'vhdl-project)
--- 598,604 ----
                (string :tag "Description: (type `C-j' for newline)"
                        :format "%t\n%v\n")))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-update-mode-menu
                          'vhdl-speedbar-refresh))
    :group 'vhdl-project)
***************
*** 666,672 ****
                    (const :tag "VHDL-AMS" ams)
                    (const :tag "Math packages" math)))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-template-map-init
                          'vhdl-mode-abbrev-table-init
                          'vhdl-template-construct-alist-init
--- 675,681 ----
                    (const :tag "VHDL-AMS" ams)
                    (const :tag "Math packages" math)))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-template-map-init
                          'vhdl-mode-abbrev-table-init
                          'vhdl-template-construct-alist-init
***************
*** 686,692 ****
  This is done when typed or expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-types nil
--- 695,701 ----
  This is done when typed or expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-types nil
***************
*** 694,700 ****
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-attributes nil
--- 703,709 ----
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-attributes nil
***************
*** 702,708 ****
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-enum-values nil
--- 711,717 ----
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-enum-values nil
***************
*** 710,716 ****
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-constants t
--- 719,725 ----
  This is done when expanded or by the fix case functions."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-upper-case-constants t
***************
*** 718,724 ****
  This is done when expanded."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-use-direct-instantiation 'standard
--- 727,733 ----
  This is done when expanded."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-abbrev-list-init))
    :group 'vhdl-style)
  
  (defcustom vhdl-use-direct-instantiation 'standard
***************
*** 753,761 ****
     "*Specifies how the architecture file name is obtained.
  The architecture file name can be obtained by modifying the entity
  and/or architecture name (e.g. attaching or stripping off a substring).  The
! string that is matched against the regexp is the concatenation of the entity
! and the architecture name separated by a space.  This gives access to both
! names (see default setting as example)."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
--- 762,783 ----
     "*Specifies how the architecture file name is obtained.
  The architecture file name can be obtained by modifying the entity
  and/or architecture name (e.g. attaching or stripping off a substring).  The
! file extension is automatically taken from the file name of the current
! buffer.  The string that is matched against the regexp is the concatenation
! of the entity and the architecture name separated by a space.  This gives
! access to both names (see default setting as example)."
!    vhdl-name-doc-string)
!   :type '(cons (regexp :tag "From regexp")
!              (string :tag "To string  "))
!   :group 'vhdl-naming
!   :group 'vhdl-compose)
! 
! (defcustom vhdl-configuration-file-name '(".*" . "\\&")
!   (concat
!    "*Specifies how the configuration file name is obtained.
! The configuration file name can be obtained by modifying the configuration
! name (e.g. attaching or stripping off a substring).  The file extension is
! automatically taken from the file name of the current buffer."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
***************
*** 767,773 ****
     "*Specifies how the package file name is obtained.
  The package file name can be obtained by modifying the package name (e.g.
  attaching or stripping off a substring).  The file extension is automatically
! taken from the file name of the current buffer."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
--- 789,797 ----
     "*Specifies how the package file name is obtained.
  The package file name can be obtained by modifying the package name (e.g.
  attaching or stripping off a substring).  The file extension is automatically
! taken from the file name of the current buffer.  Package files can be created
! in a different directory by prepending a relative or absolute path to the
! file name."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
***************
*** 801,807 ****
    :type '(set (const :tag "VHDL keywords" vhdl)
              (const :tag "User model keywords" user))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-mode-abbrev-table-init))
    :group 'vhdl-template)
  
  (defcustom vhdl-optional-labels 'process
--- 825,831 ----
    :type '(set (const :tag "VHDL keywords" vhdl)
              (const :tag "User model keywords" user))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-mode-abbrev-table-init))
    :group 'vhdl-template)
  
  (defcustom vhdl-optional-labels 'process
***************
*** 1035,1041 ****
      <cursor>
    elsif <clock>'event and <clock> = '1' then  -- rising clock edge
      if <enable> = '1' then  -- synchronous load
! 
      end if;
    end if;
  end process <label>;"
--- 1059,1065 ----
      <cursor>
    elsif <clock>'event and <clock> = '1' then  -- rising clock edge
      if <enable> = '1' then  -- synchronous load
!       
      end if;
    end if;
  end process <label>;"
***************
*** 1075,1081 ****
                       (sexp   :tag "Key binding" x)
                       (string :tag "Keyword    " :format "%t: %v\n")))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-model-map-init
                          'vhdl-model-defun
                          'vhdl-mode-abbrev-table-init
--- 1099,1105 ----
                       (sexp   :tag "Key binding" x)
                       (string :tag "Keyword    " :format "%t: %v\n")))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-model-map-init
                          'vhdl-model-defun
                          'vhdl-mode-abbrev-table-init
***************
*** 1083,1088 ****
--- 1107,1205 ----
    :group 'vhdl-model)
  
  
+ (defgroup vhdl-compose nil
+   "Customizations for structural composition."
+   :group 'vhdl)
+ 
+ (defcustom vhdl-compose-architecture-name '(".*" . "str")
+   (concat
+    "*Specifies how the component architecture name is obtained.
+ The component architecture name can be obtained by modifying the entity name
+ \(e.g. attaching or stripping off a substring).
+ If TO STRING is empty, the architecture name is queried."
+    vhdl-name-doc-string)
+   :type '(cons (regexp :tag "From regexp")
+              (string :tag "To string  "))
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-configuration-name
+   '("\\(.*\\) \\(.*\\)" . "\\1_\\2_cfg")
+   (concat
+    "*Specifies how the configuration name is obtained.
+ The configuration name can be obtained by modifying the entity and/or
+ architecture name (e.g. attaching or stripping off a substring).  The string
+ that is matched against the regexp is the concatenation of the entity and the
+ architecture name separated by a space.  This gives access to both names (see
+ default setting as example)."
+    vhdl-name-doc-string)
+   :type '(cons (regexp :tag "From regexp")
+              (string :tag "To string  "))
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-components-package-name
+   '((".*" . "\\&_components") . "components")
+   (concat
+    "*Specifies how the name for the components package is obtained.
+ The components package is a package containing all component declarations for
+ the current design.  It's name can be obtained by modifying the project name
+ \(e.g. attaching or stripping off a substring).  If no project is defined, the
+ DIRECTORY entry is chosen."
+    vhdl-name-doc-string)
+   :type '(cons (cons :tag "Project" :indent 2
+                    (regexp :tag "From regexp")
+                    (string :tag "To string  "))
+              (string :tag "Directory:\n  String     "))
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-use-components-package nil
+   "*Non-nil means use a separate components package for component 
declarations.
+ Otherwise, component declarations are inserted and searched for in the
+ architecture declarative parts."
+   :type 'boolean
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-include-header t
+   "*Non-nil means include a header in automatically generated files."
+   :type 'boolean
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-create-files 'single
+   "*Specifies whether new files should be created for the new component.
+ The component's entity and architecture are inserted:
+   None          : in current buffer
+   Single file   : in new single file
+   Separate files: in two separate files
+ The file names are obtained from variables `vhdl-entity-file-name' and
+ `vhdl-architecture-file-name'."
+   :type '(choice (const :tag "None" none)
+                (const :tag "Single file" single)
+                (const :tag "Separate files" separate))
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-configuration-create-file nil
+   "*Specifies whether a new file should be created for the configuration.
+ If non-nil, a new file is created for the configuration.
+ The file name is obtained from variable `vhdl-configuration-file-name'."
+   :type 'boolean
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-configuration-hierarchical t
+   "*Specifies whether hierarchical configurations should be created.
+ If non-nil, automatically created configurations are hierarchical and include
+ the whole hierarchy of subcomponents.  Otherwise the configuration only
+ includes one level of subcomponents."
+   :type 'boolean
+   :group 'vhdl-compose)
+ 
+ (defcustom vhdl-compose-configuration-use-subconfiguration t
+   "*Specifies whether subconfigurations should be used inside configurations.
+ If non-nil, automatically created configurations use configurations in binding
+ indications for subcomponents, if such configurations exist.  Otherwise,
+ entities are used in binding indications for subcomponents."
+   :type 'boolean
+   :group 'vhdl-compose)
+ 
+ 
  (defgroup vhdl-port nil
    "Customizations for port translation functions."
    :group 'vhdl
***************
*** 1162,1169 ****
               (string :tag "To string  "))
    :group 'vhdl-testbench)
  
! (defcustom vhdl-testbench-configuration-name
!   '("\\(.*\\) \\(.*\\)" . "\\1_\\2_cfg")
    (concat
     "*Specifies how the testbench configuration name is obtained.
  The configuration name of a testbench can be obtained by modifying the entity
--- 1279,1285 ----
               (string :tag "To string  "))
    :group 'vhdl-testbench)
  
! (defcustom vhdl-testbench-configuration-name vhdl-compose-configuration-name
    (concat
     "*Specifies how the testbench configuration name is obtained.
  The configuration name of a testbench can be obtained by modifying the entity
***************
*** 1212,1218 ****
    WaveGen_Proc: process
    begin
      -- insert signal assignments here
! 
      wait until Clk = '1';
    end process WaveGen_Proc;
  "
--- 1328,1334 ----
    WaveGen_Proc: process
    begin
      -- insert signal assignments here
!     
      wait until Clk = '1';
    end process WaveGen_Proc;
  "
***************
*** 1245,1311 ****
    None          : in current buffer
    Single file   : in new single file
    Separate files: in two separate files
! Note that the files have the same name as the contained design unit."
    :type '(choice (const :tag "None" none)
                 (const :tag "Single file" single)
                 (const :tag "Separate files" separate))
    :group 'vhdl-testbench)
  
! 
! (defgroup vhdl-compose nil
!   "Customizations for structural composition."
!   :group 'vhdl)
! 
! (defcustom vhdl-compose-create-files 'single
!   "*Specifies whether new files should be created for the new component.
! The component's entity and architecture are inserted:
!   None          : in current buffer
!   Single file   : in new single file
!   Separate files: in two separate files
! The file names are obtained from variables `vhdl-entity-file-name' and
! `vhdl-architecture-file-name'."
!   :type '(choice (const :tag "None" none)
!                (const :tag "Single file" single)
!                (const :tag "Separate files" separate))
!   :group 'vhdl-compose)
! 
! (defcustom vhdl-compose-include-header t
!   "*Non-nil means include a header in automatically generated files."
!   :type 'boolean
!   :group 'vhdl-compose)
! 
! (defcustom vhdl-compose-architecture-name '(".*" . "str")
    (concat
!    "*Specifies how the component architecture name is obtained.
! The component architecture name can be obtained by modifying the entity name
! \(e.g. attaching or stripping off a substring).
! If TO STRING is empty, the architecture name is queried."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
!   :group 'vhdl-compose)
  
! (defcustom vhdl-components-package-name
!   '((".*" . "\\&_components") . "components")
    (concat
!    "*Specifies how the name for the components package is obtained.
! The components package is a package containing all component declarations for
! the current design.  Its name can be obtained by modifying the project name
! \(e.g. attaching or stripping off a substring).  If no project is defined, the
! DIRECTORY entry is chosen."
     vhdl-name-doc-string)
!   :type '(cons (cons :tag "Project" :indent 2
!                    (regexp :tag "From regexp")
!                    (string :tag "To string  "))
!              (string :tag "Directory:\n  String     "))
!   :group 'vhdl-compose)
! 
! (defcustom vhdl-use-components-package nil
!   "*Non-nil means use a separate components package for component 
declarations.
! Otherwise, component declarations are inserted and searched for in the
! architecture declarative parts."
!   :type 'boolean
!   :group 'vhdl-compose)
  
  
  (defgroup vhdl-comment nil
--- 1361,1400 ----
    None          : in current buffer
    Single file   : in new single file
    Separate files: in two separate files
! The file names are obtained from variables `vhdl-testbench-entity-file-name'
! and `vhdl-testbench-architecture-file-name'."
    :type '(choice (const :tag "None" none)
                 (const :tag "Single file" single)
                 (const :tag "Separate files" separate))
    :group 'vhdl-testbench)
  
! (defcustom vhdl-testbench-entity-file-name vhdl-entity-file-name
    (concat
!    "*Specifies how the testbench entity file name is obtained.
! The entity file name can be obtained by modifying the testbench entity name
! \(e.g. attaching or stripping off a substring).  The file extension is
! automatically taken from the file name of the current buffer.  Testbench
! files can be created in a different directory by prepending a relative or
! absolute path to the file name."
     vhdl-name-doc-string)
    :type '(cons (regexp :tag "From regexp")
               (string :tag "To string  "))
!   :group 'vhdl-testbench)
  
! (defcustom vhdl-testbench-architecture-file-name vhdl-architecture-file-name
    (concat
!    "*Specifies how the testbench architecture file name is obtained.
! The architecture file name can be obtained by modifying the testbench entity
! and/or architecture name (e.g. attaching or stripping off a substring).  The
! string that is matched against the regexp is the concatenation of the entity
! and the architecture name separated by a space.  This gives access to both
! names (see default setting as example).  Testbench files can be created in
! a different directory by prepending a relative or absolute path to the file
! name."
     vhdl-name-doc-string)
!   :type '(cons (regexp :tag "From regexp")
!              (string :tag "To string  "))
!   :group 'vhdl-testbench)
  
  
  (defgroup vhdl-comment nil
***************
*** 1384,1400 ****
  (defcustom vhdl-highlight-keywords t
    "*Non-nil means highlight VHDL keywords and other standardized words.
  The following faces are used:
!   `font-lock-keyword-face'      : keywords
!   `font-lock-type'            : standardized types
!   `vhdl-attribute'            : standardized attributes
!   `vhdl-enumvalue'            : standardized enumeration values
!   `vhdl-function'             : standardized function and package names
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-names t
--- 1473,1489 ----
  (defcustom vhdl-highlight-keywords t
    "*Non-nil means highlight VHDL keywords and other standardized words.
  The following faces are used:
!   `font-lock-keyword-face'       : keywords
!   `font-lock-type-face'          : standardized types
!   `vhdl-font-lock-attribute-face': standardized attributes
!   `vhdl-font-lock-enumvalue-face': standardized enumeration values
!   `vhdl-font-lock-function-face' : standardized function and package names
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-names t
***************
*** 1403,1409 ****
    `font-lock-function-name-face' : names in declarations of units,
       subprograms, components, as well as labels of VHDL constructs
    `font-lock-type-face'          : names in type/nature declarations
!   `vhdl-attribute'             : names in attribute declarations
    `font-lock-variable-name-face' : names in declarations of signals,
       variables, constants, subprogram parameters, generics, and ports
  
--- 1492,1498 ----
    `font-lock-function-name-face' : names in declarations of units,
       subprograms, components, as well as labels of VHDL constructs
    `font-lock-type-face'          : names in type/nature declarations
!   `vhdl-font-lock-attribute-face': names in attribute declarations
    `font-lock-variable-name-face' : names in declarations of signals,
       variables, constants, subprogram parameters, generics, and ports
  
***************
*** 1411,1417 ****
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-special-words nil
--- 1500,1506 ----
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-special-words nil
***************
*** 1424,1457 ****
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-forbidden-words nil
    "*Non-nil means highlight forbidden words.
  The reserved words specified in option `vhdl-forbidden-words' or having the
  syntax specified in option `vhdl-forbidden-syntax' are highlighted in a
! warning color (face `vhdl-reserved-word') to indicate not to
  use them.
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-verilog-keywords nil
    "*Non-nil means highlight Verilog keywords as reserved words.
  Verilog keywords are highlighted in a warning color (face
! `vhdl-reserved-word') to indicate not to use them.
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
--- 1513,1546 ----
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-forbidden-words nil
    "*Non-nil means highlight forbidden words.
  The reserved words specified in option `vhdl-forbidden-words' or having the
  syntax specified in option `vhdl-forbidden-syntax' are highlighted in a
! warning color (face `vhdl-font-lock-reserved-words-face') to indicate not to
  use them.
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-verilog-keywords nil
    "*Non-nil means highlight Verilog keywords as reserved words.
  Verilog keywords are highlighted in a warning color (face
! `vhdl-font-lock-reserved-words-face') to indicate not to use them.
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
***************
*** 1459,1472 ****
    "*Non-nil means background-highlight code excluded from translation.
  That is, all code between \"-- pragma translate_off\" and
  \"-- pragma translate_on\" is highlighted using a different background color
! \(face `vhdl-translate-off').
  Note: this might slow down on-the-fly fontification (and thus editing).
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-case-sensitive nil
--- 1548,1561 ----
    "*Non-nil means background-highlight code excluded from translation.
  That is, all code between \"-- pragma translate_off\" and
  \"-- pragma translate_on\" is highlighted using a different background color
! \(face `vhdl-font-lock-translate-off-face').
  Note: this might slow down on-the-fly fontification (and thus editing).
  
  NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\")."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-highlight-case-sensitive nil
***************
*** 1506,1512 ****
  \"Signal_s\", \"Variable_v\", \"Constant_c\") by distinguishing them using
  common substrings or name suffices.
  For each entry, a new face is generated with the specified colors and name
! \"vhdl-\" + name.
  
  NOTE: Activate a changed regexp in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\").  All other changes require restarting Emacs."
--- 1595,1601 ----
  \"Signal_s\", \"Variable_v\", \"Constant_c\") by distinguishing them using
  common substrings or name suffices.
  For each entry, a new face is generated with the specified colors and name
! \"vhdl-font-lock-\" + name + \"-face\".
  
  NOTE: Activate a changed regexp in a VHDL buffer by re-fontifying it (menu
        entry \"Fontify Buffer\").  All other changes require restarting Emacs."
***************
*** 1516,1522 ****
                       (string :tag "Color (light)")
                       (string :tag "Color (dark) ")))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-forbidden-words '()
--- 1605,1611 ----
                       (string :tag "Color (light)")
                       (string :tag "Color (dark) ")))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
  (defcustom vhdl-forbidden-words '()
***************
*** 1528,1534 ****
        entry \"Fontify Buffer\")."
    :type '(repeat (string :format "%v"))
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
--- 1617,1623 ----
        entry \"Fontify Buffer\")."
    :type '(repeat (string :format "%v"))
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
***************
*** 1543,1549 ****
        entry \"Fontify Buffer\")."
    :type 'regexp
    :set (lambda (variable value)
!          (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
--- 1632,1638 ----
        entry \"Fontify Buffer\")."
    :type 'regexp
    :set (lambda (variable value)
!        (vhdl-custom-set variable value
                          'vhdl-words-init 'vhdl-font-lock-init))
    :group 'vhdl-highlight)
  
***************
*** 1739,1745 ****
        \"Activate Options\"."
    :type 'boolean
    :set (lambda (variable value)
!          (vhdl-custom-set variable value 'vhdl-mode-syntax-table-init))
    :group 'vhdl-misc)
  
  
--- 1828,1834 ----
        \"Activate Options\"."
    :type 'boolean
    :set (lambda (variable value)
!        (vhdl-custom-set variable value 'vhdl-mode-syntax-table-init))
    :group 'vhdl-misc)
  
  
***************
*** 1785,1808 ****
    "*If non-nil, syntactic info is echoed when the line is indented.")
  
  (defconst vhdl-offsets-alist-default
!   '((string                . -1000)
!     (block-open            . 0)
!     (block-close           . 0)
!     (statement             . 0)
!     (statement-cont        . vhdl-lineup-statement-cont)
      (statement-block-intro . +)
      (statement-case-intro  . +)
!     (case-alternative      . +)
!     (comment               . vhdl-lineup-comment)
!     (arglist-intro         . +)
!     (arglist-cont          . 0)
      (arglist-cont-nonempty . vhdl-lineup-arglist)
!     (arglist-close         . vhdl-lineup-arglist)
!     (entity                . 0)
!     (configuration         . 0)
!     (package               . 0)
!     (architecture          . 0)
!     (package-body          . 0)
      )
    "Default settings for offsets of syntactic elements.
  Do not change this constant!  See the variable `vhdl-offsets-alist' for
--- 1874,1898 ----
    "*If non-nil, syntactic info is echoed when the line is indented.")
  
  (defconst vhdl-offsets-alist-default
!   '((string              . -1000)
!     (cpp-macro                   . -1000)
!     (block-open                  . 0)
!     (block-close         . 0)
!     (statement                   . 0)
!     (statement-cont      . vhdl-lineup-statement-cont)
      (statement-block-intro . +)
      (statement-case-intro  . +)
!     (case-alternative    . +)
!     (comment             . vhdl-lineup-comment)
!     (arglist-intro       . +)
!     (arglist-cont        . 0)
      (arglist-cont-nonempty . vhdl-lineup-arglist)
!     (arglist-close       . vhdl-lineup-arglist)
!     (entity              . 0)
!     (configuration       . 0)
!     (package             . 0)
!     (architecture        . 0)
!     (package-body        . 0)
      )
    "Default settings for offsets of syntactic elements.
  Do not change this constant!  See the variable `vhdl-offsets-alist' for
***************
*** 2036,2041 ****
--- 2126,2135 ----
        (setq dirs (cdr dirs)))
        contents)))
  
+ ;; `member-ignore-case' undefined (XEmacs)
+ (unless (fboundp 'member-ignore-case)
+   (defalias 'member-ignore-case 'member))
+ 
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Compatibility with older VHDL Mode versions
  
***************
*** 2575,2599 ****
    "Initialize `vhdl-mode-map'."
    (setq vhdl-mode-map (make-sparse-keymap))
    ;; template key bindings
!   (define-key vhdl-mode-map "\C-c\C-t"     vhdl-template-map)
    ;; model key bindings
!   (define-key vhdl-mode-map "\C-c\C-m"     vhdl-model-map)
    ;; standard key bindings
!   (define-key vhdl-mode-map "\M-a"         'vhdl-beginning-of-statement)
!   (define-key vhdl-mode-map "\M-e"         'vhdl-end-of-statement)
!   (define-key vhdl-mode-map "\M-\C-f"      'vhdl-forward-sexp)
!   (define-key vhdl-mode-map "\M-\C-b"      'vhdl-backward-sexp)
!   (define-key vhdl-mode-map "\M-\C-u"      'vhdl-backward-up-list)
!   (define-key vhdl-mode-map "\M-\C-a"      'vhdl-backward-same-indent)
!   (define-key vhdl-mode-map "\M-\C-e"      'vhdl-forward-same-indent)
    (unless vhdl-xemacs ; would override `M-backspace' in XEmacs
!     (define-key vhdl-mode-map "\M-\C-h"      'vhdl-mark-defun))
!   (define-key vhdl-mode-map "\M-\C-q"      'vhdl-indent-sexp)
!   (define-key vhdl-mode-map "\M-^"         'vhdl-delete-indentation)
    ;; backspace/delete key bindings
!   (define-key vhdl-mode-map [backspace]    'backward-delete-char-untabify)
    (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable
!     (define-key vhdl-mode-map [delete]       'delete-char)
      (define-key vhdl-mode-map [(meta delete)] 'kill-word))
    ;; mode specific key bindings
    (define-key vhdl-mode-map "\C-c\C-m\C-e" 'vhdl-electric-mode)
--- 2669,2693 ----
    "Initialize `vhdl-mode-map'."
    (setq vhdl-mode-map (make-sparse-keymap))
    ;; template key bindings
!   (define-key vhdl-mode-map "\C-c\C-t"           vhdl-template-map)
    ;; model key bindings
!   (define-key vhdl-mode-map "\C-c\C-m"           vhdl-model-map)
    ;; standard key bindings
!   (define-key vhdl-mode-map "\M-a"       'vhdl-beginning-of-statement)
!   (define-key vhdl-mode-map "\M-e"       'vhdl-end-of-statement)
!   (define-key vhdl-mode-map "\M-\C-f"    'vhdl-forward-sexp)
!   (define-key vhdl-mode-map "\M-\C-b"    'vhdl-backward-sexp)
!   (define-key vhdl-mode-map "\M-\C-u"    'vhdl-backward-up-list)
!   (define-key vhdl-mode-map "\M-\C-a"    'vhdl-backward-same-indent)
!   (define-key vhdl-mode-map "\M-\C-e"    'vhdl-forward-same-indent)
    (unless vhdl-xemacs ; would override `M-backspace' in XEmacs
!     (define-key vhdl-mode-map "\M-\C-h"          'vhdl-mark-defun))
!   (define-key vhdl-mode-map "\M-\C-q"    'vhdl-indent-sexp)
!   (define-key vhdl-mode-map "\M-^"       'vhdl-delete-indentation)
    ;; backspace/delete key bindings
!   (define-key vhdl-mode-map [backspace]          
'backward-delete-char-untabify)
    (unless (boundp 'delete-key-deletes-forward) ; XEmacs variable
!     (define-key vhdl-mode-map [delete]             'delete-char)
      (define-key vhdl-mode-map [(meta delete)] 'kill-word))
    ;; mode specific key bindings
    (define-key vhdl-mode-map "\C-c\C-m\C-e" 'vhdl-electric-mode)
***************
*** 2603,2609 ****
    (define-key vhdl-mode-map "\C-c\C-p\C-m" 'vhdl-import-project)
    (define-key vhdl-mode-map "\C-c\C-p\C-x" 'vhdl-export-project)
    (define-key vhdl-mode-map "\C-c\C-s\C-k" 'vhdl-set-compiler)
!   (define-key vhdl-mode-map "\C-c\C-k"     'vhdl-compile)
    (define-key vhdl-mode-map "\C-c\M-\C-k"  'vhdl-make)
    (define-key vhdl-mode-map "\C-c\M-k"           'vhdl-generate-makefile)
    (define-key vhdl-mode-map "\C-c\C-p\C-w" 'vhdl-port-copy)
--- 2697,2703 ----
    (define-key vhdl-mode-map "\C-c\C-p\C-m" 'vhdl-import-project)
    (define-key vhdl-mode-map "\C-c\C-p\C-x" 'vhdl-export-project)
    (define-key vhdl-mode-map "\C-c\C-s\C-k" 'vhdl-set-compiler)
!   (define-key vhdl-mode-map "\C-c\C-k"           'vhdl-compile)
    (define-key vhdl-mode-map "\C-c\M-\C-k"  'vhdl-make)
    (define-key vhdl-mode-map "\C-c\M-k"           'vhdl-generate-makefile)
    (define-key vhdl-mode-map "\C-c\C-p\C-w" 'vhdl-port-copy)
***************
*** 2629,2641 ****
    (define-key vhdl-mode-map "\C-c\C-c\C-n" 'vhdl-compose-new-component)
    (define-key vhdl-mode-map "\C-c\C-c\C-p" 'vhdl-compose-place-component)
    (define-key vhdl-mode-map "\C-c\C-c\C-w" 'vhdl-compose-wire-components)
    (define-key vhdl-mode-map "\C-c\C-c\C-k" 'vhdl-compose-components-package)
    (define-key vhdl-mode-map "\C-cc"      'vhdl-comment-uncomment-region)
!   (define-key vhdl-mode-map "\C-c-"        'vhdl-comment-append-inline)
!   (define-key vhdl-mode-map "\C-c\M--"     'vhdl-comment-display-line)
    (define-key vhdl-mode-map "\C-c\C-i\C-l" 'indent-according-to-mode)
    (define-key vhdl-mode-map "\C-c\C-i\C-g" 'vhdl-indent-group)
!   (define-key vhdl-mode-map "\M-\C-\\"     'vhdl-indent-region)
    (define-key vhdl-mode-map "\C-c\C-i\C-b" 'vhdl-indent-buffer)
    (define-key vhdl-mode-map "\C-c\C-a\C-g" 'vhdl-align-group)
    (define-key vhdl-mode-map "\C-c\C-a\C-a" 'vhdl-align-group)
--- 2723,2736 ----
    (define-key vhdl-mode-map "\C-c\C-c\C-n" 'vhdl-compose-new-component)
    (define-key vhdl-mode-map "\C-c\C-c\C-p" 'vhdl-compose-place-component)
    (define-key vhdl-mode-map "\C-c\C-c\C-w" 'vhdl-compose-wire-components)
+   (define-key vhdl-mode-map "\C-c\C-c\C-f" 'vhdl-compose-configuration)
    (define-key vhdl-mode-map "\C-c\C-c\C-k" 'vhdl-compose-components-package)
    (define-key vhdl-mode-map "\C-cc"      'vhdl-comment-uncomment-region)
!   (define-key vhdl-mode-map "\C-c-"      'vhdl-comment-append-inline)
!   (define-key vhdl-mode-map "\C-c\M--"           'vhdl-comment-display-line)
    (define-key vhdl-mode-map "\C-c\C-i\C-l" 'indent-according-to-mode)
    (define-key vhdl-mode-map "\C-c\C-i\C-g" 'vhdl-indent-group)
!   (define-key vhdl-mode-map "\M-\C-\\"           'vhdl-indent-region)
    (define-key vhdl-mode-map "\C-c\C-i\C-b" 'vhdl-indent-buffer)
    (define-key vhdl-mode-map "\C-c\C-a\C-g" 'vhdl-align-group)
    (define-key vhdl-mode-map "\C-c\C-a\C-a" 'vhdl-align-group)
***************
*** 2665,2702 ****
    (define-key vhdl-mode-map "\C-c\C-x\C-c" 'vhdl-fix-case-buffer)
    (define-key vhdl-mode-map "\C-c\C-x\M-w" 'vhdl-fixup-whitespace-region)
    (define-key vhdl-mode-map "\C-c\C-x\C-w" 'vhdl-fixup-whitespace-buffer)
!   (define-key vhdl-mode-map "\C-c\M-b"     'vhdl-beautify-region)
!   (define-key vhdl-mode-map "\C-c\C-b"     'vhdl-beautify-buffer)
    (define-key vhdl-mode-map "\C-c\C-u\C-s" 
'vhdl-update-sensitivity-list-process)
    (define-key vhdl-mode-map "\C-c\C-u\M-s" 
'vhdl-update-sensitivity-list-buffer)
!   (define-key vhdl-mode-map "\C-cf"        'vhdl-fontify-buffer)
!   (define-key vhdl-mode-map "\C-cs"        'vhdl-statistics-buffer)
!   (define-key vhdl-mode-map "\C-c\M-m"     'vhdl-show-messages)
!   (define-key vhdl-mode-map "\C-c\C-h"     'vhdl-doc-mode)
!   (define-key vhdl-mode-map "\C-c\C-v"     'vhdl-version)
!   (define-key vhdl-mode-map "\M-\t"        'insert-tab)
    ;; insert commands bindings
    (define-key vhdl-mode-map "\C-c\C-i\C-t" 'vhdl-template-insert-construct)
    (define-key vhdl-mode-map "\C-c\C-i\C-p" 'vhdl-template-insert-package)
    (define-key vhdl-mode-map "\C-c\C-i\C-d" 'vhdl-template-insert-directive)
    (define-key vhdl-mode-map "\C-c\C-i\C-m" 'vhdl-model-insert)
    ;; electric key bindings
!   (define-key vhdl-mode-map " "            'vhdl-electric-space)
!   (if vhdl-intelligent-tab
!       (define-key vhdl-mode-map "\t"       'vhdl-electric-tab)
!     ;; The default binding of TAB already calls `indent-according-to-mode'.
!     ;; (define-key vhdl-mode-map "\t"         'indent-according-to-mode)
!     )
!   (define-key vhdl-mode-map "\r"           'vhdl-electric-return)
!   (define-key vhdl-mode-map "-"            'vhdl-electric-dash)
!   (define-key vhdl-mode-map "["            'vhdl-electric-open-bracket)
!   (define-key vhdl-mode-map "]"            'vhdl-electric-close-bracket)
!   (define-key vhdl-mode-map "'"            'vhdl-electric-quote)
!   (define-key vhdl-mode-map ";"            'vhdl-electric-semicolon)
!   (define-key vhdl-mode-map ","            'vhdl-electric-comma)
!   (define-key vhdl-mode-map "."            'vhdl-electric-period)
    (when (vhdl-standard-p 'ams)
!     (define-key vhdl-mode-map "="          'vhdl-electric-equal)))
  
  ;; initialize mode map for VHDL Mode
  (vhdl-mode-map-init)
--- 2760,2794 ----
    (define-key vhdl-mode-map "\C-c\C-x\C-c" 'vhdl-fix-case-buffer)
    (define-key vhdl-mode-map "\C-c\C-x\M-w" 'vhdl-fixup-whitespace-region)
    (define-key vhdl-mode-map "\C-c\C-x\C-w" 'vhdl-fixup-whitespace-buffer)
!   (define-key vhdl-mode-map "\C-c\M-b"           'vhdl-beautify-region)
!   (define-key vhdl-mode-map "\C-c\C-b"           'vhdl-beautify-buffer)
    (define-key vhdl-mode-map "\C-c\C-u\C-s" 
'vhdl-update-sensitivity-list-process)
    (define-key vhdl-mode-map "\C-c\C-u\M-s" 
'vhdl-update-sensitivity-list-buffer)
!   (define-key vhdl-mode-map "\C-cf"      'vhdl-fontify-buffer)
!   (define-key vhdl-mode-map "\C-cs"      'vhdl-statistics-buffer)
!   (define-key vhdl-mode-map "\C-c\M-m"           'vhdl-show-messages)
!   (define-key vhdl-mode-map "\C-c\C-h"           'vhdl-doc-mode)
!   (define-key vhdl-mode-map "\C-c\C-v"           'vhdl-version)
!   (define-key vhdl-mode-map "\M-\t"      'insert-tab)
    ;; insert commands bindings
    (define-key vhdl-mode-map "\C-c\C-i\C-t" 'vhdl-template-insert-construct)
    (define-key vhdl-mode-map "\C-c\C-i\C-p" 'vhdl-template-insert-package)
    (define-key vhdl-mode-map "\C-c\C-i\C-d" 'vhdl-template-insert-directive)
    (define-key vhdl-mode-map "\C-c\C-i\C-m" 'vhdl-model-insert)
    ;; electric key bindings
!   (define-key vhdl-mode-map " "                  'vhdl-electric-space)
!   (when vhdl-intelligent-tab
!     (define-key vhdl-mode-map "\t"       'vhdl-electric-tab))
!   (define-key vhdl-mode-map "\r"         'vhdl-electric-return)
!   (define-key vhdl-mode-map "-"                  'vhdl-electric-dash)
!   (define-key vhdl-mode-map "["                  'vhdl-electric-open-bracket)
!   (define-key vhdl-mode-map "]"                  'vhdl-electric-close-bracket)
!   (define-key vhdl-mode-map "'"                  'vhdl-electric-quote)
!   (define-key vhdl-mode-map ";"                  'vhdl-electric-semicolon)
!   (define-key vhdl-mode-map ","                  'vhdl-electric-comma)
!   (define-key vhdl-mode-map "."                  'vhdl-electric-period)
    (when (vhdl-standard-p 'ams)
!     (define-key vhdl-mode-map "="        'vhdl-electric-equal)))
  
  ;; initialize mode map for VHDL Mode
  (vhdl-mode-map-init)
***************
*** 2801,2934 ****
       (when (memq 'vhdl vhdl-electric-keywords)
         ;; VHDL'93 keywords
         '(
!        ("--"            "" vhdl-template-display-comment-hook 0 t)
!        ("abs"           "" vhdl-template-default-hook 0 t)
!        ("access"        "" vhdl-template-default-hook 0 t)
!        ("after"         "" vhdl-template-default-hook 0 t)
!        ("alias"         "" vhdl-template-alias-hook 0 t)
!        ("all"           "" vhdl-template-default-hook 0 t)
!        ("and"           "" vhdl-template-default-hook 0 t)
!        ("arch"          "" vhdl-template-architecture-hook 0 t)
!        ("architecture"  "" vhdl-template-architecture-hook 0 t)
!        ("array"         "" vhdl-template-default-hook 0 t)
!        ("assert"        "" vhdl-template-assert-hook 0 t)
!        ("attr"          "" vhdl-template-attribute-hook 0 t)
!        ("attribute"     "" vhdl-template-attribute-hook 0 t)
!        ("begin"         "" vhdl-template-default-indent-hook 0 t)
!        ("block"         "" vhdl-template-block-hook 0 t)
!        ("body"          "" vhdl-template-default-hook 0 t)
!        ("buffer"        "" vhdl-template-default-hook 0 t)
!        ("bus"           "" vhdl-template-default-hook 0 t)
!        ("case"          "" vhdl-template-case-hook 0 t)
!        ("comp"          "" vhdl-template-component-hook 0 t)
!        ("component"     "" vhdl-template-component-hook 0 t)
!        ("cond"          "" vhdl-template-conditional-signal-asst-hook 0 t)
!        ("conditional"   "" vhdl-template-conditional-signal-asst-hook 0 t)
!        ("conf"          "" vhdl-template-configuration-hook 0 t)
!        ("configuration" "" vhdl-template-configuration-hook 0 t)
!        ("cons"          "" vhdl-template-constant-hook 0 t)
!        ("constant"      "" vhdl-template-constant-hook 0 t)
!        ("disconnect"    "" vhdl-template-disconnect-hook 0 t)
!        ("downto"        "" vhdl-template-default-hook 0 t)
!        ("else"          "" vhdl-template-else-hook 0 t)
!        ("elseif"        "" vhdl-template-elsif-hook 0 t)
!        ("elsif"         "" vhdl-template-elsif-hook 0 t)
!        ("end"           "" vhdl-template-default-indent-hook 0 t)
!        ("entity"        "" vhdl-template-entity-hook 0 t)
!        ("exit"          "" vhdl-template-exit-hook 0 t)
!        ("file"          "" vhdl-template-file-hook 0 t)
!        ("for"           "" vhdl-template-for-hook 0 t)
!        ("func"          "" vhdl-template-function-hook 0 t)
!        ("function"      "" vhdl-template-function-hook 0 t)
!        ("generic"       "" vhdl-template-generic-hook 0 t)
!        ("group"         "" vhdl-template-group-hook 0 t)
!        ("guarded"       "" vhdl-template-default-hook 0 t)
!        ("if"            "" vhdl-template-if-hook 0 t)
!        ("impure"        "" vhdl-template-default-hook 0 t)
!        ("in"            "" vhdl-template-default-hook 0 t)
!        ("inertial"      "" vhdl-template-default-hook 0 t)
!        ("inout"         "" vhdl-template-default-hook 0 t)
!        ("inst"          "" vhdl-template-instance-hook 0 t)
!        ("instance"      "" vhdl-template-instance-hook 0 t)
!        ("is"            "" vhdl-template-default-hook 0 t)
!        ("label"         "" vhdl-template-default-hook 0 t)
!        ("library"       "" vhdl-template-library-hook 0 t)
!        ("linkage"       "" vhdl-template-default-hook 0 t)
!        ("literal"       "" vhdl-template-default-hook 0 t)
!        ("loop"          "" vhdl-template-bare-loop-hook 0 t)
!        ("map"           "" vhdl-template-map-hook 0 t)
!        ("mod"           "" vhdl-template-default-hook 0 t)
!        ("nand"          "" vhdl-template-default-hook 0 t)
!        ("new"           "" vhdl-template-default-hook 0 t)
!        ("next"          "" vhdl-template-next-hook 0 t)
!        ("nor"           "" vhdl-template-default-hook 0 t)
!        ("not"           "" vhdl-template-default-hook 0 t)
!        ("null"          "" vhdl-template-default-hook 0 t)
!        ("of"            "" vhdl-template-default-hook 0 t)
!        ("on"            "" vhdl-template-default-hook 0 t)
!        ("open"          "" vhdl-template-default-hook 0 t)
!        ("or"            "" vhdl-template-default-hook 0 t)
!        ("others"        "" vhdl-template-others-hook 0 t)
!        ("out"           "" vhdl-template-default-hook 0 t)
!        ("pack"          "" vhdl-template-package-hook 0 t)
!        ("package"       "" vhdl-template-package-hook 0 t)
!        ("port"          "" vhdl-template-port-hook 0 t)
!        ("postponed"     "" vhdl-template-default-hook 0 t)
!        ("procedure"     "" vhdl-template-procedure-hook 0 t)
!        ("process"       "" vhdl-template-process-hook 0 t)
!        ("pure"          "" vhdl-template-default-hook 0 t)
!        ("range"         "" vhdl-template-default-hook 0 t)
!        ("record"        "" vhdl-template-default-hook 0 t)
!        ("register"      "" vhdl-template-default-hook 0 t)
!        ("reject"        "" vhdl-template-default-hook 0 t)
!        ("rem"           "" vhdl-template-default-hook 0 t)
!        ("report"        "" vhdl-template-report-hook 0 t)
!        ("return"        "" vhdl-template-return-hook 0 t)
!        ("rol"           "" vhdl-template-default-hook 0 t)
!        ("ror"           "" vhdl-template-default-hook 0 t)
!        ("select"        "" vhdl-template-selected-signal-asst-hook 0 t)
!        ("severity"      "" vhdl-template-default-hook 0 t)
!        ("shared"        "" vhdl-template-default-hook 0 t)
!        ("sig"           "" vhdl-template-signal-hook 0 t)
!        ("signal"        "" vhdl-template-signal-hook 0 t)
!        ("sla"           "" vhdl-template-default-hook 0 t)
!        ("sll"           "" vhdl-template-default-hook 0 t)
!        ("sra"           "" vhdl-template-default-hook 0 t)
!        ("srl"           "" vhdl-template-default-hook 0 t)
!        ("subtype"       "" vhdl-template-subtype-hook 0 t)
!        ("then"          "" vhdl-template-default-hook 0 t)
!        ("to"            "" vhdl-template-default-hook 0 t)
!        ("transport"     "" vhdl-template-default-hook 0 t)
!        ("type"          "" vhdl-template-type-hook 0 t)
!        ("unaffected"    "" vhdl-template-default-hook 0 t)
!        ("units"         "" vhdl-template-default-hook 0 t)
!        ("until"         "" vhdl-template-default-hook 0 t)
!        ("use"           "" vhdl-template-use-hook 0 t)
!        ("var"           "" vhdl-template-variable-hook 0 t)
!        ("variable"      "" vhdl-template-variable-hook 0 t)
!        ("wait"          "" vhdl-template-wait-hook 0 t)
!        ("when"          "" vhdl-template-when-hook 0 t)
!        ("while"         "" vhdl-template-while-loop-hook 0 t)
!        ("with"          "" vhdl-template-with-hook 0 t)
!        ("xnor"          "" vhdl-template-default-hook 0 t)
!        ("xor"           "" vhdl-template-default-hook 0 t)
         ))
       ;; VHDL-AMS keywords
       (when (and (memq 'vhdl vhdl-electric-keywords) (vhdl-standard-p 'ams))
         '(
!        ("across"     "" vhdl-template-default-hook 0 t)
!        ("break"      "" vhdl-template-break-hook 0 t)
!        ("limit"      "" vhdl-template-limit-hook 0 t)
!        ("nature"     "" vhdl-template-nature-hook 0 t)
!        ("noise"      "" vhdl-template-default-hook 0 t)
!        ("procedural" "" vhdl-template-procedural-hook 0 t)
!        ("quantity"   "" vhdl-template-quantity-hook 0 t)
!        ("reference"  "" vhdl-template-default-hook 0 t)
!        ("spectrum"   "" vhdl-template-default-hook 0 t)
!        ("subnature"  "" vhdl-template-subnature-hook 0 t)
!        ("terminal"   "" vhdl-template-terminal-hook 0 t)
!        ("through"    "" vhdl-template-default-hook 0 t)
!        ("tolerance"  "" vhdl-template-default-hook 0 t)
         ))
       ;; user model keywords
       (when (memq 'user vhdl-electric-keywords)
--- 2893,3026 ----
       (when (memq 'vhdl vhdl-electric-keywords)
         ;; VHDL'93 keywords
         '(
!        ("--"            "" vhdl-template-display-comment-hook 0)
!        ("abs"           "" vhdl-template-default-hook 0)
!        ("access"        "" vhdl-template-default-hook 0)
!        ("after"         "" vhdl-template-default-hook 0)
!        ("alias"         "" vhdl-template-alias-hook 0)
!        ("all"           "" vhdl-template-default-hook 0)
!        ("and"           "" vhdl-template-default-hook 0)
!        ("arch"          "" vhdl-template-architecture-hook 0)
!        ("architecture"  "" vhdl-template-architecture-hook 0)
!        ("array"         "" vhdl-template-default-hook 0)
!        ("assert"        "" vhdl-template-assert-hook 0)
!        ("attr"          "" vhdl-template-attribute-hook 0)
!        ("attribute"     "" vhdl-template-attribute-hook 0)
!        ("begin"         "" vhdl-template-default-indent-hook 0)
!        ("block"         "" vhdl-template-block-hook 0)
!        ("body"          "" vhdl-template-default-hook 0)
!        ("buffer"        "" vhdl-template-default-hook 0)
!        ("bus"           "" vhdl-template-default-hook 0)
!        ("case"          "" vhdl-template-case-hook 0)
!        ("comp"          "" vhdl-template-component-hook 0)
!        ("component"     "" vhdl-template-component-hook 0)
!        ("cond"          "" vhdl-template-conditional-signal-asst-hook 0)
!        ("conditional"   "" vhdl-template-conditional-signal-asst-hook 0)
!        ("conf"          "" vhdl-template-configuration-hook 0)
!        ("configuration" "" vhdl-template-configuration-hook 0)
!        ("cons"          "" vhdl-template-constant-hook 0)
!        ("constant"      "" vhdl-template-constant-hook 0)
!        ("disconnect"    "" vhdl-template-disconnect-hook 0)
!        ("downto"        "" vhdl-template-default-hook 0)
!        ("else"          "" vhdl-template-else-hook 0)
!        ("elseif"        "" vhdl-template-elsif-hook 0)
!        ("elsif"         "" vhdl-template-elsif-hook 0)
!        ("end"           "" vhdl-template-default-indent-hook 0)
!        ("entity"        "" vhdl-template-entity-hook 0)
!        ("exit"          "" vhdl-template-exit-hook 0)
!        ("file"          "" vhdl-template-file-hook 0)
!        ("for"           "" vhdl-template-for-hook 0)
!        ("func"          "" vhdl-template-function-hook 0)
!        ("function"      "" vhdl-template-function-hook 0)
!        ("generic"       "" vhdl-template-generic-hook 0)
!        ("group"         "" vhdl-template-group-hook 0)
!        ("guarded"       "" vhdl-template-default-hook 0)
!        ("if"            "" vhdl-template-if-hook 0)
!        ("impure"        "" vhdl-template-default-hook 0)
!        ("in"            "" vhdl-template-default-hook 0)
!        ("inertial"      "" vhdl-template-default-hook 0)
!        ("inout"         "" vhdl-template-default-hook 0)
!        ("inst"          "" vhdl-template-instance-hook 0)
!        ("instance"      "" vhdl-template-instance-hook 0)
!        ("is"            "" vhdl-template-default-hook 0)
!        ("label"         "" vhdl-template-default-hook 0)
!        ("library"       "" vhdl-template-library-hook 0)
!        ("linkage"       "" vhdl-template-default-hook 0)
!        ("literal"       "" vhdl-template-default-hook 0)
!        ("loop"          "" vhdl-template-bare-loop-hook 0)
!        ("map"           "" vhdl-template-map-hook 0)
!        ("mod"           "" vhdl-template-default-hook 0)
!        ("nand"          "" vhdl-template-default-hook 0)
!        ("new"           "" vhdl-template-default-hook 0)
!        ("next"          "" vhdl-template-next-hook 0)
!        ("nor"           "" vhdl-template-default-hook 0)
!        ("not"           "" vhdl-template-default-hook 0)
!        ("null"          "" vhdl-template-default-hook 0)
!        ("of"            "" vhdl-template-default-hook 0)
!        ("on"            "" vhdl-template-default-hook 0)
!        ("open"          "" vhdl-template-default-hook 0)
!        ("or"            "" vhdl-template-default-hook 0)
!        ("others"        "" vhdl-template-others-hook 0)
!        ("out"           "" vhdl-template-default-hook 0)
!        ("pack"          "" vhdl-template-package-hook 0)
!        ("package"       "" vhdl-template-package-hook 0)
!        ("port"          "" vhdl-template-port-hook 0)
!        ("postponed"     "" vhdl-template-default-hook 0)
!        ("procedure"     "" vhdl-template-procedure-hook 0)
!        ("process"       "" vhdl-template-process-hook 0)
!        ("pure"          "" vhdl-template-default-hook 0)
!        ("range"         "" vhdl-template-default-hook 0)
!        ("record"        "" vhdl-template-default-hook 0)
!        ("register"      "" vhdl-template-default-hook 0)
!        ("reject"        "" vhdl-template-default-hook 0)
!        ("rem"           "" vhdl-template-default-hook 0)
!        ("report"        "" vhdl-template-report-hook 0)
!        ("return"        "" vhdl-template-return-hook 0)
!        ("rol"           "" vhdl-template-default-hook 0)
!        ("ror"           "" vhdl-template-default-hook 0)
!        ("select"        "" vhdl-template-selected-signal-asst-hook 0)
!        ("severity"      "" vhdl-template-default-hook 0)
!        ("shared"        "" vhdl-template-default-hook 0)
!        ("sig"           "" vhdl-template-signal-hook 0)
!        ("signal"        "" vhdl-template-signal-hook 0)
!        ("sla"           "" vhdl-template-default-hook 0)
!        ("sll"           "" vhdl-template-default-hook 0)
!        ("sra"           "" vhdl-template-default-hook 0)
!        ("srl"           "" vhdl-template-default-hook 0)
!        ("subtype"       "" vhdl-template-subtype-hook 0)
!        ("then"          "" vhdl-template-default-hook 0)
!        ("to"            "" vhdl-template-default-hook 0)
!        ("transport"     "" vhdl-template-default-hook 0)
!        ("type"          "" vhdl-template-type-hook 0)
!        ("unaffected"    "" vhdl-template-default-hook 0)
!        ("units"         "" vhdl-template-default-hook 0)
!        ("until"         "" vhdl-template-default-hook 0)
!        ("use"           "" vhdl-template-use-hook 0)
!        ("var"           "" vhdl-template-variable-hook 0)
!        ("variable"      "" vhdl-template-variable-hook 0)
!        ("wait"          "" vhdl-template-wait-hook 0)
!        ("when"          "" vhdl-template-when-hook 0)
!        ("while"         "" vhdl-template-while-loop-hook 0)
!        ("with"          "" vhdl-template-with-hook 0)
!        ("xnor"          "" vhdl-template-default-hook 0)
!        ("xor"           "" vhdl-template-default-hook 0)
         ))
       ;; VHDL-AMS keywords
       (when (and (memq 'vhdl vhdl-electric-keywords) (vhdl-standard-p 'ams))
         '(
!        ("across"     "" vhdl-template-default-hook 0)
!        ("break"      "" vhdl-template-break-hook 0)
!        ("limit"      "" vhdl-template-limit-hook 0)
!        ("nature"     "" vhdl-template-nature-hook 0)
!        ("noise"      "" vhdl-template-default-hook 0)
!        ("procedural" "" vhdl-template-procedural-hook 0)
!        ("quantity"   "" vhdl-template-quantity-hook 0)
!        ("reference"  "" vhdl-template-default-hook 0)
!        ("spectrum"   "" vhdl-template-default-hook 0)
!        ("subnature"  "" vhdl-template-subnature-hook 0)
!        ("terminal"   "" vhdl-template-terminal-hook 0)
!        ("through"    "" vhdl-template-default-hook 0)
!        ("tolerance"  "" vhdl-template-default-hook 0)
         ))
       ;; user model keywords
       (when (memq 'user vhdl-electric-keywords)
***************
*** 2940,2946 ****
             (setq abbrev-list
                   (cons (list keyword ""
                               (vhdl-function-name
!                               "vhdl-model" (nth 0 (car alist)) "hook") 0 t)
                         abbrev-list)))
           (setq alist (cdr alist)))
         abbrev-list)))))
--- 3032,3038 ----
             (setq abbrev-list
                   (cons (list keyword ""
                               (vhdl-function-name
!                               "vhdl-model" (nth 0 (car alist)) "hook") 0)
                         abbrev-list)))
           (setq alist (cdr alist)))
         abbrev-list)))))
***************
*** 3094,3099 ****
--- 3186,3192 ----
        (vhdl-menu-split menu-list "Project"))
        '("--" "--"
        ["Select Project..."    vhdl-set-project t]
+       ["Set As Default Project" vhdl-set-default-project t]
        "--"
        ["Duplicate Project"    vhdl-duplicate-project vhdl-project]
        ["Import Project..."    vhdl-import-project
***************
*** 3280,3288 ****
--- 3373,3383 ----
        :style toggle :selected vhdl-port-reversed-direction :active 
vhdl-port-list])
      ("Compose"
       ["New Component"         vhdl-compose-new-component t]
+      ["Copy Component"                vhdl-port-copy t]
       ["Place Component"               vhdl-compose-place-component 
vhdl-port-list]
       ["Wire Components"               vhdl-compose-wire-components t]
       "--"
+      ["Generate Configuration"        vhdl-compose-configuration t]
       ["Generate Components Package"   vhdl-compose-components-package t])
      ("Subprogram"
       ["Copy"                  vhdl-subprog-copy t]
***************
*** 3526,3531 ****
--- 3621,3628 ----
        ["Entity File Name..." (customize-option 'vhdl-entity-file-name) t]
        ["Architecture File Name..."
         (customize-option 'vhdl-architecture-file-name) t]
+       ["Configuration File Name..."
+        (customize-option 'vhdl-configuration-file-name) t]
        ["Package File Name..." (customize-option 'vhdl-package-file-name) t]
        ("File Name Case"
         ["As Is"
***************
*** 3695,3705 ****
         :style radio :selected (eq 'single vhdl-testbench-create-files)]
        ["Separate"
         (customize-set-variable 'vhdl-testbench-create-files 'separate)
!        :style radio :selected (eq 'separate vhdl-testbench-create-files)]))
        "--"
        ["Customize Group..." (customize-group 'vhdl-port) t])
       ("Compose"
!       ("Create Files"
         ["None"
        (customize-set-variable 'vhdl-compose-create-files 'none)
        :style radio :selected (eq 'none vhdl-compose-create-files)]
--- 3792,3820 ----
         :style radio :selected (eq 'single vhdl-testbench-create-files)]
        ["Separate"
         (customize-set-variable 'vhdl-testbench-create-files 'separate)
!        :style radio :selected (eq 'separate vhdl-testbench-create-files)])
!        ["Testbench Entity File Name..."
!       (customize-option 'vhdl-testbench-entity-file-name) t]
!        ["Testbench Architecture File Name..."
!       (customize-option 'vhdl-testbench-architecture-file-name) t])
        "--"
        ["Customize Group..." (customize-group 'vhdl-port) t])
       ("Compose"
!       ["Architecture Name..."
!        (customize-option 'vhdl-compose-architecture-name) t]
!       ["Configuration Name..."
!        (customize-option 'vhdl-compose-configuration-name) t]
!       ["Components Package Name..."
!        (customize-option 'vhdl-components-package-name) t]
!       ["Use Components Package"
!        (customize-set-variable 'vhdl-use-components-package
!                              (not vhdl-use-components-package))
!        :style toggle :selected vhdl-use-components-package]
!       ["Include Header"
!        (customize-set-variable 'vhdl-compose-include-header
!                              (not vhdl-compose-include-header))
!        :style toggle :selected vhdl-compose-include-header]
!       ("Create Entity/Architecture Files"
         ["None"
        (customize-set-variable 'vhdl-compose-create-files 'none)
        :style radio :selected (eq 'none vhdl-compose-create-files)]
***************
*** 3709,3726 ****
         ["Separate"
        (customize-set-variable 'vhdl-compose-create-files 'separate)
        :style radio :selected (eq 'separate vhdl-compose-create-files)])
!       ["Include Header"
!        (customize-set-variable 'vhdl-compose-include-header
!                              (not vhdl-compose-include-header))
!        :style toggle :selected vhdl-compose-include-header]
!       ["Architecture Name..."
!        (customize-option 'vhdl-compose-architecture-name) t]
!       ["Components Package Name..."
!        (customize-option 'vhdl-components-package-name) t]
!       ["Use Components Package"
!        (customize-set-variable 'vhdl-use-components-package
!                              (not vhdl-use-components-package))
!        :style toggle :selected vhdl-use-components-package]
        "--"
        ["Customize Group..." (customize-group 'vhdl-compose) t])
       ("Comment"
--- 3824,3841 ----
         ["Separate"
        (customize-set-variable 'vhdl-compose-create-files 'separate)
        :style radio :selected (eq 'separate vhdl-compose-create-files)])
!       ["Create Configuration File"
!        (customize-set-variable 'vhdl-compose-configuration-create-file
!                              (not vhdl-compose-configuration-create-file))
!        :style toggle :selected vhdl-compose-configuration-create-file]
!       ["Hierarchical Configuration"
!        (customize-set-variable 'vhdl-compose-configuration-hierarchical
!                              (not vhdl-compose-configuration-hierarchical))
!        :style toggle :selected vhdl-compose-configuration-hierarchical]
!       ["Use Subconfiguration"
!        (customize-set-variable 
'vhdl-compose-configuration-use-subconfiguration
!                              (not 
vhdl-compose-configuration-use-subconfiguration))
!        :style toggle :selected 
vhdl-compose-configuration-use-subconfiguration]
        "--"
        ["Customize Group..." (customize-group 'vhdl-compose) t])
       ("Comment"
***************
*** 4172,4184 ****
      symbols are surrounded by one space, and multiple spaces are eliminated.
  
  
! | CODE FILLING:
! |   Code filling allows to condens code (e.g. sensitivity lists or port
! |   maps) by removing comments and newlines and re-wrapping so that all
! |   lines are maximally filled (block filling).  `C-c C-f C-f' fills a list
! |   enclosed by parenthesis, `C-c C-f C-g' a group of lines separated by
! |   blank lines, `C-c C-f C-i' a block of lines with same indent, and
! |   `C-c C-f M-f' an entire region.
  
  
    CODE BEAUTIFICATION:
--- 4287,4299 ----
      symbols are surrounded by one space, and multiple spaces are eliminated.
  
  
!   CODE FILLING:
!     Code filling allows to condense code (e.g. sensitivity lists or port
!     maps) by removing comments and newlines and re-wrapping so that all
!     lines are maximally filled (block filling).  `C-c C-f C-f' fills a list
!     enclosed by parenthesis, `C-c C-f C-g' a group of lines separated by
!     blank lines, `C-c C-f C-i' a block of lines with same indent, and
!     `C-c C-f M-f' an entire region.
  
  
    CODE BEAUTIFICATION:
***************
*** 4203,4223 ****
  
        A clause with several generic/port names on the same line can be
      flattened (`C-c C-p C-f') so that only one name per line exists.  The
! |   direction of ports can be reversed (`C-c C-p C-r'), i.e., inputs become
! |   outputs and vice versa, which can be useful in testbenches.  (This
! |   reversion is done on the internal data structure and is only reflected
! |   in subsequent paste operations.)
  
        Names for actual ports, instances, testbenches, and
      design-under-test instances can be derived from existing names according
      to options `vhdl-...-name'.  See customization group `vhdl-port'.
  
  
! | SUBPROGRAM TRANSLATION:
! |   Similar functionality exists for copying/pasting the interface of
! |   subprograms (function/procedure).  A subprogram interface can be copied
! |   and then pasted as a subprogram declaration, body or call (uses
! |   association list with formals).
  
  
    TESTBENCH GENERATION:
--- 4318,4338 ----
  
        A clause with several generic/port names on the same line can be
      flattened (`C-c C-p C-f') so that only one name per line exists.  The
!     direction of ports can be reversed (`C-c C-p C-r'), i.e., inputs become
!     outputs and vice versa, which can be useful in testbenches.  (This
!     reversion is done on the internal data structure and is only reflected
!     in subsequent paste operations.)
  
        Names for actual ports, instances, testbenches, and
      design-under-test instances can be derived from existing names according
      to options `vhdl-...-name'.  See customization group `vhdl-port'.
  
  
!   SUBPROGRAM TRANSLATION:
!     Similar functionality exists for copying/pasting the interface of
!     subprograms (function/procedure).  A subprogram interface can be copied
!     and then pasted as a subprogram declaration, body or call (uses
!     association list with formals).
  
  
    TESTBENCH GENERATION:
***************
*** 4273,4310 ****
      required by secondary units.
  
  
! | STRUCTURAL COMPOSITION:
! |   Enables simple structural composition.  `C-c C-c C-n' creates a skeleton
! |   for a new component.  Subcomponents (i.e. component declaration and
! |   instantiation) can be automatically placed from a previously read port
! |   \(`C-c C-c C-p') or directly from the hierarchy browser (`P').  Finally,
! |   all subcomponents can be automatically connected using internal signals
! |   and ports (`C-c C-c C-w') following these rules:
! |     - subcomponent actual ports with same name are considered to be
! |       connected by a signal (internal signal or port)
! |     - signals that are only inputs to subcomponents are considered as
! |       inputs to this component -> input port created
! |     - signals that are only outputs from subcomponents are considered as
! |       outputs from this component -> output port created
! |     - signals that are inputs to AND outputs from subcomponents are
! |       considered as internal connections -> internal signal created
! |
! |     Component declarations can be placed in a components package (option
! |   `vhdl-use-components-package') which can be automatically generated for
! |   an entire directory or project (`C-c C-c M-p').  The VHDL'93 direct
! |   component instantiation is also supported (option
! |   `vhdl-use-direct-instantiation').
! |
! |     Purpose:  With appropriate naming conventions it is possible to
! |   create higher design levels with only a few mouse clicks or key
! |   strokes.  A new design level can be created by simply generating a new
! |   component, placing the required subcomponents from the hierarchy
! |   browser, and wiring everything automatically.
! |
! |     Note: Automatic wiring only works reliably on templates of new
! |   components and component instantiations that were created by VHDL mode.
  |
! |     See the options group `vhdl-compose' for all relevant user options.
  
  
    SOURCE FILE COMPILATION:
--- 4388,4441 ----
      required by secondary units.
  
  
!   STRUCTURAL COMPOSITION:
!     Enables simple structural composition.  `C-c C-c C-n' creates a skeleton
!     for a new component.  Subcomponents (i.e. component declaration and
!     instantiation) can be automatically placed from a previously read port
!     \(`C-c C-c C-p') or directly from the hierarchy browser (`P').  Finally,
!     all subcomponents can be automatically connected using internal signals
!     and ports (`C-c C-c C-w') following these rules:
!       - subcomponent actual ports with same name are considered to be
!         connected by a signal (internal signal or port)
!       - signals that are only inputs to subcomponents are considered as
!         inputs to this component -> input port created
!       - signals that are only outputs from subcomponents are considered as
!         outputs from this component -> output port created
!       - signals that are inputs to AND outputs from subcomponents are
!         considered as internal connections -> internal signal created
!  
!       Purpose:  With appropriate naming conventions it is possible to
!     create higher design levels with only a few mouse clicks or key
!     strokes.  A new design level can be created by simply generating a new
!     component, placing the required subcomponents from the hierarchy
!     browser, and wiring everything automatically.
!  
!       Note: Automatic wiring only works reliably on templates of new
!     components and component instantiations that were created by VHDL mode.
!  
!       Component declarations can be placed in a components package (option
!     `vhdl-use-components-package') which can be automatically generated for
!     an entire directory or project (`C-c C-c M-p').  The VHDL'93 direct
!     component instantiation is also supported (option
!     `vhdl-use-direct-instantiation').
! 
! |     Configuration declarations can automatically be generated either from
! |   the menu (`C-c C-c C-f') (for the architecture the cursor is in) or from
! |   the speedbar menu (for the architecture under the cursor).  The
! |   configurations can optionally be hierarchical (i.e. include all
! |   component levels of a hierarchical design, option
! |   `vhdl-compose-configuration-hierarchical') or include subconfigurations
! |   (option `vhdl-compose-configuration-use-subconfiguration').  For
! |   subcomponents in hierarchical configurations, the most-recently-analyzed
! |   (mra) architecture is selected.  If another architecture is desired, it
! |   can be marked as most-recently-analyzed (speedbar menu) before
! |   generating the configuration.
  |
! |     Note: Configurations of subcomponents (i.e. hierarchical configuration
! |   declarations) are currently not considered when displaying
! |   configurations in speedbar.
!  
!       See the options group `vhdl-compose' for all relevant user options.
  
  
    SOURCE FILE COMPILATION:
***************
*** 4568,4579 ****
    (set (make-local-variable 'paragraph-separate) paragraph-start)
    (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
    (set (make-local-variable 'require-final-newline)
!        mode-require-final-newline)
    (set (make-local-variable 'parse-sexp-ignore-comments) t)
    (set (make-local-variable 'indent-line-function) 'vhdl-indent-line)
    (set (make-local-variable 'comment-start) "--")
    (set (make-local-variable 'comment-end) "")
!   (set (make-local-variable 'comment-padding) "")
    (set (make-local-variable 'comment-column) vhdl-inline-comment-column)
    (set (make-local-variable 'end-comment-column) vhdl-end-comment-column)
    (set (make-local-variable 'comment-start-skip) "--+\\s-*")
--- 4699,4711 ----
    (set (make-local-variable 'paragraph-separate) paragraph-start)
    (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
    (set (make-local-variable 'require-final-newline)
!        (if vhdl-emacs-22 mode-require-final-newline t))
    (set (make-local-variable 'parse-sexp-ignore-comments) t)
    (set (make-local-variable 'indent-line-function) 'vhdl-indent-line)
    (set (make-local-variable 'comment-start) "--")
    (set (make-local-variable 'comment-end) "")
!   (when vhdl-emacs-21
!     (set (make-local-variable 'comment-padding) ""))
    (set (make-local-variable 'comment-column) vhdl-inline-comment-column)
    (set (make-local-variable 'end-comment-column) vhdl-end-comment-column)
    (set (make-local-variable 'comment-start-skip) "--+\\s-*")
***************
*** 4626,4632 ****
           (if noninteractive "" "  See menu for documentation and release 
notes."))
  
    ;; run hooks
!   (run-mode-hooks 'vhdl-mode-hook))
  
  (defun vhdl-activate-customizations ()
    "Activate all customizations on local variables."
--- 4758,4766 ----
           (if noninteractive "" "  See menu for documentation and release 
notes."))
  
    ;; run hooks
!   (if vhdl-emacs-22
!       (run-mode-hooks 'vhdl-mode-hook)
!     (run-hooks 'vhdl-mode-hook)))
  
  (defun vhdl-activate-customizations ()
    "Activate all customizations on local variables."
***************
*** 5235,5240 ****
--- 5369,5375 ----
        (cond
         ((nth 3 state) 'string)
         ((nth 4 state) 'comment)
+        ((vhdl-beginning-of-macro) 'pound)
         (t nil)))))
  
  (defun vhdl-forward-comment (&optional direction)
***************
*** 5317,5330 ****
  
  (defun vhdl-forward-syntactic-ws (&optional lim)
    "Forward skip of syntactic whitespace."
!   (save-restriction
!     (let* ((lim (or lim (point-max)))
!          (here lim)
!          (hugenum (point-max)))
!       (narrow-to-region lim (point))
!       (while (/= here (point))
!       (setq here (point))
!       (vhdl-forward-comment hugenum)))))
  
  ;; This is the best we can do in Win-Emacs.
  (defun vhdl-win-fsws (&optional lim)
--- 5452,5470 ----
  
  (defun vhdl-forward-syntactic-ws (&optional lim)
    "Forward skip of syntactic whitespace."
!   (let* ((here (point-max))
!        (hugenum (point-max)))
!     (while (/= here (point))
!       (setq here (point))
!       (vhdl-forward-comment hugenum)
!       ;; skip preprocessor directives
!       (when (and (eq (char-after) ?#)
!                (= (vhdl-point 'boi) (point)))
!       (while (and (eq (char-before (vhdl-point 'eol)) ?\\)
!                   (= (forward-line 1) 0)))
!       (end-of-line)))
!     (if lim (goto-char (min (point) lim)))))
! 
  
  ;; This is the best we can do in Win-Emacs.
  (defun vhdl-win-fsws (&optional lim)
***************
*** 5342,5359 ****
  (and (string-match "Win-Emacs" emacs-version)
       (fset 'vhdl-forward-syntactic-ws 'vhdl-win-fsws))
  
  (defun vhdl-backward-syntactic-ws (&optional lim)
    "Backward skip over syntactic whitespace."
!   (save-restriction
!     (let* ((lim (or lim (point-min)))
!          (here lim)
!          (hugenum (- (point-max))))
!       (if (< lim (point))
!         (progn
!           (narrow-to-region lim (point))
!           (while (/= here (point))
!             (setq here (point))
!             (vhdl-forward-comment hugenum)))))))
  
  ;; This is the best we can do in Win-Emacs.
  (defun vhdl-win-bsws (&optional lim)
--- 5482,5509 ----
  (and (string-match "Win-Emacs" emacs-version)
       (fset 'vhdl-forward-syntactic-ws 'vhdl-win-fsws))
  
+ (defun vhdl-beginning-of-macro (&optional lim)
+   "Go to the beginning of a cpp macro definition (nicked from `cc-engine')."
+   (let ((here (point)))
+     (beginning-of-line)
+     (while (eq (char-before (1- (point))) ?\\)
+       (forward-line -1))
+     (back-to-indentation)
+     (if (and (<= (point) here)
+            (eq (char-after) ?#))
+       t
+       (goto-char here)
+       nil)))
+ 
  (defun vhdl-backward-syntactic-ws (&optional lim)
    "Backward skip over syntactic whitespace."
!   (let* ((here (point-min))
!        (hugenum (- (point-max))))
!     (while (/= here (point))
!       (setq here (point))
!       (vhdl-forward-comment hugenum)
!       (vhdl-beginning-of-macro))
!     (if lim (goto-char (max (point) lim)))))
  
  ;; This is the best we can do in Win-Emacs.
  (defun vhdl-win-bsws (&optional lim)
***************
*** 5603,5609 ****
        (save-excursion
        (re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
        (or (eq (following-char) ?\;)
!           (eq (point) lim)))))
  
  (defun vhdl-corresponding-begin (&optional lim)
    "If the word at the current position corresponds to an \"end\"
--- 5753,5760 ----
        (save-excursion
        (re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
        (or (eq (following-char) ?\;)
!           (eq (point) lim)
!           (vhdl-in-literal)))))
  
  (defun vhdl-corresponding-begin (&optional lim)
    "If the word at the current position corresponds to an \"end\"
***************
*** 5672,5686 ****
                      ;; return an alist of (statement . keyword) mappings
                      '(
                        ;; "begin ... end [id]":
!                       ("begin"          . nil)
                        ;; "architecture ... is ... begin ... end [id]":
!                       ("architecture"   . "is")
                        ;; "configuration ... is ... end [id]":
                        ("configuration"  . "is")
                        ;; "entity ... is ... end [id]":
!                       ("entity"         . "is")
                        ;; "package ... is ... end [id]":
!                       ("package"        . "is")
                        ;; "procedure ... is ... begin ... end [id]":
                        ("procedure"      . "is")
                        ;; "function ... is ... begin ... end [id]":
--- 5823,5837 ----
                      ;; return an alist of (statement . keyword) mappings
                      '(
                        ;; "begin ... end [id]":
!                       ("begin"          . nil)
                        ;; "architecture ... is ... begin ... end [id]":
!                       ("architecture"   . "is")
                        ;; "configuration ... is ... end [id]":
                        ("configuration"  . "is")
                        ;; "entity ... is ... end [id]":
!                       ("entity"         . "is")
                        ;; "package ... is ... end [id]":
!                       ("package"        . "is")
                        ;; "procedure ... is ... begin ... end [id]":
                        ("procedure"      . "is")
                        ;; "function ... is ... begin ... end [id]":
***************
*** 5721,5727 ****
          )))
  
  (defconst vhdl-trailer-re
!   "\\b\\(is\\|then\\|generate\\|loop\\)\\b[^_]")
  
  (defconst vhdl-statement-fwd-re
    "\\b\\(if\\|for\\|while\\)\\b\\([^_]\\|\\'\\)"
--- 5872,5878 ----
          )))
  
  (defconst vhdl-trailer-re
!   "\\b\\(is\\|then\\|generate\\|loop\\|record\\)\\b[^_]")
  
  (defconst vhdl-statement-fwd-re
    "\\b\\(if\\|for\\|while\\)\\b\\([^_]\\|\\'\\)"
***************
*** 6076,6083 ****
  stops due to beginning or end of buffer."
    ;; Note that if point is between the "defun" keyword and the
    ;; corresponding "begin" keyword, then that defun will not be
!   ;; recognised, and the search will continue backwards.  If point is
!   ;; at the "begin" keyword, then the defun will be recognised.  The
    ;; returned point is at the first character of the "defun" keyword.
    (interactive "p")
    (let ((count (or count 1))
--- 6227,6234 ----
  stops due to beginning or end of buffer."
    ;; Note that if point is between the "defun" keyword and the
    ;; corresponding "begin" keyword, then that defun will not be
!   ;; recognized, and the search will continue backwards.  If point is
!   ;; at the "begin" keyword, then the defun will be recognized.  The
    ;; returned point is at the first character of the "defun" keyword.
    (interactive "p")
    (let ((count (or count 1))
***************
*** 6138,6145 ****
  whitespace between), move by sentences instead of statements.
  
  When called from a program, this function takes 3 optional args: the
! prefix arg, and a buffer position limit which is the farthest back to
! search, and something whose meaning I don't understand."
    (interactive "p\np")
    (let ((count (or count 1))
        (case-fold-search t)
--- 6289,6296 ----
  whitespace between), move by sentences instead of statements.
  
  When called from a program, this function takes 3 optional args: the
! prefix arg, a buffer position limit which is the farthest back to
! search, and an argument indicating an interactive call."
    (interactive "p\np")
    (let ((count (or count 1))
        (case-fold-search t)
***************
*** 6698,6703 ****
--- 6849,6856 ----
        (skip-chars-forward " \t")
        (if (looking-at "--")
            (vhdl-add-syntax 'comment))
+       (if (eq literal 'pound)
+           (vhdl-add-syntax 'cpp-macro))
        ;; return the syntax
        vhdl-syntactic-context))))
  
***************
*** 6773,6779 ****
              vhdl-comment-only-line-offset)
        (or (cdr-safe vhdl-comment-only-line-offset)
            (car-safe vhdl-comment-only-line-offset)
!           -1000                       ;jam it against the left side
            )))))
  
  (defun vhdl-lineup-statement-cont (langelem)
--- 6926,6932 ----
              vhdl-comment-only-line-offset)
        (or (cdr-safe vhdl-comment-only-line-offset)
            (car-safe vhdl-comment-only-line-offset)
!           -1000                       ;jam it against the left side
            )))))
  
  (defun vhdl-lineup-statement-cont (langelem)
***************
*** 7467,7501 ****
      (setq end (point-marker))
      ;; have no space before and one space after `,' and ';'
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\)\\|\\(\\s-*\\([,;]\\)\\)" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\3 " nil nil nil 3)))
      ;; have no space after `('
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\)\\|\\((\\)\\s-+" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\2")))
      ;; have no space before `)'
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|^\\s-+\\)\\|\\s-+\\()\\)" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\2")))
      ;; surround operator symbols by one space
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\)\\|\\(\\([^/:<>=]\\)\\(:\\|=\\|<\\|>\\|:=\\|<=\\|>=\\|=>\\|/=\\)\\([^=>]\\|$\\)\\)"
 end t)
        (if (match-string 1)
          (goto-char (match-end 1))
!       (save-excursion
!         (goto-char (match-beginning 4))
!         (unless (eq (preceding-char) ?\ )
!           (insert " "))
!         (goto-char (match-end 4))
!         (unless (eq (following-char) ?\ )
!           (insert " ")))
!       (goto-char (match-end 4))))
      ;; eliminate multiple spaces and spaces at end of line
      (goto-char beg)
      (while (or (and (looking-at "--.*\n") (re-search-forward "--.*\n" end t))
--- 7620,7648 ----
      (setq end (point-marker))
      ;; have no space before and one space after `,' and ';'
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\)\\|\\(\\s-*\\([,;]\\)\\)" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\3 " nil nil nil 3)))
      ;; have no space after `('
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\)\\|\\((\\)\\s-+" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\2")))
      ;; have no space before `)'
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\|^\\s-+\\)\\|\\s-+\\()\\)" end t)
        (if (match-string 1)
          (goto-char (match-end 1))
        (replace-match "\\2")))
      ;; surround operator symbols by one space
      (goto-char beg)
!     (while (re-search-forward 
"\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\)\\|\\(\\([^/:<>=]\\)\\(:\\|=\\|<\\|>\\|:=\\|<=\\|>=\\|=>\\|/=\\)\\([^=>]\\|$\\)\\)"
 end t)
        (if (match-string 1)
          (goto-char (match-end 1))
!       (replace-match "\\3 \\4 \\5")
!       (goto-char (match-end 2))))
      ;; eliminate multiple spaces and spaces at end of line
      (goto-char beg)
      (while (or (and (looking-at "--.*\n") (re-search-forward "--.*\n" end t))
***************
*** 7509,7515 ****
                    (progn (replace-match "  " nil nil) t))
               (and (looking-at "\\s-+") (re-search-forward "\\s-+" end t)
                    (progn (replace-match " " nil nil) t))
!              (re-search-forward "[^ \t-]+" end t))))
    (unless no-message (message "Fixing up whitespace...done")))
  
  (defun vhdl-fixup-whitespace-buffer ()
--- 7656,7663 ----
                    (progn (replace-match "  " nil nil) t))
               (and (looking-at "\\s-+") (re-search-forward "\\s-+" end t)
                    (progn (replace-match " " nil nil) t))
! ;            (re-search-forward "[^ \t-]+" end t))))
!              (re-search-forward "[^ \t\"-]+" end t))))
    (unless no-message (message "Fixing up whitespace...done")))
  
  (defun vhdl-fixup-whitespace-buffer ()
***************
*** 7627,7633 ****
       (message "Updating sensitivity lists...")
       (while (re-search-forward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?process\\>" 
nil t)
         (goto-char (match-beginning 0))
!        (condition-case nil (vhdl-update-sensitivity-list) (error)))
       (message "Updating sensitivity lists...done"))))
  
  (defun vhdl-update-sensitivity-list ()
--- 7775,7781 ----
       (message "Updating sensitivity lists...")
       (while (re-search-forward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?process\\>" 
nil t)
         (goto-char (match-beginning 0))
!        (condition-case nil (vhdl-update-sensitivity-list) (error "")))
       (message "Updating sensitivity lists...done"))))
  
  (defun vhdl-update-sensitivity-list ()
***************
*** 7671,7678 ****
                ((re-search-forward "^\\s-*case\\>" proc-end t)
                 (re-search-forward "\\<is\\>" proc-end t))
                ;; parameter list of procedure call
!               ((re-search-forward "^\\s-*\\w+[ \t\n]*(" proc-end t)
!                (progn (backward-char) (forward-sexp) (point)))))
             name read-list sens-list signal-list
             sens-beg sens-end beg end margin)
          ;; scan for signals in old sensitivity list
--- 7819,7828 ----
                ((re-search-forward "^\\s-*case\\>" proc-end t)
                 (re-search-forward "\\<is\\>" proc-end t))
                ;; parameter list of procedure call
!               ((and (re-search-forward "^\\s-*\\w+[ \t\n]*(" proc-end t)
!                     (1- (point)))
!                (progn (backward-char) (forward-sexp)
!                       (while (looking-at "(") (forward-sexp)) (point)))))
             name read-list sens-list signal-list
             sens-beg sens-end beg end margin)
          ;; scan for signals in old sensitivity list
***************
*** 7713,7722 ****
                                             (< (point) (caar tmp-list)))
                                   (setq tmp-list (cdr tmp-list)))
                                 (and tmp-list (< (point) (cdar tmp-list))))))
!               (while (vhdl-re-search-forward "[^'\"]\\<\\([a-zA-Z]\\w*\\)\\>" 
end t)
                  (setq name (match-string 1))
!                 (when (member (downcase name) signal-list)
!                   (add-to-list 'read-list name)))))
            (setq scan-regions-list (cdr scan-regions-list)))
          ;; update sensitivity list
          (goto-char sens-beg)
--- 7863,7878 ----
                                             (< (point) (caar tmp-list)))
                                   (setq tmp-list (cdr tmp-list)))
                                 (and tmp-list (< (point) (cdar tmp-list))))))
!               (while (vhdl-re-search-forward "[^'\"]\\<\\([a-zA-Z]\\w*\\)\\>[ 
\t\n]*\\('\\(\\w+\\)\\|\\(=>\\)\\)?" end t)
                  (setq name (match-string 1))
!                 (when (and (not (match-string 4)) ; not when formal parameter
!                            (not (and (match-string 3) ; not event attribute
!                                      (not (member (downcase (match-string 3))
!                                                   '("event" "last_event" 
"transaction")))))
!                            (member (downcase name) signal-list))
!                   (unless (member-ignore-case name read-list)
!                     (setq read-list (cons name read-list))))
!                 (goto-char (match-end 1)))))
            (setq scan-regions-list (cdr scan-regions-list)))
          ;; update sensitivity list
          (goto-char sens-beg)
***************
*** 7740,7804 ****
  
  (defun vhdl-get-visible-signals ()
    "Get all signals visible in the current block."
!   (save-excursion
!     (let (beg end signal-list entity-name file-name)
!       ;; 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\\|\\(end\\)\\s-+block\\)\\>" nil t))
!                                      (match-string 2))
!                            (goto-char (match-end 2))
!                            (vhdl-backward-sexp)
!                            (re-search-backward 
"^\\s-*\\w+\\s-*:\\s-*block\\>" 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\\>" end t)
!           (while (and (not (looking-at "[ \t\n]*:"))
!                       (re-search-forward "[ \t\n,]+\\(\\w+\\)" end t))
!             (setq signal-list
!                   (cons (downcase (match-string 1)) signal-list))))
!         (goto-char beg)))
!       ;; search for signals declared in architecture declarative part
!       (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 entity-name (match-string 2))
!                   (setq end (re-search-forward "^begin\\>" nil t))))
!         (error "ERROR:  No architecture declarative part found")
!       ;; scan for all declared signal names
!       (goto-char beg)
!       (while (re-search-forward "^\\s-*signal\\>" end t)
!         (while (and (not (looking-at "[ \t\n]*:"))
!                     (re-search-forward "[ \t\n,]+\\(\\w+\\)" end t))
!           (setq signal-list
!                 (cons (downcase (match-string 1)) signal-list)))))
!       ;; search for signals declared in entity port clause
!       (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)
!                     "." (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 (re-search-forward
!                          "^\\s-*port[ \t\n]*("
!                          (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)
!             (while (and (not (looking-at "[ \t\n]*:"))
!                         (re-search-forward "[ \t\n,]*\\(\\w+\\)" end t))
!               (setq signal-list
!                     (cons (downcase (match-string 1)) signal-list)))
!             (re-search-forward ";" end 1)
!             (vhdl-forward-syntactic-ws))))))
!       signal-list)))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Generic/port clause fixing
--- 7896,7989 ----
  
  (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 (re-search-forward
!                           "^\\s-*port[ \t\n]*("
!                           (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]+")
!                (goto-char (match-end 0)))
!              (while (looking-at "\\(\\w+\\)[ \t\n,]+")
!                (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,]+\\(\\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))))
!            (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\\|\\(end\\)\\s-+block\\)\\>" nil t))
!                                     (match-string 2))
!                           (goto-char (match-end 2))
!                           (vhdl-backward-sexp)
!                           (re-search-backward "^\\s-*\\w+\\s-*:\\s-*block\\>" 
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)))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Generic/port clause fixing
***************
*** 9620,9630 ****
                          (match-string 2))))
                  (equal (downcase library) "work"))
        (vhdl-insert-keyword "LIBRARY ")
!       (insert library ";\n")
!       (indent-to margin))
!       (vhdl-insert-keyword "USE ")
!       (insert library "." package)
!       (vhdl-insert-keyword ".ALL;"))))
  
  (defun vhdl-template-package-math-complex ()
    "Insert specification of `math_complex' package."
--- 9805,9818 ----
                          (match-string 2))))
                  (equal (downcase library) "work"))
        (vhdl-insert-keyword "LIBRARY ")
!       (insert library ";")
!       (when package
!         (insert "\n")
!         (indent-to margin)))
!       (when package
!       (vhdl-insert-keyword "USE ")
!       (insert library "." package)
!       (vhdl-insert-keyword ".ALL;")))))
  
  (defun vhdl-template-package-math-complex ()
    "Insert specification of `math_complex' package."
***************
*** 10323,10329 ****
                                      (save-match-data
                                        (save-excursion
                                          (goto-char (match-end 5))
!                                         (forward-word 1) (forward-sexp)
                                          (re-search-forward 
"\\<is\\>\\|\\(;\\)" nil t))
                                        (match-string 1)))
                                 ;; not consider configuration specifications
--- 10511,10520 ----
                                      (save-match-data
                                        (save-excursion
                                          (goto-char (match-end 5))
!                                         (forward-word 1)
!                                         (vhdl-forward-syntactic-ws)
!                                         (when (looking-at "(")
!                                           (forward-sexp))
                                          (re-search-forward 
"\\<is\\>\\|\\(;\\)" nil t))
                                        (match-string 1)))
                                 ;; not consider configuration specifications
***************
*** 10683,10694 ****
                            (vhdl-current-line) string)))
      nil))
  
! (defun vhdl-replace-string (regexp-cons string)
    "Replace STRING from car of REGEXP-CONS to cdr of REGEXP-CONS."
    (vhdl-prepare-search-1
     (if (string-match (car regexp-cons) string)
!        (funcall vhdl-file-name-case
!               (replace-match (cdr regexp-cons) t nil string))
       string)))
  
  (defun vhdl-parse-group-comment ()
--- 10874,10887 ----
                            (vhdl-current-line) string)))
      nil))
  
! (defun vhdl-replace-string (regexp-cons string &optional adjust-case)
    "Replace STRING from car of REGEXP-CONS to cdr of REGEXP-CONS."
    (vhdl-prepare-search-1
     (if (string-match (car regexp-cons) string)
!        (if adjust-case
!          (funcall vhdl-file-name-case
!                   (replace-match (cdr regexp-cons) t nil string))
!        (replace-match (cdr regexp-cons) t nil string))
       string)))
  
  (defun vhdl-parse-group-comment ()
***************
*** 10697,10702 ****
--- 10890,10896 ----
        string)
      (vhdl-forward-comment (point-max))
      (setq string (buffer-substring-no-properties start (point)))
+     (vhdl-forward-syntactic-ws)
      ;; strip off leading blanks and first newline
      (while (string-match "^\\(\\s-+\\)" string)
        (setq string (concat (substring string 0 (match-beginning 1))
***************
*** 10722,10732 ****
    "Indicates whether a port has been flattened.")
  
  (defun vhdl-port-flatten (&optional as-alist)
!   "Flatten port list so that only one generic/port exists per line."
    (interactive)
    (if (not vhdl-port-list)
        (error "ERROR:  No port has been read")
!     (message "Flattening port...")
      (let ((new-vhdl-port-list (list (car vhdl-port-list)))
          (old-vhdl-port-list (cdr vhdl-port-list))
          old-port-list new-port-list old-port new-port names)
--- 10916,10928 ----
    "Indicates whether a port has been flattened.")
  
  (defun vhdl-port-flatten (&optional as-alist)
!   "Flatten port list so that only one generic/port exists per line.
! This operation is performed on an internally stored port and is only
! reflected in a subsequent paste operation."
    (interactive)
    (if (not vhdl-port-list)
        (error "ERROR:  No port has been read")
!     (message "Flattening port for next paste...")
      (let ((new-vhdl-port-list (list (car vhdl-port-list)))
          (old-vhdl-port-list (cdr vhdl-port-list))
          old-port-list new-port-list old-port new-port names)
***************
*** 10749,10765 ****
        (setq vhdl-port-list
            (append new-vhdl-port-list (list old-vhdl-port-list))
            vhdl-port-flattened t)
!       (message "Flattening port...done"))))
  
  (defvar vhdl-port-reversed-direction nil
    "Indicates whether port directions are reversed.")
  
  (defun vhdl-port-reverse-direction ()
!   "Reverse direction for all ports (useful in testbenches)."
    (interactive)
    (if (not vhdl-port-list)
        (error "ERROR:  No port has been read")
!     (message "Reversing port directions...")
      (let ((port-list (nth 2 vhdl-port-list))
          port-dir-car port-dir)
        ;; traverse port list and reverse directions
--- 10945,10963 ----
        (setq vhdl-port-list
            (append new-vhdl-port-list (list old-vhdl-port-list))
            vhdl-port-flattened t)
!       (message "Flattening port for next paste...done"))))
  
  (defvar vhdl-port-reversed-direction nil
    "Indicates whether port directions are reversed.")
  
  (defun vhdl-port-reverse-direction ()
!   "Reverse direction for all ports (useful in testbenches).
! This operation is performed on an internally stored port and is only
! reflected in a subsequent paste operation."
    (interactive)
    (if (not vhdl-port-list)
        (error "ERROR:  No port has been read")
!     (message "Reversing port directions for next paste...")
      (let ((port-list (nth 2 vhdl-port-list))
          port-dir-car port-dir)
        ;; traverse port list and reverse directions
***************
*** 10772,10778 ****
                      (t port-dir)))
        (setq port-list (cdr port-list)))
        (setq vhdl-port-reversed-direction (not vhdl-port-reversed-direction))
!       (message "Reversing port directions...done"))))
  
  (defun vhdl-port-copy ()
    "Get generic and port information from an entity or component declaration."
--- 10970,10976 ----
                      (t port-dir)))
        (setq port-list (cdr port-list)))
        (setq vhdl-port-reversed-direction (not vhdl-port-reversed-direction))
!       (message "Reversing port directions for next paste...done"))))
  
  (defun vhdl-port-copy ()
    "Get generic and port information from an entity or component declaration."
***************
*** 10803,10810 ****
            (setq group-comment (vhdl-parse-group-comment))
            (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
            (while (not end-of-list)
!             ;; parse names
!             (vhdl-parse-string "\\(\\w+\\)[ \t\n]*")
              (setq names (list (match-string-no-properties 1)))
              (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\)[ \t\n]*" t)
                (setq names
--- 11001,11008 ----
            (setq group-comment (vhdl-parse-group-comment))
            (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
            (while (not end-of-list)
!             ;; parse names (accept extended identifiers)
!             (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
              (setq names (list (match-string-no-properties 1)))
              (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\)[ \t\n]*" t)
                (setq names
***************
*** 10870,10876 ****
            (while (not end-of-list)
              ;; parse object
              (setq object
!                   (and (vhdl-parse-string 
"\\(signal\\|quantity\\|terminal\\)[ \t\n]*" t)
                         (match-string-no-properties 1)))
              ;; parse names (accept extended identifiers)
              (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
--- 11068,11074 ----
            (while (not end-of-list)
              ;; parse object
              (setq object
!                   (and (vhdl-parse-string 
"\\<\\(signal\\|quantity\\|terminal\\)\\>[ \t\n]*" t)
                         (match-string-no-properties 1)))
              ;; parse names (accept extended identifiers)
              (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
***************
*** 10880,10886 ****
              ;; parse direction
              (vhdl-parse-string ":[ \t\n]*")
              (setq direct
!                   (and (vhdl-parse-string 
"\\(in\\|out\\|inout\\|buffer\\|linkage\\)[ \t\n]+" t)
                         (match-string-no-properties 1)))
              ;; parse type
              (vhdl-parse-string "\\([^();\n]+\\)")
--- 11078,11084 ----
              ;; parse direction
              (vhdl-parse-string ":[ \t\n]*")
              (setq direct
!                   (and (vhdl-parse-string 
"\\<\\(in\\|out\\|inout\\|buffer\\|linkage\\)\\>[ \t\n]+" t)
                         (match-string-no-properties 1)))
              ;; parse type
              (vhdl-parse-string "\\([^();\n]+\\)")
***************
*** 11097,11103 ****
                      (car (nth 0 (car generic-list)))
                    (or (nth 2 (car generic-list)) " ")))
            (setq generic-list (cdr generic-list))
!           (insert (if generic-list ", " ")")))
        (unless vhdl-argument-list-indent
          (insert "\n") (indent-to (+ margin vhdl-basic-offset)))
        (setq list-margin (current-column))
--- 11295,11304 ----
                      (car (nth 0 (car generic-list)))
                    (or (nth 2 (car generic-list)) " ")))
            (setq generic-list (cdr generic-list))
!           (insert (if generic-list ", " ")"))
!           (when (and (not generic-list) secondary
!                      (null (nth 2 vhdl-port-list)))
!             (insert ";")))
        (unless vhdl-argument-list-indent
          (insert "\n") (indent-to (+ margin vhdl-basic-offset)))
        (setq list-margin (current-column))
***************
*** 11113,11118 ****
--- 11314,11322 ----
                    (or (nth 2 generic) "")))
          (setq generic-list (cdr generic-list))
          (insert (if generic-list "," ")"))
+         (when (and (not generic-list) secondary
+                    (null (nth 2 vhdl-port-list)))
+           (insert ";"))
          ;; paste comment
          (when (or vhdl-include-type-comments
                    (and vhdl-include-port-comments (nth 3 generic)))
***************
*** 11140,11146 ****
            (insert (vhdl-replace-string vhdl-actual-port-name
                                         (car (nth 0 (car port-list)))))
            (setq port-list (cdr port-list))
!           (insert (if port-list ", " ");")))
        (unless vhdl-argument-list-indent
          (insert "\n") (indent-to (+ margin vhdl-basic-offset)))
        (setq list-margin (current-column))
--- 11344,11350 ----
            (insert (vhdl-replace-string vhdl-actual-port-name
                                         (car (nth 0 (car port-list)))))
            (setq port-list (cdr port-list))
!           (insert (if port-list ", " ")")))
        (unless vhdl-argument-list-indent
          (insert "\n") (indent-to (+ margin vhdl-basic-offset)))
        (setq list-margin (current-column))
***************
*** 11220,11225 ****
--- 11424,11431 ----
        (when (nth 2 vhdl-port-list)
          (insert "\n") (indent-to (+ margin vhdl-basic-offset))
          (vhdl-port-paste-port-map))
+       (unless (or (nth 1 vhdl-port-list) (nth 2 vhdl-port-list))
+         (insert ";"))
        (message "Pasting port as instantiation \"%s\"...done" name))
        (setq vhdl-port-list orig-vhdl-port-list))))
  
***************
*** 11361,11367 ****
        ;; open entity file
        (unless (eq vhdl-testbench-create-files 'none)
        (setq ent-file-name
!             (concat ent-name "." (file-name-extension (buffer-file-name))))
        (if (file-exists-p ent-file-name)
            (if (y-or-n-p
                 (concat "File \"" ent-file-name "\" exists; overwrite? "))
--- 11567,11575 ----
        ;; open entity file
        (unless (eq vhdl-testbench-create-files 'none)
        (setq ent-file-name
!             (concat (vhdl-replace-string vhdl-testbench-entity-file-name
!                                          ent-name t)
!                     "." (file-name-extension (buffer-file-name))))
        (if (file-exists-p ent-file-name)
            (if (y-or-n-p
                 (concat "File \"" ent-file-name "\" exists; overwrite? "))
***************
*** 11408,11415 ****
          (insert "\n")
        (setq ent-buffer (current-buffer))
        (setq arch-file-name
!             (concat ent-name "_" arch-name "."
!                     (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p arch-file-name)
                   (not (y-or-n-p (concat "File \"" arch-file-name
                                          "\" exists; overwrite? "))))
--- 11616,11624 ----
          (insert "\n")
        (setq ent-buffer (current-buffer))
        (setq arch-file-name
!             (concat (vhdl-replace-string vhdl-testbench-architecture-file-name
!                                          (concat ent-name " " arch-name) t)
!                     "." (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p arch-file-name)
                   (not (y-or-n-p (concat "File \"" arch-file-name
                                          "\" exists; overwrite? "))))
***************
*** 11714,11720 ****
          (vhdl-paste-group-comment (nth 5 vhdl-subprog-list) list-margin))
        ;; paste return type
        (insert "return " (nth 3 vhdl-subprog-list))
!         (if (eq kind 'decl) (insert ";") (vhdl-insert-keyword " is"))
        (when (and vhdl-include-port-comments (nth 4 vhdl-subprog-list))
          (vhdl-comment-insert-inline (nth 4 vhdl-subprog-list) t)))
        ;; align parameter list
--- 11923,11929 ----
          (vhdl-paste-group-comment (nth 5 vhdl-subprog-list) list-margin))
        ;; paste return type
        (insert "return " (nth 3 vhdl-subprog-list))
!       (if (eq kind 'decl) (insert ";") (vhdl-insert-keyword " is"))
        (when (and vhdl-include-port-comments (nth 4 vhdl-subprog-list))
          (vhdl-comment-insert-inline (nth 4 vhdl-subprog-list) t)))
        ;; align parameter list
***************
*** 11938,11944 ****
    "Return the line number of the line containing point."
    (save-restriction
      (widen)
!     (1+ (count-lines (point-min) (line-beginning-position)))))
  
  (defun vhdl-line-kill-entire (&optional arg)
    "Delete entire line."
--- 12147,12155 ----
    "Return the line number of the line containing point."
    (save-restriction
      (widen)
!     (save-excursion
!       (beginning-of-line)
!       (1+ (count-lines 1 (point))))))
  
  (defun vhdl-line-kill-entire (&optional arg)
    "Delete entire line."
***************
*** 12065,12071 ****
  # statements  : %5d\n\
  # code lines  : %5d\n\
  # total lines : %5d\n\ "
!            (buffer-file-name) no-stats no-code-lines no-lines)))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Help functions
--- 12276,12283 ----
  # statements  : %5d\n\
  # code lines  : %5d\n\
  # total lines : %5d\n\ "
!            (buffer-file-name) no-stats no-code-lines no-lines)
!     (unless vhdl-emacs-21 (vhdl-show-messages))))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Help functions
***************
*** 12108,12113 ****
--- 12320,12331 ----
         (vhdl-warning (format "Unknown VHDL project: \"%s\"" name))))
    (vhdl-speedbar-update-current-project))
  
+ (defun vhdl-set-default-project ()
+   "Set current project as default on startup."
+   (interactive)
+   (customize-set-variable 'vhdl-project vhdl-project)
+   (customize-save-customized))
+ 
  (defun vhdl-toggle-project (name token indent)
    "Set current project to NAME or unset if NAME is current project."
    (vhdl-set-project (if (equal name vhdl-project) "" name)))
***************
*** 12165,12171 ****
          (load-file file-name)
          (when (/= (length (aget vhdl-project-alist vhdl-project t)) 10)
            (adelete 'vhdl-project-alist vhdl-project)
!           (error))
          (when not-make-current
            (setq vhdl-project current-project))
          (vhdl-update-mode-menu)
--- 12383,12389 ----
          (load-file file-name)
          (when (/= (length (aget vhdl-project-alist vhdl-project t)) 10)
            (adelete 'vhdl-project-alist vhdl-project)
!           (error ""))
          (when not-make-current
            (setq vhdl-project current-project))
          (vhdl-update-mode-menu)
***************
*** 12373,12380 ****
          (save-match-data
            (goto-char (match-end 1))
            ;; move to next item
!           (if (looking-at "\\s-*,")
!               (goto-char (match-end 0))
              (end-of-line) t))))
      (error t)))
  
--- 12591,12598 ----
          (save-match-data
            (goto-char (match-end 1))
            ;; move to next item
!           (if (looking-at "\\(\\s-*,\\)")
!               (goto-char (match-end 1))
              (end-of-line) t))))
      (error t)))
  
***************
*** 12422,12428 ****
       "postponed\\|process\\|"
       (when (vhdl-standard-p 'ams) "procedural\\|")
       "with\\|while"
!      "\\)\\>\\|\\w+\\s-*\\(([^\n]*)\\)*\\s-*<=\\)")
      1 'font-lock-function-name-face)
  
     ;; highlight label and component name of component instantiations
--- 12640,12646 ----
       "postponed\\|process\\|"
       (when (vhdl-standard-p 'ams) "procedural\\|")
       "with\\|while"
!      "\\)\\>\\|\\w+\\s-*\\(([^\n]*)\\|\\.\\w+\\)*\\s-*<=\\)")
      1 'font-lock-function-name-face)
  
     ;; highlight label and component name of component instantiations
***************
*** 12489,12495 ****
     (list
      (concat
       "^\\s-*attribute\\s-+\\(\\w+\\)")
!     1 'vhdl-attribute)
  
     ;; highlight type/nature name in (sub)type/(sub)nature declarations
     (list
--- 12707,12713 ----
     (list
      (concat
       "^\\s-*attribute\\s-+\\(\\w+\\)")
!     1 'vhdl-font-lock-attribute-face)
  
     ;; highlight type/nature name in (sub)type/(sub)nature declarations
     (list
***************
*** 12521,12527 ****
                  (while (= (preceding-char) ?\)) (backward-sexp))
                  (skip-syntax-backward "w_")
                  (skip-syntax-backward " ")
!                 (when (memq (preceding-char) '(?n ?N))
                    (goto-char (point-max))))
           (goto-char (match-end 1)) (1 font-lock-variable-name-face)))
  
--- 12739,12745 ----
                  (while (= (preceding-char) ?\)) (backward-sexp))
                  (skip-syntax-backward "w_")
                  (skip-syntax-backward " ")
!                 (when (memq (preceding-char) '(?n ?N ?|))
                    (goto-char (point-max))))
           (goto-char (match-end 1)) (1 font-lock-variable-name-face)))
  
***************
*** 12547,12585 ****
  
  (defconst vhdl-font-lock-keywords-5
    ;; background highlight translate-off regions
!   '((vhdl-match-translate-off (0 vhdl-translate-off-face append)))
    "For consideration as a value of `vhdl-font-lock-keywords'.
  This does background highlighting of translate-off regions.")
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Font and color definitions
  
! (defvar vhdl-prompt-face         'vhdl-prompt
    "Face name to use for prompts.")
  
! (defvar vhdl-attribute-face      'vhdl-attribute
    "Face name to use for standardized attributes.")
  
! (defvar vhdl-enumvalue-face      'vhdl-enumvalue
    "Face name to use for standardized enumeration values.")
  
! (defvar vhdl-function-face       'vhdl-function
    "Face name to use for standardized functions and packages.")
  
! (defvar vhdl-directive-face      'vhdl-directive
    "Face name to use for directives.")
  
! (defvar vhdl-reserved-words-face 'vhdl-reserved-words
    "Face name to use for additional reserved words.")
  
! (defvar vhdl-translate-off-face  'vhdl-translate-off
    "Face name to use for translate-off regions.")
  
  ;; face names to use for words with special syntax.
  (let ((syntax-alist vhdl-special-syntax-alist)
        name)
    (while syntax-alist
!     (setq name (vhdl-function-name "vhdl" (nth 0 (car syntax-alist))))
      (eval `(defvar ,name ',name
             ,(concat "Face name to use for "
                      (nth 0 (car syntax-alist)) ".")))
--- 12765,12804 ----
  
  (defconst vhdl-font-lock-keywords-5
    ;; background highlight translate-off regions
!   '((vhdl-match-translate-off (0 vhdl-font-lock-translate-off-face append)))
    "For consideration as a value of `vhdl-font-lock-keywords'.
  This does background highlighting of translate-off regions.")
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Font and color definitions
  
! (defvar vhdl-font-lock-prompt-face       'vhdl-font-lock-prompt-face
    "Face name to use for prompts.")
  
! (defvar vhdl-font-lock-attribute-face      'vhdl-font-lock-attribute-face
    "Face name to use for standardized attributes.")
  
! (defvar vhdl-font-lock-enumvalue-face      'vhdl-font-lock-enumvalue-face
    "Face name to use for standardized enumeration values.")
  
! (defvar vhdl-font-lock-function-face       'vhdl-font-lock-function-face
    "Face name to use for standardized functions and packages.")
  
! (defvar vhdl-font-lock-directive-face      'vhdl-font-lock-directive-face
    "Face name to use for directives.")
  
! (defvar vhdl-font-lock-reserved-words-face 'vhdl-font-lock-reserved-words-face
    "Face name to use for additional reserved words.")
  
! (defvar vhdl-font-lock-translate-off-face  'vhdl-font-lock-translate-off-face
    "Face name to use for translate-off regions.")
  
  ;; face names to use for words with special syntax.
  (let ((syntax-alist vhdl-special-syntax-alist)
        name)
    (while syntax-alist
!     (setq name (vhdl-function-name
!               "vhdl-font-lock" (nth 0 (car syntax-alist)) "face"))
      (eval `(defvar ,name ',name
             ,(concat "Face name to use for "
                      (nth 0 (car syntax-alist)) ".")))
***************
*** 12603,12661 ****
  (custom-add-to-group
   'vhdl-highlight-faces 'font-lock-variable-name-face 'custom-face)
  
! (defface vhdl-prompt
!   '((((min-colors 88) (class color) (background light))
       (:foreground "Red1" :bold t))
-     (((class color) (background light)) (:foreground "Red" :bold t))
      (((class color) (background dark)) (:foreground "Pink" :bold t))
      (t (:inverse-video t)))
    "Font lock mode face used to highlight prompts."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-prompt-face 'face-alias 'vhdl-prompt)
  
! (defface vhdl-attribute
    '((((class color) (background light)) (:foreground "Orchid"))
      (((class color) (background dark)) (:foreground "LightSteelBlue"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized attributes."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-attribute-face 'face-alias 'vhdl-attribute)
  
! (defface vhdl-enumvalue
    '((((class color) (background light)) (:foreground "SaddleBrown"))
      (((class color) (background dark)) (:foreground "BurlyWood"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized enumeration values."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-enumvalue-face 'face-alias 'vhdl-enumvalue)
  
! (defface vhdl-function
    '((((class color) (background light)) (:foreground "Cyan4"))
      (((class color) (background dark)) (:foreground "Orchid1"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized functions and packages."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-function-face 'face-alias 'vhdl-function)
  
! (defface vhdl-directive
    '((((class color) (background light)) (:foreground "CadetBlue"))
      (((class color) (background dark)) (:foreground "Aquamarine"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight directives."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-directive-face 'face-alias 'vhdl-directive)
  
! (defface vhdl-reserved-word
    '((((class color) (background light)) (:foreground "Orange" :bold t))
      (((min-colors 88) (class color) (background dark))
       (:foreground "Yellow1" :bold t))
--- 12822,12870 ----
  (custom-add-to-group
   'vhdl-highlight-faces 'font-lock-variable-name-face 'custom-face)
  
! (defface vhdl-font-lock-prompt-face
!   '((((class color) (background light)) (:foreground "Red" :bold t))
!     (((min-colors 88) (class color) (background light))
       (:foreground "Red1" :bold t))
      (((class color) (background dark)) (:foreground "Pink" :bold t))
      (t (:inverse-video t)))
    "Font lock mode face used to highlight prompts."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-attribute-face
    '((((class color) (background light)) (:foreground "Orchid"))
      (((class color) (background dark)) (:foreground "LightSteelBlue"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized attributes."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-enumvalue-face
    '((((class color) (background light)) (:foreground "SaddleBrown"))
      (((class color) (background dark)) (:foreground "BurlyWood"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized enumeration values."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-function-face
    '((((class color) (background light)) (:foreground "Cyan4"))
      (((class color) (background dark)) (:foreground "Orchid1"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight standardized functions and packages."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-directive-face
    '((((class color) (background light)) (:foreground "CadetBlue"))
      (((class color) (background dark)) (:foreground "Aquamarine"))
      (t (:italic t :bold t)))
    "Font lock mode face used to highlight directives."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-reserved-words-face
    '((((class color) (background light)) (:foreground "Orange" :bold t))
      (((min-colors 88) (class color) (background dark))
       (:foreground "Yellow1" :bold t))
***************
*** 12664,12686 ****
    "Font lock mode face used to highlight additional reserved words."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-reserved-words-face 'face-alias 'vhdl-reserved-word)
  
! (defface vhdl-translate-off
    '((((class color) (background light)) (:background "LightGray"))
      (((class color) (background dark)) (:background "DimGray"))
      (t ()))
    "Font lock mode face used to background highlight translate-off regions."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
- ;; backward-compatibility alias
- (put 'vhdl-font-lock-translate-off-face 'face-alias 'vhdl-translate-off)
  
  ;; font lock mode faces used to highlight words with special syntax.
  (let ((syntax-alist vhdl-special-syntax-alist))
    (while syntax-alist
!     (eval `(defface ,(vhdl-function-name "vhdl" (caar syntax-alist))
             '((((class color) (background light))
                (:foreground ,(nth 2 (car syntax-alist))))
               (((class color) (background dark))
--- 12873,12892 ----
    "Font lock mode face used to highlight additional reserved words."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
! (defface vhdl-font-lock-translate-off-face
    '((((class color) (background light)) (:background "LightGray"))
      (((class color) (background dark)) (:background "DimGray"))
      (t ()))
    "Font lock mode face used to background highlight translate-off regions."
    :group 'vhdl-highlight-faces
    :group 'font-lock-highlighting-faces)
  
  ;; font lock mode faces used to highlight words with special syntax.
  (let ((syntax-alist vhdl-special-syntax-alist))
    (while syntax-alist
!     (eval `(defface ,(vhdl-function-name
!                     "vhdl-font-lock" (caar syntax-alist) "face")
             '((((class color) (background light))
                (:foreground ,(nth 2 (car syntax-alist))))
               (((class color) (background dark))
***************
*** 12697,12719 ****
  
  (defun vhdl-font-lock-init ()
    "Initialize fontification."
!    ;; highlight template prompts and directives
    (setq vhdl-font-lock-keywords-0
        (list (list (concat "\\(^\\|[ \t(.']\\)\\(<"
                            vhdl-template-prompt-syntax ">\\)")
!                   2 'vhdl-prompt t)
              (list (concat "--\\s-*"
                            vhdl-directive-keywords-regexp "\\s-+\\(.*\\)$")
!                   2 'vhdl-directive t)))
    ;; highlight keywords and standardized types, attributes, enumeration
    ;; values, and subprograms
    (setq vhdl-font-lock-keywords-1
        (list
!        (list (concat "'" vhdl-attributes-regexp) 1 'vhdl-attribute)
         (list vhdl-types-regexp       1 'font-lock-type-face)
!        (list vhdl-functions-regexp   1 'vhdl-function)
!        (list vhdl-packages-regexp    1 'vhdl-function)
!        (list vhdl-enum-values-regexp 1 'vhdl-enumvalue)
         (list vhdl-keywords-regexp    1 'font-lock-keyword-face)))
    ;; highlight words with special syntax.
    (setq vhdl-font-lock-keywords-3
--- 12903,12930 ----
  
  (defun vhdl-font-lock-init ()
    "Initialize fontification."
!   ;; highlight template prompts and directives
    (setq vhdl-font-lock-keywords-0
        (list (list (concat "\\(^\\|[ \t(.']\\)\\(<"
                            vhdl-template-prompt-syntax ">\\)")
!                   2 'vhdl-font-lock-prompt-face t)
              (list (concat "--\\s-*"
                            vhdl-directive-keywords-regexp "\\s-+\\(.*\\)$")
!                   2 'vhdl-font-lock-directive-face t)
!             ;; highlight c-preprocessor directives
!             (list "^#[ \t]*\\(\\w+\\)\\([ \t]+\\(\\w+\\)\\)?"
!                   '(1 font-lock-builtin-face)
!                   '(3 font-lock-variable-name-face nil t))))
    ;; highlight keywords and standardized types, attributes, enumeration
    ;; values, and subprograms
    (setq vhdl-font-lock-keywords-1
        (list
!        (list (concat "'" vhdl-attributes-regexp)
!              1 'vhdl-font-lock-attribute-face)
         (list vhdl-types-regexp       1 'font-lock-type-face)
!        (list vhdl-functions-regexp   1 'vhdl-font-lock-function-face)
!        (list vhdl-packages-regexp    1 'vhdl-font-lock-function-face)
!        (list vhdl-enum-values-regexp 1 'vhdl-font-lock-enumvalue-face)
         (list vhdl-keywords-regexp    1 'font-lock-keyword-face)))
    ;; highlight words with special syntax.
    (setq vhdl-font-lock-keywords-3
***************
*** 12724,12736 ****
                  (cons
                   (cons (concat "\\<\\(" (nth 1 (car syntax-alist)) "\\)\\>")
                         (vhdl-function-name
!                         "vhdl" (nth 0 (car syntax-alist))))
                   keywords))
            (setq syntax-alist (cdr syntax-alist)))
          keywords))
    ;; highlight additional reserved words
    (setq vhdl-font-lock-keywords-4
!       (list (list vhdl-reserved-words-regexp 1 'vhdl-reserved-word)))
    ;; highlight everything together
    (setq vhdl-font-lock-keywords
        (append
--- 12935,12948 ----
                  (cons
                   (cons (concat "\\<\\(" (nth 1 (car syntax-alist)) "\\)\\>")
                         (vhdl-function-name
!                         "vhdl-font-lock" (nth 0 (car syntax-alist)) "face"))
                   keywords))
            (setq syntax-alist (cdr syntax-alist)))
          keywords))
    ;; highlight additional reserved words
    (setq vhdl-font-lock-keywords-4
!       (list (list vhdl-reserved-words-regexp 1
!                   'vhdl-font-lock-reserved-words-face)))
    ;; highlight everything together
    (setq vhdl-font-lock-keywords
        (append
***************
*** 12755,12761 ****
         '(font-lock-syntactic-keywords . vhdl-font-lock-syntactic-keywords)))
    (when (fboundp 'font-lock-unset-defaults)
      (font-lock-unset-defaults))               ; not implemented in XEmacs
!   (font-lock-set-defaults)              ;What for?  --Stef
    (font-lock-mode nil)
    (font-lock-mode t))
  
--- 12967,12973 ----
         '(font-lock-syntactic-keywords . vhdl-font-lock-syntactic-keywords)))
    (when (fboundp 'font-lock-unset-defaults)
      (font-lock-unset-defaults))               ; not implemented in XEmacs
!   (font-lock-set-defaults)
    (font-lock-mode nil)
    (font-lock-mode t))
  
***************
*** 12768,12779 ****
    (unless (or (not vhdl-print-customize-faces)
              ps-print-color-p)
      (set (make-local-variable 'ps-bold-faces)
!        '(font-lock-keyword-face font-lock-type-face
!          vhdl-attribute vhdl-enumvalue vhdl-directive))
      (set (make-local-variable 'ps-italic-faces)
         '(font-lock-comment-face
!          font-lock-function-name-face font-lock-type-face
!          vhdl-attribute vhdl-enumvalue vhdl-directive))
      (set (make-local-variable 'ps-underlined-faces)
         '(font-lock-string-face))
      (setq ps-always-build-face-reference t))
--- 12980,12997 ----
    (unless (or (not vhdl-print-customize-faces)
              ps-print-color-p)
      (set (make-local-variable 'ps-bold-faces)
!        '(font-lock-keyword-face
!          font-lock-type-face
!          vhdl-font-lock-attribute-face
!          vhdl-font-lock-enumvalue-face
!          vhdl-font-lock-directive-face))
      (set (make-local-variable 'ps-italic-faces)
         '(font-lock-comment-face
!          font-lock-function-name-face
!          font-lock-type-face
!          vhdl-font-lock-attribute-face
!          vhdl-font-lock-enumvalue-face
!          vhdl-font-lock-directive-face))
      (set (make-local-variable 'ps-underlined-faces)
         '(font-lock-string-face))
      (setq ps-always-build-face-reference t))
***************
*** 12817,12825 ****
  ;;   (ent-key ent-name ent-file ent-line
  ;;     (arch-key arch-name arch-file arch-line
  ;;       (inst-key inst-name inst-file inst-line inst-comp-name inst-ent-key
! ;;                 inst-arch-key inst-conf-key inst-lib-key)
! ;;       (lib-name pack-key))
! ;;     (lib-name pack-key))
  
  (defvar vhdl-config-alist nil
    "Cache with configurations for each project/directory.")
--- 13035,13043 ----
  ;;   (ent-key ent-name ent-file ent-line
  ;;     (arch-key arch-name arch-file arch-line
  ;;       (inst-key inst-name inst-file inst-line inst-comp-name inst-ent-key
! ;;               inst-arch-key inst-conf-key inst-lib-key inst-path)
! ;;     (lib-name pack-key))
! ;;     mra-key (lib-name pack-key))
  
  (defvar vhdl-config-alist nil
    "Cache with configurations for each project/directory.")
***************
*** 12827,12833 ****
  ;; (cache-key
  ;;   (conf-key conf-name conf-file conf-line ent-key arch-key
  ;;     (inst-key inst-comp-name inst-ent-key inst-arch-key
! ;;               inst-conf-key inst-lib-key)
  ;;     (lib-name pack-key)))
  
  (defvar vhdl-package-alist nil
--- 13045,13051 ----
  ;; (cache-key
  ;;   (conf-key conf-name conf-file conf-line ent-key arch-key
  ;;     (inst-key inst-comp-name inst-ent-key inst-arch-key
! ;;             inst-conf-key inst-lib-key)
  ;;     (lib-name pack-key)))
  
  (defvar vhdl-package-alist nil
***************
*** 12852,12858 ****
  ;; structure: (parenthesised expression means list of such entries)
  ;; (cache-key
  ;;   (file-name (ent-list) (arch-list) (arch-ent-list) (conf-list)
! ;;              (pack-list) (pack-body-list) (inst-list) (inst-ent-list))
  
  (defvar vhdl-directory-alist nil
    "Cache with source directories for each project.")
--- 13070,13076 ----
  ;; structure: (parenthesised expression means list of such entries)
  ;; (cache-key
  ;;   (file-name (ent-list) (arch-list) (arch-ent-list) (conf-list)
! ;;            (pack-list) (pack-body-list) (inst-list) (inst-ent-list))
  
  (defvar vhdl-directory-alist nil
    "Cache with source directories for each project.")
***************
*** 12985,12991 ****
                  (let* ((ent-name (match-string-no-properties 1))
                         (ent-key (downcase ent-name))
                         (ent-entry (aget ent-alist ent-key t))
-                        (arch-alist (nth 3 ent-entry))
                         (lib-alist (vhdl-scan-context-clause)))
                    (if (nth 1 ent-entry)
                        (vhdl-warning-when-idle
--- 13203,13208 ----
***************
*** 12995,13004 ****
                      (setq ent-list (cons ent-key ent-list))
                      (aput 'ent-alist ent-key
                            (list ent-name file-name (vhdl-current-line)
!                                 arch-alist lib-alist)))))
                ;; scan for architectures
                (goto-char (point-min))
!               (while (re-search-forward "^[ \t]*architecture[ 
\t\n]+\\(\\w+\\)[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
                  (let* ((arch-name (match-string-no-properties 1))
                         (arch-key (downcase arch-name))
                         (ent-name (match-string-no-properties 2))
--- 13212,13222 ----
                      (setq ent-list (cons ent-key ent-list))
                      (aput 'ent-alist ent-key
                            (list ent-name file-name (vhdl-current-line)
!                                 (nth 3 ent-entry) (nth 4 ent-entry)
!                                 lib-alist)))))
                ;; scan for architectures
                (goto-char (point-min))
!               (while (re-search-forward "^[ \t]*architecture[ 
\t\n]+\\(\\w+\\)[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
                  (let* ((arch-name (match-string-no-properties 1))
                         (arch-key (downcase arch-name))
                         (ent-name (match-string-no-properties 2))
***************
*** 13021,13027 ****
                            (list (or (nth 0 ent-entry) ent-name)
                                  (nth 1 ent-entry) (nth 2 ent-entry)
                                  (vhdl-sort-alist arch-alist)
!                                 (nth 4 ent-entry))))))
                ;; scan for configurations
                (goto-char (point-min))
                (while (re-search-forward "^[ \t]*configuration[ 
\t\n]+\\(\\w+\\)[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
--- 13239,13245 ----
                            (list (or (nth 0 ent-entry) ent-name)
                                  (nth 1 ent-entry) (nth 2 ent-entry)
                                  (vhdl-sort-alist arch-alist)
!                                 arch-key (nth 5 ent-entry))))))
                ;; scan for configurations
                (goto-char (point-min))
                (while (re-search-forward "^[ \t]*configuration[ 
\t\n]+\\(\\w+\\)[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
***************
*** 13138,13184 ****
                         (beg-of-unit (point))
                         (end-of-unit (vhdl-get-end-of-unit))
                         (inst-no 0)
!                        inst-alist)
                    ;; scan for contained instantiations
                    (while (and (re-search-forward
                                 (concat "^[ \t]*\\(\\w+\\)[ \t\n]*:[ \t\n]*\\("
                                         "\\(\\w+\\)[ \t\n]+\\(--[^\n]*\n[ 
\t\n]*\\)*\\(generic\\|port\\)[ \t\n]+map\\>\\|"
                                         "component[ \t\n]+\\(\\w+\\)\\|"
!                                        "\\(\\(entity\\)\\|configuration\\)[ 
\t\n]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?\\)") 
end-of-unit t)
                                (or (not limit-hier-inst-no)
                                    (<= (setq inst-no (1+ inst-no))
                                        limit-hier-inst-no)))
!                     (let* ((inst-name (match-string-no-properties 1))
!                            (inst-key (downcase inst-name))
!                            (inst-comp-name
!                             (or (match-string-no-properties 3)
!                                 (match-string-no-properties 6)))
!                            (inst-ent-key
!                             (or (and (match-string 8)
!                                      (vhdl-match-string-downcase 11))
!                                 (and inst-comp-name
!                                      (downcase inst-comp-name))))
!                            (inst-arch-key (vhdl-match-string-downcase 13))
!                            (inst-conf-key
!                             (and (not (match-string 8))
!                                  (vhdl-match-string-downcase 11)))
!                            (inst-lib-key (vhdl-match-string-downcase 10)))
!                       (goto-char (match-end 1))
!                       (setq inst-list (cons inst-key inst-list)
!                             inst-ent-list (cons inst-ent-key inst-ent-list))
!                       (setq inst-alist
!                             (append
!                              inst-alist
!                              (list (list inst-key inst-name file-name
!                                          (vhdl-current-line) inst-comp-name
!                                          inst-ent-key inst-arch-key
!                                          inst-conf-key inst-lib-key))))))
                    ;; scan for contained configuration specifications
                    (goto-char beg-of-unit)
                    (while (re-search-forward
                            (concat "^[ \t]*for[ \t\n]+\\(\\w+\\([ \t\n]*,[ 
\t\n]*\\w+\\)*\\)[ \t\n]*:[ \t\n]*\\(\\w+\\)[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*"
                                    "use[ 
\t\n]+\\(\\(entity\\)\\|configuration\\)[ 
\t\n]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?") end-of-unit t)
!                       (let* ((inst-comp-name (match-string-no-properties 3))
                             (inst-ent-key
                              (and (match-string 6)
                                   (vhdl-match-string-downcase 9)))
--- 13356,13416 ----
                         (beg-of-unit (point))
                         (end-of-unit (vhdl-get-end-of-unit))
                         (inst-no 0)
!                        inst-alist inst-path)
                    ;; scan for contained instantiations
                    (while (and (re-search-forward
                                 (concat "^[ \t]*\\(\\w+\\)[ \t\n]*:[ \t\n]*\\("
                                         "\\(\\w+\\)[ \t\n]+\\(--[^\n]*\n[ 
\t\n]*\\)*\\(generic\\|port\\)[ \t\n]+map\\>\\|"
                                         "component[ \t\n]+\\(\\w+\\)\\|"
!                                        "\\(\\(entity\\)\\|configuration\\)[ 
\t\n]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?\\|"
!                                        
"\\(\\(for\\|if\\)\\>[^;:]+\\<generate\\>\\|block\\>\\)\\)\\|"
!                                        "\\(^[ \t]*end[ 
\t\n]+\\(generate\\|block\\)\\>\\)") end-of-unit t)
                                (or (not limit-hier-inst-no)
                                    (<= (setq inst-no (1+ inst-no))
                                        limit-hier-inst-no)))
!                     (cond
!                      ;; block/generate beginning found
!                      ((match-string 14)
!                       (setq inst-path
!                             (cons (match-string-no-properties 1) inst-path)))
!                      ;; block/generate end found
!                      ((match-string 16)
!                       (setq inst-path (cdr inst-path)))
!                      ;; instantiation found
!                      (t
!                       (let* ((inst-name (match-string-no-properties 1))
!                              (inst-key (downcase inst-name))
!                              (inst-comp-name
!                               (or (match-string-no-properties 3)
!                                   (match-string-no-properties 6)))
!                              (inst-ent-key
!                               (or (and (match-string 8)
!                                        (vhdl-match-string-downcase 11))
!                                   (and inst-comp-name
!                                        (downcase inst-comp-name))))
!                              (inst-arch-key (vhdl-match-string-downcase 13))
!                              (inst-conf-key
!                               (and (not (match-string 8))
!                                    (vhdl-match-string-downcase 11)))
!                              (inst-lib-key (vhdl-match-string-downcase 10)))
!                         (goto-char (match-end 1))
!                         (setq inst-list (cons inst-key inst-list)
!                               inst-ent-list
!                               (cons inst-ent-key inst-ent-list))
!                         (setq inst-alist
!                               (append
!                                inst-alist
!                                (list (list inst-key inst-name file-name
!                                            (vhdl-current-line) inst-comp-name
!                                            inst-ent-key inst-arch-key
!                                            inst-conf-key inst-lib-key
!                                            (reverse inst-path)))))))))
                    ;; scan for contained configuration specifications
                    (goto-char beg-of-unit)
                    (while (re-search-forward
                            (concat "^[ \t]*for[ \t\n]+\\(\\w+\\([ \t\n]*,[ 
\t\n]*\\w+\\)*\\)[ \t\n]*:[ \t\n]*\\(\\w+\\)[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*"
                                    "use[ 
\t\n]+\\(\\(entity\\)\\|configuration\\)[ 
\t\n]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?") end-of-unit t)
!                     (let* ((inst-comp-name (match-string-no-properties 3))
                             (inst-ent-key
                              (and (match-string 6)
                                   (vhdl-match-string-downcase 9)))
***************
*** 13222,13228 ****
                    (aput 'ent-alist ent-key
                          (list (nth 0 ent-entry) (nth 1 ent-entry)
                                (nth 2 ent-entry) (vhdl-sort-alist arch-alist)
!                               (nth 4 ent-entry)))
                    (when (and limit-hier-inst-no
                               (> inst-no limit-hier-inst-no))
                      (message "WARNING:  Scan limit (hierarchy: instances per 
architecture) reached in file:\n  \"%s\"" file-name)
--- 13454,13460 ----
                    (aput 'ent-alist ent-key
                          (list (nth 0 ent-entry) (nth 1 ent-entry)
                                (nth 2 ent-entry) (vhdl-sort-alist arch-alist)
!                               (nth 4 ent-entry) (nth 5 ent-entry)))
                    (when (and limit-hier-inst-no
                               (> inst-no limit-hier-inst-no))
                      (message "WARNING:  Scan limit (hierarchy: instances per 
architecture) reached in file:\n  \"%s\"" file-name)
***************
*** 13415,13421 ****
              (if (or (nth 1 entry) arch-alist)
                  (aput 'ent-alist ent-key
                        (list (nth 0 entry) (nth 1 entry) (nth 2 entry)
!                             arch-alist (nth 4 entry)))
                (adelete 'ent-alist ent-key)))
            (setq arch-list (cdr arch-list)
                  arch-ent-list (cdr arch-ent-list)))
--- 13647,13653 ----
              (if (or (nth 1 entry) arch-alist)
                  (aput 'ent-alist ent-key
                        (list (nth 0 entry) (nth 1 entry) (nth 2 entry)
!                             arch-alist (nth 4 entry) (nth 5 entry)))
                (adelete 'ent-alist ent-key)))
            (setq arch-list (cdr arch-list)
                  arch-ent-list (cdr arch-ent-list)))
***************
*** 13479,13484 ****
--- 13711,13717 ----
                  updated))
        (setq file-list (cdr file-list)))
        (setq vhdl-modified-file-list nil)
+       (vhdl-speedbar-update-current-unit)
        (when updated (message "Updating hierarchy...done")))))
  
  ;; structure (parenthesised expression means list of such entries)
***************
*** 13533,13549 ****
        (setq inst-ent-entry (aget ent-alist inst-ent-key t))
        ;; determine architecture
        (setq inst-arch-key
!           (or (nth 3 (car tmp-list))          ; from configuration
!               (nth 4 inst-conf-entry)         ; from subconfiguration
!               (nth 6 inst-entry)              ; from direct instantiation
                (nth 4 (aget conf-alist (nth 7 inst-entry)))
!                                               ; from configuration spec.
!               (caar (nth 3 inst-ent-entry)))) ; random (simplified MRA)
        (setq inst-arch-entry (aget (nth 3 inst-ent-entry) inst-arch-key t))
        ;; set library
        (setq inst-lib-key
!           (or (nth 5 (car tmp-list))          ; from configuration
!               (nth 8 inst-entry)))            ; from direct instantiation
        ;; gather information for this instance
        (setq comp-entry
            (list (nth 1 inst-entry)
--- 13766,13783 ----
        (setq inst-ent-entry (aget ent-alist inst-ent-key t))
        ;; determine architecture
        (setq inst-arch-key
!           (or (nth 3 (car tmp-list))          ; from configuration
!               (nth 4 inst-conf-entry)         ; from subconfiguration
!               (nth 6 inst-entry)              ; from direct instantiation
                (nth 4 (aget conf-alist (nth 7 inst-entry)))
!                                               ; from configuration spec.
!               (nth 4 inst-ent-entry)          ; MRA
!               (caar (nth 3 inst-ent-entry)))) ; first alphabetically
        (setq inst-arch-entry (aget (nth 3 inst-ent-entry) inst-arch-key t))
        ;; set library
        (setq inst-lib-key
!           (or (nth 5 (car tmp-list))          ; from configuration
!               (nth 8 inst-entry)))            ; from direct instantiation
        ;; gather information for this instance
        (setq comp-entry
            (list (nth 1 inst-entry)
***************
*** 13715,13721 ****
          (progn (load-file file-dir-name)
                 (string< (mapconcat
                           (lambda (a) (format "%3d" (string-to-number a)))
!                          (split-string "3.31.14" "\\.") "")
                          (mapconcat
                           (lambda (a) (format "%3d" (string-to-number a)))
                           (split-string vhdl-cache-version "\\.") "")))
--- 13949,13955 ----
          (progn (load-file file-dir-name)
                 (string< (mapconcat
                           (lambda (a) (format "%3d" (string-to-number a)))
!                          (split-string "3.33" "\\.") "")
                          (mapconcat
                           (lambda (a) (format "%3d" (string-to-number a)))
                           (split-string vhdl-cache-version "\\.") "")))
***************
*** 13775,13780 ****
--- 14009,14016 ----
        (define-key vhdl-speedbar-key-map "_" 'vhdl-speedbar-contract-all)
        (define-key vhdl-speedbar-key-map "C" 'vhdl-speedbar-port-copy)
        (define-key vhdl-speedbar-key-map "P" 'vhdl-speedbar-place-component)
+       (define-key vhdl-speedbar-key-map "F" 'vhdl-speedbar-configuration)
+       (define-key vhdl-speedbar-key-map "A" 'vhdl-speedbar-select-mra)
        (define-key vhdl-speedbar-key-map "K" 'vhdl-speedbar-make-design)
        (define-key vhdl-speedbar-key-map "R" 'vhdl-speedbar-rescan-hierarchy)
        (define-key vhdl-speedbar-key-map "S" 'vhdl-save-caches)
***************
*** 13816,13821 ****
--- 14052,14061 ----
              (vhdl-speedbar-check-unit 'subprogram))]
         ["Place Component" vhdl-speedbar-place-component
          (vhdl-speedbar-check-unit 'entity)]
+        ["Generate Configuration" vhdl-speedbar-configuration
+         (vhdl-speedbar-check-unit 'architecture)]
+        ["Select as MRA" vhdl-speedbar-select-mra
+         (vhdl-speedbar-check-unit 'architecture)]
         ["Make" vhdl-speedbar-make-design
          (save-excursion (beginning-of-line) (looking-at "[0-9]+: *[[<]"))]
         ["Generate Makefile" vhdl-speedbar-generate-makefile
***************
*** 13982,13988 ****
         'bracket ?+ 'vhdl-speedbar-expand-entity (nth 0 ent-entry)
         (nth 1 ent-entry) 'vhdl-speedbar-find-file
         (cons (nth 2 ent-entry) (nth 3 ent-entry))
!        'vhdl-speedbar-entity depth)
        (unless (nth 2 ent-entry)
          (end-of-line 0) (insert "!") (forward-char 1))
        (unless (member (nth 0 ent-entry) ent-inst-list)
--- 14222,14228 ----
         'bracket ?+ 'vhdl-speedbar-expand-entity (nth 0 ent-entry)
         (nth 1 ent-entry) 'vhdl-speedbar-find-file
         (cons (nth 2 ent-entry) (nth 3 ent-entry))
!        'vhdl-speedbar-entity-face depth)
        (unless (nth 2 ent-entry)
          (end-of-line 0) (insert "!") (forward-char 1))
        (unless (member (nth 0 ent-entry) ent-inst-list)
***************
*** 13996,14002 ****
         'bracket ?+ 'vhdl-speedbar-expand-config (nth 0 conf-entry)
         (nth 1 conf-entry) 'vhdl-speedbar-find-file
         (cons (nth 2 conf-entry) (nth 3 conf-entry))
!        'vhdl-speedbar-configuration depth)
        (setq conf-alist (cdr conf-alist)))
        ;; insert packages
        (when pack-alist (vhdl-speedbar-make-title-line "Packages:" depth))
--- 14236,14242 ----
         'bracket ?+ 'vhdl-speedbar-expand-config (nth 0 conf-entry)
         (nth 1 conf-entry) 'vhdl-speedbar-find-file
         (cons (nth 2 conf-entry) (nth 3 conf-entry))
!        'vhdl-speedbar-configuration-face depth)
        (setq conf-alist (cdr conf-alist)))
        ;; insert packages
        (when pack-alist (vhdl-speedbar-make-title-line "Packages:" depth))
***************
*** 14165,14171 ****
           (ent-entry (aget ent-alist token t))
           (arch-alist (nth 3 ent-entry))
           (inst-alist (vhdl-get-instantiations token indent))
!          (subpack-alist (nth 4 ent-entry))
           arch-entry inst-entry)
        (if (not (or arch-alist inst-alist subpack-alist))
          (speedbar-change-expand-button-char ??)
--- 14405,14412 ----
           (ent-entry (aget ent-alist token t))
           (arch-alist (nth 3 ent-entry))
           (inst-alist (vhdl-get-instantiations token indent))
!          (subpack-alist (nth 5 ent-entry))
!          (multiple-arch (> (length arch-alist) 1))
           arch-entry inst-entry)
        (if (not (or arch-alist inst-alist subpack-alist))
          (speedbar-change-expand-button-char ??)
***************
*** 14187,14193 ****
              (cons token (nth 0 arch-entry))
              (nth 1 arch-entry) 'vhdl-speedbar-find-file
              (cons (nth 2 arch-entry) (nth 3 arch-entry))
!             'vhdl-speedbar-architecture (1+ indent))
             (setq arch-alist (cdr arch-alist)))
           ;; insert instantiations
           (when inst-alist
--- 14428,14437 ----
              (cons token (nth 0 arch-entry))
              (nth 1 arch-entry) 'vhdl-speedbar-find-file
              (cons (nth 2 arch-entry) (nth 3 arch-entry))
!             'vhdl-speedbar-architecture-face (1+ indent))
!            (when (and multiple-arch
!                       (equal (nth 0 arch-entry) (nth 4 ent-entry)))
!              (end-of-line 0) (insert " (mra)") (forward-char 1))
             (setq arch-alist (cdr arch-alist)))
           ;; insert instantiations
           (when inst-alist
***************
*** 14370,14376 ****
               (cons token (nth 0 comp-entry))
               (nth 1 comp-entry) 'vhdl-speedbar-find-file
               (cons (nth 2 comp-entry) (nth 3 comp-entry))
!              'vhdl-speedbar-entity (1+ indent))
              (setq comp-alist (cdr comp-alist)))
            ;; insert subprograms
            (when func-alist
--- 14614,14620 ----
               (cons token (nth 0 comp-entry))
               (nth 1 comp-entry) 'vhdl-speedbar-find-file
               (cons (nth 2 comp-entry) (nth 3 comp-entry))
!              'vhdl-speedbar-entity-face (1+ indent))
              (setq comp-alist (cdr comp-alist)))
            ;; insert subprograms
            (when func-alist
***************
*** 14420,14426 ****
        (setq pack-entry (aget pack-alist pack-key t))
        (vhdl-speedbar-make-subpack-line
         (or (nth 0 pack-entry) pack-key) lib-name
!        (cons (nth 1 pack-entry) (nth 2 pack-entry)) indent)
        (setq subpack-alist (cdr subpack-alist)))))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--- 14664,14671 ----
        (setq pack-entry (aget pack-alist pack-key t))
        (vhdl-speedbar-make-subpack-line
         (or (nth 0 pack-entry) pack-key) lib-name
!        (cons (nth 1 pack-entry) (nth 2 pack-entry))
!        (cons (nth 6 pack-entry) (nth 7 pack-entry)) indent)
        (setq subpack-alist (cdr subpack-alist)))))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
***************
*** 14486,14528 ****
          (let* ((file-entry (aget file-alist speedbar-last-selected-file t)))
            (vhdl-speedbar-update-units
             "\\[.\\] " (nth 0 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-entity)
            (vhdl-speedbar-update-units
             "{.} " (nth 1 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-architecture)
            (vhdl-speedbar-update-units
             "\\[.\\] " (nth 3 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-configuration)
            (vhdl-speedbar-update-units
             "[]>] " (nth 4 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-package)
            (vhdl-speedbar-update-units
             "\\[.\\].+(" '("body")
!            speedbar-last-selected-file 'vhdl-speedbar-package)
            (vhdl-speedbar-update-units
             "> " (nth 6 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-instantiation))
          ;; highlight current units
          (let* ((file-entry (aget file-alist file-name t)))
            (setq
             pos (vhdl-speedbar-update-units
                  "\\[.\\] " (nth 0 file-entry)
!                 file-name 'vhdl-speedbar-entity-selected pos)
             pos (vhdl-speedbar-update-units
                  "{.} " (nth 1 file-entry)
!                 file-name 'vhdl-speedbar-architecture-selected pos)
             pos (vhdl-speedbar-update-units
                  "\\[.\\] " (nth 3 file-entry)
!                 file-name 'vhdl-speedbar-configuration-selected pos)
             pos (vhdl-speedbar-update-units
                  "[]>] " (nth 4 file-entry)
!                 file-name 'vhdl-speedbar-package-selected pos)
             pos (vhdl-speedbar-update-units
                  "\\[.\\].+(" '("body")
!                 file-name 'vhdl-speedbar-package-selected pos)
             pos (vhdl-speedbar-update-units
                  "> " (nth 6 file-entry)
!                 file-name 'vhdl-speedbar-instantiation-selected pos))))))
        ;; move speedbar so the first highlighted unit is visible
        (when (and pos (not no-position))
        (goto-char pos)
--- 14731,14773 ----
          (let* ((file-entry (aget file-alist speedbar-last-selected-file t)))
            (vhdl-speedbar-update-units
             "\\[.\\] " (nth 0 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-entity-face)
            (vhdl-speedbar-update-units
             "{.} " (nth 1 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-architecture-face)
            (vhdl-speedbar-update-units
             "\\[.\\] " (nth 3 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-configuration-face)
            (vhdl-speedbar-update-units
             "[]>] " (nth 4 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-package-face)
            (vhdl-speedbar-update-units
             "\\[.\\].+(" '("body")
!            speedbar-last-selected-file 'vhdl-speedbar-package-face)
            (vhdl-speedbar-update-units
             "> " (nth 6 file-entry)
!            speedbar-last-selected-file 'vhdl-speedbar-instantiation-face))
          ;; highlight current units
          (let* ((file-entry (aget file-alist file-name t)))
            (setq
             pos (vhdl-speedbar-update-units
                  "\\[.\\] " (nth 0 file-entry)
!                 file-name 'vhdl-speedbar-entity-selected-face pos)
             pos (vhdl-speedbar-update-units
                  "{.} " (nth 1 file-entry)
!                 file-name 'vhdl-speedbar-architecture-selected-face pos)
             pos (vhdl-speedbar-update-units
                  "\\[.\\] " (nth 3 file-entry)
!                 file-name 'vhdl-speedbar-configuration-selected-face pos)
             pos (vhdl-speedbar-update-units
                  "[]>] " (nth 4 file-entry)
!                 file-name 'vhdl-speedbar-package-selected-face pos)
             pos (vhdl-speedbar-update-units
                  "\\[.\\].+(" '("body")
!                 file-name 'vhdl-speedbar-package-selected-face pos)
             pos (vhdl-speedbar-update-units
                  "> " (nth 6 file-entry)
!                 file-name 'vhdl-speedbar-instantiation-selected-face pos))))))
        ;; move speedbar so the first highlighted unit is visible
        (when (and pos (not no-position))
        (goto-char pos)
***************
*** 14573,14593 ****
        (insert "(top)")
        (insert inst-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-instantiation 'speedbar-highlight-face
         'vhdl-speedbar-find-file inst-file-marker))
      (insert delimiter)
      (when ent-name
        (setq start (point))
        (insert ent-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-entity 'speedbar-highlight-face
         'vhdl-speedbar-find-file ent-file-marker)
        (when arch-name
        (insert " (")
        (setq start (point))
        (insert arch-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-architecture 'speedbar-highlight-face
         'vhdl-speedbar-find-file arch-file-marker)
        (insert ")"))
        (when conf-name
--- 14818,14838 ----
        (insert "(top)")
        (insert inst-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-instantiation-face 
'speedbar-highlight-face
         'vhdl-speedbar-find-file inst-file-marker))
      (insert delimiter)
      (when ent-name
        (setq start (point))
        (insert ent-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-entity-face 'speedbar-highlight-face
         'vhdl-speedbar-find-file ent-file-marker)
        (when arch-name
        (insert " (")
        (setq start (point))
        (insert arch-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-architecture-face 'speedbar-highlight-face
         'vhdl-speedbar-find-file arch-file-marker)
        (insert ")"))
        (when conf-name
***************
*** 14595,14608 ****
        (setq start (point))
        (insert conf-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-configuration 'speedbar-highlight-face
         'vhdl-speedbar-find-file conf-file-marker)
        (insert ")")))
      (when (and lib-name (not (equal lib-name (downcase (vhdl-work-library)))))
        (setq start (point))
        (insert " (" lib-name ")")
        (put-text-property (+ 2 start) (1- (point)) 'face
!                        'vhdl-speedbar-library))
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
--- 14840,14853 ----
        (setq start (point))
        (insert conf-name)
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-configuration-face 
'speedbar-highlight-face
         'vhdl-speedbar-find-file conf-file-marker)
        (insert ")")))
      (when (and lib-name (not (equal lib-name (downcase (vhdl-work-library)))))
        (setq start (point))
        (insert " (" lib-name ")")
        (put-text-property (+ 2 start) (1- (point)) 'face
!                        'vhdl-speedbar-library-face))
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
***************
*** 14626,14632 ****
      (setq start (point))
      (insert pack-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-package 'speedbar-highlight-face
       'vhdl-speedbar-find-file pack-file-marker)
      (unless (car pack-file-marker)
        (insert "!"))
--- 14871,14877 ----
      (setq start (point))
      (insert pack-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-package-face 'speedbar-highlight-face
       'vhdl-speedbar-find-file pack-file-marker)
      (unless (car pack-file-marker)
        (insert "!"))
***************
*** 14635,14648 ****
        (setq start (point))
        (insert "body")
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-package 'speedbar-highlight-face
         'vhdl-speedbar-find-file body-file-marker)
        (insert ")"))
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
  (defun vhdl-speedbar-make-subpack-line (pack-name lib-name pack-file-marker
!                                                 depth)
    "Insert used package entry."
    (let ((start (point))
        visible-start)
--- 14880,14893 ----
        (setq start (point))
        (insert "body")
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-package-face 'speedbar-highlight-face
         'vhdl-speedbar-find-file body-file-marker)
        (insert ")"))
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
  (defun vhdl-speedbar-make-subpack-line (pack-name lib-name pack-file-marker
!                                                 pack-body-file-marker depth)
    "Insert used package entry."
    (let ((start (point))
        visible-start)
***************
*** 14659,14670 ****
      (setq start (point))
      (insert pack-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-package 'speedbar-highlight-face
       'vhdl-speedbar-find-file pack-file-marker)
      (setq start (point))
      (insert " (" lib-name ")")
      (put-text-property (+ 2 start) (1- (point)) 'face
!                      'vhdl-speedbar-library)
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
--- 14904,14923 ----
      (setq start (point))
      (insert pack-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-package-face 'speedbar-highlight-face
       'vhdl-speedbar-find-file pack-file-marker)
+     (when (car pack-body-file-marker)
+       (insert " (")
+       (setq start (point))
+       (insert "body")
+       (speedbar-make-button
+        start (point) 'vhdl-speedbar-package-face 'speedbar-highlight-face
+        'vhdl-speedbar-find-file pack-body-file-marker)
+       (insert ")"))
      (setq start (point))
      (insert " (" lib-name ")")
      (put-text-property (+ 2 start) (1- (point)) 'face
!                      'vhdl-speedbar-library-face)
      (insert-char ?\n 1)
      (put-text-property visible-start (point) 'invisible nil)))
  
***************
*** 14687,14700 ****
      (setq start (point))
      (insert func-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-subprogram 'speedbar-highlight-face
       'vhdl-speedbar-find-file func-file-marker)
      (when (car func-body-file-marker)
        (insert " (")
        (setq start (point))
        (insert "body")
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-subprogram 'speedbar-highlight-face
         'vhdl-speedbar-find-file func-body-file-marker)
        (insert ")"))
      (insert-char ?\n 1)
--- 14940,14953 ----
      (setq start (point))
      (insert func-name)
      (speedbar-make-button
!      start (point) 'vhdl-speedbar-subprogram-face 'speedbar-highlight-face
       'vhdl-speedbar-find-file func-file-marker)
      (when (car func-body-file-marker)
        (insert " (")
        (setq start (point))
        (insert "body")
        (speedbar-make-button
!        start (point) 'vhdl-speedbar-subprogram-face 'speedbar-highlight-face
         'vhdl-speedbar-find-file func-body-file-marker)
        (insert ")"))
      (insert-char ?\n 1)
***************
*** 14782,14803 ****
        (message
         "%s \"%s\" in \"%s\""
         ;; design unit kind
!        (cond ((or (eq face 'vhdl-speedbar-entity)
!                   (eq face 'vhdl-speedbar-entity-selected))
                (if (equal (match-string 2) ">") "Component" "Entity"))
!              ((or (eq face 'vhdl-speedbar-architecture)
!                   (eq face 'vhdl-speedbar-architecture-selected))
                "Architecture")
!              ((or (eq face 'vhdl-speedbar-configuration)
!                   (eq face 'vhdl-speedbar-configuration-selected))
                "Configuration")
!              ((or (eq face 'vhdl-speedbar-package)
!                   (eq face 'vhdl-speedbar-package-selected))
                "Package")
!              ((or (eq face 'vhdl-speedbar-instantiation)
!                   (eq face 'vhdl-speedbar-instantiation-selected))
                "Instantiation")
!              ((eq face 'vhdl-speedbar-subprogram)
                "Subprogram")
               (t ""))
         ;; design unit name
--- 15035,15056 ----
        (message
         "%s \"%s\" in \"%s\""
         ;; design unit kind
!        (cond ((or (eq face 'vhdl-speedbar-entity-face)
!                   (eq face 'vhdl-speedbar-entity-selected-face))
                (if (equal (match-string 2) ">") "Component" "Entity"))
!              ((or (eq face 'vhdl-speedbar-architecture-face)
!                   (eq face 'vhdl-speedbar-architecture-selected-face))
                "Architecture")
!              ((or (eq face 'vhdl-speedbar-configuration-face)
!                   (eq face 'vhdl-speedbar-configuration-selected-face))
                "Configuration")
!              ((or (eq face 'vhdl-speedbar-package-face)
!                   (eq face 'vhdl-speedbar-package-selected-face))
                "Package")
!              ((or (eq face 'vhdl-speedbar-instantiation-face)
!                   (eq face 'vhdl-speedbar-instantiation-selected-face))
                "Instantiation")
!              ((eq face 'vhdl-speedbar-subprogram-face)
                "Subprogram")
               (t ""))
         ;; design unit name
***************
*** 14817,14822 ****
--- 15070,15087 ----
      (set-text-properties 0 (length string) nil string)
      string))
  
+ (defun vhdl-speedbar-higher-text ()
+   "Get speedbar-line-text of higher level."
+   (let (depth string)
+     (save-excursion
+       (beginning-of-line)
+       (looking-at "^\\([0-9]+\\):")
+       (setq depth (string-to-number (match-string 1)))
+       (when (re-search-backward (format "^%d: *[[<{][-+?][]>}] \\([^ \n]+\\)" 
(1- depth)) nil t)
+       (setq string (match-string 1))
+       (set-text-properties 0 (length string) nil string)
+       string))))
+ 
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Help functions
  
***************
*** 14941,14946 ****
--- 15206,15236 ----
      (vhdl-compose-place-component)
      (select-frame speedbar-frame)))
  
+ (defun vhdl-speedbar-configuration ()
+   "Generate configuration for the architecture under the cursor."
+   (interactive)
+   (if (not (vhdl-speedbar-check-unit 'architecture))
+       (error "ERROR:  No architecture under cursor")
+     (let ((arch-name (vhdl-speedbar-line-text))
+         (ent-name (vhdl-speedbar-higher-text)))
+       (if (fboundp 'speedbar-select-attached-frame)
+         (speedbar-select-attached-frame)
+       (select-frame speedbar-attached-frame))
+       (vhdl-compose-configuration ent-name arch-name))))
+ 
+ (defun vhdl-speedbar-select-mra ()
+   "Select the architecture under the cursor as MRA."
+   (interactive)
+   (if (not (vhdl-speedbar-check-unit 'architecture))
+       (error "ERROR:  No architecture under cursor")
+     (let* ((arch-key (downcase (vhdl-speedbar-line-text)))
+          (ent-key (downcase (vhdl-speedbar-higher-text)))
+          (ent-alist (aget vhdl-entity-alist
+                           (or (vhdl-project-p) default-directory) t))
+          (ent-entry (aget ent-alist ent-key t)))
+       (setcar (cddr (cddr ent-entry)) arch-key) ; (nth 4 ent-entry)
+       (speedbar-refresh))))
+ 
  (defun vhdl-speedbar-make-design ()
    "Make (compile) design unit or directory/project under the cursor."
    (interactive)
***************
*** 14973,14983 ****
        (speedbar-position-cursor-on-line)
        (cond ((eq design-unit 'entity)
             (memq (get-text-property (match-end 0) 'face)
!                  '(vhdl-speedbar-entity
!                    vhdl-speedbar-entity-selected)))
            ((eq design-unit 'subprogram)
             (eq (get-text-property (match-end 0) 'face)
!                'vhdl-speedbar-subprogram))
            (t nil))))
  
  (defun vhdl-speedbar-set-depth (depth)
--- 15263,15277 ----
        (speedbar-position-cursor-on-line)
        (cond ((eq design-unit 'entity)
             (memq (get-text-property (match-end 0) 'face)
!                  '(vhdl-speedbar-entity-face
!                    vhdl-speedbar-entity-selected-face)))
!           ((eq design-unit 'architecture)
!            (memq (get-text-property (match-end 0) 'face)
!                  '(vhdl-speedbar-architecture-face
!                    vhdl-speedbar-architecture-selected-face)))
            ((eq design-unit 'subprogram)
             (eq (get-text-property (match-end 0) 'face)
!                'vhdl-speedbar-subprogram-face))
            (t nil))))
  
  (defun vhdl-speedbar-set-depth (depth)
***************
*** 14988,15093 ****
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Fontification
  
! (defface vhdl-speedbar-entity
    '((((class color) (background light)) (:foreground "ForestGreen"))
      (((class color) (background dark)) (:foreground "PaleGreen")))
    "Face used for displaying entity names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-entity-face 'face-alias 'vhdl-speedbar-entity)
  
! (defface vhdl-speedbar-architecture
!   '((((min-colors 88) (class color) (background light)) (:foreground "Blue1"))
!     (((class color) (background light)) (:foreground "Blue"))
      (((class color) (background dark)) (:foreground "LightSkyBlue")))
    "Face used for displaying architecture names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-architecture-face 'face-alias 'vhdl-speedbar-architecture)
  
! (defface vhdl-speedbar-configuration
    '((((class color) (background light)) (:foreground "DarkGoldenrod"))
      (((class color) (background dark)) (:foreground "Salmon")))
    "Face used for displaying configuration names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-configuration-face 'face-alias 
'vhdl-speedbar-configuration)
  
! (defface vhdl-speedbar-package
    '((((class color) (background light)) (:foreground "Grey50"))
      (((class color) (background dark)) (:foreground "Grey80")))
    "Face used for displaying package names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-package-face 'face-alias 'vhdl-speedbar-package)
  
! (defface vhdl-speedbar-library
    '((((class color) (background light)) (:foreground "Purple"))
      (((class color) (background dark)) (:foreground "Orchid1")))
    "Face used for displaying library names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-library-face 'face-alias 'vhdl-speedbar-library)
  
! (defface vhdl-speedbar-instantiation
    '((((class color) (background light)) (:foreground "Brown"))
      (((min-colors 88) (class color) (background dark)) (:foreground 
"Yellow1"))
      (((class color) (background dark)) (:foreground "Yellow")))
    "Face used for displaying instantiation names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-instantiation-face 'face-alias 
'vhdl-speedbar-instantiation)
  
! (defface vhdl-speedbar-subprogram
    '((((class color) (background light)) (:foreground "Orchid4"))
      (((class color) (background dark)) (:foreground "BurlyWood2")))
    "Face used for displaying subprogram names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-subprogram-face 'face-alias 'vhdl-speedbar-subprogram)
  
! (defface vhdl-speedbar-entity-selected
    '((((class color) (background light)) (:foreground "ForestGreen" :underline 
t))
      (((class color) (background dark)) (:foreground "PaleGreen" :underline 
t)))
    "Face used for displaying entity names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-entity-selected-face 'face-alias 
'vhdl-speedbar-entity-selected)
  
! (defface vhdl-speedbar-architecture-selected
!   '((((min-colors 88) (class color) (background light)) (:foreground "Blue1" 
:underline t))
      (((min-colors 88) (class color) (background light)) (:foreground "Blue1" 
:underline t))
-     (((class color) (background light)) (:foreground "Blue" :underline t))
      (((class color) (background dark)) (:foreground "LightSkyBlue" :underline 
t)))
    "Face used for displaying architecture names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-architecture-selected-face 'face-alias 
'vhdl-speedbar-architecture-selected)
  
! (defface vhdl-speedbar-configuration-selected
    '((((class color) (background light)) (:foreground "DarkGoldenrod" 
:underline t))
      (((class color) (background dark)) (:foreground "Salmon" :underline t)))
    "Face used for displaying configuration names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-configuration-selected-face 'face-alias 
'vhdl-speedbar-configuration-selected)
  
! (defface vhdl-speedbar-package-selected
    '((((class color) (background light)) (:foreground "Grey50" :underline t))
      (((class color) (background dark)) (:foreground "Grey80" :underline t)))
    "Face used for displaying package names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-package-selected-face 'face-alias 
'vhdl-speedbar-package-selected)
  
! (defface vhdl-speedbar-instantiation-selected
    '((((class color) (background light)) (:foreground "Brown" :underline t))
-     (((min-colors 88) (class color) (background dark)) (:foreground "Yellow1" 
:underline t))
      (((class color) (background dark)) (:foreground "Yellow" :underline t)))
    "Face used for displaying instantiation names."
    :group 'speedbar-faces)
- ;; backward-compatibility alias
- (put 'vhdl-speedbar-instantiation-selected-face 'face-alias 
'vhdl-speedbar-instantiation-selected)
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Initialization
--- 15282,15361 ----
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Fontification
  
! (defface vhdl-speedbar-entity-face
    '((((class color) (background light)) (:foreground "ForestGreen"))
      (((class color) (background dark)) (:foreground "PaleGreen")))
    "Face used for displaying entity names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-architecture-face
!   '((((class color) (background light)) (:foreground "Blue"))
!     (((min-colors 88) (class color) (background light)) (:foreground "Blue1"))
      (((class color) (background dark)) (:foreground "LightSkyBlue")))
    "Face used for displaying architecture names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-configuration-face
    '((((class color) (background light)) (:foreground "DarkGoldenrod"))
      (((class color) (background dark)) (:foreground "Salmon")))
    "Face used for displaying configuration names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-package-face
    '((((class color) (background light)) (:foreground "Grey50"))
      (((class color) (background dark)) (:foreground "Grey80")))
    "Face used for displaying package names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-library-face
    '((((class color) (background light)) (:foreground "Purple"))
      (((class color) (background dark)) (:foreground "Orchid1")))
    "Face used for displaying library names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-instantiation-face
    '((((class color) (background light)) (:foreground "Brown"))
      (((min-colors 88) (class color) (background dark)) (:foreground 
"Yellow1"))
      (((class color) (background dark)) (:foreground "Yellow")))
    "Face used for displaying instantiation names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-subprogram-face
    '((((class color) (background light)) (:foreground "Orchid4"))
      (((class color) (background dark)) (:foreground "BurlyWood2")))
    "Face used for displaying subprogram names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-entity-selected-face
    '((((class color) (background light)) (:foreground "ForestGreen" :underline 
t))
      (((class color) (background dark)) (:foreground "PaleGreen" :underline 
t)))
    "Face used for displaying entity names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-architecture-selected-face
!   '((((class color) (background light)) (:foreground "Blue" :underline t))
      (((min-colors 88) (class color) (background light)) (:foreground "Blue1" 
:underline t))
      (((class color) (background dark)) (:foreground "LightSkyBlue" :underline 
t)))
    "Face used for displaying architecture names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-configuration-selected-face
    '((((class color) (background light)) (:foreground "DarkGoldenrod" 
:underline t))
      (((class color) (background dark)) (:foreground "Salmon" :underline t)))
    "Face used for displaying configuration names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-package-selected-face
    '((((class color) (background light)) (:foreground "Grey50" :underline t))
      (((class color) (background dark)) (:foreground "Grey80" :underline t)))
    "Face used for displaying package names."
    :group 'speedbar-faces)
  
! (defface vhdl-speedbar-instantiation-selected-face
    '((((class color) (background light)) (:foreground "Brown" :underline t))
      (((class color) (background dark)) (:foreground "Yellow" :underline t)))
    "Face used for displaying instantiation names."
    :group 'speedbar-faces)
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Initialization
***************
*** 15139,15145 ****
      ;; open entity file
      (unless (eq vhdl-compose-create-files 'none)
        (setq ent-file-name
!           (concat (vhdl-replace-string vhdl-entity-file-name ent-name)
                    "." (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p ent-file-name)
                 (not (y-or-n-p (concat "File \"" ent-file-name
--- 15407,15413 ----
      ;; open entity file
      (unless (eq vhdl-compose-create-files 'none)
        (setq ent-file-name
!           (concat (vhdl-replace-string vhdl-entity-file-name ent-name t)
                    "." (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p ent-file-name)
                 (not (y-or-n-p (concat "File \"" ent-file-name
***************
*** 15180,15186 ****
        (setq ent-buffer (current-buffer))
        (setq arch-file-name
            (concat (vhdl-replace-string vhdl-architecture-file-name
!                                        (concat ent-name " " arch-name))
                    "." (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p arch-file-name)
                 (not (y-or-n-p (concat "File \"" arch-file-name
--- 15448,15454 ----
        (setq ent-buffer (current-buffer))
        (setq arch-file-name
            (concat (vhdl-replace-string vhdl-architecture-file-name
!                                        (concat ent-name " " arch-name) t)
                    "." (file-name-extension (buffer-file-name))))
        (when (and (file-exists-p arch-file-name)
                 (not (y-or-n-p (concat "File \"" arch-file-name
***************
*** 15217,15223 ****
      (vhdl-insert-keyword "END ")
      (unless (vhdl-standard-p '87) (vhdl-insert-keyword "ARCHITECTURE "))
      (insert arch-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"))
--- 15485,15491 ----
      (vhdl-insert-keyword "END ")
      (unless (vhdl-standard-p '87) (vhdl-insert-keyword "ARCHITECTURE "))
      (insert arch-name ";\n\n")
!     ;; insert footer and save
      (if (and vhdl-compose-include-header (not (equal vhdl-file-footer "")))
        (vhdl-template-footer)
        (vhdl-comment-display-line) (insert "\n"))
***************
*** 15245,15251 ****
         (error "ERROR:  No architecture found"))
         (let* ((ent-name (match-string 1))
              (ent-file-name
!              (concat (vhdl-replace-string vhdl-entity-file-name ent-name)
                       "." (file-name-extension (buffer-file-name))))
              (orig-buffer (current-buffer)))
         (message "Placing component \"%s\"..." (nth 0 vhdl-port-list))
--- 15513,15519 ----
         (error "ERROR:  No architecture found"))
         (let* ((ent-name (match-string 1))
              (ent-file-name
!              (concat (vhdl-replace-string vhdl-entity-file-name ent-name t)
                       "." (file-name-extension (buffer-file-name))))
              (orig-buffer (current-buffer)))
         (message "Placing component \"%s\"..." (nth 0 vhdl-port-list))
***************
*** 15297,15310 ****
         (error "ERROR:  No architecture found"))
       (let* ((ent-name (match-string 1))
            (ent-file-name
!            (concat (vhdl-replace-string vhdl-entity-file-name ent-name)
                     "." (file-name-extension (buffer-file-name))))
            (arch-decl-pos (point-marker))
            (arch-stat-pos (re-search-forward "^begin\\>" nil))
            (arch-end-pos (re-search-forward "^end\\>" nil))
            (pack-name (vhdl-get-components-package-name))
            (pack-file-name
!            (concat (vhdl-replace-string vhdl-package-file-name pack-name)
                     "." (file-name-extension (buffer-file-name))))
            inst-name comp-name comp-ent-name comp-ent-file-name has-generic
            port-alist generic-alist inst-alist
--- 15565,15578 ----
         (error "ERROR:  No architecture found"))
       (let* ((ent-name (match-string 1))
            (ent-file-name
!            (concat (vhdl-replace-string vhdl-entity-file-name ent-name t)
                     "." (file-name-extension (buffer-file-name))))
            (arch-decl-pos (point-marker))
            (arch-stat-pos (re-search-forward "^begin\\>" nil))
            (arch-end-pos (re-search-forward "^end\\>" nil))
            (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))))
            inst-name comp-name comp-ent-name comp-ent-file-name has-generic
            port-alist generic-alist inst-alist
***************
*** 15340,15346 ****
                (vhdl-port-copy)))
           ;; ... from entity declaration (direct instantiation)
           (setq comp-ent-file-name
!                (concat (vhdl-replace-string vhdl-entity-file-name 
comp-ent-name)
                         "." (file-name-extension (buffer-file-name))))
           (vhdl-visit-file
            comp-ent-file-name t
--- 15608,15614 ----
                (vhdl-port-copy)))
           ;; ... from entity declaration (direct instantiation)
           (setq comp-ent-file-name
!                (concat (vhdl-replace-string vhdl-entity-file-name 
comp-ent-name t)
                         "." (file-name-extension (buffer-file-name))))
           (vhdl-visit-file
            comp-ent-file-name t
***************
*** 15351,15357 ****
              (vhdl-port-copy))))
         (vhdl-port-flatten t)
         (setq generic-alist (nth 1 vhdl-port-list)
!              port-alist (nth 2 vhdl-port-list))
         (setq constant-alist nil
               signal-alist nil)
         (when has-generic
--- 15619,15626 ----
              (vhdl-port-copy))))
         (vhdl-port-flatten t)
         (setq generic-alist (nth 1 vhdl-port-list)
!              port-alist (nth 2 vhdl-port-list)
!              vhdl-port-list nil)
         (setq constant-alist nil
               signal-alist nil)
         (when has-generic
***************
*** 15620,15626 ****
    (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)
                  "." (file-name-extension (buffer-file-name))))
         (ent-alist (aget vhdl-entity-alist
                          (or project default-directory) t))
--- 15889,15895 ----
    (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 (aget vhdl-entity-alist
                          (or project default-directory) t))
***************
*** 15679,15684 ****
--- 15948,16125 ----
      (message "Generating components package \"%s\"...done\n  File created: 
\"%s\""
             pack-name pack-file-name)))
  
+ (defun vhdl-compose-configuration-architecture (ent-name arch-name inst-alist
+                                                        &optional insert-conf)
+   "Generate block configuration for architecture."
+   (let ((margin (current-indentation))
+       (beg (save-excursion (beginning-of-line) (point)))
+       ent-entry inst-entry inst-path inst-prev-path cons-key tmp-alist)
+     ;; insert block configuration (for architecture)
+     (vhdl-insert-keyword "FOR ") (insert arch-name "\n")
+     (setq margin (+ margin vhdl-basic-offset))
+     ;; process all instances
+     (while inst-alist
+       (setq inst-entry (car inst-alist))
+       ;; is component?
+       (when (nth 4 inst-entry)
+       (setq insert-conf t)
+       (setq inst-path (nth 9 inst-entry))
+       ;; skip common path with previous instance
+       (while (and inst-path (equal (car inst-path) (car inst-prev-path)))
+         (setq inst-path (cdr inst-path)
+               inst-prev-path (cdr inst-prev-path)))
+       ;; insert block configuration end (for previous block/generate)
+       (while inst-prev-path
+         (setq margin (- margin vhdl-basic-offset))
+         (indent-to margin)
+         (vhdl-insert-keyword "END FOR;\n")
+         (setq inst-prev-path (cdr inst-prev-path)))
+       ;; insert block configuration beginning (for current block/generate)
+       (indent-to margin)
+       (while inst-path
+         (setq margin (+ margin vhdl-basic-offset))
+         (vhdl-insert-keyword "FOR ")
+         (insert (car inst-path) "\n")
+         (indent-to margin)
+         (setq inst-path (cdr inst-path)))
+       ;; insert component configuration beginning
+       (vhdl-insert-keyword "FOR ")
+       (insert (nth 1 inst-entry) " : " (nth 4 inst-entry) "\n")
+       ;; find subconfiguration
+       (setq conf-key (nth 7 inst-entry))
+       (setq tmp-alist conf-alist)
+       ;; use first configuration found for instance's entity
+       (while (and tmp-alist (null conf-key))
+         (when (equal (nth 5 inst-entry) (nth 4 (car tmp-alist)))
+           (setq conf-key (nth 0 (car tmp-alist))))
+         (setq tmp-alist (cdr tmp-alist)))
+       (setq conf-entry (aget conf-alist conf-key t))
+       ;; insert binding indication ...
+       ;; ... with subconfiguration (if exists)
+       (if (and vhdl-compose-configuration-use-subconfiguration conf-entry)
+           (progn
+             (indent-to (+ margin vhdl-basic-offset))
+             (vhdl-insert-keyword "USE CONFIGURATION ")
+             (insert (vhdl-work-library) "." (nth 0 conf-entry))
+             (insert ";\n"))
+         ;; ... with entity (if exists)
+         (setq ent-entry (aget ent-alist (nth 5 inst-entry) t))
+         (when ent-entry
+           (indent-to (+ margin vhdl-basic-offset))
+           (vhdl-insert-keyword "USE ENTITY ")
+           (insert (vhdl-work-library) "." (nth 0 ent-entry))
+           ;; insert architecture name (if architecture exists)
+           (when (nth 3 ent-entry)
+             (setq arch-name
+                   ;; choose architecture name a) from configuration,
+                   ;; b) from mra, or c) from first architecture
+                   (or (nth 0 (aget (nth 3 ent-entry)
+                                    (or (nth 6 inst-entry)
+                                        (nth 4 ent-entry)) t))
+                       (nth 1 (car (nth 3 ent-entry)))))
+             (insert "(" arch-name ")"))
+           (insert ";\n")
+           ;; insert block configuration (for architecture of subcomponent)
+           (when (and vhdl-compose-configuration-hierarchical
+                      (nth 3 ent-entry))
+             (indent-to (+ margin vhdl-basic-offset))
+             (vhdl-compose-configuration-architecture
+              (nth 0 ent-entry) arch-name
+              (nth 3 (aget (nth 3 ent-entry) (downcase arch-name) t))))))
+       ;; insert component configuration end
+       (indent-to margin)
+       (vhdl-insert-keyword "END FOR;\n")
+       (setq inst-prev-path (nth 9 inst-entry)))
+       (setq inst-alist (cdr inst-alist)))
+     ;; insert block configuration end (for block/generate)
+     (while inst-prev-path
+       (setq margin (- margin vhdl-basic-offset))
+       (indent-to margin)
+       (vhdl-insert-keyword "END FOR;\n")
+       (setq inst-prev-path (cdr inst-prev-path)))
+     (indent-to (- margin vhdl-basic-offset))
+     ;; insert block configuration end or remove beginning (for architecture)
+     (if insert-conf
+       (vhdl-insert-keyword "END FOR;\n")
+       (delete-region beg (point)))))
+ 
+ (defun vhdl-compose-configuration (&optional ent-name arch-name)
+   "Generate configuration declaration."
+   (interactive)
+   (vhdl-require-hierarchy-info)
+   (let ((ent-alist (aget vhdl-entity-alist
+                        (or (vhdl-project-p) default-directory) t))
+       (conf-alist (aget vhdl-config-alist
+                         (or (vhdl-project-p) default-directory) t))
+       (from-speedbar ent-name)
+       inst-alist conf-name conf-file-name pos)
+     (vhdl-prepare-search-2
+      ;; get entity and architecture name
+      (unless ent-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 ent-name (match-string-no-properties 3))
+                     (setq arch-name (match-string-no-properties 2)))
+          (error "ERROR:  Not within an architecture"))))
+      (setq conf-name (vhdl-replace-string
+                     vhdl-compose-configuration-name
+                     (concat ent-name " " arch-name)))
+      (setq inst-alist
+          (nth 3 (aget (nth 3 (aget ent-alist (downcase ent-name) t))
+                       (downcase arch-name) t))))
+      (message "Generating configuration \"%s\"..." conf-name)
+      (if vhdl-compose-configuration-create-file
+        ;; open configuration file
+        (progn
+          (setq conf-file-name
+                (concat (vhdl-replace-string vhdl-configuration-file-name
+                                             conf-name t)
+                        "." (file-name-extension (buffer-file-name))))
+          (when (and (file-exists-p conf-file-name)
+                     (not (y-or-n-p (concat "File \"" conf-file-name
+                                            "\" exists; overwrite? "))))
+            (error "ERROR:  Creating configuration...aborted"))
+          (find-file conf-file-name)
+          (erase-buffer)
+          (set-buffer-modified-p nil)
+          ;; insert header
+          (if vhdl-compose-include-header
+              (progn (vhdl-template-header
+                      (concat "Configuration declaration for design \""
+                              ent-name "(" arch-name ")\""))
+                     (goto-char (point-max)))
+            (vhdl-comment-display-line) (insert "\n\n")))
+        ;; goto end of architecture
+        (unless from-speedbar
+        (re-search-forward "^end\\>" nil)
+        (end-of-line) (insert "\n\n")
+        (vhdl-comment-display-line) (insert "\n\n")))
+      ;; insert library clause
+      (setq pos (point))
+      (vhdl-template-standard-package (vhdl-work-library) nil)
+      (when (/= pos (point))
+        (insert "\n\n"))
+      ;; insert configuration
+      (vhdl-insert-keyword "CONFIGURATION ") (insert conf-name)
+      (vhdl-insert-keyword " OF ") (insert ent-name)
+      (vhdl-insert-keyword " IS\n")
+      (indent-to vhdl-basic-offset)
+      ;; insert block configuration (for architecture)
+      (vhdl-compose-configuration-architecture ent-name arch-name inst-alist t)
+      (vhdl-insert-keyword "END ") (insert conf-name ";")
+      (when conf-file-name
+        ;; insert footer and save
+        (insert "\n\n")
+        (if (and vhdl-compose-include-header (not (equal vhdl-file-footer "")))
+          (vhdl-template-footer)
+        (vhdl-comment-display-line) (insert "\n"))
+        (save-buffer))
+      (message
+       (concat (format "Generating configuration \"%s\"...done" conf-name)
+             (and conf-file-name
+                  (format "\n  File created: \"%s\"" conf-file-name))))))
+ 
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;; Compilation / Makefile generation
***************
*** 15859,15869 ****
--- 16300,16316 ----
          (compile (concat command " " options " " file-name)))
        (vhdl-warning "Your project settings tell me not to compile this 
file"))))
  
+ (defvar vhdl-make-target "all"
+   "Default target for `vhdl-make' command.")
+ 
  (defun vhdl-make (&optional target)
    "Call make command for compilation of all updated source files (requires
  `Makefile').  Optional argument TARGET allows to compile the design
  specified by a target."
    (interactive)
+   (setq vhdl-make-target
+       (or target (read-from-minibuffer "Target: " vhdl-make-target
+                                        vhdl-minibuffer-local-map)))
    (vhdl-compile-init)
    (let* ((project (aget vhdl-project-alist vhdl-project))
         (compiler (or (aget vhdl-compiler-alist vhdl-compiler)
***************
*** 15875,15881 ****
        (error "ERROR:  Compile directory does not exist: \"%s\"" 
default-directory))
      ;; run make
      (compile (concat (if (equal command "") "make" command)
!                    " " options " " target))))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Makefile generation
--- 16322,16328 ----
        (error "ERROR:  Compile directory does not exist: \"%s\"" 
default-directory))
      ;; run make
      (compile (concat (if (equal command "") "make" command)
!                    " " options " " vhdl-make-target))))
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Makefile generation
***************
*** 15954,15960 ****
        (setq ent-file-name (file-relative-name
                             (nth 2 ent-entry) compile-directory)
              arch-alist (nth 4 ent-entry)
!             lib-alist (nth 5 ent-entry)
              rule (aget rule-alist ent-file-name)
              target-list (nth 0 rule)
              depend-list (nth 1 rule)
--- 16401,16407 ----
        (setq ent-file-name (file-relative-name
                             (nth 2 ent-entry) compile-directory)
              arch-alist (nth 4 ent-entry)
!             lib-alist (nth 6 ent-entry)
              rule (aget rule-alist ent-file-name)
              target-list (nth 0 rule)
              depend-list (nth 1 rule)
***************
*** 16224,16230 ****
          (insert " \\\n\t\t$(UNIT-" work-library "-" (car second-list) ")")
          (setq second-list (cdr second-list)))
        (while subcomp-list
!         (when (assoc (car subcomp-list) unit-list)
            (insert " \\\n\t\t" (car subcomp-list)))
          (setq subcomp-list (cdr subcomp-list)))
        (insert "\n")
--- 16671,16678 ----
          (insert " \\\n\t\t$(UNIT-" work-library "-" (car second-list) ")")
          (setq second-list (cdr second-list)))
        (while subcomp-list
!         (when (and (assoc (car subcomp-list) unit-list)
!                    (not (equal unit-key (car subcomp-list))))
            (insert " \\\n\t\t" (car subcomp-list)))
          (setq subcomp-list (cdr subcomp-list)))
        (insert "\n")
***************
*** 16329,16336 ****
--- 16777,16786 ----
         'vhdl-upper-case-enum-values
         'vhdl-upper-case-constants
         'vhdl-use-direct-instantiation
+        'vhdl-compose-configuration-name
         'vhdl-entity-file-name
         'vhdl-architecture-file-name
+        'vhdl-configuration-file-name
         'vhdl-package-file-name
         'vhdl-file-name-case
         'vhdl-electric-keywords
***************
*** 16373,16379 ****
--- 16823,16834 ----
         'vhdl-testbench-include-library
         'vhdl-testbench-include-configuration
         'vhdl-testbench-create-files
+        'vhdl-testbench-entity-file-name
+        'vhdl-testbench-architecture-file-name
         'vhdl-compose-create-files
+        'vhdl-compose-configuration-create-file
+        'vhdl-compose-configuration-hierarchical
+        'vhdl-compose-configuration-use-subconfiguration
         'vhdl-compose-include-header
         'vhdl-compose-architecture-name
         'vhdl-components-package-name
***************
*** 16436,16537 ****
  
  (defconst vhdl-doc-release-notes nil
    "\
! Release Notes for VHDL Mode 3.32
  ================================
  
    - New Features
-   - Enhanced Features
    - User Options
-   - Remarks
  
  
  New Features
  ------------
  
! STRUCTURAL COMPOSITION:
!   - Enables simple structural composition similar to graphical editors.
!     Simplifies the creation of higher design levels where subcomponents
!     are simply sticked together:
!       1. Create a skeleton for a new component
!       2. Place subcomponents in it directly from the hierarchy browser
!       3. Automatically connect all subcomponents and create the ports
!          for the new component (based on names of actual ports)
!   - Automatic generation of a components package (package containing
!     component declarations for all entities).
!   - Find more information in the online documentation (`C-c C-h').
! 
! PORT TRANSLATION:
!   - Reverse direction of ports (useful for testbenches).
! 
! SUBPROGRAM TRANSLATION:
!   - Copy/paste of subprogram interfaces (similar to port translation).
! 
! CODE FILLING:
!   - Condense code using code-sensitive block filling.
! 
! CODE STATISTICS:
!   - Calculate number of code lines and statements in a buffer.
! 
! 
! Enhanced Features
! -----------------
! 
! TESTBENCH GENERATION:
!   - Enhanced templates and user option default values.
! 
! Emacs 21 compatibility/enhancements:
!   - `lazy-lock-mode' is not used anymore (built-in `jit-lock-mode' is faster).
! 
! And many other minor fixes and enhancements.
  
  
  User Options
  ------------
  
! `vhdl-project-file-name': (enhanced)
!   Include user name in project setup file name.
! `vhdl-speedbar-cache-file-name': (enhanced, changed default)
!   Include user name in cache file name.
! `vhdl-default-library': (new)
!   Default working library if no project is active.
! `vhdl-architecture-file-name': (new)
!   Specify how the architecture file name is obtained.
! `vhdl-package-file-name': (new)
!   Specify how the package file name is obtained.
! `vhdl-file-name-case': (new)
!   Allows to change case when deriving file names.
! `vhdl-compose-create-files': (new)
!   Specify whether new files should be created for a new component.
! `vhdl-compose-include-header': (new)
!   Specify whether a header is included in a new component's file.
! `vhdl-compose-architecture-name': (new)
!   Specify how a new component's architecture name is obtained.
! `vhdl-components-package-name': (new)
!   Specify how the name for the components package is obtained.
! `vhdl-use-components-package': (new)
!   Specify whether component declarations go in a components package.
! `vhdl-use-direct-instantiation': (new)
!   Specify whether to use VHDL'93 direct component instantiation.
! `vhdl-instance-name': (changed default)
!   Allows insertion of a running number to generate unique instance names.
! `vhdl-testbench-entity-header', 
`vhdl-testbench-architecture-header':(obsolete)
!   Headers are now automatically derived from the standard header.
! `vhdl-testbench-include-header': (new)
!   Specify whether a header is included in testbench files.
! `vhdl-testbench-declaration', `vhdl-testbench-statements': (changed default)
!   Non-empty default values for more complete testbench templates.
! 
! 
! Remarks
! -------
! 
! - Changed key binding for `vhdl-comment-uncomment-region': `C-c c'
!   (`C-c C-c ...' is now used for structural composition).
! 
! - Automatic buffer highlighting (font-lock) is now controlled by option
!   `global-font-lock-mode' in GNU Emacs (`font-lock-auto-fontify' in XEmacs).
!   \(Important: You MUST customize this option in order to turn automatic
!    buffer highlighting on.)
  ")
  
  
--- 16891,16924 ----
  
  (defconst vhdl-doc-release-notes nil
    "\
! Release Notes for VHDL Mode 3.33
  ================================
  
    - New Features
    - User Options
  
  
  New Features
  ------------
  
! CONFIGURATION DECLARATION GENERATION:
!   - Automatic generation of a configuration declaration for a design.
!     (See documentation (`C-c C-h') in section on STRUCTURAL COMPOSITION.)
  
  
  User Options
  ------------
  
! `vhdl-configuration-file-name': (new)
!   Specify how the configuration file name is obtained.
! `vhdl-compose-configuration-name': (new)
!   Specify how the configuration name is optained.
! `vhdl-compose-configuration-create-file': (new)
!   Specify whether a new file should be created for a configuration.
! `vhdl-compose-configuration-hierarchical': (new)
!   Specify whether hierarchical configurations should be created.
! `vhdl-compose-configuration-use-subconfiguration': (new)
!   Specify whether subconfigurations should be used inside configurations.
  ")
  
  
***************
*** 16601,16607 ****
    (interactive)
    (unless vhdl-xemacs
      (help-setup-xref (list #'vhdl-doc-variable variable) (interactive-p)))
!   (with-output-to-temp-buffer (if (fboundp 'help-buffer) (help-buffer) 
"*Help*")
      (princ (documentation-property variable 'variable-documentation))
      (with-current-buffer standard-output
        (help-mode))
--- 16988,16995 ----
    (interactive)
    (unless vhdl-xemacs
      (help-setup-xref (list #'vhdl-doc-variable variable) (interactive-p)))
!   (with-output-to-temp-buffer
!       (if (fboundp 'help-buffer) (help-buffer) "*Help*")
      (princ (documentation-property variable 'variable-documentation))
      (with-current-buffer standard-output
        (help-mode))
***************
*** 16612,16618 ****
    (interactive)
    (unless vhdl-xemacs
      (help-setup-xref (list #'vhdl-doc-mode) (interactive-p)))
!   (with-output-to-temp-buffer (if (fboundp 'help-buffer) (help-buffer) 
"*Help*")
      (princ mode-name)
      (princ " mode:\n")
      (princ (documentation 'vhdl-mode))
--- 17000,17007 ----
    (interactive)
    (unless vhdl-xemacs
      (help-setup-xref (list #'vhdl-doc-mode) (interactive-p)))
!   (with-output-to-temp-buffer
!       (if (fboundp 'help-buffer) (help-buffer) "*Help*")
      (princ mode-name)
      (princ " mode:\n")
      (princ (documentation 'vhdl-mode))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]