| #!/bin/env python3 |
| # |
| # split_gds.py -- |
| # |
| # Script to read a GDS library and write into individual GDS files, one per cell |
| |
| import os |
| import sys |
| import subprocess |
| |
| def usage(): |
| print('split_gds.py <path_to_gds_library> <magic_techfile> [<file_with_list_of_cells>]') |
| |
| if __name__ == '__main__': |
| |
| if len(sys.argv) == 1: |
| print("No options given to split_gds.py.") |
| usage() |
| sys.exit(0) |
| |
| optionlist = [] |
| arguments = [] |
| |
| for option in sys.argv[1:]: |
| if option.find('-', 0) == 0: |
| optionlist.append(option) |
| else: |
| arguments.append(option) |
| |
| if len(arguments) != 3: |
| print("Wrong number of arguments given to split_gds.py.") |
| usage() |
| sys.exit(0) |
| |
| source = arguments[0] |
| |
| techfile = arguments[1] |
| |
| celllist = arguments[2] |
| if os.path.isfile(celllist): |
| with open(celllist, 'r') as ifile: |
| celllist = ifile.read().splitlines() |
| |
| destdir = os.path.split(source)[0] |
| gdsfile = os.path.split(source)[1] |
| |
| with open(destdir + '/split_gds.tcl', 'w') as ofile: |
| print('#!/bin/env wish', file=ofile) |
| print('drc off', file=ofile) |
| print('gds readonly true', file=ofile) |
| print('gds rescale false', file=ofile) |
| print('tech unlock *', file=ofile) |
| print('gds read ' + gdsfile, file=ofile) |
| |
| for cell in celllist: |
| print('load ' + cell, file=ofile) |
| print('gds write ' + cell, file=ofile) |
| |
| print('quit -noprompt', file=ofile) |
| |
| mproc = subprocess.run(['magic', '-dnull', '-noconsole', |
| '-T', techfile, |
| destdir + '/split_gds.tcl'], |
| stdin = subprocess.DEVNULL, |
| stdout = subprocess.PIPE, |
| stderr = subprocess.PIPE, cwd = destdir, |
| 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)) |
| |
| os.remove(destdir + '/split_gds.tcl') |
| exit(0) |