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