Added a set of Tcl routines for generating bump bonds for the Micross
post-processing.
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index e86e1e9..c8fed53 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -328,6 +328,7 @@
 	rm -f ${MAGIC_STAGING_A}/magicrc
 	(cd ${MAGICTOP_STAGING_A} ; ln -s ${REV_DIR} current)
 	cp -rp custom/scripts/seal_ring_generator ${MAGIC_STAGING_A}/.
+	cp -rp custom/scripts/bump_bond_generator ${MAGIC_STAGING_A}/.
 	cp custom/scripts/generate_fill.py ${MAGIC_STAGING_A}/.
 	cp custom/scripts/check_density.py ${MAGIC_STAGING_A}/.
 	${CPP} ${SKY130A_DEFS} magic/${TECH}.tech > ${MAGIC_STAGING_A}/${SKY130A}.tech
diff --git a/sky130/custom/scripts/bump_bond_generator/README b/sky130/custom/scripts/bump_bond_generator/README
new file mode 100644
index 0000000..72a226a
--- /dev/null
+++ b/sky130/custom/scripts/bump_bond_generator/README
@@ -0,0 +1,3 @@
+This set of scripts will generate bump bond layout on the RDL
+layer.
+
diff --git a/sky130/custom/scripts/bump_bond_generator/bump_bond.tcl b/sky130/custom/scripts/bump_bond_generator/bump_bond.tcl
new file mode 100644
index 0000000..7da795a
--- /dev/null
+++ b/sky130/custom/scripts/bump_bond_generator/bump_bond.tcl
@@ -0,0 +1,272 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+namespace path {::tcl::mathop ::tcl::mathfunc}
+
+#-----------------------------------------------------------------------
+# Routines for generating bump bonds.
+# Use with "micross.tech" technology file.
+#
+# SkyWater top layers:
+# 	m5	metal5 (thick top metal)
+#	glass	polyimide (glass) cut
+#	
+# Bump bond layers:
+#	p1	polyimide via
+#	rdl	redistribution metal
+#	p2	polyimide via2
+#	ubm	under-bump material
+# 
+#-----------------------------------------------------------------------
+
+#-----------------------------------------------------------------------
+# Internal units to microns conversion
+#-----------------------------------------------------------------------
+
+proc magic::i2u {value} {
+    return [expr {((round([magic::cif scale output] * 10000)) / 10000.0) * $value}]
+}
+
+#-----------------------------------------------------------------------
+# Microns to internal units conversion
+#-----------------------------------------------------------------------
+
+proc magic::u2i {value} {
+    return [expr {$value / ((round([magic::cif scale output] * 10000)) / 10000.0)}]
+}
+
+#-----------------------------------------------------------------------
+# make_bump_bond ---
+#-----------------------------------------------------------------------
+# Description:
+#	Create geometry for a bump bond in a subcell, centered at the
+#	origin.  The bump bond itself is a circle (approximated by a
+#	36-sided polygon) of diameter nominally 250um.  The RDL layer
+#	is 10um larger (rule M4) and the under-bump material layer is
+#	15um smaller (rule U4).
+#
+# Arguments:
+#	angle:	0 or 45
+#
+#	The angle represents the direction toward which the taper of
+#	the RDL layer points.  The angle is appended to the subcell
+#	name, so the cell is "bump_bond0" or "bump_bond45".
+#
+#	The version with suffix "45" has the RDL tapering toward the
+#	NE corner when the cell is in its natural orientation.  The
+#	version suffix "0" has the RDL tapering toward the E side when
+#	the cell is in its natural orientation.
+#
+#-----------------------------------------------------------------------
+
+proc make_bump_bond {{orient 0}} {
+    suspendall
+    select top cell
+    set orig_cell [cellname list self]
+
+    load bump_bond${orient} -quiet
+    box values 0 0 0 0
+
+    set rbump 125.0	;# under-bump material radius, in microns
+    set coords []
+    for {set i 0} {$i < 36} {incr i} {
+        set angle [* $i 10]
+        set arad [/ [* 3.1415926 $angle] 180.0]
+        lappend coords [* $rbump [cos $arad]]um
+        lappend coords [* $rbump [sin $arad]]um
+    }
+    polygon ubm {*}$coords
+
+    set rbump 110.0	;# polyimide 2 via radius, in microns
+    set coords []
+    for {set i 0} {$i < 36} {incr i} {
+        set angle [* $i 10]
+        set arad [/ [* 3.1415926 $angle] 180.0]
+        lappend coords [* $rbump [cos $arad]]um
+        lappend coords [* $rbump [sin $arad]]um
+    }
+    polygon pi2 {*}$coords
+
+    set rbump 135.0	;# rdl layer radius, in microns
+    set rdiag [expr {$rbump * sqrt(2.0)}]
+    set coords []
+
+    if {$orient == 45} {
+    	for {set i 9} {$i <= 36} {incr i} {
+            set angle [* $i 10]
+            set arad [/ [* 3.1415926 $angle] 180.0]
+            lappend coords [* $rbump [cos $arad]]um
+            lappend coords [* $rbump [sin $arad]]um
+    	}
+    	lappend coords ${rbump}um
+    	lappend coords ${rbump}um
+    } else {
+    	for {set i 0} {$i <= 27} {incr i} {
+            set angle [* [+ $i 4.5] 10]
+            set arad [/ [* 3.1415926 $angle] 180.0]
+            lappend coords [* $rbump [cos $arad]]um
+            lappend coords [* $rbump [sin $arad]]um
+    	}
+    	lappend coords ${rdiag}um
+    	lappend coords 0
+    }
+    polygon rdl {*}$coords
+
+    # Make cell bound that encompasses the rdl circle only
+    box grow c ${rbump}um
+    set bounds [box values]
+    property FIXED_BBOX "$bounds"
+
+    load $orig_cell
+    resumeall
+}
+
+#-----------------------------------------------------------------------
+# draw_bump_bond ---
+#-----------------------------------------------------------------------
+# Description:
+#	Bump bond is a circle (approximated by a 36-sided polygon) of
+#	diameter nominally 250um.
+#
+#
+# Arguments:
+#	x y	:  Coordinates of the bump bond center position, in microns
+#	orient	:  Direction of tapered RDL joining the pad to a route
+#		   value is in integer degrees, 0 is oriented E (east),
+#		   and value must be a multiple of 45.
+#-----------------------------------------------------------------------
+
+proc draw_bump_bond {x y {orient 0}} {
+    box size 0 0
+    box position ${x}um ${y}um
+    if {[% $orient 90] != 0} {
+	set bondcell bump_bond45
+	set orient [- $orient 45]
+    } else {
+	set bondcell bump_bond0
+    }
+
+    if {$orient < 0} {
+	set orient [+ 360 $orient]
+    }
+    if {$orient != 0} {
+        set orient [- 360 $orient]
+    }
+    getcell $bondcell $orient child 0 0
+}
+
+#-----------------------------------------------------------------------
+# bevel_corners ---
+#-----------------------------------------------------------------------
+# Description:
+#	Bevel the corners of the indicated layer in the current box
+#	with the indicated bevel length
+#
+# Arguments:
+#	layer	:  The layer to be cropped
+#	length	:  The length of the bevel (in microns)
+#-----------------------------------------------------------------------
+
+proc bevel_corners {layer length} {
+    suspendall
+    snap internal
+    pushbox
+    set ilength [magic::u2i $length]
+    set side [* $ilength 0.7071]
+    set iside [expr {int($side)}]
+
+    set padbox [box values]
+    set boxwidth [- [lindex $padbox 2] [lindex $padbox 0]]
+    set boxheight [- [lindex $padbox 3] [lindex $padbox 1]]
+
+    set iwidth  [- $boxwidth $iside]
+    set iheight [- $boxheight $iside]
+
+    box size $iside $iside
+    spliterase sw $layer
+
+    box move n $iheight
+    spliterase nw $layer
+
+    box move e $iwidth
+    spliterase ne $layer
+
+    box move s $iheight
+    spliterase se $layer
+
+    popbox
+    resumeall
+}
+
+#-----------------------------------------------------------------------
+# draw_pad_bond ---
+#-----------------------------------------------------------------------
+# Description:
+#	Draws layers over a wirebond pad to connect to the RDL layer
+#
+# Arguments:
+#	x y	:  Coordinates of the bond pad center position, in microns
+#-----------------------------------------------------------------------
+
+proc draw_pad_bond {x y} {
+    snap internal
+    box values 0 0 0 0
+    box position $x $y
+    box grow c 50um
+
+    # Make sure there is glass underneath.  If not, assume the square
+    # center of a 60um x 70um bond pad (60um x 60um).
+    select area glass
+    set stuff [what -list]
+    set layers [lindex $stuff 0]
+    if {$layers == {}} {
+        box position $x $y
+	box size 0 0
+        box grow c 30um
+    } else {
+        set padbox [select bbox]
+        box values {*}$padbox
+    }
+    # Satisfy rule V3:  P1 via inside pad cut by 10um
+    box grow c -10um
+    paint pi1
+    bevel_corners pi1 7.5
+
+    # Satisfy rule M3:  RDL overlap of P1 >= 10um
+    box grow c 10um
+    paint rdl
+    bevel_corners rdl 10.0
+}
+
+#-----------------------------------------------------------------------
+# draw_pad_route ---
+#-----------------------------------------------------------------------
+# Description:
+#	Draws a route on the RDL layer connecting the points given in
+#	the coordinate list.
+#
+# Arguments:
+#	coords	:  List of coordinate pairs, in microns
+#	width	:  Route width in microns, default 15
+#-----------------------------------------------------------------------
+
+proc draw_pad_route {coords {width 15.0}} {
+    set icoords []
+    foreach coord $coords {
+        lappend icoords ${coord}um
+    }
+    wire segment rdl ${width}um {*}$icoords
+}
+
diff --git a/sky130/custom/scripts/bump_bond_generator/micross.tech b/sky130/custom/scripts/bump_bond_generator/micross.tech
new file mode 100644
index 0000000..0df9bcc
--- /dev/null
+++ b/sky130/custom/scripts/bump_bond_generator/micross.tech
@@ -0,0 +1,137 @@
+tech
+   35
+   micross
+end
+
+version
+   version 0.1
+   description "Techfile for Micross bump-bond post-processing for Sky130"
+   requires magic-8.1.111
+end
+
+planes
+   m5
+   rdl
+   ubm
+   glass
+end
+
+types
+   m5 metal5 m5
+   m5    pi1
+   rdl   rdl
+   rdl   pi2
+   ubm   ubm
+   glass glass
+end 
+
+contact
+   pi1	  metal5 rdl
+   pi2	  rdl	 ubm
+end
+
+styles
+   styletype mos
+   metal5 metal6
+   pi1	  metal6 metal7 via6
+   rdl	  metal7
+   pi2	  metal7 metal8 via7
+   ubm    metal8
+   glass  overglass
+end
+
+compose
+end
+
+connect
+end
+
+cifoutput
+style micross
+   scalefactor 1
+   options calma-permissive-labels
+
+   # NOTE:  metal5 and glass are for reference only;  they do not get output
+
+   layer PI1 pi1
+   labels pi1
+   calma  5 0
+
+   layer RDL rdl
+   labels rdl
+   calma 10 0
+
+   layer PI2 pi2
+   labels pi2
+   calma 15 0
+
+   layer UBM ubm
+   labels ubm
+   calma 20 0
+
+end
+
+cifinput
+style micross
+   scalefactor 1
+
+   # NOTE:  metal5 and glass are for reference;  GDS numbers correspond
+   # to SkyWater SKY130
+
+   layer metal5 MET5
+   labels MET5
+
+   layer glass GLASS
+
+   layer pi1 PI1
+   labels PI1
+
+   layer rdl RDL
+   labels RDL
+
+   layer pi2 PI2
+   labels PI2
+
+   layer ubm UBM
+   labels UBM
+
+   calma MET5  72 20
+   calma GLASS 76 20
+   calma PI1    5 0
+   calma RDL   10 0
+   calma PI2   15 0
+   calma UBM   20 0
+
+end
+
+# mzrouter
+# end
+
+drc
+end
+
+extract
+style generic
+   cscale 1
+   lambda 1
+   step 10
+   sidehalo 0
+
+  planeorder m5  0
+  planeorder rdl 1
+  planeorder ubm 2
+  planeorder glass 3
+end
+
+# wiring
+# end
+
+# router
+# end
+
+# plowing
+# end
+
+plot
+  style pnm
+end