all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33.
@ 2012-05-23 12:53 Rüdiger Sonderfeld
  2012-05-24  4:33 ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Rüdiger Sonderfeld @ 2012-05-23 12:53 UTC (permalink / raw
  To: emacs-devel

See
http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html#release-notes-3.33

Among the changes are
* Support for ghdl (free vhdl compiler). Now default
* Add/update support for VHDL-AMS packages.
* Update to VHDL'02 standard
...

I tried to be very careful not to overwrite any non-upstream changes
that were made to vhdl-mode.

Signed-off-by: Rüdiger Sonderfeld <ruediger@c-plusplus.de>
---
 lisp/progmodes/vhdl-mode.el | 1303 
+++++++++++++++++++++++++++++--------------
 1 file changed, 893 insertions(+), 410 deletions(-)

diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9b7ee5d..27215de 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -13,10 +13,10 @@
 ;; filed in the Emacs bug reporting system against this file, a copy
 ;; of the bug report be sent to the maintainer's email address.
 
-(defconst vhdl-version "3.33.6"
+(defconst vhdl-version "3.33.28"
   "VHDL Mode version number.")
 
-(defconst vhdl-time-stamp "2005-08-30"
+(defconst vhdl-time-stamp "2010-09-22"
   "VHDL Mode time stamp for last update.")
 
 ;; This file is part of GNU Emacs.
@@ -72,13 +72,13 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Emacs Versions
 
-;; supported: GNU Emacs 20.X/21.X/22.X, XEmacs 20.X/21.X
-;; tested on: GNU Emacs 20.4, XEmacs 21.1 (marginally)
+;; supported: GNU Emacs 20.X/21.X/22.X,23.X, XEmacs 20.X/21.X
+;; tested on: GNU Emacs 20.4/21.3/22.1,23.X, XEmacs 21.1 (marginally)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Installation
 
-;; Prerequisites:  GNU Emacs 20.X/21.X/22.X, XEmacs 20.X/21.X.
+;; Prerequisites:  GNU Emacs 20.X/21.X/22.X/23.X, XEmacs 20.X/21.X.
 
 ;; Put `vhdl-mode.el' into the `site-lisp' directory of your Emacs 
installation
 ;; or into an arbitrary directory that is added to the load path by the
@@ -93,7 +93,7 @@
 
 ;; Add the following lines to the `site-start.el' file in the `site-lisp'
 ;; directory of your Emacs installation or to your Emacs start-up file 
`.emacs'
-;; (not required in Emacs 20.X):
+;; (not required in Emacs 20 and higher):
 
 ;;   (autoload 'vhdl-mode "vhdl-mode" "VHDL Mode" t)
 ;;   (setq auto-mode-alist (cons '("\\.vhdl?\\'" . vhdl-mode) auto-mode-
alist))
@@ -184,7 +184,7 @@ Examples:
   \".*\"           \"\"      inserts empty string")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; User variables
+;; User variables (customization options)
 
 (defgroup vhdl nil
   "Customizations for VHDL Mode."
@@ -197,6 +197,21 @@ Examples:
   "Customizations for modes."
   :group 'vhdl)
 
+(defcustom vhdl-electric-mode t
+  "Non-nil enables electrification (automatic template generation).
+If nil, template generators can still be invoked through key bindings and
+menu.  Is indicated in the modeline by \"/e\" after the mode name and can be
+toggled by `\\[vhdl-electric-mode]'."
+  :type 'boolean
+  :group 'vhdl-mode)
+
+(defcustom vhdl-stutter-mode t
+  "Non-nil enables stuttering.
+Is indicated in the modeline by \"/s\" after the mode name and can be toggled
+by `\\[vhdl-stutter-mode]'."
+  :type 'boolean
+  :group 'vhdl-mode)
+
 (defcustom vhdl-indent-tabs-mode nil
   "Non-nil means indentation can insert tabs.
 Overrides local variable `indent-tabs-mode'."
@@ -210,6 +225,17 @@ Overrides local variable `indent-tabs-mode'."
 
 (defcustom vhdl-compiler-alist
   '(
+    ("ADVance MS" "vacom" "-work \\1" "make" "-f \\1"
+     nil "valib \\1; vamap \\2 \\1" "./" "work/" "Makefile" "adms"
+     ("\\s-\\([0-9]+\\):" 0 1 0) ("Compiling file \\(.+\\)" 1)
+     ("ENTI/\\1.vif" "ARCH/\\1-\\2.vif" "CONF/\\1.vif"
+      "PACK/\\1.vif" "BODY/\\1.vif" upcase))
+    ;; Aldec
+    ;; COMP96 ERROR COMP96_0078: "Unknown identifier "Addr_Bits"." "<filename>" 
40 30
+    ("Aldec" "vcom" "-93 -work \\1" "make" "-f \\1"
+     nil "vlib \\1; vmap \\2 \\1" "./" "work/" "Makefile" "aldec"
+     (".+?[ \t]+\\(?:ERROR\\)[^:]+:.+?\\(?:.+\"\\(.+?\\)\"[ 
\t]+\\([0-9]+\\)\\)" 1 2 0) ("" 0)
+     nil)
     ;; Cadence Leapfrog: cv -file test.vhd
     ;; duluth: *E,430 (test.vhd,13): identifier (POSITIV) is not declared
     ("Cadence Leapfrog" "cv" "-work \\1 -file" "make" "-f \\1"
@@ -225,6 +251,12 @@ Overrides local variable `indent-tabs-mode'."
      ("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))
+    ;; ghdl vhdl: ghdl test.vhd
+    ("GHDL" "ghdl" "-i --workdir=\\1 --ieee=synopsys -fexplicit " "make" "-f 
\\1"
+     nil "mkdir \\1" "./" "work/" "Makefile" "ghdl"
+     ("ghdl_p: \\*E,\\w+ (\\(.+\\),\\([0-9]+\\)|\\([0-9]+\\)):" 1 2 3) ("" 0)
+     ("\\1/entity" "\\2/\\1" "\\1/configuration"
+      "\\1/package" "\\1/body" downcase))
     ;; Ikos Voyager: analyze test.vhd
     ;; analyze test.vhd
     ;; E L4/C5:        this library unit is inaccessible
@@ -236,10 +268,11 @@ Overrides local variable `indent-tabs-mode'."
     ;; ModelSim, Model Technology: vcom test.vhd
     ;; ERROR: test.vhd(14): Unknown identifier: positiv
     ;; WARNING[2]: test.vhd(85): Possible infinite loop
+    ;; ** Warning: [4] ../src/emacsvsim.vhd(43): An abstract ...
     ;; ** Error: adder.vhd(190): Unknown identifier: ctl_numb
     ("ModelSim" "vcom" "-93 -work \\1" "make" "-f \\1"
      nil "vlib \\1; vmap \\2 \\1" "./" "work/" "Makefile" "modelsim"
-     ("\\(ERROR\\|WARNING\\|\\*\\* Error\\|\\*\\* Warning\\)[^:]*: \\(.+\\)
(\\([0-9]+\\)):" 2 3 0) ("" 0)
+     ("\\(ERROR\\|WARNING\\|\\*\\* Error\\|\\*\\* Warning\\)[^:]*:\\( 
*\[[0-9]+\]\\)? \\(.+\\)(\\([0-9]+\\)):" 3 4 0) ("" 0)
      ("\\1/_primary.dat" "\\2/\\1.dat" "\\1/_primary.dat"
       "\\1/_primary.dat" "\\1/body.dat" downcase))
     ;; ProVHDL, Synopsys LEDA: provhdl -w work -f test.vhd
@@ -321,6 +354,12 @@ Overrides local variable `indent-tabs-mode'."
      ("\\*\\*Error: LINE \\([0-9]+\\) \\*\\*\\*" 0 1 0)
      ("^ *Compiling \"\\(.+\\)\" " 1)
      nil)
+    ;; Xilinx XST:
+    ;; ERROR:HDLParsers:164 - "test.vhd" Line 3. parse error
+    ("Xilinx XST" "xflow" "" "make" "-f \\1"
+     nil "mkdir \\1" "./" "work/" "Makefile" "xilinx"
+     ("^ERROR:HDLParsers:[0-9]+ - \"\\(.+\\)\" Line \\([0-9]+\\)\." 1 2 0) 
("" 0)
+     nil)
     )
   "List of available VHDL compilers and their properties.
 Each list entry specifies the following items for a compiler:
@@ -428,7 +467,7 @@ NOTE: Activate new error and file message regexps and 
reflect the new setting
 	 (vhdl-custom-set variable value 'vhdl-update-mode-menu))
   :group 'vhdl-compile)
 
-(defcustom vhdl-compiler "ModelSim"
+(defcustom vhdl-compiler "GHDL"
   "Specifies the VHDL compiler to be used for syntax analysis.
 Select a compiler name from the ones defined in option `vhdl-compiler-alist'."
   :type (let ((alist vhdl-compiler-alist) list)
@@ -450,6 +489,17 @@ NOTE: Activate the new setting by restarting Emacs."
   :type 'boolean
   :group 'vhdl-compile)
 
+(defcustom vhdl-makefile-default-targets '("all" "clean" "library")
+  "List of default target names in Makefiles.
+Automatically generated Makefiles include three default targets to compile
+the entire design, clean the entire design and to create the design library.
+This option allows to change the names of these targets to avoid conflicts
+with other user Makefiles."
+  :type '(list (string :tag "Compile entire design")
+	       (string :tag "Clean entire design  ")
+	       (string :tag "Create design library"))
+  :group 'vhdl-compile)
+
 (defcustom vhdl-makefile-generation-hook nil
   "Functions to run at the end of Makefile generation.
 Allows to insert user specific parts into a Makefile.
@@ -647,11 +697,11 @@ A project setup file can be obtained by exporting a 
project (see menu).
   :group 'vhdl-port
   :group 'vhdl-compose)
 
-(defcustom vhdl-standard '(87 nil)
+(defcustom vhdl-standard '(93 nil)
   "VHDL standards used.
 Basic standard:
   VHDL'87      : IEEE Std 1076-1987
-  VHDL'93      : IEEE Std 1076-1993
+  VHDL'93/02   : IEEE Std 1076-1993/2002
 Additional standards:
   VHDL-AMS     : IEEE Std 1076.1 (analog-mixed-signal)
   Math packages: IEEE Std 1076.2 (`math_real', `math_complex')
@@ -660,7 +710,7 @@ NOTE: Activate the new setting in a VHDL buffer by using 
the menu entry
       \"Activate Options\"."
   :type '(list (choice :tag "Basic standard"
 		       (const :tag "VHDL'87" 87)
-		       (const :tag "VHDL'93" 93))
+		       (const :tag "VHDL'93/02" 93))
 	       (set :tag "Additional standards" :indent 2
 		    (const :tag "VHDL-AMS" ams)
 		    (const :tag "Math packages" math)))
@@ -730,6 +780,14 @@ This is done when expanded."
 		 (const :tag "Always" always))
   :group 'vhdl-style)
 
+(defcustom vhdl-array-index-record-field-in-sensitivity-list t
+  "Non-nil means include array indices / record fields in sensitivity list.
+If a signal read in a process is a record field or pointed to by an array
+index, the record field or array index is included with the record name in
+the sensitivity list (e.g. \"in1(0)\", \"in2.f0\").
+Otherwise, only the record name is included (e.g. \"in1\", \"in2\")."
+  :type 'boolean
+  :group 'vhdl-style)
 
 (defgroup vhdl-naming nil
   "Customizations for naming conventions."
@@ -916,7 +974,8 @@ if the header needs to be version controlled.
 The following keywords for template generation are supported:
   <filename>    : replaced by the name of the buffer
   <author>      : replaced by the user name and email address
-                  \(`user-full-name', `mail-host-address', `user-mail-
address')
+                  \(`user-full-name',`mail-host-address', `user-mail-
address')
+  <authorfull>  : replaced by the user full name (`user-full-name') 
   <login>       : replaced by user login name (`user-login-name')
   <company>     : replaced by contents of option `vhdl-company-name'
   <date>        : replaced by the current date
@@ -999,11 +1058,12 @@ NOTE: Activate the new setting in a VHDL buffer by using 
the menu entry
   "Customizations for sequential processes."
   :group 'vhdl-template)
 
-(defcustom vhdl-reset-kind 'async
+(defcustom  vhdl-reset-kind 'async
   "Specifies which kind of reset to use in sequential processes."
   :type '(choice (const :tag "None" none)
 		 (const :tag "Synchronous" sync)
-		 (const :tag "Asynchronous" async))
+		 (const :tag "Asynchronous" async)
+		 (const :tag "Query" query))
   :group 'vhdl-sequential-process)
 
 (defcustom vhdl-reset-active-high nil
@@ -1563,22 +1623,25 @@ NOTE: Activate the new setting in a VHDL buffer by re-
fontifying it (menu
   :group 'vhdl-highlight)
 
 (defcustom vhdl-special-syntax-alist
-  '(("generic/constant" "\\w+_[cg]" "Gold3" "BurlyWood1")
-    ("type" "\\w+_t" "ForestGreen" "PaleGreen")
-    ("variable" "\\w+_v" "Grey50" "Grey80"))
+  '(("generic/constant" "\\<\\w+_[cg]\\>" "Gold3" "BurlyWood1" nil)
+    ("type" "\\<\\w+_t\\>" "ForestGreen" "PaleGreen" nil)
+    ("variable" "\\<\\w+_v\\>" "Grey50" "Grey80" nil))
   "List of special syntax to be highlighted.
 If option `vhdl-highlight-special-words' is non-nil, words with the specified
 syntax (as regular expression) are highlighted in the corresponding color.
 
   Name         : string of words and spaces
   Regexp       : regular expression describing word syntax
-                  (e.g. \"\\\w+_c\" matches word with suffix \"_c\")
+                 (e.g. \"\\\\=\<\\\w+_c\\\\=\>\" matches word with suffix 
\"_c\")
+                 expression must start with \"\\\\=\<\" and end with 
\"\\\\=\>\"
+                 if only whole words should be matched (no substrings)
   Color (light): foreground color for light background
                  (matching color examples: Gold3, Grey50, LimeGreen, Tomato,
                  LightSeaGreen, DodgerBlue, Gold, PaleVioletRed)
   Color (dark) : foreground color for dark background
                  (matching color examples: BurlyWood1, Grey80, Green, Coral,
                  AquaMarine2, LightSkyBlue1, Yellow, PaleVioletRed1)
+  In comments  : If non-nil, words are also highlighted inside comments
 
 Can be used for visual support of naming conventions, such as highlighting
 different kinds of signals (e.g. \"Clk50\", \"Rst_n\") or objects (e.g.
@@ -1593,7 +1656,8 @@ NOTE: Activate a changed regexp in a VHDL buffer by re-
fontifying it (menu
 		       (string :tag "Name         ")
 		       (regexp :tag "Regexp       " "\\w+_")
 		       (string :tag "Color (light)")
-		       (string :tag "Color (dark) ")))
+		       (string :tag "Color (dark) ")
+		       (boolean :tag "In comments  ")))
   :set (lambda (variable value)
 	 (vhdl-custom-set variable value 'vhdl-font-lock-init))
   :group 'vhdl-highlight)
@@ -1794,6 +1858,14 @@ useful in large files where syntax-based indentation 
gets very slow."
   :type 'boolean
   :group 'vhdl-misc)
 
+(defcustom vhdl-indent-comment-like-next-code-line t
+  "*Non-nil means comment lines are indented like the following code line.
+Otherwise, comment lines are indented like the preceding code line.
+Indenting comment lines like the following code line gives nicer indentation
+when comments precede the code that they refer to."
+  :type 'boolean
+  :group 'vhdl-misc)
+
 (defcustom vhdl-word-completion-case-sensitive nil
   "Non-nil means word completion using `TAB' is case sensitive.
 That is, `TAB' completes words that start with the same letters and case.
@@ -1833,6 +1905,7 @@ NOTE: Activate the new setting in a VHDL buffer by using 
the menu entry
   (custom-add-to-group 'vhdl-related 'paren-showing 'custom-group))
 (custom-add-to-group 'vhdl-related 'ps-print 'custom-group)
 (custom-add-to-group 'vhdl-related 'speedbar 'custom-group)
+(custom-add-to-group 'vhdl-related 'comment-style 'custom-variable)
 (custom-add-to-group 'vhdl-related 'line-number-mode 'custom-variable)
 (unless (featurep 'xemacs)
   (custom-add-to-group 'vhdl-related 'transient-mark-mode 'custom-variable))
@@ -1841,6 +1914,15 @@ NOTE: Activate the new setting in a VHDL buffer by using 
the menu entry
 (custom-add-to-group 'vhdl-related 'user-mail-address 'custom-variable)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Hidden user variables
+
+(defvar vhdl-compile-absolute-path nil
+  "If non-nil, use absolute instead of relative path for compiled files.")
+
+(defvar vhdl-comment-display-line-char ?-
+  "Character to use in comment display line.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Internal variables
 
 (defvar vhdl-menu-max-size 20
@@ -3270,9 +3352,6 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
       (list
        (append
 	'("Package")
-	(when (vhdl-standard-p 'math)
-	  '(["math_complex"	vhdl-template-package-math-complex t]
-	    ["math_real"	vhdl-template-package-math-real t]))
 	'(["numeric_bit"	vhdl-template-package-numeric-bit t]
 	  ["numeric_std"	vhdl-template-package-numeric-std t]
 	  ["std_logic_1164"	vhdl-template-package-std-logic-1164 t]
@@ -3283,8 +3362,22 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
 	  ["std_logic_unsigned"	vhdl-template-package-std-logic-unsigned t]
 	  ["std_logic_misc"	vhdl-template-package-std-logic-misc t]
 	  ["std_logic_textio"	vhdl-template-package-std-logic-textio t]
-	  "--"
-	  ["Insert Package..."	vhdl-template-insert-package
+	  "--")
+	(when (vhdl-standard-p 'ams)
+	  '(["fundamental_constants" vhdl-template-package-fundamental-constants t]
+	    ["material_constants" vhdl-template-package-material-constants t]
+	    ["energy_systems"	vhdl-template-package-energy-systems t]
+	    ["electrical_systems" vhdl-template-package-electrical-systems t]
+	    ["mechanical_systems" vhdl-template-package-mechanical-systems t]
+	    ["radiant_systems"	vhdl-template-package-radiant-systems t]
+	    ["thermal_systems"	vhdl-template-package-thermal-systems t]
+	    ["fluidic_systems"	vhdl-template-package-fluidic-systems t]
+	    "--"))
+	(when (vhdl-standard-p 'math)
+	  '(["math_complex"	vhdl-template-package-math-complex t]
+	    ["math_real"	vhdl-template-package-math-real t]
+	    "--"))
+	'(["Insert Package..."	vhdl-template-insert-package
 				:keys "C-c C-i C-p"])))
       '(("Directive"
 	 ["translate_on"	vhdl-template-directive-translate-on t]
@@ -3417,6 +3510,7 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
      ["Buffer"			vhdl-beautify-buffer t])
     ("Fix"
      ["Generic/Port Clause"	vhdl-fix-clause t]
+     ["Generic/Port Clause Buffer" vhdl-fix-clause t]
      "--"
      ["Case Region"		vhdl-fix-case-region (mark)]
      ["Case Buffer"		vhdl-fix-case-buffer t]
@@ -3449,11 +3543,13 @@ STRING are replaced by `-' and substrings are 
converted to lower case."
      ("Mode"
       ["Electric Mode"
        (progn (customize-set-variable 'vhdl-electric-mode
-				      (not vhdl-electric-mode)))
+				      (not vhdl-electric-mode))
+	      (vhdl-mode-line-update))
        :style toggle :selected vhdl-electric-mode :keys "C-c C-m C-e"]
       ["Stutter Mode"
        (progn (customize-set-variable 'vhdl-stutter-mode
-				      (not vhdl-stutter-mode)))
+				      (not vhdl-stutter-mode))
+	      (vhdl-mode-line-update))
        :style toggle :selected vhdl-stutter-mode :keys "C-c C-m C-s"]
       ["Indent Tabs Mode"
        (progn (customize-set-variable 'vhdl-indent-tabs-mode
@@ -3515,6 +3611,8 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
        (customize-set-variable 'vhdl-compile-use-local-error-regexp
 			       (not vhdl-compile-use-local-error-regexp))
        :style toggle :selected vhdl-compile-use-local-error-regexp]
+      ["Makefile Default Targets..."
+       (customize-option 'vhdl-makefile-default-targets) t]
       ["Makefile Generation Hook..."
        (customize-option 'vhdl-makefile-generation-hook) t]
       ["Default Library Name" (customize-option 'vhdl-default-library) t]
@@ -3527,7 +3625,7 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
 				       (list '87 (cadr vhdl-standard)))
 	       (vhdl-activate-customizations))
 	:style radio :selected (eq '87 (car vhdl-standard))]
-       ["VHDL'93"
+       ["VHDL'93/02"
 	(progn (customize-set-variable 'vhdl-standard
 				       (list '93 (cadr vhdl-standard)))
 	       (vhdl-activate-customizations))
@@ -3580,6 +3678,10 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
        ["Always"
 	(customize-set-variable 'vhdl-use-direct-instantiation 'always)
 	:style radio :selected (eq 'always vhdl-use-direct-instantiation)])
+      ["Include Array Index and Record Field in Sensitivity List"
+       (customize-set-variable 'vhdl-array-index-record-field-in-sensitivity-
list
+			       (not vhdl-array-index-record-field-in-sensitivity-list))
+       :style toggle :selected vhdl-array-index-record-field-in-sensitivity-
list]
       "--"
       ["Customize Group..." (customize-group 'vhdl-style) t])
      ("Naming"
@@ -3676,7 +3778,10 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
 	 :style radio :selected (eq 'sync vhdl-reset-kind)]
 	["Asynchronous"
 	 (customize-set-variable 'vhdl-reset-kind 'async)
-	 :style radio :selected (eq 'async vhdl-reset-kind)])
+	 :style radio :selected (eq 'async vhdl-reset-kind)]
+	["Query"
+	 (customize-set-variable 'vhdl-reset-kind 'query)
+	 :style radio :selected (eq 'query vhdl-reset-kind)])
        ["Reset is Active High"
 	(customize-set-variable 'vhdl-reset-active-high
 				(not vhdl-reset-active-high))
@@ -3966,6 +4071,10 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
        (customize-set-variable 'vhdl-indent-syntax-based
 			       (not vhdl-indent-syntax-based))
        :style toggle :selected vhdl-indent-syntax-based]
+      ["Indent Comments Like Next Code Line"
+       (customize-set-variable 'vhdl-indent-comment-like-next-code-line
+			       (not vhdl-indent-comment-like-next-code-line))
+       :style toggle :selected vhdl-indent-comment-like-next-code-line]
       ["Word Completion is Case Sensitive"
        (customize-set-variable 'vhdl-word-completion-case-sensitive
 			       (not vhdl-word-completion-case-sensitive))
@@ -4009,7 +4118,7 @@ STRING are replaced by `-' and substrings are converted 
to lower case."
      "^\\s-*\\(\\(\\(impure\\|pure\\)\\s-+\\|\\)function\\|
procedure\\)\\s-+\\(\"?\\(\\w\\|\\s_\\)+\"?\\)"
      4)
     ("Instance"
-     "^\\s-*\\(\\(\\w\\|\\s_\\)+\\s-*:\\(\\s-\\|\n\\)*\\(\\w\\|
\\s_\\)+\\)\\(\\s-\\|\n\\)+\\(generic\\|port\\)\\s-+map\\>"
+     "^\\s-*\\(\\(\\w\\|\\s_\\)+\\s-*:\\(\\s-\\|\n\\)*\\(entity\\s-+\\(\\w\\|
\\s_\\)+\\.\\)?\\(\\w\\|\\s_\\)+\\)\\(\\s-\\|\n\\)+\\(generic\\|
port\\)\\s-+map\\>"
      1)
     ("Component"
      "^\\s-*\\(component\\)\\s-+\\(\\(\\w\\|\\s_\\)+\\)"
@@ -4193,8 +4302,10 @@ Usage:
                    with a comment in between.
         `--CR'     comments out code on that line.  Re-hitting CR comments
                    out following lines.
-        `C-c c'    comments out a region if not commented out,
-                   uncomments a region if already commented out.
+        `C-c C-c'  comments out a region if not commented out,
+                   uncomments a region if already commented out.  Option
+                   `comment-style' defines where the comment characters
+                   should be placed (beginning of line, indent, etc.).
 
       You are prompted for comments after object definitions (i.e. signals,
     variables, constants, ports) and after subprogram and process
@@ -4215,7 +4326,8 @@ Usage:
     `TAB' indents a line if at the beginning of the line.  The amount of
     indentation is specified by option `vhdl-basic-offset'.  `C-c C-i C-l'
     always indents the current line (is bound to `TAB' if option
-    `vhdl-intelligent-tab' is nil).
+    `vhdl-intelligent-tab' is nil).  If a region is active, `TAB' indents
+    the entire region.
 
       Indentation can be done for a group of lines (`C-c C-i C-g'), a region
     \(`M-C-\\') or the entire buffer (menu).  Argument and port lists are
@@ -4229,6 +4341,10 @@ Usage:
       Syntax-based indentation can be very slow in large files.  Option
     `vhdl-indent-syntax-based' allows to use faster but simpler indentation.
 
+      Option `vhdl-indent-comment-like-next-code-line' controls whether
+    comment lines are indented like the preceding or like the following code
+    line.
+
 
   ALIGNMENT:
     The alignment functions align operators, keywords, and inline comments
@@ -4357,12 +4473,12 @@ Usage:
 
 
   STRUCTURAL COMPOSITION:
-    Enables simple structural composition.  `C-c C-c C-n' creates a skeleton
+    Enables simple structural composition.  `C-c C-m 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,
+    \(`C-c C-m 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:
+    and ports (`C-c C-m 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
@@ -4383,25 +4499,25 @@ Usage:
 
       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
+    an entire directory or project (`C-c C-m 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.
+      Configuration declarations can automatically be generated either from
+    the menu (`C-c C-m 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.
 
@@ -4433,11 +4549,13 @@ Usage:
 
       The Makefile's default target \"all\" compiles the entire design, the
     target \"clean\" removes it and the target \"library\" creates the
-    library directory if not existent.  The Makefile also includes a target
-    for each primary library unit which allows selective compilation of this
-    unit, its secondary units and its subhierarchy (example: compilation of
-    a design specified by a configuration).  User specific parts can be
-    inserted into a Makefile with option `vhdl-makefile-generation-hook'.
+    library directory if not existent.  These target names can be customized
+    by option `vhdl-makefile-default-targets'.  The Makefile also includes a
+    target for each primary library unit which allows selective compilation
+    of this unit, its secondary units and its subhierarchy (example:
+    compilation of a design specified by a configuration).  User specific
+    parts can be inserted into a Makefile with option
+    `vhdl-makefile-generation-hook'.
 
     Limitations:
       - Only library units and dependencies within the current library are
@@ -4483,7 +4601,7 @@ Usage:
 
   VHDL STANDARDS:
     The VHDL standards to be used are specified in option `vhdl-standard'.
-    Available standards are: VHDL'87/'93, VHDL-AMS, and Math Packages.
+    Available standards are: VHDL'87/'93(02), VHDL-AMS, and Math Packages.
 
 
   KEYWORD CASE:
@@ -4559,6 +4677,9 @@ Usage:
         - Out parameters of procedures are considered to be read.
       Use option `vhdl-entity-file-name' to specify the entity file name
       \(used to obtain the port names).
+      Use option `vhdl-array-index-record-field-in-sensitivity-list' to
+      specify whether to include array indices and  record fields in
+      sensitivity lists.
 
 
   CODE FIXING:
@@ -4632,16 +4753,17 @@ releases.  You are kindly invited to participate in 
beta testing.  Subscribe
 to above mailing lists by sending an email to <reto@gnu.org>.
 
 VHDL Mode is officially distributed at
-URL `http://opensource.ethz.ch/emacs/vhdl-mode.html'
+http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html
 where the latest version can be found.
 
 
 Known problems:
 ---------------
 
-- Indentation bug in simultaneous if- and case-statements (VHDL-AMS).
 - XEmacs: Incorrect start-up when automatically opening speedbar.
 - XEmacs: Indentation in XEmacs 21.4 (and higher).
+- Indentation incorrect for new 'postponed' VHDL keyword.
+- Indentation incorrect for 'protected body' construct.
 
 
                                                 The VHDL Mode Authors
@@ -4764,7 +4886,7 @@ Key bindings:
 ;;; Keywords and standardized words
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defconst vhdl-93-keywords
+(defconst vhdl-02-keywords
   '(
     "abs" "access" "after" "alias" "all" "and" "architecture" "array"
     "assert" "attribute"
@@ -4779,7 +4901,7 @@ Key bindings:
     "map" "mod"
     "nand" "new" "next" "nor" "not" "null"
     "of" "on" "open" "or" "others" "out"
-    "package" "port" "postponed" "procedure" "process" "pure"
+    "package" "port" "postponed" "procedure" "process" "protected" "pure"
     "range" "record" "register" "reject" "rem" "report" "return"
     "rol" "ror"
     "select" "severity" "shared" "signal" "sla" "sll" "sra" "srl" "subtype"
@@ -4789,7 +4911,7 @@ Key bindings:
     "wait" "when" "while" "with"
     "xnor" "xor"
     )
-  "List of VHDL'93 keywords.")
+  "List of VHDL'02 keywords.")
 
 (defconst vhdl-ams-keywords
   '(
@@ -4822,7 +4944,7 @@ Key bindings:
     )
   "List of Verilog keywords as candidate for additional reserved words.")
 
-(defconst vhdl-93-types
+(defconst vhdl-02-types
   '(
     "boolean" "bit" "bit_vector" "character" "severity_level" "integer"
     "real" "time" "natural" "positive" "string" "line" "text" "side"
@@ -4830,25 +4952,72 @@ Key bindings:
     "std_logic" "std_logic_vector"
     "std_ulogic" "std_ulogic_vector"
     )
-  "List of VHDL'93 standardized types.")
+  "List of VHDL'02 standardized types.")
 
 (defconst vhdl-ams-types
+  ;; standards: IEEE Std 1076.1-2007, IEEE Std 1076.1.1-2004
   '(
+    ;; package `standard'
     "domain_type" "real_vector"
-    ;; from `nature_pkg' package
-    "voltage" "current" "electrical" "position" "velocity" "force"
-    "mechanical_vf" "mechanical_pf" "rotvel" "torque" "rotational"
-    "pressure" "flowrate" "fluid"
-  )
+    ;; package `energy_systems'
+    "energy" "power" "periodicity" "real_across" "real_through" "unspecified"
+    "unspecified_vector" "energy_vector" "power_vector" "periodicity_vector"
+    "real_across_vector" "real_through_vector"
+    ;; package `electrical_systems'
+    "voltage" "current" "charge" "resistance" "conductance" "capacitance"
+    "mmf" "electric_flux" "electric_flux_density" "electric_field_strength"
+    "magnetic_flux" "magnetic_flux_density" "magnetic_field_strength"
+    "inductance" "reluctance" "electrical" "electrical_vector" "magnetic"
+    "magnetic_vector" "voltage_vector" "current_vector" "mmf_vector"
+    "magnetic_flux_vector" "charge_vector" "resistance_vector"
+    "conductance_vector" "capacitance_vector" "electric_flux_vector"
+    "electric_flux_density_vector" "electric_field_strength_vector"
+    "magnetic_flux_density_vector" "magnetic_field_strength_vector"
+    "inductance_vector" "reluctance_vector" "ground"
+    ;; package `mechanical_systems'
+    "displacement" "force" "velocity" "acceleration" "mass" "stiffness"
+    "damping" "momentum" "angle" "torque" "angular_velocity"
+    "angular_acceleration" "moment_inertia" "angular_momentum"
+    "angular_stiffness" "angular_damping" "translational"
+    "translational_vector" "translational_velocity"
+    "translational_velocity_vector" "rotational" "rotational_vector"
+    "rotational_velocity" "rotational_velocity_vector" "displacement_vector"
+    "force_vector" "velocity_vector" "force_velocity_vector" "angle_vector"
+    "torque_vector" "angular_velocity_vector" "torque_velocity_vector"
+    "acceleration_vector" "mass_vector" "stiffness_vector" "damping_vector"
+    "momentum_vector" "angular_acceleration_vector" "moment_inertia_vector"
+    "angular_momentum_vector" "angular_stiffness_vector"
+    "angular_damping_vector" "anchor" "translational_v_ref"
+    "rotational_v_ref" "translational_v" "rotational_v"
+    ;; package `radiant_systems'
+    "illuminance" "luminous_flux" "luminous_intensity" "irradiance" "radiant"
+    "radiant_vector" "luminous_intensity_vector" "luminous_flux_vector"
+    "illuminance_vector" "irradiance_vector"
+    ;; package `thermal_systems'
+    "temperature" "heat_flow" "thermal_capacitance" "thermal_resistance"
+    "thermal_conductance" "thermal" "thermal_vector" "temperature_vector"
+    "heat_flow_vector" "thermal_capacitance_vector"
+    "thermal_resistance_vector" "thermal_conductance_vector"
+    ;; package `fluidic_systems'
+    "pressure" "vflow_rate" "mass_flow_rate" "volume" "density" "viscosity"
+    "fresistance" "fconductance" "fcapacitance" "inertance" "cfresistance"
+    "cfcapacitance" "cfinertance" "cfconductance" "fluidic" "fluidic_vector"
+    "compressible_fluidic" "compressible_fluidic_vector" "pressure_vector"
+    "vflow_rate_vector" "mass_flow_rate_vector" "volume_vector"
+    "density_vector" "viscosity_vector" "fresistance_vector"
+    "fconductance_vector" "fcapacitance_vector" "inertance_vector"
+    "cfresistance_vector" "cfconductance_vector" "cfcapacitance_vector"
+    "cfinertance_vector"
+    )
   "List of VHDL-AMS standardized types.")
 
 (defconst vhdl-math-types
   '(
-    "complex" "complex_polar"
+    "complex" "complex_polar" "positive_real" "principal_value" 
     )
   "List of Math Packages standardized types.")
 
-(defconst vhdl-93-attributes
+(defconst vhdl-02-attributes
   '(
     "base" "left" "right" "high" "low" "pos" "val" "succ"
     "pred" "leftof" "rightof" "range" "reverse_range"
@@ -4858,7 +5027,7 @@ Key bindings:
     "simple_name" "instance_name" "path_name"
     "foreign"
     )
-  "List of VHDL'93 standardized attributes.")
+  "List of VHDL'02 standardized attributes.")
 
 (defconst vhdl-ams-attributes
   '(
@@ -4869,7 +5038,7 @@ Key bindings:
     )
   "List of VHDL-AMS standardized attributes.")
 
-(defconst vhdl-93-enum-values
+(defconst vhdl-02-enum-values
   '(
     "true" "false"
     "note" "warning" "error" "failure"
@@ -4878,7 +5047,7 @@ Key bindings:
     "fs" "ps" "ns" "us" "ms" "sec" "min" "hr"
     "right" "left"
     )
-  "List of VHDL'93 standardized enumeration values.")
+  "List of VHDL'02 standardized enumeration values.")
 
 (defconst vhdl-ams-enum-values
   '(
@@ -4888,22 +5057,38 @@ Key bindings:
     )
   "List of VHDL-AMS standardized enumeration values.")
 
+(defconst vhdl-ams-constants
+  ;; standard: IEEE Std 1076.1.1-2004
+  '(
+    ;; package `fundamental_constants'
+    "phys_q" "phys_eps0" "phys_mu0" "phys_k" "phys_gravity" "phys_ctok"
+    "phys_c" "phys_h" "phys_h_over_2_pi" "yocto" "zepto" "atto" "femto"
+    "pico" "nano" "micro" "milli" "centi" "deci" "deka" "hecto" "kilo" "mega"
+    "giga" "tera" "peta" "exa" "zetta" "yotta" "deca"
+    ;; package `material_constants'
+    "phys_eps_si" "phys_eps_sio2" "phys_e_si" "phys_e_sio2" "phys_e_poly"
+    "phys_nu_si" "phys_nu_poly" "phys_rho_poly" "phys_rho_sio2"
+    "ambient_temperature" "ambient_pressure" "ambient_illuminance"    
+    )
+  "List of VHDL-AMS standardized constants.")
+
 (defconst vhdl-math-constants
+  ;; standard: IEEE Std 1076.2-1996
   '(
-    "math_e" "math_1_over_e"
-    "math_pi" "math_two_pi" "math_1_over_pi"
-    "math_half_pi" "math_q_pi" "math_3_half_pi"
-    "math_log_of_2" "math_log_of_10" "math_log2_of_e" "math_log10_of_e"
-    "math_sqrt2" "math_sqrt1_2" "math_sqrt_pi"
-    "math_deg_to_rad" "math_rad_to_deg"
-    "cbase_1" "cbase_j" "czero"
+    "math_1_over_e" "math_1_over_pi" "math_1_over_sqrt_2" "math_2_pi"
+    "math_3_pi_over_2" "math_cbase_1" "math_cbase_j" "math_czero"
+    "math_deg_to_rad" "math_e" "math_log10_of_e" "math_log2_of_e"
+    "math_log_of_10" "math_log_of_2" "math_pi" "math_pi_over_2"
+    "math_pi_over_3" "math_pi_over_4" "math_rad_to_deg" "math_sqrt_2"
+    "math_sqrt_pi"
     )
   "List of Math Packages standardized constants.")
 
-(defconst vhdl-93-functions
+(defconst vhdl-02-functions
   '(
     "now" "resolved" "rising_edge" "falling_edge"
-    "read" "readline" "write" "writeline" "endfile"
+    "read" "readline" "hread" "oread" "write" "writeline" "hwrite" "owrite"
+    "endfile"
     "resize" "is_X" "std_match"
     "shift_left" "shift_right" "rotate_left" "rotate_right"
     "to_unsigned" "to_signed" "to_integer"
@@ -4913,25 +5098,27 @@ Key bindings:
     "shl" "shr" "ext" "sxt"
     "deallocate"
     )
-  "List of VHDL'93 standardized functions.")
+  "List of VHDL'02 standardized functions.")
 
 (defconst vhdl-ams-functions
   '(
+    ;; package `standard'
     "frequency"
     )
   "List of VHDL-AMS standardized functions.")
 
 (defconst vhdl-math-functions
+  ;; standard: IEEE Std 1076.2-1996
   '(
-    "sign" "ceil" "floor" "round" "trunc" "fmax" "fmin" "uniform"
-    "sqrt" "cbrt" "exp" "log"
-    "sin" "cos" "tan" "arcsin" "arccos" "arctan"
-    "sinh" "cosh" "tanh" "arcsinh" "arccosh" "arctanh"
-    "cmplx" "complex_to_polar" "polar_to_complex" "arg" "conj"
+    "arccos" "arccosh" "arcsin" "arcsinh" "arctan" "arctanh" "arg"
+    "cbrt" "ceil" "cmplx" "complex_to_polar" "conj" "cos" "cosh" "exp"
+    "floor" "get_principal_value" "log" "log10" "log2" "polar_to_complex"
+    "realmax" "realmin" "round" "sign" "sin" "sinh" "sqrt"
+    "tan" "tanh" "trunc" "uniform"
     )
   "List of Math Packages standardized functions.")
 
-(defconst vhdl-93-packages
+(defconst vhdl-02-packages
   '(
     "std_logic_1164" "numeric_std" "numeric_bit"
     "standard" "textio"
@@ -4939,12 +5126,13 @@ Key bindings:
     "std_logic_misc" "std_logic_textio"
     "ieee" "std" "work"
     )
-  "List of VHDL'93 standardized packages and libraries.")
+  "List of VHDL'02 standardized packages and libraries.")
 
 (defconst vhdl-ams-packages
   '(
-    ;; from `nature_pkg' package
-    "nature_pkg"
+    "fundamental_constants" "material_constants" "energy_systems"
+    "electrical_systems" "mechanical_systems" "radiant_systems"
+    "thermal_systems" "fluidic_systems"
     )
   "List of VHDL-AMS standardized packages and libraries.")
 
@@ -4990,6 +5178,9 @@ Key bindings:
 (defvar vhdl-enum-values-regexp nil
   "Regexp for VHDL standardized enumeration values.")
 
+(defvar vhdl-constants-regexp nil
+  "Regexp for VHDL standardized constants.")
+
 (defvar vhdl-functions-regexp nil
   "Regexp for VHDL standardized functions.")
 
@@ -5002,29 +5193,50 @@ Key bindings:
 (defvar vhdl-directive-keywords-regexp nil
   "Regexp for compiler directive keywords.")
 
+(defun vhdl-upcase-list (condition list)
+  "Upcase all elements in LIST based on CONDITION."
+  (when condition
+    (let ((tmp-list list))
+      (while tmp-list
+	(setcar tmp-list (upcase (car tmp-list)))
+	(setq tmp-list (cdr tmp-list)))))
+  list)
+
 (defun vhdl-words-init ()
   "Initialize reserved words."
   (setq vhdl-keywords
-	(append vhdl-93-keywords
-		(when (vhdl-standard-p 'ams) vhdl-ams-keywords)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-keywords)
+	 (append vhdl-02-keywords
+		 (when (vhdl-standard-p 'ams) vhdl-ams-keywords))))
   (setq vhdl-types
-	(append vhdl-93-types
-		(when (vhdl-standard-p 'ams) vhdl-ams-types)
-		(when (vhdl-standard-p 'math) vhdl-math-types)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-types)
+	 (append vhdl-02-types
+		 (when (vhdl-standard-p 'ams) vhdl-ams-types)
+		 (when (vhdl-standard-p 'math) vhdl-math-types))))
   (setq vhdl-attributes
-	(append vhdl-93-attributes
-		(when (vhdl-standard-p 'ams) vhdl-ams-attributes)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-attributes)
+	 (append vhdl-02-attributes
+		 (when (vhdl-standard-p 'ams) vhdl-ams-attributes))))
   (setq vhdl-enum-values
-	(append vhdl-93-enum-values
-		(when (vhdl-standard-p 'ams) vhdl-ams-enum-values)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-enum-values)
+	 (append vhdl-02-enum-values
+		 (when (vhdl-standard-p 'ams) vhdl-ams-enum-values))))
   (setq vhdl-constants
-	(append (when (vhdl-standard-p 'math) vhdl-math-constants)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-constants)
+	 (append (when (vhdl-standard-p 'ams) vhdl-ams-constants)
+		 (when (vhdl-standard-p 'math) vhdl-math-constants)
+		 '(""))))
   (setq vhdl-functions
-	(append vhdl-93-functions
+	(append vhdl-02-functions
 		(when (vhdl-standard-p 'ams) vhdl-ams-functions)
 		(when (vhdl-standard-p 'math) vhdl-math-functions)))
   (setq vhdl-packages
-	(append vhdl-93-packages
+	(append vhdl-02-packages
 		(when (vhdl-standard-p 'ams) vhdl-ams-packages)
 		(when (vhdl-standard-p 'math) vhdl-math-packages)))
   (setq vhdl-reserved-words
@@ -5039,6 +5251,8 @@ Key bindings:
 	(concat "\\<\\(" (regexp-opt vhdl-attributes) "\\)\\>"))
   (setq vhdl-enum-values-regexp
 	(concat "\\<\\(" (regexp-opt vhdl-enum-values) "\\)\\>"))
+  (setq vhdl-constants-regexp
+	(concat "\\<\\(" (regexp-opt vhdl-constants) "\\)\\>"))
   (setq vhdl-functions-regexp
 	(concat "\\<\\(" (regexp-opt vhdl-functions) "\\)\\>"))
   (setq vhdl-packages-regexp
@@ -5090,7 +5304,7 @@ We cannot use just `word' syntax class since `_' cannot 
be in word
 class.  Putting underscore in word class breaks forward word movement
 behavior that users are familiar with.")
 
-(defconst vhdl-case-header-key "case[( \t\n][^;=>]+[) \t\n]is"
+(defconst vhdl-case-header-key "case[( \t\n\r\f][^;=>]+[) \t\n\r\f]is"
   "Regexp describing a case statement header key.")
 
 (defconst vhdl-label-key
@@ -5318,6 +5532,17 @@ the offset is simply returned."
   "Check if point is in a string."
   (eq (vhdl-in-literal) 'string))
 
+(defun vhdl-in-quote-p ()
+  "Check if point is in a quote ('x')."
+  (or (and (> (point) (point-min))
+	   (< (1+ (point)) (point-max))
+	   (= (char-before (point)) ?\')
+	   (= (char-after (1+ (point))) ?\'))
+      (and (> (1- (point)) (point-min))
+	   (< (point) (point-max))
+	   (= (char-before (1- (point))) ?\')
+	   (= (char-after (point)) ?\'))))
+
 (defun vhdl-in-literal ()
   "Determine if point is in a VHDL literal."
   (save-excursion
@@ -5328,6 +5553,12 @@ the offset is simply returned."
        ((vhdl-beginning-of-macro) 'pound)
        (t nil)))))
 
+(defun vhdl-in-extended-identifier-p ()
+  "Determine if point is inside extended identifier (delimited by '\')."
+  (save-match-data
+    (and (save-excursion (re-search-backward "\\\\" (vhdl-point 'bol) t))
+	 (save-excursion (re-search-forward "\\\\" (vhdl-point 'eol) t)))))
+
 (defun vhdl-forward-comment (&optional direction)
   "Skip all comments (including whitespace).  Skip backwards if DIRECTION is
 negative, skip forward otherwise."
@@ -5335,20 +5566,30 @@ negative, skip forward otherwise."
   (if (and direction (< direction 0))
       ;; skip backwards
       (progn
-	(skip-chars-backward " \t\n")
+	(skip-chars-backward " \t\n\r\f")
 	(while (re-search-backward "^[^\"-]*\\(\\(-?\"[^\"]*\"\\|-[^\"-]\\)
[^\"-]*\\)*\\(--\\)" (vhdl-point 'bol) t)
 	  (goto-char (match-beginning 3))
-	  (skip-chars-backward " \t\n")))
+	  (skip-chars-backward " \t\n\r\f")))
     ;; skip forwards
-    (skip-chars-forward " \t\n")
+    (skip-chars-forward " \t\n\r\f")
     (while (looking-at "--.*")
       (goto-char (match-end 0))
-      (skip-chars-forward " \t\n"))))
+      (skip-chars-forward " \t\n\r\f"))))
 
 ;; XEmacs hack: work around buggy `forward-comment' in XEmacs 21.4+
 (unless (and (featurep 'xemacs) (string< "21.2" emacs-version))
   (defalias 'vhdl-forward-comment 'forward-comment))
 
+(defun vhdl-back-to-indentation ()
+  "Move point to the first non-whitespace character on this line."
+  (interactive)
+  (beginning-of-line 1)
+  (skip-syntax-forward " " (vhdl-point 'eol)))
+
+;; XEmacs hack: work around old `back-to-indentation' in XEmacs
+(when (featurep 'xemacs)
+  (defalias 'back-to-indentation 'vhdl-back-to-indentation))
+
 ;; This is the best we can do in Win-Emacs.
 (defun vhdl-win-il (&optional lim)
   "Determine if point is in a VHDL literal."
@@ -5513,7 +5754,7 @@ that point, else nil."
   (and
    (save-excursion
      (forward-sexp)
-     (skip-chars-forward " \t\n")
+     (skip-chars-forward " \t\n\r\f")
      (not (looking-at "is\\b[^_]")))
    (save-excursion
      (backward-sexp)
@@ -5553,12 +5794,12 @@ corresponding \"begin\" keyword, else return nil."
 	   "is"))))
 
 (defconst vhdl-begin-fwd-re
-  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|
process\\|procedural\\|units\\|record\\|for\\)\\b\\([^_]\\|\\'\\)"
+  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|
process\\|procedural\\(\\s-+body\\)?\\|units\\|use\\|record\\|
protected\\(\\s-+body\\)?\\|for\\)\\b\\([^_]\\|\\'\\)"
   "A regular expression for searching forward that matches all known
 \"begin\" keywords.")
 
 (defconst vhdl-begin-bwd-re
-  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|
process\\|procedural\\|units\\|record\\|for\\)\\b[^_]"
+  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|
process\\|procedural\\(\\s-+body\\)?\\|units\\|use\\|record\\|
protected\\(\\s-+body\\)?\\|for\\)\\b[^_]"
   "A regular expression for searching backward that matches all known
 \"begin\" keywords.")
 
@@ -5591,21 +5832,21 @@ keyword."
 	   (and (/= (following-char) ?\;)
 		(not (looking-at "is\\|begin\\|process\\|procedural\\|block")))))
     t)
-   ;; "begin", "then":
-   ((looking-at "be\\|t")
+   ;; "begin", "then", "use":
+   ((looking-at "be\\|t\\|use")
     t)
    ;; "else":
    ((and (looking-at "e")
 	 ;; make sure that the "else" isn't inside a
 	 ;; conditional signal assignment.
 	 (save-excursion
-	   (re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
+	   (vhdl-re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
 	   (or (eq (following-char) ?\;)
 	       (eq (point) lim))))
     t)
    ;; "block", "generate", "loop", "process", "procedural",
-   ;; "units", "record":
-   ((and (looking-at "bl\\|[glpur]")
+   ;; "units", "record", "protected body":
+   ((and (looking-at "block\\|generate\\|loop\\|process\\|procedural\\|
protected\\(\\s-+body\\)?\\|units\\|record")
 	 (save-excursion
 	   (backward-sexp)
 	   (not (looking-at "end\\s-+\\w"))))
@@ -5633,7 +5874,7 @@ keyword."
   (cond
    ((looking-at "is\\|block\\|generate\\|process\\|procedural")
     "begin")
-   ((looking-at "then")
+   ((looking-at "then\\|use")
     "<else>")
    (t
     "end")))
@@ -5648,6 +5889,9 @@ Assumes that the caller will make sure that we are not 
in the middle
 of an identifier that just happens to contain a \"begin\" keyword."
   (save-excursion
     (and (looking-at vhdl-begin-fwd-re)
+	 (or (not (looking-at "\\<use\\>"))
+	     (save-excursion (back-to-indentation)
+			     (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|
if\\)\\>")))
 	 (/= (preceding-char) ?_)
 	 (not (vhdl-in-literal))
 	 (vhdl-begin-p lim)
@@ -5670,8 +5914,8 @@ of an identifier that just happens to contain a \"begin\" 
keyword."
 			      (vhdl-beginning-of-statement-1 lim)
 			      (vhdl-backward-skip-label lim)
 			      (vhdl-first-word (point)))))))
-	  ;; "component", "units", "record":
-	  ((looking-at "[cur]")
+	  ;; "component", "units", "record", "protected body":
+	  ((looking-at "component\\|units\\|protected\\(\\s-+body\\)?\\|record")
 	   ;; The first end found will close the block
 	   (vector "end" nil))
 	  ;; "block", "process", "procedural":
@@ -5683,8 +5927,8 @@ of an identifier that just happens to contain a \"begin\" 
keyword."
 			 (vhdl-backward-skip-label lim)
 			 (vhdl-first-word (point))))))
 	  ;; "then":
-	  ((looking-at "t")
-	   (vector "elsif\\|else\\|end\\s-+if"
+	  ((looking-at "t\\|use")
+	   (vector "elsif\\|else\\|end\\s-+\\(if\\|use\\)"
 		   (and (vhdl-last-word (point))
 			(or (vhdl-first-word (point))
 			    (save-excursion
@@ -5730,25 +5974,25 @@ of an identifier that just happens to contain an 
\"end\" keyword."
 	       (vhdl-end-p lim))
 	  (if (looking-at "el")
 	      ;; "else", "elsif":
-	      (vector "if\\|elsif" (vhdl-first-word (point)) "then" nil)
+	      (vector "if\\|elsif" (vhdl-first-word (point)) "then\\|use" nil)
 	    ;; "end ...":
 	    (setq pos (point))
 	    (forward-sexp)
-	    (skip-chars-forward " \t\n")
+	    (skip-chars-forward " \t\n\r\f")
 	    (cond
 	     ;; "end if":
 	     ((looking-at "if\\b[^_]")
 	      (vector "else\\|elsif\\|if"
 		      (vhdl-first-word pos)
-		      "else\\|then" nil))
+		      "else\\|then\\|use" nil))
 	     ;; "end component":
 	     ((looking-at "component\\b[^_]")
 	      (vector (buffer-substring (match-beginning 1)
 					(match-end 1))
 		      (vhdl-first-word pos)
 		      nil nil))
-	     ;; "end units", "end record":
-	     ((looking-at "\\(units\\|record\\)\\b[^_]")
+	     ;; "end units", "end record", "end protected":
+	     ((looking-at "\\(units\\|record\\|protected\\(\\s-+body\\)?\\)\\b[^_]")
 	      (vector (buffer-substring (match-beginning 1)
 					(match-end 1))
 		      (vhdl-first-word pos)
@@ -5805,38 +6049,38 @@ of an identifier that just happens to contain an 
\"end\" keyword."
     (cond ((looking-at "block\\|process\\|procedural")
 	   (if (save-excursion
 		 (forward-sexp)
-		 (skip-chars-forward " \t\n")
+		 (skip-chars-forward " \t\n\r\f")
 		 (= (following-char) ?\())
 	       (forward-sexp 2)
 	     (forward-sexp))
-	   (when (looking-at "[ \t\n]*is")
+	   (when (looking-at "[ \t\n\r\f]*is")
 	     (goto-char (match-end 0)))
 	   (point))
 	  ((looking-at "component")
 	   (forward-sexp 2)
-	   (when (looking-at "[ \t\n]*is")
+	   (when (looking-at "[ \t\n\r\f]*is")
 	     (goto-char (match-end 0)))
 	   (point))
 	  ((looking-at "for")
 	   (forward-sexp 2)
-	   (skip-chars-forward " \t\n")
+	   (skip-chars-forward " \t\n\r\f")
 	   (while (looking-at "[,:(]")
 	     (forward-sexp)
-	     (skip-chars-forward " \t\n"))
+	     (skip-chars-forward " \t\n\r\f"))
 	   (point))
 	  (t nil)
 	  )))
 
 (defconst vhdl-trailer-re
-  "\\b\\(is\\|then\\|generate\\|loop\\|record\\)\\b[^_]")
+  "\\b\\(is\\|then\\|generate\\|loop\\|record\\|protected\\(\\s-+body\\)?\\|
use\\)\\b[^_]")
 
 (defconst vhdl-statement-fwd-re
-  "\\b\\(if\\|for\\|while\\)\\b\\([^_]\\|\\'\\)"
+  "\\b\\(if\\|for\\|while\\|loop\\)\\b\\([^_]\\|\\'\\)"
   "A regular expression for searching forward that matches all known
 \"statement\" keywords.")
 
 (defconst vhdl-statement-bwd-re
-  "\\b\\(if\\|for\\|while\\)\\b[^_]"
+  "\\b\\(if\\|for\\|while\\|loop\\)\\b[^_]"
   "A regular expression for searching backward that matches all known
 \"statement\" keywords.")
 
@@ -5852,7 +6096,7 @@ in the middle of an identifier that just happens to 
contain a
 	 ;; Make sure it's the start of a parameter specification.
 	 (save-excursion
 	   (forward-sexp 2)
-	   (skip-chars-forward " \t\n")
+	   (skip-chars-forward " \t\n\r\f")
 	   (looking-at "in\\b[^_]"))
 	 ;; Make sure it's not an "end for".
 	 (save-excursion
@@ -5871,7 +6115,7 @@ in the middle of an identifier that just happens to 
contain a
     t)
    ))
 
-(defconst vhdl-case-alternative-re "when[( \t\n][^;=>]+=>"
+(defconst vhdl-case-alternative-re "when[( \t\n\r\f][^;=>]+=>"
   "Regexp describing a case statement alternative key.")
 
 (defun vhdl-case-alternative-p (&optional lim)
@@ -5908,6 +6152,9 @@ contain a \"when\" keyword."
 	(cond
 	 ;; "begin" keyword:
 	 ((and (looking-at vhdl-begin-fwd-re)
+	       (or (not (looking-at "\\<use\\>"))
+		   (save-excursion (back-to-indentation)
+				   (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|
if\\)\\>")))
 	       (/= (preceding-char) ?_)
 	       (vhdl-begin-p lim))
 	  (setq foundp 'begin))
@@ -5931,7 +6178,7 @@ With COUNT, do it that many times."
     (save-excursion
       (while (> count 0)
 	;; skip whitespace
-	(skip-chars-forward " \t\n")
+	(skip-chars-forward " \t\n\r\f")
 	;; Check for an unbalanced "end" keyword
 	(if (and (looking-at vhdl-end-fwd-re)
 		 (/= (preceding-char) ?_)
@@ -6007,6 +6254,10 @@ searches."
 	    nil
 	  (backward-sexp)
 	  (if (and (looking-at vhdl-begin-fwd-re)
+		   (or (not (looking-at "\\<use\\>"))
+		       (save-excursion
+			 (back-to-indentation)
+			 (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 		   (/= (preceding-char) ?_)
 		   (not (vhdl-in-literal))
 		   (vhdl-begin-p lim))
@@ -6278,7 +6529,7 @@ search, and an argument indicating an interactive call."
   (re-search-forward vhdl-e-o-s-re))
 
 (defconst vhdl-b-o-s-re
-  (concat ";\\|\(\\|\)\\|\\bwhen\\b[^_]\\|"
+  (concat ";[^_]\\|\([^_]\\|\)[^_]\\|\\bwhen\\b[^_]\\|"
 	  vhdl-begin-bwd-re "\\|" vhdl-statement-bwd-re))
 
 (defun vhdl-beginning-of-statement-1 (&optional lim)
@@ -6299,7 +6550,7 @@ statement if already at the beginning of one."
     (while (and (not donep)
 		(not (bobp))
 		;; look backwards for a statement boundary
-		(re-search-backward vhdl-b-o-s-re lim 'move))
+		(progn (forward-char) (re-search-backward vhdl-b-o-s-re lim 'move)))
       (if (or (= (preceding-char) ?_)
 	      (vhdl-in-literal))
 	  (backward-char)
@@ -6319,13 +6570,17 @@ statement if already at the beginning of one."
 		     (vhdl-forward-syntactic-ws here)
 		     (setq donep t))))
 	 ;; If we are looking at a semicolon, then stop
-	 ((eq (following-char) ?\;)
+	 ((and (eq (following-char) ?\;) (not (vhdl-in-quote-p)))
 	  (progn
 	    (forward-char)
 	    (vhdl-forward-syntactic-ws here)
 	    (setq donep t)))
 	 ;; If we are looking at a "begin", then stop
 	 ((and (looking-at vhdl-begin-fwd-re)
+	       (or (not (looking-at "\\<use\\>"))
+		   (save-excursion
+		     (back-to-indentation)
+		     (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 	       (/= (preceding-char) ?_)
 	       (vhdl-begin-p nil))
 	  ;; If it's a leader "begin", then find the
@@ -6576,6 +6831,10 @@ is not moved."
 	(setq begin-after-ip (and
 			      (not literal)
 			      (looking-at vhdl-begin-fwd-re)
+			      (or (not (looking-at "\\<use\\>"))
+				  (save-excursion
+				    (back-to-indentation)
+				    (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|
if\\)\\>")))
 			      (vhdl-begin-p)))
 	(setq end-after-ip (and
 			    (not literal)
@@ -6624,7 +6883,8 @@ is not moved."
 	   ((progn
 	      (vhdl-backward-syntactic-ws lim)
 	      (or (bobp)
-		  (= (preceding-char) ?\;)))
+		  (and (= (preceding-char) ?\;)
+		       (not (vhdl-in-quote-p)))))
 	    (vhdl-add-syntax 'statement placeholder))
 	   ;; CASE 2D: we are looking at a top-level statement-cont
 	   (t
@@ -6662,6 +6922,10 @@ is not moved."
 		 (save-excursion
 		   (vhdl-beginning-of-statement-1 containing-sexp)
 		   (skip-chars-backward " \t(")
+		   (while (and (= (preceding-char) ?\;)
+			       (not (vhdl-in-quote-p)))
+		     (vhdl-beginning-of-statement-1 containing-sexp)
+		     (skip-chars-backward " \t("))
 		   (<= (point) containing-sexp)))
 	    (goto-char containing-sexp)
 	    (vhdl-add-syntax 'arglist-cont-nonempty (vhdl-point 'boi)))
@@ -6730,7 +6994,7 @@ is not moved."
 		     (save-excursion
 		       (goto-char new)
 		       (eq new (progn (back-to-indentation) (point)))))
-		(setq placeholder new)))
+		(setq placeholder new)))	
 	  (vhdl-add-syntax 'statement-cont placeholder)
 	  (if begin-after-ip
 	      (vhdl-add-syntax 'block-open)))
@@ -6891,7 +7155,7 @@ only-lines."
     (let* ((relpos (cdr langelem))
 	   (assignp (save-excursion
 		     (goto-char (vhdl-point 'boi))
-		     (and (re-search-forward "\\(<\\|:\\)="
+		     (and (re-search-forward "\\(<\\|:\\|=\\)="
 					     (vhdl-point 'eol) t)
 			  (- (point) (vhdl-point 'boi)))))
 	   (curcol (progn
@@ -6900,7 +7164,7 @@ only-lines."
 	   foundp)
       (while (and (not foundp)
 		  (< (point) (vhdl-point 'eol)))
-	(re-search-forward "\\(<\\|:\\)=\\|(" (vhdl-point 'eol) 'move)
+	(re-search-forward "\\(<\\|:\\|=\\)=\\|(" (vhdl-point 'eol) 'move)
 	(if (vhdl-in-literal)
 	    (forward-char)
 	  (if (= (preceding-char) ?\()
@@ -7001,7 +7265,8 @@ character is a space."
   (interactive)
   (if (and (= (preceding-char) ? ) (vhdl-in-comment-p))
       (indent-new-comment-line)
-    (when (and (>= (preceding-char) ?a) (<= (preceding-char) ?z))
+    (when (and (>= (preceding-char) ?a) (<= (preceding-char) ?z)
+	       (not (vhdl-in-comment-p)))
       (vhdl-fix-case-word -1))
     (newline-and-indent)))
 
@@ -7011,6 +7276,7 @@ indentation change."
   (interactive)
   (let* ((syntax (and vhdl-indent-syntax-based (vhdl-get-syntactic-context)))
 	 (pos (- (point-max) (point)))
+	 (is-comment nil)
 	 (indent
 	  (if syntax
 	      ;; indent syntax-based
@@ -7018,6 +7284,15 @@ indentation change."
 		       (>= (vhdl-get-offset (car syntax)) comment-column))
 		  ;; special case: comments at or right of comment-column
 		  (vhdl-get-offset (car syntax))
+		;; align comments like following code line
+		(when vhdl-indent-comment-like-next-code-line
+		  (save-excursion
+		    (while (eq (caar syntax) 'comment)
+		      (setq is-comment t)
+		      (beginning-of-line 2)
+		      (setq syntax (vhdl-get-syntactic-context)))))
+		(when is-comment
+		  (setq syntax (cons (cons 'comment nil) syntax)))
 		(apply '+ (mapcar 'vhdl-get-offset syntax)))
 	    ;; indent like previous nonblank line
 	    (save-excursion (beginning-of-line)
@@ -7026,10 +7301,13 @@ indentation change."
 	 (shift-amt  (- indent (current-indentation))))
     (and vhdl-echo-syntactic-information-p
 	 (message "syntax: %s, indent= %d" syntax indent))
-    (unless (zerop shift-amt)
-      (delete-region (vhdl-point 'bol) (vhdl-point 'boi))
-      (beginning-of-line)
-      (indent-to indent))
+    (let ((has-formfeed
+	   (save-excursion (beginning-of-line) (looking-at "\\s-*\f"))))
+      (when (or (not (zerop shift-amt)) has-formfeed)
+	(delete-region (vhdl-point 'bol) (vhdl-point 'boi))
+	(beginning-of-line)
+	(when has-formfeed (insert "\f"))
+	(indent-to indent)))
     (if (< (point) (vhdl-point 'boi))
 	(back-to-indentation)
       ;; If initial point was within line's indentation, position after
@@ -7040,7 +7318,7 @@ indentation change."
     (vhdl-update-progress-info "Indenting" (vhdl-current-line))
     shift-amt))
 
-(defun vhdl-indent-region (beg end column)
+(defun vhdl-indent-region (beg end &optional column)
   "Indent region as VHDL code.
 Adds progress reporting to `indent-region'."
   (interactive "r\nP")
@@ -7055,7 +7333,7 @@ Adds progress reporting to `indent-region'."
   "Indent whole buffer as VHDL code.
 Calls `indent-region' for whole buffer and adds progress reporting."
   (interactive)
-  (vhdl-indent-region (point-min) (point-max) nil))
+  (vhdl-indent-region (point-min) (point-max)))
 
 (defun vhdl-indent-group ()
   "Indent group of lines between empty lines."
@@ -7068,7 +7346,7 @@ Calls `indent-region' for whole buffer and adds progress 
reporting."
 	       (if (re-search-forward vhdl-align-group-separate nil t)
 		   (point-marker)
 		 (point-max-marker)))))
-    (vhdl-indent-region beg end nil)))
+    (vhdl-indent-region beg end)))
 
 (defun vhdl-indent-sexp (&optional endpos)
   "Indent each line of the list starting just after point.
@@ -7131,21 +7409,23 @@ ENDPOS is encountered."
 (defconst vhdl-align-alist
   '(
     ;; after some keywords
-    (vhdl-mode "^\\s-*\\(constant\\|quantity\\|signal\\|subtype\\|terminal\\|
type\\|variable\\)[ \t]"
-	       "^\\s-*\\(constant\\|quantity\\|signal\\|subtype\\|terminal\\|
type\\|variable\\)\\([ \t]+\\)" 2)
+    (vhdl-mode "^\\s-*\\(across\\|constant\\|quantity\\|signal\\|subtype\\|
terminal\\|through\\|type\\|variable\\)[ \t]"
+	       "^\\s-*\\(across\\|constant\\|quantity\\|signal\\|subtype\\|
terminal\\|through\\|type\\|variable\\)\\([ \t]+\\)" 2)
     ;; before ':'
     (vhdl-mode ":[^=]" "\\([ \t]*\\):[^=]")
     ;; after direction specifications
     (vhdl-mode ":[ \t]*\\(in\\|out\\|inout\\|buffer\\|\\)\\>"
 	       ":[ \t]*\\(in\\|out\\|inout\\|buffer\\|\\)\\([ \t]+\\)" 2)
     ;; before "==", ":=", "=>", and "<="
-    (vhdl-mode "[<:=]=" "\\([ \t]*\\)[<:=]=" 1) ; since "<= ... =>" can occur
+    (vhdl-mode "[<:=]=" "\\([ \t]*\\)\\??[<:=]=" 1) ; since "<= ... =>" can 
occur
     (vhdl-mode "=>" "\\([ \t]*\\)=>" 1)
-    (vhdl-mode "[<:=]=" "\\([ \t]*\\)[<:=]=" 1) ; since "=> ... <=" can occur
+    (vhdl-mode "[<:=]=" "\\([ \t]*\\)\\??[<:=]=" 1) ; since "=> ... <=" can 
occur
     ;; before some keywords
     (vhdl-mode "[ \t]after\\>" "[^ \t]\\([ \t]+\\)after\\>" 1)
     (vhdl-mode "[ \t]when\\>" "[^ \t]\\([ \t]+\\)when\\>" 1)
     (vhdl-mode "[ \t]else\\>" "[^ \t]\\([ \t]+\\)else\\>" 1)
+    (vhdl-mode "[ \t]across\\>" "[^ \t]\\([ \t]+\\)across\\>" 1)
+    (vhdl-mode "[ \t]through\\>" "[^ \t]\\([ \t]+\\)through\\>" 1)
     ;; before "=>" since "when/else ... =>" can occur
     (vhdl-mode "=>" "\\([ \t]*\\)=>" 1)
     )
@@ -7195,7 +7475,7 @@ parentheses."
 	(forward-list)
 	(setq end (point))
 	(goto-char (1+ beg))
-	(skip-chars-forward " \t\n")
+	(skip-chars-forward " \t\n\r\f")
 	(setq beg (point))))
     ;; run FUNCTION
     (if beg
@@ -7280,8 +7560,14 @@ the token in MATCH."
 	    bol (setq begin (progn (beginning-of-line) (point))))
       (while (< bol end)
 	(save-excursion
-	  (when (and (re-search-forward match eol t)
-		     (not (vhdl-in-literal)))
+	  (when (and (vhdl-re-search-forward match eol t)
+		     (save-excursion
+		       (goto-char (match-beginning 0))
+		       (forward-char)
+		       (and (not (vhdl-in-literal))
+			    (not (vhdl-in-quote-p))
+			    (not (vhdl-in-extended-identifier-p))))
+		     (not (looking-at "\\s-*$")))
 	    (setq distance (- (match-beginning substr) bol))
 	    (when (> distance max)
 	      (setq max distance))))
@@ -7295,8 +7581,16 @@ the token in MATCH."
       (goto-char (setq bol begin))
       (setq eol (point-at-eol))
       (while (> lines 0)
-  	(when (and (re-search-forward match eol t)
-		   (not (vhdl-in-literal)))
+  	(when (and (vhdl-re-search-forward match eol t)
+		   (save-excursion
+		     (goto-char (match-beginning 0))
+		     (forward-char)
+		     (and (not (vhdl-in-literal))
+			  (not (vhdl-in-quote-p))
+			  (not (vhdl-in-extended-identifier-p))))
+		   (not (looking-at "\\s-*$"))
+		   (> (match-beginning 0)  ; not if at boi
+		      (save-excursion (back-to-indentation) (point))))
 	  (setq width (- (match-end substr) (match-beginning substr)))
 	  (setq distance (- (match-beginning substr) bol))
 	  (goto-char (match-beginning substr))
@@ -7449,7 +7743,7 @@ the token in MATCH."
        ;; search for comment start positions and lengths
        (while (< (point) end)
 	 (when (and (not (looking-at "^\\s-*\\(begin\\|end\\)\\>"))
-		    (looking-at "^\\(.*[^ \t\n-]+\\)\\s-*\\(--.*\\)$")
+		    (looking-at "^\\(.*[^ \t\n\r\f-]+\\)\\s-*\\(--.*\\)$")
 		    (not (save-excursion (goto-char (match-beginning 2))
 					 (vhdl-in-literal))))
 	   (setq start (+ (- (match-end 1) (match-beginning 1)) spacing))
@@ -7474,7 +7768,7 @@ the token in MATCH."
        (while (< (point) end)
 	 (setq cur-start nil)
 	 (when (and (not (looking-at "^\\s-*\\(begin\\|end\\)\\>"))
-		    (or (and (looking-at "^\\(.*[^ \t\n-]+\\)\\(\\s-*\\)\\(--.*\\)$")
+		    (or (and (looking-at "^\\(.*[^ \t\n\r\f-]+\\)\\(\\s-*\\)\\(--.*\\)$")
 			     (not (save-excursion
 				    (goto-char (match-beginning 3))
 				    (vhdl-in-literal))))
@@ -7582,32 +7876,35 @@ end of line, do nothing in comments and strings."
     (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)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\|
\\\\[^\\\n]*[\\\n]\\)\\|\\(\\s-*\\([,;]\\)\\)" end t)
       (if (match-string 1)
 	  (goto-char (match-end 1))
-	(replace-match "\\3 " nil nil nil 3)))
+	(replace-match "\\3 " nil nil nil 2)))
     ;; have no space after `('
     (goto-char beg)
-    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\)\\|
\\((\\)\\s-+" end t)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\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)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\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))
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\|
\\\\[^\\\n]*[\\\n]\\)\\|\\(\\([^/:<>=]\\)\\(:\\|\\??=\\|\\??<<\\|\\??>>\\|
\\??<\\|\\??>\\|:=\\|\\??<=\\|\\??>=\\|=>\\|\\??/=\\|\\?\\?\\)\\([^=>]\\|
$\\)\\)" end t)
+      (if (or (match-string 1)
+	      (<= (match-beginning 0)  ; not if at boi
+		 (save-excursion (back-to-indentation) (point))))
+	  (goto-char (match-end 0))
 	(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))
+	       (and (looking-at "--.*") (re-search-forward "--.*" end t))
 	       (and (looking-at "\"") (re-search-forward "\"[^\"\n]*[\"\n]" end t))
 	       (and (looking-at "\\s-+$") (re-search-forward "\\s-+$" end t)
 		    (progn (replace-match "" nil nil) t))
@@ -7618,6 +7915,7 @@ end of line, do nothing in comments and strings."
 		    (progn (replace-match "  " nil nil) t))
 	       (and (looking-at "\\s-+") (re-search-forward "\\s-+" end t)
 		    (progn (replace-match " " nil nil) t))
+	       (and (looking-at "-") (re-search-forward "-" end t))
 ;	       (re-search-forward "[^ \t-]+" end t))))
 	       (re-search-forward "[^ \t\"-]+" end t))))
   (unless no-message (message "Fixing up whitespace...done")))
@@ -7639,7 +7937,7 @@ case fixing to a region.  Calls functions `vhdl-indent-
buffer',
 `vhdl-fix-case-buffer'."
   (interactive "r")
   (setq end (save-excursion (goto-char end) (point-marker)))
-  (vhdl-indent-region beg end nil)
+  (vhdl-indent-region beg end)
   (let ((vhdl-align-groups t))
     (vhdl-align-region beg end))
   (vhdl-fix-case-region beg end))
@@ -7720,7 +8018,7 @@ buffer."
     (vhdl-prepare-search-2
      (end-of-line)
      ;; look whether in process
-     (if (not (and (re-search-backward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?
\\(process\\|end\\s-+process\\)\\>" nil t)
+     (if (not (and (re-search-backward "^\\s-*\\(\\w+[ \t\n\r\f]*:[ 
\t\n\r\f]*\\)?\\(process\\|end\\s-+process\\)\\>" nil t)
 		   (equal (upcase (match-string 2)) "PROCESS")
 		   (save-excursion (re-search-forward "^\\s-*end\\s-+process\\>" nil 
t))))
 	 (error "ERROR:  Not within a process")
@@ -7735,7 +8033,7 @@ buffer."
     (vhdl-prepare-search-2
      (goto-char (point-min))
      (message "Updating sensitivity lists...")
-     (while (re-search-forward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?process\\>" 
nil t)
+     (while (re-search-forward "^\\s-*\\(\\w+[ \t\n\r\f]*:[ 
\t\n\r\f]*\\)?process\\>" nil t)
        (goto-char (match-beginning 0))
        (condition-case nil (vhdl-update-sensitivity-list) (error "")))
      (message "Updating sensitivity lists...done"))))
@@ -7744,9 +8042,13 @@ buffer."
   "Update sensitivity list."
     (let ((proc-beg (point))
 	  (proc-end (re-search-forward "^\\s-*end\\s-+process\\>" nil t))
-	  (proc-mid (re-search-backward "^\\s-*begin\\>" nil t))
+	  (proc-mid (vhdl-re-search-backward
+		     "\\(\\(\\<begin\\>\\)\\|^\\s-*process\\>\\)" nil t))
 	  seq-region-list)
       (cond
+       ;; error if 'begin' keyword missing
+       ((not (match-string 2))
+	(error "ERROR:  No 'begin' keyword found"))
        ;; search for wait statement (no sensitivity list allowed)
        ((progn (goto-char proc-mid)
 	       (vhdl-re-search-forward "\\<wait\\>" proc-end t))
@@ -7780,19 +8082,19 @@ buffer."
 		;; case expression
 		((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)
+		;; parameter list of procedure call, array index
+		((and (re-search-forward "^\\s-*\\(\\w\\|\\.\\)+[ \t\n\r\f]*(" proc-end t)
 		      (1- (point)))
 		 (progn (backward-char) (forward-sexp)
 			(while (looking-at "(") (forward-sexp)) (point)))))
-	     name read-list sens-list signal-list
+	     name field read-list sens-list signal-list
 	     sens-beg sens-end beg end margin)
 	  ;; scan for signals in old sensitivity list
 	  (goto-char proc-beg)
 	  (re-search-forward "\\<process\\>" proc-mid t)
-	  (if (not (looking-at "[ \t\n]*("))
+	  (if (not (looking-at "[ \t\n\r\f]*("))
 	      (setq sens-beg (point))
-	    (setq sens-beg (re-search-forward "\\([ \t\n]*\\)([ \t\n]*" nil t))
+	    (setq sens-beg (re-search-forward "\\([ \t\n\r\f]*\\)([ \t\n\r\f]*" nil 
t))
 	    (goto-char (match-end 1))
 	    (forward-sexp)
 	    (setq sens-end (1- (point)))
@@ -7825,15 +8127,17 @@ buffer."
 					     (< (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)
+		(while (vhdl-re-search-forward "[^'\".]\\<\\([a-zA-Z]\\w*\\)\\(\\(\\.
\\w+\\|[ \t\n\r\f]*([^)]*)\\)*\\)[ \t\n\r\f]*\\('\\(\\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))
+		  (when vhdl-array-index-record-field-in-sensitivity-list
+		    (setq field (match-string 2)))
+		  (when (and (not (match-string 6)) ; not when formal parameter
+			     (not (and (match-string 5) ; not event attribute
+				       (not (member (downcase (match-string 5))
 						    '("event" "last_event" "transaction")))))
 			     (member (downcase name) signal-list))
-		    (unless (member-ignore-case name read-list)
-		      (setq read-list (cons name read-list))))
+		    (unless (member-ignore-case (concat name field) read-list)
+		      (setq read-list (cons (concat name field) read-list))))
 		  (goto-char (match-end 1)))))
 	    (setq scan-regions-list (cdr scan-regions-list)))
 	  ;; update sensitivity list
@@ -7879,17 +8183,17 @@ buffer."
 	 (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]*("
+	   (when (setq beg (vhdl-re-search-forward
+			    "\\<port[ \t\n\r\f]*("
 			    (save-excursion
 			      (re-search-forward "^end\\>" nil t)) t))
 	     (setq end (save-excursion
 			 (backward-char) (forward-sexp) (point)))
 	     (vhdl-forward-syntactic-ws)
 	     (while (< (point) end)
-	       (when (looking-at "signal[ \t\n]+")
+	       (when (looking-at "signal[ \t\n\r\f]+")
 		 (goto-char (match-end 0)))
-	       (while (looking-at "\\(\\w+\\)[ \t\n,]+")
+	       (while (looking-at "\\(\\w+\\)[ \t\n\r\f,]+")
 		 (setq signal-list
 		       (cons (downcase (match-string 1)) signal-list))
 		 (goto-char (match-end 0))
@@ -7908,12 +8212,12 @@ buffer."
 	   (when (= 0 (nth 0 (parse-partial-sexp beg (point))))
 	     (if (match-string 2)
 		 ;; scan signal name
-		 (while (looking-at "[ \t\n,]+\\(\\w+\\)")
+		 (while (looking-at "[ \t\n\r\f,]+\\(\\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+\\)")
+	       (when (and (looking-at "[ \t\n\r\f]+\\(\\w+\\)[^;]*\\<is[ 
\t\n\r\f]+\\(\\w+\\)")
 			  (member (downcase (match-string 2)) signal-list))
 		 (setq signal-list
 		       (cons (downcase (match-string 1)) signal-list))
@@ -7950,6 +8254,18 @@ buffer."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Generic/port clause fixing
 
+(defun vhdl-fix-clause-buffer ()
+  "Fix all generic/port clauses in current buffer."
+  (interactive)
+  (save-excursion
+    (vhdl-prepare-search-2
+     (goto-char (point-min))
+     (message "Fixing generic/port clauses...")
+     (while (re-search-forward "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(" nil 
t)
+       (goto-char (match-end 0))
+       (condition-case nil (vhdl-fix-clause) (error "")))
+     (message "Fixing generic/port clauses...done"))))
+
 (defun vhdl-fix-clause ()
   "Fix closing parenthesis within generic/port clause."
   (interactive)
@@ -7957,13 +8273,14 @@ buffer."
     (vhdl-prepare-search-2
      (let ((pos (point))
 	   beg end)
-       (if (not (re-search-backward "^\\s-*\\(generic\\|port\\)[ \t\n]*(" nil 
t))
+       (end-of-line)
+       (if (not (re-search-backward "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(" 
nil t))
 	   (error "ERROR:  Not within a generic/port clause")
 	 ;; search for end of clause
 	 (goto-char (match-end 0))
 	 (setq beg (1- (point)))
 	 (vhdl-forward-syntactic-ws)
-	 (while (looking-at "\\w+\\([ \t\n]*,[ \t\n]*\\w+\\)*[ \t\n]*:[ 
\t\n]*\\w+[^;]*;")
+	 (while (looking-at "\\w+\\([ \t\n\r\f]*,[ \t\n\r\f]*\\w+\\)*[ \t\n\r\f]*:[ 
\t\n\r\f]*\\w+[^;]*;")
 	   (goto-char (1- (match-end 0)))
 	   (setq end (point-marker))
 	   (forward-char)
@@ -8317,7 +8634,8 @@ is omitted or nil."
   (let ((margin (current-indentation))
 	(start (point))
 	label)
-    (unless kind (setq kind (if (vhdl-sequential-statement-p) 'is 'use)))
+    (unless kind (setq kind (if (or (vhdl-sequential-statement-p)
+				    (not (vhdl-standard-p 'ams))) 'is 'use)))
     (if (or (not (eq vhdl-optional-labels 'all)) (vhdl-standard-p '87))
 	(vhdl-insert-keyword "CASE ")
       (vhdl-insert-keyword ": CASE ")
@@ -8905,7 +9223,7 @@ otherwise."
       (vhdl-insert-keyword
        (concat " " (if (eq kind 'then) "THEN" "USE") "\n\n"))
       (indent-to margin)
-      (vhdl-insert-keyword "END IF")
+      (vhdl-insert-keyword (concat "END " (if (eq kind 'then) "IF" "USE")))
       (when label (insert " " label))
       (insert ";")
       (forward-line -1)
@@ -9226,6 +9544,7 @@ otherwise."
   (interactive)
   (let ((margin (current-indentation))
 	(start (point))
+	(reset-kind vhdl-reset-kind)
 	label seq input-signals clock reset final-pos)
     (setq seq (if kind (eq kind 'seq)
 		(eq (vhdl-decision-query
@@ -9248,7 +9567,13 @@ otherwise."
       (setq clock (or (and (not (equal "" vhdl-clock-name))
 			   (progn (insert vhdl-clock-name) vhdl-clock-name))
 		      (vhdl-template-field "clock name") "<clock>"))
-      (when (eq vhdl-reset-kind 'async)
+      (when (eq reset-kind 'query)
+	(setq reset-kind
+	      (if (eq (vhdl-decision-query
+		       "" "(a)synchronous or (s)ynchronous reset?" t) ?a)
+		  'async
+		'sync)))
+      (when (eq reset-kind 'async)
 	(insert ", ")
 	(setq reset (or (and (not (equal "" vhdl-reset-name))
 			     (progn (insert vhdl-reset-name) vhdl-reset-name))
@@ -9257,7 +9582,7 @@ otherwise."
     (unless (vhdl-standard-p '87) (vhdl-insert-keyword " IS"))
     (insert "\n")
     (vhdl-template-begin-end "PROCESS" label margin)
-    (when seq (setq reset (vhdl-template-seq-process clock reset)))
+    (when seq (setq reset (vhdl-template-seq-process clock reset reset-
kind)))
     (when vhdl-prompt-for-comments
       (setq final-pos (point-marker))
       (vhdl-prepare-search-2
@@ -9589,13 +9914,13 @@ otherwise."
 	(in-arglist (vhdl-in-argument-list-p)))
     (vhdl-prepare-search-2
      (if (or (save-excursion
-	       (and (vhdl-re-search-backward
-		     "\\<function\\|procedure\\|process\\|procedural\\|end\\>"
-		     nil t)
-		    (not (progn (backward-word 1) (looking-at "\\<end\\>")))))
+	       (progn (vhdl-beginning-of-block)
+		      (looking-at "\\s-*\\(\\w+\\s-*:\\s-*\\)?\\<\\(\\<function\\|
procedure\\|process\\|procedural\\)\\>")))
 	     (save-excursion (backward-word 1) (looking-at "\\<shared\\>")))
 	 (vhdl-insert-keyword "VARIABLE ")
-       (vhdl-insert-keyword "SHARED VARIABLE ")))
+       (if (vhdl-standard-p '87)
+	   (error "ERROR:  Not within sequential block")
+	 (vhdl-insert-keyword "SHARED VARIABLE "))))
     (when (vhdl-template-field "names" nil t start (point))
       (insert " : ")
       (when in-arglist (vhdl-template-field "[IN | OUT | INOUT]" " " t))
@@ -9692,14 +10017,16 @@ otherwise."
        (concat (if vhdl-clock-rising-edge "rising" "falling")
 	       " clock edge")))))
 
-(defun vhdl-template-seq-process (clock reset)
+(defun vhdl-template-seq-process (clock reset reset-kind)
   "Insert a template for the body of a sequential process."
   (let ((margin (current-indentation))
 	position)
     (vhdl-insert-keyword "IF ")
-    (when (eq vhdl-reset-kind 'async)
+    (when vhdl-conditions-in-parenthesis (insert "("))
+    (when (eq reset-kind 'async)
       (insert reset " = "
 	      (if vhdl-reset-active-high vhdl-one-string vhdl-zero-string))
+      (when vhdl-conditions-in-parenthesis (insert ")"))
       (vhdl-insert-keyword " THEN")
       (vhdl-comment-insert-inline
        (concat "asynchronous reset (active "
@@ -9707,7 +10034,8 @@ otherwise."
       (insert "\n") (indent-to (+ margin vhdl-basic-offset))
       (setq position (point))
       (insert "\n") (indent-to margin)
-      (vhdl-insert-keyword "ELSIF "))
+      (vhdl-insert-keyword "ELSIF ")
+      (when vhdl-conditions-in-parenthesis (insert "(")))
     (if (eq vhdl-clock-edge-condition 'function)
 	(insert (if vhdl-clock-rising-edge "rising" "falling")
 		"_edge(" clock ")")
@@ -9715,17 +10043,20 @@ otherwise."
       (vhdl-insert-keyword " AND ")
       (insert clock " = "
 	      (if vhdl-clock-rising-edge vhdl-one-string vhdl-zero-string)))
+    (when vhdl-conditions-in-parenthesis (insert ")"))
     (vhdl-insert-keyword " THEN")
     (vhdl-comment-insert-inline
      (concat (if vhdl-clock-rising-edge "rising" "falling") " clock edge"))
     (insert "\n") (indent-to (+ margin vhdl-basic-offset))
-    (when (eq vhdl-reset-kind 'sync)
+    (when (eq reset-kind 'sync)
       (vhdl-insert-keyword "IF ")
+      (when vhdl-conditions-in-parenthesis (insert "("))
       (setq reset (or (and (not (equal "" vhdl-reset-name))
 			   (progn (insert vhdl-reset-name) vhdl-reset-name))
 		      (vhdl-template-field "reset name") "<reset>"))
       (insert " = "
 	      (if vhdl-reset-active-high vhdl-one-string vhdl-zero-string))
+      (when vhdl-conditions-in-parenthesis (insert ")"))
       (vhdl-insert-keyword " THEN")
       (vhdl-comment-insert-inline
        (concat "synchronous reset (active "
@@ -9737,7 +10068,7 @@ otherwise."
       (insert "\n") (indent-to (+ margin (* 2 vhdl-basic-offset)))
       (insert "\n") (indent-to (+ margin vhdl-basic-offset))
       (vhdl-insert-keyword "END IF;"))
-    (when (eq vhdl-reset-kind 'none)
+    (when (eq reset-kind 'none)
       (setq position (point)))
     (insert "\n") (indent-to margin)
     (vhdl-insert-keyword "END IF;")
@@ -9761,21 +10092,11 @@ specification, if not already there."
 	(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."
-  (interactive)
-  (vhdl-template-standard-package "ieee" "math_complex"))
-
-(defun vhdl-template-package-math-real ()
-  "Insert specification of `math_real' package."
-  (interactive)
-  (vhdl-template-standard-package "ieee" "math_real"))
+	  (indent-to margin))))
+    (when package
+      (vhdl-insert-keyword "USE ")
+      (insert library "." package)
+      (vhdl-insert-keyword ".ALL;"))))
 
 (defun vhdl-template-package-numeric-bit ()
   "Insert specification of `numeric_bit' package."
@@ -9822,6 +10143,56 @@ specification, if not already there."
   (interactive)
   (vhdl-template-standard-package "std" "textio"))
 
+(defun vhdl-template-package-fundamental-constants ()
+  "Insert specification of `fundamental_constants' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "fundamental_constants"))
+
+(defun vhdl-template-package-material-constants ()
+  "Insert specification of `material_constants' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "material_constants"))
+
+(defun vhdl-template-package-energy-systems ()
+  "Insert specification of `energy_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "energy_systems"))
+
+(defun vhdl-template-package-electrical-systems ()
+  "Insert specification of `electrical_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "electrical_systems"))
+
+(defun vhdl-template-package-mechanical-systems ()
+  "Insert specification of `mechanical_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "mechanical_systems"))
+
+(defun vhdl-template-package-radiant-systems ()
+  "Insert specification of `radiant_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "radiant_systems"))
+
+(defun vhdl-template-package-thermal-systems ()
+  "Insert specification of `thermal_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "thermal_systems"))
+
+(defun vhdl-template-package-fluidic-systems ()
+  "Insert specification of `fluidic_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "fluidic_systems"))
+
+(defun vhdl-template-package-math-complex ()
+  "Insert specification of `math_complex' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "math_complex"))
+
+(defun vhdl-template-package-math-real ()
+  "Insert specification of `math_real' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "math_real"))
+
 (defun vhdl-template-directive (directive)
   "Insert directive."
   (unless (= (current-indentation) (current-column))
@@ -9900,6 +10271,9 @@ specification, if not already there."
 	 (insert (user-full-name))
 	 (when user-mail-address (insert "  <" user-mail-address ">")))
        (goto-char beg)
+       (while (search-forward "<authorfull>" end t)
+	 (replace-match (user-full-name) t t))
+       (goto-char beg)
        (while (search-forward "<login>" end t)
 	 (replace-match (user-login-name) t t))
        (goto-char beg)
@@ -9915,7 +10289,7 @@ specification, if not already there."
        (while (search-forward "<standard>" end t)
 	 (replace-match
 	  (concat "VHDL" (cond ((vhdl-standard-p '87) "'87")
-			       ((vhdl-standard-p '93) "'93"))
+			       ((vhdl-standard-p '93) "'93/02"))
 		  (when (vhdl-standard-p 'ams) ", VHDL-AMS")
 		  (when (vhdl-standard-p 'math) ", Math Packages")) t t))
        (goto-char beg)
@@ -10021,9 +10395,10 @@ If starting after end-comment-column, start a new 
line."
   "Displays one line of dashes."
   (interactive)
   (while (= (preceding-char) ?-) (delete-char -2))
+  (insert "--")
   (let* ((col (current-column))
 	 (len (- end-comment-column col)))
-    (insert-char ?- len)))
+    (insert-char vhdl-comment-display-line-char len)))
 
 (defun vhdl-comment-append-inline ()
   "Append empty inline comment to current line."
@@ -10084,7 +10459,7 @@ If starting after end-comment-column, start a new 
line."
     (goto-char beg)
     (beginning-of-line)
     (setq beg (point))
-    (if (looking-at comment-start)
+    (if (looking-at (concat "\\s-*" comment-start))
 	(comment-region beg end '(4))
       (comment-region beg end))))
 
@@ -10119,7 +10494,7 @@ If starting after end-comment-column, start a new 
line."
     (goto-char beg)
     (beginning-of-line)
     (while (< (point) end)
-      (when (looking-at "^.*[^ \t\n-]+\\(\\s-*--.*\\)$")
+      (when (looking-at "^.*[^ \t\n\r\f-]+\\(\\s-*--.*\\)$")
 	(delete-region (match-beginning 1) (match-end 1)))
       (beginning-of-line 2))))
 
@@ -10323,9 +10698,9 @@ if in comment and past end-comment-column."
 	 (self-insert-command count)
 	 (cond ((>= (current-column) (+ 2 end-comment-column))
 		(backward-char 1)
-		(skip-chars-backward "^ \t\n")
+		(skip-chars-backward "^ \t\n\r\f")
 		(indent-new-comment-line)
-		(skip-chars-forward "^ \t\n")
+		(skip-chars-forward "^ \t\n\r\f")
 		(forward-char 1))
 	       ((>= (current-column) end-comment-column)
 		(indent-new-comment-line))
@@ -10369,7 +10744,9 @@ with double-quotes is to be inserted.  DEFAULT 
specifies a default string."
       (vhdl-fix-case-region-1 position (point) vhdl-upper-case-attributes
 			      (concat "'" vhdl-attributes-regexp))
       (vhdl-fix-case-region-1 position (point) vhdl-upper-case-enum-values
-			      vhdl-enum-values-regexp))
+			      vhdl-enum-values-regexp)
+      (vhdl-fix-case-region-1 position (point) vhdl-upper-case-constants
+			      vhdl-constants-regexp))
     (when (or (not (equal string "")) (not optional))
       (insert (or follow-string "")))
     (if (equal string "") nil string)))
@@ -10455,55 +10832,57 @@ else insert tab (used for word completion in VHDL 
minibuffer)."
 (defun vhdl-beginning-of-block ()
   "Move cursor to the beginning of the enclosing block."
   (let (pos)
-    (save-excursion
-      (beginning-of-line)
-      ;; search backward for block beginning or end
-      (while (or (while (and (setq pos (re-search-backward "^\\s-
*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n]+\\)?\\(function\\|
procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|
entity\\|package\\|record\\|units\\)\\|\\(\\w+[ \t\n]*:[ \t\n]*\\)?
\\(postponed[ \t\n]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|
while\\)\\)\\>" nil t))
-			     ;; not consider subprogram declarations
-			     (or (and (match-string 5)
-				      (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
-				 (and (match-string 6)
-				      (save-match-data
-					(save-excursion
-					  (vhdl-end-of-block)
-					  (beginning-of-line)
-					  (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|
loop\\)\\>"))))))))
-		 (match-string 2))
-	;; skip subblock if block end found
-	(vhdl-beginning-of-block)))
+    (vhdl-prepare-search-2
+     (save-excursion
+       (beginning-of-line)
+       ;; search backward for block beginning or end
+       (while (or (while (and (setq pos (re-search-backward "^\\s-
*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n\r\f]+\\)?\\(function\\|
procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|
entity\\|package\\(\\s-+body\\)?\\|type[ \t\n\r\f]+\\w+[ \t\n\r\f]+is[ 
\t\n\r\f]+\\(record\\|protected\\(\\s-+body\\)?\\)\\|units\\)\\|\\(\\w+[ 
\t\n\r\f]*:[ \t\n\r\f]*\\)?\\(postponed[ \t\n\r\f]+\\)?\\(block\\|case\\|
for\\|if\\|procedural\\|process\\|while\\|loop\\)\\)\\>" nil t))
+			      ;; not consider subprogram declarations
+			      (or (and (match-string 5)
+				       (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
+				  (and (match-string 6)
+				       (save-match-data
+					 (save-excursion
+					   (vhdl-end-of-block)
+					   (beginning-of-line)
+					   (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|
loop\\)\\>"))))))))
+		  (match-string 2))
+	 ;; skip subblock if block end found
+	 (vhdl-beginning-of-block))))
     (when pos (goto-char pos))))
 
 (defun vhdl-end-of-block ()
   "Move cursor to the end of the enclosing block."
   (let (pos)
-    (save-excursion
-      (end-of-line)
-      ;; search forward for block beginning or end
-      (while (or (while (and (setq pos (re-search-forward "^\\s-
*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n]+\\)?\\(function\\|
procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|
entity\\|package\\|record\\|units\\)\\|\\(\\w+[ \t\n]*:[ \t\n]*\\)?
\\(postponed[ \t\n]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|
while\\)\\)\\>" nil t))
-			     ;; not consider subprogram declarations
-			     (or (and (match-string 5)
-				      (save-match-data
-					(save-excursion (re-search-forward "\\<is\\>\\|\\(;\\)" nil t))
-					(match-string 1)))
-				 ;; not consider configuration specifications
-				 (and (match-string 6)
-				      (save-match-data
-					(save-excursion
-					  (vhdl-end-of-block)
-					  (beginning-of-line)
-					  (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|
loop\\)\\>"))))))))
-		 (not (match-string 2)))
-	;; skip subblock if block beginning found
-	(vhdl-end-of-block)))
+    (vhdl-prepare-search-2
+     (save-excursion
+       (end-of-line)
+       ;; search forward for block beginning or end
+       (while (or (while (and (setq pos (re-search-forward "^\\s-
*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n\r\f]+\\)?\\(function\\|
procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|
entity\\|package\\(\\s-+body\\)?\\|type[ \t\n\r\f]+\\w+[ \t\n\r\f]+is[ 
\t\n\r\f]+\\(record\\|protected\\(\\s-+body\\)?\\)\\|units\\)\\|\\(\\w+[ 
\t\n\r\f]*:[ \t\n\r\f]*\\)?\\(postponed[ \t\n\r\f]+\\)?\\(block\\|case\\|
for\\|if\\|procedural\\|process\\|while\\|loop\\)\\)\\>" nil t))
+			      ;; not consider subprogram declarations
+			      (or (and (match-string 5)
+				       (save-match-data
+					 (save-excursion (re-search-forward "\\<is\\>\\|\\(;\\)" nil t))
+					 (match-string 1)))
+				  ;; not consider configuration specifications
+				  (and (match-string 6)
+				       (save-match-data
+					 (save-excursion
+					   (vhdl-end-of-block)
+					   (beginning-of-line)
+					   (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|
loop\\)\\>"))))))))
+		  (not (match-string 2)))
+	 ;; skip subblock if block beginning found
+	 (vhdl-end-of-block))))
     (when pos (goto-char pos))))
 
 (defun vhdl-sequential-statement-p ()
@@ -10518,7 +10897,7 @@ else insert tab (used for word completion in VHDL 
minibuffer)."
 		   (< start (point)))
 	    ;; ... a sequential block
 	    (progn (vhdl-beginning-of-block)
-		   (looking-at "^\\s-*\\(\\(\\w+[ \t\n]+\\)?\\(function\\|procedure\\)\\|
\\(\\w+[ \t\n]*:[ \t\n]*\\)?\\(\\w+[ \t\n]+\\)?\\(procedural\\|
process\\)\\)\\>")))))))
+		   (looking-at "^\\s-*\\(\\(\\w+[ \t\n\r\f]+\\)?\\(function\\|
procedure\\)\\|\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(\\w+[ \t\n\r\f]+\\)?
\\(procedural\\|process\\)\\)\\>")))))))
 
 (defun vhdl-in-argument-list-p ()
   "Check if within an argument list."
@@ -10542,7 +10921,9 @@ but not if inside a comment or quote."
       (progn
 	(insert " ")
 	(unexpand-abbrev)
-	(delete-char -1))
+	(backward-word 1)
+	(vhdl-case-word 1)
+	(delete-char 1))
     (if (not vhdl-electric-mode)
 	(progn
 	  (insert " ")
@@ -10821,7 +11202,10 @@ but not if inside a comment or quote."
 (defun vhdl-parse-string (string &optional optional)
   "Check that the text following point matches the regexp in STRING."
   (if (looking-at string)
-      (goto-char (match-end 0))
+      (progn (goto-char (match-end 0))
+	     (when (vhdl-in-literal)
+	       (end-of-line))
+	     (point))
     (unless optional
       (throw 'parse (format "ERROR:  Syntax error near line %s, expecting 
\"%s\""
 			    (vhdl-current-line) string)))
@@ -10919,7 +11303,9 @@ reflected in a subsequent paste operation."
 	      port-dir (car port-dir-car))
 	(setcar port-dir-car
 		(cond ((equal port-dir "in") "out")
+		      ((equal port-dir "IN") "OUT")
 		      ((equal port-dir "out") "in")
+		      ((equal port-dir "OUT") "IN")
 		      (t port-dir)))
 	(setq port-list (cdr port-list)))
       (setq vhdl-port-reversed-direction (not vhdl-port-reversed-direction))
@@ -10949,20 +11335,23 @@ reflected in a subsequent paste operation."
 	  (message "Reading port of %s \"%s\"..." decl-type name)
 	  (vhdl-forward-syntactic-ws)
 	  ;; parse generic clause
-	  (when (vhdl-parse-string "generic[ \t\n]*(" t)
+	  (when (vhdl-parse-string "generic[ \t\n\r\f]*(" t)
 	    ;; parse group comment and spacing
 	    (setq group-comment (vhdl-parse-group-comment))
-	    (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
+	    (setq end-of-list (vhdl-parse-string ")[ \t\n\r\f]*;[ \t\n\r\f]*" t))
 	    (while (not end-of-list)
 	      ;; parse names (accept extended identifiers)
-	      (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	      (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	      (setq names (list (match-string-no-properties 1)))
-	      (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\)[ \t\n]*" t)
+	      (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ 
\t\n\r\f]*" t)
 		(setq names
 		      (append names (list (match-string-no-properties 1)))))
 	      ;; parse type
-	      (vhdl-parse-string ":[ \t\n]*\\([^():;\n]+\\)")
+	      (vhdl-parse-string ":[ \t\n\r\f]*\\([^():;\n]+\\)")
 	      (setq type (match-string-no-properties 1))
+	      (when (vhdl-in-comment-p) ; if stuck in comment
+		(setq type (concat type (and (vhdl-parse-string ".*")
+					     (match-string-no-properties 0)))))
 	      (setq comment nil)
 	      (while (looking-at "(")
 		(setq type
@@ -10980,7 +11369,7 @@ reflected in a subsequent paste operation."
 	      (setq type (substring type 0 (match-end 1)))
 	      ;; parse initialization expression
 	      (setq init nil)
-	      (when (vhdl-parse-string ":=[ \t\n]*" t)
+	      (when (vhdl-parse-string ":=[ \t\n\r\f]*" t)
 		(vhdl-parse-string "\\([^();\n]*\\)")
 		(setq init (match-string-no-properties 1))
 		(while (looking-at "(")
@@ -11014,28 +11403,31 @@ reflected in a subsequent paste operation."
 	      ;; parse group comment and spacing
 	      (setq group-comment (vhdl-parse-group-comment))))
 	  ;; parse port clause
-	  (when (vhdl-parse-string "port[ \t\n]*(" t)
+	  (when (vhdl-parse-string "port[ \t\n\r\f]*(" t)
 	    ;; parse group comment and spacing
 	    (setq group-comment (vhdl-parse-group-comment))
-	    (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
+	    (setq end-of-list (vhdl-parse-string ")[ \t\n\r\f]*;[ \t\n\r\f]*" t))
 	    (while (not end-of-list)
 	      ;; parse object
 	      (setq object
-		    (and (vhdl-parse-string "\\<\\(signal\\|quantity\\|terminal\\)\\>[ 
\t\n]*" t)
+		    (and (vhdl-parse-string "\\<\\(signal\\|quantity\\|terminal\\)\\>[ 
\t\n\r\f]*" t)
 			 (match-string-no-properties 1)))
 	      ;; parse names (accept extended identifiers)
-	      (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	      (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	      (setq names (list (match-string-no-properties 1)))
-	      (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\|\\\\[^\\]+\\\\\\)[ 
\t\n]*" t)
+	      (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ 
\t\n\r\f]*" t)
 		(setq names (append names (list (match-string-no-properties 1)))))
 	      ;; parse direction
-	      (vhdl-parse-string ":[ \t\n]*")
+	      (vhdl-parse-string ":[ \t\n\r\f]*")
 	      (setq direct
-		    (and (vhdl-parse-string "\\<\\(in\\|out\\|inout\\|buffer\\|
linkage\\)\\>[ \t\n]+" t)
+		    (and (vhdl-parse-string "\\<\\(in\\|out\\|inout\\|buffer\\|
linkage\\)\\>[ \t\n\r\f]+" t)
 			 (match-string-no-properties 1)))
 	      ;; parse type
 	      (vhdl-parse-string "\\([^();\n]+\\)")
 	      (setq type (match-string-no-properties 1))
+	      (when (vhdl-in-comment-p) ; if stuck in comment
+		(setq type (concat type (and (vhdl-parse-string ".*")
+					     (match-string-no-properties 0)))))
 	      (setq comment nil)
 	      (while (looking-at "(")
 		(setq type (concat type
@@ -11313,7 +11705,7 @@ reflected in a subsequent paste operation."
 	  (setq port-list (cdr port-list))
 	  (insert (if port-list "," ");"))
 	  ;; paste comment
-	  (when (or vhdl-include-direction-comments
+	  (when (or (and vhdl-include-direction-comments (nth 2 port))
 		    vhdl-include-type-comments
 		    (and vhdl-include-port-comments (nth 4 port)))
 	    (vhdl-comment-insert-inline
@@ -11454,12 +11846,17 @@ reflected in a subsequent paste operation."
 	  ;; paste type
 	  (insert " : " (nth 3 port))
 	  ;; paste initialization (inputs only)
-	  (when (and initialize (equal "IN" (upcase (nth 2 port))))
-	    (insert " := " (if (string-match "(.+)" (nth 3 port))
-			       "(others => '0')" "'0'")))
+	  (when (and initialize (nth 2 port) (equal "IN" (upcase (nth 2 port))))
+	    (insert " := "
+		    (cond ((string-match "integer" (nth 3 port)) "0")
+			  ((string-match "natural" (nth 3 port)) "0")
+			  ((string-match "positive" (nth 3 port)) "0")
+			  ((string-match "real" (nth 3 port)) "0.0")
+			  ((string-match "(.+)" (nth 3 port)) "(others => '0')")
+			  (t "'0'"))))
 	  (insert ";")
 	  ;; paste comment
-	  (when (or vhdl-include-direction-comments
+	  (when (or (and vhdl-include-direction-comments (nth 2 port))
 		    (and vhdl-include-port-comments (nth 4 port)))
 	    (vhdl-comment-insert-inline
 	     (concat
@@ -11495,8 +11892,14 @@ reflected in a subsequent paste operation."
 	      (setq name (car (nth 0 port)))
 	      (insert (vhdl-replace-string vhdl-actual-port-name name))
 	      ;; paste initialization
-	      (insert " <= " (if (string-match "(.+)" (nth 3 port))
-				 "(others => '0')" "'0'") ";"))
+	      (insert " <= "
+		      (cond ((string-match "integer" (nth 3 port)) "0")
+			    ((string-match "natural" (nth 3 port)) "0")
+			    ((string-match "positive" (nth 3 port)) "0")
+			    ((string-match "real" (nth 3 port)) "0.0")
+			    ((string-match "(.+)" (nth 3 port)) "(others => '0')")
+			    (t "'0'"))
+		      ";"))
 	    (setq port-list (cdr port-list))
 	    (when (and port-list
 		       (equal "IN" (upcase (nth 2 (car port-list)))))
@@ -11609,7 +12012,9 @@ reflected in a subsequent paste operation."
       ;; paste custom declarations
       (unless (equal "" vhdl-testbench-declarations)
 	(insert "\n")
-	(vhdl-insert-string-or-file vhdl-testbench-declarations))
+	(setq position (point))
+	(vhdl-insert-string-or-file vhdl-testbench-declarations)
+	(vhdl-indent-region position (point)))
       (setq position (point))
       (insert "\n\n")
       (vhdl-comment-display-line) (insert "\n")
@@ -11638,7 +12043,9 @@ reflected in a subsequent paste operation."
       ;; paste custom statements
       (unless (equal "" vhdl-testbench-statements)
 	(insert "\n")
-	(vhdl-insert-string-or-file vhdl-testbench-statements))
+	(setq position (point))
+	(vhdl-insert-string-or-file vhdl-testbench-statements)
+	(vhdl-indent-region position (point)))
       (insert "\n")
       (indent-to vhdl-basic-offset)
       (unless (eq vhdl-testbench-create-files 'none)
@@ -11707,8 +12114,8 @@ reflected in a subsequent paste operation."
 	  ;; check if within function declaration
 	  (setq pos (point))
 	  (end-of-line)
-	  (when (looking-at "[ \t\n]*\\((\\|;\\|is\\>\\)") (goto-char (match-end 
0)))
-	  (unless (and (re-search-backward "^\\s-*\\(\\(procedure\\)\\|
\\(\\(pure\\|impure\\)\\s-+\\)?function\\)\\s-+\\(\"?\\w+\"?\\)[ 
\t\n]*\\(\\((\\)\\|;\\|is\\>\\)" nil t)
+	  (when (looking-at "[ \t\n\r\f]*\\((\\|;\\|is\\>\\)") (goto-char (match-end 
0)))
+	  (unless (and (re-search-backward "^\\s-*\\(\\(procedure\\)\\|\\(\\(pure\\|
impure\\)\\s-+\\)?function\\)\\s-+\\(\"?\\w+\"?\\)[ \t\n\r\f]*\\(\\((\\)\\|;
\\|is\\>\\)" nil t)
 		       (goto-char (match-end 0))
 		       (save-excursion (backward-char)
 				    (forward-sexp)
@@ -11721,21 +12128,21 @@ reflected in a subsequent paste operation."
 	  ;; parse parameter list
 	  (setq group-comment (vhdl-parse-group-comment))
 	  (setq end-of-list (or end-of-list
-				(vhdl-parse-string ")[ \t\n]*\\(;\\|\\(is\\|return\\)\\>\\)" t)))
+				(vhdl-parse-string ")[ \t\n\r\f]*\\(;\\|\\(is\\|return\\)\\>\\)" t)))
 	  (while (not end-of-list)
 	    ;; parse object
 	    (setq object
-		  (and (vhdl-parse-string "\\(constant\\|signal\\|variable\\|file\\|
quantity\\|terminal\\)[ \t\n]*" t)
+		  (and (vhdl-parse-string "\\(constant\\|signal\\|variable\\|file\\|
quantity\\|terminal\\)[ \t\n\r\f]*" t)
 			 (match-string-no-properties 1)))
 	    ;; parse names (accept extended identifiers)
-	    (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	    (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	    (setq names (list (match-string-no-properties 1)))
-	    (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\|\\\\[^\\]+\\\\\\)[ 
\t\n]*" t)
+	    (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ 
\t\n\r\f]*" t)
 	      (setq names (append names (list (match-string-no-properties 1)))))
 	    ;; parse direction
-	    (vhdl-parse-string ":[ \t\n]*")
+	    (vhdl-parse-string ":[ \t\n\r\f]*")
 	    (setq direct
-		  (and (vhdl-parse-string "\\(in\\|out\\|inout\\|buffer\\|linkage\\)[ 
\t\n]+" t)
+		  (and (vhdl-parse-string "\\(in\\|out\\|inout\\|buffer\\|linkage\\)[ 
\t\n\r\f]+" t)
 		       (match-string-no-properties 1)))
 	    ;; parse type
 	    (vhdl-parse-string "\\([^():;\n]+\\)")
@@ -11757,7 +12164,7 @@ reflected in a subsequent paste operation."
 	    (setq type (substring type 0 (match-end 1)))
 	    ;; parse initialization expression
 	    (setq init nil)
-	    (when (vhdl-parse-string ":=[ \t\n]*" t)
+	    (when (vhdl-parse-string ":=[ \t\n\r\f]*" t)
 	      (vhdl-parse-string "\\([^();\n]*\\)")
 	      (setq init (match-string-no-properties 1))
 	      (while (looking-at "(")
@@ -11787,7 +12194,7 @@ reflected in a subsequent paste operation."
 	    (vhdl-parse-string "\\(;\\|\\(is\\|\\(return\\)\\)\\>\\)\\s-*")
 	    ;; parse return type
 	    (when (match-string 3)
-	      (vhdl-parse-string "[ \t\n]*\\(.+\\)[ \t\n]*\\(;\\|is\\>\\)\\s-*")
+	      (vhdl-parse-string "[ \t\n\r\f]*\\(.+\\)[ \t\n\r\f]*\\(;\\|
is\\>\\)\\s-*")
 	      (setq return-type (match-string-no-properties 1))
 	      (when (and return-type
 			 (string-match "\\(\\s-*--\\s-*\\)\\(.*\\)" return-type))
@@ -12015,17 +12422,15 @@ expressions (e.g. for index ranges of types and 
signals)."
  (defalias 'he-list-beg 'vhdl-he-list-beg))
 
 ;; function for expanding abbrevs and dabbrevs
-(defun vhdl-expand-abbrev (arg))
-(fset 'vhdl-expand-abbrev (make-hippie-expand-function
-			   '(try-expand-dabbrev
-			     try-expand-dabbrev-all-buffers
-			     vhdl-try-expand-abbrev)))
+(defalias 'vhdl-expand-abbrev (make-hippie-expand-function
+			       '(try-expand-dabbrev
+				 try-expand-dabbrev-all-buffers
+				 vhdl-try-expand-abbrev)))
 
 ;; function for expanding parenthesis
-(defun vhdl-expand-paren (arg))
-(fset 'vhdl-expand-paren (make-hippie-expand-function
-			  '(try-expand-list
-			    try-expand-list-all-buffers)))
+(defalias 'vhdl-expand-paren (make-hippie-expand-function
+			      '(try-expand-list
+				try-expand-list-all-buffers)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  Case fixing
@@ -12049,7 +12454,7 @@ depending on parameter UPPER-CASE."
 		    (< vhdl-progress-interval
 		       (- (nth 1 (current-time)) last-update)))
 	   (message "Fixing case... (%2d%s)"
-		    (+ (* count 25) (/ (* 25 (- (point) beg)) (- end beg)))
+		    (+ (* count 20) (/ (* 20 (- (point) beg)) (- end beg)))
 		    "%")
 	   (setq last-update (nth 1 (current-time)))))
        (goto-char end)))))
@@ -12066,6 +12471,8 @@ options vhdl-upper-
case-{keywords,types,attributes,enum-values}."
    beg end vhdl-upper-case-attributes (concat "'" vhdl-attributes-regexp) 2)
   (vhdl-fix-case-region-1
    beg end vhdl-upper-case-enum-values vhdl-enum-values-regexp 3)
+  (vhdl-fix-case-region-1
+   beg end vhdl-upper-case-constants vhdl-constants-regexp 4)
   (when vhdl-progress-interval (message "Fixing case...done")))
 
 (defun vhdl-fix-case-buffer ()
@@ -12091,6 +12498,9 @@ options vhdl-upper-
case-{keywords,types,attributes,enum-values}."
        (upcase-word 1))
      (when (and vhdl-upper-case-enum-values
 		(looking-at vhdl-enum-values-regexp))
+       (upcase-word 1))
+     (when (and vhdl-upper-case-constants
+		(looking-at vhdl-constants-regexp))
        (upcase-word 1)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -12205,6 +12615,9 @@ it works within comments too."
   (interactive)
   (let ((no-stats 0)
 	(no-code-lines 0)
+	(no-empty-lines 0)
+	(no-comm-lines 0)
+	(no-comments 0)
 	(no-lines (count-lines (point-min) (point-max))))
     (save-excursion
       ;; count statements
@@ -12218,15 +12631,40 @@ it works within comments too."
       (while (not (eobp))
 	(unless (looking-at "^\\s-*\\(--.*\\)?$")
 	  (setq no-code-lines (1+ no-code-lines)))
-	(beginning-of-line 2)))
+	(beginning-of-line 2))
+      ;; count empty lines
+      (goto-char (point-min))
+      (while (and (re-search-forward "^\\s-*$" nil t)
+		  (not (eq (point) (point-max))))
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-empty-lines (1+ no-empty-lines))
+	  (unless (eq (point) (point-max))
+	    (forward-char))))
+      ;; count comment-only lines
+      (goto-char (point-min))
+      (while (re-search-forward "^\\s-*--.*" nil t)
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-comm-lines (1+ no-comm-lines))))
+      ;; count comments
+      (goto-char (point-min))
+      (while (re-search-forward "--.*" nil t)
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-comments (1+ no-comments)))))
     ;; print results
     (message "\n\
 File statistics: \"%s\"\n\
 ---------------------\n\
-# statements  : %5d\n\
-# code lines  : %5d\n\
-# total lines : %5d\n\ "
-	     (buffer-file-name) no-stats no-code-lines no-lines)
+# statements    : %5d\n\
+# code lines    : %5d\n\
+# empty lines   : %5d\n\
+# comment lines : %5d\n\
+# comments      : %5d\n\
+# total lines   : %5d\n\ "
+	     (buffer-file-name) no-stats no-code-lines no-empty-lines
+	     no-comm-lines no-comments no-lines)
     (unless vhdl-emacs-21 (vhdl-show-messages))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -12390,18 +12828,18 @@ File statistics: \"%s\"\n\
   (concat
    "\\(^\\)\\s-*\\("
    ;; generic/port clause
-   "\\(generic\\|port\\)[ \t\n]*(\\|"
+   "\\(generic\\|port\\)[ \t\n\r\f]*(\\|"
    ;; component
    "component\\>\\|"
    ;; component instantiation
-   "\\(\\w\\|\\s_\\)+[ \t\n]*:[ \t\n]*"
-   "\\(\\(component\\|configuration\\|entity\\)[ \t\n]+\\)?"
-   "\\(\\w\\|\\s_\\)+\\([ \t\n]*(\\(\\w\\|\\s_\\)+)\\)?[ \t\n]*"
-   "\\(generic\\|port\\)[ \t\n]+map[ \t\n]*(\\|"
+   "\\(\\w\\|\\s_\\)+[ \t\n\r\f]*:[ \t\n\r\f]*"
+   "\\(\\(component\\|configuration\\|entity\\)[ \t\n\r\f]+\\)?"
+   "\\(\\w\\|\\s_\\)+\\([ \t\n\r\f]*(\\(\\w\\|\\s_\\)+)\\)?[ \t\n\r\f]*"
+   "\\(generic\\|port\\)[ \t\n\r\f]+map[ \t\n\r\f]*(\\|"
    ;; subprogram
    "\\(function\\|procedure\\)\\>\\|"
    ;; process, block
-   "\\(\\(\\w\\|\\s_\\)+[ \t\n]*:[ \t\n]*\\)?\\(process\\|block\\)\\>\\|"
+   "\\(\\(\\w\\|\\s_\\)+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(process\\|
block\\)\\>\\|"
    ;; configuration declaration
    "configuration\\>"
    "\\)")
@@ -12414,7 +12852,7 @@ File statistics: \"%s\"\n\
      (beginning-of-line)
      (cond
       ;; generic/port clause
-      ((looking-at "^\\s-*\\(generic\\|port\\)[ \t\n]*(")
+      ((looking-at "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(")
        (goto-char (match-end 0))
        (backward-char)
        (forward-sexp))
@@ -12424,16 +12862,16 @@ File statistics: \"%s\"\n\
       ;; component instantiation
       ((looking-at
 	(concat
-	 "^\\s-*\\w+\\s-*:[ \t\n]*"
-	 "\\(\\(component\\|configuration\\|entity\\)[ \t\n]+\\)?"
-	 "\\w+\\(\\s-*(\\w+)\\)?[ \t\n]*"
-	 "\\(generic\\|port\\)\\s-+map[ \t\n]*("))
+	 "^\\s-*\\w+\\s-*:[ \t\n\r\f]*"
+	 "\\(\\(component\\|configuration\\|entity\\)[ \t\n\r\f]+\\)?"
+	 "\\w+\\(\\s-*(\\w+)\\)?[ \t\n\r\f]*"
+	 "\\(generic\\|port\\)\\s-+map[ \t\n\r\f]*("))
        (goto-char (match-end 0))
        (backward-char)
        (forward-sexp)
        (setq pos (point))
        (vhdl-forward-syntactic-ws)
-       (when (looking-at "port\\s-+map[ \t\n]*(")
+       (when (looking-at "port\\s-+map[ \t\n\r\f]*(")
 	 (goto-char (match-end 0))
 	 (backward-char)
 	 (forward-sexp)
@@ -12585,7 +13023,7 @@ This does highlighting of keywords and standard 
identifiers.")
    ;; highlight labels of common constructs
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*\\(\\("
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*\\(\\("
      "assert\\|block\\|case\\|exit\\|for\\|if\\|loop\\|next\\|null\\|"
      "postponed\\|process\\|"
      (when (vhdl-standard-p 'ams) "procedural\\|")
@@ -12596,14 +13034,14 @@ This does highlighting of keywords and standard 
identifiers.")
    ;; highlight label and component name of component instantiations
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*\\(\\w+\\)"
-     "\\(\\s-*\\(--[^\n]*\\)?$\\|\\s-+\\(generic\\|port\\)\\s-+map\\>\\)")
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*\\(\\w+\\)[ \t\n\r\f]*"
+     "\\(--[^\n]*[ \t\n\r\f]+\\)*\\(generic\\|port\\)\\s-+map\\>")
     '(1 font-lock-function-name-face) '(2 font-lock-function-name-face))
 
    ;; highlight label and instantiated unit of component instantiations
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*"
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*"
      "\\(component\\|configuration\\|entity\\)\\s-+"
      "\\(\\w+\\)\\(\\.\\(\\w+\\)\\)?\\(\\s-*(\\(\\w+\\))\\)?")
     '(1 font-lock-function-name-face) '(3 font-lock-function-name-face)
@@ -12638,7 +13076,7 @@ This does highlighting of keywords and standard 
identifiers.")
    (list
     (concat
      "^\\s-*for\\s-+\\(\\w+\\(,\\s-*\\w+\\)*\\)\\>\\s-*"
-     "\\(:[ \t\n]*\\(\\w+\\)\\|[^i \t]\\)")
+     "\\(:[ \t\n\r\f]*\\(\\w+\\)\\|[^i \t]\\)")
     '(1 font-lock-function-name-face) '(4 font-lock-function-name-face nil 
t))
 
    ;; highlight names in library clauses
@@ -12662,8 +13100,8 @@ This does highlighting of keywords and standard 
identifiers.")
    ;; highlight type/nature name in (sub)type/(sub)nature declarations
    (list
     (concat
-     "^\\s-*\\(sub\\)?\\(nature\\|type\\)\\s-+\\(\\w+\\)")
-    3 'font-lock-type-face)
+     "^\\s-*\\(\\(sub\\)?\\(nature\\|type\\)\\|end\\s-+\\(record\\|
protected\\)\\)\\s-+\\(\\w+\\)")
+    5 'font-lock-type-face)
 
    ;; highlight signal/variable/constant declaration names
    (list "\\(:[^=]\\)"
@@ -12867,6 +13305,7 @@ This does background highlighting of translate-off 
regions.")
 	 (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-constants-regexp   1 'font-lock-constant-face)
 	 (list vhdl-keywords-regexp    1 'font-lock-keyword-face)))
   ;; highlight words with special syntax.
   (setq vhdl-font-lock-keywords-3
@@ -12875,9 +13314,10 @@ This does background highlighting of translate-off 
regions.")
 	  (while syntax-alist
 	    (setq keywords
 		  (cons
-		   (cons (concat "\\<\\(" (nth 1 (car syntax-alist)) "\\)\\>")
+		   (list (concat "\\(" (nth 1 (car syntax-alist)) "\\)") 1
 			 (vhdl-function-name
-			  "vhdl-font-lock" (nth 0 (car syntax-alist)) "face"))
+			  "vhdl-font-lock" (nth 0 (car syntax-alist)) "face")
+			 (nth 4 (car syntax-alist)))
 		   keywords))
 	    (setq syntax-alist (cdr syntax-alist)))
 	  keywords))
@@ -13066,7 +13506,7 @@ hierarchy otherwise.")
       (when (re-search-backward "^[ \t]*\\(architecture\\|configuration\\|
entity\\|package\\)\\>" nil t)
 	(while (and (re-search-backward "^[ \t]*\\(end\\|use\\)\\>" nil t)
 		    (equal "USE" (upcase (match-string 1))))
-	  (when (looking-at "^[ \t]*use[ \t\n]*\\(\\w+\\)\\.\\(\\w+\\)\\.\\w+")
+	  (when (looking-at "^[ \t]*use[ \t\n\r\f]*\\(\\w+\\)\\.\\(\\w+\\)\\.\\w+")
 	    (setq lib-alist (cons (cons (match-string-no-properties 1)
 					(vhdl-match-string-downcase 2))
 				  lib-alist))))))
@@ -13140,7 +13580,7 @@ hierarchy otherwise.")
 			 (setq big-files t))
 		;; scan for entities
 		(goto-char (point-min))
-		(while (re-search-forward "^[ \t]*entity[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" 
nil t)
+		(while (re-search-forward "^[ \t]*entity[ \t\n\r\f]+\\(\\w+\\)[ 
\t\n\r\f]+is\\>" nil t)
 		  (let* ((ent-name (match-string-no-properties 1))
 			 (ent-key (downcase ent-name))
 			 (ent-entry (aget ent-alist ent-key t))
@@ -13157,7 +13597,7 @@ hierarchy otherwise.")
 				  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)
+		(while (re-search-forward "^[ \t]*architecture[ \t\n\r\f]+\\(\\w+\\)[ 
\t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((arch-name (match-string-no-properties 1))
 			 (arch-key (downcase arch-name))
 			 (ent-name (match-string-no-properties 2))
@@ -13183,7 +13623,7 @@ hierarchy otherwise.")
 				  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)
+		(while (re-search-forward "^[ \t]*configuration[ \t\n\r\f]+\\(\\w+\\)[ 
\t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((conf-name (match-string-no-properties 1))
 			 (conf-key (downcase conf-name))
 			 (conf-entry (aget conf-alist conf-key t))
@@ -13195,7 +13635,7 @@ hierarchy otherwise.")
 			 arch-key comp-conf-list inst-key-list
 			 inst-comp-key inst-ent-key inst-arch-key
 			 inst-conf-key inst-lib-key)
-		    (when (vhdl-re-search-forward "\\<for[ \t\n]+\\(\\w+\\)")
+		    (when (vhdl-re-search-forward "\\<for[ \t\n\r\f]+\\(\\w+\\)")
 		      (setq arch-key (vhdl-match-string-downcase 1)))
 		    (if conf-entry
 			(vhdl-warning-when-idle
@@ -13204,13 +13644,13 @@ hierarchy otherwise.")
 			 (nth 2 conf-entry) file-name conf-line)
 		      (setq conf-list (cons conf-key conf-list))
 		      ;; scan for subconfigurations and subentities
-		      (while (re-search-forward "^[ \t]*for[ \t\n]+\\(\\w+\\([ \t\n]*,[ 
\t\n]*\\w+\\)*\\)[ \t\n]*:[ \t\n]*\\(\\w+\\)[ \t\n]+" end-of-unit t)
+		      (while (re-search-forward "^[ \t]*for[ \t\n\r\f]+\\(\\w+\\([ 
\t\n\r\f]*,[ \t\n\r\f]*\\w+\\)*\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\(\\w+\\)[ 
\t\n\r\f]+" end-of-unit t)
 			(setq inst-comp-key (vhdl-match-string-downcase 3)
 			      inst-key-list (split-string
 					     (vhdl-match-string-downcase 1)
-					     "[ \t\n]*,[ \t\n]*"))
+					     "[ \t\n\r\f]*,[ \t\n\r\f]*"))
 			(vhdl-forward-syntactic-ws)
-			(when (looking-at "use[ \t\n]+\\(\\(entity\\)\\|configuration\\)[ 
\t\n]+\\(\\w+\\)\\.\\(\\w+\\)[ \t\n]*\\((\\(\\w+\\))\\)?")
+			(when (looking-at "use[ \t\n\r\f]+\\(\\(entity\\)\\|configuration\\)[ 
\t\n\r\f]+\\(\\w+\\)\\.\\(\\w+\\)[ \t\n\r\f]*\\((\\(\\w+\\))\\)?")
 			  (setq
 			   inst-lib-key (vhdl-match-string-downcase 3)
 			   inst-ent-key (and (match-string 2)
@@ -13232,7 +13672,7 @@ hierarchy otherwise.")
 				  arch-key comp-conf-list lib-alist)))))
 		;; scan for packages
 		(goto-char (point-min))
-		(while (re-search-forward "^[ \t]*package[ \t\n]+\\(body[ \t\n]+\\)?
\\(\\w+\\)[ \t\n]+is\\>" nil t)
+		(while (re-search-forward "^[ \t]*package[ \t\n\r\f]+\\(body[ 
\t\n\r\f]+\\)?\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((pack-name (match-string-no-properties 2))
 			 (pack-key (downcase pack-name))
 			 (is-body (match-string-no-properties 1))
@@ -13250,7 +13690,7 @@ hierarchy otherwise.")
 		      ;; scan for context clauses
 		      (setq lib-alist (vhdl-scan-context-clause))
 		      ;; scan for component and subprogram declarations/bodies
-		      (while (re-search-forward "^[ \t]*\\(component\\|function\\|
procedure\\)[ \t\n]+\\(\\w+\\|\".*\"\\)" end-of-unit t)
+		      (while (re-search-forward "^[ \t]*\\(component\\|function\\|
procedure\\)[ \t\n\r\f]+\\(\\w+\\|\".*\"\\)" end-of-unit t)
 			(if (equal (upcase (match-string 1)) "COMPONENT")
 			    (setq comp-name (match-string-no-properties 2)
 				  comp-alist
@@ -13286,7 +13726,7 @@ hierarchy otherwise.")
 			 (setq big-files t))
 		;; 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)
+		(while (re-search-forward "^[ \t]*architecture[ \t\n\r\f]+\\(\\w+\\)[ 
\t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((ent-name (match-string-no-properties 2))
 			 (ent-key (downcase ent-name))
 			 (arch-name (match-string-no-properties 1))
@@ -13300,12 +13740,12 @@ hierarchy otherwise.")
 			 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+\\))\\)?\\|"
+				 (concat "^[ \t]*\\(\\w+\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\("
+					 "\\(\\w+\\)[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(generic\\|
port\\)[ \t\n\r\f]+map\\>\\|"
+					 "component[ \t\n\r\f]+\\(\\w+\\)\\|"
+					 "\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\(\\w+\\)\\.\\)?
\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?\\|"
 					 "\\(\\(for\\|if\\)\\>[^;:]+\\<generate\\>\\|block\\>\\)\\)\\|"
-					 "\\(^[ \t]*end[ \t\n]+\\(generate\\|block\\)\\>\\)") end-of-unit 
t)
+					 "\\(^[ \t]*end[ \t\n\r\f]+\\(generate\\|block\\)\\>\\)") end-of-
unit t)
 				(or (not limit-hier-inst-no)
 				    (<= (setq inst-no (1+ inst-no))
 					limit-hier-inst-no)))
@@ -13349,8 +13789,8 @@ hierarchy otherwise.")
 		    ;; 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)
+			    (concat "^[ \t]*for[ \t\n\r\f]+\\(\\w+\\([ \t\n\r\f]*,[ 
\t\n\r\f]*\\w+\\)*\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\(\\w+\\)[ 
\t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*"
+				    "use[ \t\n\r\f]+\\(\\(entity\\)\\|configuration\\)[ 
\t\n\r\f]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?") end-
of-unit t)
 		      (let* ((inst-comp-name (match-string-no-properties 3))
 			     (inst-ent-key
 			      (and (match-string 6)
@@ -13362,7 +13802,7 @@ hierarchy otherwise.")
 			     (inst-lib-key (vhdl-match-string-downcase 8))
 			     (inst-key-list
 			      (split-string (vhdl-match-string-downcase 1)
-					    "[ \t\n]*,[ \t\n]*"))
+					    "[ \t\n\r\f]*,[ \t\n\r\f]*"))
 			     (tmp-inst-alist inst-alist)
 			     inst-entry)
 			(while tmp-inst-alist
@@ -15347,7 +15787,7 @@ expansion function)."
 	      (read-from-minibuffer "architecture name: "
 				    nil vhdl-minibuffer-local-map)
 	    (vhdl-replace-string vhdl-compose-architecture-name ent-name)))
-	 ent-file-name arch-file-name ent-buffer arch-buffer project)
+	 ent-file-name arch-file-name ent-buffer arch-buffer project end-pos)
     (message "Creating component \"%s(%s)\"..." ent-name arch-name)
     ;; open entity file
     (unless (eq vhdl-compose-create-files 'none)
@@ -15364,6 +15804,7 @@ expansion function)."
     ;; insert header
     (if vhdl-compose-include-header
 	(progn (vhdl-template-header)
+	       (setq end-pos (point))
 	       (goto-char (point-max)))
       (vhdl-comment-display-line) (insert "\n\n"))
     ;; insert library clause
@@ -15390,6 +15831,7 @@ expansion function)."
     ;; open architecture file
     (if (not (eq vhdl-compose-create-files 'separate))
 	(insert "\n")
+      (goto-char (or end-pos (point-min)))
       (setq ent-buffer (current-buffer))
       (setq arch-file-name
 	    (concat (vhdl-replace-string vhdl-architecture-file-name
@@ -15434,7 +15876,7 @@ expansion function)."
     (if (and vhdl-compose-include-header (not (equal vhdl-file-footer "")))
 	(vhdl-template-footer)
       (vhdl-comment-display-line) (insert "\n"))
-    (goto-char (point-min))
+    (goto-char (or end-pos (point-min)))
     (setq arch-buffer (current-buffer))
     (when ent-buffer (set-buffer ent-buffer) (save-buffer))
     (set-buffer arch-buffer) (save-buffer)
@@ -15453,8 +15895,8 @@ component instantiation."
       (error "ERROR:  No port has been read")
     (save-excursion
       (vhdl-prepare-search-2
-       (unless (or (re-search-backward "^architecture[ \t\n]+\\w+[ \t\n]+of[ 
\t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
-		   (re-search-forward "^architecture[ \t\n]+\\w+[ \t\n]+of[ 
\t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t))
+       (unless (or (re-search-backward "^architecture[ \t\n\r\f]+\\w+[ 
\t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
+		   (re-search-forward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ 
\t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t))
 	 (error "ERROR:  No architecture found"))
        (let* ((ent-name (match-string 1))
 	      (ent-file-name
@@ -15471,13 +15913,13 @@ component instantiation."
 				(car vhdl-port-list) "\\>") nil t)))
 	   (re-search-forward "^begin\\>" nil)
 	   (beginning-of-line)
-	   (skip-chars-backward " \t\n")
+	   (skip-chars-backward " \t\n\r\f")
 	   (insert "\n\n") (indent-to vhdl-basic-offset)
 	   (vhdl-port-paste-component t))
 	 ;; place component instantiation
 	 (re-search-forward "^end\\>" nil)
 	 (beginning-of-line)
-	 (skip-chars-backward " \t\n")
+	 (skip-chars-backward " \t\n\r\f")
 	 (insert "\n\n") (indent-to vhdl-basic-offset)
 	 (vhdl-port-paste-instance nil t t)
 	 ;; place use clause for used packages
@@ -15486,7 +15928,7 @@ component instantiation."
 	   (when (file-exists-p ent-file-name)
 	     (find-file ent-file-name))
 	   (goto-char (point-min))
-	   (unless (re-search-forward (concat "^entity[ \t\n]+" ent-name "[ 
\t\n]+is\\>") nil t)
+	   (unless (re-search-forward (concat "^entity[ \t\n\r\f]+" ent-name "[ 
\t\n\r\f]+is\\>") nil t)
 	     (error "ERROR:  Entity not found: \"%s\"" ent-name))
 	   (goto-char (match-beginning 0))
 	   (if (and (save-excursion
@@ -15505,8 +15947,8 @@ component instantiation."
   (interactive)
   (save-excursion
     (vhdl-prepare-search-2
-     (unless (or (re-search-backward "^architecture[ \t\n]+\\w+[ \t\n]+of[ 
\t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
-		 (re-search-forward "^architecture[ \t\n]+\\w+[ \t\n]+of[ 
\t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t))
+     (unless (or (re-search-backward "^architecture[ \t\n\r\f]+\\w+[ 
\t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
+		 (re-search-forward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ 
\t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t))
        (error "ERROR:  No architecture found"))
      (let* ((ent-name (match-string 1))
 	    (ent-file-name
@@ -15532,11 +15974,11 @@ component instantiation."
        ;; process all instances
        (goto-char arch-stat-pos)
        (while (re-search-forward
-	       (concat "^[ \t]*\\(\\w+\\)[ \t\n]*:[ \t\n]*\\("
-		       "\\(component[ \t\n]+\\)?\\(\\w+\\)"
-		       "[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*\\(\\(generic\\)\\|port\\)[ 
\t\n]+map\\|"
-		       "\\(\\(entity\\)\\|configuration\\)[ \t\n]+\\(\\(\\w+\\)\\.\\)?
\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?"
-		       "[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*\\(\\(generic\\)\\|port\\)[ 
\t\n]+map\\)[ \t\n]*(") arch-end-pos t)
+	       (concat "^[ \t]*\\(\\w+\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\("
+		       "\\(component[ \t\n\r\f]+\\)?\\(\\w+\\)"
+		       "[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(\\(generic\\)\\|
port\\)[ \t\n\r\f]+map\\|"
+		       "\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\(\\w+\\)\\.\\)?
\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?"
+		       "[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(\\(generic\\)\\|
port\\)[ \t\n\r\f]+map\\)[ \t\n\r\f]*(") arch-end-pos t)
 	 (setq inst-name (match-string-no-properties 1)
 	       comp-name (match-string-no-properties 4)
 	       comp-ent-name (match-string-no-properties 12)
@@ -15548,7 +15990,7 @@ component instantiation."
 	      (when vhdl-use-components-package pack-file-name) t
 	      (save-excursion
 		(goto-char (point-min))
-		(unless (re-search-forward (concat "^\\s-*component[ \t\n]+" comp-name 
"\\>") nil t)
+		(unless (re-search-forward (concat "^\\s-*component[ \t\n\r\f]+" comp-name 
"\\>") nil t)
 		  (error "ERROR:  Component declaration not found: \"%s\"" comp-name))
 		(vhdl-port-copy)))
 	   ;; ... from entity declaration (direct instantiation)
@@ -15559,7 +16001,7 @@ component instantiation."
 	    comp-ent-file-name t
 	    (save-excursion
 	      (goto-char (point-min))
-	      (unless (re-search-forward (concat "^\\s-*entity[ \t\n]+" comp-ent-
name "\\>") nil t)
+	      (unless (re-search-forward (concat "^\\s-*entity[ \t\n\r\f]+" comp-
ent-name "\\>") nil t)
 		(error "ERROR:  Entity declaration not found: \"%s\"" comp-ent-name))
 	      (vhdl-port-copy))))
 	 (vhdl-port-flatten t)
@@ -15571,7 +16013,7 @@ component instantiation."
 	 (when has-generic
 	   ;; process all constants in generic map
 	   (vhdl-forward-syntactic-ws)
-	   (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n]*=>[ \t\n]*\\)?
\\(\\w+\\),?" t)
+	   (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n\r\f]*=>[ \t\n\r\f]*\\)?
\\(\\w+\\),?" t)
 	     (setq constant-name (match-string-no-properties 3))
 	     (setq constant-entry
 		   (cons constant-name
@@ -15589,10 +16031,10 @@ component instantiation."
 	     (unless (match-string 1)
 	       (setq generic-alist (cdr generic-alist)))
 	     (vhdl-forward-syntactic-ws))
-	   (vhdl-re-search-forward "\\<port\\s-+map[ \t\n]*(" nil t))
+	   (vhdl-re-search-forward "\\<port\\s-+map[ \t\n\r\f]*(" nil t))
 	 ;; process all signals in port map
 	 (vhdl-forward-syntactic-ws)
-	 (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n]*=>[ \t\n]*\\)?
\\(\\w+\\),?" t)
+	 (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n\r\f]*=>[ \t\n\r\f]*\\)?
\\(\\w+\\),?" t)
 	   (setq signal-name (match-string-no-properties 3))
 	   (setq signal-entry (cons signal-name
 				    (if (match-string 1)
@@ -15638,7 +16080,7 @@ component instantiation."
        ;; prepare signal insertion
        (vhdl-goto-marker arch-decl-pos)
        (forward-line 1)
-       (re-search-forward "^\\s-*-- Internal signal declarations[ \t\n]*-*\n" 
arch-stat-pos t)
+       (re-search-forward "^\\s-*-- Internal signal declarations[ \t\n\r\f]*-
*\n" arch-stat-pos t)
        (setq signal-pos (point-marker))
        (while (progn (vhdl-forward-syntactic-ws)
 		     (looking-at "signal\\>"))
@@ -15649,10 +16091,10 @@ component instantiation."
        (when (file-exists-p ent-file-name)
 	 (find-file ent-file-name))
        (goto-char (point-min))
-       (unless (re-search-forward (concat "^entity[ \t\n]+" ent-name "[ 
\t\n]+is\\>") nil t)
+       (unless (re-search-forward (concat "^entity[ \t\n\r\f]+" ent-name "[ 
\t\n\r\f]+is\\>") nil t)
 	 (error "ERROR:  Entity not found: \"%s\"" ent-name))
        ;; prepare generic clause insertion
-       (unless (and (re-search-forward "\\(^\\s-*generic[ \t\n]*(\\)\\|
^end\\>" nil t)
+       (unless (and (re-search-forward "\\(^\\s-*generic[ \t\n\r\f]*(\\)\\|
^end\\>" nil t)
 		    (match-string 1))
 	 (goto-char (match-beginning 0))
 	 (indent-to vhdl-basic-offset)
@@ -15670,7 +16112,7 @@ component instantiation."
        (setq generic-beg-pos (point-marker) generic-pos (point-marker)
 	     generic-inst-pos (point-marker) generic-end-pos (point-marker))
        ;; prepare port clause insertion
-       (unless (and (re-search-forward "\\(^\\s-*port[ \t\n]*(\\)\\|^end\\>" 
nil t)
+       (unless (and (re-search-forward "\\(^\\s-*port[ \t\n\r\f]*(\\)\\|
^end\\>" nil t)
 		    (match-string 1))
 	 (goto-char (match-beginning 0))
 	 (indent-to vhdl-basic-offset)
@@ -15894,7 +16336,8 @@ current project/directory."
     (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
+(defun vhdl-compose-configuration-architecture (ent-name arch-name ent-alist
+							 conf-alist inst-alist
 							 &optional insert-conf)
   "Generate block configuration for architecture."
   (let ((margin (current-indentation))
@@ -15970,7 +16413,7 @@ current project/directory."
 		       (nth 3 ent-entry))
 	      (indent-to (+ margin vhdl-basic-offset))
 	      (vhdl-compose-configuration-architecture
-	       (nth 0 ent-entry) arch-name
+	       (nth 0 ent-entry) arch-name ent-alist conf-alist
 	       (nth 3 (aget (nth 3 ent-entry) (downcase arch-name) t))))))
 	;; insert component configuration end
 	(indent-to margin)
@@ -16052,7 +16495,8 @@ current project/directory."
      (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-compose-configuration-architecture
+      ent-name arch-name ent-alist conf-alist inst-alist t)
      (vhdl-insert-keyword "END ") (insert conf-name ";")
      (when conf-file-name
        ;; insert footer and save
@@ -16072,6 +16516,9 @@ current project/directory."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; (using `compile.el')
 
+(defvar vhdl-compile-post-command ""
+  "String appended to compile command after file name.")
+
 (defun vhdl-makefile-name ()
   "Return the Makefile name of the current project or the current compiler if
 no project is defined."
@@ -16226,9 +16673,11 @@ do not print any file names."
 	 (compiler (or (aget vhdl-compiler-alist vhdl-compiler nil)
 		       (error "ERROR:  No such compiler: \"%s\"" vhdl-compiler)))
 	 (command (nth 0 compiler))
-	 (file-name (buffer-file-name))
-	 (options (vhdl-get-compile-options project compiler file-name))
 	 (default-directory (vhdl-compile-directory))
+	 (file-name (if vhdl-compile-absolute-path
+			(buffer-file-name)
+		      (file-relative-name (buffer-file-name))))
+	 (options (vhdl-get-compile-options project compiler file-name))
 	 compilation-process-setup-function)
     (unless (file-directory-p default-directory)
       (error "ERROR:  Compile directory does not exist: \"%s\"" default-
directory))
@@ -16236,14 +16685,18 @@ do not print any file names."
     (when (string-match " " file-name)
       (setq file-name (concat "\"" file-name "\"")))
     ;; print out file name if compiler does not
-    (setq vhdl-compile-file-name (buffer-file-name))
+    (setq vhdl-compile-file-name (if vhdl-compile-absolute-path
+				     (buffer-file-name)
+				   (file-relative-name (buffer-file-name))))
     (when (and (= 0 (nth 1 (nth 10 compiler)))
 	       (= 0 (nth 1 (nth 11 compiler))))
       (setq compilation-process-setup-function 'vhdl-compile-print-file-name))
     ;; run compilation
     (if options
 	(when command
-	  (compile (concat command " " options " " file-name)))
+	  (compile (concat command " " options " " file-name
+			   (unless (equal vhdl-compile-post-command "")
+			     (concat " " vhdl-compile-post-command)))))
       (vhdl-warning "Your project settings tell me not to compile this 
file"))))
 
 (defvar vhdl-make-target "all"
@@ -16551,6 +17004,8 @@ specified by a target."
       (insert "\n\n# Define compilation command and options\n"
 	      "\nCOMPILE = " (nth 0 compiler)
 	      "\nOPTIONS = " (vhdl-get-compile-options project compiler nil)
+	      (if (equal vhdl-compile-post-command "") ""
+		(concat "\nPOST-COMPILE = " vhdl-compile-post-command))
 	      "\n")
       ;; insert library paths
       (setq library-directory
@@ -16580,16 +17035,16 @@ specified by a target."
       (setq unit-list tmp-list)
       ;; insert `make all' rule
       (insert "\n\n\n# Rule for compiling entire design\n"
-	      "\nall :"
-	      " \\\n\t\tlibrary"
+	      "\n" (nth 0 vhdl-makefile-default-targets) " :"
+	      " \\\n\t\t" (nth 2 vhdl-makefile-default-targets)
 	      " \\\n\t\t$(ALL_UNITS)\n")
       ;; insert `make clean' rule
       (insert "\n\n# Rule for cleaning entire design\n"
-	      "\nclean : "
+	      "\n" (nth 1 vhdl-makefile-default-targets) " : "
 	      "\n\t-rm -f $(ALL_UNITS)\n")
       ;; insert `make library' rule
       (insert "\n\n# Rule for creating library directory\n"
-	      "\nlibrary :"
+	      "\n" (nth 2 vhdl-makefile-default-targets) " :"
 	      " \\\n\t\t$(LIBRARY-" work-library ")\n"
 	      "\n$(LIBRARY-" work-library ") :"
 	      "\n\t"
@@ -16597,6 +17052,11 @@ specified by a target."
 	       (cons "\\(.*\\)\n\\(.*\\)" (nth 5 compiler))
 	       (concat "$(LIBRARY-" work-library ")\n" (vhdl-work-library)))
 	      "\n")
+      ;; insert '.PHONY' declaration
+      (insert "\n\n.PHONY : "
+	      (nth 0 vhdl-makefile-default-targets) " "
+	      (nth 1 vhdl-makefile-default-targets) " "
+	      (nth 2 vhdl-makefile-default-targets) "\n")
       ;; insert rule for each library unit
       (insert "\n\n# Rules for compiling single library units and their 
subhierarchy\n")
       (while prim-list
@@ -16611,7 +17071,7 @@ specified by a target."
 	(unless (equal unit-key unit-name)
 	  (insert " \\\n" unit-name))
 	(insert " :"
-		" \\\n\t\tlibrary"
+		" \\\n\t\t" (nth 2 vhdl-makefile-default-targets)
 		" \\\n\t\t$(UNIT-" work-library "-" unit-key ")")
 	(while second-list
 	  (insert " \\\n\t\t$(UNIT-" work-library "-" (car second-list) ")")
@@ -16653,7 +17113,9 @@ specified by a target."
 	(if options
 	    (insert "\n\t$(COMPILE) "
 		    (if (eq options 'default) "$(OPTIONS)" options) " "
-		    (nth 0 rule) "\n")
+		    (nth 0 rule)
+		    (if (equal vhdl-compile-post-command "") ""
+		      " $(POST-COMPILE)") "\n")
 	  (setq tmp-list target-list)
 	  (while target-list
 	    (insert "\n\t@touch $(UNIT-" work-library "-" (car target-list) ")"
@@ -16712,6 +17174,7 @@ specified by a target."
        'vhdl-compiler-alist
        'vhdl-compiler
        'vhdl-compile-use-local-error-regexp
+       'vhdl-makefile-default-targets
        'vhdl-makefile-generation-hook
        'vhdl-default-library
        'vhdl-standard
@@ -16722,6 +17185,7 @@ specified by a target."
        'vhdl-upper-case-enum-values
        'vhdl-upper-case-constants
        'vhdl-use-direct-instantiation
+       'vhdl-array-index-record-field-in-sensitivity-list
        'vhdl-compose-configuration-name
        'vhdl-entity-file-name
        'vhdl-architecture-file-name
@@ -16812,6 +17276,7 @@ specified by a target."
        'vhdl-print-customize-faces
        'vhdl-intelligent-tab
        'vhdl-indent-syntax-based
+       'vhdl-indent-comment-like-next-code-line
        'vhdl-word-completion-case-sensitive
        'vhdl-word-completion-in-minibuffer
        'vhdl-underscore-is-part-of-word
@@ -16851,6 +17316,17 @@ CONFIGURATION DECLARATION GENERATION:
     (See documentation (`C-c C-h') in section on STRUCTURAL COMPOSITION.)
 
 
+Key Bindings
+------------
+
+For Emacs compliance the following key bindings have been changed:
+
+- `C-c c'        ->  `C-c C-c'      `vhdl-comment-uncomment-region'
+- `C-c f'        ->  `C-c C-i C-f'  `vhdl-fontify-buffer'
+- `C-c s'        ->  `C-c C-i C-s'  `vhdl-statistics-buffer'
+- `C-c C-c ...'  ->  `C-c C-m ...'  `vhdl-compose-...'
+
+
 User Options
 ------------
 
@@ -16864,6 +17340,12 @@ User Options
   Specify whether hierarchical configurations should be created.
 `vhdl-compose-configuration-use-subconfiguration': (new)
   Specify whether subconfigurations should be used inside configurations.
+`vhdl-makefile-default-targets': (new)
+  Customize names of Makefile default targets.
+`vhdl-indent-comment-like-next-code-line': (new)
+  Specify whether comment lines are indented like following code line.
+`vhdl-array-index-record-field-in-sensitivity-list': (new)
+  Specify whether to include array indices / record fields in sensitivity 
list.
 ")
 
 
@@ -16872,19 +17354,20 @@ User Options
 Reserved words in VHDL
 ----------------------
 
-VHDL'93 (IEEE Std 1076-1993):
-  `vhdl-93-keywords'      : keywords
-  `vhdl-93-types'         : standardized types
-  `vhdl-93-attributes'    : standardized attributes
-  `vhdl-93-enum-values'   : standardized enumeration values
-  `vhdl-93-functions'     : standardized functions
-  `vhdl-93-packages'      : standardized packages and libraries
+VHDL'93/02 (IEEE Std 1076-1993/2002):
+  `vhdl-02-keywords'      : keywords
+  `vhdl-02-types'         : standardized types
+  `vhdl-02-attributes'    : standardized attributes
+  `vhdl-02-enum-values'   : standardized enumeration values
+  `vhdl-02-functions'     : standardized functions
+  `vhdl-02-packages'      : standardized packages and libraries
 
-VHDL-AMS (IEEE Std 1076.1):
+VHDL-AMS (IEEE Std 1076.1 / 1076.1.1):
   `vhdl-ams-keywords'     : keywords
   `vhdl-ams-types'        : standardized types
   `vhdl-ams-attributes'   : standardized attributes
   `vhdl-ams-enum-values'  : standardized enumeration values
+  `vhdl-ams-constants'    : standardized constants
   `vhdl-ams-functions'    : standardized functions
 
 Math Packages (IEEE Std 1076.2):
-- 
1.7.10





^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33.
  2012-05-23 12:53 [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33 Rüdiger Sonderfeld
@ 2012-05-24  4:33 ` Stefan Monnier
  2012-05-24 17:05   ` Rüdiger Sonderfeld
  0 siblings, 1 reply; 4+ messages in thread
From: Stefan Monnier @ 2012-05-24  4:33 UTC (permalink / raw
  To: Rüdiger Sonderfeld; +Cc: emacs-devel

> http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html#release-notes-3.33

> Among the changes are
> * Support for ghdl (free vhdl compiler). Now default
> * Add/update support for VHDL-AMS packages.
> * Update to VHDL'02 standard
> ...

> I tried to be very careful not to overwrite any non-upstream changes
> that were made to vhdl-mode.

Thanks.  Your patch got corrupted by line-wrapping.  Could you please
resend it, maybe as a mime-attachment?

Also, while I'm here: are you the vhdl-mode maintainer, or are you
simply helping sync the two versions?

Regarding the code I haven't reviewed it, but I noticed that it
advertises C-c C-c for commenting code, whereas it should advertise M-;
instead.

Regarding the second patch you sent: I'm more interested in reducing the
difference between the two versions of vhdl-mode than in making our
version compile without warnings, so I think we're better off without
this patch, unless it's accepted in the upstream version of the code.

Also, while I'm here, do you also sync changes from Emacs's repository
back to the upstream version?  E.g. the use of syntax-propertize-function.


        Stefan



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33.
  2012-05-24  4:33 ` Stefan Monnier
@ 2012-05-24 17:05   ` Rüdiger Sonderfeld
  2012-05-28  3:43     ` Stefan Monnier
  0 siblings, 1 reply; 4+ messages in thread
From: Rüdiger Sonderfeld @ 2012-05-24 17:05 UTC (permalink / raw
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1629 bytes --]

On Thursday 24 May 2012 00:33:18 you wrote:
> Thanks.  Your patch got corrupted by line-wrapping.  Could you please
> resend it, maybe as a mime-attachment?

Oh sorry, I guess I forgot to deactivate wordwrap in KMail. I attached both 
patches to this email.

> Also, while I'm here: are you the vhdl-mode maintainer, or are you
> simply helping sync the two versions?

I'm simply helping to sync the two versions. The vhdl-mode maintainer is Reto 
Zimmermann.

> Regarding the code I haven't reviewed it, but I noticed that it
> advertises C-c C-c for commenting code, whereas it should advertise M-;
> instead.

We could change that downstream. The C-c C-c part is from the current vhdl-
mode release.

> Regarding the second patch you sent: I'm more interested in reducing the
> difference between the two versions of vhdl-mode than in making our
> version compile without warnings, so I think we're better off without
> this patch, unless it's accepted in the upstream version of the code.
>
> Also, while I'm here, do you also sync changes from Emacs's repository
> back to the upstream version?  E.g. the use of syntax-propertize-function.

I tried to send the patch to the vhdl-mode maintainer but he wants to stay 
compatible to all kind of old and forked emacs and that's why the patch is 
probably not acceptable for him.

Maybe we could send at least the documentation fixes upstream. Reducing the 
differences would be useful. It took a lot of time with diff-mode and git-blame 
to figure out what was changed in emacs and what is new in the vhdl-mode 
release.

Regards,
Rüdiger

[-- Attachment #2: 0001-progmodes-vhdl-mode.el-Backported-changes-from-3.33.patch --]
[-- Type: text/x-patch, Size: 141341 bytes --]

From 6da0b3ed7d1794bc640326c6f46cb27ca0275b08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=BCdiger=20Sonderfeld?= <ruediger@c-plusplus.de>
Date: Wed, 23 May 2012 14:28:00 +0200
Subject: [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
To: emacs-devel@gnu.org

See
http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html#release-notes-3.33

Among the changes are
* Support for ghdl (free vhdl compiler). Now default
* Add/update support for VHDL-AMS packages.
* Update to VHDL'02 standard
...

I tried to be very careful not to overwrite any non-upstream changes
that were made to vhdl-mode.

Signed-off-by: Rüdiger Sonderfeld <ruediger@c-plusplus.de>
---
 lisp/progmodes/vhdl-mode.el | 1303 +++++++++++++++++++++++++++++--------------
 1 file changed, 893 insertions(+), 410 deletions(-)

diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9b7ee5d..27215de 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -13,10 +13,10 @@
 ;; filed in the Emacs bug reporting system against this file, a copy
 ;; of the bug report be sent to the maintainer's email address.
 
-(defconst vhdl-version "3.33.6"
+(defconst vhdl-version "3.33.28"
   "VHDL Mode version number.")
 
-(defconst vhdl-time-stamp "2005-08-30"
+(defconst vhdl-time-stamp "2010-09-22"
   "VHDL Mode time stamp for last update.")
 
 ;; This file is part of GNU Emacs.
@@ -72,13 +72,13 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Emacs Versions
 
-;; supported: GNU Emacs 20.X/21.X/22.X, XEmacs 20.X/21.X
-;; tested on: GNU Emacs 20.4, XEmacs 21.1 (marginally)
+;; supported: GNU Emacs 20.X/21.X/22.X,23.X, XEmacs 20.X/21.X
+;; tested on: GNU Emacs 20.4/21.3/22.1,23.X, XEmacs 21.1 (marginally)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Installation
 
-;; Prerequisites:  GNU Emacs 20.X/21.X/22.X, XEmacs 20.X/21.X.
+;; Prerequisites:  GNU Emacs 20.X/21.X/22.X/23.X, XEmacs 20.X/21.X.
 
 ;; Put `vhdl-mode.el' into the `site-lisp' directory of your Emacs installation
 ;; or into an arbitrary directory that is added to the load path by the
@@ -93,7 +93,7 @@
 
 ;; Add the following lines to the `site-start.el' file in the `site-lisp'
 ;; directory of your Emacs installation or to your Emacs start-up file `.emacs'
-;; (not required in Emacs 20.X):
+;; (not required in Emacs 20 and higher):
 
 ;;   (autoload 'vhdl-mode "vhdl-mode" "VHDL Mode" t)
 ;;   (setq auto-mode-alist (cons '("\\.vhdl?\\'" . vhdl-mode) auto-mode-alist))
@@ -184,7 +184,7 @@ Examples:
   \".*\"           \"\"      inserts empty string")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; User variables
+;; User variables (customization options)
 
 (defgroup vhdl nil
   "Customizations for VHDL Mode."
@@ -197,6 +197,21 @@ Examples:
   "Customizations for modes."
   :group 'vhdl)
 
+(defcustom vhdl-electric-mode t
+  "Non-nil enables electrification (automatic template generation).
+If nil, template generators can still be invoked through key bindings and
+menu.  Is indicated in the modeline by \"/e\" after the mode name and can be
+toggled by `\\[vhdl-electric-mode]'."
+  :type 'boolean
+  :group 'vhdl-mode)
+
+(defcustom vhdl-stutter-mode t
+  "Non-nil enables stuttering.
+Is indicated in the modeline by \"/s\" after the mode name and can be toggled
+by `\\[vhdl-stutter-mode]'."
+  :type 'boolean
+  :group 'vhdl-mode)
+
 (defcustom vhdl-indent-tabs-mode nil
   "Non-nil means indentation can insert tabs.
 Overrides local variable `indent-tabs-mode'."
@@ -210,6 +225,17 @@ Overrides local variable `indent-tabs-mode'."
 
 (defcustom vhdl-compiler-alist
   '(
+    ("ADVance MS" "vacom" "-work \\1" "make" "-f \\1"
+     nil "valib \\1; vamap \\2 \\1" "./" "work/" "Makefile" "adms"
+     ("\\s-\\([0-9]+\\):" 0 1 0) ("Compiling file \\(.+\\)" 1)
+     ("ENTI/\\1.vif" "ARCH/\\1-\\2.vif" "CONF/\\1.vif"
+      "PACK/\\1.vif" "BODY/\\1.vif" upcase))
+    ;; Aldec
+    ;; COMP96 ERROR COMP96_0078: "Unknown identifier "Addr_Bits"." "<filename>" 40 30
+    ("Aldec" "vcom" "-93 -work \\1" "make" "-f \\1"
+     nil "vlib \\1; vmap \\2 \\1" "./" "work/" "Makefile" "aldec"
+     (".+?[ \t]+\\(?:ERROR\\)[^:]+:.+?\\(?:.+\"\\(.+?\\)\"[ \t]+\\([0-9]+\\)\\)" 1 2 0) ("" 0)
+     nil)
     ;; Cadence Leapfrog: cv -file test.vhd
     ;; duluth: *E,430 (test.vhd,13): identifier (POSITIV) is not declared
     ("Cadence Leapfrog" "cv" "-work \\1 -file" "make" "-f \\1"
@@ -225,6 +251,12 @@ Overrides local variable `indent-tabs-mode'."
      ("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))
+    ;; ghdl vhdl: ghdl test.vhd
+    ("GHDL" "ghdl" "-i --workdir=\\1 --ieee=synopsys -fexplicit " "make" "-f \\1"
+     nil "mkdir \\1" "./" "work/" "Makefile" "ghdl"
+     ("ghdl_p: \\*E,\\w+ (\\(.+\\),\\([0-9]+\\)|\\([0-9]+\\)):" 1 2 3) ("" 0)
+     ("\\1/entity" "\\2/\\1" "\\1/configuration"
+      "\\1/package" "\\1/body" downcase))
     ;; Ikos Voyager: analyze test.vhd
     ;; analyze test.vhd
     ;; E L4/C5:        this library unit is inaccessible
@@ -236,10 +268,11 @@ Overrides local variable `indent-tabs-mode'."
     ;; ModelSim, Model Technology: vcom test.vhd
     ;; ERROR: test.vhd(14): Unknown identifier: positiv
     ;; WARNING[2]: test.vhd(85): Possible infinite loop
+    ;; ** Warning: [4] ../src/emacsvsim.vhd(43): An abstract ...
     ;; ** Error: adder.vhd(190): Unknown identifier: ctl_numb
     ("ModelSim" "vcom" "-93 -work \\1" "make" "-f \\1"
      nil "vlib \\1; vmap \\2 \\1" "./" "work/" "Makefile" "modelsim"
-     ("\\(ERROR\\|WARNING\\|\\*\\* Error\\|\\*\\* Warning\\)[^:]*: \\(.+\\)(\\([0-9]+\\)):" 2 3 0) ("" 0)
+     ("\\(ERROR\\|WARNING\\|\\*\\* Error\\|\\*\\* Warning\\)[^:]*:\\( *\[[0-9]+\]\\)? \\(.+\\)(\\([0-9]+\\)):" 3 4 0) ("" 0)
      ("\\1/_primary.dat" "\\2/\\1.dat" "\\1/_primary.dat"
       "\\1/_primary.dat" "\\1/body.dat" downcase))
     ;; ProVHDL, Synopsys LEDA: provhdl -w work -f test.vhd
@@ -321,6 +354,12 @@ Overrides local variable `indent-tabs-mode'."
      ("\\*\\*Error: LINE \\([0-9]+\\) \\*\\*\\*" 0 1 0)
      ("^ *Compiling \"\\(.+\\)\" " 1)
      nil)
+    ;; Xilinx XST:
+    ;; ERROR:HDLParsers:164 - "test.vhd" Line 3. parse error
+    ("Xilinx XST" "xflow" "" "make" "-f \\1"
+     nil "mkdir \\1" "./" "work/" "Makefile" "xilinx"
+     ("^ERROR:HDLParsers:[0-9]+ - \"\\(.+\\)\" Line \\([0-9]+\\)\." 1 2 0) ("" 0)
+     nil)
     )
   "List of available VHDL compilers and their properties.
 Each list entry specifies the following items for a compiler:
@@ -428,7 +467,7 @@ NOTE: Activate new error and file message regexps and reflect the new setting
 	 (vhdl-custom-set variable value 'vhdl-update-mode-menu))
   :group 'vhdl-compile)
 
-(defcustom vhdl-compiler "ModelSim"
+(defcustom vhdl-compiler "GHDL"
   "Specifies the VHDL compiler to be used for syntax analysis.
 Select a compiler name from the ones defined in option `vhdl-compiler-alist'."
   :type (let ((alist vhdl-compiler-alist) list)
@@ -450,6 +489,17 @@ NOTE: Activate the new setting by restarting Emacs."
   :type 'boolean
   :group 'vhdl-compile)
 
+(defcustom vhdl-makefile-default-targets '("all" "clean" "library")
+  "List of default target names in Makefiles.
+Automatically generated Makefiles include three default targets to compile
+the entire design, clean the entire design and to create the design library.
+This option allows to change the names of these targets to avoid conflicts
+with other user Makefiles."
+  :type '(list (string :tag "Compile entire design")
+	       (string :tag "Clean entire design  ")
+	       (string :tag "Create design library"))
+  :group 'vhdl-compile)
+
 (defcustom vhdl-makefile-generation-hook nil
   "Functions to run at the end of Makefile generation.
 Allows to insert user specific parts into a Makefile.
@@ -647,11 +697,11 @@ A project setup file can be obtained by exporting a project (see menu).
   :group 'vhdl-port
   :group 'vhdl-compose)
 
-(defcustom vhdl-standard '(87 nil)
+(defcustom vhdl-standard '(93 nil)
   "VHDL standards used.
 Basic standard:
   VHDL'87      : IEEE Std 1076-1987
-  VHDL'93      : IEEE Std 1076-1993
+  VHDL'93/02   : IEEE Std 1076-1993/2002
 Additional standards:
   VHDL-AMS     : IEEE Std 1076.1 (analog-mixed-signal)
   Math packages: IEEE Std 1076.2 (`math_real', `math_complex')
@@ -660,7 +710,7 @@ NOTE: Activate the new setting in a VHDL buffer by using the menu entry
       \"Activate Options\"."
   :type '(list (choice :tag "Basic standard"
 		       (const :tag "VHDL'87" 87)
-		       (const :tag "VHDL'93" 93))
+		       (const :tag "VHDL'93/02" 93))
 	       (set :tag "Additional standards" :indent 2
 		    (const :tag "VHDL-AMS" ams)
 		    (const :tag "Math packages" math)))
@@ -730,6 +780,14 @@ This is done when expanded."
 		 (const :tag "Always" always))
   :group 'vhdl-style)
 
+(defcustom vhdl-array-index-record-field-in-sensitivity-list t
+  "Non-nil means include array indices / record fields in sensitivity list.
+If a signal read in a process is a record field or pointed to by an array
+index, the record field or array index is included with the record name in
+the sensitivity list (e.g. \"in1(0)\", \"in2.f0\").
+Otherwise, only the record name is included (e.g. \"in1\", \"in2\")."
+  :type 'boolean
+  :group 'vhdl-style)
 
 (defgroup vhdl-naming nil
   "Customizations for naming conventions."
@@ -916,7 +974,8 @@ if the header needs to be version controlled.
 The following keywords for template generation are supported:
   <filename>    : replaced by the name of the buffer
   <author>      : replaced by the user name and email address
-                  \(`user-full-name', `mail-host-address', `user-mail-address')
+                  \(`user-full-name',`mail-host-address', `user-mail-address')
+  <authorfull>  : replaced by the user full name (`user-full-name') 
   <login>       : replaced by user login name (`user-login-name')
   <company>     : replaced by contents of option `vhdl-company-name'
   <date>        : replaced by the current date
@@ -999,11 +1058,12 @@ NOTE: Activate the new setting in a VHDL buffer by using the menu entry
   "Customizations for sequential processes."
   :group 'vhdl-template)
 
-(defcustom vhdl-reset-kind 'async
+(defcustom  vhdl-reset-kind 'async
   "Specifies which kind of reset to use in sequential processes."
   :type '(choice (const :tag "None" none)
 		 (const :tag "Synchronous" sync)
-		 (const :tag "Asynchronous" async))
+		 (const :tag "Asynchronous" async)
+		 (const :tag "Query" query))
   :group 'vhdl-sequential-process)
 
 (defcustom vhdl-reset-active-high nil
@@ -1563,22 +1623,25 @@ NOTE: Activate the new setting in a VHDL buffer by re-fontifying it (menu
   :group 'vhdl-highlight)
 
 (defcustom vhdl-special-syntax-alist
-  '(("generic/constant" "\\w+_[cg]" "Gold3" "BurlyWood1")
-    ("type" "\\w+_t" "ForestGreen" "PaleGreen")
-    ("variable" "\\w+_v" "Grey50" "Grey80"))
+  '(("generic/constant" "\\<\\w+_[cg]\\>" "Gold3" "BurlyWood1" nil)
+    ("type" "\\<\\w+_t\\>" "ForestGreen" "PaleGreen" nil)
+    ("variable" "\\<\\w+_v\\>" "Grey50" "Grey80" nil))
   "List of special syntax to be highlighted.
 If option `vhdl-highlight-special-words' is non-nil, words with the specified
 syntax (as regular expression) are highlighted in the corresponding color.
 
   Name         : string of words and spaces
   Regexp       : regular expression describing word syntax
-                  (e.g. \"\\\w+_c\" matches word with suffix \"_c\")
+                 (e.g. \"\\\\=\<\\\w+_c\\\\=\>\" matches word with suffix \"_c\")
+                 expression must start with \"\\\\=\<\" and end with \"\\\\=\>\"
+                 if only whole words should be matched (no substrings)
   Color (light): foreground color for light background
                  (matching color examples: Gold3, Grey50, LimeGreen, Tomato,
                  LightSeaGreen, DodgerBlue, Gold, PaleVioletRed)
   Color (dark) : foreground color for dark background
                  (matching color examples: BurlyWood1, Grey80, Green, Coral,
                  AquaMarine2, LightSkyBlue1, Yellow, PaleVioletRed1)
+  In comments  : If non-nil, words are also highlighted inside comments
 
 Can be used for visual support of naming conventions, such as highlighting
 different kinds of signals (e.g. \"Clk50\", \"Rst_n\") or objects (e.g.
@@ -1593,7 +1656,8 @@ NOTE: Activate a changed regexp in a VHDL buffer by re-fontifying it (menu
 		       (string :tag "Name         ")
 		       (regexp :tag "Regexp       " "\\w+_")
 		       (string :tag "Color (light)")
-		       (string :tag "Color (dark) ")))
+		       (string :tag "Color (dark) ")
+		       (boolean :tag "In comments  ")))
   :set (lambda (variable value)
 	 (vhdl-custom-set variable value 'vhdl-font-lock-init))
   :group 'vhdl-highlight)
@@ -1794,6 +1858,14 @@ useful in large files where syntax-based indentation gets very slow."
   :type 'boolean
   :group 'vhdl-misc)
 
+(defcustom vhdl-indent-comment-like-next-code-line t
+  "*Non-nil means comment lines are indented like the following code line.
+Otherwise, comment lines are indented like the preceding code line.
+Indenting comment lines like the following code line gives nicer indentation
+when comments precede the code that they refer to."
+  :type 'boolean
+  :group 'vhdl-misc)
+
 (defcustom vhdl-word-completion-case-sensitive nil
   "Non-nil means word completion using `TAB' is case sensitive.
 That is, `TAB' completes words that start with the same letters and case.
@@ -1833,6 +1905,7 @@ NOTE: Activate the new setting in a VHDL buffer by using the menu entry
   (custom-add-to-group 'vhdl-related 'paren-showing 'custom-group))
 (custom-add-to-group 'vhdl-related 'ps-print 'custom-group)
 (custom-add-to-group 'vhdl-related 'speedbar 'custom-group)
+(custom-add-to-group 'vhdl-related 'comment-style 'custom-variable)
 (custom-add-to-group 'vhdl-related 'line-number-mode 'custom-variable)
 (unless (featurep 'xemacs)
   (custom-add-to-group 'vhdl-related 'transient-mark-mode 'custom-variable))
@@ -1841,6 +1914,15 @@ NOTE: Activate the new setting in a VHDL buffer by using the menu entry
 (custom-add-to-group 'vhdl-related 'user-mail-address 'custom-variable)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Hidden user variables
+
+(defvar vhdl-compile-absolute-path nil
+  "If non-nil, use absolute instead of relative path for compiled files.")
+
+(defvar vhdl-comment-display-line-char ?-
+  "Character to use in comment display line.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Internal variables
 
 (defvar vhdl-menu-max-size 20
@@ -3270,9 +3352,6 @@ STRING are replaced by `-' and substrings are converted to lower case."
       (list
        (append
 	'("Package")
-	(when (vhdl-standard-p 'math)
-	  '(["math_complex"	vhdl-template-package-math-complex t]
-	    ["math_real"	vhdl-template-package-math-real t]))
 	'(["numeric_bit"	vhdl-template-package-numeric-bit t]
 	  ["numeric_std"	vhdl-template-package-numeric-std t]
 	  ["std_logic_1164"	vhdl-template-package-std-logic-1164 t]
@@ -3283,8 +3362,22 @@ STRING are replaced by `-' and substrings are converted to lower case."
 	  ["std_logic_unsigned"	vhdl-template-package-std-logic-unsigned t]
 	  ["std_logic_misc"	vhdl-template-package-std-logic-misc t]
 	  ["std_logic_textio"	vhdl-template-package-std-logic-textio t]
-	  "--"
-	  ["Insert Package..."	vhdl-template-insert-package
+	  "--")
+	(when (vhdl-standard-p 'ams)
+	  '(["fundamental_constants" vhdl-template-package-fundamental-constants t]
+	    ["material_constants" vhdl-template-package-material-constants t]
+	    ["energy_systems"	vhdl-template-package-energy-systems t]
+	    ["electrical_systems" vhdl-template-package-electrical-systems t]
+	    ["mechanical_systems" vhdl-template-package-mechanical-systems t]
+	    ["radiant_systems"	vhdl-template-package-radiant-systems t]
+	    ["thermal_systems"	vhdl-template-package-thermal-systems t]
+	    ["fluidic_systems"	vhdl-template-package-fluidic-systems t]
+	    "--"))
+	(when (vhdl-standard-p 'math)
+	  '(["math_complex"	vhdl-template-package-math-complex t]
+	    ["math_real"	vhdl-template-package-math-real t]
+	    "--"))
+	'(["Insert Package..."	vhdl-template-insert-package
 				:keys "C-c C-i C-p"])))
       '(("Directive"
 	 ["translate_on"	vhdl-template-directive-translate-on t]
@@ -3417,6 +3510,7 @@ STRING are replaced by `-' and substrings are converted to lower case."
      ["Buffer"			vhdl-beautify-buffer t])
     ("Fix"
      ["Generic/Port Clause"	vhdl-fix-clause t]
+     ["Generic/Port Clause Buffer" vhdl-fix-clause t]
      "--"
      ["Case Region"		vhdl-fix-case-region (mark)]
      ["Case Buffer"		vhdl-fix-case-buffer t]
@@ -3449,11 +3543,13 @@ STRING are replaced by `-' and substrings are converted to lower case."
      ("Mode"
       ["Electric Mode"
        (progn (customize-set-variable 'vhdl-electric-mode
-				      (not vhdl-electric-mode)))
+				      (not vhdl-electric-mode))
+	      (vhdl-mode-line-update))
        :style toggle :selected vhdl-electric-mode :keys "C-c C-m C-e"]
       ["Stutter Mode"
        (progn (customize-set-variable 'vhdl-stutter-mode
-				      (not vhdl-stutter-mode)))
+				      (not vhdl-stutter-mode))
+	      (vhdl-mode-line-update))
        :style toggle :selected vhdl-stutter-mode :keys "C-c C-m C-s"]
       ["Indent Tabs Mode"
        (progn (customize-set-variable 'vhdl-indent-tabs-mode
@@ -3515,6 +3611,8 @@ STRING are replaced by `-' and substrings are converted to lower case."
        (customize-set-variable 'vhdl-compile-use-local-error-regexp
 			       (not vhdl-compile-use-local-error-regexp))
        :style toggle :selected vhdl-compile-use-local-error-regexp]
+      ["Makefile Default Targets..."
+       (customize-option 'vhdl-makefile-default-targets) t]
       ["Makefile Generation Hook..."
        (customize-option 'vhdl-makefile-generation-hook) t]
       ["Default Library Name" (customize-option 'vhdl-default-library) t]
@@ -3527,7 +3625,7 @@ STRING are replaced by `-' and substrings are converted to lower case."
 				       (list '87 (cadr vhdl-standard)))
 	       (vhdl-activate-customizations))
 	:style radio :selected (eq '87 (car vhdl-standard))]
-       ["VHDL'93"
+       ["VHDL'93/02"
 	(progn (customize-set-variable 'vhdl-standard
 				       (list '93 (cadr vhdl-standard)))
 	       (vhdl-activate-customizations))
@@ -3580,6 +3678,10 @@ STRING are replaced by `-' and substrings are converted to lower case."
        ["Always"
 	(customize-set-variable 'vhdl-use-direct-instantiation 'always)
 	:style radio :selected (eq 'always vhdl-use-direct-instantiation)])
+      ["Include Array Index and Record Field in Sensitivity List"
+       (customize-set-variable 'vhdl-array-index-record-field-in-sensitivity-list
+			       (not vhdl-array-index-record-field-in-sensitivity-list))
+       :style toggle :selected vhdl-array-index-record-field-in-sensitivity-list]
       "--"
       ["Customize Group..." (customize-group 'vhdl-style) t])
      ("Naming"
@@ -3676,7 +3778,10 @@ STRING are replaced by `-' and substrings are converted to lower case."
 	 :style radio :selected (eq 'sync vhdl-reset-kind)]
 	["Asynchronous"
 	 (customize-set-variable 'vhdl-reset-kind 'async)
-	 :style radio :selected (eq 'async vhdl-reset-kind)])
+	 :style radio :selected (eq 'async vhdl-reset-kind)]
+	["Query"
+	 (customize-set-variable 'vhdl-reset-kind 'query)
+	 :style radio :selected (eq 'query vhdl-reset-kind)])
        ["Reset is Active High"
 	(customize-set-variable 'vhdl-reset-active-high
 				(not vhdl-reset-active-high))
@@ -3966,6 +4071,10 @@ STRING are replaced by `-' and substrings are converted to lower case."
        (customize-set-variable 'vhdl-indent-syntax-based
 			       (not vhdl-indent-syntax-based))
        :style toggle :selected vhdl-indent-syntax-based]
+      ["Indent Comments Like Next Code Line"
+       (customize-set-variable 'vhdl-indent-comment-like-next-code-line
+			       (not vhdl-indent-comment-like-next-code-line))
+       :style toggle :selected vhdl-indent-comment-like-next-code-line]
       ["Word Completion is Case Sensitive"
        (customize-set-variable 'vhdl-word-completion-case-sensitive
 			       (not vhdl-word-completion-case-sensitive))
@@ -4009,7 +4118,7 @@ STRING are replaced by `-' and substrings are converted to lower case."
      "^\\s-*\\(\\(\\(impure\\|pure\\)\\s-+\\|\\)function\\|procedure\\)\\s-+\\(\"?\\(\\w\\|\\s_\\)+\"?\\)"
      4)
     ("Instance"
-     "^\\s-*\\(\\(\\w\\|\\s_\\)+\\s-*:\\(\\s-\\|\n\\)*\\(\\w\\|\\s_\\)+\\)\\(\\s-\\|\n\\)+\\(generic\\|port\\)\\s-+map\\>"
+     "^\\s-*\\(\\(\\w\\|\\s_\\)+\\s-*:\\(\\s-\\|\n\\)*\\(entity\\s-+\\(\\w\\|\\s_\\)+\\.\\)?\\(\\w\\|\\s_\\)+\\)\\(\\s-\\|\n\\)+\\(generic\\|port\\)\\s-+map\\>"
      1)
     ("Component"
      "^\\s-*\\(component\\)\\s-+\\(\\(\\w\\|\\s_\\)+\\)"
@@ -4193,8 +4302,10 @@ Usage:
                    with a comment in between.
         `--CR'     comments out code on that line.  Re-hitting CR comments
                    out following lines.
-        `C-c c'    comments out a region if not commented out,
-                   uncomments a region if already commented out.
+        `C-c C-c'  comments out a region if not commented out,
+                   uncomments a region if already commented out.  Option
+                   `comment-style' defines where the comment characters
+                   should be placed (beginning of line, indent, etc.).
 
       You are prompted for comments after object definitions (i.e. signals,
     variables, constants, ports) and after subprogram and process
@@ -4215,7 +4326,8 @@ Usage:
     `TAB' indents a line if at the beginning of the line.  The amount of
     indentation is specified by option `vhdl-basic-offset'.  `C-c C-i C-l'
     always indents the current line (is bound to `TAB' if option
-    `vhdl-intelligent-tab' is nil).
+    `vhdl-intelligent-tab' is nil).  If a region is active, `TAB' indents
+    the entire region.
 
       Indentation can be done for a group of lines (`C-c C-i C-g'), a region
     \(`M-C-\\') or the entire buffer (menu).  Argument and port lists are
@@ -4229,6 +4341,10 @@ Usage:
       Syntax-based indentation can be very slow in large files.  Option
     `vhdl-indent-syntax-based' allows to use faster but simpler indentation.
 
+      Option `vhdl-indent-comment-like-next-code-line' controls whether
+    comment lines are indented like the preceding or like the following code
+    line.
+
 
   ALIGNMENT:
     The alignment functions align operators, keywords, and inline comments
@@ -4357,12 +4473,12 @@ Usage:
 
 
   STRUCTURAL COMPOSITION:
-    Enables simple structural composition.  `C-c C-c C-n' creates a skeleton
+    Enables simple structural composition.  `C-c C-m 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,
+    \(`C-c C-m 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:
+    and ports (`C-c C-m 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
@@ -4383,25 +4499,25 @@ Usage:
 
       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
+    an entire directory or project (`C-c C-m 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.
+      Configuration declarations can automatically be generated either from
+    the menu (`C-c C-m 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.
 
@@ -4433,11 +4549,13 @@ Usage:
 
       The Makefile's default target \"all\" compiles the entire design, the
     target \"clean\" removes it and the target \"library\" creates the
-    library directory if not existent.  The Makefile also includes a target
-    for each primary library unit which allows selective compilation of this
-    unit, its secondary units and its subhierarchy (example: compilation of
-    a design specified by a configuration).  User specific parts can be
-    inserted into a Makefile with option `vhdl-makefile-generation-hook'.
+    library directory if not existent.  These target names can be customized
+    by option `vhdl-makefile-default-targets'.  The Makefile also includes a
+    target for each primary library unit which allows selective compilation
+    of this unit, its secondary units and its subhierarchy (example:
+    compilation of a design specified by a configuration).  User specific
+    parts can be inserted into a Makefile with option
+    `vhdl-makefile-generation-hook'.
 
     Limitations:
       - Only library units and dependencies within the current library are
@@ -4483,7 +4601,7 @@ Usage:
 
   VHDL STANDARDS:
     The VHDL standards to be used are specified in option `vhdl-standard'.
-    Available standards are: VHDL'87/'93, VHDL-AMS, and Math Packages.
+    Available standards are: VHDL'87/'93(02), VHDL-AMS, and Math Packages.
 
 
   KEYWORD CASE:
@@ -4559,6 +4677,9 @@ Usage:
         - Out parameters of procedures are considered to be read.
       Use option `vhdl-entity-file-name' to specify the entity file name
       \(used to obtain the port names).
+      Use option `vhdl-array-index-record-field-in-sensitivity-list' to
+      specify whether to include array indices and  record fields in
+      sensitivity lists.
 
 
   CODE FIXING:
@@ -4632,16 +4753,17 @@ releases.  You are kindly invited to participate in beta testing.  Subscribe
 to above mailing lists by sending an email to <reto@gnu.org>.
 
 VHDL Mode is officially distributed at
-URL `http://opensource.ethz.ch/emacs/vhdl-mode.html'
+http://www.iis.ee.ethz.ch/~zimmi/emacs/vhdl-mode.html
 where the latest version can be found.
 
 
 Known problems:
 ---------------
 
-- Indentation bug in simultaneous if- and case-statements (VHDL-AMS).
 - XEmacs: Incorrect start-up when automatically opening speedbar.
 - XEmacs: Indentation in XEmacs 21.4 (and higher).
+- Indentation incorrect for new 'postponed' VHDL keyword.
+- Indentation incorrect for 'protected body' construct.
 
 
                                                 The VHDL Mode Authors
@@ -4764,7 +4886,7 @@ Key bindings:
 ;;; Keywords and standardized words
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defconst vhdl-93-keywords
+(defconst vhdl-02-keywords
   '(
     "abs" "access" "after" "alias" "all" "and" "architecture" "array"
     "assert" "attribute"
@@ -4779,7 +4901,7 @@ Key bindings:
     "map" "mod"
     "nand" "new" "next" "nor" "not" "null"
     "of" "on" "open" "or" "others" "out"
-    "package" "port" "postponed" "procedure" "process" "pure"
+    "package" "port" "postponed" "procedure" "process" "protected" "pure"
     "range" "record" "register" "reject" "rem" "report" "return"
     "rol" "ror"
     "select" "severity" "shared" "signal" "sla" "sll" "sra" "srl" "subtype"
@@ -4789,7 +4911,7 @@ Key bindings:
     "wait" "when" "while" "with"
     "xnor" "xor"
     )
-  "List of VHDL'93 keywords.")
+  "List of VHDL'02 keywords.")
 
 (defconst vhdl-ams-keywords
   '(
@@ -4822,7 +4944,7 @@ Key bindings:
     )
   "List of Verilog keywords as candidate for additional reserved words.")
 
-(defconst vhdl-93-types
+(defconst vhdl-02-types
   '(
     "boolean" "bit" "bit_vector" "character" "severity_level" "integer"
     "real" "time" "natural" "positive" "string" "line" "text" "side"
@@ -4830,25 +4952,72 @@ Key bindings:
     "std_logic" "std_logic_vector"
     "std_ulogic" "std_ulogic_vector"
     )
-  "List of VHDL'93 standardized types.")
+  "List of VHDL'02 standardized types.")
 
 (defconst vhdl-ams-types
+  ;; standards: IEEE Std 1076.1-2007, IEEE Std 1076.1.1-2004
   '(
+    ;; package `standard'
     "domain_type" "real_vector"
-    ;; from `nature_pkg' package
-    "voltage" "current" "electrical" "position" "velocity" "force"
-    "mechanical_vf" "mechanical_pf" "rotvel" "torque" "rotational"
-    "pressure" "flowrate" "fluid"
-  )
+    ;; package `energy_systems'
+    "energy" "power" "periodicity" "real_across" "real_through" "unspecified"
+    "unspecified_vector" "energy_vector" "power_vector" "periodicity_vector"
+    "real_across_vector" "real_through_vector"
+    ;; package `electrical_systems'
+    "voltage" "current" "charge" "resistance" "conductance" "capacitance"
+    "mmf" "electric_flux" "electric_flux_density" "electric_field_strength"
+    "magnetic_flux" "magnetic_flux_density" "magnetic_field_strength"
+    "inductance" "reluctance" "electrical" "electrical_vector" "magnetic"
+    "magnetic_vector" "voltage_vector" "current_vector" "mmf_vector"
+    "magnetic_flux_vector" "charge_vector" "resistance_vector"
+    "conductance_vector" "capacitance_vector" "electric_flux_vector"
+    "electric_flux_density_vector" "electric_field_strength_vector"
+    "magnetic_flux_density_vector" "magnetic_field_strength_vector"
+    "inductance_vector" "reluctance_vector" "ground"
+    ;; package `mechanical_systems'
+    "displacement" "force" "velocity" "acceleration" "mass" "stiffness"
+    "damping" "momentum" "angle" "torque" "angular_velocity"
+    "angular_acceleration" "moment_inertia" "angular_momentum"
+    "angular_stiffness" "angular_damping" "translational"
+    "translational_vector" "translational_velocity"
+    "translational_velocity_vector" "rotational" "rotational_vector"
+    "rotational_velocity" "rotational_velocity_vector" "displacement_vector"
+    "force_vector" "velocity_vector" "force_velocity_vector" "angle_vector"
+    "torque_vector" "angular_velocity_vector" "torque_velocity_vector"
+    "acceleration_vector" "mass_vector" "stiffness_vector" "damping_vector"
+    "momentum_vector" "angular_acceleration_vector" "moment_inertia_vector"
+    "angular_momentum_vector" "angular_stiffness_vector"
+    "angular_damping_vector" "anchor" "translational_v_ref"
+    "rotational_v_ref" "translational_v" "rotational_v"
+    ;; package `radiant_systems'
+    "illuminance" "luminous_flux" "luminous_intensity" "irradiance" "radiant"
+    "radiant_vector" "luminous_intensity_vector" "luminous_flux_vector"
+    "illuminance_vector" "irradiance_vector"
+    ;; package `thermal_systems'
+    "temperature" "heat_flow" "thermal_capacitance" "thermal_resistance"
+    "thermal_conductance" "thermal" "thermal_vector" "temperature_vector"
+    "heat_flow_vector" "thermal_capacitance_vector"
+    "thermal_resistance_vector" "thermal_conductance_vector"
+    ;; package `fluidic_systems'
+    "pressure" "vflow_rate" "mass_flow_rate" "volume" "density" "viscosity"
+    "fresistance" "fconductance" "fcapacitance" "inertance" "cfresistance"
+    "cfcapacitance" "cfinertance" "cfconductance" "fluidic" "fluidic_vector"
+    "compressible_fluidic" "compressible_fluidic_vector" "pressure_vector"
+    "vflow_rate_vector" "mass_flow_rate_vector" "volume_vector"
+    "density_vector" "viscosity_vector" "fresistance_vector"
+    "fconductance_vector" "fcapacitance_vector" "inertance_vector"
+    "cfresistance_vector" "cfconductance_vector" "cfcapacitance_vector"
+    "cfinertance_vector"
+    )
   "List of VHDL-AMS standardized types.")
 
 (defconst vhdl-math-types
   '(
-    "complex" "complex_polar"
+    "complex" "complex_polar" "positive_real" "principal_value" 
     )
   "List of Math Packages standardized types.")
 
-(defconst vhdl-93-attributes
+(defconst vhdl-02-attributes
   '(
     "base" "left" "right" "high" "low" "pos" "val" "succ"
     "pred" "leftof" "rightof" "range" "reverse_range"
@@ -4858,7 +5027,7 @@ Key bindings:
     "simple_name" "instance_name" "path_name"
     "foreign"
     )
-  "List of VHDL'93 standardized attributes.")
+  "List of VHDL'02 standardized attributes.")
 
 (defconst vhdl-ams-attributes
   '(
@@ -4869,7 +5038,7 @@ Key bindings:
     )
   "List of VHDL-AMS standardized attributes.")
 
-(defconst vhdl-93-enum-values
+(defconst vhdl-02-enum-values
   '(
     "true" "false"
     "note" "warning" "error" "failure"
@@ -4878,7 +5047,7 @@ Key bindings:
     "fs" "ps" "ns" "us" "ms" "sec" "min" "hr"
     "right" "left"
     )
-  "List of VHDL'93 standardized enumeration values.")
+  "List of VHDL'02 standardized enumeration values.")
 
 (defconst vhdl-ams-enum-values
   '(
@@ -4888,22 +5057,38 @@ Key bindings:
     )
   "List of VHDL-AMS standardized enumeration values.")
 
+(defconst vhdl-ams-constants
+  ;; standard: IEEE Std 1076.1.1-2004
+  '(
+    ;; package `fundamental_constants'
+    "phys_q" "phys_eps0" "phys_mu0" "phys_k" "phys_gravity" "phys_ctok"
+    "phys_c" "phys_h" "phys_h_over_2_pi" "yocto" "zepto" "atto" "femto"
+    "pico" "nano" "micro" "milli" "centi" "deci" "deka" "hecto" "kilo" "mega"
+    "giga" "tera" "peta" "exa" "zetta" "yotta" "deca"
+    ;; package `material_constants'
+    "phys_eps_si" "phys_eps_sio2" "phys_e_si" "phys_e_sio2" "phys_e_poly"
+    "phys_nu_si" "phys_nu_poly" "phys_rho_poly" "phys_rho_sio2"
+    "ambient_temperature" "ambient_pressure" "ambient_illuminance"    
+    )
+  "List of VHDL-AMS standardized constants.")
+
 (defconst vhdl-math-constants
+  ;; standard: IEEE Std 1076.2-1996
   '(
-    "math_e" "math_1_over_e"
-    "math_pi" "math_two_pi" "math_1_over_pi"
-    "math_half_pi" "math_q_pi" "math_3_half_pi"
-    "math_log_of_2" "math_log_of_10" "math_log2_of_e" "math_log10_of_e"
-    "math_sqrt2" "math_sqrt1_2" "math_sqrt_pi"
-    "math_deg_to_rad" "math_rad_to_deg"
-    "cbase_1" "cbase_j" "czero"
+    "math_1_over_e" "math_1_over_pi" "math_1_over_sqrt_2" "math_2_pi"
+    "math_3_pi_over_2" "math_cbase_1" "math_cbase_j" "math_czero"
+    "math_deg_to_rad" "math_e" "math_log10_of_e" "math_log2_of_e"
+    "math_log_of_10" "math_log_of_2" "math_pi" "math_pi_over_2"
+    "math_pi_over_3" "math_pi_over_4" "math_rad_to_deg" "math_sqrt_2"
+    "math_sqrt_pi"
     )
   "List of Math Packages standardized constants.")
 
-(defconst vhdl-93-functions
+(defconst vhdl-02-functions
   '(
     "now" "resolved" "rising_edge" "falling_edge"
-    "read" "readline" "write" "writeline" "endfile"
+    "read" "readline" "hread" "oread" "write" "writeline" "hwrite" "owrite"
+    "endfile"
     "resize" "is_X" "std_match"
     "shift_left" "shift_right" "rotate_left" "rotate_right"
     "to_unsigned" "to_signed" "to_integer"
@@ -4913,25 +5098,27 @@ Key bindings:
     "shl" "shr" "ext" "sxt"
     "deallocate"
     )
-  "List of VHDL'93 standardized functions.")
+  "List of VHDL'02 standardized functions.")
 
 (defconst vhdl-ams-functions
   '(
+    ;; package `standard'
     "frequency"
     )
   "List of VHDL-AMS standardized functions.")
 
 (defconst vhdl-math-functions
+  ;; standard: IEEE Std 1076.2-1996
   '(
-    "sign" "ceil" "floor" "round" "trunc" "fmax" "fmin" "uniform"
-    "sqrt" "cbrt" "exp" "log"
-    "sin" "cos" "tan" "arcsin" "arccos" "arctan"
-    "sinh" "cosh" "tanh" "arcsinh" "arccosh" "arctanh"
-    "cmplx" "complex_to_polar" "polar_to_complex" "arg" "conj"
+    "arccos" "arccosh" "arcsin" "arcsinh" "arctan" "arctanh" "arg"
+    "cbrt" "ceil" "cmplx" "complex_to_polar" "conj" "cos" "cosh" "exp"
+    "floor" "get_principal_value" "log" "log10" "log2" "polar_to_complex"
+    "realmax" "realmin" "round" "sign" "sin" "sinh" "sqrt"
+    "tan" "tanh" "trunc" "uniform"
     )
   "List of Math Packages standardized functions.")
 
-(defconst vhdl-93-packages
+(defconst vhdl-02-packages
   '(
     "std_logic_1164" "numeric_std" "numeric_bit"
     "standard" "textio"
@@ -4939,12 +5126,13 @@ Key bindings:
     "std_logic_misc" "std_logic_textio"
     "ieee" "std" "work"
     )
-  "List of VHDL'93 standardized packages and libraries.")
+  "List of VHDL'02 standardized packages and libraries.")
 
 (defconst vhdl-ams-packages
   '(
-    ;; from `nature_pkg' package
-    "nature_pkg"
+    "fundamental_constants" "material_constants" "energy_systems"
+    "electrical_systems" "mechanical_systems" "radiant_systems"
+    "thermal_systems" "fluidic_systems"
     )
   "List of VHDL-AMS standardized packages and libraries.")
 
@@ -4990,6 +5178,9 @@ Key bindings:
 (defvar vhdl-enum-values-regexp nil
   "Regexp for VHDL standardized enumeration values.")
 
+(defvar vhdl-constants-regexp nil
+  "Regexp for VHDL standardized constants.")
+
 (defvar vhdl-functions-regexp nil
   "Regexp for VHDL standardized functions.")
 
@@ -5002,29 +5193,50 @@ Key bindings:
 (defvar vhdl-directive-keywords-regexp nil
   "Regexp for compiler directive keywords.")
 
+(defun vhdl-upcase-list (condition list)
+  "Upcase all elements in LIST based on CONDITION."
+  (when condition
+    (let ((tmp-list list))
+      (while tmp-list
+	(setcar tmp-list (upcase (car tmp-list)))
+	(setq tmp-list (cdr tmp-list)))))
+  list)
+
 (defun vhdl-words-init ()
   "Initialize reserved words."
   (setq vhdl-keywords
-	(append vhdl-93-keywords
-		(when (vhdl-standard-p 'ams) vhdl-ams-keywords)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-keywords)
+	 (append vhdl-02-keywords
+		 (when (vhdl-standard-p 'ams) vhdl-ams-keywords))))
   (setq vhdl-types
-	(append vhdl-93-types
-		(when (vhdl-standard-p 'ams) vhdl-ams-types)
-		(when (vhdl-standard-p 'math) vhdl-math-types)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-types)
+	 (append vhdl-02-types
+		 (when (vhdl-standard-p 'ams) vhdl-ams-types)
+		 (when (vhdl-standard-p 'math) vhdl-math-types))))
   (setq vhdl-attributes
-	(append vhdl-93-attributes
-		(when (vhdl-standard-p 'ams) vhdl-ams-attributes)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-attributes)
+	 (append vhdl-02-attributes
+		 (when (vhdl-standard-p 'ams) vhdl-ams-attributes))))
   (setq vhdl-enum-values
-	(append vhdl-93-enum-values
-		(when (vhdl-standard-p 'ams) vhdl-ams-enum-values)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-enum-values)
+	 (append vhdl-02-enum-values
+		 (when (vhdl-standard-p 'ams) vhdl-ams-enum-values))))
   (setq vhdl-constants
-	(append (when (vhdl-standard-p 'math) vhdl-math-constants)))
+	(vhdl-upcase-list
+	 (and vhdl-highlight-case-sensitive vhdl-upper-case-constants)
+	 (append (when (vhdl-standard-p 'ams) vhdl-ams-constants)
+		 (when (vhdl-standard-p 'math) vhdl-math-constants)
+		 '(""))))
   (setq vhdl-functions
-	(append vhdl-93-functions
+	(append vhdl-02-functions
 		(when (vhdl-standard-p 'ams) vhdl-ams-functions)
 		(when (vhdl-standard-p 'math) vhdl-math-functions)))
   (setq vhdl-packages
-	(append vhdl-93-packages
+	(append vhdl-02-packages
 		(when (vhdl-standard-p 'ams) vhdl-ams-packages)
 		(when (vhdl-standard-p 'math) vhdl-math-packages)))
   (setq vhdl-reserved-words
@@ -5039,6 +5251,8 @@ Key bindings:
 	(concat "\\<\\(" (regexp-opt vhdl-attributes) "\\)\\>"))
   (setq vhdl-enum-values-regexp
 	(concat "\\<\\(" (regexp-opt vhdl-enum-values) "\\)\\>"))
+  (setq vhdl-constants-regexp
+	(concat "\\<\\(" (regexp-opt vhdl-constants) "\\)\\>"))
   (setq vhdl-functions-regexp
 	(concat "\\<\\(" (regexp-opt vhdl-functions) "\\)\\>"))
   (setq vhdl-packages-regexp
@@ -5090,7 +5304,7 @@ We cannot use just `word' syntax class since `_' cannot be in word
 class.  Putting underscore in word class breaks forward word movement
 behavior that users are familiar with.")
 
-(defconst vhdl-case-header-key "case[( \t\n][^;=>]+[) \t\n]is"
+(defconst vhdl-case-header-key "case[( \t\n\r\f][^;=>]+[) \t\n\r\f]is"
   "Regexp describing a case statement header key.")
 
 (defconst vhdl-label-key
@@ -5318,6 +5532,17 @@ the offset is simply returned."
   "Check if point is in a string."
   (eq (vhdl-in-literal) 'string))
 
+(defun vhdl-in-quote-p ()
+  "Check if point is in a quote ('x')."
+  (or (and (> (point) (point-min))
+	   (< (1+ (point)) (point-max))
+	   (= (char-before (point)) ?\')
+	   (= (char-after (1+ (point))) ?\'))
+      (and (> (1- (point)) (point-min))
+	   (< (point) (point-max))
+	   (= (char-before (1- (point))) ?\')
+	   (= (char-after (point)) ?\'))))
+
 (defun vhdl-in-literal ()
   "Determine if point is in a VHDL literal."
   (save-excursion
@@ -5328,6 +5553,12 @@ the offset is simply returned."
        ((vhdl-beginning-of-macro) 'pound)
        (t nil)))))
 
+(defun vhdl-in-extended-identifier-p ()
+  "Determine if point is inside extended identifier (delimited by '\')."
+  (save-match-data
+    (and (save-excursion (re-search-backward "\\\\" (vhdl-point 'bol) t))
+	 (save-excursion (re-search-forward "\\\\" (vhdl-point 'eol) t)))))
+
 (defun vhdl-forward-comment (&optional direction)
   "Skip all comments (including whitespace).  Skip backwards if DIRECTION is
 negative, skip forward otherwise."
@@ -5335,20 +5566,30 @@ negative, skip forward otherwise."
   (if (and direction (< direction 0))
       ;; skip backwards
       (progn
-	(skip-chars-backward " \t\n")
+	(skip-chars-backward " \t\n\r\f")
 	(while (re-search-backward "^[^\"-]*\\(\\(-?\"[^\"]*\"\\|-[^\"-]\\)[^\"-]*\\)*\\(--\\)" (vhdl-point 'bol) t)
 	  (goto-char (match-beginning 3))
-	  (skip-chars-backward " \t\n")))
+	  (skip-chars-backward " \t\n\r\f")))
     ;; skip forwards
-    (skip-chars-forward " \t\n")
+    (skip-chars-forward " \t\n\r\f")
     (while (looking-at "--.*")
       (goto-char (match-end 0))
-      (skip-chars-forward " \t\n"))))
+      (skip-chars-forward " \t\n\r\f"))))
 
 ;; XEmacs hack: work around buggy `forward-comment' in XEmacs 21.4+
 (unless (and (featurep 'xemacs) (string< "21.2" emacs-version))
   (defalias 'vhdl-forward-comment 'forward-comment))
 
+(defun vhdl-back-to-indentation ()
+  "Move point to the first non-whitespace character on this line."
+  (interactive)
+  (beginning-of-line 1)
+  (skip-syntax-forward " " (vhdl-point 'eol)))
+
+;; XEmacs hack: work around old `back-to-indentation' in XEmacs
+(when (featurep 'xemacs)
+  (defalias 'back-to-indentation 'vhdl-back-to-indentation))
+
 ;; This is the best we can do in Win-Emacs.
 (defun vhdl-win-il (&optional lim)
   "Determine if point is in a VHDL literal."
@@ -5513,7 +5754,7 @@ that point, else nil."
   (and
    (save-excursion
      (forward-sexp)
-     (skip-chars-forward " \t\n")
+     (skip-chars-forward " \t\n\r\f")
      (not (looking-at "is\\b[^_]")))
    (save-excursion
      (backward-sexp)
@@ -5553,12 +5794,12 @@ corresponding \"begin\" keyword, else return nil."
 	   "is"))))
 
 (defconst vhdl-begin-fwd-re
-  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|process\\|procedural\\|units\\|record\\|for\\)\\b\\([^_]\\|\\'\\)"
+  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|process\\|procedural\\(\\s-+body\\)?\\|units\\|use\\|record\\|protected\\(\\s-+body\\)?\\|for\\)\\b\\([^_]\\|\\'\\)"
   "A regular expression for searching forward that matches all known
 \"begin\" keywords.")
 
 (defconst vhdl-begin-bwd-re
-  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|process\\|procedural\\|units\\|record\\|for\\)\\b[^_]"
+  "\\b\\(is\\|begin\\|block\\|component\\|generate\\|then\\|else\\|loop\\|process\\|procedural\\(\\s-+body\\)?\\|units\\|use\\|record\\|protected\\(\\s-+body\\)?\\|for\\)\\b[^_]"
   "A regular expression for searching backward that matches all known
 \"begin\" keywords.")
 
@@ -5591,21 +5832,21 @@ keyword."
 	   (and (/= (following-char) ?\;)
 		(not (looking-at "is\\|begin\\|process\\|procedural\\|block")))))
     t)
-   ;; "begin", "then":
-   ((looking-at "be\\|t")
+   ;; "begin", "then", "use":
+   ((looking-at "be\\|t\\|use")
     t)
    ;; "else":
    ((and (looking-at "e")
 	 ;; make sure that the "else" isn't inside a
 	 ;; conditional signal assignment.
 	 (save-excursion
-	   (re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
+	   (vhdl-re-search-backward ";\\|\\bwhen\\b[^_]" lim 'move)
 	   (or (eq (following-char) ?\;)
 	       (eq (point) lim))))
     t)
    ;; "block", "generate", "loop", "process", "procedural",
-   ;; "units", "record":
-   ((and (looking-at "bl\\|[glpur]")
+   ;; "units", "record", "protected body":
+   ((and (looking-at "block\\|generate\\|loop\\|process\\|procedural\\|protected\\(\\s-+body\\)?\\|units\\|record")
 	 (save-excursion
 	   (backward-sexp)
 	   (not (looking-at "end\\s-+\\w"))))
@@ -5633,7 +5874,7 @@ keyword."
   (cond
    ((looking-at "is\\|block\\|generate\\|process\\|procedural")
     "begin")
-   ((looking-at "then")
+   ((looking-at "then\\|use")
     "<else>")
    (t
     "end")))
@@ -5648,6 +5889,9 @@ Assumes that the caller will make sure that we are not in the middle
 of an identifier that just happens to contain a \"begin\" keyword."
   (save-excursion
     (and (looking-at vhdl-begin-fwd-re)
+	 (or (not (looking-at "\\<use\\>"))
+	     (save-excursion (back-to-indentation)
+			     (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 	 (/= (preceding-char) ?_)
 	 (not (vhdl-in-literal))
 	 (vhdl-begin-p lim)
@@ -5670,8 +5914,8 @@ of an identifier that just happens to contain a \"begin\" keyword."
 			      (vhdl-beginning-of-statement-1 lim)
 			      (vhdl-backward-skip-label lim)
 			      (vhdl-first-word (point)))))))
-	  ;; "component", "units", "record":
-	  ((looking-at "[cur]")
+	  ;; "component", "units", "record", "protected body":
+	  ((looking-at "component\\|units\\|protected\\(\\s-+body\\)?\\|record")
 	   ;; The first end found will close the block
 	   (vector "end" nil))
 	  ;; "block", "process", "procedural":
@@ -5683,8 +5927,8 @@ of an identifier that just happens to contain a \"begin\" keyword."
 			 (vhdl-backward-skip-label lim)
 			 (vhdl-first-word (point))))))
 	  ;; "then":
-	  ((looking-at "t")
-	   (vector "elsif\\|else\\|end\\s-+if"
+	  ((looking-at "t\\|use")
+	   (vector "elsif\\|else\\|end\\s-+\\(if\\|use\\)"
 		   (and (vhdl-last-word (point))
 			(or (vhdl-first-word (point))
 			    (save-excursion
@@ -5730,25 +5974,25 @@ of an identifier that just happens to contain an \"end\" keyword."
 	       (vhdl-end-p lim))
 	  (if (looking-at "el")
 	      ;; "else", "elsif":
-	      (vector "if\\|elsif" (vhdl-first-word (point)) "then" nil)
+	      (vector "if\\|elsif" (vhdl-first-word (point)) "then\\|use" nil)
 	    ;; "end ...":
 	    (setq pos (point))
 	    (forward-sexp)
-	    (skip-chars-forward " \t\n")
+	    (skip-chars-forward " \t\n\r\f")
 	    (cond
 	     ;; "end if":
 	     ((looking-at "if\\b[^_]")
 	      (vector "else\\|elsif\\|if"
 		      (vhdl-first-word pos)
-		      "else\\|then" nil))
+		      "else\\|then\\|use" nil))
 	     ;; "end component":
 	     ((looking-at "component\\b[^_]")
 	      (vector (buffer-substring (match-beginning 1)
 					(match-end 1))
 		      (vhdl-first-word pos)
 		      nil nil))
-	     ;; "end units", "end record":
-	     ((looking-at "\\(units\\|record\\)\\b[^_]")
+	     ;; "end units", "end record", "end protected":
+	     ((looking-at "\\(units\\|record\\|protected\\(\\s-+body\\)?\\)\\b[^_]")
 	      (vector (buffer-substring (match-beginning 1)
 					(match-end 1))
 		      (vhdl-first-word pos)
@@ -5805,38 +6049,38 @@ of an identifier that just happens to contain an \"end\" keyword."
     (cond ((looking-at "block\\|process\\|procedural")
 	   (if (save-excursion
 		 (forward-sexp)
-		 (skip-chars-forward " \t\n")
+		 (skip-chars-forward " \t\n\r\f")
 		 (= (following-char) ?\())
 	       (forward-sexp 2)
 	     (forward-sexp))
-	   (when (looking-at "[ \t\n]*is")
+	   (when (looking-at "[ \t\n\r\f]*is")
 	     (goto-char (match-end 0)))
 	   (point))
 	  ((looking-at "component")
 	   (forward-sexp 2)
-	   (when (looking-at "[ \t\n]*is")
+	   (when (looking-at "[ \t\n\r\f]*is")
 	     (goto-char (match-end 0)))
 	   (point))
 	  ((looking-at "for")
 	   (forward-sexp 2)
-	   (skip-chars-forward " \t\n")
+	   (skip-chars-forward " \t\n\r\f")
 	   (while (looking-at "[,:(]")
 	     (forward-sexp)
-	     (skip-chars-forward " \t\n"))
+	     (skip-chars-forward " \t\n\r\f"))
 	   (point))
 	  (t nil)
 	  )))
 
 (defconst vhdl-trailer-re
-  "\\b\\(is\\|then\\|generate\\|loop\\|record\\)\\b[^_]")
+  "\\b\\(is\\|then\\|generate\\|loop\\|record\\|protected\\(\\s-+body\\)?\\|use\\)\\b[^_]")
 
 (defconst vhdl-statement-fwd-re
-  "\\b\\(if\\|for\\|while\\)\\b\\([^_]\\|\\'\\)"
+  "\\b\\(if\\|for\\|while\\|loop\\)\\b\\([^_]\\|\\'\\)"
   "A regular expression for searching forward that matches all known
 \"statement\" keywords.")
 
 (defconst vhdl-statement-bwd-re
-  "\\b\\(if\\|for\\|while\\)\\b[^_]"
+  "\\b\\(if\\|for\\|while\\|loop\\)\\b[^_]"
   "A regular expression for searching backward that matches all known
 \"statement\" keywords.")
 
@@ -5852,7 +6096,7 @@ in the middle of an identifier that just happens to contain a
 	 ;; Make sure it's the start of a parameter specification.
 	 (save-excursion
 	   (forward-sexp 2)
-	   (skip-chars-forward " \t\n")
+	   (skip-chars-forward " \t\n\r\f")
 	   (looking-at "in\\b[^_]"))
 	 ;; Make sure it's not an "end for".
 	 (save-excursion
@@ -5871,7 +6115,7 @@ in the middle of an identifier that just happens to contain a
     t)
    ))
 
-(defconst vhdl-case-alternative-re "when[( \t\n][^;=>]+=>"
+(defconst vhdl-case-alternative-re "when[( \t\n\r\f][^;=>]+=>"
   "Regexp describing a case statement alternative key.")
 
 (defun vhdl-case-alternative-p (&optional lim)
@@ -5908,6 +6152,9 @@ contain a \"when\" keyword."
 	(cond
 	 ;; "begin" keyword:
 	 ((and (looking-at vhdl-begin-fwd-re)
+	       (or (not (looking-at "\\<use\\>"))
+		   (save-excursion (back-to-indentation)
+				   (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 	       (/= (preceding-char) ?_)
 	       (vhdl-begin-p lim))
 	  (setq foundp 'begin))
@@ -5931,7 +6178,7 @@ With COUNT, do it that many times."
     (save-excursion
       (while (> count 0)
 	;; skip whitespace
-	(skip-chars-forward " \t\n")
+	(skip-chars-forward " \t\n\r\f")
 	;; Check for an unbalanced "end" keyword
 	(if (and (looking-at vhdl-end-fwd-re)
 		 (/= (preceding-char) ?_)
@@ -6007,6 +6254,10 @@ searches."
 	    nil
 	  (backward-sexp)
 	  (if (and (looking-at vhdl-begin-fwd-re)
+		   (or (not (looking-at "\\<use\\>"))
+		       (save-excursion
+			 (back-to-indentation)
+			 (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 		   (/= (preceding-char) ?_)
 		   (not (vhdl-in-literal))
 		   (vhdl-begin-p lim))
@@ -6278,7 +6529,7 @@ search, and an argument indicating an interactive call."
   (re-search-forward vhdl-e-o-s-re))
 
 (defconst vhdl-b-o-s-re
-  (concat ";\\|\(\\|\)\\|\\bwhen\\b[^_]\\|"
+  (concat ";[^_]\\|\([^_]\\|\)[^_]\\|\\bwhen\\b[^_]\\|"
 	  vhdl-begin-bwd-re "\\|" vhdl-statement-bwd-re))
 
 (defun vhdl-beginning-of-statement-1 (&optional lim)
@@ -6299,7 +6550,7 @@ statement if already at the beginning of one."
     (while (and (not donep)
 		(not (bobp))
 		;; look backwards for a statement boundary
-		(re-search-backward vhdl-b-o-s-re lim 'move))
+		(progn (forward-char) (re-search-backward vhdl-b-o-s-re lim 'move)))
       (if (or (= (preceding-char) ?_)
 	      (vhdl-in-literal))
 	  (backward-char)
@@ -6319,13 +6570,17 @@ statement if already at the beginning of one."
 		     (vhdl-forward-syntactic-ws here)
 		     (setq donep t))))
 	 ;; If we are looking at a semicolon, then stop
-	 ((eq (following-char) ?\;)
+	 ((and (eq (following-char) ?\;) (not (vhdl-in-quote-p)))
 	  (progn
 	    (forward-char)
 	    (vhdl-forward-syntactic-ws here)
 	    (setq donep t)))
 	 ;; If we are looking at a "begin", then stop
 	 ((and (looking-at vhdl-begin-fwd-re)
+	       (or (not (looking-at "\\<use\\>"))
+		   (save-excursion
+		     (back-to-indentation)
+		     (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 	       (/= (preceding-char) ?_)
 	       (vhdl-begin-p nil))
 	  ;; If it's a leader "begin", then find the
@@ -6576,6 +6831,10 @@ is not moved."
 	(setq begin-after-ip (and
 			      (not literal)
 			      (looking-at vhdl-begin-fwd-re)
+			      (or (not (looking-at "\\<use\\>"))
+				  (save-excursion
+				    (back-to-indentation)
+				    (looking-at "\\(\\w+\\s-*:\\s-*\\)?\\<\\(case\\|elsif\\|if\\)\\>")))
 			      (vhdl-begin-p)))
 	(setq end-after-ip (and
 			    (not literal)
@@ -6624,7 +6883,8 @@ is not moved."
 	   ((progn
 	      (vhdl-backward-syntactic-ws lim)
 	      (or (bobp)
-		  (= (preceding-char) ?\;)))
+		  (and (= (preceding-char) ?\;)
+		       (not (vhdl-in-quote-p)))))
 	    (vhdl-add-syntax 'statement placeholder))
 	   ;; CASE 2D: we are looking at a top-level statement-cont
 	   (t
@@ -6662,6 +6922,10 @@ is not moved."
 		 (save-excursion
 		   (vhdl-beginning-of-statement-1 containing-sexp)
 		   (skip-chars-backward " \t(")
+		   (while (and (= (preceding-char) ?\;)
+			       (not (vhdl-in-quote-p)))
+		     (vhdl-beginning-of-statement-1 containing-sexp)
+		     (skip-chars-backward " \t("))
 		   (<= (point) containing-sexp)))
 	    (goto-char containing-sexp)
 	    (vhdl-add-syntax 'arglist-cont-nonempty (vhdl-point 'boi)))
@@ -6730,7 +6994,7 @@ is not moved."
 		     (save-excursion
 		       (goto-char new)
 		       (eq new (progn (back-to-indentation) (point)))))
-		(setq placeholder new)))
+		(setq placeholder new)))	
 	  (vhdl-add-syntax 'statement-cont placeholder)
 	  (if begin-after-ip
 	      (vhdl-add-syntax 'block-open)))
@@ -6891,7 +7155,7 @@ only-lines."
     (let* ((relpos (cdr langelem))
 	   (assignp (save-excursion
 		     (goto-char (vhdl-point 'boi))
-		     (and (re-search-forward "\\(<\\|:\\)="
+		     (and (re-search-forward "\\(<\\|:\\|=\\)="
 					     (vhdl-point 'eol) t)
 			  (- (point) (vhdl-point 'boi)))))
 	   (curcol (progn
@@ -6900,7 +7164,7 @@ only-lines."
 	   foundp)
       (while (and (not foundp)
 		  (< (point) (vhdl-point 'eol)))
-	(re-search-forward "\\(<\\|:\\)=\\|(" (vhdl-point 'eol) 'move)
+	(re-search-forward "\\(<\\|:\\|=\\)=\\|(" (vhdl-point 'eol) 'move)
 	(if (vhdl-in-literal)
 	    (forward-char)
 	  (if (= (preceding-char) ?\()
@@ -7001,7 +7265,8 @@ character is a space."
   (interactive)
   (if (and (= (preceding-char) ? ) (vhdl-in-comment-p))
       (indent-new-comment-line)
-    (when (and (>= (preceding-char) ?a) (<= (preceding-char) ?z))
+    (when (and (>= (preceding-char) ?a) (<= (preceding-char) ?z)
+	       (not (vhdl-in-comment-p)))
       (vhdl-fix-case-word -1))
     (newline-and-indent)))
 
@@ -7011,6 +7276,7 @@ indentation change."
   (interactive)
   (let* ((syntax (and vhdl-indent-syntax-based (vhdl-get-syntactic-context)))
 	 (pos (- (point-max) (point)))
+	 (is-comment nil)
 	 (indent
 	  (if syntax
 	      ;; indent syntax-based
@@ -7018,6 +7284,15 @@ indentation change."
 		       (>= (vhdl-get-offset (car syntax)) comment-column))
 		  ;; special case: comments at or right of comment-column
 		  (vhdl-get-offset (car syntax))
+		;; align comments like following code line
+		(when vhdl-indent-comment-like-next-code-line
+		  (save-excursion
+		    (while (eq (caar syntax) 'comment)
+		      (setq is-comment t)
+		      (beginning-of-line 2)
+		      (setq syntax (vhdl-get-syntactic-context)))))
+		(when is-comment
+		  (setq syntax (cons (cons 'comment nil) syntax)))
 		(apply '+ (mapcar 'vhdl-get-offset syntax)))
 	    ;; indent like previous nonblank line
 	    (save-excursion (beginning-of-line)
@@ -7026,10 +7301,13 @@ indentation change."
 	 (shift-amt  (- indent (current-indentation))))
     (and vhdl-echo-syntactic-information-p
 	 (message "syntax: %s, indent= %d" syntax indent))
-    (unless (zerop shift-amt)
-      (delete-region (vhdl-point 'bol) (vhdl-point 'boi))
-      (beginning-of-line)
-      (indent-to indent))
+    (let ((has-formfeed
+	   (save-excursion (beginning-of-line) (looking-at "\\s-*\f"))))
+      (when (or (not (zerop shift-amt)) has-formfeed)
+	(delete-region (vhdl-point 'bol) (vhdl-point 'boi))
+	(beginning-of-line)
+	(when has-formfeed (insert "\f"))
+	(indent-to indent)))
     (if (< (point) (vhdl-point 'boi))
 	(back-to-indentation)
       ;; If initial point was within line's indentation, position after
@@ -7040,7 +7318,7 @@ indentation change."
     (vhdl-update-progress-info "Indenting" (vhdl-current-line))
     shift-amt))
 
-(defun vhdl-indent-region (beg end column)
+(defun vhdl-indent-region (beg end &optional column)
   "Indent region as VHDL code.
 Adds progress reporting to `indent-region'."
   (interactive "r\nP")
@@ -7055,7 +7333,7 @@ Adds progress reporting to `indent-region'."
   "Indent whole buffer as VHDL code.
 Calls `indent-region' for whole buffer and adds progress reporting."
   (interactive)
-  (vhdl-indent-region (point-min) (point-max) nil))
+  (vhdl-indent-region (point-min) (point-max)))
 
 (defun vhdl-indent-group ()
   "Indent group of lines between empty lines."
@@ -7068,7 +7346,7 @@ Calls `indent-region' for whole buffer and adds progress reporting."
 	       (if (re-search-forward vhdl-align-group-separate nil t)
 		   (point-marker)
 		 (point-max-marker)))))
-    (vhdl-indent-region beg end nil)))
+    (vhdl-indent-region beg end)))
 
 (defun vhdl-indent-sexp (&optional endpos)
   "Indent each line of the list starting just after point.
@@ -7131,21 +7409,23 @@ ENDPOS is encountered."
 (defconst vhdl-align-alist
   '(
     ;; after some keywords
-    (vhdl-mode "^\\s-*\\(constant\\|quantity\\|signal\\|subtype\\|terminal\\|type\\|variable\\)[ \t]"
-	       "^\\s-*\\(constant\\|quantity\\|signal\\|subtype\\|terminal\\|type\\|variable\\)\\([ \t]+\\)" 2)
+    (vhdl-mode "^\\s-*\\(across\\|constant\\|quantity\\|signal\\|subtype\\|terminal\\|through\\|type\\|variable\\)[ \t]"
+	       "^\\s-*\\(across\\|constant\\|quantity\\|signal\\|subtype\\|terminal\\|through\\|type\\|variable\\)\\([ \t]+\\)" 2)
     ;; before ':'
     (vhdl-mode ":[^=]" "\\([ \t]*\\):[^=]")
     ;; after direction specifications
     (vhdl-mode ":[ \t]*\\(in\\|out\\|inout\\|buffer\\|\\)\\>"
 	       ":[ \t]*\\(in\\|out\\|inout\\|buffer\\|\\)\\([ \t]+\\)" 2)
     ;; before "==", ":=", "=>", and "<="
-    (vhdl-mode "[<:=]=" "\\([ \t]*\\)[<:=]=" 1) ; since "<= ... =>" can occur
+    (vhdl-mode "[<:=]=" "\\([ \t]*\\)\\??[<:=]=" 1) ; since "<= ... =>" can occur
     (vhdl-mode "=>" "\\([ \t]*\\)=>" 1)
-    (vhdl-mode "[<:=]=" "\\([ \t]*\\)[<:=]=" 1) ; since "=> ... <=" can occur
+    (vhdl-mode "[<:=]=" "\\([ \t]*\\)\\??[<:=]=" 1) ; since "=> ... <=" can occur
     ;; before some keywords
     (vhdl-mode "[ \t]after\\>" "[^ \t]\\([ \t]+\\)after\\>" 1)
     (vhdl-mode "[ \t]when\\>" "[^ \t]\\([ \t]+\\)when\\>" 1)
     (vhdl-mode "[ \t]else\\>" "[^ \t]\\([ \t]+\\)else\\>" 1)
+    (vhdl-mode "[ \t]across\\>" "[^ \t]\\([ \t]+\\)across\\>" 1)
+    (vhdl-mode "[ \t]through\\>" "[^ \t]\\([ \t]+\\)through\\>" 1)
     ;; before "=>" since "when/else ... =>" can occur
     (vhdl-mode "=>" "\\([ \t]*\\)=>" 1)
     )
@@ -7195,7 +7475,7 @@ parentheses."
 	(forward-list)
 	(setq end (point))
 	(goto-char (1+ beg))
-	(skip-chars-forward " \t\n")
+	(skip-chars-forward " \t\n\r\f")
 	(setq beg (point))))
     ;; run FUNCTION
     (if beg
@@ -7280,8 +7560,14 @@ the token in MATCH."
 	    bol (setq begin (progn (beginning-of-line) (point))))
       (while (< bol end)
 	(save-excursion
-	  (when (and (re-search-forward match eol t)
-		     (not (vhdl-in-literal)))
+	  (when (and (vhdl-re-search-forward match eol t)
+		     (save-excursion
+		       (goto-char (match-beginning 0))
+		       (forward-char)
+		       (and (not (vhdl-in-literal))
+			    (not (vhdl-in-quote-p))
+			    (not (vhdl-in-extended-identifier-p))))
+		     (not (looking-at "\\s-*$")))
 	    (setq distance (- (match-beginning substr) bol))
 	    (when (> distance max)
 	      (setq max distance))))
@@ -7295,8 +7581,16 @@ the token in MATCH."
       (goto-char (setq bol begin))
       (setq eol (point-at-eol))
       (while (> lines 0)
-  	(when (and (re-search-forward match eol t)
-		   (not (vhdl-in-literal)))
+  	(when (and (vhdl-re-search-forward match eol t)
+		   (save-excursion
+		     (goto-char (match-beginning 0))
+		     (forward-char)
+		     (and (not (vhdl-in-literal))
+			  (not (vhdl-in-quote-p))
+			  (not (vhdl-in-extended-identifier-p))))
+		   (not (looking-at "\\s-*$"))
+		   (> (match-beginning 0)  ; not if at boi
+		      (save-excursion (back-to-indentation) (point))))
 	  (setq width (- (match-end substr) (match-beginning substr)))
 	  (setq distance (- (match-beginning substr) bol))
 	  (goto-char (match-beginning substr))
@@ -7449,7 +7743,7 @@ the token in MATCH."
        ;; search for comment start positions and lengths
        (while (< (point) end)
 	 (when (and (not (looking-at "^\\s-*\\(begin\\|end\\)\\>"))
-		    (looking-at "^\\(.*[^ \t\n-]+\\)\\s-*\\(--.*\\)$")
+		    (looking-at "^\\(.*[^ \t\n\r\f-]+\\)\\s-*\\(--.*\\)$")
 		    (not (save-excursion (goto-char (match-beginning 2))
 					 (vhdl-in-literal))))
 	   (setq start (+ (- (match-end 1) (match-beginning 1)) spacing))
@@ -7474,7 +7768,7 @@ the token in MATCH."
        (while (< (point) end)
 	 (setq cur-start nil)
 	 (when (and (not (looking-at "^\\s-*\\(begin\\|end\\)\\>"))
-		    (or (and (looking-at "^\\(.*[^ \t\n-]+\\)\\(\\s-*\\)\\(--.*\\)$")
+		    (or (and (looking-at "^\\(.*[^ \t\n\r\f-]+\\)\\(\\s-*\\)\\(--.*\\)$")
 			     (not (save-excursion
 				    (goto-char (match-beginning 3))
 				    (vhdl-in-literal))))
@@ -7582,32 +7876,35 @@ end of line, do nothing in comments and strings."
     (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)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\|\\\\[^\\\n]*[\\\n]\\)\\|\\(\\s-*\\([,;]\\)\\)" end t)
       (if (match-string 1)
 	  (goto-char (match-end 1))
-	(replace-match "\\3 " nil nil nil 3)))
+	(replace-match "\\3 " nil nil nil 2)))
     ;; have no space after `('
     (goto-char beg)
-    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\)\\|\\((\\)\\s-+" end t)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\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)
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\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))
+    (while (re-search-forward "\\(--.*\n\\|\"[^\"\n]*[\"\n]\\|\'.\'\\|\\\\[^\\\n]*[\\\n]\\)\\|\\(\\([^/:<>=]\\)\\(:\\|\\??=\\|\\??<<\\|\\??>>\\|\\??<\\|\\??>\\|:=\\|\\??<=\\|\\??>=\\|=>\\|\\??/=\\|\\?\\?\\)\\([^=>]\\|$\\)\\)" end t)
+      (if (or (match-string 1)
+	      (<= (match-beginning 0)  ; not if at boi
+		 (save-excursion (back-to-indentation) (point))))
+	  (goto-char (match-end 0))
 	(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))
+	       (and (looking-at "--.*") (re-search-forward "--.*" end t))
 	       (and (looking-at "\"") (re-search-forward "\"[^\"\n]*[\"\n]" end t))
 	       (and (looking-at "\\s-+$") (re-search-forward "\\s-+$" end t)
 		    (progn (replace-match "" nil nil) t))
@@ -7618,6 +7915,7 @@ end of line, do nothing in comments and strings."
 		    (progn (replace-match "  " nil nil) t))
 	       (and (looking-at "\\s-+") (re-search-forward "\\s-+" end t)
 		    (progn (replace-match " " nil nil) t))
+	       (and (looking-at "-") (re-search-forward "-" end t))
 ;	       (re-search-forward "[^ \t-]+" end t))))
 	       (re-search-forward "[^ \t\"-]+" end t))))
   (unless no-message (message "Fixing up whitespace...done")))
@@ -7639,7 +7937,7 @@ case fixing to a region.  Calls functions `vhdl-indent-buffer',
 `vhdl-fix-case-buffer'."
   (interactive "r")
   (setq end (save-excursion (goto-char end) (point-marker)))
-  (vhdl-indent-region beg end nil)
+  (vhdl-indent-region beg end)
   (let ((vhdl-align-groups t))
     (vhdl-align-region beg end))
   (vhdl-fix-case-region beg end))
@@ -7720,7 +8018,7 @@ buffer."
     (vhdl-prepare-search-2
      (end-of-line)
      ;; look whether in process
-     (if (not (and (re-search-backward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?\\(process\\|end\\s-+process\\)\\>" nil t)
+     (if (not (and (re-search-backward "^\\s-*\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(process\\|end\\s-+process\\)\\>" nil t)
 		   (equal (upcase (match-string 2)) "PROCESS")
 		   (save-excursion (re-search-forward "^\\s-*end\\s-+process\\>" nil t))))
 	 (error "ERROR:  Not within a process")
@@ -7735,7 +8033,7 @@ buffer."
     (vhdl-prepare-search-2
      (goto-char (point-min))
      (message "Updating sensitivity lists...")
-     (while (re-search-forward "^\\s-*\\(\\w+[ \t\n]*:[ \t\n]*\\)?process\\>" nil t)
+     (while (re-search-forward "^\\s-*\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?process\\>" nil t)
        (goto-char (match-beginning 0))
        (condition-case nil (vhdl-update-sensitivity-list) (error "")))
      (message "Updating sensitivity lists...done"))))
@@ -7744,9 +8042,13 @@ buffer."
   "Update sensitivity list."
     (let ((proc-beg (point))
 	  (proc-end (re-search-forward "^\\s-*end\\s-+process\\>" nil t))
-	  (proc-mid (re-search-backward "^\\s-*begin\\>" nil t))
+	  (proc-mid (vhdl-re-search-backward
+		     "\\(\\(\\<begin\\>\\)\\|^\\s-*process\\>\\)" nil t))
 	  seq-region-list)
       (cond
+       ;; error if 'begin' keyword missing
+       ((not (match-string 2))
+	(error "ERROR:  No 'begin' keyword found"))
        ;; search for wait statement (no sensitivity list allowed)
        ((progn (goto-char proc-mid)
 	       (vhdl-re-search-forward "\\<wait\\>" proc-end t))
@@ -7780,19 +8082,19 @@ buffer."
 		;; case expression
 		((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)
+		;; parameter list of procedure call, array index
+		((and (re-search-forward "^\\s-*\\(\\w\\|\\.\\)+[ \t\n\r\f]*(" proc-end t)
 		      (1- (point)))
 		 (progn (backward-char) (forward-sexp)
 			(while (looking-at "(") (forward-sexp)) (point)))))
-	     name read-list sens-list signal-list
+	     name field read-list sens-list signal-list
 	     sens-beg sens-end beg end margin)
 	  ;; scan for signals in old sensitivity list
 	  (goto-char proc-beg)
 	  (re-search-forward "\\<process\\>" proc-mid t)
-	  (if (not (looking-at "[ \t\n]*("))
+	  (if (not (looking-at "[ \t\n\r\f]*("))
 	      (setq sens-beg (point))
-	    (setq sens-beg (re-search-forward "\\([ \t\n]*\\)([ \t\n]*" nil t))
+	    (setq sens-beg (re-search-forward "\\([ \t\n\r\f]*\\)([ \t\n\r\f]*" nil t))
 	    (goto-char (match-end 1))
 	    (forward-sexp)
 	    (setq sens-end (1- (point)))
@@ -7825,15 +8127,17 @@ buffer."
 					     (< (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)
+		(while (vhdl-re-search-forward "[^'\".]\\<\\([a-zA-Z]\\w*\\)\\(\\(\\.\\w+\\|[ \t\n\r\f]*([^)]*)\\)*\\)[ \t\n\r\f]*\\('\\(\\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))
+		  (when vhdl-array-index-record-field-in-sensitivity-list
+		    (setq field (match-string 2)))
+		  (when (and (not (match-string 6)) ; not when formal parameter
+			     (not (and (match-string 5) ; not event attribute
+				       (not (member (downcase (match-string 5))
 						    '("event" "last_event" "transaction")))))
 			     (member (downcase name) signal-list))
-		    (unless (member-ignore-case name read-list)
-		      (setq read-list (cons name read-list))))
+		    (unless (member-ignore-case (concat name field) read-list)
+		      (setq read-list (cons (concat name field) read-list))))
 		  (goto-char (match-end 1)))))
 	    (setq scan-regions-list (cdr scan-regions-list)))
 	  ;; update sensitivity list
@@ -7879,17 +8183,17 @@ buffer."
 	 (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]*("
+	   (when (setq beg (vhdl-re-search-forward
+			    "\\<port[ \t\n\r\f]*("
 			    (save-excursion
 			      (re-search-forward "^end\\>" nil t)) t))
 	     (setq end (save-excursion
 			 (backward-char) (forward-sexp) (point)))
 	     (vhdl-forward-syntactic-ws)
 	     (while (< (point) end)
-	       (when (looking-at "signal[ \t\n]+")
+	       (when (looking-at "signal[ \t\n\r\f]+")
 		 (goto-char (match-end 0)))
-	       (while (looking-at "\\(\\w+\\)[ \t\n,]+")
+	       (while (looking-at "\\(\\w+\\)[ \t\n\r\f,]+")
 		 (setq signal-list
 		       (cons (downcase (match-string 1)) signal-list))
 		 (goto-char (match-end 0))
@@ -7908,12 +8212,12 @@ buffer."
 	   (when (= 0 (nth 0 (parse-partial-sexp beg (point))))
 	     (if (match-string 2)
 		 ;; scan signal name
-		 (while (looking-at "[ \t\n,]+\\(\\w+\\)")
+		 (while (looking-at "[ \t\n\r\f,]+\\(\\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+\\)")
+	       (when (and (looking-at "[ \t\n\r\f]+\\(\\w+\\)[^;]*\\<is[ \t\n\r\f]+\\(\\w+\\)")
 			  (member (downcase (match-string 2)) signal-list))
 		 (setq signal-list
 		       (cons (downcase (match-string 1)) signal-list))
@@ -7950,6 +8254,18 @@ buffer."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Generic/port clause fixing
 
+(defun vhdl-fix-clause-buffer ()
+  "Fix all generic/port clauses in current buffer."
+  (interactive)
+  (save-excursion
+    (vhdl-prepare-search-2
+     (goto-char (point-min))
+     (message "Fixing generic/port clauses...")
+     (while (re-search-forward "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(" nil t)
+       (goto-char (match-end 0))
+       (condition-case nil (vhdl-fix-clause) (error "")))
+     (message "Fixing generic/port clauses...done"))))
+
 (defun vhdl-fix-clause ()
   "Fix closing parenthesis within generic/port clause."
   (interactive)
@@ -7957,13 +8273,14 @@ buffer."
     (vhdl-prepare-search-2
      (let ((pos (point))
 	   beg end)
-       (if (not (re-search-backward "^\\s-*\\(generic\\|port\\)[ \t\n]*(" nil t))
+       (end-of-line)
+       (if (not (re-search-backward "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(" nil t))
 	   (error "ERROR:  Not within a generic/port clause")
 	 ;; search for end of clause
 	 (goto-char (match-end 0))
 	 (setq beg (1- (point)))
 	 (vhdl-forward-syntactic-ws)
-	 (while (looking-at "\\w+\\([ \t\n]*,[ \t\n]*\\w+\\)*[ \t\n]*:[ \t\n]*\\w+[^;]*;")
+	 (while (looking-at "\\w+\\([ \t\n\r\f]*,[ \t\n\r\f]*\\w+\\)*[ \t\n\r\f]*:[ \t\n\r\f]*\\w+[^;]*;")
 	   (goto-char (1- (match-end 0)))
 	   (setq end (point-marker))
 	   (forward-char)
@@ -8317,7 +8634,8 @@ is omitted or nil."
   (let ((margin (current-indentation))
 	(start (point))
 	label)
-    (unless kind (setq kind (if (vhdl-sequential-statement-p) 'is 'use)))
+    (unless kind (setq kind (if (or (vhdl-sequential-statement-p)
+				    (not (vhdl-standard-p 'ams))) 'is 'use)))
     (if (or (not (eq vhdl-optional-labels 'all)) (vhdl-standard-p '87))
 	(vhdl-insert-keyword "CASE ")
       (vhdl-insert-keyword ": CASE ")
@@ -8905,7 +9223,7 @@ otherwise."
       (vhdl-insert-keyword
        (concat " " (if (eq kind 'then) "THEN" "USE") "\n\n"))
       (indent-to margin)
-      (vhdl-insert-keyword "END IF")
+      (vhdl-insert-keyword (concat "END " (if (eq kind 'then) "IF" "USE")))
       (when label (insert " " label))
       (insert ";")
       (forward-line -1)
@@ -9226,6 +9544,7 @@ otherwise."
   (interactive)
   (let ((margin (current-indentation))
 	(start (point))
+	(reset-kind vhdl-reset-kind)
 	label seq input-signals clock reset final-pos)
     (setq seq (if kind (eq kind 'seq)
 		(eq (vhdl-decision-query
@@ -9248,7 +9567,13 @@ otherwise."
       (setq clock (or (and (not (equal "" vhdl-clock-name))
 			   (progn (insert vhdl-clock-name) vhdl-clock-name))
 		      (vhdl-template-field "clock name") "<clock>"))
-      (when (eq vhdl-reset-kind 'async)
+      (when (eq reset-kind 'query)
+	(setq reset-kind
+	      (if (eq (vhdl-decision-query
+		       "" "(a)synchronous or (s)ynchronous reset?" t) ?a)
+		  'async
+		'sync)))
+      (when (eq reset-kind 'async)
 	(insert ", ")
 	(setq reset (or (and (not (equal "" vhdl-reset-name))
 			     (progn (insert vhdl-reset-name) vhdl-reset-name))
@@ -9257,7 +9582,7 @@ otherwise."
     (unless (vhdl-standard-p '87) (vhdl-insert-keyword " IS"))
     (insert "\n")
     (vhdl-template-begin-end "PROCESS" label margin)
-    (when seq (setq reset (vhdl-template-seq-process clock reset)))
+    (when seq (setq reset (vhdl-template-seq-process clock reset reset-kind)))
     (when vhdl-prompt-for-comments
       (setq final-pos (point-marker))
       (vhdl-prepare-search-2
@@ -9589,13 +9914,13 @@ otherwise."
 	(in-arglist (vhdl-in-argument-list-p)))
     (vhdl-prepare-search-2
      (if (or (save-excursion
-	       (and (vhdl-re-search-backward
-		     "\\<function\\|procedure\\|process\\|procedural\\|end\\>"
-		     nil t)
-		    (not (progn (backward-word 1) (looking-at "\\<end\\>")))))
+	       (progn (vhdl-beginning-of-block)
+		      (looking-at "\\s-*\\(\\w+\\s-*:\\s-*\\)?\\<\\(\\<function\\|procedure\\|process\\|procedural\\)\\>")))
 	     (save-excursion (backward-word 1) (looking-at "\\<shared\\>")))
 	 (vhdl-insert-keyword "VARIABLE ")
-       (vhdl-insert-keyword "SHARED VARIABLE ")))
+       (if (vhdl-standard-p '87)
+	   (error "ERROR:  Not within sequential block")
+	 (vhdl-insert-keyword "SHARED VARIABLE "))))
     (when (vhdl-template-field "names" nil t start (point))
       (insert " : ")
       (when in-arglist (vhdl-template-field "[IN | OUT | INOUT]" " " t))
@@ -9692,14 +10017,16 @@ otherwise."
        (concat (if vhdl-clock-rising-edge "rising" "falling")
 	       " clock edge")))))
 
-(defun vhdl-template-seq-process (clock reset)
+(defun vhdl-template-seq-process (clock reset reset-kind)
   "Insert a template for the body of a sequential process."
   (let ((margin (current-indentation))
 	position)
     (vhdl-insert-keyword "IF ")
-    (when (eq vhdl-reset-kind 'async)
+    (when vhdl-conditions-in-parenthesis (insert "("))
+    (when (eq reset-kind 'async)
       (insert reset " = "
 	      (if vhdl-reset-active-high vhdl-one-string vhdl-zero-string))
+      (when vhdl-conditions-in-parenthesis (insert ")"))
       (vhdl-insert-keyword " THEN")
       (vhdl-comment-insert-inline
        (concat "asynchronous reset (active "
@@ -9707,7 +10034,8 @@ otherwise."
       (insert "\n") (indent-to (+ margin vhdl-basic-offset))
       (setq position (point))
       (insert "\n") (indent-to margin)
-      (vhdl-insert-keyword "ELSIF "))
+      (vhdl-insert-keyword "ELSIF ")
+      (when vhdl-conditions-in-parenthesis (insert "(")))
     (if (eq vhdl-clock-edge-condition 'function)
 	(insert (if vhdl-clock-rising-edge "rising" "falling")
 		"_edge(" clock ")")
@@ -9715,17 +10043,20 @@ otherwise."
       (vhdl-insert-keyword " AND ")
       (insert clock " = "
 	      (if vhdl-clock-rising-edge vhdl-one-string vhdl-zero-string)))
+    (when vhdl-conditions-in-parenthesis (insert ")"))
     (vhdl-insert-keyword " THEN")
     (vhdl-comment-insert-inline
      (concat (if vhdl-clock-rising-edge "rising" "falling") " clock edge"))
     (insert "\n") (indent-to (+ margin vhdl-basic-offset))
-    (when (eq vhdl-reset-kind 'sync)
+    (when (eq reset-kind 'sync)
       (vhdl-insert-keyword "IF ")
+      (when vhdl-conditions-in-parenthesis (insert "("))
       (setq reset (or (and (not (equal "" vhdl-reset-name))
 			   (progn (insert vhdl-reset-name) vhdl-reset-name))
 		      (vhdl-template-field "reset name") "<reset>"))
       (insert " = "
 	      (if vhdl-reset-active-high vhdl-one-string vhdl-zero-string))
+      (when vhdl-conditions-in-parenthesis (insert ")"))
       (vhdl-insert-keyword " THEN")
       (vhdl-comment-insert-inline
        (concat "synchronous reset (active "
@@ -9737,7 +10068,7 @@ otherwise."
       (insert "\n") (indent-to (+ margin (* 2 vhdl-basic-offset)))
       (insert "\n") (indent-to (+ margin vhdl-basic-offset))
       (vhdl-insert-keyword "END IF;"))
-    (when (eq vhdl-reset-kind 'none)
+    (when (eq reset-kind 'none)
       (setq position (point)))
     (insert "\n") (indent-to margin)
     (vhdl-insert-keyword "END IF;")
@@ -9761,21 +10092,11 @@ specification, if not already there."
 	(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."
-  (interactive)
-  (vhdl-template-standard-package "ieee" "math_complex"))
-
-(defun vhdl-template-package-math-real ()
-  "Insert specification of `math_real' package."
-  (interactive)
-  (vhdl-template-standard-package "ieee" "math_real"))
+	  (indent-to margin))))
+    (when package
+      (vhdl-insert-keyword "USE ")
+      (insert library "." package)
+      (vhdl-insert-keyword ".ALL;"))))
 
 (defun vhdl-template-package-numeric-bit ()
   "Insert specification of `numeric_bit' package."
@@ -9822,6 +10143,56 @@ specification, if not already there."
   (interactive)
   (vhdl-template-standard-package "std" "textio"))
 
+(defun vhdl-template-package-fundamental-constants ()
+  "Insert specification of `fundamental_constants' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "fundamental_constants"))
+
+(defun vhdl-template-package-material-constants ()
+  "Insert specification of `material_constants' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "material_constants"))
+
+(defun vhdl-template-package-energy-systems ()
+  "Insert specification of `energy_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "energy_systems"))
+
+(defun vhdl-template-package-electrical-systems ()
+  "Insert specification of `electrical_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "electrical_systems"))
+
+(defun vhdl-template-package-mechanical-systems ()
+  "Insert specification of `mechanical_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "mechanical_systems"))
+
+(defun vhdl-template-package-radiant-systems ()
+  "Insert specification of `radiant_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "radiant_systems"))
+
+(defun vhdl-template-package-thermal-systems ()
+  "Insert specification of `thermal_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "thermal_systems"))
+
+(defun vhdl-template-package-fluidic-systems ()
+  "Insert specification of `fluidic_systems' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "fluidic_systems"))
+
+(defun vhdl-template-package-math-complex ()
+  "Insert specification of `math_complex' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "math_complex"))
+
+(defun vhdl-template-package-math-real ()
+  "Insert specification of `math_real' package."
+  (interactive)
+  (vhdl-template-standard-package "ieee" "math_real"))
+
 (defun vhdl-template-directive (directive)
   "Insert directive."
   (unless (= (current-indentation) (current-column))
@@ -9900,6 +10271,9 @@ specification, if not already there."
 	 (insert (user-full-name))
 	 (when user-mail-address (insert "  <" user-mail-address ">")))
        (goto-char beg)
+       (while (search-forward "<authorfull>" end t)
+	 (replace-match (user-full-name) t t))
+       (goto-char beg)
        (while (search-forward "<login>" end t)
 	 (replace-match (user-login-name) t t))
        (goto-char beg)
@@ -9915,7 +10289,7 @@ specification, if not already there."
        (while (search-forward "<standard>" end t)
 	 (replace-match
 	  (concat "VHDL" (cond ((vhdl-standard-p '87) "'87")
-			       ((vhdl-standard-p '93) "'93"))
+			       ((vhdl-standard-p '93) "'93/02"))
 		  (when (vhdl-standard-p 'ams) ", VHDL-AMS")
 		  (when (vhdl-standard-p 'math) ", Math Packages")) t t))
        (goto-char beg)
@@ -10021,9 +10395,10 @@ If starting after end-comment-column, start a new line."
   "Displays one line of dashes."
   (interactive)
   (while (= (preceding-char) ?-) (delete-char -2))
+  (insert "--")
   (let* ((col (current-column))
 	 (len (- end-comment-column col)))
-    (insert-char ?- len)))
+    (insert-char vhdl-comment-display-line-char len)))
 
 (defun vhdl-comment-append-inline ()
   "Append empty inline comment to current line."
@@ -10084,7 +10459,7 @@ If starting after end-comment-column, start a new line."
     (goto-char beg)
     (beginning-of-line)
     (setq beg (point))
-    (if (looking-at comment-start)
+    (if (looking-at (concat "\\s-*" comment-start))
 	(comment-region beg end '(4))
       (comment-region beg end))))
 
@@ -10119,7 +10494,7 @@ If starting after end-comment-column, start a new line."
     (goto-char beg)
     (beginning-of-line)
     (while (< (point) end)
-      (when (looking-at "^.*[^ \t\n-]+\\(\\s-*--.*\\)$")
+      (when (looking-at "^.*[^ \t\n\r\f-]+\\(\\s-*--.*\\)$")
 	(delete-region (match-beginning 1) (match-end 1)))
       (beginning-of-line 2))))
 
@@ -10323,9 +10698,9 @@ if in comment and past end-comment-column."
 	 (self-insert-command count)
 	 (cond ((>= (current-column) (+ 2 end-comment-column))
 		(backward-char 1)
-		(skip-chars-backward "^ \t\n")
+		(skip-chars-backward "^ \t\n\r\f")
 		(indent-new-comment-line)
-		(skip-chars-forward "^ \t\n")
+		(skip-chars-forward "^ \t\n\r\f")
 		(forward-char 1))
 	       ((>= (current-column) end-comment-column)
 		(indent-new-comment-line))
@@ -10369,7 +10744,9 @@ with double-quotes is to be inserted.  DEFAULT specifies a default string."
       (vhdl-fix-case-region-1 position (point) vhdl-upper-case-attributes
 			      (concat "'" vhdl-attributes-regexp))
       (vhdl-fix-case-region-1 position (point) vhdl-upper-case-enum-values
-			      vhdl-enum-values-regexp))
+			      vhdl-enum-values-regexp)
+      (vhdl-fix-case-region-1 position (point) vhdl-upper-case-constants
+			      vhdl-constants-regexp))
     (when (or (not (equal string "")) (not optional))
       (insert (or follow-string "")))
     (if (equal string "") nil string)))
@@ -10455,55 +10832,57 @@ else insert tab (used for word completion in VHDL minibuffer)."
 (defun vhdl-beginning-of-block ()
   "Move cursor to the beginning of the enclosing block."
   (let (pos)
-    (save-excursion
-      (beginning-of-line)
-      ;; search backward for block beginning or end
-      (while (or (while (and (setq pos (re-search-backward "^\\s-*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n]+\\)?\\(function\\|procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|entity\\|package\\|record\\|units\\)\\|\\(\\w+[ \t\n]*:[ \t\n]*\\)?\\(postponed[ \t\n]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|while\\)\\)\\>" nil t))
-			     ;; not consider subprogram declarations
-			     (or (and (match-string 5)
-				      (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
-				 (and (match-string 6)
-				      (save-match-data
-					(save-excursion
-					  (vhdl-end-of-block)
-					  (beginning-of-line)
-					  (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|loop\\)\\>"))))))))
-		 (match-string 2))
-	;; skip subblock if block end found
-	(vhdl-beginning-of-block)))
+    (vhdl-prepare-search-2
+     (save-excursion
+       (beginning-of-line)
+       ;; search backward for block beginning or end
+       (while (or (while (and (setq pos (re-search-backward "^\\s-*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n\r\f]+\\)?\\(function\\|procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|entity\\|package\\(\\s-+body\\)?\\|type[ \t\n\r\f]+\\w+[ \t\n\r\f]+is[ \t\n\r\f]+\\(record\\|protected\\(\\s-+body\\)?\\)\\|units\\)\\|\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(postponed[ \t\n\r\f]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|while\\|loop\\)\\)\\>" nil t))
+			      ;; not consider subprogram declarations
+			      (or (and (match-string 5)
+				       (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
+				  (and (match-string 6)
+				       (save-match-data
+					 (save-excursion
+					   (vhdl-end-of-block)
+					   (beginning-of-line)
+					   (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|loop\\)\\>"))))))))
+		  (match-string 2))
+	 ;; skip subblock if block end found
+	 (vhdl-beginning-of-block))))
     (when pos (goto-char pos))))
 
 (defun vhdl-end-of-block ()
   "Move cursor to the end of the enclosing block."
   (let (pos)
-    (save-excursion
-      (end-of-line)
-      ;; search forward for block beginning or end
-      (while (or (while (and (setq pos (re-search-forward "^\\s-*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n]+\\)?\\(function\\|procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|entity\\|package\\|record\\|units\\)\\|\\(\\w+[ \t\n]*:[ \t\n]*\\)?\\(postponed[ \t\n]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|while\\)\\)\\>" nil t))
-			     ;; not consider subprogram declarations
-			     (or (and (match-string 5)
-				      (save-match-data
-					(save-excursion (re-search-forward "\\<is\\>\\|\\(;\\)" nil t))
-					(match-string 1)))
-				 ;; not consider configuration specifications
-				 (and (match-string 6)
-				      (save-match-data
-					(save-excursion
-					  (vhdl-end-of-block)
-					  (beginning-of-line)
-					  (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|loop\\)\\>"))))))))
-		 (not (match-string 2)))
-	;; skip subblock if block beginning found
-	(vhdl-end-of-block)))
+    (vhdl-prepare-search-2
+     (save-excursion
+       (end-of-line)
+       ;; search forward for block beginning or end
+       (while (or (while (and (setq pos (re-search-forward "^\\s-*\\(\\(end\\)\\|\\(\\(impure\\|pure\\)[ \t\n\r\f]+\\)?\\(function\\|procedure\\)\\|\\(for\\)\\|\\(architecture\\|component\\|configuration\\|entity\\|package\\(\\s-+body\\)?\\|type[ \t\n\r\f]+\\w+[ \t\n\r\f]+is[ \t\n\r\f]+\\(record\\|protected\\(\\s-+body\\)?\\)\\|units\\)\\|\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(postponed[ \t\n\r\f]+\\)?\\(block\\|case\\|for\\|if\\|procedural\\|process\\|while\\|loop\\)\\)\\>" nil t))
+			      ;; not consider subprogram declarations
+			      (or (and (match-string 5)
+				       (save-match-data
+					 (save-excursion (re-search-forward "\\<is\\>\\|\\(;\\)" nil t))
+					 (match-string 1)))
+				  ;; not consider configuration specifications
+				  (and (match-string 6)
+				       (save-match-data
+					 (save-excursion
+					   (vhdl-end-of-block)
+					   (beginning-of-line)
+					   (not (looking-at "^\\s-*end\\s-+\\(for\\|generate\\|loop\\)\\>"))))))))
+		  (not (match-string 2)))
+	 ;; skip subblock if block beginning found
+	 (vhdl-end-of-block))))
     (when pos (goto-char pos))))
 
 (defun vhdl-sequential-statement-p ()
@@ -10518,7 +10897,7 @@ else insert tab (used for word completion in VHDL minibuffer)."
 		   (< start (point)))
 	    ;; ... a sequential block
 	    (progn (vhdl-beginning-of-block)
-		   (looking-at "^\\s-*\\(\\(\\w+[ \t\n]+\\)?\\(function\\|procedure\\)\\|\\(\\w+[ \t\n]*:[ \t\n]*\\)?\\(\\w+[ \t\n]+\\)?\\(procedural\\|process\\)\\)\\>")))))))
+		   (looking-at "^\\s-*\\(\\(\\w+[ \t\n\r\f]+\\)?\\(function\\|procedure\\)\\|\\(\\w+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(\\w+[ \t\n\r\f]+\\)?\\(procedural\\|process\\)\\)\\>")))))))
 
 (defun vhdl-in-argument-list-p ()
   "Check if within an argument list."
@@ -10542,7 +10921,9 @@ but not if inside a comment or quote."
       (progn
 	(insert " ")
 	(unexpand-abbrev)
-	(delete-char -1))
+	(backward-word 1)
+	(vhdl-case-word 1)
+	(delete-char 1))
     (if (not vhdl-electric-mode)
 	(progn
 	  (insert " ")
@@ -10821,7 +11202,10 @@ but not if inside a comment or quote."
 (defun vhdl-parse-string (string &optional optional)
   "Check that the text following point matches the regexp in STRING."
   (if (looking-at string)
-      (goto-char (match-end 0))
+      (progn (goto-char (match-end 0))
+	     (when (vhdl-in-literal)
+	       (end-of-line))
+	     (point))
     (unless optional
       (throw 'parse (format "ERROR:  Syntax error near line %s, expecting \"%s\""
 			    (vhdl-current-line) string)))
@@ -10919,7 +11303,9 @@ reflected in a subsequent paste operation."
 	      port-dir (car port-dir-car))
 	(setcar port-dir-car
 		(cond ((equal port-dir "in") "out")
+		      ((equal port-dir "IN") "OUT")
 		      ((equal port-dir "out") "in")
+		      ((equal port-dir "OUT") "IN")
 		      (t port-dir)))
 	(setq port-list (cdr port-list)))
       (setq vhdl-port-reversed-direction (not vhdl-port-reversed-direction))
@@ -10949,20 +11335,23 @@ reflected in a subsequent paste operation."
 	  (message "Reading port of %s \"%s\"..." decl-type name)
 	  (vhdl-forward-syntactic-ws)
 	  ;; parse generic clause
-	  (when (vhdl-parse-string "generic[ \t\n]*(" t)
+	  (when (vhdl-parse-string "generic[ \t\n\r\f]*(" t)
 	    ;; parse group comment and spacing
 	    (setq group-comment (vhdl-parse-group-comment))
-	    (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
+	    (setq end-of-list (vhdl-parse-string ")[ \t\n\r\f]*;[ \t\n\r\f]*" t))
 	    (while (not end-of-list)
 	      ;; parse names (accept extended identifiers)
-	      (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	      (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	      (setq names (list (match-string-no-properties 1)))
-	      (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\)[ \t\n]*" t)
+	      (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*" t)
 		(setq names
 		      (append names (list (match-string-no-properties 1)))))
 	      ;; parse type
-	      (vhdl-parse-string ":[ \t\n]*\\([^():;\n]+\\)")
+	      (vhdl-parse-string ":[ \t\n\r\f]*\\([^():;\n]+\\)")
 	      (setq type (match-string-no-properties 1))
+	      (when (vhdl-in-comment-p) ; if stuck in comment
+		(setq type (concat type (and (vhdl-parse-string ".*")
+					     (match-string-no-properties 0)))))
 	      (setq comment nil)
 	      (while (looking-at "(")
 		(setq type
@@ -10980,7 +11369,7 @@ reflected in a subsequent paste operation."
 	      (setq type (substring type 0 (match-end 1)))
 	      ;; parse initialization expression
 	      (setq init nil)
-	      (when (vhdl-parse-string ":=[ \t\n]*" t)
+	      (when (vhdl-parse-string ":=[ \t\n\r\f]*" t)
 		(vhdl-parse-string "\\([^();\n]*\\)")
 		(setq init (match-string-no-properties 1))
 		(while (looking-at "(")
@@ -11014,28 +11403,31 @@ reflected in a subsequent paste operation."
 	      ;; parse group comment and spacing
 	      (setq group-comment (vhdl-parse-group-comment))))
 	  ;; parse port clause
-	  (when (vhdl-parse-string "port[ \t\n]*(" t)
+	  (when (vhdl-parse-string "port[ \t\n\r\f]*(" t)
 	    ;; parse group comment and spacing
 	    (setq group-comment (vhdl-parse-group-comment))
-	    (setq end-of-list (vhdl-parse-string ")[ \t\n]*;[ \t\n]*" t))
+	    (setq end-of-list (vhdl-parse-string ")[ \t\n\r\f]*;[ \t\n\r\f]*" t))
 	    (while (not end-of-list)
 	      ;; parse object
 	      (setq object
-		    (and (vhdl-parse-string "\\<\\(signal\\|quantity\\|terminal\\)\\>[ \t\n]*" t)
+		    (and (vhdl-parse-string "\\<\\(signal\\|quantity\\|terminal\\)\\>[ \t\n\r\f]*" t)
 			 (match-string-no-properties 1)))
 	      ;; parse names (accept extended identifiers)
-	      (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	      (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	      (setq names (list (match-string-no-properties 1)))
-	      (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*" t)
+	      (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*" t)
 		(setq names (append names (list (match-string-no-properties 1)))))
 	      ;; parse direction
-	      (vhdl-parse-string ":[ \t\n]*")
+	      (vhdl-parse-string ":[ \t\n\r\f]*")
 	      (setq direct
-		    (and (vhdl-parse-string "\\<\\(in\\|out\\|inout\\|buffer\\|linkage\\)\\>[ \t\n]+" t)
+		    (and (vhdl-parse-string "\\<\\(in\\|out\\|inout\\|buffer\\|linkage\\)\\>[ \t\n\r\f]+" t)
 			 (match-string-no-properties 1)))
 	      ;; parse type
 	      (vhdl-parse-string "\\([^();\n]+\\)")
 	      (setq type (match-string-no-properties 1))
+	      (when (vhdl-in-comment-p) ; if stuck in comment
+		(setq type (concat type (and (vhdl-parse-string ".*")
+					     (match-string-no-properties 0)))))
 	      (setq comment nil)
 	      (while (looking-at "(")
 		(setq type (concat type
@@ -11313,7 +11705,7 @@ reflected in a subsequent paste operation."
 	  (setq port-list (cdr port-list))
 	  (insert (if port-list "," ");"))
 	  ;; paste comment
-	  (when (or vhdl-include-direction-comments
+	  (when (or (and vhdl-include-direction-comments (nth 2 port))
 		    vhdl-include-type-comments
 		    (and vhdl-include-port-comments (nth 4 port)))
 	    (vhdl-comment-insert-inline
@@ -11454,12 +11846,17 @@ reflected in a subsequent paste operation."
 	  ;; paste type
 	  (insert " : " (nth 3 port))
 	  ;; paste initialization (inputs only)
-	  (when (and initialize (equal "IN" (upcase (nth 2 port))))
-	    (insert " := " (if (string-match "(.+)" (nth 3 port))
-			       "(others => '0')" "'0'")))
+	  (when (and initialize (nth 2 port) (equal "IN" (upcase (nth 2 port))))
+	    (insert " := "
+		    (cond ((string-match "integer" (nth 3 port)) "0")
+			  ((string-match "natural" (nth 3 port)) "0")
+			  ((string-match "positive" (nth 3 port)) "0")
+			  ((string-match "real" (nth 3 port)) "0.0")
+			  ((string-match "(.+)" (nth 3 port)) "(others => '0')")
+			  (t "'0'"))))
 	  (insert ";")
 	  ;; paste comment
-	  (when (or vhdl-include-direction-comments
+	  (when (or (and vhdl-include-direction-comments (nth 2 port))
 		    (and vhdl-include-port-comments (nth 4 port)))
 	    (vhdl-comment-insert-inline
 	     (concat
@@ -11495,8 +11892,14 @@ reflected in a subsequent paste operation."
 	      (setq name (car (nth 0 port)))
 	      (insert (vhdl-replace-string vhdl-actual-port-name name))
 	      ;; paste initialization
-	      (insert " <= " (if (string-match "(.+)" (nth 3 port))
-				 "(others => '0')" "'0'") ";"))
+	      (insert " <= "
+		      (cond ((string-match "integer" (nth 3 port)) "0")
+			    ((string-match "natural" (nth 3 port)) "0")
+			    ((string-match "positive" (nth 3 port)) "0")
+			    ((string-match "real" (nth 3 port)) "0.0")
+			    ((string-match "(.+)" (nth 3 port)) "(others => '0')")
+			    (t "'0'"))
+		      ";"))
 	    (setq port-list (cdr port-list))
 	    (when (and port-list
 		       (equal "IN" (upcase (nth 2 (car port-list)))))
@@ -11609,7 +12012,9 @@ reflected in a subsequent paste operation."
       ;; paste custom declarations
       (unless (equal "" vhdl-testbench-declarations)
 	(insert "\n")
-	(vhdl-insert-string-or-file vhdl-testbench-declarations))
+	(setq position (point))
+	(vhdl-insert-string-or-file vhdl-testbench-declarations)
+	(vhdl-indent-region position (point)))
       (setq position (point))
       (insert "\n\n")
       (vhdl-comment-display-line) (insert "\n")
@@ -11638,7 +12043,9 @@ reflected in a subsequent paste operation."
       ;; paste custom statements
       (unless (equal "" vhdl-testbench-statements)
 	(insert "\n")
-	(vhdl-insert-string-or-file vhdl-testbench-statements))
+	(setq position (point))
+	(vhdl-insert-string-or-file vhdl-testbench-statements)
+	(vhdl-indent-region position (point)))
       (insert "\n")
       (indent-to vhdl-basic-offset)
       (unless (eq vhdl-testbench-create-files 'none)
@@ -11707,8 +12114,8 @@ reflected in a subsequent paste operation."
 	  ;; check if within function declaration
 	  (setq pos (point))
 	  (end-of-line)
-	  (when (looking-at "[ \t\n]*\\((\\|;\\|is\\>\\)") (goto-char (match-end 0)))
-	  (unless (and (re-search-backward "^\\s-*\\(\\(procedure\\)\\|\\(\\(pure\\|impure\\)\\s-+\\)?function\\)\\s-+\\(\"?\\w+\"?\\)[ \t\n]*\\(\\((\\)\\|;\\|is\\>\\)" nil t)
+	  (when (looking-at "[ \t\n\r\f]*\\((\\|;\\|is\\>\\)") (goto-char (match-end 0)))
+	  (unless (and (re-search-backward "^\\s-*\\(\\(procedure\\)\\|\\(\\(pure\\|impure\\)\\s-+\\)?function\\)\\s-+\\(\"?\\w+\"?\\)[ \t\n\r\f]*\\(\\((\\)\\|;\\|is\\>\\)" nil t)
 		       (goto-char (match-end 0))
 		       (save-excursion (backward-char)
 				    (forward-sexp)
@@ -11721,21 +12128,21 @@ reflected in a subsequent paste operation."
 	  ;; parse parameter list
 	  (setq group-comment (vhdl-parse-group-comment))
 	  (setq end-of-list (or end-of-list
-				(vhdl-parse-string ")[ \t\n]*\\(;\\|\\(is\\|return\\)\\>\\)" t)))
+				(vhdl-parse-string ")[ \t\n\r\f]*\\(;\\|\\(is\\|return\\)\\>\\)" t)))
 	  (while (not end-of-list)
 	    ;; parse object
 	    (setq object
-		  (and (vhdl-parse-string "\\(constant\\|signal\\|variable\\|file\\|quantity\\|terminal\\)[ \t\n]*" t)
+		  (and (vhdl-parse-string "\\(constant\\|signal\\|variable\\|file\\|quantity\\|terminal\\)[ \t\n\r\f]*" t)
 			 (match-string-no-properties 1)))
 	    ;; parse names (accept extended identifiers)
-	    (vhdl-parse-string "\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*")
+	    (vhdl-parse-string "\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*")
 	    (setq names (list (match-string-no-properties 1)))
-	    (while (vhdl-parse-string ",[ \t\n]*\\(\\w+\\|\\\\[^\\]+\\\\\\)[ \t\n]*" t)
+	    (while (vhdl-parse-string ",[ \t\n\r\f]*\\(\\\\[^\\]+\\\\\\|\\w+\\)[ \t\n\r\f]*" t)
 	      (setq names (append names (list (match-string-no-properties 1)))))
 	    ;; parse direction
-	    (vhdl-parse-string ":[ \t\n]*")
+	    (vhdl-parse-string ":[ \t\n\r\f]*")
 	    (setq direct
-		  (and (vhdl-parse-string "\\(in\\|out\\|inout\\|buffer\\|linkage\\)[ \t\n]+" t)
+		  (and (vhdl-parse-string "\\(in\\|out\\|inout\\|buffer\\|linkage\\)[ \t\n\r\f]+" t)
 		       (match-string-no-properties 1)))
 	    ;; parse type
 	    (vhdl-parse-string "\\([^():;\n]+\\)")
@@ -11757,7 +12164,7 @@ reflected in a subsequent paste operation."
 	    (setq type (substring type 0 (match-end 1)))
 	    ;; parse initialization expression
 	    (setq init nil)
-	    (when (vhdl-parse-string ":=[ \t\n]*" t)
+	    (when (vhdl-parse-string ":=[ \t\n\r\f]*" t)
 	      (vhdl-parse-string "\\([^();\n]*\\)")
 	      (setq init (match-string-no-properties 1))
 	      (while (looking-at "(")
@@ -11787,7 +12194,7 @@ reflected in a subsequent paste operation."
 	    (vhdl-parse-string "\\(;\\|\\(is\\|\\(return\\)\\)\\>\\)\\s-*")
 	    ;; parse return type
 	    (when (match-string 3)
-	      (vhdl-parse-string "[ \t\n]*\\(.+\\)[ \t\n]*\\(;\\|is\\>\\)\\s-*")
+	      (vhdl-parse-string "[ \t\n\r\f]*\\(.+\\)[ \t\n\r\f]*\\(;\\|is\\>\\)\\s-*")
 	      (setq return-type (match-string-no-properties 1))
 	      (when (and return-type
 			 (string-match "\\(\\s-*--\\s-*\\)\\(.*\\)" return-type))
@@ -12015,17 +12422,15 @@ expressions (e.g. for index ranges of types and signals)."
  (defalias 'he-list-beg 'vhdl-he-list-beg))
 
 ;; function for expanding abbrevs and dabbrevs
-(defun vhdl-expand-abbrev (arg))
-(fset 'vhdl-expand-abbrev (make-hippie-expand-function
-			   '(try-expand-dabbrev
-			     try-expand-dabbrev-all-buffers
-			     vhdl-try-expand-abbrev)))
+(defalias 'vhdl-expand-abbrev (make-hippie-expand-function
+			       '(try-expand-dabbrev
+				 try-expand-dabbrev-all-buffers
+				 vhdl-try-expand-abbrev)))
 
 ;; function for expanding parenthesis
-(defun vhdl-expand-paren (arg))
-(fset 'vhdl-expand-paren (make-hippie-expand-function
-			  '(try-expand-list
-			    try-expand-list-all-buffers)))
+(defalias 'vhdl-expand-paren (make-hippie-expand-function
+			      '(try-expand-list
+				try-expand-list-all-buffers)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  Case fixing
@@ -12049,7 +12454,7 @@ depending on parameter UPPER-CASE."
 		    (< vhdl-progress-interval
 		       (- (nth 1 (current-time)) last-update)))
 	   (message "Fixing case... (%2d%s)"
-		    (+ (* count 25) (/ (* 25 (- (point) beg)) (- end beg)))
+		    (+ (* count 20) (/ (* 20 (- (point) beg)) (- end beg)))
 		    "%")
 	   (setq last-update (nth 1 (current-time)))))
        (goto-char end)))))
@@ -12066,6 +12471,8 @@ options vhdl-upper-case-{keywords,types,attributes,enum-values}."
    beg end vhdl-upper-case-attributes (concat "'" vhdl-attributes-regexp) 2)
   (vhdl-fix-case-region-1
    beg end vhdl-upper-case-enum-values vhdl-enum-values-regexp 3)
+  (vhdl-fix-case-region-1
+   beg end vhdl-upper-case-constants vhdl-constants-regexp 4)
   (when vhdl-progress-interval (message "Fixing case...done")))
 
 (defun vhdl-fix-case-buffer ()
@@ -12091,6 +12498,9 @@ options vhdl-upper-case-{keywords,types,attributes,enum-values}."
        (upcase-word 1))
      (when (and vhdl-upper-case-enum-values
 		(looking-at vhdl-enum-values-regexp))
+       (upcase-word 1))
+     (when (and vhdl-upper-case-constants
+		(looking-at vhdl-constants-regexp))
        (upcase-word 1)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -12205,6 +12615,9 @@ it works within comments too."
   (interactive)
   (let ((no-stats 0)
 	(no-code-lines 0)
+	(no-empty-lines 0)
+	(no-comm-lines 0)
+	(no-comments 0)
 	(no-lines (count-lines (point-min) (point-max))))
     (save-excursion
       ;; count statements
@@ -12218,15 +12631,40 @@ it works within comments too."
       (while (not (eobp))
 	(unless (looking-at "^\\s-*\\(--.*\\)?$")
 	  (setq no-code-lines (1+ no-code-lines)))
-	(beginning-of-line 2)))
+	(beginning-of-line 2))
+      ;; count empty lines
+      (goto-char (point-min))
+      (while (and (re-search-forward "^\\s-*$" nil t)
+		  (not (eq (point) (point-max))))
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-empty-lines (1+ no-empty-lines))
+	  (unless (eq (point) (point-max))
+	    (forward-char))))
+      ;; count comment-only lines
+      (goto-char (point-min))
+      (while (re-search-forward "^\\s-*--.*" nil t)
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-comm-lines (1+ no-comm-lines))))
+      ;; count comments
+      (goto-char (point-min))
+      (while (re-search-forward "--.*" nil t)
+	(if (match-string 1)
+	    (goto-char (match-end 1))
+	  (setq no-comments (1+ no-comments)))))
     ;; print results
     (message "\n\
 File statistics: \"%s\"\n\
 ---------------------\n\
-# statements  : %5d\n\
-# code lines  : %5d\n\
-# total lines : %5d\n\ "
-	     (buffer-file-name) no-stats no-code-lines no-lines)
+# statements    : %5d\n\
+# code lines    : %5d\n\
+# empty lines   : %5d\n\
+# comment lines : %5d\n\
+# comments      : %5d\n\
+# total lines   : %5d\n\ "
+	     (buffer-file-name) no-stats no-code-lines no-empty-lines
+	     no-comm-lines no-comments no-lines)
     (unless vhdl-emacs-21 (vhdl-show-messages))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -12390,18 +12828,18 @@ File statistics: \"%s\"\n\
   (concat
    "\\(^\\)\\s-*\\("
    ;; generic/port clause
-   "\\(generic\\|port\\)[ \t\n]*(\\|"
+   "\\(generic\\|port\\)[ \t\n\r\f]*(\\|"
    ;; component
    "component\\>\\|"
    ;; component instantiation
-   "\\(\\w\\|\\s_\\)+[ \t\n]*:[ \t\n]*"
-   "\\(\\(component\\|configuration\\|entity\\)[ \t\n]+\\)?"
-   "\\(\\w\\|\\s_\\)+\\([ \t\n]*(\\(\\w\\|\\s_\\)+)\\)?[ \t\n]*"
-   "\\(generic\\|port\\)[ \t\n]+map[ \t\n]*(\\|"
+   "\\(\\w\\|\\s_\\)+[ \t\n\r\f]*:[ \t\n\r\f]*"
+   "\\(\\(component\\|configuration\\|entity\\)[ \t\n\r\f]+\\)?"
+   "\\(\\w\\|\\s_\\)+\\([ \t\n\r\f]*(\\(\\w\\|\\s_\\)+)\\)?[ \t\n\r\f]*"
+   "\\(generic\\|port\\)[ \t\n\r\f]+map[ \t\n\r\f]*(\\|"
    ;; subprogram
    "\\(function\\|procedure\\)\\>\\|"
    ;; process, block
-   "\\(\\(\\w\\|\\s_\\)+[ \t\n]*:[ \t\n]*\\)?\\(process\\|block\\)\\>\\|"
+   "\\(\\(\\w\\|\\s_\\)+[ \t\n\r\f]*:[ \t\n\r\f]*\\)?\\(process\\|block\\)\\>\\|"
    ;; configuration declaration
    "configuration\\>"
    "\\)")
@@ -12414,7 +12852,7 @@ File statistics: \"%s\"\n\
      (beginning-of-line)
      (cond
       ;; generic/port clause
-      ((looking-at "^\\s-*\\(generic\\|port\\)[ \t\n]*(")
+      ((looking-at "^\\s-*\\(generic\\|port\\)[ \t\n\r\f]*(")
        (goto-char (match-end 0))
        (backward-char)
        (forward-sexp))
@@ -12424,16 +12862,16 @@ File statistics: \"%s\"\n\
       ;; component instantiation
       ((looking-at
 	(concat
-	 "^\\s-*\\w+\\s-*:[ \t\n]*"
-	 "\\(\\(component\\|configuration\\|entity\\)[ \t\n]+\\)?"
-	 "\\w+\\(\\s-*(\\w+)\\)?[ \t\n]*"
-	 "\\(generic\\|port\\)\\s-+map[ \t\n]*("))
+	 "^\\s-*\\w+\\s-*:[ \t\n\r\f]*"
+	 "\\(\\(component\\|configuration\\|entity\\)[ \t\n\r\f]+\\)?"
+	 "\\w+\\(\\s-*(\\w+)\\)?[ \t\n\r\f]*"
+	 "\\(generic\\|port\\)\\s-+map[ \t\n\r\f]*("))
        (goto-char (match-end 0))
        (backward-char)
        (forward-sexp)
        (setq pos (point))
        (vhdl-forward-syntactic-ws)
-       (when (looking-at "port\\s-+map[ \t\n]*(")
+       (when (looking-at "port\\s-+map[ \t\n\r\f]*(")
 	 (goto-char (match-end 0))
 	 (backward-char)
 	 (forward-sexp)
@@ -12585,7 +13023,7 @@ This does highlighting of keywords and standard identifiers.")
    ;; highlight labels of common constructs
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*\\(\\("
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*\\(\\("
      "assert\\|block\\|case\\|exit\\|for\\|if\\|loop\\|next\\|null\\|"
      "postponed\\|process\\|"
      (when (vhdl-standard-p 'ams) "procedural\\|")
@@ -12596,14 +13034,14 @@ This does highlighting of keywords and standard identifiers.")
    ;; highlight label and component name of component instantiations
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*\\(\\w+\\)"
-     "\\(\\s-*\\(--[^\n]*\\)?$\\|\\s-+\\(generic\\|port\\)\\s-+map\\>\\)")
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*\\(\\w+\\)[ \t\n\r\f]*"
+     "\\(--[^\n]*[ \t\n\r\f]+\\)*\\(generic\\|port\\)\\s-+map\\>")
     '(1 font-lock-function-name-face) '(2 font-lock-function-name-face))
 
    ;; highlight label and instantiated unit of component instantiations
    (list
     (concat
-     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n]*"
+     "^\\s-*\\(\\w+\\)\\s-*:[ \t\n\r\f]*"
      "\\(component\\|configuration\\|entity\\)\\s-+"
      "\\(\\w+\\)\\(\\.\\(\\w+\\)\\)?\\(\\s-*(\\(\\w+\\))\\)?")
     '(1 font-lock-function-name-face) '(3 font-lock-function-name-face)
@@ -12638,7 +13076,7 @@ This does highlighting of keywords and standard identifiers.")
    (list
     (concat
      "^\\s-*for\\s-+\\(\\w+\\(,\\s-*\\w+\\)*\\)\\>\\s-*"
-     "\\(:[ \t\n]*\\(\\w+\\)\\|[^i \t]\\)")
+     "\\(:[ \t\n\r\f]*\\(\\w+\\)\\|[^i \t]\\)")
     '(1 font-lock-function-name-face) '(4 font-lock-function-name-face nil t))
 
    ;; highlight names in library clauses
@@ -12662,8 +13100,8 @@ This does highlighting of keywords and standard identifiers.")
    ;; highlight type/nature name in (sub)type/(sub)nature declarations
    (list
     (concat
-     "^\\s-*\\(sub\\)?\\(nature\\|type\\)\\s-+\\(\\w+\\)")
-    3 'font-lock-type-face)
+     "^\\s-*\\(\\(sub\\)?\\(nature\\|type\\)\\|end\\s-+\\(record\\|protected\\)\\)\\s-+\\(\\w+\\)")
+    5 'font-lock-type-face)
 
    ;; highlight signal/variable/constant declaration names
    (list "\\(:[^=]\\)"
@@ -12867,6 +13305,7 @@ This does background highlighting of translate-off regions.")
 	 (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-constants-regexp   1 'font-lock-constant-face)
 	 (list vhdl-keywords-regexp    1 'font-lock-keyword-face)))
   ;; highlight words with special syntax.
   (setq vhdl-font-lock-keywords-3
@@ -12875,9 +13314,10 @@ This does background highlighting of translate-off regions.")
 	  (while syntax-alist
 	    (setq keywords
 		  (cons
-		   (cons (concat "\\<\\(" (nth 1 (car syntax-alist)) "\\)\\>")
+		   (list (concat "\\(" (nth 1 (car syntax-alist)) "\\)") 1
 			 (vhdl-function-name
-			  "vhdl-font-lock" (nth 0 (car syntax-alist)) "face"))
+			  "vhdl-font-lock" (nth 0 (car syntax-alist)) "face")
+			 (nth 4 (car syntax-alist)))
 		   keywords))
 	    (setq syntax-alist (cdr syntax-alist)))
 	  keywords))
@@ -13066,7 +13506,7 @@ hierarchy otherwise.")
       (when (re-search-backward "^[ \t]*\\(architecture\\|configuration\\|entity\\|package\\)\\>" nil t)
 	(while (and (re-search-backward "^[ \t]*\\(end\\|use\\)\\>" nil t)
 		    (equal "USE" (upcase (match-string 1))))
-	  (when (looking-at "^[ \t]*use[ \t\n]*\\(\\w+\\)\\.\\(\\w+\\)\\.\\w+")
+	  (when (looking-at "^[ \t]*use[ \t\n\r\f]*\\(\\w+\\)\\.\\(\\w+\\)\\.\\w+")
 	    (setq lib-alist (cons (cons (match-string-no-properties 1)
 					(vhdl-match-string-downcase 2))
 				  lib-alist))))))
@@ -13140,7 +13580,7 @@ hierarchy otherwise.")
 			 (setq big-files t))
 		;; scan for entities
 		(goto-char (point-min))
-		(while (re-search-forward "^[ \t]*entity[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
+		(while (re-search-forward "^[ \t]*entity[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((ent-name (match-string-no-properties 1))
 			 (ent-key (downcase ent-name))
 			 (ent-entry (aget ent-alist ent-key t))
@@ -13157,7 +13597,7 @@ hierarchy otherwise.")
 				  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)
+		(while (re-search-forward "^[ \t]*architecture[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((arch-name (match-string-no-properties 1))
 			 (arch-key (downcase arch-name))
 			 (ent-name (match-string-no-properties 2))
@@ -13183,7 +13623,7 @@ hierarchy otherwise.")
 				  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)
+		(while (re-search-forward "^[ \t]*configuration[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((conf-name (match-string-no-properties 1))
 			 (conf-key (downcase conf-name))
 			 (conf-entry (aget conf-alist conf-key t))
@@ -13195,7 +13635,7 @@ hierarchy otherwise.")
 			 arch-key comp-conf-list inst-key-list
 			 inst-comp-key inst-ent-key inst-arch-key
 			 inst-conf-key inst-lib-key)
-		    (when (vhdl-re-search-forward "\\<for[ \t\n]+\\(\\w+\\)")
+		    (when (vhdl-re-search-forward "\\<for[ \t\n\r\f]+\\(\\w+\\)")
 		      (setq arch-key (vhdl-match-string-downcase 1)))
 		    (if conf-entry
 			(vhdl-warning-when-idle
@@ -13204,13 +13644,13 @@ hierarchy otherwise.")
 			 (nth 2 conf-entry) file-name conf-line)
 		      (setq conf-list (cons conf-key conf-list))
 		      ;; scan for subconfigurations and subentities
-		      (while (re-search-forward "^[ \t]*for[ \t\n]+\\(\\w+\\([ \t\n]*,[ \t\n]*\\w+\\)*\\)[ \t\n]*:[ \t\n]*\\(\\w+\\)[ \t\n]+" end-of-unit t)
+		      (while (re-search-forward "^[ \t]*for[ \t\n\r\f]+\\(\\w+\\([ \t\n\r\f]*,[ \t\n\r\f]*\\w+\\)*\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\(\\w+\\)[ \t\n\r\f]+" end-of-unit t)
 			(setq inst-comp-key (vhdl-match-string-downcase 3)
 			      inst-key-list (split-string
 					     (vhdl-match-string-downcase 1)
-					     "[ \t\n]*,[ \t\n]*"))
+					     "[ \t\n\r\f]*,[ \t\n\r\f]*"))
 			(vhdl-forward-syntactic-ws)
-			(when (looking-at "use[ \t\n]+\\(\\(entity\\)\\|configuration\\)[ \t\n]+\\(\\w+\\)\\.\\(\\w+\\)[ \t\n]*\\((\\(\\w+\\))\\)?")
+			(when (looking-at "use[ \t\n\r\f]+\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\w+\\)\\.\\(\\w+\\)[ \t\n\r\f]*\\((\\(\\w+\\))\\)?")
 			  (setq
 			   inst-lib-key (vhdl-match-string-downcase 3)
 			   inst-ent-key (and (match-string 2)
@@ -13232,7 +13672,7 @@ hierarchy otherwise.")
 				  arch-key comp-conf-list lib-alist)))))
 		;; scan for packages
 		(goto-char (point-min))
-		(while (re-search-forward "^[ \t]*package[ \t\n]+\\(body[ \t\n]+\\)?\\(\\w+\\)[ \t\n]+is\\>" nil t)
+		(while (re-search-forward "^[ \t]*package[ \t\n\r\f]+\\(body[ \t\n\r\f]+\\)?\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((pack-name (match-string-no-properties 2))
 			 (pack-key (downcase pack-name))
 			 (is-body (match-string-no-properties 1))
@@ -13250,7 +13690,7 @@ hierarchy otherwise.")
 		      ;; scan for context clauses
 		      (setq lib-alist (vhdl-scan-context-clause))
 		      ;; scan for component and subprogram declarations/bodies
-		      (while (re-search-forward "^[ \t]*\\(component\\|function\\|procedure\\)[ \t\n]+\\(\\w+\\|\".*\"\\)" end-of-unit t)
+		      (while (re-search-forward "^[ \t]*\\(component\\|function\\|procedure\\)[ \t\n\r\f]+\\(\\w+\\|\".*\"\\)" end-of-unit t)
 			(if (equal (upcase (match-string 1)) "COMPONENT")
 			    (setq comp-name (match-string-no-properties 2)
 				  comp-alist
@@ -13286,7 +13726,7 @@ hierarchy otherwise.")
 			 (setq big-files t))
 		;; 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)
+		(while (re-search-forward "^[ \t]*architecture[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
 		  (let* ((ent-name (match-string-no-properties 2))
 			 (ent-key (downcase ent-name))
 			 (arch-name (match-string-no-properties 1))
@@ -13300,12 +13740,12 @@ hierarchy otherwise.")
 			 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+\\))\\)?\\|"
+				 (concat "^[ \t]*\\(\\w+\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\("
+					 "\\(\\w+\\)[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(generic\\|port\\)[ \t\n\r\f]+map\\>\\|"
+					 "component[ \t\n\r\f]+\\(\\w+\\)\\|"
+					 "\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?\\|"
 					 "\\(\\(for\\|if\\)\\>[^;:]+\\<generate\\>\\|block\\>\\)\\)\\|"
-					 "\\(^[ \t]*end[ \t\n]+\\(generate\\|block\\)\\>\\)") end-of-unit t)
+					 "\\(^[ \t]*end[ \t\n\r\f]+\\(generate\\|block\\)\\>\\)") end-of-unit t)
 				(or (not limit-hier-inst-no)
 				    (<= (setq inst-no (1+ inst-no))
 					limit-hier-inst-no)))
@@ -13349,8 +13789,8 @@ hierarchy otherwise.")
 		    ;; 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)
+			    (concat "^[ \t]*for[ \t\n\r\f]+\\(\\w+\\([ \t\n\r\f]*,[ \t\n\r\f]*\\w+\\)*\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\(\\w+\\)[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*"
+				    "use[ \t\n\r\f]+\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?") end-of-unit t)
 		      (let* ((inst-comp-name (match-string-no-properties 3))
 			     (inst-ent-key
 			      (and (match-string 6)
@@ -13362,7 +13802,7 @@ hierarchy otherwise.")
 			     (inst-lib-key (vhdl-match-string-downcase 8))
 			     (inst-key-list
 			      (split-string (vhdl-match-string-downcase 1)
-					    "[ \t\n]*,[ \t\n]*"))
+					    "[ \t\n\r\f]*,[ \t\n\r\f]*"))
 			     (tmp-inst-alist inst-alist)
 			     inst-entry)
 			(while tmp-inst-alist
@@ -15347,7 +15787,7 @@ expansion function)."
 	      (read-from-minibuffer "architecture name: "
 				    nil vhdl-minibuffer-local-map)
 	    (vhdl-replace-string vhdl-compose-architecture-name ent-name)))
-	 ent-file-name arch-file-name ent-buffer arch-buffer project)
+	 ent-file-name arch-file-name ent-buffer arch-buffer project end-pos)
     (message "Creating component \"%s(%s)\"..." ent-name arch-name)
     ;; open entity file
     (unless (eq vhdl-compose-create-files 'none)
@@ -15364,6 +15804,7 @@ expansion function)."
     ;; insert header
     (if vhdl-compose-include-header
 	(progn (vhdl-template-header)
+	       (setq end-pos (point))
 	       (goto-char (point-max)))
       (vhdl-comment-display-line) (insert "\n\n"))
     ;; insert library clause
@@ -15390,6 +15831,7 @@ expansion function)."
     ;; open architecture file
     (if (not (eq vhdl-compose-create-files 'separate))
 	(insert "\n")
+      (goto-char (or end-pos (point-min)))
       (setq ent-buffer (current-buffer))
       (setq arch-file-name
 	    (concat (vhdl-replace-string vhdl-architecture-file-name
@@ -15434,7 +15876,7 @@ expansion function)."
     (if (and vhdl-compose-include-header (not (equal vhdl-file-footer "")))
 	(vhdl-template-footer)
       (vhdl-comment-display-line) (insert "\n"))
-    (goto-char (point-min))
+    (goto-char (or end-pos (point-min)))
     (setq arch-buffer (current-buffer))
     (when ent-buffer (set-buffer ent-buffer) (save-buffer))
     (set-buffer arch-buffer) (save-buffer)
@@ -15453,8 +15895,8 @@ component instantiation."
       (error "ERROR:  No port has been read")
     (save-excursion
       (vhdl-prepare-search-2
-       (unless (or (re-search-backward "^architecture[ \t\n]+\\w+[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
-		   (re-search-forward "^architecture[ \t\n]+\\w+[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t))
+       (unless (or (re-search-backward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
+		   (re-search-forward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t))
 	 (error "ERROR:  No architecture found"))
        (let* ((ent-name (match-string 1))
 	      (ent-file-name
@@ -15471,13 +15913,13 @@ component instantiation."
 				(car vhdl-port-list) "\\>") nil t)))
 	   (re-search-forward "^begin\\>" nil)
 	   (beginning-of-line)
-	   (skip-chars-backward " \t\n")
+	   (skip-chars-backward " \t\n\r\f")
 	   (insert "\n\n") (indent-to vhdl-basic-offset)
 	   (vhdl-port-paste-component t))
 	 ;; place component instantiation
 	 (re-search-forward "^end\\>" nil)
 	 (beginning-of-line)
-	 (skip-chars-backward " \t\n")
+	 (skip-chars-backward " \t\n\r\f")
 	 (insert "\n\n") (indent-to vhdl-basic-offset)
 	 (vhdl-port-paste-instance nil t t)
 	 ;; place use clause for used packages
@@ -15486,7 +15928,7 @@ component instantiation."
 	   (when (file-exists-p ent-file-name)
 	     (find-file ent-file-name))
 	   (goto-char (point-min))
-	   (unless (re-search-forward (concat "^entity[ \t\n]+" ent-name "[ \t\n]+is\\>") nil t)
+	   (unless (re-search-forward (concat "^entity[ \t\n\r\f]+" ent-name "[ \t\n\r\f]+is\\>") nil t)
 	     (error "ERROR:  Entity not found: \"%s\"" ent-name))
 	   (goto-char (match-beginning 0))
 	   (if (and (save-excursion
@@ -15505,8 +15947,8 @@ component instantiation."
   (interactive)
   (save-excursion
     (vhdl-prepare-search-2
-     (unless (or (re-search-backward "^architecture[ \t\n]+\\w+[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t)
-		 (re-search-forward "^architecture[ \t\n]+\\w+[ \t\n]+of[ \t\n]+\\(\\w+\\)[ \t\n]+is\\>" nil t))
+     (unless (or (re-search-backward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t)
+		 (re-search-forward "^architecture[ \t\n\r\f]+\\w+[ \t\n\r\f]+of[ \t\n\r\f]+\\(\\w+\\)[ \t\n\r\f]+is\\>" nil t))
        (error "ERROR:  No architecture found"))
      (let* ((ent-name (match-string 1))
 	    (ent-file-name
@@ -15532,11 +15974,11 @@ component instantiation."
        ;; process all instances
        (goto-char arch-stat-pos)
        (while (re-search-forward
-	       (concat "^[ \t]*\\(\\w+\\)[ \t\n]*:[ \t\n]*\\("
-		       "\\(component[ \t\n]+\\)?\\(\\w+\\)"
-		       "[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*\\(\\(generic\\)\\|port\\)[ \t\n]+map\\|"
-		       "\\(\\(entity\\)\\|configuration\\)[ \t\n]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n]*(\\(\\w+\\))\\)?"
-		       "[ \t\n]+\\(--[^\n]*\n[ \t\n]*\\)*\\(\\(generic\\)\\|port\\)[ \t\n]+map\\)[ \t\n]*(") arch-end-pos t)
+	       (concat "^[ \t]*\\(\\w+\\)[ \t\n\r\f]*:[ \t\n\r\f]*\\("
+		       "\\(component[ \t\n\r\f]+\\)?\\(\\w+\\)"
+		       "[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(\\(generic\\)\\|port\\)[ \t\n\r\f]+map\\|"
+		       "\\(\\(entity\\)\\|configuration\\)[ \t\n\r\f]+\\(\\(\\w+\\)\\.\\)?\\(\\w+\\)\\([ \t\n\r\f]*(\\(\\w+\\))\\)?"
+		       "[ \t\n\r\f]+\\(--[^\n]*\n[ \t\n\r\f]*\\)*\\(\\(generic\\)\\|port\\)[ \t\n\r\f]+map\\)[ \t\n\r\f]*(") arch-end-pos t)
 	 (setq inst-name (match-string-no-properties 1)
 	       comp-name (match-string-no-properties 4)
 	       comp-ent-name (match-string-no-properties 12)
@@ -15548,7 +15990,7 @@ component instantiation."
 	      (when vhdl-use-components-package pack-file-name) t
 	      (save-excursion
 		(goto-char (point-min))
-		(unless (re-search-forward (concat "^\\s-*component[ \t\n]+" comp-name "\\>") nil t)
+		(unless (re-search-forward (concat "^\\s-*component[ \t\n\r\f]+" comp-name "\\>") nil t)
 		  (error "ERROR:  Component declaration not found: \"%s\"" comp-name))
 		(vhdl-port-copy)))
 	   ;; ... from entity declaration (direct instantiation)
@@ -15559,7 +16001,7 @@ component instantiation."
 	    comp-ent-file-name t
 	    (save-excursion
 	      (goto-char (point-min))
-	      (unless (re-search-forward (concat "^\\s-*entity[ \t\n]+" comp-ent-name "\\>") nil t)
+	      (unless (re-search-forward (concat "^\\s-*entity[ \t\n\r\f]+" comp-ent-name "\\>") nil t)
 		(error "ERROR:  Entity declaration not found: \"%s\"" comp-ent-name))
 	      (vhdl-port-copy))))
 	 (vhdl-port-flatten t)
@@ -15571,7 +16013,7 @@ component instantiation."
 	 (when has-generic
 	   ;; process all constants in generic map
 	   (vhdl-forward-syntactic-ws)
-	   (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n]*=>[ \t\n]*\\)?\\(\\w+\\),?" t)
+	   (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n\r\f]*=>[ \t\n\r\f]*\\)?\\(\\w+\\),?" t)
 	     (setq constant-name (match-string-no-properties 3))
 	     (setq constant-entry
 		   (cons constant-name
@@ -15589,10 +16031,10 @@ component instantiation."
 	     (unless (match-string 1)
 	       (setq generic-alist (cdr generic-alist)))
 	     (vhdl-forward-syntactic-ws))
-	   (vhdl-re-search-forward "\\<port\\s-+map[ \t\n]*(" nil t))
+	   (vhdl-re-search-forward "\\<port\\s-+map[ \t\n\r\f]*(" nil t))
 	 ;; process all signals in port map
 	 (vhdl-forward-syntactic-ws)
-	 (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n]*=>[ \t\n]*\\)?\\(\\w+\\),?" t)
+	 (while (vhdl-parse-string "\\(\\(\\w+\\)[ \t\n\r\f]*=>[ \t\n\r\f]*\\)?\\(\\w+\\),?" t)
 	   (setq signal-name (match-string-no-properties 3))
 	   (setq signal-entry (cons signal-name
 				    (if (match-string 1)
@@ -15638,7 +16080,7 @@ component instantiation."
        ;; prepare signal insertion
        (vhdl-goto-marker arch-decl-pos)
        (forward-line 1)
-       (re-search-forward "^\\s-*-- Internal signal declarations[ \t\n]*-*\n" arch-stat-pos t)
+       (re-search-forward "^\\s-*-- Internal signal declarations[ \t\n\r\f]*-*\n" arch-stat-pos t)
        (setq signal-pos (point-marker))
        (while (progn (vhdl-forward-syntactic-ws)
 		     (looking-at "signal\\>"))
@@ -15649,10 +16091,10 @@ component instantiation."
        (when (file-exists-p ent-file-name)
 	 (find-file ent-file-name))
        (goto-char (point-min))
-       (unless (re-search-forward (concat "^entity[ \t\n]+" ent-name "[ \t\n]+is\\>") nil t)
+       (unless (re-search-forward (concat "^entity[ \t\n\r\f]+" ent-name "[ \t\n\r\f]+is\\>") nil t)
 	 (error "ERROR:  Entity not found: \"%s\"" ent-name))
        ;; prepare generic clause insertion
-       (unless (and (re-search-forward "\\(^\\s-*generic[ \t\n]*(\\)\\|^end\\>" nil t)
+       (unless (and (re-search-forward "\\(^\\s-*generic[ \t\n\r\f]*(\\)\\|^end\\>" nil t)
 		    (match-string 1))
 	 (goto-char (match-beginning 0))
 	 (indent-to vhdl-basic-offset)
@@ -15670,7 +16112,7 @@ component instantiation."
        (setq generic-beg-pos (point-marker) generic-pos (point-marker)
 	     generic-inst-pos (point-marker) generic-end-pos (point-marker))
        ;; prepare port clause insertion
-       (unless (and (re-search-forward "\\(^\\s-*port[ \t\n]*(\\)\\|^end\\>" nil t)
+       (unless (and (re-search-forward "\\(^\\s-*port[ \t\n\r\f]*(\\)\\|^end\\>" nil t)
 		    (match-string 1))
 	 (goto-char (match-beginning 0))
 	 (indent-to vhdl-basic-offset)
@@ -15894,7 +16336,8 @@ current project/directory."
     (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
+(defun vhdl-compose-configuration-architecture (ent-name arch-name ent-alist
+							 conf-alist inst-alist
 							 &optional insert-conf)
   "Generate block configuration for architecture."
   (let ((margin (current-indentation))
@@ -15970,7 +16413,7 @@ current project/directory."
 		       (nth 3 ent-entry))
 	      (indent-to (+ margin vhdl-basic-offset))
 	      (vhdl-compose-configuration-architecture
-	       (nth 0 ent-entry) arch-name
+	       (nth 0 ent-entry) arch-name ent-alist conf-alist
 	       (nth 3 (aget (nth 3 ent-entry) (downcase arch-name) t))))))
 	;; insert component configuration end
 	(indent-to margin)
@@ -16052,7 +16495,8 @@ current project/directory."
      (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-compose-configuration-architecture
+      ent-name arch-name ent-alist conf-alist inst-alist t)
      (vhdl-insert-keyword "END ") (insert conf-name ";")
      (when conf-file-name
        ;; insert footer and save
@@ -16072,6 +16516,9 @@ current project/directory."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; (using `compile.el')
 
+(defvar vhdl-compile-post-command ""
+  "String appended to compile command after file name.")
+
 (defun vhdl-makefile-name ()
   "Return the Makefile name of the current project or the current compiler if
 no project is defined."
@@ -16226,9 +16673,11 @@ do not print any file names."
 	 (compiler (or (aget vhdl-compiler-alist vhdl-compiler nil)
 		       (error "ERROR:  No such compiler: \"%s\"" vhdl-compiler)))
 	 (command (nth 0 compiler))
-	 (file-name (buffer-file-name))
-	 (options (vhdl-get-compile-options project compiler file-name))
 	 (default-directory (vhdl-compile-directory))
+	 (file-name (if vhdl-compile-absolute-path
+			(buffer-file-name)
+		      (file-relative-name (buffer-file-name))))
+	 (options (vhdl-get-compile-options project compiler file-name))
 	 compilation-process-setup-function)
     (unless (file-directory-p default-directory)
       (error "ERROR:  Compile directory does not exist: \"%s\"" default-directory))
@@ -16236,14 +16685,18 @@ do not print any file names."
     (when (string-match " " file-name)
       (setq file-name (concat "\"" file-name "\"")))
     ;; print out file name if compiler does not
-    (setq vhdl-compile-file-name (buffer-file-name))
+    (setq vhdl-compile-file-name (if vhdl-compile-absolute-path
+				     (buffer-file-name)
+				   (file-relative-name (buffer-file-name))))
     (when (and (= 0 (nth 1 (nth 10 compiler)))
 	       (= 0 (nth 1 (nth 11 compiler))))
       (setq compilation-process-setup-function 'vhdl-compile-print-file-name))
     ;; run compilation
     (if options
 	(when command
-	  (compile (concat command " " options " " file-name)))
+	  (compile (concat command " " options " " file-name
+			   (unless (equal vhdl-compile-post-command "")
+			     (concat " " vhdl-compile-post-command)))))
       (vhdl-warning "Your project settings tell me not to compile this file"))))
 
 (defvar vhdl-make-target "all"
@@ -16551,6 +17004,8 @@ specified by a target."
       (insert "\n\n# Define compilation command and options\n"
 	      "\nCOMPILE = " (nth 0 compiler)
 	      "\nOPTIONS = " (vhdl-get-compile-options project compiler nil)
+	      (if (equal vhdl-compile-post-command "") ""
+		(concat "\nPOST-COMPILE = " vhdl-compile-post-command))
 	      "\n")
       ;; insert library paths
       (setq library-directory
@@ -16580,16 +17035,16 @@ specified by a target."
       (setq unit-list tmp-list)
       ;; insert `make all' rule
       (insert "\n\n\n# Rule for compiling entire design\n"
-	      "\nall :"
-	      " \\\n\t\tlibrary"
+	      "\n" (nth 0 vhdl-makefile-default-targets) " :"
+	      " \\\n\t\t" (nth 2 vhdl-makefile-default-targets)
 	      " \\\n\t\t$(ALL_UNITS)\n")
       ;; insert `make clean' rule
       (insert "\n\n# Rule for cleaning entire design\n"
-	      "\nclean : "
+	      "\n" (nth 1 vhdl-makefile-default-targets) " : "
 	      "\n\t-rm -f $(ALL_UNITS)\n")
       ;; insert `make library' rule
       (insert "\n\n# Rule for creating library directory\n"
-	      "\nlibrary :"
+	      "\n" (nth 2 vhdl-makefile-default-targets) " :"
 	      " \\\n\t\t$(LIBRARY-" work-library ")\n"
 	      "\n$(LIBRARY-" work-library ") :"
 	      "\n\t"
@@ -16597,6 +17052,11 @@ specified by a target."
 	       (cons "\\(.*\\)\n\\(.*\\)" (nth 5 compiler))
 	       (concat "$(LIBRARY-" work-library ")\n" (vhdl-work-library)))
 	      "\n")
+      ;; insert '.PHONY' declaration
+      (insert "\n\n.PHONY : "
+	      (nth 0 vhdl-makefile-default-targets) " "
+	      (nth 1 vhdl-makefile-default-targets) " "
+	      (nth 2 vhdl-makefile-default-targets) "\n")
       ;; insert rule for each library unit
       (insert "\n\n# Rules for compiling single library units and their subhierarchy\n")
       (while prim-list
@@ -16611,7 +17071,7 @@ specified by a target."
 	(unless (equal unit-key unit-name)
 	  (insert " \\\n" unit-name))
 	(insert " :"
-		" \\\n\t\tlibrary"
+		" \\\n\t\t" (nth 2 vhdl-makefile-default-targets)
 		" \\\n\t\t$(UNIT-" work-library "-" unit-key ")")
 	(while second-list
 	  (insert " \\\n\t\t$(UNIT-" work-library "-" (car second-list) ")")
@@ -16653,7 +17113,9 @@ specified by a target."
 	(if options
 	    (insert "\n\t$(COMPILE) "
 		    (if (eq options 'default) "$(OPTIONS)" options) " "
-		    (nth 0 rule) "\n")
+		    (nth 0 rule)
+		    (if (equal vhdl-compile-post-command "") ""
+		      " $(POST-COMPILE)") "\n")
 	  (setq tmp-list target-list)
 	  (while target-list
 	    (insert "\n\t@touch $(UNIT-" work-library "-" (car target-list) ")"
@@ -16712,6 +17174,7 @@ specified by a target."
        'vhdl-compiler-alist
        'vhdl-compiler
        'vhdl-compile-use-local-error-regexp
+       'vhdl-makefile-default-targets
        'vhdl-makefile-generation-hook
        'vhdl-default-library
        'vhdl-standard
@@ -16722,6 +17185,7 @@ specified by a target."
        'vhdl-upper-case-enum-values
        'vhdl-upper-case-constants
        'vhdl-use-direct-instantiation
+       'vhdl-array-index-record-field-in-sensitivity-list
        'vhdl-compose-configuration-name
        'vhdl-entity-file-name
        'vhdl-architecture-file-name
@@ -16812,6 +17276,7 @@ specified by a target."
        'vhdl-print-customize-faces
        'vhdl-intelligent-tab
        'vhdl-indent-syntax-based
+       'vhdl-indent-comment-like-next-code-line
        'vhdl-word-completion-case-sensitive
        'vhdl-word-completion-in-minibuffer
        'vhdl-underscore-is-part-of-word
@@ -16851,6 +17316,17 @@ CONFIGURATION DECLARATION GENERATION:
     (See documentation (`C-c C-h') in section on STRUCTURAL COMPOSITION.)
 
 
+Key Bindings
+------------
+
+For Emacs compliance the following key bindings have been changed:
+
+- `C-c c'        ->  `C-c C-c'      `vhdl-comment-uncomment-region'
+- `C-c f'        ->  `C-c C-i C-f'  `vhdl-fontify-buffer'
+- `C-c s'        ->  `C-c C-i C-s'  `vhdl-statistics-buffer'
+- `C-c C-c ...'  ->  `C-c C-m ...'  `vhdl-compose-...'
+
+
 User Options
 ------------
 
@@ -16864,6 +17340,12 @@ User Options
   Specify whether hierarchical configurations should be created.
 `vhdl-compose-configuration-use-subconfiguration': (new)
   Specify whether subconfigurations should be used inside configurations.
+`vhdl-makefile-default-targets': (new)
+  Customize names of Makefile default targets.
+`vhdl-indent-comment-like-next-code-line': (new)
+  Specify whether comment lines are indented like following code line.
+`vhdl-array-index-record-field-in-sensitivity-list': (new)
+  Specify whether to include array indices / record fields in sensitivity list.
 ")
 
 
@@ -16872,19 +17354,20 @@ User Options
 Reserved words in VHDL
 ----------------------
 
-VHDL'93 (IEEE Std 1076-1993):
-  `vhdl-93-keywords'      : keywords
-  `vhdl-93-types'         : standardized types
-  `vhdl-93-attributes'    : standardized attributes
-  `vhdl-93-enum-values'   : standardized enumeration values
-  `vhdl-93-functions'     : standardized functions
-  `vhdl-93-packages'      : standardized packages and libraries
+VHDL'93/02 (IEEE Std 1076-1993/2002):
+  `vhdl-02-keywords'      : keywords
+  `vhdl-02-types'         : standardized types
+  `vhdl-02-attributes'    : standardized attributes
+  `vhdl-02-enum-values'   : standardized enumeration values
+  `vhdl-02-functions'     : standardized functions
+  `vhdl-02-packages'      : standardized packages and libraries
 
-VHDL-AMS (IEEE Std 1076.1):
+VHDL-AMS (IEEE Std 1076.1 / 1076.1.1):
   `vhdl-ams-keywords'     : keywords
   `vhdl-ams-types'        : standardized types
   `vhdl-ams-attributes'   : standardized attributes
   `vhdl-ams-enum-values'  : standardized enumeration values
+  `vhdl-ams-constants'    : standardized constants
   `vhdl-ams-functions'    : standardized functions
 
 Math Packages (IEEE Std 1076.2):
-- 
1.7.10


[-- Attachment #3: 0002-progmodes-vhdl-mode-Fixed-use-of-obsolete-functions-.patch --]
[-- Type: text/x-patch, Size: 2393 bytes --]

From 59b76e40ff79f835a4add49c2d13d522ceb93dff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=BCdiger=20Sonderfeld?= <ruediger@c-plusplus.de>
Date: Wed, 23 May 2012 14:34:19 +0200
Subject: [PATCH 2/2] progmodes/vhdl-mode: Fixed use of obsolete
 functions/variables.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
To: emacs-devel@gnu.org

(interactive-p) -> (called-interactively-p 'interactive)
speedbar-key-map -> speedbar-mode-map

Signed-off-by: Rüdiger Sonderfeld <ruediger@c-plusplus.de>
---
 lisp/progmodes/vhdl-mode.el |   10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 27215de..0b02d3d 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -14400,10 +14400,10 @@ if required."
 	  (define-key vhdl-speedbar-key-map (int-to-string key)
 	    `(lambda () (interactive) (vhdl-speedbar-set-depth ,key)))
 	  (setq key (1+ key)))))
-    (define-key speedbar-key-map "h"
+    (define-key speedbar-mode-map "h"
       (lambda () (interactive)
 	(speedbar-change-initial-expansion-list "vhdl directory")))
-    (define-key speedbar-key-map "H"
+    (define-key speedbar-mode-map "H"
       (lambda () (interactive)
 	(speedbar-change-initial-expansion-list "vhdl project")))
     ;; menu
@@ -17415,7 +17415,8 @@ to visually support naming conventions.")
   "Display VARIABLE's documentation in *Help* buffer."
   (interactive)
   (unless (featurep 'xemacs)
-    (help-setup-xref (list #'vhdl-doc-variable variable) (interactive-p)))
+    (help-setup-xref (list #'vhdl-doc-variable variable)
+                     (called-interactively-p 'interactive)))
   (with-output-to-temp-buffer
       (if (fboundp 'help-buffer) (help-buffer) "*Help*")
     (princ (documentation-property variable 'variable-documentation))
@@ -17427,7 +17428,8 @@ to visually support naming conventions.")
   "Display VHDL Mode documentation in *Help* buffer."
   (interactive)
   (unless (featurep 'xemacs)
-    (help-setup-xref (list #'vhdl-doc-mode) (interactive-p)))
+    (help-setup-xref (list #'vhdl-doc-mode)
+                     (called-interactively-p 'interactive)))
   (with-output-to-temp-buffer
       (if (fboundp 'help-buffer) (help-buffer) "*Help*")
     (princ mode-name)
-- 
1.7.10


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33.
  2012-05-24 17:05   ` Rüdiger Sonderfeld
@ 2012-05-28  3:43     ` Stefan Monnier
  0 siblings, 0 replies; 4+ messages in thread
From: Stefan Monnier @ 2012-05-28  3:43 UTC (permalink / raw
  To: Rüdiger Sonderfeld; +Cc: emacs-devel

> Oh sorry, I guess I forgot to deactivate wordwrap in KMail. I attached both 
> patches to this email.

Thanks, I've installed the first.

> I'm simply helping to sync the two versions.  The vhdl-mode maintainer
> is Reto Zimmermann.

Good, your help is very appreciated.

>> Regarding the code I haven't reviewed it, but I noticed that it
>> advertises C-c C-c for commenting code, whereas it should advertise M-;
>> instead.
> We could change that downstream.

That's not important enough to warrant a diversion.

> The C-c C-c part is from the current vhdl-mode release.

I know, and I think Reto should change it.  M-; has been able to
comment/uncomment since Emacs-21.  Maybe the change can be made
conditional on the existence of comment-dwim.

>> Also, while I'm here, do you also sync changes from Emacs's repository
>> back to the upstream version?  E.g. the use of syntax-propertize-function.
> I tried to send the patch to the vhdl-mode maintainer but he wants to stay 
> compatible to all kind of old and forked emacs and that's why the patch is 
> probably not acceptable for him.

Which patch?  Regarding syntax-propertize-function, I made an effort to
write the vhdl code in such a way that it gracefully falls back on the
old code if syntax-propertize-function doesn't exist, so it should be
fully backward compatible (although I haven't tested it).

> Maybe we could send at least the documentation fixes upstream.

Sure.  Do it in relatively small chunks, which makes it easier for Reto
review, and maximizes the proportion he can accept.

> Reducing the differences would be useful.

Very much so.

> It took a lot of time with diff-mode and git-blame to figure out what
> was changed in Emacs and what is new in the vhdl-mode release.

I know.  That's why I did not install your second patch, which would
increase the differences, without any significant improvement (while
both are obsolete, they won't disappear soon, especially not
`interactive-p').

You can try and submit a patch upstream to fix those warnings by
changing to code to dynamically use either of the old or new code
depending on what's available.

> @@ -197,6 +197,21 @@ Examples:
>    "Customizations for modes."
>    :group 'vhdl)
 
> +(defcustom vhdl-electric-mode t
> +  "Non-nil enables electrification (automatic template generation).
> +If nil, template generators can still be invoked through key bindings and
> +menu.  Is indicated in the modeline by \"/e\" after the mode name and can be
> +toggled by `\\[vhdl-electric-mode]'."
> +  :type 'boolean
> +  :group 'vhdl-mode)
> +
> +(defcustom vhdl-stutter-mode t
> +  "Non-nil enables stuttering.
> +Is indicated in the modeline by \"/s\" after the mode name and can be toggled
> +by `\\[vhdl-stutter-mode]'."
> +  :type 'boolean
> +  :group 'vhdl-mode)
> +
>  (defcustom vhdl-indent-tabs-mode nil
>    "Non-nil means indentation can insert tabs.
>  Overrides local variable `indent-tabs-mode'."

This is actually undoing a local change where those defcustoms are not
needed any more, because we use define-minor-mode (further down) to
define those vars.


        Stefan



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-05-28  3:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-23 12:53 [PATCH 1/2] progmodes/vhdl-mode.el: Backported changes from 3.33 Rüdiger Sonderfeld
2012-05-24  4:33 ` Stefan Monnier
2012-05-24 17:05   ` Rüdiger Sonderfeld
2012-05-28  3:43     ` Stefan Monnier

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.