Fixed bugs with retrieving files in check_density.py and generate_fill.py, syntax fixes for check_antenna.py
diff --git a/sky130/custom/scripts/check_antenna.py b/sky130/custom/scripts/check_antenna.py
index 86441d3..031fa5e 100755
--- a/sky130/custom/scripts/check_antenna.py
+++ b/sky130/custom/scripts/check_antenna.py
@@ -40,9 +40,9 @@
print('Error: Cannot find file ' + layout_name + '.mag')
return
else:
- magpath = os.getcwd + '/mag'
+ magpath = os.getcwd() + '/mag'
else:
- magpath = os.getcwd
+ magpath = os.getcwd()
if output_file == '':
output_file = layout_name + '_ant.txt'
@@ -52,8 +52,10 @@
myenv = os.environ.copy()
myenv['MAGTYPE'] = 'mag'
-
- if os.path.isfile(magpath + '/.magicrc'):
+
+ if os.path.isfile('/usr/share/pdk/sky130A/libs.tech/magic/sky130A.magicrc'):
+ rcfile = '/usr/share/pdk/sky130A/libs.tech/magic/sky130A.magicrc'
+ elif os.path.isfile(magpath + '/.magicrc'):
rcfile = magpath + '/.magicrc'
elif os.path.isfile(os.getcwd() + '/.magicrc'):
rcfile = os.getcwd() + '/.magicrc'
@@ -67,7 +69,7 @@
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)
@@ -93,7 +95,7 @@
print('Antenna violation checks on cell ' + layout_name, file=ofile)
print('--------------------------------------------', file=ofile)
- print('Running: magic -dnull -noconsole
+ print('Running: magic -dnull -noconsole')
mproc = subprocess.run(['magic', '-dnull', '-noconsole',
'-rcfile', rcfile, 'run_magic_antenna.tcl'],
diff --git a/sky130/custom/scripts/check_density.py b/sky130/custom/scripts/check_density.py
index feccc60..bd10471 100755
--- a/sky130/custom/scripts/check_density.py
+++ b/sky130/custom/scripts/check_density.py
@@ -55,34 +55,33 @@
print("Wrong number of arguments given to check_density.py.")
usage()
sys.exit(0)
+
+ relative_path=arguments[0]
- gds_filepath = arguments[0]
-
- gdspath = os.path.split(gds_filepath)[0]
+ gdspath = os.getcwd()+'/'+os.path.split(relative_path)[0]+'/'
if gdspath == '':
gdspath = os.getcwd()
+ gds_filepath = os.path.split(relative_path)[1]
+
if os.path.splitext(gds_filepath)[1] != '.gds':
if os.path.splitext(gds_filepath)[1] == '':
gds_filepath += '.gds'
else:
print('Error: Project is not a GDS file!')
sys.exit(1)
+
+ gdsname = os.path.split(gds_filepath)[1]
+ gdsroot = os.path.splitext(gdsname)[0]
# Check for valid path to the GDS file
if not os.path.isdir(gdspath):
print('Error: Project path "' + gds_filepath + '" does not exist or is not readable.')
sys.exit(1)
-
- # Check for valid path to the layout directory (NOTE: Should check for
- # additional argument or open_pdks install if not in a standard project space;
- # this needs to be done.)
-
- gdsroot = os.path.split(gdspath)[0]
- magpath = gdsroot + '/mag'
- if not os.path.isdir(magpath):
- print('Error: Layout path "' + magpath + '" does not exist or is not readable.')
+
+ if not os.path.isfile(gdspath+gds_filepath):
+ print('Error: Project "' + gdspath+gds_filepath + '" does not exist or is not readable.')
sys.exit(1)
if '-debug' in optionlist:
@@ -92,9 +91,25 @@
# NOTE: There should be some attempt to find the installed PDK magicrc file
# if there is no mag/ directory.
- rcfile = magpath + '/.magicrc'
+
+
+ # Searching for rcfile
+
+ rcfile_paths=[gdspath+'/.magicrc','/$PDK_PATH/libs.tech/magic/sky130A.magicrc','/usr/share/pdk/sky130A/libs.tech/magic/sky130A.magicrc']
+
+ rcfile=''
+
+ for rc_path in rcfile_paths:
+ if os.path.isfile(rc_path):
+ rcfile=rc_path
+ break
+
+ if rcfile=='':
+ print('Error: .magicrc file not found.')
+ sys.exit(1)
- with open(magpath + '/check_density.tcl', 'w') as ofile:
+
+ with open(gdspath + '/check_density.tcl', 'w') as ofile:
print('#!/bin/env wish', file=ofile)
print('crashbackups stop', file=ofile)
print('drc off', file=ofile)
@@ -112,6 +127,11 @@
print('gds read ' + gds_filepath, file=ofile)
print('', file=ofile)
+ # NOTE: This assumes that the name of the GDS file is the name of the
+ # topmost cell (which should be passed as an option)
+ print('load ' + gdsroot)
+ print('', file=ofile)
+
print('set midtime [orig_clock format [orig_clock seconds] -format "%D %T"]', file=ofile)
print('puts stdout "Starting density checks: $midtime"', file=ofile)
print('', file=ofile)
@@ -196,7 +216,7 @@
print(' flush stdout', file=ofile)
print(' update idletasks', file=ofile)
- print(' load ' + project_with_id, file=ofile)
+ print(' load ' + gdsroot, file=ofile)
print(' cellname delete tile', file=ofile)
print(' }', file=ofile)
@@ -211,13 +231,13 @@
myenv['MAGTYPE'] = 'mag'
print('Running density checks on file ' + gds_filepath, flush=True)
-
+
mproc = subprocess.Popen(['magic', '-dnull', '-noconsole',
- '-rcfile', rcfile, magpath + '/check_density.tcl'],
+ '-rcfile', rcfile, gdspath + '/check_density.tcl'],
stdin = subprocess.DEVNULL,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
- cwd = magpath,
+ cwd = gdspath,
env = myenv,
universal_newlines = True)
@@ -590,8 +610,8 @@
print('***Error: MET5 Density > 76%')
if not keepmode:
- if os.path.isfile(magpath + '/check_density.tcl'):
- os.remove(magpath + '/check_density.tcl')
+ if os.path.isfile(gdspath + '/check_density.tcl'):
+ os.remove(gdspath + '/check_density.tcl')
print('')
print('Done!')