Modified the liberty library generator to allow a header file to
be specified, since liberty libraries can't just be made by
concatenating cell entries together.  Revised the GF180MCU Makefile
to add the header files, which I recently added to the Google
repositories for the standard cells and the I/O library.  The
current version is writing out the first cell's header, which
should be cleaned up, but it is producing valid liberty libraries.
diff --git a/VERSION b/VERSION
index 0688620..c873388 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.324
+1.0.325
diff --git a/common/create_lib_library.py b/common/create_lib_library.py
index a066094..83daf87 100755
--- a/common/create_lib_library.py
+++ b/common/create_lib_library.py
@@ -30,6 +30,7 @@
     print('    <destlib>         is the root name of the library file')
     print('    -compile-only     remove the indidual files if specified')
     print('    -excludelist=     is a comma-separated list of files to ignore')
+    print('    -header=		 is the name of a file containing header information')
     print('')
 
 #----------------------------------------------------------------------------
@@ -41,11 +42,28 @@
 # voltage.
 #----------------------------------------------------------------------------
 
-def create_lib_library(destlibdir, destlib, do_compile_only=False, excludelist=[]):
+def create_lib_library(destlibdir, destlib, do_compile_only=False, excludelist=[],
+	headerfile=None):
 
     # destlib should not have a file extension
     destlibroot = os.path.splitext(destlib)[0]
 
+    # If a header file is specified, read it first.  If the header file
+    # name is the same as the library name (typical), the file will be
+    # destroyed before being rebuilt, so save the header file contents.
+
+    hlines = []
+    if headerfile:
+        try:
+            with open(destlibdir + '/' + headerfile, 'r') as ifile:
+                htext = ifile.read()
+                hlines = htext.splitlines()
+        except:
+            print('Error reading liberty header file ' + headerfile)
+            headerfile = None
+        else:
+            headerseen = True
+
     alllibname = destlibdir + '/' + destlibroot + '.lib'
     if os.path.isfile(alllibname):
         os.remove(alllibname)
@@ -79,6 +97,14 @@
     if len(llist) > 1:
         print('New file is:  ' + alllibname)
         with open(alllibname, 'w') as ofile:
+
+            # If a header file is specified, write that to the output first
+            if headerfile:
+                for hline in hlines:
+                    if not hline.startswith('}'):
+                        print(hline, file=ofile)
+                print('\n', file=ofile)
+
             headerdone = False
             for lfile in llist:
                 if not os.path.exists(lfile):
@@ -101,6 +127,10 @@
                     headerdone = True
                 print('/*--------EOF---------*/\n', file=ofile)
 
+            if headerfile:
+                # Finish the header file
+                print('}', file=ofile)
+
         if do_compile_only == True:
             print('Compile-only:  Removing individual LEF files')
             for lfile in llist:
@@ -122,6 +152,7 @@
     # Defaults
     do_compile_only = False
     excludelist = []
+    headerfile = None
 
     # Break arguments into groups where the first word begins with "-".
     # All following words not beginning with "-" are appended to the
@@ -142,6 +173,11 @@
                     excludelist = keyval[1].trim('"').split(',')
                 else:
                     print("No items in exclude list (ignoring).")
+            elif keyval[0] == 'header':
+                if len(keyval) > 0:
+                    headerfile = keyval[1].trim('"')
+                else:
+                    print("No value for header file (ignoring).")
             else:
                 print("Unknown option '" + keyval[0] + "' (ignoring).")
         else:
@@ -168,7 +204,7 @@
             print(file)
     print('')
 
-    create_lib_library(destlibdir, destlib, do_compile_only, excludelist)
+    create_lib_library(destlibdir, destlib, do_compile_only, excludelist, headerfile)
     print('Done.')
     sys.exit(0)
 
diff --git a/common/foundry_install.py b/common/foundry_install.py
index 99123b4..cb93cda 100755
--- a/common/foundry_install.py
+++ b/common/foundry_install.py
@@ -118,6 +118,14 @@
 #		    contains a directory path, then patterns are added from
 #		    files in the specified directory instead of the source.
 #
+#	header :   Followed by "=" and an alternative name.  When compiling
+#		    a library file, use this file as a header.  Required for
+#		    liberty format;  optional for others.  Behavior is format-
+#		    dependent;  e.g., for liberty headers, the cell entries
+#		    will be inserted before the final closing brace.  The name
+#		    may be wildcarded, but if so, there must only be a single
+#		    matching file.
+#
 #	rename :   Followed by "=" and an alternative name.  For any
 #		    file that is a single entry, change the name of
 #		    the file in the target directory to this (To-do:
@@ -854,6 +862,15 @@
         if len(includelist) > 0:
             print('Including files: ' + (',').join(includelist))
 
+        # Option 'header' has an argument
+        headerfile = None
+        try:
+            headerfile = list(item.split('=')[1] for item in option if item.startswith('header'))[0]
+        except IndexError:
+            headerfile = None
+        else:
+            print('Header file is: ' + headerfile)
+
         # Option 'rename' has an argument
         try:
             newname = list(item.split('=')[1] for item in option if item.startswith('rename'))[0]
@@ -1048,10 +1065,23 @@
 
                 destfilelist.append(os.path.split(targname)[1])
 
+            # If headerfile is non-null, then copy this file, too.  Do not add
+            # it to "destfilelist", as it is handled separately.  Recast
+            # headerfile as the name of the file without the path.
+
+            if headerfile:
+                headerpath = substitute(sourcedir + '/' + headerfile, library[1])
+                headerlist = glob.glob(headerpath)
+                if len(headerlist) == 1:
+                    libname = headerlist[0]
+                    destfile = os.path.split(libname)[1]
+                    targname = destlibdir + destpath + '/' + destfile
+                    shutil.copy(libname, targname)
+                    headerfile = destfile
+
             # Add names from "include" list to destfilelist before writing
             # filelist.txt for library file compiling.
 
-            includenames = []
             for incname in includelist:
                 if '/' in incname:
                     # Names come from files in a path that is not the source
@@ -1105,7 +1135,7 @@
                     # then compile one, because one does not want to have to have
                     # an include line for every single cell used in a design.
 
-                    create_lib_library(destlibdir, compname, do_compile_only, excludelist)
+                    create_lib_library(destlibdir, compname, do_compile_only, excludelist, headerfile)
 
                 elif option[0] == 'spice' or option[0] == 'spi':
                     # If there is not a single file with all SPICE subcircuits in it,
diff --git a/gf180mcu/Makefile.in b/gf180mcu/Makefile.in
index 8f78f7a..c543511 100644
--- a/gf180mcu/Makefile.in
+++ b/gf180mcu/Makefile.in
@@ -721,34 +721,49 @@
 			rename=gf180mcu_fd_sc_mcu9t5v0.tlef \
 		-cdl cells/*/*.cdl compile-only noconvert \
 		-liberty cells/*/*_ff_125C_1v98.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_1v98.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_1v98 \
 		-liberty cells/*/*_ff_n40C_1v98.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_1v98.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_1v98 \
-		-liberty cells/*/*_ff_125C_3p6v.lib compile-only \
-			rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_3p6v \
-		-liberty cells/*/*_ff_n40C_3p6v.lib compile-only \
-			rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_3p6v \
+		-liberty cells/*/*_ff_125C_3v60.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_3v60.lib \
+			rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_3v60 \
+		-liberty cells/*/*_ff_n40C_3v60.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_3v60.lib \
+			rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_3v60 \
 		-liberty cells/*/*_ff_125C_5v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_5v50.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_5v50 \
 		-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_5v50.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_5v50 \
 		-liberty cells/*/*_ss_125C_1v62.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_1v62.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_1v62 \
 		-liberty cells/*/*_ss_n40C_1v62.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_1v62.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_1v62 \
 		-liberty cells/*/*_ss_125C_3v00.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_3v00.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_3v00 \
 		-liberty cells/*/*_ss_n40C_3v00.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_3v00.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_3v00 \
 		-liberty cells/*/*_ss_125C_4v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_4v50.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_4v50 \
 		-liberty cells/*/*_ss_n40C_4v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_4v50.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_4v50 \
 		-liberty cells/*/*_tt_025C_1v80.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_1v80.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_1v80 \
 		-liberty cells/*/*_tt_025C_3v30.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_3v30.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_3v30 \
 		-liberty cells/*/*_tt_025C_5v00.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_5v00.lib \
 			rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_5v00 \
 		-gds cells/*/*.gds compile-only \
 		-lef cells/*/*.lef compile-only \
@@ -764,34 +779,49 @@
 			rename=gf180mcu_fd_sc_mcu7t5v0.tlef \
 		-cdl cells/*/*.cdl compile-only noconvert \
 		-liberty cells/*/*_ff_125C_1v98.lib compile-only \
+                        header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_1v98.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_1v98 \
 		-liberty cells/*/*_ff_n40C_1v98.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_1v98.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_1v98 \
-		-liberty cells/*/*_ff_125C_3p6v.lib compile-only \
-			rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_3p6v \
-		-liberty cells/*/*_ff_n40C_3p6v.lib compile-only \
-			rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_3p6v \
+		-liberty cells/*/*_ff_125C_3v60.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_3v60.lib \
+			rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_3v60 \
+		-liberty cells/*/*_ff_n40C_3v60.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_3v60.lib \
+			rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_3v60 \
 		-liberty cells/*/*_ff_125C_5v50.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_5v50.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_5v50 \
 		-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50 \
 		-liberty cells/*/*_ss_125C_1v62.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_1v62.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_1v62 \
 		-liberty cells/*/*_ss_n40C_1v62.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_1v62.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_1v62 \
 		-liberty cells/*/*_ss_125C_3v00.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_3v00.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_3v00 \
 		-liberty cells/*/*_ss_n40C_3v00.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_3v00.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_3v00 \
 		-liberty cells/*/*_ss_125C_4v50.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50 \
 		-liberty cells/*/*_ss_n40C_4v50.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_4v50.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_4v50 \
 		-liberty cells/*/*_tt_025C_1v80.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_1v80.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_1v80 \
 		-liberty cells/*/*_tt_025C_3v30.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_3v30.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_3v30 \
 		-liberty cells/*/*_tt_025C_5v00.lib compile-only \
+			header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00.lib \
 			rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00 \
 		-gds cells/*/*.gds compile-only \
 		-lef cells/*/*.lef compile-only \
@@ -809,28 +839,40 @@
 		-target ${STAGING_PATH}/${GF180MCU$*} \
 		-cdl cells/*/*.cdl compile-only noconvert \
 		-liberty cells/*/*_ff_125C_2v75.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_125C_2v75.lib \
 			rename=gf180mcu_fd_io__ff_125C_2v75 \
 		-liberty cells/*/*_ff_n40C_2v75.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_n40C_2v75.lib \
 			rename=gf180mcu_fd_io__ff_n40C_2v75 \
 		-liberty cells/*/*_ff_125C_3v63.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_125C_3v63.lib \
 			rename=gf180mcu_fd_io__ff_125C_3v63 \
 		-liberty cells/*/*_ff_n40C_3v63.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_n40C_3v63.lib \
 			rename=gf180mcu_fd_io__ff_n40C_3v63 \
 		-liberty cells/*/*_ff_125C_5v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_125C_5v50.lib \
 			rename=gf180mcu_fd_io__ff_125C_5v50 \
 		-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ff_n40C_5v50.lib \
 			rename=gf180mcu_fd_io__ff_n40C_5v50 \
 		-liberty cells/*/*_ss_125C_2v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ss_125C_2v50.lib \
 			rename=gf180mcu_fd_io__ss_125C_2v50 \
 		-liberty cells/*/*_ss_125C_2v97.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ss_125C_2v97.lib \
 			rename=gf180mcu_fd_io__ss_125C_2v97 \
 		-liberty cells/*/*_ss_125C_4v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__ss_125C_4v50.lib \
 			rename=gf180mcu_fd_io__ss_125C_4v50 \
 		-liberty cells/*/*_tt_025C_2v50.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__tt_025C_2v50.lib \
 			rename=gf180mcu_fd_io__tt_025C_2v50 \
 		-liberty cells/*/*_tt_025C_3v30.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__tt_025C_3v30.lib \
 			rename=gf180mcu_fd_io__tt_025C_3v30 \
 		-liberty cells/*/*_tt_025C_5v00.lib compile-only \
+                        header=liberty/gf180mcu_fd_io__tt_025C_5v00.lib \
 			rename=gf180mcu_fd_io__tt_025C_5v00 \
 		-gds cells/*/*_${$*_STACK}.gds compile-only \
 			options=custom/scripts/gds_import_io.tcl \