diff --git a/common/split_gds.py b/common/split_gds.py
new file mode 100755
index 0000000..a673c2f
--- /dev/null
+++ b/common/split_gds.py
@@ -0,0 +1,76 @@
+#!/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)
