Fixing off_grid errors
diff --git a/gds/.magicrc b/gds/.magicrc
deleted file mode 100644
index 67cdbf8..0000000
--- a/gds/.magicrc
+++ /dev/null
@@ -1,96 +0,0 @@
-# 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
-
-puts stdout "Sourcing design .magicrc for technology sky130A ..."
-
-# Put grid on 0.005 pitch.  This is important, as some commands don't
-# rescale the grid automatically (such as lef read?).
-
-set scalefac [tech lambda]
-if {[lindex $scalefac 1] < 2} {
-    scalegrid 1 2
-}
-
-drc off
-drc euclidean on
-
-# Allow override of PDK path from environment variable PDKPATH
-if {[catch {set PDKPATH $env(PDKPATH)}]} {
-    set PDKPATH "$::env(PDK_ROOT)/sky130A"
-}
-
-# loading technology
-tech load $PDKPATH/libs.tech/magic/sky130A.tech
-
-# load device generator
-source $PDKPATH/libs.tech/magic/sky130A.tcl
-
-# load bind keys (optional)
-# source $PDKPATH/libs.tech/magic/sky130A-BindKeys
-
-# set units to lambda grid 
-snap lambda
-
-# set sky130 standard power, ground, and substrate names
-set VDD VPWR
-set GND VGND
-set SUB VSUBS
-
-# Allow override of type of magic library views used, "mag" or "maglef",
-# from environment variable MAGTYPE
-
-if {[catch {set MAGTYPE $env(MAGTYPE)}]} {
-   set MAGTYPE maglef
-}
-
-	path search [concat "../$MAGTYPE" [path search]]
-
-
-# add path to reference cells
-if {[file isdir ${PDKPATH}/libs.ref/${MAGTYPE}]} {
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_pr
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_io
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hd
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hdll
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hs
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hvl
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_lp
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_ls
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_ms
-    addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_osu_sc
-    addpath ${PDKPATH}/libs.ref/mag/sky130_ml_xx_hd
-} else {
-    addpath ${PDKPATH}/libs.ref/sky130_fd_pr/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_io/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hd/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hdll/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hs/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hvl/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_lp/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_ls/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_fd_sc_ms/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_osu_sc/${MAGTYPE}
-    addpath ${PDKPATH}/libs.ref/sky130_ml_xx_hd/mag
-}
-
-addpath hexdigits
-
-# add path to GDS cells
-
-# add path to IP from catalog.  This procedure defined in the PDK script.
-catch {magic::query_mylib_ip}
-# add path to local IP from user design space.  Defined in the PDK script.
-catch {magic::query_my_projects}
diff --git a/gds/run_magic_drc.tcl b/gds/run_magic_drc.tcl
deleted file mode 100644
index 0c06968..0000000
--- a/gds/run_magic_drc.tcl
+++ /dev/null
@@ -1,32 +0,0 @@
-# run_magic_drc.tcl ---
-#    batch script for running DRC
-
-crashbackups stop
-drc euclidean on
-drc style drc(full)
-drc on
-snap internal
-gds flatglob *__example_*
-gds flatten true
-gds read /home/mariam/mabrains/caravel_user_project_analog_LDO_DPLL/gds/user_analog_project_wrapper
-load user_analog_project_wrapper
-select top cell
-expand
-drc catchup
-set allerrors [drc listall why]
-set oscale [cif scale out]
-set ofile [open user_analog_project_wrapper_drc.txt w]
-puts $ofile "DRC errors for cell user_analog_project_wrapper"
-puts $ofile "--------------------------------------------"
-foreach {whytext rectlist} $allerrors {
-   puts $ofile ""
-   puts $ofile $whytext
-   foreach rect $rectlist {
-       set llx [format "%.3f" [expr $oscale * [lindex $rect 0]]]
-       set lly [format "%.3f" [expr $oscale * [lindex $rect 1]]]
-       set urx [format "%.3f" [expr $oscale * [lindex $rect 2]]]
-       set ury [format "%.3f" [expr $oscale * [lindex $rect 3]]]
-       puts $ofile "$llx $lly $urx $ury"
-   }
-}
-close $ofile
diff --git a/gds/run_standard_drc.py b/gds/run_standard_drc.py
deleted file mode 100755
index 3cb9e7a..0000000
--- a/gds/run_standard_drc.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2020 R. Timothy Edwards
-#
-# 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
-#
-#     https://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
-#-------------------------------------------------------------------------
-# run_standard_drc.py ---  A script to run magic in batch mode and apply
-# full DRC checks on a layout.  This inclues full DRC but excludes
-# antenna and density checks, for which there are separate scripts.
-#
-# Usage:
-#
-#   run_standard_drc.py <layout_name>
-#
-# Results:
-#
-#   generates a file "<layout_name>_drc.txt" containing a human-readable
-#   list of the DRC errors.
-# 	
-#-------------------------------------------------------------------------
-
-import subprocess
-import shutil
-import glob
-import sys
-import os
-import re
-
-# Work in progress
-
-def run_full_drc(layout_name, output_file):
-    is_gds = False
-
-    # Remove any extension from layout_name
-    layout_root = layout_name
-    layout_name = os.path.splitext(layout_root)[0]
-    layout_ext = os.path.splitext(layout_root)[1]
-
-    if layout_ext != '.mag':
-        # Assume this is GDS
-        # Is the layout file in the current directory, or a full
-        # path, or is this a project directory?
-
-        is_gds = True
-        if layout_name[0] == '/':
-            gdspath = os.path.split(layout_name)[0]
-            layout_name = os.path.split(layout_name)[1]
-
-        else:
-            if not os.path.isfile(layout_root):
-                if not os.path.isfile('gds/' + layout_root):
-                    print('Error:  Cannot find GDS file ' + layout_root)
-                    return
-                else:
-                    gdspath = os.getcwd() + '/gds'
-            else:
-                gdspath = os.getcwd()
-
-        if os.path.isdir('mag/'):
-            magpath = os.getcwd() + '/mag'
-        else:
-            magpath = os.getcwd()
-
-    else:
-        # File is a .mag layout
-        # Is the layout file in the current directory, or a full
-        # path, or is this a project directory?
-
-        if layout_name[0] == '/':
-            magpath = os.path.split(layout_name)[0]
-            layout_name = os.path.split(layout_name)[1]
-
-        else:
-            if not os.path.isfile(layout_name + '.mag'):
-                if not os.path.isfile('mag/' + layout_name + '.mag'):
-                    print('Error:  Cannot find file ' + layout_name + '.mag')
-                    return
-                else:
-                    magpath = os.getcwd() + '/mag'
-            else:
-                magpath = os.getcwd()
-
-    if output_file == '':
-        output_file = layout_name + '_drc.txt'
-
-    # Check for presence of a .magicrc file, or else check for environment
-    # variable PDKPATH, or PDK_PATH
-
-    myenv = os.environ.copy()
-    myenv['MAGTYPE'] = 'mag'
-
-    if os.path.isfile(magpath + '/.magicrc'):
-       rcfile = magpath + '/.magicrc'
-    elif os.path.isfile(os.getcwd() + '/.magicrc'):
-       rcfile = os.getcwd() + '/.magicrc'
-    else:
-        if 'PDKPATH' in myenv:
-            rcpathroot = myenv['PDKPATH'] + '/libs.tech/magic'
-            rcfile = glob.glob(rcpathroot + '/*.magicrc')[0]
-        elif 'PDK_PATH' in myenv:
-            rcpathroot = myenv['PDKPATH'] + '/libs.tech/magic'
-            rcfile = glob.glob(rcpathroot + '/*.magicrc')[0]
-        else:
-            print('Error: Cannot get magic rcfile for the technology!')
-            return
-
-    # Generate the DRC Tcl script
-
-    # If magpath is writeable, then continue.  If not, then if the
-    # current working directory is writeable, use it.
-    if not os.access(magpath, os.W_OK):
-        if os.access(os.getcwd(), os.W_OK):
-            scriptpath = os.getcwd()
-            # The output .txt file won't be writeable, either.
-            output_file = os.path.join(scriptpath, os.path.split(output_file)[1])
-        else:
-            print('Error:  Neither the path of the layout or the current directory is writeable.')
-            return
-    else:
-        scriptpath = magpath
-
-    print('Evaluating full DRC results for layout ' + layout_name)
-    magic_script = scriptpath + "/run_magic_drc_%s.tcl" % os.path.basename(layout_name)
-    with open(magic_script, 'w') as ofile:
-        print('# run_magic_drc.tcl ---', file=ofile)
-        print('#    batch script for running DRC', file=ofile)
-        print('', file=ofile)
-        print('crashbackups stop', file=ofile)
-        print('drc euclidean on', file=ofile)
-        print('drc style drc(full)', file=ofile)
-        print('drc on', file=ofile)
-        print('snap internal', file=ofile)
-        if is_gds:
-            print('gds flatglob *__example_*', file=ofile)
-            print('gds flatten true', file=ofile)
-            print('gds read ' + gdspath + '/' + layout_name, file=ofile)
-            print('load ' + layout_name, file=ofile)
-        else:
-            print('load ' + layout_name + ' -dereference', file=ofile)
-        print('select top cell', file=ofile)
-        print('expand', file=ofile)
-        print('drc catchup', file=ofile)
-        print('set allerrors [drc listall why]', file=ofile)
-        print('set oscale [cif scale out]', file=ofile)
-        print('set ofile [open ' + output_file + ' w]', file=ofile)
-        print('puts $ofile "DRC errors for cell ' + layout_name + '"', file=ofile)
-        print('puts $ofile "--------------------------------------------"', file=ofile)
-        print('foreach {whytext rectlist} $allerrors {', file=ofile)
-        print('   puts $ofile ""', file=ofile)
-        print('   puts $ofile $whytext', file=ofile)
-        print('   foreach rect $rectlist {', file=ofile)
-        print('       set llx [format "%.3f" [expr $oscale * [lindex $rect 0]]]',
-				file=ofile)
-        print('       set lly [format "%.3f" [expr $oscale * [lindex $rect 1]]]',
-				file=ofile)
-        print('       set urx [format "%.3f" [expr $oscale * [lindex $rect 2]]]',
-				file=ofile)
-        print('       set ury [format "%.3f" [expr $oscale * [lindex $rect 3]]]',
-				file=ofile)
-        print('       puts $ofile "$llx $lly $urx $ury"', file=ofile)
-        print('   }', file=ofile)
-        print('}', file=ofile)
-        print('close $ofile', file=ofile)
-
-    # Run the DRC Tcl script
-
-    print('Running: magic -dnull -noconsole -rcfile ' + rcfile + ' ' + magic_script)
-    print('Running in directory: ' + magpath)
-    mproc = subprocess.run(['magic', '-dnull', '-noconsole', '-rcfile',
-		rcfile, magic_script],
-		env = myenv, cwd = magpath,
-		stdin = subprocess.DEVNULL, stdout = subprocess.PIPE,
-		stderr = subprocess.PIPE, universal_newlines = True)
-    if mproc.stdout:
-        for line in mproc.stdout.splitlines():
-            print(line)
-    if mproc.stderr:
-        print('Error message output from magic:')
-        for line in mproc.stderr.splitlines():
-            print(line)
-    if mproc.returncode != 0:
-        print('ERROR:  Magic exited with status ' + str(mproc.returncode))
-
-    print('Done!')
-
-# If called as main, run all DRC tests
-
-if __name__ == '__main__':
-
-    # Divide up command line into options and arguments
-    options = []
-    arguments = []
-    for item in sys.argv[1:]:
-        if item.find('-', 0) == 0:
-            options.append(item)
-        else:
-            arguments.append(item)
-
-    # Need one argument:  path to layout
-    # If two arguments, then 2nd argument is the output file.
-
-    if len(arguments) > 0 and len(arguments) < 3:
-        layout_root = arguments[0]
-
-    if len(arguments) == 1:
-        out_filename = ""
-    elif len(arguments) > 2:
-        out_filename = arguments[1]
-
-    if len(arguments) > 0 and len(arguments) < 3:
-        run_full_drc(layout_root, out_filename)
-    else:
-        print("Usage:  run_standard_drc.py <layout_name> [<output_file>] [options]")
-        print("Options:")
-        print("   (none)")
-    
-
diff --git a/gds/sky130_drc.txt b/gds/sky130_drc.txt
new file mode 100644
index 0000000..69b1ca8
--- /dev/null
+++ b/gds/sky130_drc.txt
@@ -0,0 +1,483 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>SKY130 DRC runset</description>
+ <original-file/>
+ <generator>drc: script='/home/eslam/.klayout/tech/sky130/drc/drc_sky130.lydrc'</generator>
+ <top-cell>user_analog_project_wrapper</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>dnwell_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on dnwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dnwell_angle</name>
+   <description>x.3a : non 45 degree angle dnwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nwell_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on nwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nwell_angle</name>
+   <description>x.3a : non 45 degree angle nwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwbm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on pwbm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwbm_angle</name>
+   <description>x.3a : non 45 degree angle pwbm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwde_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on pwde</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwde_angle</name>
+   <description>x.3a : non 45 degree angle pwde</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvtp_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on hvtp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvtp_angle</name>
+   <description>x.3a : non 45 degree angle hvtp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvtr_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on hvtr</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvtr_angle</name>
+   <description>x.3a : non 45 degree angle hvtr</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvtn_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on lvtn</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvtn_angle</name>
+   <description>x.3a : non 45 degree angle lvtn</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ncm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on ncm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ncm_angle</name>
+   <description>x.3a : non 45 degree angle ncm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>diff_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on diff</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>tap_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on tap</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>diff_angle</name>
+   <description>x.2 : non 90 degree angle diff</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>diff_angle</name>
+   <description>x.2c : non 45 degree angle diff</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>tap_angle</name>
+   <description>x.2 : non 90 degree angle tap</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>tap_angle</name>
+   <description>x.2c : non 45 degree angle tap</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>tunm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on tunm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>tunm_angle</name>
+   <description>x.3a : non 45 degree angle tunm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on poly</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly_angle</name>
+   <description>x.2 : non 90 degree angle poly</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>rpm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on rpm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>rpm_angle</name>
+   <description>x.3a : non 45 degree angle rpm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>npc_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on npc</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>npc_angle</name>
+   <description>x.3a : non 45 degree angle npc</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nsdm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on nsdm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nsdm_angle</name>
+   <description>x.3a : non 45 degree angle nsdm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>psdm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on psdm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>psdm_angle</name>
+   <description>x.3a : non 45 degree angle psdm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>licon_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on licon</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>licon_angle</name>
+   <description>x.2 : non 90 degree angle licon</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>li_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on li</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>li_angle</name>
+   <description>x.3a : non 45 degree angle li</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ct_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on mcon</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ct_angle</name>
+   <description>x.2 : non 90 degree angle mcon</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>vpp_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on vpp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>vpp_angle</name>
+   <description>x.3a : non 45 degree angle vpp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m1_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on m1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m1_angle</name>
+   <description>x.3a : non 45 degree angle m1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on via</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via_angle</name>
+   <description>x.2 : non 90 degree angle via</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m2_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on m2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m2_angle</name>
+   <description>x.3a : non 45 degree angle m2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via2_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on via2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via2_angle</name>
+   <description>x.2 : non 90 degree angle via2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m3_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on m3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m3_angle</name>
+   <description>x.3a : non 45 degree angle m3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via3_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on via3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via3_angle</name>
+   <description>x.2 : non 90 degree angle via3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nsm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on nsm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nsm_angle</name>
+   <description>x.3a : non 45 degree angle nsm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m4_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on m4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m4_angle</name>
+   <description>x.3a : non 45 degree angle m4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via4_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on via4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via4_angle</name>
+   <description>x.2 : non 90 degree angle via4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m5_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on m5</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>m5_angle</name>
+   <description>x.3a : non 45 degree angle m5</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pad_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on pad</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pad_angle</name>
+   <description>x.3a : non 45 degree angle pad</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mf_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on mf</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mf_angle</name>
+   <description>x.2 : non 90 degree angle mf</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvi_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on hvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvi_angle</name>
+   <description>x.3a : non 45 degree angle hvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvntm_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on hvntm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvntm_angle</name>
+   <description>x.3a : non 45 degree angle hvntm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>vhvi_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on vhvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>vhvi_angle</name>
+   <description>x.3a : non 45 degree angle vhvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>uhvi_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on uhvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>uhvi_angle</name>
+   <description>x.3a : non 45 degree angle uhvi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwell_rs_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on pwell_rs</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pwell_rs_angle</name>
+   <description>x.3a : non 45 degree angle pwell_rs</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>areaid_re_OFFGRID</name>
+   <description>x.1b : OFFGRID vertex on areaid.re</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>user_analog_project_wrapper</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/gds/user_analog_project_wrapper.gds b/gds/user_analog_project_wrapper.gds
index 00c6a1d..e016367 100644
--- a/gds/user_analog_project_wrapper.gds
+++ b/gds/user_analog_project_wrapper.gds
Binary files differ