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