Added a generate_fill.py script for fill generation, and started
a compositor.py script for final composition of caravel layout,
seal ring, and generated fill.
diff --git a/scripts/compositor.py b/scripts/compositor.py
new file mode 100644
index 0000000..3d96ca4
--- /dev/null
+++ b/scripts/compositor.py
@@ -0,0 +1,5 @@
+#!/bin/env python3
+#
+# compository.py ---
+#
+#    Final composition.  Combine the caravel top level, seal ring, and fill.
diff --git a/scripts/generate_fill.py b/scripts/generate_fill.py
new file mode 100755
index 0000000..0a84a48
--- /dev/null
+++ b/scripts/generate_fill.py
@@ -0,0 +1,96 @@
+#!/bin/env python3
+#
+# generate_fill.py ---
+#
+#    Run the fill generation on the caravel top level.
+#
+
+import sys
+import os
+import re
+import subprocess
+
+def usage():
+    print("generate_fill.py [layout_name] [-keep]")
+    return 0
+
+if __name__ == '__main__':
+
+    if len(sys.argv) == 1:
+        usage()
+        sys.exit(0)
+
+    optionlist = []
+    arguments = []
+
+    debugmode = False
+    keepmode = False
+
+    for option in sys.argv[1:]:
+        if option.find('-', 0) == 0:
+            optionlist.append(option)
+        else:
+            arguments.append(option)
+
+    if len(arguments) > 1:
+        print("Wrong number of arguments given to generate_fill.py.")
+        usage()
+        sys.exit(0)
+
+    if len(arguments) == 1:
+        project = arguments[0]
+    else:
+        project = 'caravel'
+
+    if '-debug' in optionlist:
+        debugmode = True
+    if '-keep' in optionlist:
+        keepmode = True
+
+    magdir = '../mag'
+    rcfile = magdir + '/.magicrc'
+
+    with open(magdir + '/generate_fill.tcl', 'w') as ofile:
+        print('#!/bin/env wish', file=ofile)
+        print('drc off', file=ofile)
+        print('load ' + project + ' -dereference', file=ofile)
+        print('select top cell', file=ofile)
+        print('expand', file=ofile)
+
+        # Flatten into a cell with a new name
+        print('puts stdout "Flattening layout. . . "', file=ofile)
+        print('flatten -nolabels ' + project + '_fill_pattern', file=ofile)
+        print('load ' + project + '_fill_pattern', file=ofile)
+
+        # Remove any GDS_FILE reference
+        print('property GDS_FILE ""', file=ofile)
+        print('cif ostyle wafflefill', file=ofile)
+        print('puts stdout "Writing GDS. . . "', file=ofile)
+        print('gds write ../gds/' + project + '_fill_pattern.gds', file=ofile)
+        print('quit -noprompt', file=ofile)
+
+    myenv = os.environ.copy()
+    myenv['MAGTYPE'] = 'mag'
+
+    mproc = subprocess.run(['magic', '-dnull', '-noconsole',
+		'-rcfile', rcfile, magdir + '/generate_fill.tcl'],
+		stdin = subprocess.DEVNULL,
+		stdout = subprocess.PIPE,
+		stderr = subprocess.PIPE,
+		cwd = magdir,
+		env = myenv,
+		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))
+
+    if not keepmode:
+        os.remove(magdir + '/generate_fill.tcl')
+
+    exit(0)