diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index df68956..3e10159 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -418,6 +418,8 @@
 	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}/.
+	cp custom/scripts/run_standard_drc.py ${MAGIC_STAGING_A}/.
+	cp custom/scripts/check_antenna.py ${MAGIC_STAGING_A}/.
 	${CPP} ${SKY130A_DEFS} magic/${TECH}.tech ${MAGIC_STAGING_A}/${SKY130A}.tech
 	${CPP} ${SKY130A_DEFS} magic/${TECH}gds.tech ${MAGIC_STAGING_A}/${SKY130A}-GDS.tech
 	${CPP} ${SKY130A_DEFS} magic/${TECH}.magicrc ${MAGIC_STAGING_A}/${SKY130A}.magicrc
diff --git a/sky130/custom/scripts/check_antenna.py b/sky130/custom/scripts/check_antenna.py
new file mode 100755
index 0000000..86441d3
--- /dev/null
+++ b/sky130/custom/scripts/check_antenna.py
@@ -0,0 +1,152 @@
+#!/bin/env python3
+#-------------------------------------------------------------------------
+# check_antenna.py ---  A script to run magic in batch mode and run the
+# antenna violation checks on a layout.
+#
+# Usage:
+#
+#   check_antenna.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 sys
+import os
+import re
+
+# Work in progress
+
+def run_antenna(layout_name, output_file):
+
+    # Remove any extension from layout_name
+    layout_name = os.path.splitext(layout_name)[0]
+
+    # 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 + '_ant.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 antenna check Tcl script
+
+    print('Evaluating antenna rule violations on layout ' + layout_name)
+
+    with open('run_magic_antenna.tcl', 'w') as ofile:
+        print('# run_magic_antenna.tcl ---', file=ofile)
+        print('#    batch script for running DRC', file=ofile)
+        print('', file=ofile)
+        print('crashbackups stop', file=ofile)
+        print('drc off', file=ofile)
+        print('snap internal', file=ofile)
+        print('load ' + layout_name + ' -dereference', file=ofile)
+        print('select top cell', file=ofile)
+        print('expand', file=ofile)
+        print('extract do local', file=ofile)
+        print('extract no all', file=ofile)
+        print('extract all', file=ofile)
+        print('antennacheck', file=ofile)
+
+    # Run the DRC Tcl script
+
+    ofile = open(output_file, 'w')
+    print('Antenna violation checks on cell ' + layout_name, file=ofile)
+    print('--------------------------------------------', file=ofile)
+
+    print('Running: magic -dnull -noconsole 
+
+    mproc = subprocess.run(['magic', '-dnull', '-noconsole',
+		'-rcfile', rcfile, 'run_magic_antenna.tcl'],
+		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)
+            print(line, file=ofile)
+    if mproc.stderr:
+        print('\nError message output from magic:')
+        print('\nError message output from magic:', file=ofile)
+        for line in mproc.stderr.splitlines():
+            print(line)
+            print(line, file=ofile)
+    if mproc.returncode != 0:
+        print('\nERROR:  Magic exited with status ' + str(mproc.returncode))
+        print('\nERROR:  Magic exited with status ' + str(mproc.returncode), file=ofile)
+
+    ofile.close()
+
+    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) > 1:
+        out_filename = arguments[1]
+
+    if len(arguments) > 0 and len(arguments) < 3:
+        run_antenna(layout_root, out_filename)
+    else:
+        print("Usage:  check_antenna.py <layout_name> [<output_file>] [options]")
+        print("Options:")
+        print("   (none)")
+    
+
diff --git a/sky130/custom/scripts/run_drc.py b/sky130/custom/scripts/run_drc.py
deleted file mode 100755
index 0513066..0000000
--- a/sky130/custom/scripts/run_drc.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/env python3
-#-------------------------------------------------------------------------
-# run_drc.py ---  A script to run magic in batch mode and apply full DRC
-# checks on a layout.  This inclues full DRC, antenna rule checks, and
-# density checks.
-#
-# Usage:
-#
-#   run_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 sys
-import os
-import re
-
-# Work in progress
-
-def run_full_drc(layout_name, output_file):
-    with open('run_magic_drc.tcl', 'w') as ofile:
-
-    # Create the GDS of the seal ring
-
-    mproc = subprocess.run(['magic', '-dnull', '-noconsole',
-	    'run_magic_drc.tcl'],
-	    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))
-
-# 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) < 3:
-        layout_root = arguments[1]
-
-    if len(arguments == 1):
-        out_fileroot = layout_root + "_drc.txt"
-    else:
-        out_fileroot = arguments[2]
-
-    if len(arguments) < 3:
-        run_full_drc(layout_root, out_filename)
-    else:
-        print("Usage:  run_drc.py <layout_name> [<output_file>] [options]")
-        print("Options:")
-        print("   (none)")
-    
-
diff --git a/sky130/custom/scripts/run_standard_drc.py b/sky130/custom/scripts/run_standard_drc.py
new file mode 100755
index 0000000..02f2cf7
--- /dev/null
+++ b/sky130/custom/scripts/run_standard_drc.py
@@ -0,0 +1,199 @@
+#!/bin/env python3
+#-------------------------------------------------------------------------
+# 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
+
+    print('Evaluating full DRC results for layout ' + layout_name)
+    with open(magpath + '/run_magic_drc.tcl', '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 + ' run_magic_drc.tcl')
+    print('Running in directory: ' + magpath)
+    mproc = subprocess.run(['magic', '-dnull', '-noconsole', '-rcfile',
+		rcfile, 'run_magic_drc.tcl'],
+		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)")
+    
+
