#!/bin/env python3
# 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)
