diff --git a/docs/conf.py b/docs/conf.py
index df6615c..cff1c98 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -132,10 +132,9 @@
     # Specify the icon name.
     # For details see link.
     # https://material.io/icons/
-    'header_links': [
-        ('Home', 'index', False, 'home'),
-        ("GitHub", "https://github.com/SymbiFlow/prjxray", True, 'link')
-    ],
+    'header_links': [('Home', 'index', False, 'home'),
+                     ("GitHub", "https://github.com/SymbiFlow/prjxray", True,
+                      'link')],
 
     # Customize css colors.
     # For details see link.
@@ -221,18 +220,16 @@
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    (
-        master_doc, 'ProjectX-Ray.tex', u'Project X-Ray Documentation',
-        u'SymbiFlow Team', 'manual'),
+    (master_doc, 'ProjectX-Ray.tex', u'Project X-Ray Documentation',
+     u'SymbiFlow Team', 'manual'),
 ]
 
 # -- Options for manual page output ---------------------------------------
 
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
-man_pages = [
-    (master_doc, 'projectx-ray', u'Project X-Ray Documentation', [author], 1)
-]
+man_pages = [(master_doc, 'projectx-ray', u'Project X-Ray Documentation',
+              [author], 1)]
 
 # -- Options for Texinfo output -------------------------------------------
 
@@ -240,9 +237,8 @@
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    (
-        master_doc, 'ProjectX-Ray', u'Project X-Ray Documentation', author,
-        'ProjectX-Ray', 'One line description of project.', 'Miscellaneous'),
+    (master_doc, 'ProjectX-Ray', u'Project X-Ray Documentation', author,
+     'ProjectX-Ray', 'One line description of project.', 'Miscellaneous'),
 ]
 
 # Example configuration for intersphinx: refer to the Python standard library.
@@ -256,11 +252,10 @@
     docs_root_dir = os.path.realpath(os.path.dirname(__file__))
     code_root_dir = os.path.realpath(os.path.join(docs_root_dir, ".."))
 
-    MarkdownSymlinksDomain.init_domain(
-        github_code_repo, github_code_branch, docs_root_dir, code_root_dir)
+    MarkdownSymlinksDomain.init_domain(github_code_repo, github_code_branch,
+                                       docs_root_dir, code_root_dir)
     MarkdownSymlinksDomain.find_links()
     app.add_domain(MarkdownSymlinksDomain)
-    app.add_config_value(
-        'recommonmark_config', {
-            'github_code_repo': github_code_repo,
-        }, True)
+    app.add_config_value('recommonmark_config', {
+        'github_code_repo': github_code_repo,
+    }, True)
diff --git a/fuzzers/002-tilegrid/add_tdb.py b/fuzzers/002-tilegrid/add_tdb.py
index b05d219..c15bd60 100644
--- a/fuzzers/002-tilegrid/add_tdb.py
+++ b/fuzzers/002-tilegrid/add_tdb.py
@@ -6,20 +6,22 @@
 
 BITS_PER_WORD = 16
 
+
 def check_frames(tagstr, addrlist):
     frames = set()
     for addrstr in addrlist:
         frame = parse_addr(addrstr, get_base_frame=True)
         frames.add(frame)
-    assert len(frames) == 1, (
-        "{}: More than one base address".format(tagstr), map(hex, frames))
+    assert len(frames) == 1, ("{}: More than one base address".format(tagstr),
+                              map(hex, frames))
 
 
 def parse_addr(line, only_frame=False, get_base_frame=False):
     # 00020027_003_03
     line = line.split("_")
     frame = int(line[0], 16)
-    wordidx = int(line[1], 10) * (32 / BITS_PER_WORD) + int(line[2], 10) // BITS_PER_WORD
+    wordidx = int(line[1], 10) * (32 / BITS_PER_WORD) + int(
+        line[2], 10) // BITS_PER_WORD
     bitidx = int(line[2], 10) % BITS_PER_WORD
 
     if get_base_frame:
@@ -74,8 +76,10 @@
     build_dir = "build_" + os.getenv('URAY_PART')
     tdb_fns = [
         ("cle/" + build_dir + "/segbits_tilegrid.tdb", 36, 3),
-        ("clel_int/" + build_dir + "/segbits_tilegrid.tdb", int_frames, int_words),
-        ("clem_int/" + build_dir + "/segbits_tilegrid.tdb", int_frames, int_words),
+        ("clel_int/" + build_dir + "/segbits_tilegrid.tdb", int_frames,
+         int_words),
+        ("clem_int/" + build_dir + "/segbits_tilegrid.tdb", int_frames,
+         int_words),
     ]
 
     for (tdb_fn, frames, words) in tdb_fns:
diff --git a/fuzzers/002-tilegrid/cle/top.py b/fuzzers/002-tilegrid/cle/top.py
index af6fa48..42d879b 100644
--- a/fuzzers/002-tilegrid/cle/top.py
+++ b/fuzzers/002-tilegrid/cle/top.py
@@ -24,8 +24,7 @@
 
 
 def run():
-    print(
-        '''
+    print('''
 module top();
     ''')
 
@@ -36,8 +35,7 @@
                                              util.gen_fuzz_states(len(sites))):
         params[tile_name] = (site_name, isone)
 
-        print(
-            '''
+        print('''
             (* KEEP, DONT_TOUCH, LOC = "{loc}", LOCK_PINS="I0:A1 I1:A2 I2:A3 I3:A4 I4:A5 I5:A6" *)
             wire loop_{loc};
             LUT6 #(.INIT(64'b{isone}) ) lut_{loc} (
@@ -50,8 +48,8 @@
                 .O(loop_{loc})
                 );
 '''.format(
-        loc=site_name,
-        isone=isone,
+            loc=site_name,
+            isone=isone,
         ))
 
     print("endmodule")
diff --git a/fuzzers/002-tilegrid/clel_int/top.py b/fuzzers/002-tilegrid/clel_int/top.py
index c8c4c2e..63e2963 100644
--- a/fuzzers/002-tilegrid/clel_int/top.py
+++ b/fuzzers/002-tilegrid/clel_int/top.py
@@ -17,7 +17,7 @@
             # Don't fuzz the top and bottom of the grid, the interconnect
             # there behaves differently.
             _, _, y_min, y_max = grid.dims()
-            if loc.grid_y <= y_min+1 or loc.grid_y >= y_max-1:
+            if loc.grid_y <= y_min + 1 or loc.grid_y >= y_max - 1:
                 continue
 
             site_name = sorted(gridinfo.sites.keys())[0]
@@ -53,8 +53,7 @@
                                              util.gen_fuzz_states(len(sites))):
         params[tile_name] = (site_name, isone)
 
-        print(
-            '''
+        print('''
             (* KEEP, DONT_TOUCH, LOC = "{loc}", LOCK_PINS="I0:A1 I1:A2 I2:A3 I3:A4 I4:A5 I5:A6" *)
             wire loop_{loc};
             LUT6 #(.INIT(64'hFFFFFFFFFFFFFFFF) ) luta_{loc} (
diff --git a/fuzzers/002-tilegrid/clem_int/top.py b/fuzzers/002-tilegrid/clem_int/top.py
index 17e93de..d8d694b 100644
--- a/fuzzers/002-tilegrid/clem_int/top.py
+++ b/fuzzers/002-tilegrid/clem_int/top.py
@@ -17,7 +17,7 @@
             # Don't fuzz the top and bottom of the grid, the interconnect
             # there behaves differently.
             _, _, y_min, y_max = grid.dims()
-            if loc.grid_y <= y_min+1 or loc.grid_y >= y_max-1:
+            if loc.grid_y <= y_min + 1 or loc.grid_y >= y_max - 1:
                 continue
 
             site_name = sorted(gridinfo.sites.keys())[0]
@@ -56,8 +56,7 @@
                                              util.gen_fuzz_states(len(sites))):
         params[tile_name] = (site_name, isone)
 
-        print(
-            '''
+        print('''
             (* KEEP, DONT_TOUCH, LOC = "{loc}", LOCK_PINS="I0:A1, I1:A2, I2:A3, I3:A4, I4:A5, I5:A6" *)
             wire loop_{loc};
             LUT6 #(.INIT(64'hFFFFFFFFFFFFFFFF) ) lutc_{loc} (
diff --git a/fuzzers/002-tilegrid/fuzzaddr/generate.py b/fuzzers/002-tilegrid/fuzzaddr/generate.py
index a9e0edd..92fbac7 100644
--- a/fuzzers/002-tilegrid/fuzzaddr/generate.py
+++ b/fuzzers/002-tilegrid/fuzzaddr/generate.py
@@ -3,8 +3,7 @@
 from utils import bitsmaker
 
 
-def run(
-        bits_fn,
+def run(bits_fn,
         design_fn,
         fnout,
         oneval,
@@ -85,8 +84,7 @@
     if args.filter_words is not None:
         filter_words = list(map(int, args.filter_words.split(',')))
 
-    run(
-        args.bits_file,
+    run(args.bits_file,
         args.design,
         args.fnout,
         args.oneval,
diff --git a/fuzzers/002-tilegrid/generate_full.py b/fuzzers/002-tilegrid/generate_full.py
index 3629496..a0f98d3 100644
--- a/fuzzers/002-tilegrid/generate_full.py
+++ b/fuzzers/002-tilegrid/generate_full.py
@@ -73,9 +73,8 @@
             next_tile_type = database[next_tile]['type']
 
             if tile['bits']['CLB_IO_CLK']['offset'] == 0:
-                assert next_tile_type in [
-                    'INT_TERM_B', 'INT_RBRK'
-                ], next_tile_type
+                assert next_tile_type in ['INT_TERM_B',
+                                          'INT_RBRK'], next_tile_type
                 break
 
             baseaddr = int(tile['bits']['CLB_IO_CLK']['baseaddr'], 0)
@@ -84,25 +83,27 @@
             if tile['type'] == 'INT' and next_tile_type == tile['type']:
                 # INT next to INT
                 offset -= int_words
-                localutil.add_tile_bits(
-                    next_tile, database[next_tile], baseaddr, offset,
-                    int_frames, int_words)
+                localutil.add_tile_bits(next_tile, database[next_tile],
+                                        baseaddr, offset, int_frames,
+                                        int_words)
             elif tile['type'] == 'INT':
                 # INT above RCLK
-                assert next_tile_type in ['RCLK_INT_L', 'RCLK_INT_R'], next_tile_type
+                assert next_tile_type in ['RCLK_INT_L',
+                                          'RCLK_INT_R'], next_tile_type
 
                 offset -= rclk_words
-                localutil.add_tile_bits(
-                    next_tile, database[next_tile], baseaddr, offset,
-                    rclk_frames, rclk_words)
+                localutil.add_tile_bits(next_tile, database[next_tile],
+                                        baseaddr, offset, rclk_frames,
+                                        rclk_words)
             else:
                 # RCLK above INT
-                assert tile['type'] in ['RCLK_INT_L', 'RCLK_INT_R'], tile['type']
+                assert tile['type'] in ['RCLK_INT_L',
+                                        'RCLK_INT_R'], tile['type']
                 if next_tile_type == 'INT':
                     offset -= int_words
-                    localutil.add_tile_bits(
-                        next_tile, database[next_tile], baseaddr, offset,
-                        int_frames, int_words)
+                    localutil.add_tile_bits(next_tile, database[next_tile],
+                                            baseaddr, offset, int_frames,
+                                            int_words)
                 else:
                     assert next_tile_type in [], next_tile_type
                     break
@@ -118,9 +119,8 @@
             next_tile_type = database[next_tile]['type']
 
             if tile['bits']['CLB_IO_CLK']['offset'] == 183:
-                assert next_tile_type in [
-                    'INT_TERM_T', 'INT_RBRK'
-                ], next_tile_type
+                assert next_tile_type in ['INT_TERM_T',
+                                          'INT_RBRK'], next_tile_type
                 break
 
             baseaddr = int(tile['bits']['CLB_IO_CLK']['baseaddr'], 0)
@@ -129,26 +129,28 @@
             if tile['type'] == 'INT' and next_tile_type == tile['type']:
                 # INT next to INT
                 offset += int_words
-                localutil.add_tile_bits(
-                    next_tile, database[next_tile], baseaddr, offset,
-                    int_frames, int_words)
+                localutil.add_tile_bits(next_tile, database[next_tile],
+                                        baseaddr, offset, int_frames,
+                                        int_words)
             elif tile['type'] == 'INT':
                 # INT below RCLK
-                assert next_tile_type in ['RCLK_INT_L', 'RCLK_INT_R'], next_tile_type
+                assert next_tile_type in ['RCLK_INT_L',
+                                          'RCLK_INT_R'], next_tile_type
 
                 offset += int_words
-                localutil.add_tile_bits(
-                    next_tile, database[next_tile], baseaddr, offset,
-                    rclk_frames, rclk_words)
+                localutil.add_tile_bits(next_tile, database[next_tile],
+                                        baseaddr, offset, rclk_frames,
+                                        rclk_words)
             else:
                 # RCLK below INT
-                assert tile['type'] in ['RCLK_INT_L', 'RCLK_INT_R'], tile['type']
+                assert tile['type'] in ['RCLK_INT_L',
+                                        'RCLK_INT_R'], tile['type']
                 assert next_tile_type == 'INT', next_tile_type
 
                 offset += rclk_words
-                localutil.add_tile_bits(
-                    next_tile, database[next_tile], baseaddr, offset,
-                    int_frames, int_words)
+                localutil.add_tile_bits(next_tile, database[next_tile],
+                                        baseaddr, offset, int_frames,
+                                        int_words)
 
             tile_name = next_tile
             tile = database[tile_name]
@@ -209,8 +211,8 @@
 
         while True:
             prev_tile = tile
-            tile = tiles_by_grid[(
-                database[tile]['grid_x'], database[tile]['grid_y'] + 1)]
+            tile = tiles_by_grid[(database[tile]['grid_x'],
+                                  database[tile]['grid_y'] + 1)]
             if '_SING' in database[tile]['type']:
                 break
 
@@ -220,8 +222,8 @@
         bits = database[prev_tile]['bits']['CLB_IO_CLK']
 
         while True:
-            tile = tiles_by_grid[(
-                database[tile]['grid_x'], database[tile]['grid_y'] - 1)]
+            tile = tiles_by_grid[(database[tile]['grid_x'],
+                                  database[tile]['grid_y'] - 1)]
             seen_iobs.add(tile)
 
             if '_SING' in database[tile]['type']:
@@ -279,8 +281,8 @@
 
         while True:
             prev_tile = tile
-            tile = tiles_by_grid[(
-                database[tile]['grid_x'], database[tile]['grid_y'] + 1)]
+            tile = tiles_by_grid[(database[tile]['grid_x'],
+                                  database[tile]['grid_y'] + 1)]
             if '_SING' in database[tile]['type']:
                 break
 
@@ -290,8 +292,8 @@
         bits = database[prev_tile]['bits']['CLB_IO_CLK']
 
         while True:
-            tile = tiles_by_grid[(
-                database[tile]['grid_x'], database[tile]['grid_y'] - 1)]
+            tile = tiles_by_grid[(database[tile]['grid_x'],
+                                  database[tile]['grid_y'] - 1)]
             seen_iois.add(tile)
 
             if '_SING' in database[tile]['type']:
@@ -348,12 +350,11 @@
         assert False, "Unsupported architecture"
 
     for tile in tiles:
-        prev_tile = tiles_by_grid[(
-            database[tile]['grid_x'], database[tile]['grid_y'] - 1)]
+        prev_tile = tiles_by_grid[(database[tile]['grid_x'],
+                                   database[tile]['grid_y'] - 1)]
         while database[prev_tile]["type"] != database[tile]["type"]:
-            prev_tile = tiles_by_grid[(
-                database[prev_tile]['grid_x'],
-                database[prev_tile]['grid_y'] - 1)]
+            prev_tile = tiles_by_grid[(database[prev_tile]['grid_x'],
+                                       database[prev_tile]['grid_y'] - 1)]
         bits = database[prev_tile]['bits']['CLB_IO_CLK']
         database[tile]['bits']['CLB_IO_CLK'] = copy.deepcopy(bits)
         database[tile]['bits']['CLB_IO_CLK']['words'] = 4
diff --git a/fuzzers/002-tilegrid/util.py b/fuzzers/002-tilegrid/util.py
index 728fa6f..1d9b336 100644
--- a/fuzzers/002-tilegrid/util.py
+++ b/fuzzers/002-tilegrid/util.py
@@ -20,8 +20,13 @@
     return int_frames, int_words
 
 
-def add_tile_bits(
-        tile_name, tile_db, baseaddr, offset, frames, words, verbose=False):
+def add_tile_bits(tile_name,
+                  tile_db,
+                  baseaddr,
+                  offset,
+                  frames,
+                  words,
+                  verbose=False):
     '''
     Record data structure geometry for the given tile baseaddr
     For most tiles there is only one baseaddr, but some like BRAM have multiple
@@ -33,11 +38,11 @@
 
     assert offset <= 93 * 2, (tile_name, offset)
     # Few rare cases at X=0 for double width tiles split in half => small negative offset
-    assert offset >= 0 or "IOB" in tile_name, (
-        tile_name, hex(baseaddr), offset)
+    assert offset >= 0 or "IOB" in tile_name, (tile_name, hex(baseaddr),
+                                               offset)
     assert 1 <= words <= 93 * 2, words
-    assert offset + words <= 93 * 2, (
-        tile_name, offset + words, offset, words, block_type)
+    assert offset + words <= 93 * 2, (tile_name, offset + words, offset, words,
+                                      block_type)
 
     baseaddr_str = '0x%08X' % baseaddr
     block = bits.get(block_type, None)
diff --git a/fuzzers/010-cle-lutinit/generate.tcl b/fuzzers/010-cle-lutinit/generate.tcl
index 4374037..378eaa8 100644
--- a/fuzzers/010-cle-lutinit/generate.tcl
+++ b/fuzzers/010-cle-lutinit/generate.tcl
@@ -81,4 +81,3 @@
 
 write_bitstream -force design_1.bit
 write_txtdata design_1.txt
-
diff --git a/fuzzers/010-cle-lutinit/top.py b/fuzzers/010-cle-lutinit/top.py
index 60c27c7..7c9707d 100644
--- a/fuzzers/010-cle-lutinit/top.py
+++ b/fuzzers/010-cle-lutinit/top.py
@@ -30,7 +30,7 @@
     # Therefore the generated netlist contains
     # A-B LUTs/FFs or C-D, E-F or G-H LUTs/FFs
     seedn = int(os.getenv("SEEDN")) % 4
-    bels = ['E','F','G','H','A','B','C','D']
+    bels = ['E', 'F', 'G', 'H', 'A', 'B', 'C', 'D']
     for (tile_name, site_name) in sites:
         bel = bels[seedn * 2 + random.randrange(2)]
         params = {}
@@ -39,9 +39,10 @@
         params['bel_lut6'] = bel + "6LUT"
         params['bel_ff'] = bel + "FF"
         sites_params.append(params)
-    print(util.render_template(os.path.join(os.getenv("FUZDIR"), "top.tpl"),{
-        "parameters" : sites_params
-        }))
+    print(
+        util.render_template(
+            os.path.join(os.getenv("FUZDIR"), "top.tpl"),
+            {"parameters": sites_params}))
     write_params(params)
 
 
diff --git a/fuzzers/run_fuzzer.py b/fuzzers/run_fuzzer.py
index fb6ee75..70159d4 100755
--- a/fuzzers/run_fuzzer.py
+++ b/fuzzers/run_fuzzer.py
@@ -287,9 +287,9 @@
     62.0
     """
     units = {
-        'Gi': pow(2,30),
-        'Mi': pow(2,20),
-        'Ki': pow(2,10),
+        'Gi': pow(2, 30),
+        'Mi': pow(2, 20),
+        'Ki': pow(2, 10),
         'G': 1e9,
         'M': 1e6,
         'K': 1e3,
@@ -466,8 +466,7 @@
     if os.path.exists(fuzzer_runok):
         last_modified = datetime.fromtimestamp(os.stat(fuzzer_runok).st_mtime)
 
-        log(
-            "Skipping as run.ok exists (updated @ {})",
+        log("Skipping as run.ok exists (updated @ {})",
             last_modified.isoformat())
 
         return 0
@@ -615,8 +614,7 @@
             'Fuzzer failed with exit code: {}'.format(retcode), )
 
         # Log the last 10,000 lines of stderr on a failure
-        log(
-            """\
+        log("""\
 Failed @ {time_end} with exit code: {retcode}
 --------------------------------------------------------------------------
 {error_log}
diff --git a/minitests/litex/linux/zcu104/src/VexRiscv_Linux.v b/minitests/litex/linux/zcu104/src/VexRiscv_Linux.v
index e79b01b..7ba16d2 100644
--- a/minitests/litex/linux/zcu104/src/VexRiscv_Linux.v
+++ b/minitests/litex/linux/zcu104/src/VexRiscv_Linux.v
@@ -3207,7 +3207,7 @@
     end
   end
 
-  InstructionCache IBusCachedPlugin_cache ( 
+  InstructionCache IBusCachedPlugin_cache (
     .io_flush(_zz_239_),
     .io_cpu_prefetch_isValid(_zz_240_),
     .io_cpu_prefetch_haltIt(IBusCachedPlugin_cache_io_cpu_prefetch_haltIt),
@@ -3253,9 +3253,9 @@
     .io_mem_rsp_payload_data(iBus_rsp_payload_data),
     .io_mem_rsp_payload_error(iBus_rsp_payload_error),
     .clk(clk),
-    .reset(reset) 
+    .reset(reset)
   );
-  DataCache dataCache_1_ ( 
+  DataCache dataCache_1_ (
     .io_cpu_execute_isValid(_zz_248_),
     .io_cpu_execute_address(_zz_249_),
     .io_cpu_execute_args_wr(_zz_250_),
@@ -3308,7 +3308,7 @@
     .io_mem_rsp_payload_data(dBus_rsp_payload_data),
     .io_mem_rsp_payload_error(dBus_rsp_payload_error),
     .clk(clk),
-    .reset(reset) 
+    .reset(reset)
   );
   always @(*) begin
     case(_zz_497_)
diff --git a/minitests/litex/linux/zcu104/src/runme.py b/minitests/litex/linux/zcu104/src/runme.py
index c5ce4d5..7623c24 100755
--- a/minitests/litex/linux/zcu104/src/runme.py
+++ b/minitests/litex/linux/zcu104/src/runme.py
@@ -13,22 +13,33 @@
     f.write('write_checkpoint -force design.dcp')
 
 files = [
-    {'name': os.path.realpath('top.v'), 'file_type': 'verilogSource'},
-    {'name': os.path.realpath('VexRiscv_Linux.v'), 'file_type': 'verilogSource'},
-    {'name': os.path.realpath('top.xdc'), 'file_type': 'xdc'},
+    {
+        'name': os.path.realpath('top.v'),
+        'file_type': 'verilogSource'
+    },
+    {
+        'name': os.path.realpath('VexRiscv_Linux.v'),
+        'file_type': 'verilogSource'
+    },
+    {
+        'name': os.path.realpath('top.xdc'),
+        'file_type': 'xdc'
+    },
 ]
 
 tool = 'vivado'
 
 edam = {
-  'files' : files,
-  'name'  : 'design',
-  'toplevel': 'top',
-  'tool_options' : {'vivado' : {
-    'part' : os.environ['URAY_PART'],
-    'post_imp' : post_imp_file,
-    'synth' : synth_tool
-    }}
+    'files': files,
+    'name': 'design',
+    'toplevel': 'top',
+    'tool_options': {
+        'vivado': {
+            'part': os.environ['URAY_PART'],
+            'post_imp': post_imp_file,
+            'synth': synth_tool
+        }
+    }
 }
 
 backend = edalize.get_edatool(tool)(edam=edam, work_root=work_root)
diff --git a/minitests/litex/zephyr/zcu104/src/VexRiscv_Full.v b/minitests/litex/zephyr/zcu104/src/VexRiscv_Full.v
index a89d5cf..92abdef 100644
--- a/minitests/litex/zephyr/zcu104/src/VexRiscv_Full.v
+++ b/minitests/litex/zephyr/zcu104/src/VexRiscv_Full.v
@@ -2575,7 +2575,7 @@
     end
   end
 
-  InstructionCache IBusCachedPlugin_cache ( 
+  InstructionCache IBusCachedPlugin_cache (
     .io_flush(_zz_221_),
     .io_cpu_prefetch_isValid(_zz_222_),
     .io_cpu_prefetch_haltIt(IBusCachedPlugin_cache_io_cpu_prefetch_haltIt),
@@ -2621,9 +2621,9 @@
     .io_mem_rsp_payload_data(iBus_rsp_payload_data),
     .io_mem_rsp_payload_error(iBus_rsp_payload_error),
     .clk(clk),
-    .reset(reset) 
+    .reset(reset)
   );
-  DataCache dataCache_1_ ( 
+  DataCache dataCache_1_ (
     .io_cpu_execute_isValid(_zz_230_),
     .io_cpu_execute_address(_zz_231_),
     .io_cpu_execute_args_wr(execute_MEMORY_WR),
@@ -2671,7 +2671,7 @@
     .io_mem_rsp_payload_data(dBus_rsp_payload_data),
     .io_mem_rsp_payload_error(dBus_rsp_payload_error),
     .clk(clk),
-    .reset(reset) 
+    .reset(reset)
   );
   always @(*) begin
     case(_zz_375_)
diff --git a/minitests/litex/zephyr/zcu104/src/runme.py b/minitests/litex/zephyr/zcu104/src/runme.py
index b4c89fe..9d79a65 100755
--- a/minitests/litex/zephyr/zcu104/src/runme.py
+++ b/minitests/litex/zephyr/zcu104/src/runme.py
@@ -13,22 +13,33 @@
     f.write('write_checkpoint -force design.dcp')
 
 files = [
-    {'name': os.path.realpath('top.v'), 'file_type': 'verilogSource'},
-    {'name': os.path.realpath('VexRiscv_Full.v'), 'file_type': 'verilogSource'},
-    {'name': os.path.realpath('top.xdc'), 'file_type': 'xdc'},
+    {
+        'name': os.path.realpath('top.v'),
+        'file_type': 'verilogSource'
+    },
+    {
+        'name': os.path.realpath('VexRiscv_Full.v'),
+        'file_type': 'verilogSource'
+    },
+    {
+        'name': os.path.realpath('top.xdc'),
+        'file_type': 'xdc'
+    },
 ]
 
 tool = 'vivado'
 
 edam = {
-  'files' : files,
-  'name'  : 'design',
-  'toplevel': 'top',
-  'tool_options' : {'vivado' : {
-    'part' : os.environ['URAY_PART'],
-    'post_imp' : post_imp_file,
-    'synth' : synth_tool
-    }}
+    'files': files,
+    'name': 'design',
+    'toplevel': 'top',
+    'tool_options': {
+        'vivado': {
+            'part': os.environ['URAY_PART'],
+            'post_imp': post_imp_file,
+            'synth': synth_tool
+        }
+    }
 }
 
 backend = edalize.get_edatool(tool)(edam=edam, work_root=work_root)
diff --git a/minitests/opentitan/src.vivado/lowrisc_ibex_ibex_core_0.1/rtl/ibex_prefetch_buffer.sv b/minitests/opentitan/src.vivado/lowrisc_ibex_ibex_core_0.1/rtl/ibex_prefetch_buffer.sv
index ebd6024..046704c 100644
--- a/minitests/opentitan/src.vivado/lowrisc_ibex_ibex_core_0.1/rtl/ibex_prefetch_buffer.sv
+++ b/minitests/opentitan/src.vivado/lowrisc_ibex_ibex_core_0.1/rtl/ibex_prefetch_buffer.sv
@@ -157,7 +157,7 @@
   // Update on a branch or as soon as a request is issued
   assign fetch_addr_en = branch_i | (valid_new_req & ~valid_req_q);
 
-  assign fetch_addr_d = (branch_i ? addr_i : 
+  assign fetch_addr_d = (branch_i ? addr_i :
                                     {fetch_addr_q[31:2], 2'b00}) +
                         // Current address + 4
                         {{29{1'b0}},(valid_new_req & ~valid_req_q),2'b00};
diff --git a/minitests/opentitan/src.vivado/lowrisc_ip_xbar_main_0.1/xbar_main.sv b/minitests/opentitan/src.vivado/lowrisc_ip_xbar_main_0.1/xbar_main.sv
index b091744..22a9478 100644
--- a/minitests/opentitan/src.vivado/lowrisc_ip_xbar_main_0.1/xbar_main.sv
+++ b/minitests/opentitan/src.vivado/lowrisc_ip_xbar_main_0.1/xbar_main.sv
@@ -375,13 +375,13 @@
     dev_sel_s1n_15 = 3'd4;
     if ((tl_s1n_15_us_h2d.a_address & ~(ADDR_MASK_ROM)) == ADDR_SPACE_ROM) begin
       dev_sel_s1n_15 = 3'd0;
-    
+
     end else if ((tl_s1n_15_us_h2d.a_address & ~(ADDR_MASK_DEBUG_MEM)) == ADDR_SPACE_DEBUG_MEM) begin
       dev_sel_s1n_15 = 3'd1;
-    
+
     end else if ((tl_s1n_15_us_h2d.a_address & ~(ADDR_MASK_RAM_MAIN)) == ADDR_SPACE_RAM_MAIN) begin
       dev_sel_s1n_15 = 3'd2;
-    
+
     end else if ((tl_s1n_15_us_h2d.a_address & ~(ADDR_MASK_EFLASH)) == ADDR_SPACE_EFLASH) begin
       dev_sel_s1n_15 = 3'd3;
     end
@@ -392,16 +392,16 @@
     dev_sel_s1n_20 = 4'd12;
     if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_ROM)) == ADDR_SPACE_ROM) begin
       dev_sel_s1n_20 = 4'd0;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_DEBUG_MEM)) == ADDR_SPACE_DEBUG_MEM) begin
       dev_sel_s1n_20 = 4'd1;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_RAM_MAIN)) == ADDR_SPACE_RAM_MAIN) begin
       dev_sel_s1n_20 = 4'd2;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_EFLASH)) == ADDR_SPACE_EFLASH) begin
       dev_sel_s1n_20 = 4'd3;
-    
+
     end else if (
       ((tl_s1n_20_us_h2d.a_address <= (ADDR_MASK_PERI[0] + ADDR_SPACE_PERI[0])) &&
        (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[0])) ||
@@ -411,25 +411,25 @@
        (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[2]))
     ) begin
       dev_sel_s1n_20 = 4'd4;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_FLASH_CTRL)) == ADDR_SPACE_FLASH_CTRL) begin
       dev_sel_s1n_20 = 4'd5;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_AES)) == ADDR_SPACE_AES) begin
       dev_sel_s1n_20 = 4'd6;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_HMAC)) == ADDR_SPACE_HMAC) begin
       dev_sel_s1n_20 = 4'd7;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_RV_PLIC)) == ADDR_SPACE_RV_PLIC) begin
       dev_sel_s1n_20 = 4'd8;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_PINMUX)) == ADDR_SPACE_PINMUX) begin
       dev_sel_s1n_20 = 4'd9;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_ALERT_HANDLER)) == ADDR_SPACE_ALERT_HANDLER) begin
       dev_sel_s1n_20 = 4'd10;
-    
+
     end else if ((tl_s1n_20_us_h2d.a_address & ~(ADDR_MASK_NMI_GEN)) == ADDR_SPACE_NMI_GEN) begin
       dev_sel_s1n_20 = 4'd11;
     end
@@ -440,13 +440,13 @@
     dev_sel_s1n_30 = 4'd11;
     if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_ROM)) == ADDR_SPACE_ROM) begin
       dev_sel_s1n_30 = 4'd0;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_RAM_MAIN)) == ADDR_SPACE_RAM_MAIN) begin
       dev_sel_s1n_30 = 4'd1;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_EFLASH)) == ADDR_SPACE_EFLASH) begin
       dev_sel_s1n_30 = 4'd2;
-    
+
     end else if (
       ((tl_s1n_30_us_h2d.a_address <= (ADDR_MASK_PERI[0] + ADDR_SPACE_PERI[0])) &&
        (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[0])) ||
@@ -456,25 +456,25 @@
        (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[2]))
     ) begin
       dev_sel_s1n_30 = 4'd3;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_FLASH_CTRL)) == ADDR_SPACE_FLASH_CTRL) begin
       dev_sel_s1n_30 = 4'd4;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_AES)) == ADDR_SPACE_AES) begin
       dev_sel_s1n_30 = 4'd5;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_HMAC)) == ADDR_SPACE_HMAC) begin
       dev_sel_s1n_30 = 4'd6;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_RV_PLIC)) == ADDR_SPACE_RV_PLIC) begin
       dev_sel_s1n_30 = 4'd7;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_PINMUX)) == ADDR_SPACE_PINMUX) begin
       dev_sel_s1n_30 = 4'd8;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_ALERT_HANDLER)) == ADDR_SPACE_ALERT_HANDLER) begin
       dev_sel_s1n_30 = 4'd9;
-    
+
     end else if ((tl_s1n_30_us_h2d.a_address & ~(ADDR_MASK_NMI_GEN)) == ADDR_SPACE_NMI_GEN) begin
       dev_sel_s1n_30 = 4'd10;
     end
diff --git a/minitests/opentitan/src.vivado/lowrisc_ip_xbar_peri_0.1/xbar_peri.sv b/minitests/opentitan/src.vivado/lowrisc_ip_xbar_peri_0.1/xbar_peri.sv
index d1775af..0b153ff 100644
--- a/minitests/opentitan/src.vivado/lowrisc_ip_xbar_peri_0.1/xbar_peri.sv
+++ b/minitests/opentitan/src.vivado/lowrisc_ip_xbar_peri_0.1/xbar_peri.sv
@@ -80,16 +80,16 @@
     dev_sel_s1n_6 = 3'd5;
     if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_UART)) == ADDR_SPACE_UART) begin
       dev_sel_s1n_6 = 3'd0;
-    
+
     end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_GPIO)) == ADDR_SPACE_GPIO) begin
       dev_sel_s1n_6 = 3'd1;
-    
+
     end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_SPI_DEVICE)) == ADDR_SPACE_SPI_DEVICE) begin
       dev_sel_s1n_6 = 3'd2;
-    
+
     end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_RV_TIMER)) == ADDR_SPACE_RV_TIMER) begin
       dev_sel_s1n_6 = 3'd3;
-    
+
     end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_USBDEV)) == ADDR_SPACE_USBDEV) begin
       dev_sel_s1n_6 = 3'd4;
     end
diff --git a/minitests/opentitan/src.vivado/lowrisc_systems_top_earlgrey_0.1/rtl/autogen/top_earlgrey.sv b/minitests/opentitan/src.vivado/lowrisc_systems_top_earlgrey_0.1/rtl/autogen/top_earlgrey.sv
index 1bec4b5..01dab84 100644
--- a/minitests/opentitan/src.vivado/lowrisc_systems_top_earlgrey_0.1/rtl/autogen/top_earlgrey.sv
+++ b/minitests/opentitan/src.vivado/lowrisc_systems_top_earlgrey_0.1/rtl/autogen/top_earlgrey.sv
@@ -217,7 +217,7 @@
   logic intr_usbdev_connected;
 
 
-  
+
   logic [0:0] irq_plic;
   logic [0:0] msip;
   logic [6:0] irq_id[1];
@@ -593,8 +593,8 @@
       .intr_hmac_done_o (intr_hmac_hmac_done),
       .intr_fifo_full_o (intr_hmac_fifo_full),
       .intr_hmac_err_o  (intr_hmac_hmac_err),
-      
-      // [0]: msg_push_sha_disabled 
+
+      // [0]: msg_push_sha_disabled
       .alert_tx_o  ( alert_tx[0:0] ),
       .alert_rx_i  ( alert_rx[0:0] ),
 
diff --git a/minitests/opentitan/src.vivado/runme.py b/minitests/opentitan/src.vivado/runme.py
index 0db0600..5a01ffa 100755
--- a/minitests/opentitan/src.vivado/runme.py
+++ b/minitests/opentitan/src.vivado/runme.py
@@ -195,38 +195,64 @@
 with open(post_imp_file, 'w') as f:
     f.write('write_checkpoint -force design.dcp')
 
-files = [
-    {'name': os.path.realpath('lowrisc_systems_top_earlgrey_zcu104_0.1/data/pins_zcu104.xdc'), 'file_type': 'xdc'},
-    {'name': os.path.realpath('lowrisc_prim_assert_0.1/rtl/prim_assert.sv'), 'file_type': 'systemVerilogSource', 'is_include_file': 'true'}
-]
+files = [{
+    'name':
+    os.path.realpath(
+        'lowrisc_systems_top_earlgrey_zcu104_0.1/data/pins_zcu104.xdc'),
+    'file_type':
+    'xdc'
+},
+         {
+             'name':
+             os.path.realpath('lowrisc_prim_assert_0.1/rtl/prim_assert.sv'),
+             'file_type':
+             'systemVerilogSource',
+             'is_include_file':
+             'true'
+         }]
 
 parameters = {
-    'ROM_INIT_FILE': {'datatype': 'str', 'paramtype': 'vlogdefine'},
-    'PRIM_DEFAULT_IMPL': {'datatype': 'str', 'paramtype': 'vlogdefine'},
+    'ROM_INIT_FILE': {
+        'datatype': 'str',
+        'paramtype': 'vlogdefine'
+    },
+    'PRIM_DEFAULT_IMPL': {
+        'datatype': 'str',
+        'paramtype': 'vlogdefine'
+    },
 }
 
 for src in srcs:
-    files.append({'name': os.path.realpath(src), 'file_type': 'systemVerilogSource'})
+    files.append({
+        'name': os.path.realpath(src),
+        'file_type': 'systemVerilogSource'
+    })
 
 tool = 'vivado'
 
 incdirs = [os.path.realpath('lowrisc_prim_assert_0.1/rtl')]
 
 edam = {
-  'files' : files,
-  'name'  : 'design',
-  'toplevel': 'top_earlgrey_zcu104',
-  'parameters': parameters,
-  'tool_options' : {'vivado' : {
-    'part' : os.environ['URAY_PART'],
-    'post_imp' : post_imp_file,
-    'synth' : synth_tool
-    }}
+    'files': files,
+    'name': 'design',
+    'toplevel': 'top_earlgrey_zcu104',
+    'parameters': parameters,
+    'tool_options': {
+        'vivado': {
+            'part': os.environ['URAY_PART'],
+            'post_imp': post_imp_file,
+            'synth': synth_tool
+        }
+    }
 }
 
 backend = edalize.get_edatool(tool)(edam=edam, work_root=work_root)
 
-args = ['--ROM_INIT_FILE={}'.format(os.path.realpath('boot_rom_fpga_nexysvideo.vmem')), '--PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx']
+args = [
+    '--ROM_INIT_FILE={}'.format(
+        os.path.realpath('boot_rom_fpga_nexysvideo.vmem')),
+    '--PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx'
+]
 
 backend.configure(args)
 backend.build()
diff --git a/minitests/opentitan/src.yosys/runme.py b/minitests/opentitan/src.yosys/runme.py
index 48dbf43..a849db1 100755
--- a/minitests/opentitan/src.yosys/runme.py
+++ b/minitests/opentitan/src.yosys/runme.py
@@ -15,12 +15,16 @@
 with open(post_imp_file, 'w') as f:
     f.write('write_checkpoint -force design.dcp')
 
-files = [
-    {'name': os.path.realpath('../src.vivado/lowrisc_systems_top_earlgrey_zcu104_0.1/data/pins_zcu104.xdc'), 'file_type': 'xdc'}
-]
+files = [{
+    'name':
+    os.path.realpath(
+        '../src.vivado/lowrisc_systems_top_earlgrey_zcu104_0.1/data/pins_zcu104.xdc'
+    ),
+    'file_type':
+    'xdc'
+}]
 
-parameters = {
-}
+parameters = {}
 
 for src in srcs:
     files.append({'name': os.path.realpath(src), 'file_type': 'verilogSource'})
@@ -30,15 +34,17 @@
 incdirs = {}
 
 edam = {
-  'files' : files,
-  'name'  : 'design',
-  'toplevel': 'top_earlgrey_zcu104',
-  'parameters': parameters,
-  'tool_options' : {'vivado' : {
-    'part' : os.environ['URAY_PART'],
-    'post_imp' : post_imp_file,
-    'synth' : synth_tool
-    }}
+    'files': files,
+    'name': 'design',
+    'toplevel': 'top_earlgrey_zcu104',
+    'parameters': parameters,
+    'tool_options': {
+        'vivado': {
+            'part': os.environ['URAY_PART'],
+            'post_imp': post_imp_file,
+            'synth': synth_tool
+        }
+    }
 }
 
 backend = edalize.get_edatool(tool)(edam=edam, work_root=work_root)
diff --git a/minitests/util/runme.py b/minitests/util/runme.py
index 59bb24b..6f8cd63 100644
--- a/minitests/util/runme.py
+++ b/minitests/util/runme.py
@@ -6,8 +6,8 @@
 pins = {
     'clk': os.environ['URAY_PIN_00'],
     'stb': os.environ['URAY_PIN_01'],
-    'di':  os.environ['URAY_PIN_02'],
-    'do':  os.environ['URAY_PIN_03'],
+    'di': os.environ['URAY_PIN_02'],
+    'do': os.environ['URAY_PIN_03'],
 }
 
 xdc_file = os.path.realpath(os.path.join(work_root, 'top.xdc'))
@@ -21,35 +21,47 @@
 with open(xdc_file, 'w') as f:
     f.write('set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets *]\n')
     for key, val in pins.items():
-        f.write('set_property PACKAGE_PIN {} [get_ports {}]\n'.format(val, key))
-        f.write('set_property IOSTANDARD LVCMOS33 [get_ports {}]\n'.format(key))
+        f.write('set_property PACKAGE_PIN {} [get_ports {}]\n'.format(
+            val, key))
+        f.write(
+            'set_property IOSTANDARD LVCMOS33 [get_ports {}]\n'.format(key))
 
 with open(pre_imp_file, 'w') as f:
     f.write('create_pblock roi\n')
     f.write('add_cells_to_pblock [get_pblocks roi] [get_cells roi]\n')
-    f.write('resize_pblock [get_pblocks roi] -add "{}"\n'.format(os.environ['URAY_ROI']))
-    f.write('set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]\n')
+    f.write('resize_pblock [get_pblocks roi] -add "{}"\n'.format(
+        os.environ['URAY_ROI']))
+    f.write(
+        'set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]\n')
 
 with open(post_imp_file, 'w') as f:
     f.write('write_checkpoint -force design.dcp')
 
 files = [
-    {'name': os.path.realpath('top.v'), 'file_type': 'verilogSource'},
-    {'name': xdc_file, 'file_type': 'xdc'},
+    {
+        'name': os.path.realpath('top.v'),
+        'file_type': 'verilogSource'
+    },
+    {
+        'name': xdc_file,
+        'file_type': 'xdc'
+    },
 ]
 
 tool = 'vivado'
 
 edam = {
-  'files' : files,
-  'name'  : 'design',
-  'toplevel': 'top',
-  'tool_options' : {'vivado' : {
-    'part' : os.environ['URAY_PART'],
-    'pre_imp' : pre_imp_file,
-    'post_imp' : post_imp_file,
-    'synth' : synth_tool
-    }}
+    'files': files,
+    'name': 'design',
+    'toplevel': 'top',
+    'tool_options': {
+        'vivado': {
+            'part': os.environ['URAY_PART'],
+            'pre_imp': pre_imp_file,
+            'post_imp': post_imp_file,
+            'synth': synth_tool
+        }
+    }
 }
 
 backend = edalize.get_edatool(tool)(edam=edam, work_root=work_root)
diff --git a/spec/bram18.py b/spec/bram18.py
index bdb537b..e819f83 100644
--- a/spec/bram18.py
+++ b/spec/bram18.py
@@ -16,68 +16,96 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 600
 print("    wire [35:0] int_d[0:%d-1];" % N)
-print("    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];")
+print(
+    "    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];"
+)
 for i in range(N):
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
-	write_width_a = 0 if (write_width_b == 36 or read_width_a == 36) else np.random.choice([0, 1, 2, 4, 9, 18])
-	read_width_b = 0 if (read_width_a == 36 or write_width_b == 36) else np.random.choice([0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
+    read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36],
+                                    p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
+    write_width_a = 0 if (write_width_b == 36
+                          or read_width_a == 36) else np.random.choice(
+                              [0, 1, 2, 4, 9, 18])
+    read_width_b = 0 if (
+        read_width_a == 36 or write_width_b == 36) else np.random.choice(
+            [0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
 
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    RAMB18E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .DOB_REG(%d),"% (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
-	print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN(wdata[15:0]),")
-	print("        .DINPADINP(wdata[17:16]),")
-	print("        .DOUTADOUT(int_d[%d][15:0])," % i)
-	print("        .DOUTPADOUTP(int_d[%d][17:16])," % i)
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
-	print("        .DINBDIN(wdata[15:0]),")
-	print("        .DINPBDINP(wdata[17:16]),")
-	print("        .DOUTBDOUT(int_d[%d][33:18])," % i)
-	print("        .DOUTPBDOUTP(int_d[%d][35:34])," % i)
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("2'b00" if write_width_b == 0 else ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    RAMB18E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print(
+        "        .DOA_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print(
+        "        .DOB_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
+    print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN(wdata[15:0]),")
+    print("        .DINPADINP(wdata[17:16]),")
+    print("        .DOUTADOUT(int_d[%d][15:0])," % i)
+    print("        .DOUTPADOUTP(int_d[%d][17:16])," % i)
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
+    print("        .DINBDIN(wdata[15:0]),")
+    print("        .DINPBDINP(wdata[17:16]),")
+    print("        .DOUTBDOUT(int_d[%d][33:18])," % i)
+    print("        .DOUTPBDOUTP(int_d[%d][35:34])," % i)
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print("        .WEBWE(%s)" %
+          ("2'b00" if write_width_b == 0 else
+           ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/bram18_2.py b/spec/bram18_2.py
index 4e7763e..6caaa40 100644
--- a/spec/bram18_2.py
+++ b/spec/bram18_2.py
@@ -16,74 +16,104 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 200
 print("    wire [35:0] int_d[0:%d-1];" % N)
-print("    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];")
+print(
+    "    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];"
+)
 for i in range(N):
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
-	write_width_a = 0 if (write_width_b == 36 or read_width_a == 36) else np.random.choice([0, 1, 2, 4, 9, 18])
-	read_width_b = 0 if (read_width_a == 36 or write_width_b == 36) else np.random.choice([0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
+    read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36],
+                                    p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
+    write_width_a = 0 if (write_width_b == 36
+                          or read_width_a == 36) else np.random.choice(
+                              [0, 1, 2, 4, 9, 18])
+    read_width_b = 0 if (
+        read_width_a == 36 or write_width_b == 36) else np.random.choice(
+            [0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
 
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    (* keep, dont_touch *) RAMB18E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .DOB_REG(%d),"% (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
-	print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN(wdata[15:0]),")
-	print("        .DINPADINP(wdata[17:16]),")
-	douta_len = np.random.randint(0, 19)
-	if douta_len > 0:	
-		print("        .DOUTADOUT(int_d[%d][%d:0])," % (i, min(15, douta_len - 1)))
-	if douta_len > 16:
-		print("        .DOUTPADOUTP(int_d[%d][%d:16])," % (i, douta_len - 1))
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
-	print("        .DINBDIN(wdata[15:0]),")
-	print("        .DINPBDINP(wdata[17:16]),")
-	doutb_len = np.random.randint(0, 19)
-	if doutb_len > 0:
-		print("        .DOUTBDOUT(int_d[%d][%d:18])," % (i, min(33, 17 + doutb_len)))
-	if doutb_len > 16:
-		print("        .DOUTPBDOUTP(int_d[%d][%d:34])," % (i, 17 + doutb_len))
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("2'b00" if write_width_b == 0 else ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    (* keep, dont_touch *) RAMB18E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print(
+        "        .DOA_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print(
+        "        .DOB_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
+    print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN(wdata[15:0]),")
+    print("        .DINPADINP(wdata[17:16]),")
+    douta_len = np.random.randint(0, 19)
+    if douta_len > 0:
+        print("        .DOUTADOUT(int_d[%d][%d:0])," %
+              (i, min(15, douta_len - 1)))
+    if douta_len > 16:
+        print("        .DOUTPADOUTP(int_d[%d][%d:16])," % (i, douta_len - 1))
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
+    print("        .DINBDIN(wdata[15:0]),")
+    print("        .DINPBDINP(wdata[17:16]),")
+    doutb_len = np.random.randint(0, 19)
+    if doutb_len > 0:
+        print("        .DOUTBDOUT(int_d[%d][%d:18])," %
+              (i, min(33, 17 + doutb_len)))
+    if doutb_len > 16:
+        print("        .DOUTPBDOUTP(int_d[%d][%d:34])," % (i, 17 + doutb_len))
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print("        .WEBWE(%s)" %
+          ("2'b00" if write_width_b == 0 else
+           ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/bram18_3.py b/spec/bram18_3.py
index 8c26653..df37860 100644
--- a/spec/bram18_3.py
+++ b/spec/bram18_3.py
@@ -16,74 +16,106 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 500
 print("    wire [35:0] int_d[0:%d-1];" % N)
-print("    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];")
+print(
+    "    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];"
+)
 for i in range(N):
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
-	write_width_a = 0 if (write_width_b == 36 or read_width_a == 36) else np.random.choice([0, 1, 2, 4, 9, 18])
-	read_width_b = 0 if (read_width_a == 36 or write_width_b == 36) else np.random.choice([0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
+    read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36],
+                                    p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
+    write_width_a = 0 if (write_width_b == 36
+                          or read_width_a == 36) else np.random.choice(
+                              [0, 1, 2, 4, 9, 18])
+    read_width_b = 0 if (
+        read_width_a == 36 or write_width_b == 36) else np.random.choice(
+            [0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])
 
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    (* keep, dont_touch *) RAMB18E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .DOB_REG(%d),"% (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
-	print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
-	print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN(wdata[15:0]),")
-	print("        .DINPADINP(wdata[17:16]),")
-	douta_bit = np.random.randint(-1, 19)
-	if douta_bit >= 0 and douta_bit < 16:	
-		print("        .DOUTADOUT({int_d[%d][0]%s})," % (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
-	if douta_bit >= 16:
-		print("        .DOUTPADOUTP({int_d[%d][16]%s})," % (i, ", {%d{1'bx}}" % (douta_bit - 16) if douta_bit > 16 else ""))
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
-	print("        .DINBDIN(wdata[15:0]),")
-	print("        .DINPBDINP(wdata[17:16]),")
-	doutb_bit = np.random.randint(-1, 19)
-	if doutb_bit >= 0 and doutb_bit < 16:	
-		print("        .DOUTBDOUT({int_d[%d][18]%s})," % (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
-	if doutb_bit >= 16:
-		print("        .DOUTPBDOUTP({int_d[%d][34]%s})," % (i, ", {%d{1'bx}}" % (doutb_bit - 16) if doutb_bit > 16 else ""))
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("2'b00" if write_width_b == 0 else ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    (* keep, dont_touch *) RAMB18E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print(
+        "        .DOA_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print(
+        "        .DOB_REG(%d)," % (0 if
+                                   (write_width_b == 36 or read_width_a == 36)
+                                   else np.random.randint(2)))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
+    print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
+    print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN(wdata[15:0]),")
+    print("        .DINPADINP(wdata[17:16]),")
+    douta_bit = np.random.randint(-1, 19)
+    if douta_bit >= 0 and douta_bit < 16:
+        print("        .DOUTADOUT({int_d[%d][0]%s})," %
+              (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
+    if douta_bit >= 16:
+        print("        .DOUTPADOUTP({int_d[%d][16]%s})," %
+              (i, ", {%d{1'bx}}" % (douta_bit - 16) if douta_bit > 16 else ""))
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
+    print("        .DINBDIN(wdata[15:0]),")
+    print("        .DINPBDINP(wdata[17:16]),")
+    doutb_bit = np.random.randint(-1, 19)
+    if doutb_bit >= 0 and doutb_bit < 16:
+        print("        .DOUTBDOUT({int_d[%d][18]%s})," %
+              (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
+    if doutb_bit >= 16:
+        print("        .DOUTPBDOUTP({int_d[%d][34]%s})," %
+              (i, ", {%d{1'bx}}" % (doutb_bit - 16) if doutb_bit > 16 else ""))
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print("        .WEBWE(%s)" %
+          ("2'b00" if write_width_b == 0 else
+           ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/bram36.py b/spec/bram36.py
index 6e6ed40..6211d20 100644
--- a/spec/bram36.py
+++ b/spec/bram36.py
@@ -16,70 +16,93 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 300
 print("    wire [71:0] int_d[0:%d-1];" % N)
 print("    assign rdata = int_d[sel[10:2]][18 * sel[1:0] +: 18];")
 for i in range(N):
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
-	write_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36],
+                                    p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
+    write_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36])
+    read_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36],
+                                    p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    RAMB36E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % np.random.randint(2))
-	print("        .DOB_REG(%d),"% np.random.randint(2))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
-	print("        .DOUTADOUT({int_d[%d][31:0]})," % i)
-	print("        .DOUTPADOUTP({int_d[%d][35:32]})," % i)
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
-	print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
-	print("        .DOUTBDOUT(int_d[%d][67:36])," % i)
-	print("        .DOUTPBDOUTP(int_d[%d][71:68])," % i)
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("4'b00" if write_width_b == 0 else "we[7:4]"))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    RAMB36E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .DOA_REG(%d)," % np.random.randint(2))
+    print("        .DOB_REG(%d)," % np.random.randint(2))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"], p=[0.9, 0.1]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                   np.random.randint(2**18)))
+    print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
+    print("        .DOUTADOUT({int_d[%d][31:0]})," % i)
+    print("        .DOUTPADOUTP({int_d[%d][35:32]})," % i)
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
+    print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
+    print("        .DOUTBDOUT(int_d[%d][67:36])," % i)
+    print("        .DOUTPBDOUTP(int_d[%d][71:68])," % i)
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print(
+        "        .WEBWE(%s)" % ("4'b00" if write_width_b == 0 else "we[7:4]"))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/bram36_sdp.py b/spec/bram36_sdp.py
index def70ef..7a675a9 100644
--- a/spec/bram36_sdp.py
+++ b/spec/bram36_sdp.py
@@ -16,70 +16,104 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 300
 print("    wire [71:0] int_d[0:%d-1];" % N)
 print("    assign rdata = int_d[sel[10:2]][18 * sel[1:0] +: 18];")
 for i in range(N):
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72])
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72], p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1])
-	write_width_a = 0 if (write_width_b == 72 or read_width_a == 72) else np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_b = 0 if (write_width_b == 72 or read_width_a == 72) else np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72])
+    read_width_a = np.random.choice(
+        [0, 1, 2, 4, 9, 18, 36, 72],
+        p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1])
+    write_width_a = 0 if (write_width_b == 72
+                          or read_width_a == 72) else np.random.choice(
+                              [0, 1, 2, 4, 9, 18, 36])
+    read_width_b = 0 if (
+        write_width_b == 72 or read_width_a == 72) else np.random.choice(
+            [0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    RAMB36E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % (0 if (write_width_b == 72 or read_width_a == 72) else np.random.randint(2)))
-	print("        .DOB_REG(%d)," % (0 if (write_width_b == 72 or read_width_a == 72) else np.random.randint(2)))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
-	print("        .DOUTADOUT({int_d[%d][31:0]})," % i)
-	print("        .DOUTPADOUTP({int_d[%d][35:32]})," % i)
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
-	print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
-	print("        .DOUTBDOUT(int_d[%d][67:36])," % i)
-	print("        .DOUTPBDOUTP(int_d[%d][71:68])," % i)
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("4'b00" if write_width_b == 0 else ("we[7:0]" if write_width_b == 72 else "we[7:4]")))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    RAMB36E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print(
+        "        .DOA_REG(%d)," % (0 if
+                                   (write_width_b == 72 or read_width_a == 72)
+                                   else np.random.randint(2)))
+    print(
+        "        .DOB_REG(%d)," % (0 if
+                                   (write_width_b == 72 or read_width_a == 72)
+                                   else np.random.randint(2)))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"], p=[0.9, 0.1]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                   np.random.randint(2**18)))
+    print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
+    print("        .DOUTADOUT({int_d[%d][31:0]})," % i)
+    print("        .DOUTPADOUTP({int_d[%d][35:32]})," % i)
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
+    print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
+    print("        .DOUTBDOUT(int_d[%d][67:36])," % i)
+    print("        .DOUTPBDOUTP(int_d[%d][71:68])," % i)
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print("        .WEBWE(%s)" %
+          ("4'b00" if write_width_b == 0 else
+           ("we[7:0]" if write_width_b == 72 else "we[7:4]")))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/bram36_sdp_2.py b/spec/bram36_sdp_2.py
index b415899..0e8b252 100644
--- a/spec/bram36_sdp_2.py
+++ b/spec/bram36_sdp_2.py
@@ -16,76 +16,114 @@
 import sys
 import math
 
-print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
+print(
+    "module top(input clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
+)
 N = 300
 print("    wire [71:0] int_d[0:%d-1];" % N)
 print("    assign rdata = int_d[sel[10:2]][18 * sel[1:0] +: 18];")
 for i in range(N):
-	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72])
-	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72], p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1])
-	write_width_a = 0 if (write_width_b == 72 or read_width_a == 72) else np.random.choice([0, 1, 2, 4, 9, 18, 36])
-	read_width_b = 0 if (write_width_b == 72 or read_width_a == 72) else np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
-	cd = np.random.choice(["INDEPENDENT", "COMMON"])
+    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72])
+    read_width_a = np.random.choice(
+        [0, 1, 2, 4, 9, 18, 36, 72],
+        p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1])
+    write_width_a = 0 if (write_width_b == 72
+                          or read_width_a == 72) else np.random.choice(
+                              [0, 1, 2, 4, 9, 18, 36])
+    read_width_b = 0 if (
+        write_width_b == 72 or read_width_a == 72) else np.random.choice(
+            [0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
+    cd = np.random.choice(["INDEPENDENT", "COMMON"])
 
-	print("    RAMB36E2 #(")
-	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
-	print("        .READ_WIDTH_A(%d)," % read_width_a)
-	print("        .READ_WIDTH_B(%d)," % read_width_b)
-	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
-	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
-	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
-	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
-	print("        .DOA_REG(%d)," % (0 if (write_width_b == 72 or read_width_a == 72) else np.random.randint(2)))
-	print("        .DOB_REG(%d)," % (0 if (write_width_b == 72 or read_width_a == 72) else np.random.randint(2)))
-	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], p=[0.9, 0.1]))
-	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
-	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
-	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
-		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
-	print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18), np.random.randint(2**18)))
-	print("   ) ram%d (" % i)
-	print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
-	douta_bit = np.random.randint(-1, 37)
-	if douta_bit >= 0 and douta_bit < 32:	
-		print("        .DOUTADOUT({int_d[%d][0]%s})," % (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
-	if douta_bit >= 32:
-		print("        .DOUTPADOUTP({int_d[%d][32]%s})," % (i, ", {%d{1'bx}}" % (douta_bit - 32) if douta_bit > 32 else ""))
-	print("        .ADDRARDADDR(ra),")
-	print("        .CLKARDCLK(clk),")
-	print("        .ADDRENA(ena),")
-	print("        .ENARDEN(ena),")
-	print("        .REGCEAREGCE(cea),")
-	print("        .RSTRAMARSTRAM(rst),")
-	print("        .RSTREGARSTREG(rst),")
-	print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
-	print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
-	print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
-	doutb_bit = np.random.randint(-1, 37)
-	if doutb_bit >= 0 and doutb_bit < 32:	
-		print("        .DOUTBDOUT({int_d[%d][36]%s})," % (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
-	if doutb_bit >= 32:
-		print("        .DOUTPBDOUTP({int_d[%d][68]%s})," % (i, ", {%d{1'bx}}" % (doutb_bit - 32) if doutb_bit > 32 else ""))
-	print("        .ADDRBWRADDR(wa),")
-	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
-	print("        .ENBWREN(enb),")
-	print("        .ADDRENB(enb),")
-	print("        .REGCEB(ceb),")
-	print("        .RSTRAMB(rst),")
-	print("        .RSTREGB(rst),")
-	print("        .WEBWE(%s)" % ("4'b00" if write_width_b == 0 else ("we[7:0]" if write_width_b == 72 else "we[7:4]")))
-	print("   );")
-	print()
-print("endmodule")
\ No newline at end of file
+    print("    RAMB36E2 #(")
+    print("        .CLOCK_DOMAINS(\"%s\")," % cd)
+    print("        .READ_WIDTH_A(%d)," % read_width_a)
+    print("        .READ_WIDTH_B(%d)," % read_width_b)
+    print("        .WRITE_WIDTH_A(%d)," % write_width_a)
+    print("        .WRITE_WIDTH_B(%d)," % write_width_b)
+    print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(
+        ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
+    print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(
+        ["NONE", "FIRST", "MIDDLE", "LAST"]))
+    print(
+        "        .DOA_REG(%d)," % (0 if
+                                   (write_width_b == 72 or read_width_a == 72)
+                                   else np.random.randint(2)))
+    print(
+        "        .DOB_REG(%d)," % (0 if
+                                   (write_width_b == 72 or read_width_a == 72)
+                                   else np.random.randint(2)))
+    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
+                                                             p=[0.9, 0.1]))
+    print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"], p=[0.9, 0.1]))
+    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
+        ["FALSE", "TRUE"]))
+    print(
+        "        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
+    print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(
+        ["RSTREG", "REGCE"]))
+    for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN",
+                "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
+        print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
+    print("        .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
+                                                   np.random.randint(2**18)))
+    print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18),
+                                                  np.random.randint(2**18)))
+    print("   ) ram%d (" % i)
+    print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
+    douta_bit = np.random.randint(-1, 37)
+    if douta_bit >= 0 and douta_bit < 32:
+        print("        .DOUTADOUT({int_d[%d][0]%s})," %
+              (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
+    if douta_bit >= 32:
+        print("        .DOUTPADOUTP({int_d[%d][32]%s})," %
+              (i, ", {%d{1'bx}}" % (douta_bit - 32) if douta_bit > 32 else ""))
+    print("        .ADDRARDADDR(ra),")
+    print("        .CLKARDCLK(clk),")
+    print("        .ADDRENA(ena),")
+    print("        .ENARDEN(ena),")
+    print("        .REGCEAREGCE(cea),")
+    print("        .RSTRAMARSTRAM(rst),")
+    print("        .RSTREGARSTREG(rst),")
+    print("        .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
+    print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
+    print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
+    doutb_bit = np.random.randint(-1, 37)
+    if doutb_bit >= 0 and doutb_bit < 32:
+        print("        .DOUTBDOUT({int_d[%d][36]%s})," %
+              (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
+    if doutb_bit >= 32:
+        print("        .DOUTPBDOUTP({int_d[%d][68]%s})," %
+              (i, ", {%d{1'bx}}" % (doutb_bit - 32) if doutb_bit > 32 else ""))
+    print("        .ADDRBWRADDR(wa),")
+    print(
+        "        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
+    print("        .ENBWREN(enb),")
+    print("        .ADDRENB(enb),")
+    print("        .REGCEB(ceb),")
+    print("        .RSTRAMB(rst),")
+    print("        .RSTREGB(rst),")
+    print("        .WEBWE(%s)" %
+          ("4'b00" if write_width_b == 0 else
+           ("we[7:0]" if write_width_b == 72 else "we[7:4]")))
+    print("   );")
+    print()
+print("endmodule")
diff --git a/spec/dsp.py b/spec/dsp.py
index d550444..e56c8b0 100644
--- a/spec/dsp.py
+++ b/spec/dsp.py
@@ -20,133 +20,228 @@
 
 root = sys.argv[2]
 
+
 def random_vector(size):
-	return "{%s}" % ", ".join(["d[%d]" % np.random.randint(40) for k in range(size)])
+    return "{%s}" % ", ".join(
+        ["d[%d]" % np.random.randint(40) for k in range(size)])
+
 
 for x in range(X):
 
-
-	with open(root + "/dsp1/dsp%d.v" % x, "w") as f:
-		print("module top(input [7:0] clk, cen, rst, input [39:0] d, input [7:0] sel, output [63:0] q);", file=f)
-		print("    wire [8:0] r = {1'b0, rst}, e = {1'b1, cen};", file=f)
-		print("    wire [63:0] int_q[0:%d];" % (N-1), file=f)
-		print("    assign q = int_q[sel];", file=f)
-		for i in range(N):
-			use_preadd = np.random.choice([False, True])
-			bmultsel = (np.random.choice(["AD", "B"]) if use_preadd else "B")
-			amultsel = (np.random.choice(["AD", "A"]) if use_preadd and bmultsel == "AD" else ("AD" if use_preadd else "A"))
-			use_patdet = np.random.choice([False, True])
-			print("    DSP48E2 #(", file=f)
-			print("        .ADREG(%d)," % (np.random.randint(2) if use_preadd else 0), file=f)
-			print("        .ALUMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .AMULTSEL(\"%s\")," % amultsel, file=f)
-			print("        .AREG(%d)," % np.random.randint(3), file=f)
-			print("        .AUTORESET_PATDET(\"%s\")," % np.random.choice(["NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"]), file=f)
-			print("        .AUTORESET_PRIORITY(\"%s\")," % np.random.choice(["RESET", "CEP"]), file=f)
-			print("        .A_INPUT(\"DIRECT\"),", file=f)
-			print("        .BMULTSEL(\"%s\")," % bmultsel,file=f)
-			print("        .BREG(%d)," % np.random.randint(3), file=f)
-			print("        .B_INPUT(\"DIRECT\"),", file=f)
-			print("        .CARRYINREG(%d)," % np.random.randint(2), file=f)
-			print("        .CARRYINSELREG(%d)," % np.random.randint(2), file=f)
-			print("        .CREG(%d)," % np.random.randint(2), file=f)
-			print("        .DREG(%d)," % np.random.randint(2), file=f)
-			print("        .INMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .IS_ALUMODE_INVERTED(%d)," % np.random.randint(16), file=f)
-			print("        .IS_CARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_CLK_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_INMODE_INVERTED(%d)," % np.random.randint(32), file=f)
-			print("        .IS_OPMODE_INVERTED(%d)," % np.random.randint(512), file=f)
-			print("        .IS_RSTALLCARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTALUMODE_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTA_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTB_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTCTRL_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTC_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTD_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTINMODE_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTM_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTP_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .MASK({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .MREG(%d)," % np.random.randint(2), file=f)
-			print("        .OPMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .PATTERN({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .PREADDINSEL(\"%s\")," % np.random.choice(["A", "B"]), file=f)
-			print("        .PREG(%d)," % np.random.randint(2), file=f)
-			print("        .RND({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .SEL_MASK(\"%s\")," % np.random.choice(["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]), file=f)
-			print("        .SEL_PATTERN(\"%s\")," % np.random.choice(["PATTERN", "C"]), file=f)
-			print("        .USE_PATTERN_DETECT(\"%s\")," % ("PATDET" if use_patdet else "NO_PATDET"), file=f)
-			print("        .USE_SIMD(\"%s\")," %  np.random.choice(["ONE48", "TWO24", "FOUR12"]), file=f)
-			print("        .USE_WIDEXOR(\"%s\")," %  np.random.choice(["TRUE", "FALSE"]), file=f)
-			print("        .XORSIMD(\"%s\")" %  np.random.choice(["XOR12", "XOR24_48_96"]), file=f)
-			print("    ) dsp_%d (" % i, file=f)
-			print("        .A(%s)," % random_vector(30), file=f)
-			print("        .ALUMODE(%s)," % random_vector(4), file=f)
-			print("        .B(%s)," % random_vector(18), file=f)
-			print("        .C(%s)," % random_vector(48), file=f)
-			print("        .CARRYIN(%s)," % random_vector(1), file=f)
-			print("        .CEA1(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEA2(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEAD(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEALUMODE(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEC(e[%d])," % np.random.randint(9), file=f)
-			print("        .CECARRYIN(e[%d])," % np.random.randint(9), file=f)
-			print("        .CECTRL(e[%d])," % np.random.randint(9), file=f)
-			print("        .CED(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEINMODE(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEM(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEP(e[%d])," % np.random.randint(9), file=f)
-			print("        .CLK(clk[%d])," % np.random.randint(8), file=f)
-			print("        .D(%s)," % random_vector(27), file=f)
-			print("        .INMODE(%s)," % random_vector(5), file=f)
-			print("        .OPMODE(%s)," % random_vector(9), file=f)
-			print("        .RSTA(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTALLCARRYIN(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTALUMODE(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTB(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTC(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTCTRL(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTD(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTINMODE(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTM(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTP(r[%d])," % np.random.randint(9), file=f)
-			print("        .P(int_q[%d][47:0])," % i, file=f)
-			print("        .CARRYOUT(int_q[%d][51:48])," % i, file=f)
-			print("        .XOROUT(int_q[%d][59:52])," % i, file=f)
-			print("        .PATTERNDETECT(int_q[%d][60])," % i, file=f)
-			print("        .PATTERNBDETECT(int_q[%d][61])," % i, file=f)
-			print("        .OVERFLOW(int_q[%d][62])," % i, file=f)
-			print("        .UNDERFLOW(int_q[%d][63])" % i, file=f)
-			print("    );", file=f)
-			print("", file=f)
-		print("endmodule", file=f)
-	with open(root + "/dsp1/dsp%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/dsp1/dsp%d.v" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks AVAL-*]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks REQP-*]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_bram/dsp%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_bram/dsp%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_bram/dsp%d.bit" % (root, x), file=f)
+    with open(root + "/dsp1/dsp%d.v" % x, "w") as f:
+        print(
+            "module top(input [7:0] clk, cen, rst, input [39:0] d, input [7:0] sel, output [63:0] q);",
+            file=f)
+        print("    wire [8:0] r = {1'b0, rst}, e = {1'b1, cen};", file=f)
+        print("    wire [63:0] int_q[0:%d];" % (N - 1), file=f)
+        print("    assign q = int_q[sel];", file=f)
+        for i in range(N):
+            use_preadd = np.random.choice([False, True])
+            bmultsel = (np.random.choice(["AD", "B"]) if use_preadd else "B")
+            amultsel = (np.random.choice(["AD", "A"])
+                        if use_preadd and bmultsel == "AD" else
+                        ("AD" if use_preadd else "A"))
+            use_patdet = np.random.choice([False, True])
+            print("    DSP48E2 #(", file=f)
+            print(
+                "        .ADREG(%d)," %
+                (np.random.randint(2) if use_preadd else 0),
+                file=f)
+            print("        .ALUMODEREG(%d)," % np.random.randint(2), file=f)
+            print("        .AMULTSEL(\"%s\")," % amultsel, file=f)
+            print("        .AREG(%d)," % np.random.randint(3), file=f)
+            print(
+                "        .AUTORESET_PATDET(\"%s\")," % np.random.choice(
+                    ["NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"]),
+                file=f)
+            print(
+                "        .AUTORESET_PRIORITY(\"%s\")," % np.random.choice(
+                    ["RESET", "CEP"]),
+                file=f)
+            print("        .A_INPUT(\"DIRECT\"),", file=f)
+            print("        .BMULTSEL(\"%s\")," % bmultsel, file=f)
+            print("        .BREG(%d)," % np.random.randint(3), file=f)
+            print("        .B_INPUT(\"DIRECT\"),", file=f)
+            print("        .CARRYINREG(%d)," % np.random.randint(2), file=f)
+            print("        .CARRYINSELREG(%d)," % np.random.randint(2), file=f)
+            print("        .CREG(%d)," % np.random.randint(2), file=f)
+            print("        .DREG(%d)," % np.random.randint(2), file=f)
+            print("        .INMODEREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .IS_ALUMODE_INVERTED(%d)," % np.random.randint(16),
+                file=f)
+            print(
+                "        .IS_CARRYIN_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_CLK_INVERTED(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .IS_INMODE_INVERTED(%d)," % np.random.randint(32),
+                file=f)
+            print(
+                "        .IS_OPMODE_INVERTED(%d)," % np.random.randint(512),
+                file=f)
+            print(
+                "        .IS_RSTALLCARRYIN_INVERTED(%d)," %
+                np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTALUMODE_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTA_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTB_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTCTRL_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTC_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTD_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTINMODE_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTM_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTP_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .MASK({24'd%d, 24'd%d})," % (np.random.randint(
+                    2**24), np.random.randint(2**24)),
+                file=f)
+            print("        .MREG(%d)," % np.random.randint(2), file=f)
+            print("        .OPMODEREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .PATTERN({24'd%d, 24'd%d})," % (np.random.randint(
+                    2**24), np.random.randint(2**24)),
+                file=f)
+            print(
+                "        .PREADDINSEL(\"%s\")," % np.random.choice(["A", "B"]),
+                file=f)
+            print("        .PREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .RND({24'd%d, 24'd%d})," % (np.random.randint(2**24),
+                                                     np.random.randint(2**24)),
+                file=f)
+            print(
+                "        .SEL_MASK(\"%s\")," % np.random.choice(
+                    ["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]),
+                file=f)
+            print(
+                "        .SEL_PATTERN(\"%s\")," % np.random.choice(
+                    ["PATTERN", "C"]),
+                file=f)
+            print(
+                "        .USE_PATTERN_DETECT(\"%s\")," %
+                ("PATDET" if use_patdet else "NO_PATDET"),
+                file=f)
+            print(
+                "        .USE_SIMD(\"%s\")," % np.random.choice(
+                    ["ONE48", "TWO24", "FOUR12"]),
+                file=f)
+            print(
+                "        .USE_WIDEXOR(\"%s\")," % np.random.choice(
+                    ["TRUE", "FALSE"]),
+                file=f)
+            print(
+                "        .XORSIMD(\"%s\")" % np.random.choice(
+                    ["XOR12", "XOR24_48_96"]),
+                file=f)
+            print("    ) dsp_%d (" % i, file=f)
+            print("        .A(%s)," % random_vector(30), file=f)
+            print("        .ALUMODE(%s)," % random_vector(4), file=f)
+            print("        .B(%s)," % random_vector(18), file=f)
+            print("        .C(%s)," % random_vector(48), file=f)
+            print("        .CARRYIN(%s)," % random_vector(1), file=f)
+            print("        .CEA1(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEA2(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEAD(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEALUMODE(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEC(e[%d])," % np.random.randint(9), file=f)
+            print("        .CECARRYIN(e[%d])," % np.random.randint(9), file=f)
+            print("        .CECTRL(e[%d])," % np.random.randint(9), file=f)
+            print("        .CED(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEINMODE(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEM(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEP(e[%d])," % np.random.randint(9), file=f)
+            print("        .CLK(clk[%d])," % np.random.randint(8), file=f)
+            print("        .D(%s)," % random_vector(27), file=f)
+            print("        .INMODE(%s)," % random_vector(5), file=f)
+            print("        .OPMODE(%s)," % random_vector(9), file=f)
+            print("        .RSTA(r[%d])," % np.random.randint(9), file=f)
+            print(
+                "        .RSTALLCARRYIN(r[%d])," % np.random.randint(9),
+                file=f)
+            print("        .RSTALUMODE(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTB(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTC(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTCTRL(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTD(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTINMODE(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTM(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTP(r[%d])," % np.random.randint(9), file=f)
+            print("        .P(int_q[%d][47:0])," % i, file=f)
+            print("        .CARRYOUT(int_q[%d][51:48])," % i, file=f)
+            print("        .XOROUT(int_q[%d][59:52])," % i, file=f)
+            print("        .PATTERNDETECT(int_q[%d][60])," % i, file=f)
+            print("        .PATTERNBDETECT(int_q[%d][61])," % i, file=f)
+            print("        .OVERFLOW(int_q[%d][62])," % i, file=f)
+            print("        .UNDERFLOW(int_q[%d][63])" % i, file=f)
+            print("    );", file=f)
+            print("", file=f)
+        print("endmodule", file=f)
+    with open(root + "/dsp1/dsp%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/dsp1/dsp%d.v" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks AVAL-*]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks REQP-*]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_bram/dsp%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_bram/dsp%d.edf" % (root, x), file=f)
+        print(
+            "write_bitstream -force %s/specimen_bram/dsp%d.bit" % (root, x),
+            file=f)
 with open(root + "/dsp1/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source dsp%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_bram/dsp%d.bit %s/frames.txt > %s/specimen_bram/dsp%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_bram/dsp%d.dump > %s/specimen_bram/dsp%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_bram/dsp%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source dsp%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_bram/dsp%d.bit %s/frames.txt > %s/specimen_bram/dsp%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_bram/dsp%d.dump > %s/specimen_bram/dsp%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_bram/dsp%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/dsp_2.py b/spec/dsp_2.py
index 2392de2..b0b914b 100644
--- a/spec/dsp_2.py
+++ b/spec/dsp_2.py
@@ -20,141 +20,246 @@
 
 root = sys.argv[2]
 
+
 def random_vector(size):
-	return "{%s}" % ", ".join(["d[%d]" % np.random.randint(12) for k in range(size)])
+    return "{%s}" % ", ".join(
+        ["d[%d]" % np.random.randint(12) for k in range(size)])
+
 
 for x in range(X):
 
-
-	with open(root + "/dsp2/dsp_b%d.v" % x, "w") as f:
-		print("module top(input [7:0] clk, cen, rst, input [11:0] d, input [7:0] sel, output [63:0] q);", file=f)
-		print("    wire [8:0] r = {1'b0, rst}, e = {1'b1, cen};", file=f)
-		print("    wire [63:0] int_q[0:%d];" % (N-1), file=f)
-		print("    assign q = int_q[sel];", file=f)
-		for i in range(N):
-			use_preadd = np.random.choice([False, True])
-			bmultsel = (np.random.choice(["AD", "B"]) if use_preadd else "B")
-			amultsel = (np.random.choice(["AD", "A"]) if use_preadd and bmultsel == "AD" else ("AD" if use_preadd else "A"))
-			use_patdet = np.random.choice([False, True])
-			print("    (* keep, dont_touch *) DSP48E2 #(", file=f)
-			print("        .ADREG(%d)," % (np.random.randint(2) if use_preadd else 0), file=f)
-			print("        .ALUMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .AMULTSEL(\"%s\")," % amultsel, file=f)
-			print("        .AREG(%d)," % np.random.randint(3), file=f)
-			print("        .AUTORESET_PATDET(\"%s\")," % np.random.choice(["NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"]), file=f)
-			print("        .AUTORESET_PRIORITY(\"%s\")," % np.random.choice(["RESET", "CEP"]), file=f)
-			print("        .A_INPUT(\"DIRECT\"),", file=f)
-			print("        .BMULTSEL(\"%s\")," % bmultsel,file=f)
-			print("        .BREG(%d)," % np.random.randint(3), file=f)
-			print("        .B_INPUT(\"DIRECT\"),", file=f)
-			print("        .CARRYINREG(%d)," % np.random.randint(2), file=f)
-			print("        .CARRYINSELREG(%d)," % np.random.randint(2), file=f)
-			print("        .CREG(%d)," % np.random.randint(2), file=f)
-			print("        .DREG(%d)," % np.random.randint(2), file=f)
-			print("        .INMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .IS_ALUMODE_INVERTED(%d)," % np.random.randint(16), file=f)
-			print("        .IS_CARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_CLK_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_INMODE_INVERTED(%d)," % np.random.randint(32), file=f)
-			print("        .IS_OPMODE_INVERTED(%d)," % np.random.randint(512), file=f)
-			print("        .IS_RSTALLCARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTALUMODE_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTA_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTB_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTCTRL_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTC_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTD_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTINMODE_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTM_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .IS_RSTP_INVERTED(%d)," % np.random.randint(2), file=f)
-			print("        .MASK({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .MREG(%d)," % np.random.randint(2), file=f)
-			print("        .OPMODEREG(%d)," % np.random.randint(2), file=f)
-			print("        .PATTERN({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .PREADDINSEL(\"%s\")," % np.random.choice(["A", "B"]), file=f)
-			print("        .PREG(%d)," % np.random.randint(2), file=f)
-			print("        .RND({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
-			print("        .SEL_MASK(\"%s\")," % np.random.choice(["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]), file=f)
-			print("        .SEL_PATTERN(\"%s\")," % np.random.choice(["PATTERN", "C"]), file=f)
-			print("        .USE_PATTERN_DETECT(\"%s\")," % ("PATDET" if use_patdet else "NO_PATDET"), file=f)
-			print("        .USE_SIMD(\"%s\")," %  np.random.choice(["ONE48", "TWO24", "FOUR12"]), file=f)
-			print("        .USE_WIDEXOR(\"%s\")," %  np.random.choice(["TRUE", "FALSE"]), file=f)
-			print("        .XORSIMD(\"%s\")" %  np.random.choice(["XOR12", "XOR24_48_96"]), file=f)
-			print("    ) dsp_%d (" % i, file=f)
-			print("        .A(%s)," % random_vector(30), file=f)
-			print("        .ALUMODE(%s)," % random_vector(4), file=f)
-			print("        .B(%s)," % random_vector(18), file=f)
-			#print("        .C(%s)," % random_vector(48), file=f)
-			print("        .CARRYIN(%s)," % random_vector(1), file=f)
-			print("        .CEA1(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEA2(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEAD(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEALUMODE(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEC(e[%d])," % np.random.randint(9), file=f)
-			print("        .CECARRYIN(e[%d])," % np.random.randint(9), file=f)
-			print("        .CECTRL(e[%d])," % np.random.randint(9), file=f)
-			print("        .CED(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEINMODE(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEM(e[%d])," % np.random.randint(9), file=f)
-			print("        .CEP(e[%d])," % np.random.randint(9), file=f)
-			#print("        .D(%s)," % random_vector(27), file=f)
-			print("        .INMODE(%s)," % random_vector(5), file=f)
-			print("        .OPMODE(%s)," % random_vector(9), file=f)
-			print("        .RSTA(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTALLCARRYIN(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTALUMODE(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTB(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTC(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTCTRL(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTD(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTINMODE(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTM(r[%d])," % np.random.randint(9), file=f)
-			print("        .RSTP(r[%d])," % np.random.randint(9), file=f)
-			o_bit = np.random.randint(-1, 64)
-			if o_bit >= 0 and o_bit < 48:
-				print("        .P({int_q[%d][0]%s})," % (i, ", {%d{1'bx}}" % o_bit if o_bit > 0 else ""), file=f)
-			if o_bit >= 48 and o_bit < 52:
-				print("        .CARRYOUT({int_q[%d][48]%s})," % (i, ", {%d{1'bx}}" % (o_bit-48) if o_bit > 48 else ""), file=f)
-			if o_bit >= 52 and o_bit < 60:
-				print("        .XOROUT({int_q[%d][52]%s})," % (i, ", {%d{1'bx}}" % (o_bit-52) if o_bit > 52 else ""), file=f)
-			if o_bit == 60:
-				print("        .PATTERNDETECT(int_q[%d][60])," % i, file=f)
-			if o_bit == 61:
-				print("        .PATTERNBDETECT(int_q[%d][61])," % i, file=f)
-			if o_bit == 62:
-				print("        .OVERFLOW(int_q[%d][62])," % i, file=f)
-			if o_bit == 63:
-				print("        .UNDERFLOW(int_q[%d][63])," % i, file=f)
-			print("        .CLK(clk[%d])" % np.random.randint(8), file=f)
-			print("    );", file=f)
-			print("", file=f)
-		print("endmodule", file=f)
-	with open(root + "/dsp2/dsp_b%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/dsp2/dsp_b%d.v" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks AVAL-*]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks REQP-*]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_bram/dsp_b%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_bram/dsp_b%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_bram/dsp_b%d.bit" % (root, x), file=f)
+    with open(root + "/dsp2/dsp_b%d.v" % x, "w") as f:
+        print(
+            "module top(input [7:0] clk, cen, rst, input [11:0] d, input [7:0] sel, output [63:0] q);",
+            file=f)
+        print("    wire [8:0] r = {1'b0, rst}, e = {1'b1, cen};", file=f)
+        print("    wire [63:0] int_q[0:%d];" % (N - 1), file=f)
+        print("    assign q = int_q[sel];", file=f)
+        for i in range(N):
+            use_preadd = np.random.choice([False, True])
+            bmultsel = (np.random.choice(["AD", "B"]) if use_preadd else "B")
+            amultsel = (np.random.choice(["AD", "A"])
+                        if use_preadd and bmultsel == "AD" else
+                        ("AD" if use_preadd else "A"))
+            use_patdet = np.random.choice([False, True])
+            print("    (* keep, dont_touch *) DSP48E2 #(", file=f)
+            print(
+                "        .ADREG(%d)," %
+                (np.random.randint(2) if use_preadd else 0),
+                file=f)
+            print("        .ALUMODEREG(%d)," % np.random.randint(2), file=f)
+            print("        .AMULTSEL(\"%s\")," % amultsel, file=f)
+            print("        .AREG(%d)," % np.random.randint(3), file=f)
+            print(
+                "        .AUTORESET_PATDET(\"%s\")," % np.random.choice(
+                    ["NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"]),
+                file=f)
+            print(
+                "        .AUTORESET_PRIORITY(\"%s\")," % np.random.choice(
+                    ["RESET", "CEP"]),
+                file=f)
+            print("        .A_INPUT(\"DIRECT\"),", file=f)
+            print("        .BMULTSEL(\"%s\")," % bmultsel, file=f)
+            print("        .BREG(%d)," % np.random.randint(3), file=f)
+            print("        .B_INPUT(\"DIRECT\"),", file=f)
+            print("        .CARRYINREG(%d)," % np.random.randint(2), file=f)
+            print("        .CARRYINSELREG(%d)," % np.random.randint(2), file=f)
+            print("        .CREG(%d)," % np.random.randint(2), file=f)
+            print("        .DREG(%d)," % np.random.randint(2), file=f)
+            print("        .INMODEREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .IS_ALUMODE_INVERTED(%d)," % np.random.randint(16),
+                file=f)
+            print(
+                "        .IS_CARRYIN_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_CLK_INVERTED(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .IS_INMODE_INVERTED(%d)," % np.random.randint(32),
+                file=f)
+            print(
+                "        .IS_OPMODE_INVERTED(%d)," % np.random.randint(512),
+                file=f)
+            print(
+                "        .IS_RSTALLCARRYIN_INVERTED(%d)," %
+                np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTALUMODE_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTA_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTB_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTCTRL_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTC_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTD_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTINMODE_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTM_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .IS_RSTP_INVERTED(%d)," % np.random.randint(2),
+                file=f)
+            print(
+                "        .MASK({24'd%d, 24'd%d})," % (np.random.randint(
+                    2**24), np.random.randint(2**24)),
+                file=f)
+            print("        .MREG(%d)," % np.random.randint(2), file=f)
+            print("        .OPMODEREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .PATTERN({24'd%d, 24'd%d})," % (np.random.randint(
+                    2**24), np.random.randint(2**24)),
+                file=f)
+            print(
+                "        .PREADDINSEL(\"%s\")," % np.random.choice(["A", "B"]),
+                file=f)
+            print("        .PREG(%d)," % np.random.randint(2), file=f)
+            print(
+                "        .RND({24'd%d, 24'd%d})," % (np.random.randint(2**24),
+                                                     np.random.randint(2**24)),
+                file=f)
+            print(
+                "        .SEL_MASK(\"%s\")," % np.random.choice(
+                    ["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]),
+                file=f)
+            print(
+                "        .SEL_PATTERN(\"%s\")," % np.random.choice(
+                    ["PATTERN", "C"]),
+                file=f)
+            print(
+                "        .USE_PATTERN_DETECT(\"%s\")," %
+                ("PATDET" if use_patdet else "NO_PATDET"),
+                file=f)
+            print(
+                "        .USE_SIMD(\"%s\")," % np.random.choice(
+                    ["ONE48", "TWO24", "FOUR12"]),
+                file=f)
+            print(
+                "        .USE_WIDEXOR(\"%s\")," % np.random.choice(
+                    ["TRUE", "FALSE"]),
+                file=f)
+            print(
+                "        .XORSIMD(\"%s\")" % np.random.choice(
+                    ["XOR12", "XOR24_48_96"]),
+                file=f)
+            print("    ) dsp_%d (" % i, file=f)
+            print("        .A(%s)," % random_vector(30), file=f)
+            print("        .ALUMODE(%s)," % random_vector(4), file=f)
+            print("        .B(%s)," % random_vector(18), file=f)
+            #print("        .C(%s)," % random_vector(48), file=f)
+            print("        .CARRYIN(%s)," % random_vector(1), file=f)
+            print("        .CEA1(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEA2(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEAD(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEALUMODE(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEC(e[%d])," % np.random.randint(9), file=f)
+            print("        .CECARRYIN(e[%d])," % np.random.randint(9), file=f)
+            print("        .CECTRL(e[%d])," % np.random.randint(9), file=f)
+            print("        .CED(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEINMODE(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEM(e[%d])," % np.random.randint(9), file=f)
+            print("        .CEP(e[%d])," % np.random.randint(9), file=f)
+            #print("        .D(%s)," % random_vector(27), file=f)
+            print("        .INMODE(%s)," % random_vector(5), file=f)
+            print("        .OPMODE(%s)," % random_vector(9), file=f)
+            print("        .RSTA(r[%d])," % np.random.randint(9), file=f)
+            print(
+                "        .RSTALLCARRYIN(r[%d])," % np.random.randint(9),
+                file=f)
+            print("        .RSTALUMODE(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTB(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTC(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTCTRL(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTD(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTINMODE(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTM(r[%d])," % np.random.randint(9), file=f)
+            print("        .RSTP(r[%d])," % np.random.randint(9), file=f)
+            o_bit = np.random.randint(-1, 64)
+            if o_bit >= 0 and o_bit < 48:
+                print(
+                    "        .P({int_q[%d][0]%s})," %
+                    (i, ", {%d{1'bx}}" % o_bit if o_bit > 0 else ""),
+                    file=f)
+            if o_bit >= 48 and o_bit < 52:
+                print(
+                    "        .CARRYOUT({int_q[%d][48]%s})," %
+                    (i, ", {%d{1'bx}}" % (o_bit - 48) if o_bit > 48 else ""),
+                    file=f)
+            if o_bit >= 52 and o_bit < 60:
+                print(
+                    "        .XOROUT({int_q[%d][52]%s})," %
+                    (i, ", {%d{1'bx}}" % (o_bit - 52) if o_bit > 52 else ""),
+                    file=f)
+            if o_bit == 60:
+                print("        .PATTERNDETECT(int_q[%d][60])," % i, file=f)
+            if o_bit == 61:
+                print("        .PATTERNBDETECT(int_q[%d][61])," % i, file=f)
+            if o_bit == 62:
+                print("        .OVERFLOW(int_q[%d][62])," % i, file=f)
+            if o_bit == 63:
+                print("        .UNDERFLOW(int_q[%d][63])," % i, file=f)
+            print("        .CLK(clk[%d])" % np.random.randint(8), file=f)
+            print("    );", file=f)
+            print("", file=f)
+        print("endmodule", file=f)
+    with open(root + "/dsp2/dsp_b%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/dsp2/dsp_b%d.v" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks AVAL-*]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks REQP-*]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_bram/dsp_b%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_bram/dsp_b%d.edf" % (root, x),
+            file=f)
+        print(
+            "write_bitstream -force %s/specimen_bram/dsp_b%d.bit" % (root, x),
+            file=f)
 with open(root + "/dsp2/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source dsp_b%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_bram/dsp_b%d.bit %s/frames.txt > %s/specimen_bram/dsp_b%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_bram/dsp_b%d.dump > %s/specimen_bram/dsp_b%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_bram/dsp_b%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp_b%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp_b%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp_b%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_bram/dsp_b%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source dsp_b%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_bram/dsp_b%d.bit %s/frames.txt > %s/specimen_bram/dsp_b%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_bram/dsp_b%d.dump > %s/specimen_bram/dsp_b%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_bram/dsp_b%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp_b%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp_b%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp_b%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_bram/dsp_b%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/flipflops.py b/spec/flipflops.py
index f9ca1dd..c1f762d 100644
--- a/spec/flipflops.py
+++ b/spec/flipflops.py
@@ -23,42 +23,49 @@
 
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 for i in range(6, N):
-	fftype, srsig = np.random.choice(["FDPE,PRE", "FDCE,CLR", "FDSE,S", "FDRE,R"]).split(",")
-	sl = slices.pop()
-	if np.random.ranf() < 0.5:
-		data = "int_d[%d]" % i
-	else:
-		lutsize = np.random.randint(2, 10)
-		if lutsize > 6:
-			lutsize = 6
-		print ("    wire lut_q_%d;" % i)
+    fftype, srsig = np.random.choice(
+        ["FDPE,PRE", "FDCE,CLR", "FDSE,S", "FDRE,R"]).split(",")
+    sl = slices.pop()
+    if np.random.ranf() < 0.5:
+        data = "int_d[%d]" % i
+    else:
+        lutsize = np.random.randint(2, 10)
+        if lutsize > 6:
+            lutsize = 6
+        print("    wire lut_q_%d;" % i)
 
-		print("     (* BEL=\"%s%dLUT\" *) (* LOC=\"%s\" *) LUT%d #(" % (np.random.choice(list("ABCDEFGH")), np.random.randint(6 if lutsize == 6 else 5, 7), sl, lutsize))
-		print("         .INIT(%d'h%016x)" % (2 ** lutsize, np.random.randint(1, (2 ** ((2 ** lutsize) - 1) - 1))))
-		print("     ) lut_%d (" % i)
-		for j in range(lutsize):
-			print("         .I%d(int_d[%d])," % (j, i - j))
-		print("         .O(lut_q_%d)" % i)
-		print("     );")
-		data = "lut_q_%d" % i
+        print("     (* BEL=\"%s%dLUT\" *) (* LOC=\"%s\" *) LUT%d #(" %
+              (np.random.choice(list("ABCDEFGH")),
+               np.random.randint(6 if lutsize == 6 else 5, 7), sl, lutsize))
+        print("         .INIT(%d'h%016x)" %
+              (2**lutsize, np.random.randint(1, (2**((2**lutsize) - 1) - 1))))
+        print("     ) lut_%d (" % i)
+        for j in range(lutsize):
+            print("         .I%d(int_d[%d])," % (j, i - j))
+        print("         .O(lut_q_%d)" % i)
+        print("     );")
+        data = "lut_q_%d" % i
 
-	print("    (* BEL=\"%sFF%s\" *) (* LOC=\"%s\" *) %s #(" % (np.random.choice(list("ABCDEFGH")), np.random.choice(["", "2"]),  sl, fftype))
-	print("          .IS_C_INVERTED(%s)," % np.random.choice(["0", "1"]))
-	print("          .IS_%s_INVERTED(%s)," % (srsig, np.random.choice(["0", "1"])))
-	print("          .INIT(%s)" % np.random.choice(["1'b0", "1'b1"]))
-	print("     ) ff_%d (" % i)
-	print("          .C(clk[%d])," % np.random.randint(0, 16))
-	print("          .CE(cen[%d])," % np.random.randint(0, 16))
-	print("          .%s(rst[%d])," % (srsig, np.random.randint(0, 16)))
-	print("          .D(%s)," % (data))
-	print("          .Q(int_d[%d])" % (i + 1))
-	print("     );")
+    print(
+        "    (* BEL=\"%sFF%s\" *) (* LOC=\"%s\" *) %s #(" % (np.random.choice(
+            list("ABCDEFGH")), np.random.choice(["", "2"]), sl, fftype))
+    print("          .IS_C_INVERTED(%s)," % np.random.choice(["0", "1"]))
+    print("          .IS_%s_INVERTED(%s)," % (srsig,
+                                              np.random.choice(["0", "1"])))
+    print("          .INIT(%s)" % np.random.choice(["1'b0", "1'b1"]))
+    print("     ) ff_%d (" % i)
+    print("          .C(clk[%d])," % np.random.randint(0, 16))
+    print("          .CE(cen[%d])," % np.random.randint(0, 16))
+    print("          .%s(rst[%d])," % (srsig, np.random.randint(0, 16)))
+    print("          .D(%s)," % (data))
+    print("          .Q(int_d[%d])" % (i + 1))
+    print("     );")
 print("endmodule")
diff --git a/spec/gclk.py b/spec/gclk.py
index e723fbe..40f9abb 100644
--- a/spec/gclk.py
+++ b/spec/gclk.py
@@ -17,13 +17,13 @@
 
 bufgces = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if ("BUFGCE" in site) and "HDIO" not in site and "DIV" not in site:
-				bufgces.append((site.split(":")[0], sl[2]))
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if ("BUFGCE" in site) and "HDIO" not in site and "DIV" not in site:
+                bufgces.append((site.split(":")[0], sl[2]))
 
 np.random.shuffle(bufgces)
 
@@ -33,12 +33,17 @@
 print("    assign r[0] = i;")
 print("    assign o = r[%d];" % N)
 for i in range(N):
-	bg, tile = bufgces[i]
-	print("(* LOC=\"%s\" *)" % bg)
-	if "BUFGCTRL" in bg:
-		print("    BUFGCTRL bufg_%d (.I0(r[%d]), .I1(r[%d]), .S0(1'b1), .S1(1'b0), .CE0(1'b1), .O(r[%d]));" % (i, i, i, i+1))
-	elif "DIV" in bg:
-		print("    BUFGCE_DIV #(.BUFGCE_DIVIDE(3)) bufg_%d (.I(r[%d]), .CLR(0), .CE(1'b1), .O(r[%d]));" % (i, i, i + 1))
-	else:
-		print("    BUFGCE bufg_%d (.I(r[%d]), .CE(1'b1), .O(r[%d]));" % (i, i, i+1))
-print("endmodule")
\ No newline at end of file
+    bg, tile = bufgces[i]
+    print("(* LOC=\"%s\" *)" % bg)
+    if "BUFGCTRL" in bg:
+        print(
+            "    BUFGCTRL bufg_%d (.I0(r[%d]), .I1(r[%d]), .S0(1'b1), .S1(1'b0), .CE0(1'b1), .O(r[%d]));"
+            % (i, i, i, i + 1))
+    elif "DIV" in bg:
+        print(
+            "    BUFGCE_DIV #(.BUFGCE_DIVIDE(3)) bufg_%d (.I(r[%d]), .CLR(0), .CE(1'b1), .O(r[%d]));"
+            % (i, i, i + 1))
+    else:
+        print("    BUFGCE bufg_%d (.I(r[%d]), .CE(1'b1), .O(r[%d]));" %
+              (i, i, i + 1))
+print("endmodule")
diff --git a/spec/gclk_2.py b/spec/gclk_2.py
index 0cfb058..20ad4fe 100644
--- a/spec/gclk_2.py
+++ b/spec/gclk_2.py
@@ -17,126 +17,177 @@
 
 bufgces_by_tile = {}
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
-				if sl[2] not in bufgces_by_tile:
-					bufgces_by_tile[sl[2]] = []
-				bufgces_by_tile[sl[2]].append(site.split(":"))
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
+                if sl[2] not in bufgces_by_tile:
+                    bufgces_by_tile[sl[2]] = []
+                bufgces_by_tile[sl[2]].append(site.split(":"))
 
 X = 64
 
 root = sys.argv[2]
 
 for x in range(X):
-	buffers = []
+    buffers = []
 
-	tiles = list(sorted(bufgces_by_tile.keys()))
-	np.random.shuffle(tiles)
+    tiles = list(sorted(bufgces_by_tile.keys()))
+    np.random.shuffle(tiles)
 
-	for tile in tiles:
-		shuffled_bufs = list(bufgces_by_tile[tile])
-		np.random.shuffle(shuffled_bufs)
-		target_type = np.random.choice(["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"] if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
-		tile_buffers = np.random.randint(8)
-		found_buffers = 0
-		for buf, buftype in shuffled_bufs:
-			if found_buffers >= tile_buffers:
-				break
-			if buftype != target_type:
-				continue
-			buffers.append((buf, buftype))
-			print("%s %s" % (tile, buf))
-			found_buffers += 1
-	print()
-	def random_inversion(pins):
-		return ", ".join([".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
+    for tile in tiles:
+        shuffled_bufs = list(bufgces_by_tile[tile])
+        np.random.shuffle(shuffled_bufs)
+        target_type = np.random.choice(
+            ["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"]
+            if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
+        tile_buffers = np.random.randint(8)
+        found_buffers = 0
+        for buf, buftype in shuffled_bufs:
+            if found_buffers >= tile_buffers:
+                break
+            if buftype != target_type:
+                continue
+            buffers.append((buf, buftype))
+            print("%s %s" % (tile, buf))
+            found_buffers += 1
+    print()
 
-	def random_control(pins):
-		return ", ".join([".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
+    def random_inversion(pins):
+        return ", ".join(
+            [".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
 
-	with open(root + "/clkroute3/gclk%d.v" % x, "w") as f:
-		print("module top(input i, input [9:0] aux, d, output o, q);", file=f)
-		N = len(buffers)
-		print("    wire [%d:0] r;" % N, file=f)
-		print("    assign r[0] = i;", file=f)
-		print("    assign o = r[%d];" % N, file=f)
-		print("    wire [%d:0] r2;" % (2*N), file=f)
-		print("    assign r2[0] = d;", file=f)
-		print("    assign q = r2[%d];" % (2*N), file=f)
-		for i in range(N):
-			bg, buftype = buffers[i]
-			print("(* LOC=\"%s\" *)" % bg, file=f)
-			if "BUFGCTRL" in buftype:
-				print("    BUFGCTRL #(", file=f)
-				print("        %s," % random_inversion(["I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-				print("        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")" %
-						(np.random.randint(2), np.random.choice(["TRUE", "FALSE"]), np.random.choice(["TRUE", "FALSE"])), file=f)
-				print("    ) bufgctrl_%d (" % i, file=f)
-				print("        .I0(r[%d]), .I1(r[%d]), " % (i, np.random.randint(i+1)), file=f)
-				print("        %s," % random_control(["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-				print("        .O(r[%d])" % (i+1), file=f)
-				print("    );", file=f)
-			elif "DIV" in buftype:
-				print("    BUFGCE_DIV #(", file=f)
-				print("        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9), file=f)
-				print("        %s" % random_inversion(["I", "CE", "CLR"]), file=f)
-				print("    ) bufgce_div_%d (" % i, file=f)
-				print("        .I(r[%d])," % i, file=f)
-				print("        %s," % random_control(["CE", "CLR"]), file=f)
-				print("        .O(r[%d])" % (i+1), file=f)
-				print("    );", file=f)
-			else:
-				print("    BUFGCE #(", file=f)
-				print("        .CE_TYPE(\"%s\")," % np.random.choice(["SYNC", "ASYNC"]), file=f)
-				print("        %s" % random_inversion(["I", "CE"]), file=f)
-				print("    ) bufgce_div_%d (" % i, file=f)
-				print("        .I(r[%d])," % i, file=f)
-				print("        %s," % random_control(["CE"]), file=f)
-				print("        .O(r[%d])" % (i+1), file=f)
-				print("    );", file=f)
+    def random_control(pins):
+        return ", ".join(
+            [".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
 
-			if np.random.randint(2) == 1:
-				print("FDCE ff_%d(.C(r[%d]), .CE(1'b1), .CLR(1'b0), .D(r2[%d]), .Q(r2[%d]));" % (i, i, 2*i, 2*i+1), file=f)
-			else:
-				print("assign r2[%d] = r2[%d];" % (2*i+1, 2*i), file=f)
+    with open(root + "/clkroute3/gclk%d.v" % x, "w") as f:
+        print("module top(input i, input [9:0] aux, d, output o, q);", file=f)
+        N = len(buffers)
+        print("    wire [%d:0] r;" % N, file=f)
+        print("    assign r[0] = i;", file=f)
+        print("    assign o = r[%d];" % N, file=f)
+        print("    wire [%d:0] r2;" % (2 * N), file=f)
+        print("    assign r2[0] = d;", file=f)
+        print("    assign q = r2[%d];" % (2 * N), file=f)
+        for i in range(N):
+            bg, buftype = buffers[i]
+            print("(* LOC=\"%s\" *)" % bg, file=f)
+            if "BUFGCTRL" in buftype:
+                print("    BUFGCTRL #(", file=f)
+                print(
+                    "        %s," % random_inversion([
+                        "I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0",
+                        "IGNORE1"
+                    ]),
+                    file=f)
+                print(
+                    "        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")"
+                    % (np.random.randint(2), np.random.choice([
+                        "TRUE", "FALSE"
+                    ]), np.random.choice(["TRUE", "FALSE"])),
+                    file=f)
+                print("    ) bufgctrl_%d (" % i, file=f)
+                print(
+                    "        .I0(r[%d]), .I1(r[%d]), " %
+                    (i, np.random.randint(i + 1)),
+                    file=f)
+                print(
+                    "        %s," % random_control(
+                        ["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]),
+                    file=f)
+                print("        .O(r[%d])" % (i + 1), file=f)
+                print("    );", file=f)
+            elif "DIV" in buftype:
+                print("    BUFGCE_DIV #(", file=f)
+                print(
+                    "        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9),
+                    file=f)
+                print(
+                    "        %s" % random_inversion(["I", "CE", "CLR"]),
+                    file=f)
+                print("    ) bufgce_div_%d (" % i, file=f)
+                print("        .I(r[%d])," % i, file=f)
+                print("        %s," % random_control(["CE", "CLR"]), file=f)
+                print("        .O(r[%d])" % (i + 1), file=f)
+                print("    );", file=f)
+            else:
+                print("    BUFGCE #(", file=f)
+                print(
+                    "        .CE_TYPE(\"%s\")," % np.random.choice(
+                        ["SYNC", "ASYNC"]),
+                    file=f)
+                print("        %s" % random_inversion(["I", "CE"]), file=f)
+                print("    ) bufgce_div_%d (" % i, file=f)
+                print("        .I(r[%d])," % i, file=f)
+                print("        %s," % random_control(["CE"]), file=f)
+                print("        .O(r[%d])" % (i + 1), file=f)
+                print("    );", file=f)
 
-			if np.random.randint(2) == 1:
-				print("SRLC32E srl_%d(.CLK(r[%d]), .CE(1'b1), .A(aux[4:0]), .D(r2[%d]), .Q(r2[%d]));" % (i, i, 2*i+1, 2*i+2), file=f)
-			else:
-				print("assign r2[%d] = r2[%d];" % (2*i+2, 2*i+1), file=f)
+            if np.random.randint(2) == 1:
+                print(
+                    "FDCE ff_%d(.C(r[%d]), .CE(1'b1), .CLR(1'b0), .D(r2[%d]), .Q(r2[%d]));"
+                    % (i, i, 2 * i, 2 * i + 1),
+                    file=f)
+            else:
+                print("assign r2[%d] = r2[%d];" % (2 * i + 1, 2 * i), file=f)
 
-			print("", file=f)
-		print("endmodule", file=f)
-	with open(root + "/clkroute3/gclk%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/clkroute3/gclk%d.v" % x)), file=f)
-		#print("read_xdc %s" % (root + ("/clkroute3/gclk%d.xdc" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_clk/gclk%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_clk/gclk%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_clk/gclk%d.bit" % (root, x), file=f)
+            if np.random.randint(2) == 1:
+                print(
+                    "SRLC32E srl_%d(.CLK(r[%d]), .CE(1'b1), .A(aux[4:0]), .D(r2[%d]), .Q(r2[%d]));"
+                    % (i, i, 2 * i + 1, 2 * i + 2),
+                    file=f)
+            else:
+                print(
+                    "assign r2[%d] = r2[%d];" % (2 * i + 2, 2 * i + 1), file=f)
+
+            print("", file=f)
+        print("endmodule", file=f)
+    with open(root + "/clkroute3/gclk%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/clkroute3/gclk%d.v" % x)), file=f)
+        #print("read_xdc %s" % (root + ("/clkroute3/gclk%d.xdc" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_clk/gclk%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_clk/gclk%d.edf" % (root, x), file=f)
+        print(
+            "write_bitstream -force %s/specimen_clk/gclk%d.bit" % (root, x),
+            file=f)
 with open(root + "/clkroute3/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source gclk%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclk%d.bit %s/frames.txt > %s/specimen_clk/gclk%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclk%d.dump > %s/specimen_clk/gclk%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_clk/gclk%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclk%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclk%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclk%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclk%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source gclk%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclk%d.bit %s/frames.txt > %s/specimen_clk/gclk%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclk%d.dump > %s/specimen_clk/gclk%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_clk/gclk%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclk%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclk%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclk%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclk%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/gclk_3.py b/spec/gclk_3.py
index dfc290a..e17c40b 100644
--- a/spec/gclk_3.py
+++ b/spec/gclk_3.py
@@ -20,162 +20,193 @@
 rclk_int_l = []
 slices_by_tile = {}
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		tiles_by_xy[int(sl[0]), int(sl[1])] = sl[2]
-		if sl[2].startswith("RCLK_INT_L"):
-			rclk_int_l.append((int(sl[0]), int(sl[1]), sl[2]))
-		for site in sl[4:]:
-			if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
-				if sl[2] not in bufgces_by_tile:
-					bufgces_by_tile[sl[2]] = []
-				bufgces_by_tile[sl[2]].append(site.split(":"))
-			elif "SLICE_" in site:
-				slices_by_tile[int(sl[0]), int(sl[1])] = site.split(":")[0]
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        tiles_by_xy[int(sl[0]), int(sl[1])] = sl[2]
+        if sl[2].startswith("RCLK_INT_L"):
+            rclk_int_l.append((int(sl[0]), int(sl[1]), sl[2]))
+        for site in sl[4:]:
+            if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
+                if sl[2] not in bufgces_by_tile:
+                    bufgces_by_tile[sl[2]] = []
+                bufgces_by_tile[sl[2]].append(site.split(":"))
+            elif "SLICE_" in site:
+                slices_by_tile[int(sl[0]), int(sl[1])] = site.split(":")[0]
 
 halfcolumn_slices_by_row = {}
 for x, y, rclk in rclk_int_l:
-	hc_up = []
-	hc_down = []
-	if y not in halfcolumn_slices_by_row:
-		halfcolumn_slices_by_row[y] = []
-	for yplus in range(y+1, y+31):
-		if (x, yplus) not in tiles_by_xy:
-			continue
-		if not tiles_by_xy[x, yplus].startswith("INT_"):
-			break
-		slice_x = x + np.random.choice([+1, -1])
-		if (slice_x, yplus) not in slices_by_tile:
-			continue
-		hc_up.append(slices_by_tile[slice_x, yplus])
-	for yminus in range(y-1, y-31, -1):
-		if (x, yminus) not in tiles_by_xy:
-			continue
-		if not tiles_by_xy[x, yminus].startswith("INT_"):
-			break
-		slice_x = x + np.random.choice([+1, -1])
-		if (slice_x, yminus) not in slices_by_tile:
-			continue
-		hc_down.append(slices_by_tile[slice_x, yminus])
-	halfcolumn_slices_by_row[y].append(hc_up)
-	halfcolumn_slices_by_row[y].append(hc_down)
+    hc_up = []
+    hc_down = []
+    if y not in halfcolumn_slices_by_row:
+        halfcolumn_slices_by_row[y] = []
+    for yplus in range(y + 1, y + 31):
+        if (x, yplus) not in tiles_by_xy:
+            continue
+        if not tiles_by_xy[x, yplus].startswith("INT_"):
+            break
+        slice_x = x + np.random.choice([+1, -1])
+        if (slice_x, yplus) not in slices_by_tile:
+            continue
+        hc_up.append(slices_by_tile[slice_x, yplus])
+    for yminus in range(y - 1, y - 31, -1):
+        if (x, yminus) not in tiles_by_xy:
+            continue
+        if not tiles_by_xy[x, yminus].startswith("INT_"):
+            break
+        slice_x = x + np.random.choice([+1, -1])
+        if (slice_x, yminus) not in slices_by_tile:
+            continue
+        hc_down.append(slices_by_tile[slice_x, yminus])
+    halfcolumn_slices_by_row[y].append(hc_up)
+    halfcolumn_slices_by_row[y].append(hc_down)
 
 X = 32
 
 root = sys.argv[2]
 
 for x in range(X):
-	buffers = []
+    buffers = []
 
-	tiles = list(sorted(bufgces_by_tile.keys()))
-	np.random.shuffle(tiles)
+    tiles = list(sorted(bufgces_by_tile.keys()))
+    np.random.shuffle(tiles)
 
-	for tile in tiles:
-		shuffled_bufs = list(bufgces_by_tile[tile])
-		np.random.shuffle(shuffled_bufs)
-		target_type = np.random.choice(["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"] if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
-		tile_buffers = np.random.randint(6)
-		found_buffers = 0
-		for buf, buftype in shuffled_bufs:
-			if found_buffers >= tile_buffers:
-				break
-			if buftype != target_type:
-				continue
-			buffers.append((buf, buftype))
-			print("%s %s" % (tile, buf))
-			found_buffers += 1
-	
-	def random_inversion(pins):
-		return ", ".join([".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
+    for tile in tiles:
+        shuffled_bufs = list(bufgces_by_tile[tile])
+        np.random.shuffle(shuffled_bufs)
+        target_type = np.random.choice(
+            ["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"]
+            if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
+        tile_buffers = np.random.randint(6)
+        found_buffers = 0
+        for buf, buftype in shuffled_bufs:
+            if found_buffers >= tile_buffers:
+                break
+            if buftype != target_type:
+                continue
+            buffers.append((buf, buftype))
+            print("%s %s" % (tile, buf))
+            found_buffers += 1
 
-	def random_control(pins):
-		return ", ".join([".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
+    def random_inversion(pins):
+        return ", ".join(
+            [".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
 
-	with open(root + "/clkroute4/gclkb_%d.v" % x, "w") as f:
-		print("module top(input [23:0] i, input [9:0] aux, input d, output o, q);", file=f)
-		N = 24
-		print("    wire [71:0] r;", file=f)
-		# print("    assign r[0] = i;", file=f)
-		# print("    assign o = r[%d];" % N, file=f)
-		# for i in range(N):
-		# 	bg, buftype = buffers[i]
-		# 	#print("(* LOC=\"%s\" *)" % bg, file=f)
-		# 	if "BUFGCTRL" in buftype:
-		# 		print("    BUFGCTRL #(", file=f)
-		# 		print("        %s," % random_inversion(["I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-		# 		print("        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")" %
-		# 				(np.random.randint(2), np.random.choice(["TRUE", "FALSE"]), np.random.choice(["TRUE", "FALSE"])), file=f)
-		# 		print("    ) bufgctrl_%d (" % i, file=f)
-		# 		print("        .I0(r[%d]), .I1(r[%d]), " % (i, np.random.randint(i+1)), file=f)
-		# 		print("        %s," % random_control(["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-		# 		print("        .O(r[%d])" % (i+1), file=f)
-		# 		print("    );", file=f)
-		print("    assign r[23:0] = i;", file=f)
-		for i in range(12):
-			print("    BUFGCE_DIV #(", file=f)
-			print("        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9), file=f)
-			print("        %s" % random_inversion(["I", "CE", "CLR"]), file=f)
-			print("    ) bufgce_div_%d (" % i, file=f)
-			print("        .I(i[%d])," % i, file=f)
-			print("        %s," % random_control(["CE", "CLR"]), file=f)
-			print("        .O(r[%d])" % (24+i), file=f)
-			print("    );", file=f)
-		for i in range(36):
-			print("    BUFGCE #(", file=f)
-			print("        .CE_TYPE(\"%s\")," % np.random.choice(["SYNC", "ASYNC"]), file=f)
-			print("        %s" % random_inversion(["I", "CE"]), file=f)
-			print("    ) bufgce_%d (" % i, file=f)
-			print("        .I(i[%d])," %  np.random.randint(24), file=f)
-			print("        %s," % random_control(["CE"]), file=f)
-			print("        .O(r[%d])" % (i+36), file=f)
-			print("    );", file=f)
+    def random_control(pins):
+        return ", ".join(
+            [".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
 
-		R2=0
-		NS=16
-		ffs=""
-		for row, hcs in sorted(halfcolumn_slices_by_row.items()):
-			row_clks = np.random.randint(16, 25)
-			clks = [np.random.randint(72) for k in range(row_clks)]
-			halfs = [hcs[np.random.randint(len(hcs))] for k in range(NS)]
-			for h in halfs:
-				half_clks = np.random.randint(8, 17)
-				rclks = [np.random.choice(clks) for k in range(half_clks)]
-				for sl in h:
-					ffs += "(* LOC=\"%s\" *) FDCE ff_%d (.C(r[%d]), .CE(aux[%d]), .CLR(1'b0), .D(r2[%d]), .Q(r2[%d]));\n" % (sl, R2, np.random.choice(rclks), np.random.randint(10), R2, R2+1)
-					R2 += 1
-		print("    wire [%d:0] r2;" % R2, file=f)
-		print("    assign r2[0] = d;", file=f)
-		print("    assign q = r2[%d];" % R2, file=f)
-		print(ffs, file=f)
-		print("endmodule", file=f)
-	with open(root + "/clkroute4/gclkb_%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/clkroute4/gclkb_%d.v" % x)), file=f)
-		#print("read_xdc %s" % (root + ("/clkroute4/gclkb_%d.xdc" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_clk/gclkb_%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_clk/gclkb_%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_clk/gclkb_%d.bit" % (root, x), file=f)
+    with open(root + "/clkroute4/gclkb_%d.v" % x, "w") as f:
+        print(
+            "module top(input [23:0] i, input [9:0] aux, input d, output o, q);",
+            file=f)
+        N = 24
+        print("    wire [71:0] r;", file=f)
+        # print("    assign r[0] = i;", file=f)
+        # print("    assign o = r[%d];" % N, file=f)
+        # for i in range(N):
+        # 	bg, buftype = buffers[i]
+        # 	#print("(* LOC=\"%s\" *)" % bg, file=f)
+        # 	if "BUFGCTRL" in buftype:
+        # 		print("    BUFGCTRL #(", file=f)
+        # 		print("        %s," % random_inversion(["I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
+        # 		print("        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")" %
+        # 				(np.random.randint(2), np.random.choice(["TRUE", "FALSE"]), np.random.choice(["TRUE", "FALSE"])), file=f)
+        # 		print("    ) bufgctrl_%d (" % i, file=f)
+        # 		print("        .I0(r[%d]), .I1(r[%d]), " % (i, np.random.randint(i+1)), file=f)
+        # 		print("        %s," % random_control(["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
+        # 		print("        .O(r[%d])" % (i+1), file=f)
+        # 		print("    );", file=f)
+        print("    assign r[23:0] = i;", file=f)
+        for i in range(12):
+            print("    BUFGCE_DIV #(", file=f)
+            print(
+                "        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9),
+                file=f)
+            print("        %s" % random_inversion(["I", "CE", "CLR"]), file=f)
+            print("    ) bufgce_div_%d (" % i, file=f)
+            print("        .I(i[%d])," % i, file=f)
+            print("        %s," % random_control(["CE", "CLR"]), file=f)
+            print("        .O(r[%d])" % (24 + i), file=f)
+            print("    );", file=f)
+        for i in range(36):
+            print("    BUFGCE #(", file=f)
+            print(
+                "        .CE_TYPE(\"%s\")," % np.random.choice(
+                    ["SYNC", "ASYNC"]),
+                file=f)
+            print("        %s" % random_inversion(["I", "CE"]), file=f)
+            print("    ) bufgce_%d (" % i, file=f)
+            print("        .I(i[%d])," % np.random.randint(24), file=f)
+            print("        %s," % random_control(["CE"]), file=f)
+            print("        .O(r[%d])" % (i + 36), file=f)
+            print("    );", file=f)
+
+        R2 = 0
+        NS = 16
+        ffs = ""
+        for row, hcs in sorted(halfcolumn_slices_by_row.items()):
+            row_clks = np.random.randint(16, 25)
+            clks = [np.random.randint(72) for k in range(row_clks)]
+            halfs = [hcs[np.random.randint(len(hcs))] for k in range(NS)]
+            for h in halfs:
+                half_clks = np.random.randint(8, 17)
+                rclks = [np.random.choice(clks) for k in range(half_clks)]
+                for sl in h:
+                    ffs += "(* LOC=\"%s\" *) FDCE ff_%d (.C(r[%d]), .CE(aux[%d]), .CLR(1'b0), .D(r2[%d]), .Q(r2[%d]));\n" % (
+                        sl, R2, np.random.choice(rclks), np.random.randint(10),
+                        R2, R2 + 1)
+                    R2 += 1
+        print("    wire [%d:0] r2;" % R2, file=f)
+        print("    assign r2[0] = d;", file=f)
+        print("    assign q = r2[%d];" % R2, file=f)
+        print(ffs, file=f)
+        print("endmodule", file=f)
+    with open(root + "/clkroute4/gclkb_%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/clkroute4/gclkb_%d.v" % x)), file=f)
+        #print("read_xdc %s" % (root + ("/clkroute4/gclkb_%d.xdc" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_clk/gclkb_%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_clk/gclkb_%d.edf" % (root, x),
+            file=f)
+        print(
+            "write_bitstream -force %s/specimen_clk/gclkb_%d.bit" % (root, x),
+            file=f)
 with open(root + "/clkroute4/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source gclkb_%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclkb_%d.bit %s/frames.txt > %s/specimen_clk/gclkb_%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclkb_%d.dump > %s/specimen_clk/gclkb_%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_clk/gclkb_%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkb_%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkb_%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkb_%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkb_%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source gclkb_%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclkb_%d.bit %s/frames.txt > %s/specimen_clk/gclkb_%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclkb_%d.dump > %s/specimen_clk/gclkb_%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_clk/gclkb_%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkb_%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkb_%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkb_%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkb_%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/gclk_4.py b/spec/gclk_4.py
index 7f1f314..27811c3 100644
--- a/spec/gclk_4.py
+++ b/spec/gclk_4.py
@@ -20,169 +20,200 @@
 rclk_int_l = []
 slices_by_tile = {}
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		tiles_by_xy[int(sl[0]), int(sl[1])] = sl[2]
-		if sl[2].startswith("RCLK_INT_L"):
-			rclk_int_l.append((int(sl[0]), int(sl[1]), sl[2]))
-		for site in sl[4:]:
-			if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
-				if sl[2] not in bufgces_by_tile:
-					bufgces_by_tile[sl[2]] = []
-				bufgces_by_tile[sl[2]].append(site.split(":"))
-			elif "SLICE_" in site:
-				slices_by_tile[int(sl[0]), int(sl[1])] = site.split(":")[0]
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        tiles_by_xy[int(sl[0]), int(sl[1])] = sl[2]
+        if sl[2].startswith("RCLK_INT_L"):
+            rclk_int_l.append((int(sl[0]), int(sl[1]), sl[2]))
+        for site in sl[4:]:
+            if ("BUFGCE" in site or "BUFGCTRL" in site) and "HDIO" not in site:
+                if sl[2] not in bufgces_by_tile:
+                    bufgces_by_tile[sl[2]] = []
+                bufgces_by_tile[sl[2]].append(site.split(":"))
+            elif "SLICE_" in site:
+                slices_by_tile[int(sl[0]), int(sl[1])] = site.split(":")[0]
 
 halfcolumn_slices_by_row = {}
 for x, y, rclk in rclk_int_l:
-	hc_up = []
-	hc_down = []
-	if y not in halfcolumn_slices_by_row:
-		halfcolumn_slices_by_row[y] = []
-	for yplus in range(y+1, y+31):
-		if (x, yplus) not in tiles_by_xy:
-			continue
-		if not tiles_by_xy[x, yplus].startswith("INT_"):
-			break
-		slice_x = x + np.random.choice([+1, -1])
-		if (slice_x, yplus) not in slices_by_tile:
-			continue
-		hc_up.append(slices_by_tile[slice_x, yplus])
-	for yminus in range(y-1, y-31, -1):
-		if (x, yminus) not in tiles_by_xy:
-			continue
-		if not tiles_by_xy[x, yminus].startswith("INT_"):
-			break
-		slice_x = x + np.random.choice([+1, -1])
-		if (slice_x, yminus) not in slices_by_tile:
-			continue
-		hc_down.append(slices_by_tile[slice_x, yminus])
-	halfcolumn_slices_by_row[y].append(hc_up)
-	halfcolumn_slices_by_row[y].append(hc_down)
+    hc_up = []
+    hc_down = []
+    if y not in halfcolumn_slices_by_row:
+        halfcolumn_slices_by_row[y] = []
+    for yplus in range(y + 1, y + 31):
+        if (x, yplus) not in tiles_by_xy:
+            continue
+        if not tiles_by_xy[x, yplus].startswith("INT_"):
+            break
+        slice_x = x + np.random.choice([+1, -1])
+        if (slice_x, yplus) not in slices_by_tile:
+            continue
+        hc_up.append(slices_by_tile[slice_x, yplus])
+    for yminus in range(y - 1, y - 31, -1):
+        if (x, yminus) not in tiles_by_xy:
+            continue
+        if not tiles_by_xy[x, yminus].startswith("INT_"):
+            break
+        slice_x = x + np.random.choice([+1, -1])
+        if (slice_x, yminus) not in slices_by_tile:
+            continue
+        hc_down.append(slices_by_tile[slice_x, yminus])
+    halfcolumn_slices_by_row[y].append(hc_up)
+    halfcolumn_slices_by_row[y].append(hc_down)
 
 X = 32
 
 root = sys.argv[2]
 
 for x in range(X):
-	buffers = []
+    buffers = []
 
-	tiles = list(sorted(bufgces_by_tile.keys()))
-	np.random.shuffle(tiles)
+    tiles = list(sorted(bufgces_by_tile.keys()))
+    np.random.shuffle(tiles)
 
-	for tile in tiles:
-		shuffled_bufs = list(bufgces_by_tile[tile])
-		np.random.shuffle(shuffled_bufs)
-		target_type = np.random.choice(["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"] if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
-		tile_buffers = np.random.randint(6)
-		found_buffers = 0
-		for buf, buftype in shuffled_bufs:
-			if found_buffers >= tile_buffers:
-				break
-			if buftype != target_type:
-				continue
-			buffers.append((buf, buftype))
-			print("%s %s" % (tile, buf))
-			found_buffers += 1
-	
-	def random_inversion(pins):
-		return ", ".join([".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
+    for tile in tiles:
+        shuffled_bufs = list(bufgces_by_tile[tile])
+        np.random.shuffle(shuffled_bufs)
+        target_type = np.random.choice(
+            ["BUFGCE", "BUFGCE_DIV", "BUFGCTRL"]
+            if len(buffers) > 0 else ["BUFGCE", "BUFGCE_DIV"])
+        tile_buffers = np.random.randint(6)
+        found_buffers = 0
+        for buf, buftype in shuffled_bufs:
+            if found_buffers >= tile_buffers:
+                break
+            if buftype != target_type:
+                continue
+            buffers.append((buf, buftype))
+            print("%s %s" % (tile, buf))
+            found_buffers += 1
 
-	def random_control(pins):
-		return ", ".join([".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
+    def random_inversion(pins):
+        return ", ".join(
+            [".IS_%s_INVERTED(%d)" % (p, np.random.randint(2)) for p in pins])
 
-	with open(root + "/clkroute5/gclkc_%d.v" % x, "w") as f:
-		print("module top(input [23:0] i, input [9:0] aux, input d, output o, q);", file=f)
-		N = 24
-		print("    wire [71:0] r;", file=f)
-		# print("    assign r[0] = i;", file=f)
-		# print("    assign o = r[%d];" % N, file=f)
-		# for i in range(N):
-		# 	bg, buftype = buffers[i]
-		# 	#print("(* LOC=\"%s\" *)" % bg, file=f)
-		# 	if "BUFGCTRL" in buftype:
-		# 		print("    BUFGCTRL #(", file=f)
-		# 		print("        %s," % random_inversion(["I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-		# 		print("        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")" %
-		# 				(np.random.randint(2), np.random.choice(["TRUE", "FALSE"]), np.random.choice(["TRUE", "FALSE"])), file=f)
-		# 		print("    ) bufgctrl_%d (" % i, file=f)
-		# 		print("        .I0(r[%d]), .I1(r[%d]), " % (i, np.random.randint(i+1)), file=f)
-		# 		print("        %s," % random_control(["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
-		# 		print("        .O(r[%d])" % (i+1), file=f)
-		# 		print("    );", file=f)
-		print("    assign r[23:0] = i;", file=f)
-		for i in range(12):
-			print("    BUFGCE_DIV #(", file=f)
-			print("        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9), file=f)
-			print("        %s" % random_inversion(["I", "CE", "CLR"]), file=f)
-			print("    ) bufgce_div_%d (" % i, file=f)
-			print("        .I(i[%d])," % i, file=f)
-			print("        %s," % random_control(["CE", "CLR"]), file=f)
-			print("        .O(r[%d])" % (24+i), file=f)
-			print("    );", file=f)
-		for i in range(12):
-			print("    BUFGCE #(", file=f)
-			print("        .CE_TYPE(\"%s\")," % np.random.choice(["SYNC", "ASYNC"]), file=f)
-			print("        %s" % random_inversion(["I", "CE"]), file=f)
-			print("    ) bufgce_%d (" % i, file=f)
-			print("        .I(i[%d])," %  np.random.randint(24), file=f)
-			print("        %s," % random_control(["CE"]), file=f)
-			print("        .O(r[%d])" % (i+36), file=f)
-			print("    );", file=f)
+    def random_control(pins):
+        return ", ".join(
+            [".%s(aux[%d])" % (p, np.random.randint(10)) for p in pins])
 
-		R2=0
-		NS=64
-		ffs=""
-		for row, hcs in sorted(halfcolumn_slices_by_row.items()):
-			row_clks = np.random.randint(20, 25)
-			clks = [np.random.randint(48) for k in range(row_clks)]
-			hi = []
-			while len(hi) < NS:
-				next_i = np.random.randint(len(hcs))
-				while next_i in hi:
-					next_i = np.random.randint(len(hcs))
-				hi.append(next_i)
+    with open(root + "/clkroute5/gclkc_%d.v" % x, "w") as f:
+        print(
+            "module top(input [23:0] i, input [9:0] aux, input d, output o, q);",
+            file=f)
+        N = 24
+        print("    wire [71:0] r;", file=f)
+        # print("    assign r[0] = i;", file=f)
+        # print("    assign o = r[%d];" % N, file=f)
+        # for i in range(N):
+        # 	bg, buftype = buffers[i]
+        # 	#print("(* LOC=\"%s\" *)" % bg, file=f)
+        # 	if "BUFGCTRL" in buftype:
+        # 		print("    BUFGCTRL #(", file=f)
+        # 		print("        %s," % random_inversion(["I0", "I1", "S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
+        # 		print("        .INIT_OUT(%d), .PRESELECT_I0(\"%s\"), .PRESELECT_I1(\"%s\")" %
+        # 				(np.random.randint(2), np.random.choice(["TRUE", "FALSE"]), np.random.choice(["TRUE", "FALSE"])), file=f)
+        # 		print("    ) bufgctrl_%d (" % i, file=f)
+        # 		print("        .I0(r[%d]), .I1(r[%d]), " % (i, np.random.randint(i+1)), file=f)
+        # 		print("        %s," % random_control(["S0", "S1", "CE0", "CE1", "IGNORE0", "IGNORE1"]), file=f)
+        # 		print("        .O(r[%d])" % (i+1), file=f)
+        # 		print("    );", file=f)
+        print("    assign r[23:0] = i;", file=f)
+        for i in range(12):
+            print("    BUFGCE_DIV #(", file=f)
+            print(
+                "        .BUFGCE_DIVIDE(%d)," % np.random.randint(1, 9),
+                file=f)
+            print("        %s" % random_inversion(["I", "CE", "CLR"]), file=f)
+            print("    ) bufgce_div_%d (" % i, file=f)
+            print("        .I(i[%d])," % i, file=f)
+            print("        %s," % random_control(["CE", "CLR"]), file=f)
+            print("        .O(r[%d])" % (24 + i), file=f)
+            print("    );", file=f)
+        for i in range(12):
+            print("    BUFGCE #(", file=f)
+            print(
+                "        .CE_TYPE(\"%s\")," % np.random.choice(
+                    ["SYNC", "ASYNC"]),
+                file=f)
+            print("        %s" % random_inversion(["I", "CE"]), file=f)
+            print("    ) bufgce_%d (" % i, file=f)
+            print("        .I(i[%d])," % np.random.randint(24), file=f)
+            print("        %s," % random_control(["CE"]), file=f)
+            print("        .O(r[%d])" % (i + 36), file=f)
+            print("    );", file=f)
 
-			halfs = [hcs[hi[k]] for k in range(NS)]
-			for h in halfs:
-				half_clks = np.random.randint(13, 17)
-				rclks = [np.random.choice(clks) for k in range(half_clks)]
-				for sl in h:
-					ffs += "(* LOC=\"%s\" *) FDCE ff_%d (.C(r[%d]), .CE(aux[%d]), .CLR(~aux[%d]), .D(r2[%d]), .Q(r2[%d]));\n" % (sl, R2, rclks[R2 % len(rclks)], np.random.randint(10), np.random.randint(10), R2, R2+1)
-					R2 += 1
-		print("    wire [%d:0] r2;" % R2, file=f)
-		print("    assign r2[0] = d;", file=f)
-		print("    assign q = r2[%d];" % R2, file=f)
-		print(ffs, file=f)
-		print("endmodule", file=f)
-	with open(root + "/clkroute5/gclkc_%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/clkroute5/gclkc_%d.v" % x)), file=f)
-		#print("read_xdc %s" % (root + ("/clkroute5/gclkc_%d.xdc" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_clk/gclkc_%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_clk/gclkc_%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_clk/gclkc_%d.bit" % (root, x), file=f)
+        R2 = 0
+        NS = 64
+        ffs = ""
+        for row, hcs in sorted(halfcolumn_slices_by_row.items()):
+            row_clks = np.random.randint(20, 25)
+            clks = [np.random.randint(48) for k in range(row_clks)]
+            hi = []
+            while len(hi) < NS:
+                next_i = np.random.randint(len(hcs))
+                while next_i in hi:
+                    next_i = np.random.randint(len(hcs))
+                hi.append(next_i)
+
+            halfs = [hcs[hi[k]] for k in range(NS)]
+            for h in halfs:
+                half_clks = np.random.randint(13, 17)
+                rclks = [np.random.choice(clks) for k in range(half_clks)]
+                for sl in h:
+                    ffs += "(* LOC=\"%s\" *) FDCE ff_%d (.C(r[%d]), .CE(aux[%d]), .CLR(~aux[%d]), .D(r2[%d]), .Q(r2[%d]));\n" % (
+                        sl, R2, rclks[R2 % len(rclks)], np.random.randint(10),
+                        np.random.randint(10), R2, R2 + 1)
+                    R2 += 1
+        print("    wire [%d:0] r2;" % R2, file=f)
+        print("    assign r2[0] = d;", file=f)
+        print("    assign q = r2[%d];" % R2, file=f)
+        print(ffs, file=f)
+        print("endmodule", file=f)
+    with open(root + "/clkroute5/gclkc_%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/clkroute5/gclkc_%d.v" % x)), file=f)
+        #print("read_xdc %s" % (root + ("/clkroute5/gclkc_%d.xdc" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets]", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_clk/gclkc_%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_clk/gclkc_%d.edf" % (root, x),
+            file=f)
+        print(
+            "write_bitstream -force %s/specimen_clk/gclkc_%d.bit" % (root, x),
+            file=f)
 with open(root + "/clkroute5/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source gclkc_%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclkc_%d.bit %s/frames.txt > %s/specimen_clk/gclkc_%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclkc_%d.dump > %s/specimen_clk/gclkc_%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_clk/gclkc_%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkc_%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkc_%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkc_%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_clk/gclkc_%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source gclkc_%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_clk/gclkc_%d.bit %s/frames.txt > %s/specimen_clk/gclkc_%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/gclkc_%d.dump > %s/specimen_clk/gclkc_%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_clk/gclkc_%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkc_%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkc_%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkc_%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_clk/gclkc_%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/memory.py b/spec/memory.py
index a8e3b36..5ed7209 100644
--- a/spec/memory.py
+++ b/spec/memory.py
@@ -16,100 +16,109 @@
 import sys
 import math
 
-print("module top(input [15:0] clk, cen, input [8:0] wa, input [7:0] ra, input [7:0] d, input [11:0] sel, output [3:0] q);")
+print(
+    "module top(input [15:0] clk, cen, input [8:0] wa, input [7:0] ra, input [7:0] d, input [11:0] sel, output [3:0] q);"
+)
 N = 4096
 print("    wire [3:0] int_d[0:%d-1];" % N)
 print("    assign q = int_d[sel];")
 
+
 def connect(sig, dst, len):
-	if sig is None:
-		return []
-	bit = 0
-	conns = []
-	for x in sig:
-		if type(x) is tuple:
-			name, width = x
-			conns.append(".%s(%s[%d +: %d])" % (name, dst, bit, width))
-			bit += width
-		else:
-			conns.append(".%s(%s[%d])" % (x, dst, bit))
-			bit += 1
-	return conns
+    if sig is None:
+        return []
+    bit = 0
+    conns = []
+    for x in sig:
+        if type(x) is tuple:
+            name, width = x
+            conns.append(".%s(%s[%d +: %d])" % (name, dst, bit, width))
+            bit += width
+        else:
+            conns.append(".%s(%s[%d])" % (x, dst, bit))
+            bit += 1
+    return conns
+
 
 for i in range(N):
-	ctype = np.random.choice(["SRL16E", "SRLC32E", "RAM32X1D", "RAM32X1S", "RAM64X1D", "RAM64X1S", "RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"])
-	clockport = None
-	ceport = None
-	wraddr = None
-	rdaddr = None
-	wdata = None
-	rdata = None
-	init_len = None
-	if ctype in ("SRL16E", "SRLC32E"):
-		clockport = "CLK"
-		ceport = "CE"
-		wdata = ["D"]
-		rdata = ["Q"]
-		if ctype == "SRLC32E":
-			rdata.append("Q31")
-			rdaddr = [("A", 5)]
-			init_len = 32
-		else:
-			rdaddr = ["A0", "A1", "A2", "A3"]
-			init_len = 16
-	elif ctype in ("RAM32X1D", "RAM32X1S"):
-		clockport = "WCLK"
-		ceport = "WE"
-		wdata = ["D"]
-		wraddr = ["A0", "A1", "A2", "A3", "A4"]
-		init_len = 32
-		if ctype == "RAM32X1D":
-			rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4"]
-			rdata = ["SPO", "DPO"]
-		else:
-			rdata = ["O"]
-	elif ctype in ("RAM64X1D", "RAM64X1S"):
-		clockport = "WCLK"
-		ceport = "WE"
-		wdata = ["D"]
-		wraddr = ["A0", "A1", "A2", "A3", "A4", "A5"]
-		init_len = 64
-		if ctype == "RAM64X1D":
-			rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4", "DPRA5"]
-			rdata = ["SPO", "DPO"]
-		else:
-			rdata = ["O"]
-	elif ctype in ("RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"):
-		init_len = int(ctype[3:6])
-		abits = math.log2(init_len)
-		clockport = "WCLK"
-		ceport = "WE"
-		wdata = ["D"]
-		if ctype == "RAM128X1S":
-			wraddr = ["A0", "A1", "A2", "A3", "A4", "A5", "A6"]
-		else:
-			wraddr = [("A", abits)]
-		if ctype[-1] == "D":
-			rdaddr = [("DPRA", abits)]
-			rdata = ["SPO", "DPO"]
-		else:
-			rdata = ["O"]
-	else:
-		assert False, ctype
-	conns = []
-	if clockport is not None:
-		conns.append(".%s(clk[%d])" % (clockport, np.random.randint(0, 16)))
-	if ceport is not None:
-		conns.append(".%s(cen[%d])" % (ceport, np.random.randint(0, 16)))
-	conns += connect(wraddr, "wa", 9)
-	conns += connect(rdaddr, "ra", 8)
-	conns += connect(wdata, "d", 8)
-	conns += connect(rdata, "int_d[%d]" % i, 4)
-	print("    %s #(" % ctype)
-	if init_len is not None:
-		initdata = np.random.randint(2, size=init_len)
-		print("        .INIT(%d'b%s)" % (init_len, "".join([str(_) for _ in initdata])))
-	print("    ) %s_%d (" % (ctype, i))
-	print("    %s" % ",\n    ".join(conns))
-	print("    );")
+    ctype = np.random.choice([
+        "SRL16E", "SRLC32E", "RAM32X1D", "RAM32X1S", "RAM64X1D", "RAM64X1S",
+        "RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"
+    ])
+    clockport = None
+    ceport = None
+    wraddr = None
+    rdaddr = None
+    wdata = None
+    rdata = None
+    init_len = None
+    if ctype in ("SRL16E", "SRLC32E"):
+        clockport = "CLK"
+        ceport = "CE"
+        wdata = ["D"]
+        rdata = ["Q"]
+        if ctype == "SRLC32E":
+            rdata.append("Q31")
+            rdaddr = [("A", 5)]
+            init_len = 32
+        else:
+            rdaddr = ["A0", "A1", "A2", "A3"]
+            init_len = 16
+    elif ctype in ("RAM32X1D", "RAM32X1S"):
+        clockport = "WCLK"
+        ceport = "WE"
+        wdata = ["D"]
+        wraddr = ["A0", "A1", "A2", "A3", "A4"]
+        init_len = 32
+        if ctype == "RAM32X1D":
+            rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4"]
+            rdata = ["SPO", "DPO"]
+        else:
+            rdata = ["O"]
+    elif ctype in ("RAM64X1D", "RAM64X1S"):
+        clockport = "WCLK"
+        ceport = "WE"
+        wdata = ["D"]
+        wraddr = ["A0", "A1", "A2", "A3", "A4", "A5"]
+        init_len = 64
+        if ctype == "RAM64X1D":
+            rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4", "DPRA5"]
+            rdata = ["SPO", "DPO"]
+        else:
+            rdata = ["O"]
+    elif ctype in ("RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S",
+                   "RAM512X1S"):
+        init_len = int(ctype[3:6])
+        abits = math.log2(init_len)
+        clockport = "WCLK"
+        ceport = "WE"
+        wdata = ["D"]
+        if ctype == "RAM128X1S":
+            wraddr = ["A0", "A1", "A2", "A3", "A4", "A5", "A6"]
+        else:
+            wraddr = [("A", abits)]
+        if ctype[-1] == "D":
+            rdaddr = [("DPRA", abits)]
+            rdata = ["SPO", "DPO"]
+        else:
+            rdata = ["O"]
+    else:
+        assert False, ctype
+    conns = []
+    if clockport is not None:
+        conns.append(".%s(clk[%d])" % (clockport, np.random.randint(0, 16)))
+    if ceport is not None:
+        conns.append(".%s(cen[%d])" % (ceport, np.random.randint(0, 16)))
+    conns += connect(wraddr, "wa", 9)
+    conns += connect(rdaddr, "ra", 8)
+    conns += connect(wdata, "d", 8)
+    conns += connect(rdata, "int_d[%d]" % i, 4)
+    print("    %s #(" % ctype)
+    if init_len is not None:
+        initdata = np.random.randint(2, size=init_len)
+        print("        .INIT(%d'b%s)" % (init_len, "".join(
+            [str(_) for _ in initdata])))
+    print("    ) %s_%d (" % (ctype, i))
+    print("    %s" % ",\n    ".join(conns))
+    print("    );")
 print("endmodule")
diff --git a/spec/rclk_int.py b/spec/rclk_int.py
index 816924c..1323bf0 100644
--- a/spec/rclk_int.py
+++ b/spec/rclk_int.py
@@ -19,13 +19,13 @@
 
 bufgces = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "BUFGCE" in site and "HDIO" not in site:
-				bufgces.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "BUFGCE" in site and "HDIO" not in site:
+                bufgces.append(site.split(":")[0])
 
 print("module layer_1(input [31:0] clk, input [71:0] cen, input d, output q);")
 print("    wire [%d:0] r;" % N)
@@ -33,11 +33,12 @@
 print("    assign q = r[%d];" % N)
 print()
 for i in range(N):
-	print("    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1))
-	print()
+    print(
+        "    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));"
+        % (i, (i * 32) // N, np.random.randint(72), i, i + 1))
+    print()
 print("endmodule")
 
-
 M = 16
 print("module top(input [15:0] clk, cen, input d, output q);")
 print("    wire [511:0] clk_int;")
@@ -46,29 +47,36 @@
 print("    assign cen_int[15:0] = cen;")
 print("    assign cen_int[71:64] = 8'hFF;")
 for i in range(16, 512):
-	a = np.random.randint(16)
-	b = None
-	while b is None or b == a:
-		b = np.random.randint(16)
-	c = None
-	while c is None or c == a or c == b:
-		c = np.random.randint(16)
-	bg = None
-	if len(bufgces) > 0:
-		bg = bufgces.pop()
-	if bg is not None and np.random.randint(3) > 0:
-		if "DIV" in bg:
-			print("    BUFGCE_DIV #(.BUFGCE_DIVIDE(3)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(0), .CE(1'b1), .O(clk_int[%d]));" % (i, a, b, c, i))
-		else:
-			print("    BUFGCE bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(1'b1), .O(clk_int[%d]));" % (i, a, b, c, i))
-	else:
-		print("    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a, b, c))
-	if i < 64:
-		print("    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b))
+    a = np.random.randint(16)
+    b = None
+    while b is None or b == a:
+        b = np.random.randint(16)
+    c = None
+    while c is None or c == a or c == b:
+        c = np.random.randint(16)
+    bg = None
+    if len(bufgces) > 0:
+        bg = bufgces.pop()
+    if bg is not None and np.random.randint(3) > 0:
+        if "DIV" in bg:
+            print(
+                "    BUFGCE_DIV #(.BUFGCE_DIVIDE(3)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(0), .CE(1'b1), .O(clk_int[%d]));"
+                % (i, a, b, c, i))
+        else:
+            print(
+                "    BUFGCE bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(1'b1), .O(clk_int[%d]));"
+                % (i, a, b, c, i))
+    else:
+        print("    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a,
+                                                                         b, c))
+    if i < 64:
+        print("    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b))
 print()
 print("    wire [%d:0] r;" % M)
 print("    assign r[0] = d;")
 print("    assign q = r[%d];" % M)
 for i in range(M):
-	print("    layer_1 submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));" % (i, 32 * i, i, i+1))
+    print(
+        "    layer_1 submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));"
+        % (i, 32 * i, i, i + 1))
 print("endmodule")
diff --git a/spec/rclk_int_2.py b/spec/rclk_int_2.py
index 059d99b..62c5938 100644
--- a/spec/rclk_int_2.py
+++ b/spec/rclk_int_2.py
@@ -18,15 +18,15 @@
 bufgces = []
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "BUFGCE" in site and "HDIO" not in site:
-				bufgces.append(site.split(":")[0])
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "BUFGCE" in site and "HDIO" not in site:
+                bufgces.append(site.split(":")[0])
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 orig_bufgces = list(bufgces)
 np.random.shuffle(bufgces)
 np.random.shuffle(slices)
@@ -37,86 +37,128 @@
 bufg_prob = np.random.randint(15, 20)
 
 for x in range(X):
-	with open(root + "/clkroute/clkr%d.v" % x, "w") as f:
-		N = 256
-		M = 16
-		for m in range(M):
-			print("module layer_1_%d(input [31:0] clk, input [71:0] cen, input d, output q);" % m, file=f)
-			print("    wire [%d:0] r;" % N, file=f)
-			print("    assign r[0] = d;", file=f)
-			print("    assign q = r[%d];" % N, file=f)
-			print("", file=f)
-			for i in range(N):
-				if N == 0 and len(slices) > 0:
-					loc = slices.pop()
-					print("(* LOC=\"%s\" *)" % loc, file=f)
-				print("    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1), file=f)
-			print("endmodule", file=f)
+    with open(root + "/clkroute/clkr%d.v" % x, "w") as f:
+        N = 256
+        M = 16
+        for m in range(M):
+            print(
+                "module layer_1_%d(input [31:0] clk, input [71:0] cen, input d, output q);"
+                % m,
+                file=f)
+            print("    wire [%d:0] r;" % N, file=f)
+            print("    assign r[0] = d;", file=f)
+            print("    assign q = r[%d];" % N, file=f)
+            print("", file=f)
+            for i in range(N):
+                if N == 0 and len(slices) > 0:
+                    loc = slices.pop()
+                    print("(* LOC=\"%s\" *)" % loc, file=f)
+                print(
+                    "    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));"
+                    % (i, (i * 32) // N, np.random.randint(72), i, i + 1),
+                    file=f)
+            print("endmodule", file=f)
 
+        print("module top(input [39:0] clk, cen, input d, output q);", file=f)
+        num_inputs = np.random.randint(8, 40)
+        print("    wire [511:0] clk_int;", file=f)
+        print("    wire [71:0] cen_int;", file=f)
+        print("    assign clk_int[%d:0] = clk;" % (num_inputs - 1), file=f)
+        print("    assign cen_int[%d:0] = cen;" % (num_inputs - 1), file=f)
+        print("    assign cen_int[71:64] = 8'hFF;", file=f)
 
-		print("module top(input [39:0] clk, cen, input d, output q);", file=f)
-		num_inputs = np.random.randint(8, 40)
-		print("    wire [511:0] clk_int;", file=f)
-		print("    wire [71:0] cen_int;", file=f)
-		print("    assign clk_int[%d:0] = clk;" % (num_inputs - 1), file=f)
-		print("    assign cen_int[%d:0] = cen;" % (num_inputs - 1), file=f)
-		print("    assign cen_int[71:64] = 8'hFF;", file=f)
+        bufgces = list(orig_bufgces)
+        np.random.shuffle(bufgces)
 
-		bufgces = list(orig_bufgces)
-		np.random.shuffle(bufgces)
-
-		for i in range(num_inputs, 512):
-			a = np.random.randint(num_inputs)
-			b = None
-			while b is None or b == a:
-				b = np.random.randint(num_inputs)
-			c = None
-			while c is None or c == a or c == b:
-				c = np.random.randint(num_inputs)
-			bg = None
-			if len(bufgces) > 0:
-				bg = bufgces.pop()
-			if bg is not None and np.random.randint(20) >= bufg_prob or (bg is not None and "DIV" in bg and np.random.randint(19) >= bufg_prob):
-				if "DIV" in bg:
-					print("    BUFGCE_DIV #(.BUFGCE_DIVIDE(%d), .IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .IS_CLR_INVERTED(%d)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(!cen[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
-						(np.random.randint(1, 9), np.random.randint(2), np.random.randint(2), np.random.randint(2), i, a, b, c, np.random.randint(40), np.random.randint(40), i), file=f)
-				else:
-					ctype = np.random.choice(["", "_1"])
-					params = " #(.IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .CE_TYPE(\"%s\")) " % (np.random.randint(2), np.random.randint(2), np.random.choice(["SYNC", "ASYNC", "HARD_SYNC"])) if ctype == "" else ""
-					print("    BUFGCE%s %s bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
-						(ctype, params, i, a, b, c, np.random.randint(40), i), file=f)
-			else:
-				print("    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a, b, c), file=f)
-			if i < 64:
-				print("    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b), file=f)
-		print("", file=f)
-		print("    wire [%d:0] r;" % M, file=f)
-		print("    assign r[0] = d;", file=f)
-		print("    assign q = r[%d];" % M, file=f)
-		for i in range(M):
-			print("    layer_1_%d submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));" % (i, i, 32 * i, i, i+1), file=f)
-		print("endmodule", file=f)
-	with open(root + "/clkroute/clkr%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/clkroute/clkr%d.v" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_clk/clkr%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_clk/clkr%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_clk/clkr%d.bit" % (root, x), file=f)
+        for i in range(num_inputs, 512):
+            a = np.random.randint(num_inputs)
+            b = None
+            while b is None or b == a:
+                b = np.random.randint(num_inputs)
+            c = None
+            while c is None or c == a or c == b:
+                c = np.random.randint(num_inputs)
+            bg = None
+            if len(bufgces) > 0:
+                bg = bufgces.pop()
+            if bg is not None and np.random.randint(20) >= bufg_prob or (
+                    bg is not None and "DIV" in bg
+                    and np.random.randint(19) >= bufg_prob):
+                if "DIV" in bg:
+                    print(
+                        "    BUFGCE_DIV #(.BUFGCE_DIVIDE(%d), .IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .IS_CLR_INVERTED(%d)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(!cen[%d]), .CE(cen[%d]), .O(clk_int[%d]));"
+                        % (np.random.randint(1, 9), np.random.randint(2),
+                           np.random.randint(2), np.random.randint(2), i, a, b,
+                           c, np.random.randint(40), np.random.randint(40), i),
+                        file=f)
+                else:
+                    ctype = np.random.choice(["", "_1"])
+                    params = " #(.IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .CE_TYPE(\"%s\")) " % (
+                        np.random.randint(2), np.random.randint(2),
+                        np.random.choice(["SYNC", "ASYNC", "HARD_SYNC"
+                                          ])) if ctype == "" else ""
+                    print(
+                        "    BUFGCE%s %s bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(cen[%d]), .O(clk_int[%d]));"
+                        % (ctype, params, i, a, b, c, np.random.randint(40),
+                           i),
+                        file=f)
+            else:
+                print(
+                    "    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" %
+                    (i, a, b, c),
+                    file=f)
+            if i < 64:
+                print(
+                    "    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b),
+                    file=f)
+        print("", file=f)
+        print("    wire [%d:0] r;" % M, file=f)
+        print("    assign r[0] = d;", file=f)
+        print("    assign q = r[%d];" % M, file=f)
+        for i in range(M):
+            print(
+                "    layer_1_%d submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));"
+                % (i, i, 32 * i, i, i + 1),
+                file=f)
+        print("endmodule", file=f)
+    with open(root + "/clkroute/clkr%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/clkroute/clkr%d.v" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_clk/clkr%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_clk/clkr%d.edf" % (root, x), file=f)
+        print(
+            "write_bitstream -force %s/specimen_clk/clkr%d.bit" % (root, x),
+            file=f)
 with open(root + "/clkroute/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source clkr%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_clk/clkr%d.bit %s/frames.txt > %s/specimen_clk/clkr%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/clkr%d.dump > %s/specimen_clk/clkr%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_clk/clkr%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_clk/clkr%d.tbits" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source clkr%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_clk/clkr%d.bit %s/frames.txt > %s/specimen_clk/clkr%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/clkr%d.dump > %s/specimen_clk/clkr%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_clk/clkr%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_clk/clkr%d.tbits" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/rclk_int_3.py b/spec/rclk_int_3.py
index c057ded..bcc821d 100644
--- a/spec/rclk_int_3.py
+++ b/spec/rclk_int_3.py
@@ -18,15 +18,15 @@
 bufgces = []
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "BUFGCE" in site and "HDIO" not in site:
-				bufgces.append(site.split(":")[0])
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "BUFGCE" in site and "HDIO" not in site:
+                bufgces.append(site.split(":")[0])
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 orig_bufgces = list(bufgces)
 np.random.shuffle(bufgces)
 np.random.shuffle(slices)
@@ -37,104 +37,162 @@
 bufg_prob = np.random.randint(15, 20)
 
 for x in range(X):
-	with open(root + "/clkroute2/clkrb%d.v" % x, "w") as f:
-		N = 256
-		M = np.random.randint(24)
-		for m in range(M):
-			print("module layer_1_%d(input [31:0] clk, input [71:0] cen, input d, output q);" % m, file=f)
-			print("    wire [%d:0] r;" % N, file=f)
-			print("    assign r[0] = d;", file=f)
-			print("    assign q = r[%d];" % N, file=f)
-			print("", file=f)
-			for i in range(N):
-				if N == 0 and len(slices) > 0:
-					loc = slices.pop()
-					print("(* LOC=\"%s\" *)" % loc, file=f)
-				if N != 0 and np.random.randint(16) == 0:
-					print("    wire srl_tmp_%d;" % i, file=f)
-					print("    SRLC32E srl_%d (.CLK(clk[%d]), .CE(cen[%d]), .A(5'b11111), .D(r[%d]), .Q(srl_tmp_%d));" % (i, (i * 32) // N, np.random.randint(72), i, i), file=f)
-					print("    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(srl_tmp_%d), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1), file=f)
-				else:
-					print("    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1), file=f)
-			print("endmodule", file=f)
+    with open(root + "/clkroute2/clkrb%d.v" % x, "w") as f:
+        N = 256
+        M = np.random.randint(24)
+        for m in range(M):
+            print(
+                "module layer_1_%d(input [31:0] clk, input [71:0] cen, input d, output q);"
+                % m,
+                file=f)
+            print("    wire [%d:0] r;" % N, file=f)
+            print("    assign r[0] = d;", file=f)
+            print("    assign q = r[%d];" % N, file=f)
+            print("", file=f)
+            for i in range(N):
+                if N == 0 and len(slices) > 0:
+                    loc = slices.pop()
+                    print("(* LOC=\"%s\" *)" % loc, file=f)
+                if N != 0 and np.random.randint(16) == 0:
+                    print("    wire srl_tmp_%d;" % i, file=f)
+                    print(
+                        "    SRLC32E srl_%d (.CLK(clk[%d]), .CE(cen[%d]), .A(5'b11111), .D(r[%d]), .Q(srl_tmp_%d));"
+                        % (i, (i * 32) // N, np.random.randint(72), i, i),
+                        file=f)
+                    print(
+                        "    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(srl_tmp_%d), .Q(r[%d]));"
+                        % (i, (i * 32) // N, np.random.randint(72), i, i + 1),
+                        file=f)
+                else:
+                    print(
+                        "    FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));"
+                        % (i, (i * 32) // N, np.random.randint(72), i, i + 1),
+                        file=f)
+            print("endmodule", file=f)
 
+        print("module top(input [39:0] clk, cen, input d, output q);", file=f)
+        num_inputs = np.random.randint(8, 40)
+        print("    wire [511:0] clk_int;", file=f)
+        print("    wire [71:0] cen_int;", file=f)
+        print("    assign clk_int[%d:0] = clk;" % (num_inputs - 1), file=f)
+        print("    assign cen_int[%d:0] = cen;" % (num_inputs - 1), file=f)
+        print("    assign cen_int[71:64] = 8'hFF;", file=f)
 
-		print("module top(input [39:0] clk, cen, input d, output q);", file=f)
-		num_inputs = np.random.randint(8, 40)
-		print("    wire [511:0] clk_int;", file=f)
-		print("    wire [71:0] cen_int;", file=f)
-		print("    assign clk_int[%d:0] = clk;" % (num_inputs - 1), file=f)
-		print("    assign cen_int[%d:0] = cen;" % (num_inputs - 1), file=f)
-		print("    assign cen_int[71:64] = 8'hFF;", file=f)
+        bufgces = list(orig_bufgces)
+        np.random.shuffle(bufgces)
 
-		bufgces = list(orig_bufgces)
-		np.random.shuffle(bufgces)
+        for i in range(num_inputs, 512):
+            a = np.random.randint(num_inputs)
+            b = None
+            while b is None or b == a:
+                b = np.random.randint(num_inputs)
+            c = None
+            while c is None or c == a or c == b:
+                c = np.random.randint(num_inputs)
+            bg = None
+            if len(bufgces) > 0:
+                bg = bufgces.pop()
+            if bg is not None and np.random.randint(20) >= bufg_prob or (
+                    bg is not None and "DIV" in bg
+                    and np.random.randint(19) >= bufg_prob):
+                if "DIV" in bg:
+                    print(
+                        "    BUFGCE_DIV #(.BUFGCE_DIVIDE(%d), .IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .IS_CLR_INVERTED(%d)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(!cen[%d]), .CE(cen[%d]), .O(clk_int[%d]));"
+                        % (np.random.randint(1, 9), np.random.randint(2),
+                           np.random.randint(2), np.random.randint(2), i, a, b,
+                           c, np.random.randint(40), np.random.randint(40), i),
+                        file=f)
+                else:
+                    ctype = np.random.choice(["", "_1"])
+                    params = " #(.IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .CE_TYPE(\"%s\")) " % (
+                        np.random.randint(2), np.random.randint(2),
+                        np.random.choice(["SYNC", "ASYNC"
+                                          ])) if ctype == "" else ""
+                    print(
+                        "    BUFGCE%s %s bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(cen[%d]), .O(clk_int[%d]));"
+                        % (ctype, params, i, a, b, c, np.random.randint(40),
+                           i),
+                        file=f)
+            else:
+                print(
+                    "    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" %
+                    (i, a, b, c),
+                    file=f)
+            if i < 64:
+                print(
+                    "    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b),
+                    file=f)
+        print("", file=f)
+        print("    wire [%d:0] r;" % M, file=f)
+        print("    assign r[0] = d;", file=f)
+        print("    assign q = r[%d];" % M, file=f)
+        for i in range(M):
+            print(
+                "    layer_1_%d submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));"
+                % (i, i, 32 * i, i, i + 1),
+                file=f)
+        print("endmodule", file=f)
+    ccio = [
+        "G23", "F23", "G21", "F22", "F11", "H11", "G10", "H9", "G15", "F17",
+        "E15", "D15", "AH11", "AH12", "AJ9", "AJ10", "AG21", "AH22", "AJ21",
+        "AJ20", "AF18", "AH18", "AJ16", "AJ17"
+    ]
+    np.random.shuffle(ccio)
+    with open(root + "/clkroute2/clkrb%d.xdc" % x, "w") as f:
+        for i in range(num_inputs):
+            if i >= len(ccio):
+                break
+            print(
+                "set_property PACKAGE_PIN %s [get_ports {clk[%d]}]" % (ccio[i],
+                                                                       i),
+                file=f)
+            print(
+                "set_property IOSTANDARD LVCMOS18 [get_ports {clk[%d]}]" % (i),
+                file=f)
 
-		for i in range(num_inputs, 512):
-			a = np.random.randint(num_inputs)
-			b = None
-			while b is None or b == a:
-				b = np.random.randint(num_inputs)
-			c = None
-			while c is None or c == a or c == b:
-				c = np.random.randint(num_inputs)
-			bg = None
-			if len(bufgces) > 0:
-				bg = bufgces.pop()
-			if bg is not None and np.random.randint(20) >= bufg_prob or (bg is not None and "DIV" in bg and np.random.randint(19) >= bufg_prob):
-				if "DIV" in bg:
-					print("    BUFGCE_DIV #(.BUFGCE_DIVIDE(%d), .IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .IS_CLR_INVERTED(%d)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(!cen[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
-						(np.random.randint(1, 9), np.random.randint(2), np.random.randint(2), np.random.randint(2), i, a, b, c, np.random.randint(40), np.random.randint(40), i), file=f)
-				else:
-					ctype = np.random.choice(["", "_1"])
-					params = " #(.IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .CE_TYPE(\"%s\")) " % (np.random.randint(2), np.random.randint(2), np.random.choice(["SYNC", "ASYNC"])) if ctype == "" else ""
-					print("    BUFGCE%s %s bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
-						(ctype, params, i, a, b, c, np.random.randint(40), i), file=f)
-			else:
-				print("    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a, b, c), file=f)
-			if i < 64:
-				print("    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b), file=f)
-		print("", file=f)
-		print("    wire [%d:0] r;" % M, file=f)
-		print("    assign r[0] = d;", file=f)
-		print("    assign q = r[%d];" % M, file=f)
-		for i in range(M):
-			print("    layer_1_%d submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));" % (i, i, 32 * i, i, i+1), file=f)
-		print("endmodule", file=f)
-	ccio = ["G23", "F23", "G21", "F22", "F11", "H11", "G10", "H9", "G15", "F17", "E15", "D15", "AH11", "AH12", "AJ9", "AJ10", "AG21", "AH22", "AJ21", "AJ20", "AF18", "AH18", "AJ16", "AJ17"]
-	np.random.shuffle(ccio)
-	with open(root + "/clkroute2/clkrb%d.xdc" % x, "w") as f:
-		for i in range(num_inputs):
-			if i >= len(ccio):
-				break
-			print("set_property PACKAGE_PIN %s [get_ports {clk[%d]}]" % (ccio[i], i), file=f)
-			print("set_property IOSTANDARD LVCMOS18 [get_ports {clk[%d]}]" % (i), file=f)
-
-	with open(root + "/clkroute2/clkrb%d.tcl" % x, "w") as f:
-		print("add_files %s" % (root + ("/clkroute2/clkrb%d.v" % x)), file=f)
-		print("read_xdc %s" % (root + ("/clkroute2/clkrb%d.xdc" % x)), file=f)
-		print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
-		print("opt_design", file=f)
-		print("place_design", file=f)
-		print("route_design", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
-		print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
-		print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
-		print("write_checkpoint -force %s/specimen_clk/clkrb%d.dcp" % (root, x), file=f)
-		print("write_edif -force %s/specimen_clk/clkrb%d.edf" % (root, x), file=f)
-		print("write_bitstream -force %s/specimen_clk/clkrb%d.bit" % (root, x), file=f)
+    with open(root + "/clkroute2/clkrb%d.tcl" % x, "w") as f:
+        print("add_files %s" % (root + ("/clkroute2/clkrb%d.v" % x)), file=f)
+        print("read_xdc %s" % (root + ("/clkroute2/clkrb%d.xdc" % x)), file=f)
+        print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
+        print("opt_design", file=f)
+        print("place_design", file=f)
+        print("route_design", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
+        print(
+            "set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
+        print(
+            "set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]",
+            file=f)
+        print(
+            "write_checkpoint -force %s/specimen_clk/clkrb%d.dcp" % (root, x),
+            file=f)
+        print(
+            "write_edif -force %s/specimen_clk/clkrb%d.edf" % (root, x),
+            file=f)
+        print(
+            "write_bitstream -force %s/specimen_clk/clkrb%d.bit" % (root, x),
+            file=f)
 with open(root + "/clkroute2/run.sh", "w") as f:
-	print("#/usr/bin/env bash", file=f)
-	#print("set -ex", file=f)
-	for x in range(X):
-		print("vivado -mode batch -nolog -nojournal -source clkrb%d.tcl" % x, file=f)
-		print("if [ $? -eq 0 ]; then", file=f)
-		print("    ../../ultra/tools/dump_bitstream %s/specimen_clk/clkrb%d.bit %s/frames.txt > %s/specimen_clk/clkrb%d.dump" % (root, x, root, root, x), file=f)
-		print("    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/clkrb%d.dump > %s/specimen_clk/clkrb%d.tbits" % (root, root, x, root, x), file=f)
-		print("else", file=f)
-		print("   rm %s/specimen_clk/clkrb%d.dump" % (root, x), file=f)
-		print("   rm %s/specimen_clk/clkrb%d.tbits" % (root, x), file=f)
-		print("   rm %s/specimen_clk/clkrb%d.dcp" % (root, x), file=f)
-		print("   rm %s/specimen_clk/clkrb%d.bit" % (root, x), file=f)
-		print("   rm %s/specimen_clk/clkrb%d.features" % (root, x), file=f)
-		print("fi", file=f)
\ No newline at end of file
+    print("#/usr/bin/env bash", file=f)
+    #print("set -ex", file=f)
+    for x in range(X):
+        print(
+            "vivado -mode batch -nolog -nojournal -source clkrb%d.tcl" % x,
+            file=f)
+        print("if [ $? -eq 0 ]; then", file=f)
+        print(
+            "    ../../ultra/tools/dump_bitstream %s/specimen_clk/clkrb%d.bit %s/frames.txt > %s/specimen_clk/clkrb%d.dump"
+            % (root, x, root, root, x),
+            file=f)
+        print(
+            "    python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/clkrb%d.dump > %s/specimen_clk/clkrb%d.tbits"
+            % (root, root, x, root, x),
+            file=f)
+        print("else", file=f)
+        print("   rm %s/specimen_clk/clkrb%d.dump" % (root, x), file=f)
+        print("   rm %s/specimen_clk/clkrb%d.tbits" % (root, x), file=f)
+        print("   rm %s/specimen_clk/clkrb%d.dcp" % (root, x), file=f)
+        print("   rm %s/specimen_clk/clkrb%d.bit" % (root, x), file=f)
+        print("   rm %s/specimen_clk/clkrb%d.features" % (root, x), file=f)
+        print("fi", file=f)
diff --git a/spec/slice.v b/spec/slice.v
index ce33903..bc294ce 100644
--- a/spec/slice.v
+++ b/spec/slice.v
@@ -171,7 +171,7 @@
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
 			"BYP":   assign OUT = BYP;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -192,7 +192,7 @@
 			"FDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDCE #(.IS_C_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .CLR(SR), .D(D), .Q(Q));
 			"FDSE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDSE #(.IS_C_INVERTED(CLKINV), .IS_S_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .S(SR), .D(D), .Q(Q));
 			"FDRE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDRE #(.IS_C_INVERTED(CLKINV), .IS_R_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .R(SR), .D(D), .Q(Q));
-			
+
 			"LDPE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDPE #(.IS_G_INVERTED(CLKINV), .IS_PRE_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .PRE(SR), .D(D), .Q(Q));
 			"LDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDCE #(.IS_G_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .CLR(SR), .D(D), .Q(Q));
 			"NONE": assign Q = INIT;
@@ -213,6 +213,6 @@
 			"D6":    assign OUT = D6;
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
-		endcase		
+		endcase
 	endgenerate
 endmodule
\ No newline at end of file
diff --git a/spec/slice_carry.py b/spec/slice_carry.py
index d095b75..6f6776a 100644
--- a/spec/slice_carry.py
+++ b/spec/slice_carry.py
@@ -21,91 +21,108 @@
 
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 
 np.random.shuffle(slices)
 
 for i in range(N):
-	sl = slices.pop()
-	ffmode = np.random.randint(3, size=2)
-	clk = tuple(np.random.randint(16, size=2))
-	sr = tuple(["1'b1" if y >= 16 else "sr[%d]" % y for y in np.random.randint(25, size=2)])
-	ce = tuple(["1'b1" if y >= 16 else "ce[%d]" % y for y in np.random.randint(25, size=4)])
+    sl = slices.pop()
+    ffmode = np.random.randint(3, size=2)
+    clk = tuple(np.random.randint(16, size=2))
+    sr = tuple([
+        "1'b1" if y >= 16 else "sr[%d]" % y
+        for y in np.random.randint(25, size=2)
+    ])
+    ce = tuple([
+        "1'b1" if y >= 16 else "ce[%d]" % y
+        for y in np.random.randint(25, size=4)
+    ])
 
-	def random_fftype(mode):
-		if mode == 0:
-			return np.random.choice(["FDSE", "FDRE"])
-		elif mode == 1:
-			return np.random.choice(["FDPE", "FDCE"])
-		elif mode == 2:
-			return np.random.choice(["LDPE", "LDCE"])
+    def random_fftype(mode):
+        if mode == 0:
+            return np.random.choice(["FDSE", "FDRE"])
+        elif mode == 1:
+            return np.random.choice(["FDPE", "FDCE"])
+        elif mode == 2:
+            return np.random.choice(["LDPE", "LDCE"])
 
-	def random_bit():
-		return np.random.choice(D)
+    def random_bit():
+        return np.random.choice(D)
 
-	def random_data(width):
-		return "{%s}" % (", ".join([random_bit() for k in range(width)]))
+    def random_data(width):
+        return "{%s}" % (", ".join([random_bit() for k in range(width)]))
 
-	fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
-	used_outroute = [np.random.choice(["FF", "FF2", "MUX"]) for k in range(8)]
-	for j in range(8):
-		if used_outroute[j] == "FF":
-			fftypes[2*j + 1] = "NONE"
-		elif used_outroute[j] == "FF2":
-			fftypes[2*j] = "NONE"		
-		else:
-			fftypes[2*j] = "NONE"
-			fftypes[2*j + 1] = "NONE"
-	cmode = np.random.choice(["NONE", "SINGLE_CY8", "DUAL_CY4"], p=[0.1, 0.7, 0.2])
+    fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
+    used_outroute = [np.random.choice(["FF", "FF2", "MUX"]) for k in range(8)]
+    for j in range(8):
+        if used_outroute[j] == "FF":
+            fftypes[2 * j + 1] = "NONE"
+        elif used_outroute[j] == "FF2":
+            fftypes[2 * j] = "NONE"
+        else:
+            fftypes[2 * j] = "NONE"
+            fftypes[2 * j + 1] = "NONE"
+    cmode = np.random.choice(["NONE", "SINGLE_CY8", "DUAL_CY4"],
+                             p=[0.1, 0.7, 0.2])
 
-	print('   wire [31:0] d%d;' % i)
-	print('   ultra_slice_carry #(')
-	print('      .LOC("%s"),' % sl)
-	for lut in "ABCDEFGH":
-		print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(str(_) for _ in np.random.randint(2, size=64))))
-	for j in range(16):
-		print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH"[j//2], "2" if (j % 2) == 1 else "", fftypes[j]))
-	print("      .FF_INIT(16'b%s)," % "".join(str(_) for _ in np.random.randint(2, size=16)))
-	for j1 in "ABCDEFGH":
-		for j2 in ("1", "2"):
-			print('        .FFMUX%s%s("%s"),' % (j1, j2, np.random.choice(["XORIN", "CY"] if cmode != "NONE" else ["D6"])))
-	for j in range(8):
-		print('        .OUTMUX%s("%s"),' % ("ABCDEFGH"[j], ("D6" if used_outroute[j] != "MUX" else np.random.choice(["D6", "XORIN", "CY"] if cmode != "NONE" else ["D6"]))))
-	print("      .CLKINV(2'd%d)," % np.random.randint(4))
-	print("      .SRINV(2'd%d)," % np.random.randint(4))
-	print('      .CARRY_TYPE("%s"),' % cmode)
-	for j in range (8):
-		print('      .DI%dMUX("%s"),' % (j, np.random.choice(["DI", "X"])))
-	print('      .CIMUX("%s"),' % np.random.choice(["1", "0", "X"]))
-	print('      .CITOPMUX("%s")' % (np.random.choice(["1", "0", "X"]) if cmode == "DUAL_CY4" else "CI"))
-	print('   ) slice%d (' % i)
-	for j in range(1, 7):
-		print("      .A%d(%s)," % (j, random_data(8)))
-	print("      .I(%s)," % random_data(8))
-	print("      .X(%s)," % random_data(8))
-	print("      .CLK({clk[%d], clk[%d]})," % clk)
-	print("      .SR({%s, %s})," % sr)
-	print("      .CE({%s, %s, %s, %s})," % ce)
-	print("      .O(d%d[7:0])," % i)
-	print("      .Q(d%d[15:8])," % i)
-	print("      .Q2(d%d[23:16])," % i)
-	print("      .MUX(d%d[31:24])" % i)
-	print('   );')
-	print()
-	
-	D.clear()
-	for j in range(8):
-		D.append("d%d[%d]" % (i, j))
-		D.append("d%d[%d]" % (i, 24 + j))
-		if fftypes[2 * j] != "NONE":
-			D.append("d%d[%d]" % (i, 8 + j))
-		if fftypes[2 * j + 1] != "NONE":
-			D.append("d%d[%d]" % (i, 16 + j))
-print("    assign q = d%d;" % (N-1))
-print("endmodule")
\ No newline at end of file
+    print('   wire [31:0] d%d;' % i)
+    print('   ultra_slice_carry #(')
+    print('      .LOC("%s"),' % sl)
+    for lut in "ABCDEFGH":
+        print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(
+            str(_) for _ in np.random.randint(2, size=64))))
+    for j in range(16):
+        print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH" [j // 2], "2" if
+                                             (j % 2) == 1 else "", fftypes[j]))
+    print("      .FF_INIT(16'b%s)," % "".join(
+        str(_) for _ in np.random.randint(2, size=16)))
+    for j1 in "ABCDEFGH":
+        for j2 in ("1", "2"):
+            print('        .FFMUX%s%s("%s"),' %
+                  (j1, j2,
+                   np.random.choice(
+                       ["XORIN", "CY"] if cmode != "NONE" else ["D6"])))
+    for j in range(8):
+        print('        .OUTMUX%s("%s"),' %
+              ("ABCDEFGH" [j],
+               ("D6" if used_outroute[j] != "MUX" else np.random.choice(
+                   ["D6", "XORIN", "CY"] if cmode != "NONE" else ["D6"]))))
+    print("      .CLKINV(2'd%d)," % np.random.randint(4))
+    print("      .SRINV(2'd%d)," % np.random.randint(4))
+    print('      .CARRY_TYPE("%s"),' % cmode)
+    for j in range(8):
+        print('      .DI%dMUX("%s"),' % (j, np.random.choice(["DI", "X"])))
+    print('      .CIMUX("%s"),' % np.random.choice(["1", "0", "X"]))
+    print('      .CITOPMUX("%s")' %
+          (np.random.choice(["1", "0", "X"]) if cmode == "DUAL_CY4" else "CI"))
+    print('   ) slice%d (' % i)
+    for j in range(1, 7):
+        print("      .A%d(%s)," % (j, random_data(8)))
+    print("      .I(%s)," % random_data(8))
+    print("      .X(%s)," % random_data(8))
+    print("      .CLK({clk[%d], clk[%d]})," % clk)
+    print("      .SR({%s, %s})," % sr)
+    print("      .CE({%s, %s, %s, %s})," % ce)
+    print("      .O(d%d[7:0])," % i)
+    print("      .Q(d%d[15:8])," % i)
+    print("      .Q2(d%d[23:16])," % i)
+    print("      .MUX(d%d[31:24])" % i)
+    print('   );')
+    print()
+
+    D.clear()
+    for j in range(8):
+        D.append("d%d[%d]" % (i, j))
+        D.append("d%d[%d]" % (i, 24 + j))
+        if fftypes[2 * j] != "NONE":
+            D.append("d%d[%d]" % (i, 8 + j))
+        if fftypes[2 * j + 1] != "NONE":
+            D.append("d%d[%d]" % (i, 16 + j))
+print("    assign q = d%d;" % (N - 1))
+print("endmodule")
diff --git a/spec/slice_carry.v b/spec/slice_carry.v
index 4eaeaee..1ec5577 100644
--- a/spec/slice_carry.v
+++ b/spec/slice_carry.v
@@ -209,7 +209,7 @@
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
 			"BYP":   assign OUT = BYP;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -230,7 +230,7 @@
 			"FDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDCE #(.IS_C_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .CLR(SR), .D(D), .Q(Q));
 			"FDSE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDSE #(.IS_C_INVERTED(CLKINV), .IS_S_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .S(SR), .D(D), .Q(Q));
 			"FDRE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDRE #(.IS_C_INVERTED(CLKINV), .IS_R_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .R(SR), .D(D), .Q(Q));
-			
+
 			"LDPE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDPE #(.IS_G_INVERTED(CLKINV), .IS_PRE_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .PRE(SR), .D(D), .Q(Q));
 			"LDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDCE #(.IS_G_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .CLR(SR), .D(D), .Q(Q));
 			"NONE": assign Q = INIT;
@@ -251,7 +251,7 @@
 			"D6":    assign OUT = D6;
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -265,7 +265,7 @@
 		case(SEL)
 			"DI": assign OUT = DI;
 			"X":  assign OUT = X;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -281,6 +281,6 @@
 			"0":  assign OUT = 1'b0;
 			"1":  assign OUT = 1'b1;
 			"X":  assign OUT = X;
-		endcase		
+		endcase
 	endgenerate
 endmodule
\ No newline at end of file
diff --git a/spec/slice_logic.py b/spec/slice_logic.py
index ce6f46d..e308ecf 100644
--- a/spec/slice_logic.py
+++ b/spec/slice_logic.py
@@ -21,75 +21,86 @@
 
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		for site in sl[4:]:
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        for site in sl[4:]:
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 
 np.random.shuffle(slices)
 
 for i in range(N):
-	sl = slices.pop()
-	ffmode = np.random.randint(3, size=2)
-	clk = tuple(np.random.randint(16, size=2))
-	sr = tuple(["1'b1" if y >= 16 else "sr[%d]" % y for y in np.random.randint(25, size=2)])
-	ce = tuple(["1'b1" if y >= 16 else "ce[%d]" % y for y in np.random.randint(25, size=4)])
+    sl = slices.pop()
+    ffmode = np.random.randint(3, size=2)
+    clk = tuple(np.random.randint(16, size=2))
+    sr = tuple([
+        "1'b1" if y >= 16 else "sr[%d]" % y
+        for y in np.random.randint(25, size=2)
+    ])
+    ce = tuple([
+        "1'b1" if y >= 16 else "ce[%d]" % y
+        for y in np.random.randint(25, size=4)
+    ])
 
-	def random_fftype(mode):
-		if mode == 0:
-			return np.random.choice(["NONE", "FDSE", "FDRE"])
-		elif mode == 1:
-			return np.random.choice(["NONE", "FDPE", "FDCE"])
-		elif mode == 2:
-			return np.random.choice(["NONE", "LDPE", "LDCE"])
+    def random_fftype(mode):
+        if mode == 0:
+            return np.random.choice(["NONE", "FDSE", "FDRE"])
+        elif mode == 1:
+            return np.random.choice(["NONE", "FDPE", "FDCE"])
+        elif mode == 2:
+            return np.random.choice(["NONE", "LDPE", "LDCE"])
 
-	def random_bit():
-		return np.random.choice(D)
+    def random_bit():
+        return np.random.choice(D)
 
-	def random_data(width):
-		return "{%s}" % (", ".join([random_bit() for k in range(width)]))
+    def random_data(width):
+        return "{%s}" % (", ".join([random_bit() for k in range(width)]))
 
-	fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
+    fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
 
-	print('   wire [31:0] d%d;' % i)
-	print('   ultra_slice_logic #(')
-	print('      .LOC("%s"),' % sl)
-	for lut in "ABCDEFGH":
-		print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(str(_) for _ in np.random.randint(2, size=64))))
-	for j in range(16):
-		print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH"[j//2], "2" if (j % 2) == 1 else "", fftypes[j]))
-	print("      .FF_INIT(16'b%s)," % "".join(str(_) for _ in np.random.randint(2, size=16)))
-	for j1 in "ABCDEFGH":
-		for j2 in ("1", "2"):
-			print('        .FFMUX%s%s("%s"),' % (j1, j2, np.random.choice(["F7F8", "D6", "D5", "BYP"])))
-	for j in "ABCDEFGH":
-		print('        .OUTMUX%s("%s"),' % (j, np.random.choice(["F7F8", "D6", "D5"])))
-	print("      .CLKINV(2'd%d)," % np.random.randint(4))
-	print("      .SRINV(2'd%d)" % np.random.randint(4))
-	print('   ) slice%d (' % i)
-	for j in range(1, 7):
-		print("      .A%d(%s)," % (j, random_data(8)))
-	print("      .I(%s)," % random_data(8))
-	print("      .X(%s)," % random_data(8))
-	print("      .CLK({clk[%d], clk[%d]})," % clk)
-	print("      .SR({%s, %s})," % sr)
-	print("      .CE({%s, %s, %s, %s})," % ce)
-	print("      .O(d%d[7:0])," % i)
-	print("      .Q(d%d[15:8])," % i)
-	print("      .Q2(d%d[23:16])," % i)
-	print("      .MUX(d%d[31:24])" % i)
-	print('   );')
-	print()
-	D.clear()
-	for j in range(8):
-		D.append("d%d[%d]" % (i, j))
-		D.append("d%d[%d]" % (i, 24 + j))
-		if fftypes[2 * j] != "NONE":
-			D.append("d%d[%d]" % (i, 8 + j))
-		if fftypes[2 * j + 1] != "NONE":
-			D.append("d%d[%d]" % (i, 16 + j))
-print("    assign q = d%d;" % (N-1))
-print("endmodule")
\ No newline at end of file
+    print('   wire [31:0] d%d;' % i)
+    print('   ultra_slice_logic #(')
+    print('      .LOC("%s"),' % sl)
+    for lut in "ABCDEFGH":
+        print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(
+            str(_) for _ in np.random.randint(2, size=64))))
+    for j in range(16):
+        print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH" [j // 2], "2" if
+                                             (j % 2) == 1 else "", fftypes[j]))
+    print("      .FF_INIT(16'b%s)," % "".join(
+        str(_) for _ in np.random.randint(2, size=16)))
+    for j1 in "ABCDEFGH":
+        for j2 in ("1", "2"):
+            print('        .FFMUX%s%s("%s"),' %
+                  (j1, j2, np.random.choice(["F7F8", "D6", "D5", "BYP"])))
+    for j in "ABCDEFGH":
+        print('        .OUTMUX%s("%s"),' %
+              (j, np.random.choice(["F7F8", "D6", "D5"])))
+    print("      .CLKINV(2'd%d)," % np.random.randint(4))
+    print("      .SRINV(2'd%d)" % np.random.randint(4))
+    print('   ) slice%d (' % i)
+    for j in range(1, 7):
+        print("      .A%d(%s)," % (j, random_data(8)))
+    print("      .I(%s)," % random_data(8))
+    print("      .X(%s)," % random_data(8))
+    print("      .CLK({clk[%d], clk[%d]})," % clk)
+    print("      .SR({%s, %s})," % sr)
+    print("      .CE({%s, %s, %s, %s})," % ce)
+    print("      .O(d%d[7:0])," % i)
+    print("      .Q(d%d[15:8])," % i)
+    print("      .Q2(d%d[23:16])," % i)
+    print("      .MUX(d%d[31:24])" % i)
+    print('   );')
+    print()
+    D.clear()
+    for j in range(8):
+        D.append("d%d[%d]" % (i, j))
+        D.append("d%d[%d]" % (i, 24 + j))
+        if fftypes[2 * j] != "NONE":
+            D.append("d%d[%d]" % (i, 8 + j))
+        if fftypes[2 * j + 1] != "NONE":
+            D.append("d%d[%d]" % (i, 16 + j))
+print("    assign q = d%d;" % (N - 1))
+print("endmodule")
diff --git a/spec/slice_memory.py b/spec/slice_memory.py
index 06130cb..6e1dfd4 100644
--- a/spec/slice_memory.py
+++ b/spec/slice_memory.py
@@ -21,123 +21,135 @@
 
 slices = []
 with open(sys.argv[1], "r") as tf:
-	for line in tf:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		if "CLEM" not in sl[3]:
-			continue
-		for site in sl[4:]:
-			if "SLICEM" in site or "SLICEL" in site:
-				slices.append(site.split(":")[0])
+    for line in tf:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        if "CLEM" not in sl[3]:
+            continue
+        for site in sl[4:]:
+            if "SLICEM" in site or "SLICEL" in site:
+                slices.append(site.split(":")[0])
 
 np.random.shuffle(slices)
 
 for i in range(N):
-	sl = slices.pop()
-	ffmode = np.random.randint(3, size=2)
-	clk = tuple(np.random.randint(16, size=2))
-	wclk = None
-	while wclk is None or wclk in clk:
-		wclk = np.random.randint(16)
-	sr = tuple(["1'b1" if y >= 16 else "sr[%d]" % y for y in np.random.randint(25, size=2)])
-	ce = tuple(["1'b1" if y >= 16 else "ce[%d]" % y for y in np.random.randint(25, size=4)])
-	we = np.random.randint(16)
-	def random_fftype(mode):
-		if mode == 0:
-			return np.random.choice(["NONE", "FDSE", "FDRE"])
-		elif mode == 1:
-			return np.random.choice(["NONE", "FDPE", "FDCE"])
-		elif mode == 2:
-			return np.random.choice(["NONE", "LDPE", "LDCE"])
+    sl = slices.pop()
+    ffmode = np.random.randint(3, size=2)
+    clk = tuple(np.random.randint(16, size=2))
+    wclk = None
+    while wclk is None or wclk in clk:
+        wclk = np.random.randint(16)
+    sr = tuple([
+        "1'b1" if y >= 16 else "sr[%d]" % y
+        for y in np.random.randint(25, size=2)
+    ])
+    ce = tuple([
+        "1'b1" if y >= 16 else "ce[%d]" % y
+        for y in np.random.randint(25, size=4)
+    ])
+    we = np.random.randint(16)
 
-	def random_bit():
-		return np.random.choice(D)
+    def random_fftype(mode):
+        if mode == 0:
+            return np.random.choice(["NONE", "FDSE", "FDRE"])
+        elif mode == 1:
+            return np.random.choice(["NONE", "FDPE", "FDCE"])
+        elif mode == 2:
+            return np.random.choice(["NONE", "LDPE", "LDCE"])
 
-	def random_data(width):
-		return "{%s}" % (", ".join([random_bit() for k in range(width)]))
+    def random_bit():
+        return np.random.choice(D)
 
-	#fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
-	fftypes = ["NONE" for j in range(16)]
+    def random_data(width):
+        return "{%s}" % (", ".join([random_bit() for k in range(width)]))
 
-	dimux = []
-	mode = []
-	ram_legal = True
-	for lut in "HGFEDCBA":
-		choices = ["LOGIC"]
-		if lut == "H":
-			choices += ["RAMD64", "RAMS64", "RAMD32", "SRL16", "SRL32"]
-		else:
-			if mode[0][0:3] != "RAM":
-				choices += ["SRL16", "SRL32"]
-			if ram_legal:
-				choices.append(mode[0])
-		p = [0.1]
-		for j in range(1, len(choices)):
-			p.append(0.9 / (len(choices) - 1))
-		if len(choices) == 1:
-			p[0] = 1
-		next_mode = np.random.choice(choices, p=p)
-		if len(mode) > 0 and mode[-1] == "SRL32" and next_mode == "SRL32":
-			dimux.append(np.random.choice(["DI", "SIN"], p=[0.2, 0.8]))
-		else:
-			dimux.append("DI")
-		if next_mode[0:3] != "RAM":
-			ram_legal = False
-		mode.append(next_mode)
+    #fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
+    fftypes = ["NONE" for j in range(16)]
 
-	dimux = list(reversed(dimux))
-	mode = list(reversed(mode))
+    dimux = []
+    mode = []
+    ram_legal = True
+    for lut in "HGFEDCBA":
+        choices = ["LOGIC"]
+        if lut == "H":
+            choices += ["RAMD64", "RAMS64", "RAMD32", "SRL16", "SRL32"]
+        else:
+            if mode[0][0:3] != "RAM":
+                choices += ["SRL16", "SRL32"]
+            if ram_legal:
+                choices.append(mode[0])
+        p = [0.1]
+        for j in range(1, len(choices)):
+            p.append(0.9 / (len(choices) - 1))
+        if len(choices) == 1:
+            p[0] = 1
+        next_mode = np.random.choice(choices, p=p)
+        if len(mode) > 0 and mode[-1] == "SRL32" and next_mode == "SRL32":
+            dimux.append(np.random.choice(["DI", "SIN"], p=[0.2, 0.8]))
+        else:
+            dimux.append("DI")
+        if next_mode[0:3] != "RAM":
+            ram_legal = False
+        mode.append(next_mode)
 
-	print('   wire [31:0] d%d;' % i)
-	print('   ultra_slice_memory #(')
-	print('      .LOC("%s"),' % sl)
-	for j in range(8):
-		print('      .%s_MODE("%s"),' % ("ABCDEFGH"[j], mode[j]))
-	for lut in "ABCDEFGH":
-		print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(str(_) for _ in np.random.randint(2, size=64))))
-	for j in range(16):
-		print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH"[j//2], "2" if (j % 2) == 1 else "", fftypes[j]))
-	print("      .FF_INIT(16'b%s)," % "".join(str(_) for _ in np.random.randint(2, size=16)))
-	for j1 in "ABCDEFGH":
-		for j2 in ("1", "2"):
-			print('        .FFMUX%s%s("%s"),' % (j1, j2, np.random.choice(["F7F8", "D6", "D5"])))
-	for j in "ABCDEFGH":
-		print('        .OUTMUX%s("%s"),' % (j, np.random.choice(["F7F8", "D6", "D5"])))
-	for j in range(7):
-		print('      .DIMUX%s("%s"),' % ("ABCDEFG"[j], dimux[j]))
-	print("      .WCLKINV(1'd%d)," % np.random.randint(2))
+    dimux = list(reversed(dimux))
+    mode = list(reversed(mode))
 
-	waused = np.random.randint(4)
+    print('   wire [31:0] d%d;' % i)
+    print('   ultra_slice_memory #(')
+    print('      .LOC("%s"),' % sl)
+    for j in range(8):
+        print('      .%s_MODE("%s"),' % ("ABCDEFGH" [j], mode[j]))
+    for lut in "ABCDEFGH":
+        print("      .%sLUT_INIT(64'b%s)," % (lut, "".join(
+            str(_) for _ in np.random.randint(2, size=64))))
+    for j in range(16):
+        print('      .%sFF%s_TYPE("%s"),' % ("ABCDEFGH" [j // 2], "2" if
+                                             (j % 2) == 1 else "", fftypes[j]))
+    print("      .FF_INIT(16'b%s)," % "".join(
+        str(_) for _ in np.random.randint(2, size=16)))
+    for j1 in "ABCDEFGH":
+        for j2 in ("1", "2"):
+            print('        .FFMUX%s%s("%s"),' %
+                  (j1, j2, np.random.choice(["F7F8", "D6", "D5"])))
+    for j in "ABCDEFGH":
+        print('        .OUTMUX%s("%s"),' %
+              (j, np.random.choice(["F7F8", "D6", "D5"])))
+    for j in range(7):
+        print('      .DIMUX%s("%s"),' % ("ABCDEFG" [j], dimux[j]))
+    print("      .WCLKINV(1'd%d)," % np.random.randint(2))
 
-	print("      .WA6USED(1'd%d)," % (1 if waused > 0 else 0))
-	print("      .WA7USED(1'd%d)," % (1 if waused > 1 else 0))
-	print("      .WA8USED(1'd%d)," % (1 if waused > 2 else 0))
-	print("      .CLKINV(2'd%d)," % np.random.randint(4))
-	print("      .SRINV(2'd%d)" % np.random.randint(4))
-	print('   ) slice%d (' % i)
-	for j in range(1, 7):
-		print("      .A%d(%s)," % (j, random_data(8)))
-	print("      .I(%s)," % random_data(8))
-	print("      .X(%s)," % random_data(8))
-	print("      .CLK({clk[%d], clk[%d]})," % clk[0:2])
-	print("      .WCLK(clk[%d])," % wclk)
-	print("      .SR({%s, %s})," % sr)
-	print("      .CE({%s, %s, %s, %s})," % ce[0:4])
-	print("      .WE(ce[%d])," % we)
-	print("      .O(d%d[7:0])," % i)
-	print("      .Q(d%d[15:8])," % i)
-	print("      .Q2(d%d[23:16])," % i)
-	print("      .MUX(d%d[31:24])" % i)
-	print('   );')
-	print()
-	D.clear()
-	for j in range(8):
-		D.append("d%d[%d]" % (i, j))
-		D.append("d%d[%d]" % (i, 24 + j))
-		if fftypes[2 * j] != "NONE":
-			D.append("d%d[%d]" % (i, 8 + j))
-		if fftypes[2 * j + 1] != "NONE":
-			D.append("d%d[%d]" % (i, 16 + j))
-print("    assign q = d%d;" % (N-1))
-print("endmodule")
\ No newline at end of file
+    waused = np.random.randint(4)
+
+    print("      .WA6USED(1'd%d)," % (1 if waused > 0 else 0))
+    print("      .WA7USED(1'd%d)," % (1 if waused > 1 else 0))
+    print("      .WA8USED(1'd%d)," % (1 if waused > 2 else 0))
+    print("      .CLKINV(2'd%d)," % np.random.randint(4))
+    print("      .SRINV(2'd%d)" % np.random.randint(4))
+    print('   ) slice%d (' % i)
+    for j in range(1, 7):
+        print("      .A%d(%s)," % (j, random_data(8)))
+    print("      .I(%s)," % random_data(8))
+    print("      .X(%s)," % random_data(8))
+    print("      .CLK({clk[%d], clk[%d]})," % clk[0:2])
+    print("      .WCLK(clk[%d])," % wclk)
+    print("      .SR({%s, %s})," % sr)
+    print("      .CE({%s, %s, %s, %s})," % ce[0:4])
+    print("      .WE(ce[%d])," % we)
+    print("      .O(d%d[7:0])," % i)
+    print("      .Q(d%d[15:8])," % i)
+    print("      .Q2(d%d[23:16])," % i)
+    print("      .MUX(d%d[31:24])" % i)
+    print('   );')
+    print()
+    D.clear()
+    for j in range(8):
+        D.append("d%d[%d]" % (i, j))
+        D.append("d%d[%d]" % (i, 24 + j))
+        if fftypes[2 * j] != "NONE":
+            D.append("d%d[%d]" % (i, 8 + j))
+        if fftypes[2 * j + 1] != "NONE":
+            D.append("d%d[%d]" % (i, 16 + j))
+print("    assign q = d%d;" % (N - 1))
+print("endmodule")
diff --git a/spec/slice_memory.v b/spec/slice_memory.v
index efe2fe7..95e99b9 100644
--- a/spec/slice_memory.v
+++ b/spec/slice_memory.v
@@ -207,7 +207,7 @@
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
 			"BYP":   assign OUT = BYP;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -228,7 +228,7 @@
 			"FDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDCE #(.IS_C_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .CLR(SR), .D(D), .Q(Q));
 			"FDSE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDSE #(.IS_C_INVERTED(CLKINV), .IS_S_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .S(SR), .D(D), .Q(Q));
 			"FDRE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) FDRE #(.IS_C_INVERTED(CLKINV), .IS_R_INVERTED(SRINV), .INIT(INIT)) ff_i (.C(C), .CE(CE), .R(SR), .D(D), .Q(Q));
-			
+
 			"LDPE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDPE #(.IS_G_INVERTED(CLKINV), .IS_PRE_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .PRE(SR), .D(D), .Q(Q));
 			"LDCE": (* LOC=LOC, BEL=BEL, keep, dont_touch *) LDCE #(.IS_G_INVERTED(CLKINV), .IS_CLR_INVERTED(SRINV), .INIT(INIT)) ff_i (.G(C), .GE(CE), .CLR(SR), .D(D), .Q(Q));
 			"NONE": assign Q = INIT;
@@ -249,7 +249,7 @@
 			"D6":    assign OUT = D6;
 			"D5":    assign OUT = D5;
 			"CY":    assign OUT = CY;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -263,7 +263,7 @@
 		case(SEL)
 			"DI": assign OUT = DI;
 			"SIN":  assign OUT = SIN;
-		endcase		
+		endcase
 	endgenerate
 endmodule
 
@@ -302,7 +302,7 @@
 					.CLK(CLK), .WE(CE),
 					.I(DI[0]), .O(DO[1])
 				);
-			
+
 			end else if (WA6USED) begin
 				(* BEL=BEL6, LOC=LOC, keep, dont_touch *) RAMD64E #(.INIT(INIT), .IS_CLK_INVERTED(CLKINV)) ram_i (
 					.RADR0(A[0]), .RADR1(A[1]), .RADR2(A[2]), .RADR3(A[3]), .RADR4(A[4]), .RADR5(A[5]),
@@ -324,7 +324,7 @@
 			if (WA6USED && WA7USED && WA8USED) begin
 				(* BEL=BEL6, LOC=LOC, keep, dont_touch *) RAMS64E1 #(.INIT(INIT), .IS_CLK_INVERTED(CLKINV)) ram_i (
 					.ADR0(WA[0]), .ADR1(WA[1]), .ADR2(WA[2]), .ADR3(WA[3]), .ADR4(WA[4]), .ADR5(WA[5]),
-					.WADR6(WA[6]), .WADR7(WA[7]), .WADR8(WA[8]), 
+					.WADR6(WA[6]), .WADR7(WA[7]), .WADR8(WA[8]),
 					.CLK(CLK), .WE(CE),
 					.I(DI[0]), .O(DO[1])
 				);
@@ -366,13 +366,13 @@
 		end else if (MODE == "RAMD32") begin
 			(* BEL=BEL6, LOC=LOC, keep, dont_touch *) RAMD32 #(.INIT(INIT[63:32]), .IS_CLK_INVERTED(CLKINV)) ram1_i (
 				.WADR0(WA[0]), .WADR1(WA[1]), .WADR2(WA[2]), .WADR3(WA[3]), .WADR4(WA[4]),
-				.RADR0(A[0]), .RADR1(A[1]), .RADR2(A[2]), .RADR3(A[3]), .RADR4(A[4]), 
+				.RADR0(A[0]), .RADR1(A[1]), .RADR2(A[2]), .RADR3(A[3]), .RADR4(A[4]),
 				.CLK(CLK), .WE(CE),
 				.I(DI[1]), .O(DO[1])
 			);
 			(* BEL=BEL5, LOC=LOC, keep, dont_touch *) RAMD32 #(.INIT(INIT[31:0]), .IS_CLK_INVERTED(CLKINV)) ram0_i (
 				.WADR0(WA[0]), .WADR1(WA[1]), .WADR2(WA[2]), .WADR3(WA[3]), .WADR4(WA[4]),
-				.RADR0(A[0]), .RADR1(A[1]), .RADR2(A[2]), .RADR3(A[3]), .RADR4(A[4]), 
+				.RADR0(A[0]), .RADR1(A[1]), .RADR2(A[2]), .RADR3(A[3]), .RADR4(A[4]),
 				.CLK(CLK), .WE(CE),
 				.I(DI[0]), .O(DO[0])
 			);
diff --git a/tools/assemble.cpp b/tools/assemble.cpp
index f86e494..7036aa0 100644
--- a/tools/assemble.cpp
+++ b/tools/assemble.cpp
@@ -85,7 +85,7 @@
 		// e.g. word 3, bit 9
 		// offset: 0b10100110010 - concatenate (3 + (255 - 92)) [frame offset] and 9/4 [nibble offset]
 		// becomes: 0x10100110010
-		// shifted by bit in nibble (9%4): 0x20200220020 
+		// shifted by bit in nibble (9%4): 0x20200220020
 		uint32_t offset =  (word + (255 - 92)) << 3  | nib;
 		uint64_t exp_offset = 0;
 		// Odd parity
@@ -237,7 +237,7 @@
 			// Duplicate last frame in a row, but empty??
 			for (int i = 0; i < 93; i++)
 				fdata[i] = 0;
-			bsw.write_short_packet(OP_WRITE, FDRI, fdata);				
+			bsw.write_short_packet(OP_WRITE, FDRI, fdata);
 			bsw.write_short_packet(OP_WRITE, FAR, {fr.first});
 			bsw.write_crc();
 			if (next_frame.count(fr.first)) {
@@ -310,7 +310,7 @@
 			continue;
 		dest_set.insert(addr);
 		frames[addr].clear();
-		frames[addr].resize(93*32, false); 
+		frames[addr].resize(93*32, false);
 	}
 }
 
@@ -320,7 +320,7 @@
 		if (addr == 0x07FC0000)
 			continue;
 		frames[addr].clear();
-		frames[addr].resize(93*32, false); 
+		frames[addr].resize(93*32, false);
 		if (last_frame != 0xFFFFFFFF)
 			next_frame[last_frame] = addr;
 		last_frame = addr;
diff --git a/tools/bits.py b/tools/bits.py
index e493cc4..4729a08 100644
--- a/tools/bits.py
+++ b/tools/bits.py
@@ -22,60 +22,62 @@
 frame_rc_height = {}
 
 with open(sys.argv[1], 'r') as f:
-	for line in f:
-		m = frame_line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		minor = frame & 0xFF
-		if bus != 0 or half != 0:
-			continue
-		if (row, col) not in frame_rc_height:
-			frame_rc_height[(row, col, frame & ~0xFF)] = minor + 1
-		else:
-			frame_rc_height[(row, col, frame & ~0xFF)] = max(frame_rc_height[(row, col)], minor + 1)
+    for line in f:
+        m = frame_line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        minor = frame & 0xFF
+        if bus != 0 or half != 0:
+            continue
+        if (row, col) not in frame_rc_height:
+            frame_rc_height[(row, col, frame & ~0xFF)] = minor + 1
+        else:
+            frame_rc_height[(row, col, frame & ~0xFF)] = max(
+                frame_rc_height[(row, col)], minor + 1)
 
 tiles_to_xy = {}
 with open(sys.argv[2], 'r') as tilef:
-	for line in tilef:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		x = int(sl[0])
-		y = int(sl[1])
-		name = sl[2]
-		tiles_to_xy[name] = (x, y)
+    for line in tilef:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        x = int(sl[0])
+        y = int(sl[1])
+        name = sl[2]
+        tiles_to_xy[name] = (x, y)
 
 with open(sys.argv[3]) as tb_f:
-	tbj = json.load(tb_f)
+    tbj = json.load(tb_f)
 
-frames_to_tiles = {} 
+frames_to_tiles = {}
 for tilename, tiledata in tbj.items():
-	tile_offset = 0
-	for chunk in tiledata:
-		frame, start, size = chunk
-		if frame not in frames_to_tiles:
-			frames_to_tiles[frame] = []
-		name = tilename.split(":")[0]
-		frames_to_tiles[frame].append((start, tiles_to_xy[name][1], tiles_to_xy[name][0], name))
-		tile_offset += size
+    tile_offset = 0
+    for chunk in tiledata:
+        frame, start, size = chunk
+        if frame not in frames_to_tiles:
+            frames_to_tiles[frame] = []
+        name = tilename.split(":")[0]
+        frames_to_tiles[frame].append((start, tiles_to_xy[name][1],
+                                       tiles_to_xy[name][0], name))
+        tile_offset += size
 
 for frame, tiles in frames_to_tiles.items():
-	tiles.sort()
+    tiles.sort()
 
 for rc, height in sorted(frame_rc_height.items()):
-	row, col, frame = rc
-	line = "%08x %6d %6d %6d" % (frame, row, col, height)
-	print(line)
-	frame = (row << 18) | (col << 8)
-	last_start = 0;
-	if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0:
-		for tile in frames_to_tiles[frame]:
-			start, ty, tx, tname = tile
-			print("                            %6d (%4d) %6d %6d %s" % (start, start - last_start, tx, ty, tname))
-			last_start = start
-
+    row, col, frame = rc
+    line = "%08x %6d %6d %6d" % (frame, row, col, height)
+    print(line)
+    frame = (row << 18) | (col << 8)
+    last_start = 0
+    if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0:
+        for tile in frames_to_tiles[frame]:
+            start, ty, tx, tname = tile
+            print("                            %6d (%4d) %6d %6d %s" %
+                  (start, start - last_start, tx, ty, tname))
+            last_start = start
diff --git a/tools/bits_to_tiles.py b/tools/bits_to_tiles.py
index 42a5928..858e880 100644
--- a/tools/bits_to_tiles.py
+++ b/tools/bits_to_tiles.py
@@ -17,45 +17,45 @@
 import json
 
 line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')
-frames_to_tiles = {} # (start, size, tile, tile offset)
- 
+frames_to_tiles = {}  # (start, size, tile, tile offset)
+
 with open(sys.argv[1]) as tb_f:
-	tbj = json.load(tb_f)
+    tbj = json.load(tb_f)
 
 for tilename, tiledata in tbj.items():
-	tile_offset = 0
-	for chunk in tiledata:
-		frame, start, size = chunk
-		if frame not in frames_to_tiles:
-			frames_to_tiles[frame] = []
-		frames_to_tiles[frame].append((start, size, tilename, tile_offset))
-		tile_offset += size
+    tile_offset = 0
+    for chunk in tiledata:
+        frame, start, size = chunk
+        if frame not in frames_to_tiles:
+            frames_to_tiles[frame] = []
+        frames_to_tiles[frame].append((start, size, tilename, tile_offset))
+        tile_offset += size
 
 tile_bits = {}
 
 # Always write these tiles to avoid correlation issues
 # (distinguishing between all/no bits)
 for tilename, tiledata in tbj.items():
-	if "INT_INTF_L_IO" in tilename:
-		tile_bits[tilename] = set()
+    if "INT_INTF_L_IO" in tilename:
+        tile_bits[tilename] = set()
 
 with open(sys.argv[2]) as df:
-	for line in df:
-		m = line_re.match(line)
-		if not m:
-			continue
-		frame = int(m[1], 16)
-		if frame not in frames_to_tiles:
-			continue
-		framebit = int(m[2]) * 32 + int(m[3])
-		for fb in frames_to_tiles[frame]:
-			start, size, tile, toff = fb
-			if framebit >= start and framebit < (start + size):
-				if tile not in tile_bits:
-					tile_bits[tile] = set()
-				tile_bits[tile].add(toff + (framebit - start))
+    for line in df:
+        m = line_re.match(line)
+        if not m:
+            continue
+        frame = int(m[1], 16)
+        if frame not in frames_to_tiles:
+            continue
+        framebit = int(m[2]) * 32 + int(m[3])
+        for fb in frames_to_tiles[frame]:
+            start, size, tile, toff = fb
+            if framebit >= start and framebit < (start + size):
+                if tile not in tile_bits:
+                    tile_bits[tile] = set()
+                tile_bits[tile].add(toff + (framebit - start))
 
 for tile, bits in sorted(tile_bits.items()):
-	print(".tile %s" % tile)
-	for b in sorted(bits):
-		print(b)
+    print(".tile %s" % tile)
+    for b in sorted(bits):
+        print(b)
diff --git a/tools/columns.py b/tools/columns.py
index 826cc04..132349b 100644
--- a/tools/columns.py
+++ b/tools/columns.py
@@ -22,59 +22,60 @@
 frame_rc_height = {}
 
 with open(sys.argv[1], 'r') as f:
-	for line in f:
-		m = frame_line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		minor = frame & 0xFF
-		if bus != 0 or half != 0:
-			continue
-		if (row, col) not in frame_rc_height:
-			frame_rc_height[(row, col)] = minor + 1
-		else:
-			frame_rc_height[(row, col)] = max(frame_rc_height[(row, col)], minor + 1)
+    for line in f:
+        m = frame_line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        minor = frame & 0xFF
+        if bus != 0 or half != 0:
+            continue
+        if (row, col) not in frame_rc_height:
+            frame_rc_height[(row, col)] = minor + 1
+        else:
+            frame_rc_height[(row, col)] = max(frame_rc_height[(row, col)],
+                                              minor + 1)
 
 tiles_to_xy = {}
 with open(sys.argv[2], 'r') as tilef:
-	for line in tilef:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		x = int(sl[0])
-		y = int(sl[1])
-		name = sl[2]
-		tiles_to_xy[name] = (x, y)
+    for line in tilef:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        x = int(sl[0])
+        y = int(sl[1])
+        name = sl[2]
+        tiles_to_xy[name] = (x, y)
 
 with open(sys.argv[3]) as tb_f:
-	tbj = json.load(tb_f)
+    tbj = json.load(tb_f)
 
-frames_to_tiles = {} 
+frames_to_tiles = {}
 for tilename, tiledata in tbj.items():
-	tile_offset = 0
-	for chunk in tiledata:
-		frame, start, size = chunk
-		if frame not in frames_to_tiles:
-			frames_to_tiles[frame] = []
-		name = tilename.split(":")[0]
-		frames_to_tiles[frame].append((tiles_to_xy[name][1], tiles_to_xy[name][0], name))
-		tile_offset += size
+    tile_offset = 0
+    for chunk in tiledata:
+        frame, start, size = chunk
+        if frame not in frames_to_tiles:
+            frames_to_tiles[frame] = []
+        name = tilename.split(":")[0]
+        frames_to_tiles[frame].append((tiles_to_xy[name][1],
+                                       tiles_to_xy[name][0], name))
+        tile_offset += size
 
 for frame, tiles in frames_to_tiles.items():
-	tiles.sort()
+    tiles.sort()
 
 print("row    col    height tx     ty     tname")
 
 for rc, height in sorted(frame_rc_height.items()):
-	row, col = rc
-	line = "%6d %6d %6d" % (row, col, height)
-	frame = (row << 18) | (col << 8)
-	if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0:
-		ty, tx, tname = frames_to_tiles[frame][0]
-		line += " %6d %6d %s" % (tx, ty, tname)
-	print(line)
-
+    row, col = rc
+    line = "%6d %6d %6d" % (row, col, height)
+    frame = (row << 18) | (col << 8)
+    if frame in frames_to_tiles and len(frames_to_tiles[frame]) > 0:
+        ty, tx, tname = frames_to_tiles[frame][0]
+        line += " %6d %6d %s" % (tx, ty, tname)
+    print(line)
diff --git a/tools/common.h b/tools/common.h
index 481e842..21565a0 100644
--- a/tools/common.h
+++ b/tools/common.h
@@ -1,16 +1,16 @@
 #ifndef COMMON_H
 #define COMMON_H
 
-#include <stdint.h>
-#include <string>
-#include <vector>
-#include <iostream>
 #include <fstream>
-#include <stdexcept>
+#include <iostream>
 #include <map>
 #include <set>
-#include <unordered_map>
 #include <stdarg.h>
+#include <stdexcept>
+#include <stdint.h>
+#include <string>
+#include <unordered_map>
+#include <vector>
 constexpr uint32_t kCrc32CastagnoliPolynomial = 0x82F63B78;
 
 // From prjxray
@@ -21,191 +21,183 @@
 // frame data (32bit) pair and return the newly computed CRC value.
 
 inline uint32_t icap_crc(uint32_t addr, uint32_t data, uint32_t prev) {
-	constexpr int kAddressBitWidth = 5;
-	constexpr int kDataBitWidth = 32;
+  constexpr int kAddressBitWidth = 5;
+  constexpr int kDataBitWidth = 32;
 
-	uint64_t poly = static_cast<uint64_t>(kCrc32CastagnoliPolynomial) << 1;
-	uint64_t val = (static_cast<uint64_t>(addr) << 32) | data;
-	uint64_t crc = prev;
+  uint64_t poly = static_cast<uint64_t>(kCrc32CastagnoliPolynomial) << 1;
+  uint64_t val = (static_cast<uint64_t>(addr) << 32) | data;
+  uint64_t crc = prev;
 
-	for (int i = 0; i < kAddressBitWidth + kDataBitWidth; i++) {
-		if ((val & 1) != (crc & 1))
-			crc ^= poly;
+  for (int i = 0; i < kAddressBitWidth + kDataBitWidth; i++) {
+    if ((val & 1) != (crc & 1))
+      crc ^= poly;
 
-		val >>= 1;
-		crc >>= 1;
-	}
-	return crc;
+    val >>= 1;
+    crc >>= 1;
+  }
+  return crc;
 }
 
 // From Yosys
-inline std::string vstringf(const char *fmt, va_list ap)
-{
-	std::string string;
-	char *str = NULL;
+inline std::string vstringf(const char *fmt, va_list ap) {
+  std::string string;
+  char *str = NULL;
 
-#if defined(_WIN32 )|| defined(__CYGWIN__)
-	int sz = 64, rc;
-	while (1) {
-		va_list apc;
-		va_copy(apc, ap);
-		str = (char*)realloc(str, sz);
-		rc = vsnprintf(str, sz, fmt, apc);
-		va_end(apc);
-		if (rc >= 0 && rc < sz)
-			break;
-		sz *= 2;
-	}
+#if defined(_WIN32) || defined(__CYGWIN__)
+  int sz = 64, rc;
+  while (1) {
+    va_list apc;
+    va_copy(apc, ap);
+    str = (char *)realloc(str, sz);
+    rc = vsnprintf(str, sz, fmt, apc);
+    va_end(apc);
+    if (rc >= 0 && rc < sz)
+      break;
+    sz *= 2;
+  }
 #else
-	if (vasprintf(&str, fmt, ap) < 0)
-		str = NULL;
+  if (vasprintf(&str, fmt, ap) < 0)
+    str = NULL;
 #endif
 
-	if (str != NULL) {
-		string = str;
-		free(str);
-	}
+  if (str != NULL) {
+    string = str;
+    free(str);
+  }
 
-	return string;
+  return string;
 }
 
-inline std::string stringf(const char *fmt, ...)
-{
-	std::string string;
-	va_list ap;
+inline std::string stringf(const char *fmt, ...) {
+  std::string string;
+  va_list ap;
 
-	va_start(ap, fmt);
-	string = vstringf(fmt, ap);
-	va_end(ap);
+  va_start(ap, fmt);
+  string = vstringf(fmt, ap);
+  va_end(ap);
 
-	return string;
+  return string;
 }
 
 // Bitstream definitions
 
-enum BitstreamOp : uint8_t {
-	OP_NOP = 0,
-	OP_READ = 1,
-	OP_WRITE = 2
-};
+enum BitstreamOp : uint8_t { OP_NOP = 0, OP_READ = 1, OP_WRITE = 2 };
 
 // File and database convenience functions
 // Line-by-line reader, skipping over blank lines and comments
 struct LineReader {
-	LineReader(const std::string &filename) {
-		in.open(filename);
-		if (!in) {
-			throw std::runtime_error("failed to open " + filename);
-		}
-	}
-	std::ifstream in;
-	std::string linebuf;
-	bool at_sof = true;
+  LineReader(const std::string &filename) {
+    in.open(filename);
+    if (!in) {
+      throw std::runtime_error("failed to open " + filename);
+    }
+  }
+  std::ifstream in;
+  std::string linebuf;
+  bool at_sof = true;
 
-	struct iterator {
-		LineReader *parent = nullptr;
-		bool at_end = false;
-		inline bool operator!=(const iterator &other) const {
-			return at_end != other.at_end;
-		};
-		inline const std::string& operator*() const {
-			return parent->linebuf;
-		}
-		inline iterator &operator++() {
-			parent->next();
-			at_end = parent->linebuf.empty();
-			return *this;
-		}
-	};
+  struct iterator {
+    LineReader *parent = nullptr;
+    bool at_end = false;
+    inline bool operator!=(const iterator &other) const {
+      return at_end != other.at_end;
+    };
+    inline const std::string &operator*() const { return parent->linebuf; }
+    inline iterator &operator++() {
+      parent->next();
+      at_end = parent->linebuf.empty();
+      return *this;
+    }
+  };
 
-	void next() {
-		while (std::getline(in, linebuf)) {
-			auto cpos = linebuf.find('#');
-			if (cpos != std::string::npos)
-				linebuf = linebuf.substr(0, cpos);
-			if (linebuf.empty())
-				continue;
-			linebuf = linebuf.substr(linebuf.find_first_not_of(" \t"));
-			if (linebuf.empty())
-				continue;			
-			break;
-		}
-		at_sof = false;
-	}
+  void next() {
+    while (std::getline(in, linebuf)) {
+      auto cpos = linebuf.find('#');
+      if (cpos != std::string::npos)
+        linebuf = linebuf.substr(0, cpos);
+      if (linebuf.empty())
+        continue;
+      linebuf = linebuf.substr(linebuf.find_first_not_of(" \t"));
+      if (linebuf.empty())
+        continue;
+      break;
+    }
+    at_sof = false;
+  }
 
-	iterator begin() {
-		if (at_sof)
-			next();
-		return iterator{this, linebuf.empty()};
-	}
+  iterator begin() {
+    if (at_sof)
+      next();
+    return iterator{this, linebuf.empty()};
+  }
 
-	iterator end() {
-		return iterator{this, true};
-	}
+  iterator end() { return iterator{this, true}; }
 };
 
 struct TileInstance {
-	std::string name;
-	int type;
-	int x, y;
-	struct TileBitMapping {
-		int frame_offset;
-		int bit_offset;
-		int size;
-	};
-	std::vector<TileBitMapping> bits;
+  std::string name;
+  int type;
+  int x, y;
+  struct TileBitMapping {
+    int frame_offset;
+    int bit_offset;
+    int size;
+  };
+  std::vector<TileBitMapping> bits;
 };
 
 struct TileType {
-	std::string type;
-	bool loaded_db = false;
-	std::unordered_map<std::string, std::vector<int>> features;
+  std::string type;
+  bool loaded_db = false;
+  std::unordered_map<std::string, std::vector<int>> features;
 };
 
 struct ChipData {
 
-	std::string root;
-	void open(const std::string &root);
-	void load_frames();
-	void load_tiles();
-	void load_tiletype_database(int type);
+  std::string root;
+  void open(const std::string &root);
+  void load_frames();
+  void load_tiles();
+  void load_tiletype_database(int type);
 
-	std::unordered_map<std::string, TileInstance> tiles;
-	inline TileInstance &get_tile_by_name(const std::string &name) {
-		return tiles.at(name);
-	}
+  std::unordered_map<std::string, TileInstance> tiles;
+  inline TileInstance &get_tile_by_name(const std::string &name) {
+    return tiles.at(name);
+  }
 
-	std::vector<TileType> tiletypes;
-	std::unordered_map<std::string, int> tiletype_by_name;
-	TileType &get_tiletype_by_name(const std::string &name) {
-		return tiletypes.at(tiletype_by_name.at(name));
-	}
-	TileType &load_tile_database(const std::string &tile) {
-		int type = tiles.at(tile).type;
-		load_tiletype_database(type);
-		return tiletypes.at(type);
-	}
+  std::vector<TileType> tiletypes;
+  std::unordered_map<std::string, int> tiletype_by_name;
+  TileType &get_tiletype_by_name(const std::string &name) {
+    return tiletypes.at(tiletype_by_name.at(name));
+  }
+  TileType &load_tile_database(const std::string &tile) {
+    int type = tiles.at(tile).type;
+    load_tiletype_database(type);
+    return tiletypes.at(type);
+  }
 
-	std::set<uint32_t> all_frames;
-
+  std::set<uint32_t> all_frames;
 };
 
-inline void split_str(const std::string &s, std::vector<std::string> &dest, const std::string &delim = " ", bool skip_empty = true, int lim = -1) {
-	dest.clear();
-	std::string buf;
+inline void split_str(const std::string &s, std::vector<std::string> &dest,
+                      const std::string &delim = " ", bool skip_empty = true,
+                      int lim = -1) {
+  dest.clear();
+  std::string buf;
 
-	for (char c : s) {
-		if (delim.find(c) != std::string::npos && (lim == -1 || int(dest.size()) < lim)) {
-			if (!buf.empty() || !skip_empty)
-				dest.push_back(buf);
-			buf.clear();
-		} else {
-			buf += c;
-		}
-	}
+  for (char c : s) {
+    if (delim.find(c) != std::string::npos &&
+        (lim == -1 || int(dest.size()) < lim)) {
+      if (!buf.empty() || !skip_empty)
+        dest.push_back(buf);
+      buf.clear();
+    } else {
+      buf += c;
+    }
+  }
 
-	if (!buf.empty())
-		dest.push_back(buf);
+  if (!buf.empty())
+    dest.push_back(buf);
 }
 
 #endif
\ No newline at end of file
diff --git a/tools/dump_bitstream.cpp b/tools/dump_bitstream.cpp
index c1b3689..a4b7169 100644
--- a/tools/dump_bitstream.cpp
+++ b/tools/dump_bitstream.cpp
@@ -115,7 +115,7 @@
 		// e.g. word 3, bit 9
 		// offset: 0b10100110010 - concatenate (3 + (255 - 92)) [frame offset] and 9/4 [nibble offset]
 		// becomes: 0x10100110010
-		// shifted by bit in nibble (9%4): 0x20200220020 
+		// shifted by bit in nibble (9%4): 0x20200220020
 		uint32_t offset =  (word + (255 - 92)) << 3  | nib;
 		uint64_t exp_offset = 0;
 		// Odd parity
@@ -142,7 +142,7 @@
 					exp_checksum ^= get_ecc_value(word, i);
 				}
 				std::cout <<  stringf("F0x%08xW%03dB%02d", frame, word, i) << std::endl;
-			}			
+			}
 		++word;
 		if (word >= 93 && next_frame.count(frame)) {
 			// 4 parity bits for each bit in nibbles
@@ -273,6 +273,6 @@
 		std::cerr << "Failed to open input file" << std::endl;
 		return 2;
 	}
-	rd.data.insert(rd.data.begin(), std::istream_iterator<uint8_t>(file), std::istream_iterator<uint8_t>()); 
+	rd.data.insert(rd.data.begin(), std::istream_iterator<uint8_t>(file), std::istream_iterator<uint8_t>());
 	parse_bitstream(rd);
 }
\ No newline at end of file
diff --git a/tools/explain.cpp b/tools/explain.cpp
index acc1d07..0d42518 100644
--- a/tools/explain.cpp
+++ b/tools/explain.cpp
@@ -78,7 +78,7 @@
 // Currently have poor quality DBs for these tiles,
 // skip outputting them
 std::set<std::string> skip_tiles = {
-	"CLEL_L", "CLEM_R", "RCLK_INT_R", 
+	"CLEL_L", "CLEM_R", "RCLK_INT_R",
 };
 
 
diff --git a/tools/filter.py b/tools/filter.py
index 8776311..c29e1c4 100644
--- a/tools/filter.py
+++ b/tools/filter.py
@@ -17,14 +17,14 @@
 import json
 
 line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')
-frames_to_tiles = {} # (start, size, tile, tile offset)
+frames_to_tiles = {}  # (start, size, tile, tile offset)
 
 active = False
 
 with open(sys.argv[1]) as f:
-	for line in f:
-		sl = line.strip()
-		if sl[0] == '.':
-			active = sys.argv[2] in sl
-		if active:
-			print(sl)
\ No newline at end of file
+    for line in f:
+        sl = line.strip()
+        if sl[0] == '.':
+            active = sys.argv[2] in sl
+        if active:
+            print(sl)
diff --git a/tools/frames.py b/tools/frames.py
index 8265cb3..ceb5bb3 100644
--- a/tools/frames.py
+++ b/tools/frames.py
@@ -20,18 +20,18 @@
 outlines = set()
 
 with open(sys.argv[1], 'r') as f:
-	for line in f:
-		m = line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		minor = frame & 0xFF
-		outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d"
-							% (frame, bus, half, row, col, minor))
+    for line in f:
+        m = line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        minor = frame & 0xFF
+        outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d" %
+                     (frame, bus, half, row, col, minor))
 
 for o in sorted(outlines):
-	print(o)
+    print(o)
diff --git a/tools/frames_2.py b/tools/frames_2.py
index 0fe5890..eb55fc5 100644
--- a/tools/frames_2.py
+++ b/tools/frames_2.py
@@ -20,18 +20,18 @@
 outlines = set()
 
 with open(sys.argv[1], 'r') as f:
-	for line in f:
-		m = line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		minor = frame & 0xFF
-		outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d"
-							% (frame, bus, half, row, col, minor))
+    for line in f:
+        m = line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        minor = frame & 0xFF
+        outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d" %
+                     (frame, bus, half, row, col, minor))
 
 for o in sorted(outlines):
-	print(o)
+    print(o)
diff --git a/tools/ll.py b/tools/ll.py
index f65beb9..853198a 100644
--- a/tools/ll.py
+++ b/tools/ll.py
@@ -15,24 +15,26 @@
 import re
 import sys
 
-line_re = re.compile(r'Bit\s+\d+\s+(0x[0-9A-Fa-f]+)\s+\d+\s+SLR\d\s+\d+\s+Block=([A-Za-z0-9_]+).*')
+line_re = re.compile(
+    r'Bit\s+\d+\s+(0x[0-9A-Fa-f]+)\s+\d+\s+SLR\d\s+\d+\s+Block=([A-Za-z0-9_]+).*'
+)
 
 outlines = set()
 
 with open(sys.argv[1], 'r') as f:
-	for line in f:
-		m = line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		site = m.group(2)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		minor = frame & 0xFF
-		outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d %s"
-							% (frame, bus, half, row, col, minor, site))
+    for line in f:
+        m = line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        site = m.group(2)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        minor = frame & 0xFF
+        outlines.add("F=%08x B=%d H=%d R=%03d C=%04d M=%03d %s" %
+                     (frame, bus, half, row, col, minor, site))
 
 for o in sorted(outlines):
-	print(o)
+    print(o)
diff --git a/tools/oddtiles.py b/tools/oddtiles.py
index 82451cf..a34579f 100644
--- a/tools/oddtiles.py
+++ b/tools/oddtiles.py
@@ -17,42 +17,42 @@
 import json
 
 line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')
-frames_to_tiles = {} # (start, size, tile, tile offset)
+frames_to_tiles = {}  # (start, size, tile, tile offset)
 
 with open(sys.argv[1]) as tb_f:
-	tbj = json.load(tb_f)
+    tbj = json.load(tb_f)
 
 for tilename, tiledata in tbj.items():
-	tile_offset = 0
-	for chunk in tiledata:
-		frame, start, size = chunk
-		if frame not in frames_to_tiles:
-			frames_to_tiles[frame] = []
-		frames_to_tiles[frame].append((start, size, tilename, tile_offset))
-		tile_offset += size
+    tile_offset = 0
+    for chunk in tiledata:
+        frame, start, size = chunk
+        if frame not in frames_to_tiles:
+            frames_to_tiles[frame] = []
+        frames_to_tiles[frame].append((start, size, tilename, tile_offset))
+        tile_offset += size
 
 tile_bits = {}
 
 with open(sys.argv[2]) as df:
-	for line in df:
-		m = line_re.match(line)
-		if not m:
-			continue
-		frame = int(m[1], 16)
-		if frame not in frames_to_tiles:
-			continue
-		framebit = int(m[2]) * 32 + int(m[3])
-		for fb in frames_to_tiles[frame]:
-			start, size, tile, toff = fb
-			if framebit > start and framebit < (start + size):
-				if tile not in tile_bits:
-					tile_bits[tile] = set()
-				tile_bits[tile].add(toff + (framebit - start))
+    for line in df:
+        m = line_re.match(line)
+        if not m:
+            continue
+        frame = int(m[1], 16)
+        if frame not in frames_to_tiles:
+            continue
+        framebit = int(m[2]) * 32 + int(m[3])
+        for fb in frames_to_tiles[frame]:
+            start, size, tile, toff = fb
+            if framebit > start and framebit < (start + size):
+                if tile not in tile_bits:
+                    tile_bits[tile] = set()
+                tile_bits[tile].add(toff + (framebit - start))
 
 for tile, bits in sorted(tile_bits.items()):
-	if "CLE" in tile:
-		if 152 not in bits:
-			print(tile)
-	if "INT" in tile:
-		if 3640 not in bits:
-			print(tile)
\ No newline at end of file
+    if "CLE" in tile:
+        if 152 not in bits:
+            print(tile)
+    if "INT" in tile:
+        if 3640 not in bits:
+            print(tile)
diff --git a/tools/roi.py b/tools/roi.py
index e1b217a..8676552 100644
--- a/tools/roi.py
+++ b/tools/roi.py
@@ -17,62 +17,45 @@
 import json
 # Usage: tilegrid.json
 with open(sys.argv[1]) as tb_f:
-	tbj = json.load(tb_f)
+    tbj = json.load(tb_f)
 tile_to_frames = {}
 frame_to_tiles = {}
 for tilename, tiledata in tbj.items():
-	tn = tilename.split(":")[0]
-	tile_offset = 0
-	tile_to_frames[tn] = []
-	for chunk in tiledata:
-		frame, start, size = chunk
-		tile_to_frames[tn].append(frame)
-		if frame not in frame_to_tiles:
-			frame_to_tiles[frame] = []
-		frame_to_tiles[frame].append(tn)
+    tn = tilename.split(":")[0]
+    tile_offset = 0
+    tile_to_frames[tn] = []
+    for chunk in tiledata:
+        frame, start, size = chunk
+        tile_to_frames[tn].append(frame)
+        if frame not in frame_to_tiles:
+            frame_to_tiles[frame] = []
+        frame_to_tiles[frame].append(tn)
 basis_tiles = [
-	"CLEM_X41Y120",
-	"INT_X41Y120",
-	"CLEL_R_X41Y120",
-	"BRAM_X42Y120",
-	"INT_INTF_L_X42Y120",
-	"INT_X42Y120",
-	"CLEL_R_X42Y120",
-	"CLEM_X43Y120",
-	"INT_X43Y120",
-	"INT_INTF_R_X43Y120",
-	"DSP_X43Y120",
-	"CLEM_X44Y120",
-	"INT_X44Y120",
-	"CLEL_R_X44Y120",
-	"CLEM_X45Y120",
-	"INT_X45Y120",
-	"INT_INTF_R_X45Y120",
-	"DSP_X45Y120",
-	"CLEM_X46Y120",
-	"INT_X46Y120",
-	"CLEL_R_X46Y120",
-	"INT_X47Y120",
-	"CLEL_R_X47Y120"
+    "CLEM_X41Y120", "INT_X41Y120", "CLEL_R_X41Y120", "BRAM_X42Y120",
+    "INT_INTF_L_X42Y120", "INT_X42Y120", "CLEL_R_X42Y120", "CLEM_X43Y120",
+    "INT_X43Y120", "INT_INTF_R_X43Y120", "DSP_X43Y120", "CLEM_X44Y120",
+    "INT_X44Y120", "CLEL_R_X44Y120", "CLEM_X45Y120", "INT_X45Y120",
+    "INT_INTF_R_X45Y120", "DSP_X45Y120", "CLEM_X46Y120", "INT_X46Y120",
+    "CLEL_R_X46Y120", "INT_X47Y120", "CLEL_R_X47Y120"
 ]
 
 roi_frames = set()
 
 for tile in basis_tiles:
-	if tile not in tile_to_frames:
-		continue
-	for frame in tile_to_frames[tile]:
-		roi_frames.add(frame)
+    if tile not in tile_to_frames:
+        continue
+    for frame in tile_to_frames[tile]:
+        roi_frames.add(frame)
 
 roi_tiles = set()
 for frame in roi_frames:
-	for tile in frame_to_tiles[frame]:
-		roi_tiles.add(tile)
+    for tile in frame_to_tiles[frame]:
+        roi_tiles.add(tile)
 
-with open(sys.argv[2], "w") as frames_f: 
-	for frame in sorted(roi_frames):
-		print("0x%08x" % frame, file=frames_f)
+with open(sys.argv[2], "w") as frames_f:
+    for frame in sorted(roi_frames):
+        print("0x%08x" % frame, file=frames_f)
 
 with open(sys.argv[3], "w") as tiles_f:
-	for tile in sorted(roi_tiles):
-		print("tile %s" % tile, file=tiles_f)
\ No newline at end of file
+    for tile in sorted(roi_tiles):
+        print("tile %s" % tile, file=tiles_f)
diff --git a/tools/stripdb.cpp b/tools/stripdb.cpp
index 01ff1ab..6991ee6 100644
--- a/tools/stripdb.cpp
+++ b/tools/stripdb.cpp
@@ -69,7 +69,7 @@
 	// Currently have poor quality DBs for these tiles,
 	// skip outputting them
 	std::set<std::string> skip_tiles = {
-		"CLEL_L", "CLEM_R", "RCLK_INT_R", 
+		"CLEL_L", "CLEM_R", "RCLK_INT_R",
 	};
 
 	for (const auto &entry : fs::directory_iterator(argv[1])) {
diff --git a/tools/tilebits.py b/tools/tilebits.py
index 57fbe2b..de472d9 100644
--- a/tools/tilebits.py
+++ b/tools/tilebits.py
@@ -18,134 +18,147 @@
 
 tiles = {}
 site_to_tile = {}
-tile_to_bits = {} # (frame, bit start, bit size)
+tile_to_bits = {}  # (frame, bit start, bit size)
 
 with open(sys.argv[1], 'r') as tilef:
-	for line in tilef:
-		sl = line.strip().split(",")
-		if len(sl) < 4:
-			continue
-		x = int(sl[0])
-		y = int(sl[1])
-		name = sl[2]
-		ttype = sl[3]
-		tiles[(x, y)] = (name + ":" + ttype, ttype, [])
-		for site in sl[4:]:
-			sitename, sitetype = site.split(":")
-			tiles[(x, y)][2].append((sitename, sitetype))
-			site_to_tile[sitename] = (x, y)
+    for line in tilef:
+        sl = line.strip().split(",")
+        if len(sl) < 4:
+            continue
+        x = int(sl[0])
+        y = int(sl[1])
+        name = sl[2]
+        ttype = sl[3]
+        tiles[(x, y)] = (name + ":" + ttype, ttype, [])
+        for site in sl[4:]:
+            sitename, sitetype = site.split(":")
+            tiles[(x, y)][2].append((sitename, sitetype))
+            site_to_tile[sitename] = (x, y)
 
-ll_line_re = re.compile(r'Bit\s+\d+\s+(0x[0-9A-Fa-f]+)\s+(\d+)\s+SLR\d\s+\d+\s+Block=([A-Za-z0-9_]+).*')
+ll_line_re = re.compile(
+    r'Bit\s+\d+\s+(0x[0-9A-Fa-f]+)\s+(\d+)\s+SLR\d\s+\d+\s+Block=([A-Za-z0-9_]+).*'
+)
 site_re = re.compile(r'SLICE_X(\d+)Y(\d+)')
 with open(sys.argv[2], 'r') as llf:
-	for line in llf:
-		m = ll_line_re.match(line)
-		if not m:
-			continue
-		frame = int(m.group(1), 16)
-		bit = int(m.group(2))
-		start_bit = bit - 2
-		site = m.group(3)
-		bus = (frame >> 24) & 0x7
-		half = (frame >> 23) & 0x1
-		row = (frame >> 18) & 0x1F
-		col = (frame >> 8) & 0x3FF
-		m = frame & 0xFF
+    for line in llf:
+        m = ll_line_re.match(line)
+        if not m:
+            continue
+        frame = int(m.group(1), 16)
+        bit = int(m.group(2))
+        start_bit = bit - 2
+        site = m.group(3)
+        bus = (frame >> 24) & 0x7
+        half = (frame >> 23) & 0x1
+        row = (frame >> 18) & 0x1F
+        col = (frame >> 8) & 0x3FF
+        m = frame & 0xFF
 
+        sm = site_re.match(site)
+        site_x = int(sm.group(1))
+        site_y = int(sm.group(2))
+        frame_upper = frame & ~0xFF
 
-		sm = site_re.match(site)
-		site_x = int(sm.group(1))
-		site_y = int(sm.group(2))
-		frame_upper = frame & ~0xFF
+        if site not in site_to_tile:
+            continue
+        tx, ty = site_to_tile[site]
+        tiledata = tiles[tx, ty]
+        tile_to_bits[tiledata[0]] = []
+        for m in range(16):
+            tile_to_bits[tiledata[0]].append((frame_upper | m, start_bit, 48))
 
+        def process_nonlogic(x, y, icol):
+            if (x, y) not in tiles:
+                return
+            itiledata = tiles[x, y]
+            if itiledata[1] == "INT":
+                if (x + 1, y) not in tiles:
+                    return
 
-		if site not in site_to_tile:
-			continue
-		tx, ty = site_to_tile[site]
-		tiledata = tiles[tx, ty]
-		tile_to_bits[tiledata[0]] = []
-		for m in range(16):
-			tile_to_bits[tiledata[0]].append((frame_upper | m, start_bit, 48))
+                int_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
+                tile_to_bits[itiledata[0]] = []
+                for m in range(76):
+                    tile_to_bits[itiledata[0]].append((int_frame_base | m,
+                                                       start_bit, 48))
+                process_clock(x, y - 1, int_frame_base, start_bit + 48, 76)
+                process_cmt(x - 2, y, icol - 2)
+                process_int_intf(x - 1, y, icol - 1)
+            elif itiledata[1] == "BRAM":
+                bram_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
+                tile_to_bits[itiledata[0]] = []
+                for m in range(6):
+                    tile_to_bits[itiledata[0]].append((bram_frame_base | m,
+                                                       start_bit, 5 * 48))
+                process_clock(x, y - 5, bram_frame_base, start_bit + 5 * 48, 6)
+            elif itiledata[1] == "DSP":
+                dsp_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
+                tile_to_bits[itiledata[0]] = []
+                for m in range(8):
+                    tile_to_bits[itiledata[0]].append((dsp_frame_base | m,
+                                                       start_bit, 5 * 48))
+                process_clock(x, y - 5, dsp_frame_base, start_bit + 5 * 48, 8)
 
-		def process_nonlogic(x, y, icol):
-			if (x, y) not in tiles:
-				return
-			itiledata = tiles[x, y]
-			if itiledata[1] == "INT":
-				if (x + 1, y) not in tiles:
-					return
+                if (x - 1, y) in tiles and "INT_INTF" in tiles[x - 1, y][1]:
+                    process_clock(x - 1, y - 5, dsp_frame_base,
+                                  start_bit + 5 * 48, 8)
 
-				int_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
-				tile_to_bits[itiledata[0]] = []
-				for m in range(76):
-					tile_to_bits[itiledata[0]].append((int_frame_base | m, start_bit, 48))
-				process_clock(x, y-1, int_frame_base, start_bit + 48, 76)
-				process_cmt(x-2, y, icol-2)
-				process_int_intf(x-1, y, icol-1)
-			elif itiledata[1] == "BRAM":
-				bram_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
-				tile_to_bits[itiledata[0]] = []
-				for m in range(6):
-					tile_to_bits[itiledata[0]].append((bram_frame_base | m, start_bit, 5 * 48))
-				process_clock(x, y-5, bram_frame_base, start_bit + 5*48, 6)
-			elif itiledata[1] == "DSP":
-				dsp_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
-				tile_to_bits[itiledata[0]] = []
-				for m in range(8):
-					tile_to_bits[itiledata[0]].append((dsp_frame_base | m, start_bit, 5 * 48))
-				process_clock(x, y-5, dsp_frame_base, start_bit + 5*48, 8)
+        def process_clock(cx, cy, frame_base, end_bit, height):
+            if (cx, cy) not in tiles:
+                return
+            if end_bit != (1392 + 48):
+                return
+            ctiledata = tiles[cx, cy]
+            if not ctiledata[1].startswith("RCLK"):
+                return
+            tile_to_bits[ctiledata[0]] = []
+            for m in range(height):
+                tile_to_bits[ctiledata[0]].append((frame_base | m,
+                                                   end_bit + 48, 48))
 
-				if (x - 1, y) in tiles and "INT_INTF" in tiles[x - 1, y][1]:
-					process_clock(x-1, y-5, dsp_frame_base, start_bit + 5*48, 8)
+        def process_cmt(x, y, icol):
+            if (x, y) not in tiles:
+                return
+            ctiledata = tiles[x, y]
+            if not ctiledata[1] in ("CMT_L", "CMT_RIGHT"):
+                return
+            cmt_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
+            tile_to_bits[ctiledata[0]] = []
+            for m in range(12):
+                tile_to_bits[ctiledata[0]].append((cmt_frame_base | m,
+                                                   start_bit, 60 * 48))
 
-		def process_clock(cx, cy, frame_base, end_bit, height):
-			if (cx, cy) not in tiles:
-				return
-			if end_bit != (1392 + 48):
-				return
-			ctiledata = tiles[cx, cy]
-			if not ctiledata[1].startswith("RCLK"):
-				return
-			tile_to_bits[ctiledata[0]] = []
-			for m in range(height):
-				tile_to_bits[ctiledata[0]].append((frame_base | m, end_bit + 48, 48))
+        def process_int_intf(x, y, icol):
+            if (x, y) not in tiles:
+                return
+            itiledata = tiles[x, y]
+            if not itiledata[1] in ("INT_INTF_L_IO", "INT_INTF_R_IO"):
+                return
+            int_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
+            tile_to_bits[itiledata[0]] = []
+            for m in range(4):
+                tile_to_bits[itiledata[0]].append((int_frame_base | m,
+                                                   start_bit, 48))
 
-		def process_cmt(x, y, icol):
-			if (x, y) not in tiles:
-				return
-			ctiledata = tiles[x, y]
-			if not ctiledata[1] in ("CMT_L", "CMT_RIGHT"):
-				return
-			cmt_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
-			tile_to_bits[ctiledata[0]] = []
-			for m in range(12):
-				tile_to_bits[ctiledata[0]].append((cmt_frame_base | m, start_bit, 60 * 48))
-
-		def process_int_intf(x, y, icol):
-			if (x, y) not in tiles:
-				return
-			itiledata = tiles[x, y]
-			if not itiledata[1] in ("INT_INTF_L_IO", "INT_INTF_R_IO"):
-				return
-			int_frame_base = (frame_upper & ~0x3FFFF) | (icol << 8)
-			tile_to_bits[itiledata[0]] = []
-			for m in range(4):
-				tile_to_bits[itiledata[0]].append((int_frame_base | m, start_bit, 48))
-
-
-		process_nonlogic(tx-1, ty, col-1)
-		process_nonlogic(tx+1, ty, col+1)
-		process_clock(tx, ty-1, frame_upper, start_bit + 48, 16)
+        process_nonlogic(tx - 1, ty, col - 1)
+        process_nonlogic(tx + 1, ty, col + 1)
+        process_clock(tx, ty - 1, frame_upper, start_bit + 48, 16)
 # Original JSON
 with open(sys.argv[3], 'w') as tj:
-	tj.write(json.dumps(tile_to_bits, sort_keys=True, indent=4, separators=(',', ': ')))
-	tj.write("\n")
+    tj.write(
+        json.dumps(
+            tile_to_bits, sort_keys=True, indent=4, separators=(',', ': ')))
+    tj.write("\n")
 # New simplified text format
 with open(sys.argv[4], 'w') as tf:
-	for loc, tiledata in sorted(tiles.items()):
-		print(".tile %s %s %d %d" % (tiledata[0].split(":")[0], tiledata[1], loc[0], loc[1]), file=tf)
-		for site in tiledata[2]:
-			print("site %s %s" % site, file=tf)
-		if tiledata[0] in tile_to_bits:
-			for frame, offset, size in tile_to_bits[tiledata[0]]:
-				print("frame 0x%08x bits %d +: %d" % (frame, offset, size), file=tf)
\ No newline at end of file
+    for loc, tiledata in sorted(tiles.items()):
+        print(
+            ".tile %s %s %d %d" % (tiledata[0].split(":")[0], tiledata[1],
+                                   loc[0], loc[1]),
+            file=tf)
+        for site in tiledata[2]:
+            print("site %s %s" % site, file=tf)
+        if tiledata[0] in tile_to_bits:
+            for frame, offset, size in tile_to_bits[tiledata[0]]:
+                print(
+                    "frame 0x%08x bits %d +: %d" % (frame, offset, size),
+                    file=tf)
diff --git a/tools/tilegrid_report.py b/tools/tilegrid_report.py
index 9add2ca..52df26b 100755
--- a/tools/tilegrid_report.py
+++ b/tools/tilegrid_report.py
@@ -59,10 +59,9 @@
         if args.show_only_missing and have_bits == len(tiles):
             continue
 
-        print(
-            '{}: {}/{} ({:.2f} %)'.format(
-                tile_type, have_bits, len(tiles),
-                100. * float(have_bits) / len(tiles)))
+        print('{}: {}/{} ({:.2f} %)'.format(
+            tile_type, have_bits, len(tiles),
+            100. * float(have_bits) / len(tiles)))
 
         if args.verbose:
             tiles_with_missing_bits = []
@@ -75,10 +74,9 @@
                 print('{} is missing CLB_IO_CLK'.format(tile_name))
 
     print('')
-    print(
-        'Summary: {}/{} ({:.2f} %)'.format(
-            total_have_bits, total_tile_count,
-            100. * float(total_have_bits) / total_tile_count))
+    print('Summary: {}/{} ({:.2f} %)'.format(
+        total_have_bits, total_tile_count,
+        100. * float(total_have_bits) / total_tile_count))
 
 
 if __name__ == "__main__":
diff --git a/tools/update_tilebits_all.sh b/tools/update_tilebits_all.sh
index 0596c19..9cb1c78 100644
--- a/tools/update_tilebits_all.sh
+++ b/tools/update_tilebits_all.sh
@@ -14,5 +14,5 @@
 # limitations under the License.
 
 for x in $1/*.dump; do
-	python bits_to_tiles.py $2 $x > ${x%.*}.tbits 
+	python bits_to_tiles.py $2 $x > ${x%.*}.tbits
 done
diff --git a/utils/bit2fasm.py b/utils/bit2fasm.py
index bedb997..06e5b11 100755
--- a/utils/bit2fasm.py
+++ b/utils/bit2fasm.py
@@ -14,7 +14,12 @@
 import tempfile
 
 
-def bit_to_bits(bitread, part_yaml, arch, bit_file, bits_file, frame_range=None):
+def bit_to_bits(bitread,
+                part_yaml,
+                arch,
+                bit_file,
+                bits_file,
+                frame_range=None):
     """ Calls bitread to create bits (ASCII) from bit file (binary) """
     if frame_range:
         frame_range_arg = '-F {}'.format(frame_range)
@@ -85,7 +90,8 @@
         default=default_bitread)
     parser.add_argument(
         '--architecture',
-        help="Name of the device architecture family (e.g. UltraScale, Series7, etc.)",
+        help=
+        "Name of the device architecture family (e.g. UltraScale, Series7, etc.)",
         default="UltraScale")
     parser.add_argument(
         '--frame_range', help="Frame range to use with bitread.")
@@ -113,9 +119,8 @@
             frame_range=args.frame_range,
         )
 
-        bits_to_fasm(
-            args.db_root, args.part, bits_file.name, args.verbose,
-            args.canonical)
+        bits_to_fasm(args.db_root, args.part, bits_file.name, args.verbose,
+                     args.canonical)
 
 
 if __name__ == '__main__':
diff --git a/utils/bitstream.py b/utils/bitstream.py
index 832e46d..7f63f96 100644
--- a/utils/bitstream.py
+++ b/utils/bitstream.py
@@ -101,8 +101,8 @@
         for rowk, rowv in tbv["rows"].items():
             for busk, busv in rowv["configuration_buses"].items():
                 for colk, colv in busv["configuration_columns"].items():
-                    yield (
-                        busk, tbk, int(rowk), int(colk), colv["frame_count"])
+                    yield (busk, tbk, int(rowk), int(colk),
+                           colv["frame_count"])
 
 
 def addr_bits2word(block_type, top_bottom, cfg_row, cfg_col, minor_addr):
diff --git a/utils/bitstream_analyzer.py b/utils/bitstream_analyzer.py
index c2e4632..473bb6a 100755
--- a/utils/bitstream_analyzer.py
+++ b/utils/bitstream_analyzer.py
@@ -61,6 +61,7 @@
 
 opcodes = ("NOP", "READ", "WRITE", "UNKNOWN")
 
+
 class Bitstream:
     def __init__(self, file_name, verbose=False):
         self.frame_data = []
@@ -70,7 +71,7 @@
         with open(file_name, "rb") as f:
             word = f.read(4)
             while word:
-                self.words.append(int.from_bytes(word, byteorder = 'big'))
+                self.words.append(int.from_bytes(word, byteorder='big'))
                 word = f.read(4)
         pos, self.header = self.get_header()
         self.body = self.words[pos + 1:]
@@ -85,8 +86,8 @@
         payload_len = 0
         for word in self.body:
             if payload_len > 0:
-                payload_len = self.parse_reg(
-                    reg_addr, word, payload_len, verbose)
+                payload_len = self.parse_reg(reg_addr, word, payload_len,
+                                             verbose)
                 continue
             else:
                 packet_header = self.parse_packet_header(word)
@@ -99,9 +100,12 @@
                         print("\n\tNOP")
                     else:
                         print(
-                        "\n\tConfiguration Register Word: ", hex(word),
-                        'Type: {}, Op: {}, Addr: {} ({}), Words: {}'.format(
-                            type, opcodes[opcode], conf_regs[reg_addr] if reg_addr in conf_regs else "UNKNOWN", reg_addr, words))
+                            "\n\tConfiguration Register Word: ", hex(word),
+                            'Type: {}, Op: {}, Addr: {} ({}), Words: {}'.
+                            format(
+                                type, opcodes[opcode], conf_regs[reg_addr]
+                                if reg_addr in conf_regs else "UNKNOWN",
+                                reg_addr, words))
                 if opcode and reg_addr in conf_regs:
                     payload_len = words
                     if conf_regs[reg_addr] == "FDRI" and type == 1:
@@ -144,10 +148,11 @@
             self.parse_cor0(word, verbose)
         elif reg == "FDRI":
             # We are in progress of a FDRI operation
-            # Keep adding data words 
+            # Keep adding data words
             if self.fdri_in_progress:
                 if verbose:
-                    print("\t{:2d}. 0x{:08X}".format(self.fdri_write_len - payload_len, word))
+                    print("\t{:2d}. 0x{:08X}".format(
+                        self.fdri_write_len - payload_len, word))
                 self.frame_data.append(word)
                 if payload_len == 1:
                     self.fdri_in_progress = False
diff --git a/utils/connections.py b/utils/connections.py
index 334d2f4..8885ab2 100644
--- a/utils/connections.py
+++ b/utils/connections.py
@@ -35,8 +35,8 @@
                     (grid_deltas, tile_types[1], pairs[1]))
 
     def all_possible_connections_from(self, wire_in_grid):
-        tile_type = self.coord_to_tile_type[(
-            wire_in_grid.grid_x, wire_in_grid.grid_y)]
+        tile_type = self.coord_to_tile_type[(wire_in_grid.grid_x,
+                                             wire_in_grid.grid_y)]
 
         key = (tile_type, wire_in_grid.wire)
 
@@ -46,8 +46,8 @@
         for relative_coord, target_tile_type, target_wire in (
                 self.potential_connections[key]):
             rel_x, rel_y = relative_coord
-            target_coord = (
-                wire_in_grid.grid_x + rel_x, wire_in_grid.grid_y + rel_y)
+            target_coord = (wire_in_grid.grid_x + rel_x,
+                            wire_in_grid.grid_y + rel_y)
 
             if target_coord in self.coord_to_tile_type:
                 if self.coord_to_tile_type[target_coord] == target_tile_type:
diff --git a/utils/db.py b/utils/db.py
index 74d20d1..2ba0c1f 100644
--- a/utils/db.py
+++ b/utils/db.py
@@ -49,8 +49,8 @@
             if f.endswith('.json') and f.startswith('tile_type_'):
                 tile_type = f[len('tile_type_'):-len('.json')].lower()
 
-                segbits = os.path.join(
-                    self.db_root, 'segbits_{}.db'.format(tile_type))
+                segbits = os.path.join(self.db_root,
+                                       'segbits_{}.db'.format(tile_type))
                 if not os.path.isfile(segbits):
                     segbits = None
 
@@ -59,19 +59,19 @@
                 if not os.path.isfile(block_ram_segbits):
                     block_ram_segbits = None
 
-                ppips = os.path.join(
-                    self.db_root, 'ppips_{}.db'.format(tile_type))
+                ppips = os.path.join(self.db_root,
+                                     'ppips_{}.db'.format(tile_type))
                 if not os.path.isfile(ppips):
                     ppips = None
 
-                mask = os.path.join(
-                    self.db_root, 'mask_{}.db'.format(tile_type))
+                mask = os.path.join(self.db_root,
+                                    'mask_{}.db'.format(tile_type))
                 if not os.path.isfile(mask):
                     mask = None
 
                 tile_type_file = os.path.join(
-                    self.db_root, 'tile_type_{}.json'.format(
-                        tile_type.upper()))
+                    self.db_root,
+                    'tile_type_{}.json'.format(tile_type.upper()))
                 if not os.path.isfile(tile_type_file):
                     tile_type_file = None
 
@@ -88,8 +88,8 @@
 
                 self.site_types[site_type_name] = os.path.join(self.db_root, f)
 
-        required_features_path = os.path.join(
-            self.db_root, self.part, "required_features.fasm")
+        required_features_path = os.path.join(self.db_root, self.part,
+                                              "required_features.fasm")
         if os.path.isfile(required_features_path):
             with open(required_features_path, "r") as fp:
                 features = []
@@ -143,11 +143,10 @@
         self._read_tileconn()
         self._read_tile_types()
 
-        tile_wires = dict(
-            (tile_type, db['wires'])
-            for tile_type, db in self.tile_types.items())
-        return connections.Connections(
-            self.tilegrid, self.tileconn, tile_wires)
+        tile_wires = dict((tile_type, db['wires'])
+                          for tile_type, db in self.tile_types.items())
+        return connections.Connections(self.tilegrid, self.tileconn,
+                                       tile_wires)
 
     def get_site_types(self):
         return self.site_types.keys()
diff --git a/utils/fasm_assembler.py b/utils/fasm_assembler.py
index 1775a4e..8a3fba8 100644
--- a/utils/fasm_assembler.py
+++ b/utils/fasm_assembler.py
@@ -57,8 +57,8 @@
 
         for bits_info in self.grid.iter_all_frames():
             for coli in range(bits_info.bits.frames):
-                init_frame_at_address(
-                    frames, bits_info.bits.base_address + coli)
+                init_frame_at_address(frames,
+                                      bits_info.bits.base_address + coli)
 
         return frames
 
@@ -123,8 +123,8 @@
         any_bits = set()
 
         try:
-            for block_type, bit in segbits.feature_to_bits(gridinfo.bits, db_k,
-                                                           address):
+            for block_type, bit in segbits.feature_to_bits(
+                    gridinfo.bits, db_k, address):
                 any_bits.add(block_type)
                 update_segbit(bit)
         except KeyError:
diff --git a/utils/fasm_disassembler.py b/utils/fasm_disassembler.py
index 44415ef..337cffd 100644
--- a/utils/fasm_disassembler.py
+++ b/utils/fasm_disassembler.py
@@ -37,14 +37,13 @@
         self.segment_map = self.grid.get_segment_map()
         self.decode_warnings = set()
 
-    def find_features_in_tile(
-            self,
-            tile_name,
-            block_type,
-            bits,
-            solved_bitdata,
-            bitdata,
-            verbose=False):
+    def find_features_in_tile(self,
+                              tile_name,
+                              block_type,
+                              bits,
+                              solved_bitdata,
+                              bitdata,
+                              verbose=False):
         gridinfo = self.grid.gridinfo_at_tilename(tile_name)
 
         try:
@@ -75,8 +74,8 @@
             self.decode_warnings.add(gridinfo.tile_type)
             return
 
-        for ones_matched, feature in tile_segbits.match_bitdata(block_type,
-                                                                bits, bitdata):
+        for ones_matched, feature in tile_segbits.match_bitdata(
+                block_type, bits, bitdata):
             for frame, bit in ones_matched:
                 if frame not in solved_bitdata:
                     solved_bitdata[frame] = set()
@@ -117,8 +116,12 @@
                 tiles_checked.add((bits_info.tile, bits_info.block_type))
 
                 for fasm_line in self.find_features_in_tile(
-                        bits_info.tile, bits_info.block_type, bits_info.bits,
-                        solved_bitdata, bitdata, verbose=verbose):
+                        bits_info.tile,
+                        bits_info.block_type,
+                        bits_info.bits,
+                        solved_bitdata,
+                        bitdata,
+                        verbose=verbose):
                     if fasm_line not in emitted_features:
                         emitted_features.add(fasm_line)
                         yield fasm_line
@@ -151,9 +154,8 @@
                             'unknown_bit', '{:08x}_{}_{}'.format(
                                 frame, wordidx, bitidx)))
                     annotations.append(
-                        fasm.Annotation(
-                            'unknown_segment',
-                            '0x{:08x}'.format(aligned_frame)))
+                        fasm.Annotation('unknown_segment',
+                                        '0x{:08x}'.format(aligned_frame)))
                     annotations.append(
                         fasm.Annotation(
                             'unknown_segbit', '{:02d}_{:02d}'.format(
diff --git a/utils/grid_types.py b/utils/grid_types.py
index a27c3ac..22e732f 100644
--- a/utils/grid_types.py
+++ b/utils/grid_types.py
@@ -12,8 +12,8 @@
 
 GridLoc = namedtuple('GridLoc', 'grid_x grid_y')
 ClockRegion = namedtuple('ClockRegion', 'name x y')
-GridInfo = namedtuple(
-    'GridInfo', 'bits sites tile_type pin_functions clock_region')
+GridInfo = namedtuple('GridInfo',
+                      'bits sites tile_type pin_functions clock_region')
 BitAlias = namedtuple('BitAlias', 'tile_type start_offset sites')
 Bits = namedtuple('Bits', 'base_address frames offset words alias')
 BitsInfo = namedtuple('BitsInfo', 'block_type tile bits')
diff --git a/utils/lib.py b/utils/lib.py
index 8922e4e..94ada84 100644
--- a/utils/lib.py
+++ b/utils/lib.py
@@ -53,8 +53,8 @@
                 if set((wire, )) != raw_node_set:
                     error_nodes.append((node, tuple(raw_node_set), (wire, )))
             elif wire_nodes[wire] != raw_node_set:
-                error_nodes.append(
-                    (node, tuple(raw_node_set), tuple(wire_nodes[wire])))
+                error_nodes.append((node, tuple(raw_node_set),
+                                    tuple(wire_nodes[wire])))
 
 
 def check_errors(flat_error_nodes, ignored_wires):
diff --git a/utils/mergedb.py b/utils/mergedb.py
index 83544c2..6962599 100755
--- a/utils/mergedb.py
+++ b/utils/mergedb.py
@@ -62,8 +62,7 @@
     parser.add_argument('ins', nargs='+', help='Last takes precedence')
     args = parser.parse_args()
 
-    run(
-        args.ins,
+    run(args.ins,
         args.out,
         strict=int(os.getenv("MERGEDB_STRICT", "1")),
         track_origin=args.track_origin,
diff --git a/utils/segmaker.py b/utils/segmaker.py
index 67f4267..99b62ea 100644
--- a/utils/segmaker.py
+++ b/utils/segmaker.py
@@ -72,7 +72,12 @@
 
 
 class Segmaker:
-    def __init__(self, bitsfile, verbose=False, db_root=None, part=None, bits_per_word=32):
+    def __init__(self,
+                 bitsfile,
+                 verbose=False,
+                 db_root=None,
+                 part=None,
+                 bits_per_word=32):
         self.db_root = db_root
         if self.db_root is None:
             self.db_root = util.get_db_root()
@@ -148,19 +153,21 @@
                 line = line.split("_")
                 bit_frame = int(line[1], 16)
                 # Word indexes in the .bits file for US+/US assume 32-bits per word
-                bit_wordidx = int(line[2], 10) * (32 / self.bits_per_word) + int(line[3], 10) // self.bits_per_word
+                bit_wordidx = int(line[2],
+                                  10) * (32 / self.bits_per_word) + int(
+                                      line[3], 10) // self.bits_per_word
                 bit_bitidx = int(line[3], 10) % self.bits_per_word
                 # Bit ranges in the Frame Address Register Description differs between US+ and US devices
                 # For US the ranges are identical to 7-series, but US+ is shifted 1 bit left
                 # Refer to UG570 Table 9-21
-                base_frame = bit_frame & (~0xff if os.getenv("URAY_ARCH") in "UltraScalePlus" else ~0x7f)
+                base_frame = bit_frame & (~0xff if os.getenv("URAY_ARCH") in
+                                          "UltraScalePlus" else ~0x7f)
                 self.bits.setdefault(base_frame, dict()).setdefault(
-                    bit_wordidx, set()).add(
-                        (bit_frame, bit_wordidx, bit_bitidx))
+                    bit_wordidx, set()).add((bit_frame, bit_wordidx,
+                                             bit_bitidx))
         if self.verbose:
-            print(
-                'Loaded bits: %u bits in %u base frames' %
-                (recurse_sum(self.bits), len(self.bits)))
+            print('Loaded bits: %u bits in %u base frames' % (recurse_sum(
+                self.bits), len(self.bits)))
 
     def add_site_tag(self, site, name, value):
         '''
@@ -322,9 +329,8 @@
                     'ILOGIC': name_y0y1,
                     'OLOGIC': name_y0y1,
                 }.get(site_prefix, name_default)()
-                self.verbose and print(
-                    'site %s w/ %s prefix => tag %s' %
-                    (site, site_prefix, sitekey))
+                self.verbose and print('site %s w/ %s prefix => tag %s' %
+                                       (site, site_prefix, sitekey))
 
                 for name, value in self.site_tags[site].items():
                     self.verbose and print("Site %s: check tags" % site)
@@ -350,8 +356,8 @@
             -LIOI3 => IOI3
             '''
             tile_type_norm = re.sub("(_TOP|_BOT|LL|LM)?_[LR]$", "", tile_type)
-            tile_type_norm = re.sub(
-                "_TOP_[LR]_UPPER", "_UPPER", tile_type_norm)
+            tile_type_norm = re.sub("_TOP_[LR]_UPPER", "_UPPER",
+                                    tile_type_norm)
 
             if tile_type_norm in ['LIOB33', 'RIOB33']:
                 tile_type_norm = 'IOB33'
@@ -414,9 +420,9 @@
         assert self.segments_by_type, 'No data to write'
 
         if not allow_empty:
-            assert sum(
-                [len(segments) for segments in self.segments_by_type.values()
-                 ]) != 0, "Didn't  generate any segments"
+            assert sum([
+                len(segments) for segments in self.segments_by_type.values()
+            ]) != 0, "Didn't  generate any segments"
 
         for segtype in self.segments_by_type.keys():
             if suffix is not None:
diff --git a/utils/tile.py b/utils/tile.py
index 9b8e57f..3bf88cc 100644
--- a/utils/tile.py
+++ b/utils/tile.py
@@ -4,8 +4,8 @@
 from utils import lib
 from utils.timing import fast_slow_tuple_to_corners, RcElement
 
-TileDbs = namedtuple(
-    'TileDbs', 'segbits block_ram_segbits ppips mask tile_type')
+TileDbs = namedtuple('TileDbs',
+                     'segbits block_ram_segbits ppips mask tile_type')
 
 
 class OutPinTiming(namedtuple('OutPinTiming', 'delays drive_resistance')):
@@ -36,8 +36,9 @@
     pass
 
 
-class PipTiming(namedtuple('PipTiming',
-                           'delays drive_resistance internal_capacitance')):
+class PipTiming(
+        namedtuple('PipTiming',
+                   'delays drive_resistance internal_capacitance')):
     """ Timing for pips.
 
     Attributes
@@ -53,10 +54,11 @@
     pass
 
 
-class Pip(namedtuple(
-        'Pip',
-    ('name', 'net_to', 'net_from', 'can_invert', 'is_directional', 'is_pseudo',
-     'is_pass_transistor', 'timing', 'backward_timing'))):
+class Pip(
+        namedtuple(
+            'Pip',
+            ('name', 'net_to', 'net_from', 'can_invert', 'is_directional',
+             'is_pseudo', 'is_pass_transistor', 'timing', 'backward_timing'))):
     """ Pip information.
 
     Attributes
diff --git a/utils/tile_segbits.py b/utils/tile_segbits.py
index 39e6c0f..2c6e6f3 100644
--- a/utils/tile_segbits.py
+++ b/utils/tile_segbits.py
@@ -113,8 +113,8 @@
             match = True
             skip = False
             for query_bit in segbit:
-                if match_filter is not None and not match_filter(block_type,
-                                                                 query_bit):
+                if match_filter is not None and not match_filter(
+                        block_type, query_bit):
                     skip = True
                     break
 
@@ -167,5 +167,5 @@
 
         block_type, feature = self.feature_addresses[feature][address]
         for bit in self.segbits[block_type][feature]:
-            yield block_type, self.map_bit_to_frame(
-                block_type, bits_map[block_type], bit)
+            yield block_type, self.map_bit_to_frame(block_type,
+                                                    bits_map[block_type], bit)
diff --git a/utils/timing.py b/utils/timing.py
index 782d0e3..9fd9314 100644
--- a/utils/timing.py
+++ b/utils/timing.py
@@ -173,17 +173,18 @@
 
     fast_min, fast_max, slow_min, slow_max = map(float, arr)
 
-    return hashabledict(
-        {
-            PvtCorner.FAST: IntristicDelay(
-                min=fast_min,
-                max=fast_max,
-            ),
-            PvtCorner.SLOW: IntristicDelay(
-                min=slow_min,
-                max=slow_max,
-            ),
-        })
+    return hashabledict({
+        PvtCorner.FAST:
+        IntristicDelay(
+            min=fast_min,
+            max=fast_max,
+        ),
+        PvtCorner.SLOW:
+        IntristicDelay(
+            min=slow_min,
+            max=slow_max,
+        ),
+    })
 
 
 class TimingNode(object):
@@ -498,8 +499,8 @@
 
         assert self.sink_wire is not None
         self.sink_wire.propigate_delays(self.propigated_delays + [self], math)
-        self.rc_delay = math.multiply(
-            self.downstream_cap, self.drive_resistance)
+        self.rc_delay = math.multiply(self.downstream_cap,
+                                      self.drive_resistance)
 
     def get_intrinsic_delays(self):
         return self.delays
@@ -561,8 +562,8 @@
 
         assert self.sink_wire is not None
         self.sink_wire.propigate_delays(self.propigated_delays + [self], math)
-        self.rc_delay = math.multiply(
-            self.downstream_cap, self.drive_resistance)
+        self.rc_delay = math.multiply(self.downstream_cap,
+                                      self.drive_resistance)
 
     def get_intrinsic_delays(self):
         return self.delays
diff --git a/utils/util.py b/utils/util.py
index 50d4086..89e74e0 100644
--- a/utils/util.py
+++ b/utils/util.py
@@ -5,10 +5,12 @@
 from utils.roi import Roi
 from jinja2 import Environment, FileSystemLoader
 
-def get_jinja_template(tpl_file, directory = "./"):
+
+def get_jinja_template(tpl_file, directory="./"):
     env = Environment(loader=FileSystemLoader(searchpath=directory))
     return env.get_template(tpl_file)
 
+
 def render_template(tpl_path, variables=dict()):
     '''
     Render text for jinja template.
@@ -25,14 +27,15 @@
     template = get_jinja_template(file_name, directory if directory else "./")
     return template.render(variables)
 
+
 def get_db_root():
     # Used during tilegrid db bootstrap
     ret = os.getenv("URAY_DATABASE_ROOT", None)
     if ret:
         return ret
 
-    return "%s/%s" % (
-        os.getenv("URAY_DATABASE_DIR"), os.getenv("URAY_DATABASE"))
+    return "%s/%s" % (os.getenv("URAY_DATABASE_DIR"),
+                      os.getenv("URAY_DATABASE"))
 
 
 def get_part():
@@ -89,9 +92,8 @@
     '''Return (X1, X2), (Y1, Y2) from URAY_ROI, exclusive end (for xrange)'''
     # SLICE_X12Y100:SLICE_X27Y149
     # Note URAY_ROI_GRID_* is something else
-    m = re.match(
-        r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)',
-        os.getenv('URAY_ROI'))
+    m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)',
+                 os.getenv('URAY_ROI'))
     ms = [int(m.group(i + 1)) for i in range(4)]
     return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
 
diff --git a/utils/verilog.py b/utils/verilog.py
index de3895e..262237a 100644
--- a/utils/verilog.py
+++ b/utils/verilog.py
@@ -4,8 +4,7 @@
 
 
 def top_harness(DIN_N, DOUT_N, f=sys.stdout):
-    f.write(
-        '''
+    f.write('''
 module top(input clk, stb, di, output do);
     localparam integer DIN_N = %d;
     localparam integer DOUT_N = %d;
diff --git a/utils/xyaml.py b/utils/xyaml.py
index 08e9e35..6ec9f8b 100755
--- a/utils/xyaml.py
+++ b/utils/xyaml.py
@@ -26,8 +26,7 @@
 
 class XYamlTest(unittest.TestCase):
     def test(self):
-        s = io.StringIO(
-            """\
+        s = io.StringIO("""\
 !<xilinx/xc7series/part>
 idcode: 0x362d093
 global_clock_regions:
