This update changes the way that 3rd party repositories are pulled,
by using (a shallow) git clone instead of pulling a tarball.  That
allows the commit hash of every repository pulled to be queried and
saved in the .config/nodeinfo.json file for reference.  Also in this
update:  Corrected the diode device in the diode cell in the HVL
standard cell library.  Corrected the build sequence for the I/O
library, which was causing the addition of the SPICE netlists for
the I/O pads to be missed.
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index ace3f01..cc3bce0 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -211,13 +211,13 @@
 OSU_T18_PATH = @SKY130_OSU_T18_PATH@
 
 PDK_URL = https://github.com/google/skywater-pdk
-ALPHA_URL = https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz
-XSCHEM_URL = https://github.com/StefanSchippers/xschem_sky130/archive/main.tar.gz
-SRAM_URL = https://github.com/efabless/sky130_sram_macros/archive/main.tar.gz
-OSU_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc/+archive/refs/heads/main.tar.gz
-OSU_T12_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12/+archive/refs/heads/main.tar.gz
-OSU_T15_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t15/+archive/refs/heads/main.tar.gz
-OSU_T18_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t18/+archive/refs/heads/main.tar.gz
+ALPHA_URL = https://github.com/PaulSchulz/sky130_pschulz_xx_hd
+XSCHEM_URL = https://github.com/StefanSchippers/xschem_sky130
+SRAM_URL = https://github.com/efabless/sky130_sram_macros
+OSU_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc
+OSU_T12_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12
+OSU_T15_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t15
+OSU_T18_URL = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t18
 
 # NOTE:  Install destination is the git repository of the technology platform.
 # Once updated in git, the git project can be distributed to all hosts.
@@ -256,6 +256,65 @@
 # Add staging path
 SKY130A_DEFS += -DSTAGING_PATH=${STAGING_PATH}
 
+# Record commit numbers for the nodeinfo.json file
+OPEN_PDKS_COMMIT = $(shell git rev-parse HEAD)
+ifeq (${OPEN_PDKS_COMMIT},)
+    COMMIT_DEFS = -DOPEN_PDKS_COMMIT=${REVISION}
+else
+    COMMIT_DEFS = -DOPEN_PDKS_COMMIT=${OPEN_PDKS_COMMIT}
+endif
+ifeq (${ALPHA_PATH},)
+    COMMIT_DEFS += -DALPHA_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DALPHA_COMMIT=$(shell cd ${ALPHA_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${SRAM_PATH},)
+    COMMIT_DEFS += -DSRAM_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DSRAM_COMMIT=$(shell cd ${SRAM_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${OSU_PATH},)
+    COMMIT_DEFS += -DOSU_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DOSU_COMMIT=$(shell cd ${OSU_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${OSU_T12_PATH},)
+    COMMIT_DEFS += -DOSU_T12_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DOSU_T12_COMMIT=$(shell cd ${OSU_T12_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${OSU_T15_PATH},)
+    COMMIT_DEFS += -DOSU_T15_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DOSU_T15_COMMIT=$(shell cd ${OSU_T15_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${OSU_T18_PATH},)
+    COMMIT_DEFS += -DOSU_T18_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DOSU_T18_COMMIT=$(shell cd ${OSU_T18_PATH} ; git rev-parse HEAD)
+endif
+ifeq (${SKYWATER_PATH},)
+    COMMIT_DEFS += -DFD_PR_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_IO_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_HD_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_HDLL_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_HVL_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_HS_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_MS_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_LS_COMMIT="unknown"
+    COMMIT_DEFS += -DFD_SC_LP_COMMIT="unknown"
+else
+    COMMIT_DEFS += -DFD_PR_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_pr/latest)
+    COMMIT_DEFS += -DFD_IO_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_io/latest)
+    COMMIT_DEFS += -DFD_SC_HD_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_hd/latest)
+    COMMIT_DEFS += -DFD_SC_HDLL_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_hdll/latest)
+    COMMIT_DEFS += -DFD_SC_HVL_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_hvl/latest)
+    COMMIT_DEFS += -DFD_SC_HS_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_hs/latest)
+    COMMIT_DEFS += -DFD_SC_MS_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_ms/latest)
+    COMMIT_DEFS += -DFD_SC_LS_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_ls/latest)
+    COMMIT_DEFS += -DFD_SC_LP_COMMIT=$(shell cd ${SKYWATER_PATH} ; git rev-parse @:libraries/sky130_fd_sc_lp/latest)
+endif
+
 ifeq (${EF_STYLE}, 1)
     EF_FORMAT = -ef_format
     SKY130A_DEFS += -DEF_FORMAT
@@ -512,7 +571,7 @@
 general-a: ${TECH}.json
 	mkdir -p ${STAGING_PATH}/${SKY130A}/${CONFIG_DIR}
 	rm -f ${STAGING_PATH}/${SKY130A}/${CONFIG_DIR}/nodeinfo.json
-	${CPP} ${SKY130A_DEFS} ${TECH}.json \
+	${CPP} ${SKY130A_DEFS} ${COMMIT_DEFS} ${TECH}.json \
 		${STAGING_PATH}/${SKY130A}/${CONFIG_DIR}/nodeinfo.json
 
 tools-a: $(addsuffix -a, $(TOOLS))
@@ -842,8 +901,6 @@
 		-library general sky130_fd_io 2>&1 | tee -a ${SKY130A}_make.log
 	# Install SkyWater I/O pad library
 	${STAGE} -source ${SKYWATER_LIBS_PATH} -target ${STAGING_PATH}/${SKY130A} \
-		-spice %l/latest/cells/*/*.spice compile-only \
-			sort=custom/scripts/sort_pdkfiles.py \
 		-cdl %l/latest/cells/*/*.cdl ignore=topography compile-only \
 			sort=custom/scripts/sort_pdkfiles.py \
 		-lef %l/latest/cells/*/*.magic.lef compile-only \
diff --git a/sky130/custom/scripts/fix_device_models.py b/sky130/custom/scripts/fix_device_models.py
index 3cafe1f..f9a258e 100755
--- a/sky130/custom/scripts/fix_device_models.py
+++ b/sky130/custom/scripts/fix_device_models.py
@@ -31,12 +31,15 @@
     modified = False
 
     dioderex = re.compile('.*[ \t]+sky130_fd_pr__diode_pw2nd[ \t]+')
+    ndioderex = re.compile('.*[ \t]+ndiode_h[ \t]+')
     shortrex = re.compile('.*[ \t]+short[ \t]+')
 
     for line in slines:
 
         # Check for incorrect diode reference
         dmatch = dioderex.match(line)
+        # Check for incorrect HVL diode ("ndiode_h") reference
+        nmatch = ndioderex.match(line)
         # Check for incorrect resistor reference
         smatch = shortrex.match(line)
         if dmatch:
@@ -46,6 +49,13 @@
             fline = re.sub('p=', 'pj=', fline)
             fixedlines.append(fline)
             modified = True
+        elif nmatch:
+            fline = re.sub('ndiode_h', 'sky130_fd_pr__diode_pw2nd_11v0', line)
+            fline = re.sub('^X', 'D', fline)
+            fline = re.sub('a=', 'area=', fline)
+            fline = re.sub('p=', 'pj=', fline)
+            fixedlines.append(fline)
+            modified = True
         elif smatch:
             fline = re.sub('short', 'sky130_fd_pr__res_generic_po', line)
             fline = re.sub('^X', 'R', fline)
diff --git a/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice b/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
index 30002f9..da3871a 100644
--- a/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
+++ b/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
@@ -2910,7 +2910,6 @@
 XI288 N0 net193 VGND_IO sky130_fd_pr__res_generic_nd__hv W=0.5 L=113.375 m=1 isHV=TRUE
 XI287 vdiode net190 VGND_IO sky130_fd_pr__res_generic_nd__hv W=0.5 L=113.375 m=1
 + isHV=TRUE
-xI99
 XI206 N0 en VGND_IO VGND_IO sky130_fd_pr__nfet_g5v0d10v5 m=1 w=5.0 l=0.5 mult=1
 + sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063 perim=1.14
 XI190 net531 en VGND_IO VGND_IO sky130_fd_pr__nfet_g5v0d10v5 m=1 w=5.0 l=0.5
diff --git a/sky130/nodeinfo.json b/sky130/nodeinfo.json
new file mode 100644
index 0000000..28a2a0b
--- /dev/null
+++ b/sky130/nodeinfo.json
@@ -0,0 +1,39 @@
+{
+    "foundry" : "SW",
+    "foundry-name" : "SkyWater",
+    "node" : "sky130A",
+    "feature-size" : "130nm",
+    "status" : "active",
+    "commit" : "1c74f85cd8dbb6c0cf514316b127d746d35d829b",
+    "description" : "Skywater 0.13um CMOS, local interconntect + high-resistance poly + 5 metal layer backend stack + MiM caps + redistribution layer",
+    "options" : [
+        "METAL5",
+        "MIM",
+        "REDISTRIBUTION"
+    ],
+    "stdcells" : [
+	"sky130_fd_sc_hd" : "ac7fb61f06e6470b94e8afdf7c25268f62fbd7b1",
+	"sky130_fd_sc_hdll" : "0694bd23893de20f5233ef024acf6cca1e750ac6",
+	"sky130_fd_sc_hs" : "1d051f49bfe4e2fe9108d702a8bc2e9c081005a4",
+	"sky130_fd_sc_hvl" : "4fd4f858d16c558a6a488b200649e909bb4dd800",
+	"sky130_fd_sc_lp" : "e2c1e0646999163d35ea7b2521c3ec5c28633e63",
+	"sky130_fd_sc_ls" : "4f549e30dd91a1c264f8895e07b2872fe410a8c2",
+	"sky130_fd_sc_ms" : "ae1b7f68821505cf2d93d9d44cce5ece22710fad",
+	"sky130_osu_sc" : "unknown",
+	"sky130_osu_sc_t12" : "unknown",
+	"sky130_osu_sc_t15" : "unknown",
+	"sky130_osu_sc_t18" : "unknown"
+    ],
+    "iocells" : [
+        "sky130_fd_io" : "01b18699b4102d8e54ad1406b3991ecb652e5aee"
+    ]
+    "primitive" : [
+	"sky130_fd_pr" : "f62031a1be9aefe902d6d54cddd6f59b57627436"
+    ]
+    "memory" : [
+	"sky130_sram_macros" : "a2a737043f68ac5058aa6e62241eb3ce2a7bc062"
+    ]
+    "other" : [
+	"sky130_ml_xx_hd" : "6eb3b0718552b034f1bf1870285ff135e3fb2dcb"
+    ]
+}
diff --git a/sky130/sky130.json b/sky130/sky130.json
index f9c69ab..df875be 100644
--- a/sky130/sky130.json
+++ b/sky130/sky130.json
@@ -14,6 +14,7 @@
     "node" : "TECHNAME",
     "feature-size" : "130nm",
     "status" : "active",
+    "commit" : "OPEN_PDKS_COMMIT",
     "description" : "DESCRIPTION OPTION1 OPTION2 OPTION3",
     "options" : [
 #ifdef METAL5
@@ -38,19 +39,28 @@
 #endif (REDISTRIBUTION)
     ],
     "stdcells" : [
-	"sky130_fd_sc_hd",
-	"sky130_fd_sc_hdll",
-	"sky130_fd_sc_hs",
-	"sky130_fd_sc_hvl",
-	"sky130_fd_sc_lp",
-	"sky130_fd_sc_ls",
-	"sky130_fd_sc_ms",
-	"sky130_osu_sc",
-	"sky130_osu_sc_t12",
-	"sky130_osu_sc_t15",
-	"sky130_osu_sc_t18"
+	"sky130_fd_sc_hd" : "FD_SC_HD_COMMIT",
+	"sky130_fd_sc_hdll" : "FD_SC_HDLL_COMMIT",
+	"sky130_fd_sc_hs" : "FD_SC_HS_COMMIT",
+	"sky130_fd_sc_hvl" : "FD_SC_HVL_COMMIT",
+	"sky130_fd_sc_lp" : "FD_SC_LP_COMMIT",
+	"sky130_fd_sc_ls" : "FD_SC_LS_COMMIT",
+	"sky130_fd_sc_ms" : "FD_SC_MS_COMMIT",
+	"sky130_osu_sc" : "OSU_COMMIT",
+	"sky130_osu_sc_t12" : "OSU_T12_COMMIT",
+	"sky130_osu_sc_t15" : "OSU_T15_COMMIT",
+	"sky130_osu_sc_t18" : "OSU_T18_COMMIT"
     ],
     "iocells" : [
-        "sky130_fd_io"
+        "sky130_fd_io" : "FD_IO_COMMIT"
+    ]
+    "primitive" : [
+	"sky130_fd_pr" : "FD_PR_COMMIT"
+    ]
+    "memory" : [
+	"sky130_sram_macros" : "SRAM_COMMIT"
+    ]
+    "other" : [
+	"sky130_ml_xx_hd" : "ALPHA_COMMIT"
     ]
 }