diff --git a/f4pga/utils/pcf.py b/f4pga/utils/pcf.py
index 6c779d9..8490973 100644
--- a/f4pga/utils/pcf.py
+++ b/f4pga/utils/pcf.py
@@ -47,7 +47,6 @@
         assert len(args) == 3, args
 
         if args[0] == "set_io":
-
             yield PcfIoConstraint(
                 net=args[1],
                 pad=args[2],
@@ -56,7 +55,6 @@
             )
 
         if args[0] == "set_clk":
-
             yield PcfClkConstraint(
                 pin=args[1],
                 net=args[2],
diff --git a/f4pga/utils/quicklogic/convert_compile_opts.py b/f4pga/utils/quicklogic/convert_compile_opts.py
index 1b27d83..b26a1ab 100644
--- a/f4pga/utils/quicklogic/convert_compile_opts.py
+++ b/f4pga/utils/quicklogic/convert_compile_opts.py
@@ -43,7 +43,6 @@
     # join all remaining ones into a single string
     opt_string = ""
     for line in lines:
-
         # Remove comments
         pos = line.find("#")
         if pos != -1:
@@ -60,7 +59,6 @@
 
     # Remove all C/C++ style "/* ... */" comments
     while True:
-
         # Find beginning of a block comment. Finish if none is found
         p0 = opt_string.find("/*")
         if p0 == -1:
@@ -82,7 +80,6 @@
     # Scan and process options
     parts = iter(shlex.split(opt_string))
     while True:
-
         # Get the option
         try:
             opt = next(parts)
@@ -210,7 +207,6 @@
 # =============================================================================
 
 if __name__ == "__main__":
-
     # Read lines from stdin, parse options
     lines = sys.stdin.readlines()
     opts = parse_options(lines)
diff --git a/f4pga/utils/quicklogic/pp3/arch_import.py b/f4pga/utils/quicklogic/pp3/arch_import.py
index e438e1a..a168789 100755
--- a/f4pga/utils/quicklogic/pp3/arch_import.py
+++ b/f4pga/utils/quicklogic/pp3/arch_import.py
@@ -190,7 +190,6 @@
 
     # Add tiles
     for tile_type, sub_tiles in arch_tile_types.items():
-
         xml = make_top_level_tile(tile_type, sub_tiles, tile_types, equivalent_sites)
 
         xml_tiles.append(xml)
@@ -208,7 +207,6 @@
 
     # Add pb_types
     for pb_type in arch_pb_types:
-
         xml = make_top_level_pb_type(tile_types[pb_type], nsmap)
         xml_cplx.append(xml)
 
@@ -275,7 +273,6 @@
 
     # Individual tiles
     for flat_loc, tile in arch_tile_grid.items():
-
         if tile is None:
             continue
 
@@ -342,7 +339,6 @@
     # Populate connections
     conns = [c for c in connections if is_direct(c)]
     for connection in conns:
-
         src_tile = get_tile(connection.src)
         dst_tile = get_tile(connection.dst)
 
@@ -388,7 +384,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
@@ -417,7 +412,6 @@
     # Flatten the VPR tilegrid
     flat_tile_grid = dict()
     for vpr_loc, tile in vpr_tile_grid.items():
-
         flat_loc = (vpr_loc.x, vpr_loc.y)
         if flat_loc not in flat_tile_grid:
             flat_tile_grid[flat_loc] = {}
@@ -432,9 +426,7 @@
     arch_models = set()
 
     for flat_loc, tiles in flat_tile_grid.items():
-
         if len(tiles):
-
             # Group identical sub-tiles together, maintain their order
             sub_tiles = OrderedDict()
             for z, tile in tiles.items():
@@ -464,7 +456,6 @@
             )
 
         else:
-
             # Add an empty location
             arch_tile_grid[flat_loc] = None
 
diff --git a/f4pga/utils/quicklogic/pp3/connections.py b/f4pga/utils/quicklogic/pp3/connections.py
index f390bc8..579354a 100644
--- a/f4pga/utils/quicklogic/pp3/connections.py
+++ b/f4pga/utils/quicklogic/pp3/connections.py
@@ -196,7 +196,6 @@
 
             # A foreign connection
             elif sbox_pin.type == SwitchboxPinType.FOREIGN:
-
                 # Get the hop offset
                 pin_name, hop = get_name_and_hop(sbox_pin.name)
                 assert hop is not None, sbox_pin
@@ -213,7 +212,6 @@
             # Find the pin in the tile
             for pin in tile.pins:
                 if pin.direction == OPPOSITE_DIRECTION[sbox_pin.direction]:
-
                     # Check if the pin name refers to the full tile pin name
                     # ie. with the cell name.
                     if pin.name == pin_name:
@@ -283,7 +281,6 @@
         # should go into a HOP input.
         dst_pins = [pin for pin in dst_switchbox.inputs.values() if pin.type == SwitchboxPinType.HOP]
         for dst_pin in dst_pins:
-
             # Parse the name, determine hop offset. Skip non-hop wires.
             hop_name, hop_ofs = get_name_and_hop(dst_pin.name)
             if hop_ofs is None:
@@ -346,7 +343,6 @@
 
 
 def find_clock_cell(alias, tile_grid):
-
     for loc, tile in tile_grid.items():
         if tile is None:
             continue
@@ -364,7 +360,6 @@
 
 
 def build_gmux_qmux_connections(tile_types, tile_grid, switchbox_types, switchbox_grid, clock_cells):
-
     # Define names of all global clock wires.
     # Each global clock mux as an implicitly defined output equal to its name.
     clock_wires = list(clock_cells.keys())
@@ -377,9 +372,7 @@
     # Conections between clock cells (muxes)
     connections = []
     for clock_cell in clock_cells.values():
-
         for pin_name, pin_conn in clock_cell.pin_map.items():
-
             # Destination pin name. Treat CAND and QMUX destinations
             # differently as there are going to be no tiles for them.
             if clock_cell.type in ["CAND", "QMUX"]:
@@ -395,14 +388,12 @@
 
             # This pin connects to a global clock wire
             if pin_conn in clock_wires:
-
                 # Get the other cell
                 other_cell = clock_cells.get(pin_conn, None)
 
                 # Not found in the clock cells. Probably it is the CLOCK cell
                 # try finding it by its name / alias
                 if other_cell is None:
-
                     src_loc, src_tile, src_cell = find_clock_cell(pin_conn, tile_grid)
 
                     # Didint find the cell
diff --git a/f4pga/utils/quicklogic/pp3/create_default_fasm.py b/f4pga/utils/quicklogic/pp3/create_default_fasm.py
index af563e6..2b9844e 100755
--- a/f4pga/utils/quicklogic/pp3/create_default_fasm.py
+++ b/f4pga/utils/quicklogic/pp3/create_default_fasm.py
@@ -80,7 +80,6 @@
 
         # Create all mux nodes
         for stage, switch, mux in yield_muxes(self.switchbox):
-
             # Create the node
             key = (stage.id, switch.id, mux.id)
             node = self.Node(self.NodeType.MUX, key)
@@ -95,7 +94,6 @@
         # Create all source and sink nodes, populate their connections with mux
         # nodes.
         for pin in self.switchbox.pins:
-
             # Node type
             if pin.direction == PinDirection.INPUT:
                 node_type = self.NodeType.SOURCE
@@ -107,7 +105,6 @@
             # Create one for each stage type
             stage_ids = set([loc.stage_id for loc in pin.locs])
             for stage_id in stage_ids:
-
                 # Create the node
                 key = pin.name
                 node = self.Node(node_type, key)
@@ -127,14 +124,12 @@
 
             # Populate connections
             for pin_loc in pin.locs:
-
                 # Get the correct node list
                 stage_type = self.switchbox.stages[pin_loc.stage_id].type
                 assert stage_type in self.nodes, stage_type
                 nodes = self.nodes[stage_type]
 
                 if pin.direction == PinDirection.INPUT:
-
                     # Get the mux node
                     key = (pin_loc.stage_id, pin_loc.switch_id, pin_loc.mux_id)
                     assert key in nodes, key
@@ -164,7 +159,6 @@
                     node.out.add(key)
 
                 elif pin.direction == PinDirection.OUTPUT:
-
                     # Get the sink node
                     key = pin.name
                     assert key in nodes, key
@@ -189,7 +183,6 @@
 
         # Populate mux to mux connections
         for conn in self.switchbox.connections:
-
             # Get the correct node list
             stage_type = self.switchbox.stages[conn.dst.stage_id].type
             assert stage_type in self.nodes, stage_type
@@ -242,7 +235,6 @@
         nodes = self.nodes[stage_type]
 
         def walk(node):
-
             # Examine all driven nodes
             for sink_key in node.out:
                 assert sink_key in nodes, sink_key
@@ -250,7 +242,6 @@
 
                 # The sink is free
                 if sink_node.net is None:
-
                     # Assign it to the net
                     sink_node.net = node.net
                     if sink_node.type == self.NodeType.MUX:
@@ -285,7 +276,6 @@
 
         for stage_type, nodes in self.nodes.items():
             for key, node in nodes.items():
-
                 if node.type == self.NodeType.MUX and node.sel is None:
                     result = False
                     print("WARNING: mux unconfigured", key)
@@ -301,7 +291,6 @@
 
         for stage_type, nodes in self.nodes.items():
             for key, node in nodes.items():
-
                 # For muxes with active selection
                 if node.type == self.NodeType.MUX and node.sel is not None:
                     stage_id, switch_id, mux_id = key
@@ -343,7 +332,6 @@
 
         nets = sorted(list(nets))
         for i, net in enumerate(nets):
-
             hue = i / len(nets)
             light = 0.33
             saturation = 1.0
@@ -368,14 +356,12 @@
 
         # Stage types
         for stage_type, nodes in self.nodes.items():
-
             # Stage header
             dot.append('  subgraph "cluster_{}" {{'.format(stage_type))
             dot.append("    label=\"Stage '{}'\";".format(stage_type))
 
             # Nodes and internal mux edges
             for key, node in nodes.items():
-
                 # Source node
                 if node.type == self.NodeType.SOURCE:
                     name = "{}_inp_{}".format(stage_type, key2str(key))
@@ -470,7 +456,6 @@
 
             # Mux to mux connections
             for key, node in nodes.items():
-
                 # Source node
                 if node.type == self.NodeType.SOURCE:
                     pass
@@ -536,7 +521,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
@@ -653,7 +637,6 @@
 
     # Power on all LOGIC cells
     for loc, tile in tile_grid.items():
-
         # Get the tile type object
         tile_type = tile_types[tile.type]
 
diff --git a/f4pga/utils/quicklogic/pp3/create_ioplace.py b/f4pga/utils/quicklogic/pp3/create_ioplace.py
index beab080..1bf6625 100755
--- a/f4pga/utils/quicklogic/pp3/create_ioplace.py
+++ b/f4pga/utils/quicklogic/pp3/create_ioplace.py
@@ -67,7 +67,6 @@
     pad_alias_map = defaultdict(lambda: dict())
 
     for pin_map_entry in csv.DictReader(args.map):
-
         if pin_map_entry["type"] not in IOB_TYPES:
             continue
 
@@ -88,7 +87,6 @@
     used_pads = set()
 
     for pcf_constraint in parse_simple_pcf(args.pcf):
-
         # Skip non-io constraints
         if type(pcf_constraint).__name__ != "PcfIoConstraint":
             continue
diff --git a/f4pga/utils/quicklogic/pp3/create_place_constraints.py b/f4pga/utils/quicklogic/pp3/create_place_constraints.py
index 72189b9..03fe6c0 100755
--- a/f4pga/utils/quicklogic/pp3/create_place_constraints.py
+++ b/f4pga/utils/quicklogic/pp3/create_place_constraints.py
@@ -95,7 +95,6 @@
     io_constraints = {}
 
     for line in args.input:
-
         # Strip, skip comments
         line = line.strip()
         if line.startswith("#"):
@@ -119,7 +118,6 @@
     BUF_CELL = {"type": "GMUX_IP", "ipin": "IP", "opin": "IZ"}
 
     for inp_net in eblif_data["inputs"]["args"]:
-
         # This one is not constrained, skip it
         if inp_net not in io_constraints:
             continue
@@ -159,7 +157,6 @@
 
     # Emit constraints for GCLK cells
     for inp_net, iob_cell, con_net, buf_cell, clk_net in clock_connections:
-
         src_loc = io_constraints[inp_net]
         if src_loc not in clock_to_gmux:
             eprint("ERROR: No GMUX location for input CLOCK pad for net '{}' at {}".format(inp_net, src_loc))
diff --git a/f4pga/utils/quicklogic/pp3/data_import.py b/f4pga/utils/quicklogic/pp3/data_import.py
index cdbcc97..6b7693b 100755
--- a/f4pga/utils/quicklogic/pp3/data_import.py
+++ b/f4pga/utils/quicklogic/pp3/data_import.py
@@ -101,7 +101,6 @@
     cells = []
 
     for xml_node in xml_library:
-
         # Skip those
         if xml_node.tag in ["PortProperties"]:
             continue
@@ -111,7 +110,6 @@
 
         # Load pins
         for xml_pins in itertools.chain(xml_node.findall("INPUT"), xml_node.findall("OUTPUT")):
-
             # Pin direction
             if xml_pins.tag == "INPUT":
                 direction = PinDirection.INPUT
@@ -179,7 +177,6 @@
 
 
 def load_logic_cells(xml_placement, cellgrid, cells_library):
-
     # Load "LOGIC" tiles
     xml_logic = xml_placement.find("LOGIC")
     assert xml_logic is not None
@@ -218,10 +215,8 @@
 
 
 def load_other_cells(xml_placement, cellgrid, cells_library):
-
     # Loop over XML entries
     for xml in xml_placement:
-
         # Got a "Cell" tag
         if xml.tag == "Cell":
             cell_name = xml.get("name")
@@ -296,7 +291,6 @@
 
 
 def parse_placement(xml_placement, cells_library):
-
     # Load tilegrid quadrants
     quadrants = {}
 
@@ -342,14 +336,12 @@
     tile_types = {}
     tile_types_at_loc = {}
     for loc, cells in cellgrid.items():
-
         # Generate type and assign
         type = make_tile_type_name(cells)
         tile_types_at_loc[loc] = type
 
         # A new type? complete its definition
         if type not in tile_types:
-
             cell_types = [c.type for c in cells]
             cell_count = {t: len([c for c in cells if c.type == t]) for t in cell_types}
 
@@ -360,11 +352,9 @@
     # Make the final tilegrid
     tilegrid = {}
     for loc, type in tile_types_at_loc.items():
-
         # Group cells by type
         tile_cells_by_type = defaultdict(lambda: [])
         for cell in cellgrid[loc]:
-
             tile_cells_by_type[cell.type].append(cell)
 
         # Create a list of cell instances within the tile
@@ -413,10 +403,8 @@
     for stage_id, stage in switchbox.stages.items():
         for switch_id, switch in stage.switches.items():
             for mux_id, mux in switch.muxes.items():
-
                 # Add the mux output pin as top level output if necessary
                 if mux.output.name is not None:
-
                     loc = SwitchboxPinLoc(
                         stage_id=stage.id,
                         switch_id=switch.id,
@@ -444,7 +432,6 @@
                 # Add the mux input pins as top level inputs if necessary
                 for pin in mux.inputs.values():
                     if pin.name is not None:
-
                         loc = SwitchboxPinLoc(
                             stage_id=stage.id,
                             switch_id=switch.id,
@@ -458,7 +445,6 @@
     # Add top-level input pins to the switchbox.
     keys = sorted(input_locs.keys(), key=lambda k: k[0])
     for name, locs in {k: input_locs[k] for k in keys}.items():
-
         # Determine the pin type
         is_hop = is_regular_hop_wire(name)
         _, hop = get_name_and_hop(name)
@@ -498,7 +484,6 @@
 
     # Load stages
     for xml_stage in stages:
-
         # Get stage id
         stage_id = int(xml_stage.attrib["StageNumber"])
         assert stage_id not in switchbox.stages, (stage_id, switchbox.stages.keys())
@@ -609,7 +594,6 @@
         # Rows
         xml_rows = [e for e in xml_root if e.tag.startswith("Row_")]
         for xml_row in xml_rows:
-
             # Decode row range
             match = RE_LOC.match(xml_row.tag)
             assert match is not None, xml_row.tag
@@ -623,7 +607,6 @@
             # Columns
             xml_cols = [e for e in xml_row if e.tag.startswith("Col_")]
             for xml_col in xml_cols:
-
                 # Decode column range
                 match = RE_LOC.match(xml_col.tag)
                 assert match is not None, xml_col.tag
@@ -651,7 +634,6 @@
 
     for loc, xml_maps in yield_locs_and_maps():
         for xml_map in xml_maps:
-
             # Decode stage id
             match = RE_STAGE.match(xml_map.tag)
             assert match is not None, xml_map.tag
@@ -662,7 +644,6 @@
             # Decode wire joints
             joints = {k: v for k, v in xml_map.attrib.items() if k.startswith("Join.")}
             for joint_key, joint_map in joints.items():
-
                 # Decode the joint key
                 match = RE_JOINT.match(joint_key)
                 assert match is not None, joint_key
@@ -711,7 +692,6 @@
     # Sections are named "*_Table"
     xml_tables = [e for e in xml_root if e.tag.endswith("_Table")]
     for xml_table in xml_tables:
-
         # Get the origin
         origin = xml_table.tag.split("_")[0]
         assert origin in ["Left", "Right", "Top", "Bottom"], origin
@@ -735,7 +715,6 @@
 
         # Parse the port mapping table(s)
         for port_mapping_xml in xml_table.findall("PortMappingTable"):
-
             # Get the direction of the switchbox offset
             orientation = port_mapping_xml.attrib["Orientation"]
             if orientation == "Horizontal":
@@ -762,7 +741,6 @@
 
                 sbox_xmls = [e for e in index_xml if e.tag.startswith("SBox")]
                 for sbox_xml in sbox_xmls:
-
                     offset = int(sbox_xml.attrib["Offset"])
                     mapped_name = sbox_xml.get("MTB_PortName", None)
 
@@ -841,7 +819,6 @@
     # pin connection from the pinmap. This way the connections between
     # switchboxes which drive them can be used for generic routing.
     for cell_name in clock_cells.keys():
-
         cell = clock_cells[cell_name]
         pin_map = cell.pin_map
 
@@ -879,7 +856,6 @@
 
         # Add map entries
         for mux_pin_name, sbox_pin_name in clock_cell.pin_map.items():
-
             # Get the pin definition to get its driection.
             cell_pin = [p for p in cell_pins if p.name == mux_pin_name]
             assert len(cell_pin) == 1, (clock_cell, mux_pin_name)
@@ -905,7 +881,6 @@
     """
 
     for loc, port_map in port_maps.items():
-
         # No switchbox at that location
         if loc not in switchbox_grid:
             continue
@@ -927,7 +902,6 @@
         # Remap pin names
         did_remap = False
         for stage, switch, mux in yield_muxes(new_switchbox):
-
             # Remap output
             alt_name = "{}.{}.{}".format(stage.id, switch.id, mux.id)
 
@@ -973,7 +947,6 @@
     """
 
     for loc, wire_map in wire_maps.items():
-
         # No switchbox at that location
         if loc not in switchbox_grid:
             continue
@@ -995,7 +968,6 @@
         # Remap pin names
         did_remap = False
         for pin_loc, (wire_name, map_loc) in wire_map.items():
-
             # Get port map at the destination location of the wire that is
             # being remapped.
             assert map_loc in port_maps, (map_loc, wire_name)
@@ -1051,7 +1023,6 @@
     for loc, tile in tile_grid.items():
         for cell_type, cell_names in tile.cell_names.items():
             for (cell_name,) in cell_names:
-
                 # Skip LOGIC as it is always contained in a single tile
                 if cell_name == "LOGIC":
                     continue
@@ -1077,7 +1048,6 @@
 
     # Parse "PACKAGE" sections.
     for xml_package in xml_root.findall("PACKAGE"):
-
         # Initialize map
         pkg_name = xml_package.attrib["name"]
         pkg_pin_map = defaultdict(lambda: set())
@@ -1108,7 +1078,6 @@
 
             # Add the pin mapping
             for cell_name, cell_loc in zip(cell_names, cell_locs):
-
                 # Find the cell
                 if cell_loc not in tile_grid:
                     print("WARNING: No tile for package pin '{}' at '{}'".format(pin_name, cell_loc))
@@ -1181,7 +1150,6 @@
     switchbox_grid = {}
     switchbox_types = {}
     for xml_node in xml_routing:
-
         # Not a switchbox
         if not xml_node.tag.endswith("_SBOX"):
             continue
@@ -1190,7 +1158,6 @@
         xml_common = xml_node.find("COMMON_STAGES")
         for xml_sbox in xml_node:
             if xml_sbox != xml_common:
-
                 # Parse the switchbox definition
                 switchbox = parse_switchbox(xml_sbox, xml_common)
 
@@ -1264,7 +1231,6 @@
 
     # Read and parse CSV
     with open(csv_file, "r") as fp:
-
         # Read the first line, it should specify timing units
         line = fp.readline()
         line = line.strip().split(",")
@@ -1288,7 +1254,6 @@
         # Reformat
         switchbox_timings = {}
         for timing in data:
-
             # Switchbox type
             switchbox_type = timing["SBox_Type"]
             if switchbox_type not in switchbox_timings:
@@ -1334,7 +1299,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
diff --git a/f4pga/utils/quicklogic/pp3/eos-s3/iomux_config.py b/f4pga/utils/quicklogic/pp3/eos-s3/iomux_config.py
index 4ddc344..be5cf3b 100755
--- a/f4pga/utils/quicklogic/pp3/eos-s3/iomux_config.py
+++ b/f4pga/utils/quicklogic/pp3/eos-s3/iomux_config.py
@@ -178,7 +178,6 @@
 
     # Read the requested configurtion from a JSON file
     if args.json is not None:
-
         if args.pcf is not None or args.eblif is not None:
             print("Use either '--json' or '--pcf' + '--eblif' options!")
             exit(-1)
@@ -188,7 +187,6 @@
 
     # Generate the config according to the EBLIF netlist and PCF constraints.
     else:
-
         if args.json is not None or (args.eblif is None or args.pcf is None):
             print("Use either '--json' or '--pcf' + '--eblif' options!")
             exit(-1)
@@ -197,7 +195,6 @@
         pad_alias_map = {}
 
         for pin_map_entry in csv.DictReader(args.map):
-
             if pin_map_entry["type"] not in IOB_TYPES:
                 continue
 
@@ -225,7 +222,6 @@
         eblif_outputs = eblif["outputs"]["args"]
 
         for constraint in pcf:
-
             pad_name = constraint.pad
 
             if pad_name not in pad_map and pad_name not in pad_alias_map:
diff --git a/f4pga/utils/quicklogic/pp3/fasm2bels.py b/f4pga/utils/quicklogic/pp3/fasm2bels.py
index a1ba195..291c214 100644
--- a/f4pga/utils/quicklogic/pp3/fasm2bels.py
+++ b/f4pga/utils/quicklogic/pp3/fasm2bels.py
@@ -516,7 +516,6 @@
             c for c in self.connections if c.src.type == ConnectionType.TILE and c.dst.type == ConnectionType.TILE
         ]
         for connection in connections:
-
             # Only to a GMUX at the given location
             dst = connection.dst
             if dst.loc != loc or "GMUX" not in dst.pin:
@@ -567,7 +566,6 @@
 
         connections = [c for c in self.connections if c.dst.type == ConnectionType.CLOCK]
         for connection in connections:
-
             # Only to a QMUX at the given location
             dst = connection.dst
             if dst.loc != loc or "QMUX" not in dst.pin:
@@ -605,7 +603,6 @@
 
             # Make map entries
             for i in range(3):
-
                 # Calculate GMUX index for QCLKIN<i> input of the QMUX
                 idx = (gmux_idx + i) % 5
 
@@ -636,7 +633,6 @@
 
         connections = [c for c in self.connections if c.dst.type == ConnectionType.CLOCK]
         for connection in connections:
-
             # Only to a CAND at the given location
             # Note: Check also the row above. CAND cells are located in two
             # rows but with fasm features everything gets aligned to even rows
@@ -679,7 +675,6 @@
         gmux_map = dict()
         gmux_locs = [loc for loc, tile in self.vpr_tile_grid.items() if "GMUX" in tile.type]
         for loc in gmux_locs:
-
             # Group GMUX input pin connections by GMUX cell names
             gmux_connections = defaultdict(lambda: dict())
             for cell_pin, conn in self.designconnections[loc].items():
@@ -689,7 +684,6 @@
 
             # Examine each GMUX config
             for gmux, connections in gmux_connections.items():
-
                 # FIXME: Handle IS0 inversion (if any)
 
                 # The IS0 pin has to be routed
@@ -707,7 +701,6 @@
 
                 # IP selected
                 if sel == 0:
-
                     # Create a global clock wire for the CLOCK pad
                     match = re.match(r"GMUX(?P<idx>[0-9]+)", gmux)
                     assert match is not None, gmux
@@ -739,7 +732,6 @@
 
                 # IC selected
                 else:
-
                     # Check if the IC pin has an active driver. If not then
                     # discard the mux.
                     if connections.get("IC", (None, None))[1] in [None, "GND", "VCC"]:
@@ -776,7 +768,6 @@
         qmux_map = defaultdict(lambda: dict())
         qmux_locs = [loc for loc, tile in self.vpr_tile_grid.items() if "QMUX" in tile.type]
         for loc in qmux_locs:
-
             # Group QMUX input pin connections by QMUX cell names
             qmux_connections = defaultdict(lambda: dict())
             for cell_pin, conn in self.designconnections[loc].items():
@@ -786,7 +777,6 @@
 
             # Examine each QMUX config
             for qmux, connections in qmux_connections.items():
-
                 # FIXME: Handle IS0 and IS1 inversion (if any)
 
                 # Both IS0 and IS1 must be routed to something
@@ -814,7 +804,6 @@
 
                 # Input from the routing network selected, create a new wire
                 if sel == 3:
-
                     # Check if the HSCKIN input is connected to an active
                     # driver. If not then discard the QMUX
                     if connections.get("HSCKIN", (None, None))[1] in [None, "GND", "VCC"]:
@@ -832,7 +821,6 @@
 
                 # Input from a GMUX is selected, assign its wire here
                 else:
-
                     # The GMUX is not active. Discard the QMUX
                     gmux_loc, gmux_cell, gmux_pin = sel_map[sel]
                     if gmux_cell not in gmux_map:
@@ -867,7 +855,6 @@
         # Process CAND
         for loc, all_features in self.colclk_data.items():
             for cand, features in all_features.items():
-
                 hilojoint = False
                 enjoint = False
 
@@ -980,7 +967,6 @@
 
 
 if __name__ == "__main__":
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
diff --git a/f4pga/utils/quicklogic/pp3/prepare_vpr_database.py b/f4pga/utils/quicklogic/pp3/prepare_vpr_database.py
index ac812ae..ad0bcb0 100755
--- a/f4pga/utils/quicklogic/pp3/prepare_vpr_database.py
+++ b/f4pga/utils/quicklogic/pp3/prepare_vpr_database.py
@@ -108,7 +108,6 @@
     vpr_cells_library = {}
 
     for cell_type, cell in cells_library.items():
-
         # If the cell is a QMUX add the missing QCLKIN1 and QCLKIN2
         # input pins.
         if cell_type == "QMUX":
@@ -146,7 +145,6 @@
 
 
 def add_synthetic_cell_and_tile_types(tile_types, cells_library):
-
     # Add a synthetic tile types for the VCC and GND const sources.
     # Models of the VCC and GND cells are already there in the cells_library.
     for const in ["VCC", "GND"]:
@@ -238,7 +236,6 @@
 
     # Generate the VPR tile grid
     for phy_loc, tile in tile_grid.items():
-
         # Limit the grid range
         if not is_loc_within_limit(phy_loc, grid_limit):
             continue
@@ -249,11 +246,9 @@
         # new tile type.
         tile_type = tile_types[tile.type]
         if "QMUX" in tile_type.cells or "CAND" in tile_type.cells:
-
             # Store the stripped cells
             for cell in tile.cells:
                 if cell.type in ["QMUX", "CAND"]:
-
                     # Find it in the physical clock cell list
                     if cell.name not in clock_cells:
                         print("WARNING: Clock cell '{}' not on the clock cell list!".format(cell.name))
@@ -298,7 +293,6 @@
         # The tile contains a BIDIR or CLOCK cell. it is an IO tile
         tile_type = tile_types[tile.type]
         if "BIDIR" in tile_type.cells or "CLOCK" in tile_type.cells:
-
             # For the BIDIR cell create a synthetic tile
             if "BIDIR" in tile_type.cells:
                 assert tile_type.cells["BIDIR"] == 1
@@ -376,12 +370,10 @@
 
         # The tile contains SDIOMUX cell(s). This is an IO tile.
         if "SDIOMUX" in tile_type.cells:
-
             # Split the tile into individual SDIOMUX cells. Each one will be
             # inside a synthetic tile occupying different grid location.
             cells = [c for c in tile.cells if c.type == "SDIOMUX"]
             for i, cell in enumerate(cells):
-
                 # Create a synthetic tile that will hold just the SDIOMUX cell
                 new_type = make_tile_type([cell], cells_library, tile_types)
 
@@ -416,9 +408,7 @@
 
             # GMUX, split individual GMUX cells into sub-tiles
             elif cell_type == "GMUX":
-
                 for i, cell in enumerate(tile.cells):
-
                     # Create a tile type for a single GMUX cell
                     new_type = make_tile_type([cell], cells_library, tile_types)
                     # New location
@@ -443,7 +433,6 @@
     # but in fact there is only one ASSP cell for the whole FPGA which is
     # "distributed" along top and left edge of the grid.
     if "ASSP" in tile_types:
-
         # Verify that the location is empty
         assp_loc = Loc(x=1, y=1, z=0)
         assert is_loc_free(vpr_tile_grid, assp_loc), ("ASSP", assp_loc)
@@ -461,7 +450,6 @@
     # Insert synthetic VCC and GND source tiles.
     # FIXME: This assumes that the locations specified are empty!
     for const, loc in [("VCC", Loc(x=2, y=1, z=0)), ("GND", Loc(x=3, y=1, z=0))]:
-
         # Verify that the location is empty
         assert is_loc_free(vpr_tile_grid, loc), (const, loc)
 
@@ -496,7 +484,6 @@
     bwd_loc_map = loc_map.bwd
 
     def add_loc_map(phy_loc, vpr_loc):
-
         if phy_loc in fwd_loc_map:
             assert fwd_loc_map[phy_loc] == vpr_loc, (phy_loc, vpr_loc)
         else:
@@ -510,7 +497,6 @@
     # Remap locations
     vpr_switchbox_grid = {}
     for phy_loc, switchbox_type in phy_switchbox_grid.items():
-
         # Limit the grid range
         if not is_loc_within_limit(phy_loc, grid_limit):
             continue
@@ -541,7 +527,6 @@
     # Remap locations, create the VPR connection list
     vpr_connections = []
     for connection in phy_connections:
-
         # Reject connections that reach outsite the grid limit
         if not is_loc_within_limit(connection.src.loc, grid_limit):
             continue
@@ -563,7 +548,6 @@
             # If the connection mentions a GMUX cell, remap its Z location so
             # it points to the correct sub-tile
             if "GMUX" in ep.pin and ep.type == ConnectionType.TILE:
-
                 # Modify the cell name, use always "GMUX0"
                 cell, pin = ep.pin.split("_", maxsplit=1)
                 vpr_pin = "GMUX0_{}".format(pin)
@@ -581,10 +565,8 @@
     # Remap locations of connections that go to CLOCK pads. A physical
     # BIDIR+CLOCK tile is split into separate BIDIR and CLOCK tiles.
     for i, connection in enumerate(vpr_connections):
-
         eps = [connection.src, connection.dst]
         for j, ep in enumerate(eps):
-
             # This endpoint is not relevant to a CLOCK cell
             if not ep.pin.startswith("CLOCK"):
                 continue
@@ -619,10 +601,8 @@
     }
 
     for i, connection in enumerate(vpr_connections):
-
         eps = [connection.src, connection.dst]
         for j, ep in enumerate(eps):
-
             # Must have "ASSP" and "FBIO_" in name and refer to a tile.
             if "ASSP" not in ep.pin:
                 continue
@@ -666,11 +646,9 @@
 
     # Map connections going to/from them to their locations in the VPR grid
     for i, connection in enumerate(vpr_connections):
-
         # Process connection endpoints
         eps = [connection.src, connection.dst]
         for j, ep in enumerate(eps):
-
             if ep.type != ConnectionType.TILE:
                 continue
 
@@ -707,7 +685,6 @@
         # Process connection endpoints
         eps = [connection.src, connection.dst]
         for j, ep in enumerate(eps):
-
             if ep.type != ConnectionType.TILE:
                 continue
 
@@ -744,7 +721,6 @@
     # "QCLKIN1=GMUX_2" etc.
     new_qmux_connections = []
     for connection in vpr_connections:
-
         # Get only those that target QCLKIN0 of a QMUX.
         if connection.dst.type != ConnectionType.CLOCK:
             continue
@@ -784,11 +760,9 @@
     # Handle QMUX connections. Instead of making them SWITCHBOX -> TILE convert
     # to SWITCHBOX -> CLOCK
     for i, connection in enumerate(vpr_connections):
-
         # Process connection endpoints
         eps = [connection.src, connection.dst]
         for j, ep in enumerate(eps):
-
             if ep.type != ConnectionType.TILE:
                 continue
 
@@ -839,7 +813,6 @@
 
     for pin_name, pins in package_pinmap.items():
         for pin in pins:
-
             # The loc is outside the grid limit, skip it.
             if not is_loc_within_limit(pin.loc, grid_limit):
                 continue
@@ -993,7 +966,6 @@
                 for timing, timing_data in instance_data.items():
                     paths = timing_data["delay_paths"]
                     for path_name, path_data in paths.items():
-
                         for k in path_data.keys():
                             if path_data[k] is not None:
                                 path_data[k] *= scale
@@ -1033,7 +1005,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
@@ -1144,7 +1115,6 @@
         print("Processing timing data...")
 
     if switchbox_timing is not None:
-
         # The timing data seems to be the same for each switchbox type and is
         # stored under the SB_LC name.
         timing_data = switchbox_timing["SB_LC"]
@@ -1163,7 +1133,6 @@
                 copy_switchbox_timing(switchbox, dst_switchbox)
 
     if cell_timings is not None:
-
         sw = add_vpr_switches_for_cell("QMUX", cell_timings)
         vpr_switches.update(sw)
 
@@ -1196,7 +1165,6 @@
         for y in range(ymax + 1):
             line = " {:>2}: ".format(y)
             for x in range(xmax + 1):
-
                 tiles = {loc: tile for loc, tile in vpr_tile_grid.items() if loc.x == x and loc.y == y}
                 count = len([t for t in tiles.values() if t is not None])
 
diff --git a/f4pga/utils/quicklogic/pp3/routing_import.py b/f4pga/utils/quicklogic/pp3/routing_import.py
index a6f1b94..058403a 100755
--- a/f4pga/utils/quicklogic/pp3/routing_import.py
+++ b/f4pga/utils/quicklogic/pp3/routing_import.py
@@ -97,20 +97,17 @@
 
 
 def get_vpr_switch_for_clock_cell(graph, cell, src, dst):
-
     # Get a switch to model the mux delay properly. First try using
     # the cell name
     try:
         switch_name = "{}.{}.{}.{}".format(cell.type, cell.name, src, dst)
         switch_id = graph.get_switch_id(switch_name)
     except KeyError:
-
         # Not found, try using the cell type
         try:
             switch_name = "{}.{}.{}.{}".format(cell.type, cell.type, src, dst)
             switch_id = graph.get_switch_id(switch_name)
         except KeyError:
-
             # Still not found, use the generic one
             switch_id = graph.get_switch_id("generic")
 
@@ -256,10 +253,8 @@
 
         # Collect features
         for pin, net in pins.items():
-
             # Get switchbox routing features (already prefixed)
             for muxsel in self.ctrl_routes[pin][net]:
-
                 stage_id, switch_id, mux_id, pin_id = muxsel
                 stage = self.switchbox_model.switchbox.stages[stage_id]
 
@@ -309,7 +304,6 @@
         self._build()
 
     def _build(self):
-
         # Get segment id
         segment_id = self.graph.get_segment_id_from_name("clock")
 
@@ -430,7 +424,6 @@
 
         # For each pin of the tile
         for pin in tile_types[tile.type].pins:
-
             node_id = get_node_id_for_tile_pin(graph, loc, tile.type, pin.name)
             if node_id is None:
                 print("WARNING: No node for pin '{}' at {}".format(pin.name, loc))
@@ -452,7 +445,6 @@
 
     # Adds entry to the map
     def add_to_map(conn_loc):
-
         tile = tile_grid.get(conn_loc.loc, None)
         if tile is None:
             print("WARNING: No tile for pin '{} at {}".format(conn_loc.pin, conn_loc.loc))
@@ -578,7 +570,6 @@
 
     # Add track chain
     for v in coords:
-
         # Add track (node)
         if direction == "X":
             track = tracks.Track(
@@ -665,7 +656,6 @@
     # For each column add one that spand over the entire grid height
     const_node_map = {}
     for x in range(xmin, xmax):
-
         # Add the column
         col_entry_node, _, col_node_map = add_track_chain(graph, "Y", x, ymin + 1, ymax - 1, segment_id, switch_id)
 
@@ -725,7 +715,6 @@
     bar = progressbar_utils.progressbar
     conns = [c for c in connections if is_hop(c)]
     for connection in bar(conns):
-
         # Get switchbox models
         src_switchbox_model = switchbox_models[connection.src.loc]
         dst_switchbox_model = switchbox_models[connection.dst.loc]
@@ -756,7 +745,6 @@
     bar = progressbar_utils.progressbar
     conns = [c for c in connections if is_tile(c)]
     for connection in bar(conns):
-
         # Connection to/from the local tile
         if is_local(connection):
             loc = connection.src.loc
@@ -798,7 +786,6 @@
 
         # Connection to/from a foreign tile
         else:
-
             # Get segment id and switch id
             segment_id = graph.get_segment_id_from_name("special")
             switch_id = graph.get_delayless_switch_id()
@@ -817,10 +804,8 @@
             # Connect the track
             eps = [connection.src, connection.dst]
             for i, ep in enumerate(eps):
-
                 # Endpoint at tile
                 if ep.type == ConnectionType.TILE:
-
                     # To tile
                     if ep == connection.dst:
                         if ep not in connection_loc_to_node:
@@ -841,7 +826,6 @@
 
                 # Endpoint at switchbox
                 elif ep.type == ConnectionType.SWITCHBOX:
-
                     # No switchbox model at the loc, skip.
                     if ep.loc not in switchbox_models:
                         continue
@@ -875,7 +859,6 @@
     bar = progressbar_utils.progressbar
     conns = [c for c in connections if is_direct(c)]
     for connection in bar(conns):
-
         # Get segment id and switch id
         if connection.src.pin.startswith("CLOCK"):
             switch_id = graph.get_delayless_switch_id()
@@ -913,10 +896,8 @@
 
     # Connect the global const network to switchbox inputs
     for loc, switchbox_model in bar(switchbox_models.items()):
-
         # Look for input connected to a const
         for pin in switchbox_model.switchbox.inputs.values():
-
             # Got a const input
             if pin.name in const_node_map:
                 const_node = const_node_map[pin.name][loc]
@@ -956,10 +937,8 @@
 
     bar = progressbar_utils.progressbar
     for loc, switchbox_model in bar(switchbox_models.items()):
-
         # Look for input connected to a CAND
         for pin in switchbox_model.switchbox.inputs.values():
-
             # Got a CAND input
             if pin.name in cand_node_map:
                 cand_node = cand_node_map[pin.name][loc]
@@ -994,7 +973,6 @@
     bar = progressbar_utils.progressbar
     conns = [c for c in connections if is_clock(c)]
     for connection in bar(conns):
-
         # Source is a tile
         if connection.src.type == ConnectionType.TILE:
             src_node = connection_loc_to_node.get(connection.src, None)
@@ -1093,7 +1071,6 @@
     cand_node_map = {}
 
     for cell in clock_cells.values():
-
         # A clock column is defined by a CAND cell
         if cell.type != "CAND":
             continue
@@ -1146,7 +1123,6 @@
 
     # Process edges
     for edge in edges:
-
         # Reformat metadata
         if edge.metadata:
             metadata = [(meta.name, meta.value) for meta in edge.metadata]
@@ -1172,7 +1148,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
diff --git a/f4pga/utils/quicklogic/pp3/rr_utils.py b/f4pga/utils/quicklogic/pp3/rr_utils.py
index aff2155..87d4ee9 100644
--- a/f4pga/utils/quicklogic/pp3/rr_utils.py
+++ b/f4pga/utils/quicklogic/pp3/rr_utils.py
@@ -76,7 +76,6 @@
     # in the opposite way.
     switch = graph.switch_map[switch_id]
     if switch.type in [rr.SwitchType.SHORT, rr.SwitchType.PASS_GATE]:
-
         graph.add_edge(dst_node_id, src_node_id, switch_id, meta_name, meta_value)
 
 
@@ -155,7 +154,6 @@
     chany_to_chany = src_node.type == rr.NodeType.CHANY and dst_node.type == rr.NodeType.CHANY
     chanx_to_chanx = src_node.type == rr.NodeType.CHANX and dst_node.type == rr.NodeType.CHANX
     if chany_to_chanx or chanx_to_chany:
-
         # Check loc
         node_joint_location(src_node, dst_node)
 
@@ -164,7 +162,6 @@
 
     # CHANX to CHANX or CHANY to CHANY
     elif chany_to_chany or chanx_to_chanx:
-
         loc = node_joint_location(src_node, dst_node)
         direction = "X" if src_node.type == rr.NodeType.CHANY else "Y"
 
@@ -178,13 +175,11 @@
 
     # OPIN to CHANX/CHANY
     elif src_node.type == rr.NodeType.OPIN and dst_node.type in [rr.NodeType.CHANX, rr.NodeType.CHANY]:
-
         # All OPINs go right (towards +X)
         assert src_node.loc.side == tracks.Direction.RIGHT, src_node
 
         # Connected to CHANX
         if dst_node.type == rr.NodeType.CHANX:
-
             loc = node_joint_location(src_node, dst_node)
 
             # Padding node
@@ -197,7 +192,6 @@
 
         # Connected to CHANY
         elif dst_node.type == rr.NodeType.CHANY:
-
             # Directly
             add_edge(graph, src_node.id, dst_node.id, switch_id, meta_name, meta_value)
 
@@ -207,13 +201,11 @@
 
     # CHANX/CHANY to IPIN
     elif dst_node.type == rr.NodeType.IPIN and src_node.type in [rr.NodeType.CHANX, rr.NodeType.CHANY]:
-
         # All IPINs go top (toward +Y)
         assert dst_node.loc.side == tracks.Direction.TOP, dst_node
 
         # Connected to CHANY
         if src_node.type == rr.NodeType.CHANY:
-
             loc = node_joint_location(src_node, dst_node)
 
             # Padding node
@@ -226,7 +218,6 @@
 
         # Connected to CHANX
         elif src_node.type == rr.NodeType.CHANX:
-
             # Directly
             add_edge(graph, src_node.id, dst_node.id, switch_id, meta_name, meta_value)
 
diff --git a/f4pga/utils/quicklogic/pp3/switchbox_model.py b/f4pga/utils/quicklogic/pp3/switchbox_model.py
index 970dc28..d0ba6b6 100644
--- a/f4pga/utils/quicklogic/pp3/switchbox_model.py
+++ b/f4pga/utils/quicklogic/pp3/switchbox_model.py
@@ -151,7 +151,6 @@
 
             # Expand all its inputs
             for pin_id, pin in mux.inputs.items():
-
                 # An input goes to another mux, expand it
                 if pin.name is None and pin_id in connections:
                     connection = connections[pin_id]
@@ -165,10 +164,8 @@
 
                 # This is a switchbox input
                 elif pin.name is not None:
-
                     # We've hit the target
                     if pin.name == target_name:
-
                         # Append the current mux and its selection
                         final_route = list(route)
                         final_route[-1] = tuple(list(final_route[-1]) + [pin_id])
@@ -268,7 +265,6 @@
 
             # Input nodes + mux edges
             for pin in mux.inputs.values():
-
                 key = (stage.id, switch.id, mux.id, pin.id)
                 assert key not in self.mux_input_to_node
 
@@ -347,7 +343,6 @@
 
         for pin in self.switchbox.inputs.values():
             for loc in pin.locs:
-
                 stage = self.switchbox.stages[loc.stage_id]
                 switch = stage.switches[loc.switch_id]
                 mux = switch.muxes[loc.mux_id]
@@ -365,7 +360,6 @@
         segment_id = self.graph.get_segment_id_from_name("sbox")
 
         for pin in self.switchbox.inputs.values():
-
             node = add_node(self.graph, self.loc, "Y", segment_id)
 
             assert pin.name not in self.input_to_node, pin.name
@@ -373,7 +367,6 @@
 
         # Create driver nodes, connect everything
         for (pin_name, vpr_switch), locs in driver_map.items():
-
             # Create the driver node
             drv_node = add_node(self.graph, self.loc, "X", segment_id)
 
@@ -394,7 +387,6 @@
             # Now connect the driver node with its loads
             switch_id = self.graph.get_switch_id("short")
             for loc in locs:
-
                 key = (loc.stage_id, loc.switch_id, loc.mux_id, loc.pin_id)
                 dst_node = self.mux_input_to_node[key]
 
@@ -411,7 +403,6 @@
         # to the rr graph. For now if there is any fixed mux, remove the
         # whole switchbox.
         if len(self.fixed_muxsels):
-
             # A list of muxes to avoid
             self.fixed_muxes = set([f[:3] for f in self.fixed_muxsels])
 
@@ -476,7 +467,6 @@
         )
 
         for cell in self.qmux_cells.values():
-
             # Get IS0 and IS1 connection endpoints
             eps = {}
             for connection in self.connections:
@@ -489,7 +479,6 @@
             # Find all routes for IS0 and IS1 pins that go to GND and VCC
             routes = {}
             for pin in PINS:
-
                 # Find the routes
                 vcc_routes = self.get_switchbox_routes(self.switchbox, eps[pin].pin, "VCC")
                 gnd_routes = self.get_switchbox_routes(self.switchbox, eps[pin].pin, "GND")
@@ -512,10 +501,8 @@
         for cell_name, cell_routes in self.ctrl_routes.items():
             for pin, pin_routes in cell_routes.items():
                 for net, net_routes in pin_routes.items():
-
                     routes = []
                     for route in net_routes:
-
                         # Assume 3-stage switchbox
                         assert len(route) == 3, "FIXME: Assuming 3-stage switchbox!"
 
diff --git a/f4pga/utils/quicklogic/pp3/tile_import.py b/f4pga/utils/quicklogic/pp3/tile_import.py
index 3d6f8fa..f8df6c4 100644
--- a/f4pga/utils/quicklogic/pp3/tile_import.py
+++ b/f4pga/utils/quicklogic/pp3/tile_import.py
@@ -193,14 +193,12 @@
         # Equivalent sites
         xml_equiv = ET.SubElement(xml_sub_tile, "equivalent_sites")
         for site_type, site_pinmap in equivalent_sub_tiles.items():
-
             # Site tag
             pb_name = "PB-{}".format(site_type.upper())
             xml_site = ET.SubElement(xml_equiv, "site", {"pb_type": pb_name, "pin_mapping": "custom"})
 
             # Same type, map one-to-one
             if tile_type.upper() == site_type.upper() or site_pinmap is None:
-
                 all_pins = {**tile_pinlists["clock"], **tile_pinlists["input"], **tile_pinlists["output"]}
 
                 for pin, count in all_pins.items():
@@ -211,7 +209,6 @@
 
             # Explicit pinmap as a list of tuples (from, to)
             elif isinstance(site_pinmap, list):
-
                 for tl_pin, pb_pin in site_pinmap:
                     ET.SubElement(
                         xml_site,
diff --git a/f4pga/utils/quicklogic/pp3/timing.py b/f4pga/utils/quicklogic/pp3/timing.py
index e3fe5da..2fb6211 100644
--- a/f4pga/utils/quicklogic/pp3/timing.py
+++ b/f4pga/utils/quicklogic/pp3/timing.py
@@ -129,7 +129,6 @@
 
     for pin in switchbox.inputs.values():
         for loc in pin.locs:
-
             dst_key = (loc.stage_id, loc.switch_id, loc.mux_id, loc.pin_id)
             src_key = (loc.stage_id, pin.name)
 
@@ -138,11 +137,9 @@
     # Compute timing model for each driver
     driver_timing = {}
     for driver, sinks in sink_map.items():
-
         # Collect timing data for each sink edge
         edge_timings = {}
         for stage_id, switch_id, mux_id, pin_id in sinks:
-
             # Try getting timing data. If not found then probably we are
             # computing timing for VCC or GND input.
             try:
@@ -211,7 +208,6 @@
 
         # Compute error of the delay model
         for sink in sinks:
-
             # Compute for this sink
             error = {}
             for n, true_delay in edge_timings[sink].items():
@@ -254,7 +250,6 @@
 
     # Populate timing data to the switchbox
     for driver, timing in driver_timing.items():
-
         # Driver VPR switch
         driver_vpr_switch = create_vpr_switch(
             type="mux",
@@ -300,7 +295,6 @@
 
     # Mux timing
     for dst_stage, dst_switch, dst_mux in yield_muxes(dst_switchbox):
-
         src_stage = src_switchbox.stages[dst_stage.id]
         src_switch = src_stage.switches[dst_switch.id]
         src_mux = src_switch.muxes[dst_mux.id]
@@ -324,7 +318,6 @@
     vpr_switches = {}
     for celltype, cell_data in timings.items():
         for instance, inst_data in cell_data.items():
-
             # Add IOPATHs
             for timing, timing_data in inst_data.items():
                 if timing_data["type"].lower() != "iopath":
diff --git a/f4pga/utils/quicklogic/pp3/verilogmodule.py b/f4pga/utils/quicklogic/pp3/verilogmodule.py
index 8615a53..580e1b7 100644
--- a/f4pga/utils/quicklogic/pp3/verilogmodule.py
+++ b/f4pga/utils/quicklogic/pp3/verilogmodule.py
@@ -105,7 +105,6 @@
         }
 
     def group_vector_signals(self, signals, io=False):
-
         # IOs beside name, have also direction, convert them to format
         # we can process
         if io:
@@ -225,7 +224,6 @@
         str: Verilog entry
         """
         if typ == "BIDIR":
-
             # We do not emit the BIDIR cell for non inout IOs
             direction = self.get_io_config(parameters)
             if direction is None:
@@ -337,7 +335,6 @@
 
             # check every connection pin if it has
             for pin in cellpins:
-
                 # Cell name and pin name match
                 if cell_name in cell_input_names:
                     if pin in cell_input_names[cell_name]:
@@ -492,7 +489,6 @@
                     loc,
                     wire,
                 ) in connections.items():
-
                     # That wire is connected to something. Skip processing
                     # of the cell here
                     if loc is not None:
@@ -561,10 +557,8 @@
         # Prune BELs that do not drive anythin (have all outputs disconnected)
         for loc, elements in list(self.elements.items()):
             for type, element in list(elements.items()):
-
                 # Handle IO cells
                 if element.type in ["CLOCK", "BIDIR", "SDIOMUX"]:
-
                     if element.type == "CLOCK":
                         direction = "input"
                     else:
@@ -576,7 +570,6 @@
 
                 # Handle non-io cells
                 else:
-
                     # Get connected pin names and output pin names
                     connected_pins = set(element.ios.keys())
                     output_pins = set(
@@ -596,7 +589,6 @@
                 del self.elements[loc]
 
     def get_io_name(self, loc):
-
         # default pin name
         name = loc2str(loc) + "_inout"
         # check if we have the original name for this io
@@ -650,7 +642,6 @@
         for eloc, locelements in self.elements.items():
             for element in locelements.values():
                 if element.type in ["CLOCK", "BIDIR", "SDIOMUX"]:
-
                     if element.type == "CLOCK":
                         direction = "input"
                     else:
diff --git a/f4pga/utils/quicklogic/pp3/vis_switchboxes.py b/f4pga/utils/quicklogic/pp3/vis_switchboxes.py
index 70362ca..5ae30fd 100755
--- a/f4pga/utils/quicklogic/pp3/vis_switchboxes.py
+++ b/f4pga/utils/quicklogic/pp3/vis_switchboxes.py
@@ -87,7 +87,6 @@
 
     # Stages
     for stage in switchbox.stages.values():
-
         if stage.type not in stage_types:
             continue
 
@@ -121,7 +120,6 @@
 
     # Internal connections
     for conn in switchbox.connections:
-
         if switchbox.stages[conn.src.stage_id].type not in stage_types:
             continue
         if switchbox.stages[conn.dst.stage_id].type not in stage_types:
@@ -139,7 +137,6 @@
         src_node = "input_{}".format(fixup_pin_name(pin.name))
 
         for loc in pin.locs:
-
             if switchbox.stages[loc.stage_id].type not in stage_types:
                 continue
 
@@ -153,7 +150,6 @@
         dst_node = "output_{}".format(fixup_pin_name(pin.name))
 
         for loc in pin.locs:
-
             if switchbox.stages[loc.stage_id].type not in stage_types:
                 continue
 
@@ -171,7 +167,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
diff --git a/f4pga/utils/quicklogic/process_sdc_constraints.py b/f4pga/utils/quicklogic/process_sdc_constraints.py
index 1744a9b..87f09c0 100644
--- a/f4pga/utils/quicklogic/process_sdc_constraints.py
+++ b/f4pga/utils/quicklogic/process_sdc_constraints.py
@@ -78,7 +78,6 @@
 
     # Process each item
     for item in items:
-
         # Match using regex. If there is no match then pass the item through
         match = RE_INDICES.fullmatch(item)
         if not match:
@@ -128,7 +127,6 @@
 
     # A helper mapping func.
     def map_pad_to_net(pad):
-
         # Unescape square brackets
         pad = pad.replace("\\[", "[")
         pad = pad.replace("\\]", "]")
@@ -175,7 +173,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
diff --git a/f4pga/utils/quicklogic/repacker/arch_xml_utils.py b/f4pga/utils/quicklogic/repacker/arch_xml_utils.py
index 5605b9e..5403165 100644
--- a/f4pga/utils/quicklogic/repacker/arch_xml_utils.py
+++ b/f4pga/utils/quicklogic/repacker/arch_xml_utils.py
@@ -75,7 +75,6 @@
 
     # pb_type parent
     if xml_pbtype.tag == "pb_type":
-
         if xml_parent.tag == "pb_type":
             return xml_parent, xml_parent
 
@@ -83,7 +82,6 @@
             return xml_parent.getparent(), xml_parent
 
     elif xml_pbtype.tag == "mode":
-
         return xml_parent.getparent(), xml_pbtype
 
 
@@ -152,7 +150,6 @@
     port = match.group("port")
     for xml_port in xml_pbtype:
         if xml_port.tag in ["input", "output", "clock"]:
-
             # Got it
             if xml_port.attrib["name"] == port:
                 return xml_pbtype, xml_port
@@ -242,7 +239,6 @@
     # Yield individual pin names
     for i in indices:
         for j in bits:
-
             name = match.group("pbtype")
             if i is not None:
                 name += "[{}]".format(i)
diff --git a/f4pga/utils/quicklogic/repacker/eblif_netlist.py b/f4pga/utils/quicklogic/repacker/eblif_netlist.py
index e2a2485..0f998e4 100644
--- a/f4pga/utils/quicklogic/repacker/eblif_netlist.py
+++ b/f4pga/utils/quicklogic/repacker/eblif_netlist.py
@@ -38,7 +38,6 @@
     """
 
     def __init__(self, type):
-
         # Cell name. This one is for reference only. It won't be writteb back
         # with the .cname attribute. Use the cname field for that.
         self.name = None
@@ -103,7 +102,6 @@
     """
 
     def __init__(self, model):
-
         # Top-level module name
         self.model = model
 
@@ -168,7 +166,6 @@
 
         # Convert inputs
         for port in self.inputs:
-
             cell = Cell("$input")
             cell.name = port
             cell.ports["inpad"] = port
@@ -177,7 +174,6 @@
 
         # Convert outputs
         for port in self.outputs:
-
             cell = Cell("$output")
             cell.name = "out:" + port
             cell.cname = cell.name
@@ -215,7 +211,6 @@
                 # Insert a buffer if the port name does not match the net name
                 net = cell.ports["outpad"]
                 if name != net:
-
                     cell = Cell("$lut")
                     cell.name = name
                     cell.ports["lut_in[0]"] = net
@@ -421,10 +416,8 @@
 
         # Cells
         for cell in self.cells.values():
-
             # A constant source
             if cell.type == "$const":
-
                 # Skip consts
                 if not consts:
                     continue
@@ -435,7 +428,6 @@
 
             # A LUT
             elif cell.type == "$lut":
-
                 # Identify LUT input pins and their bind indices
                 nets = {}
                 for port, net in cell.ports.items():
@@ -458,7 +450,6 @@
 
             # A latch
             elif cell.type in ["$fe", "$re", "$ah", "$al", "$as"]:
-
                 line = ".latch {} {} {} {} {}".format(
                     str(cell.ports["D"]), str(cell.ports["Q"]), cell.type[1:], str(cell.ports["clock"]), str(cell.init)
                 )
@@ -466,13 +457,11 @@
 
             # A generic latch controlled by a single global clock
             elif cell.type == "$latch":
-
                 line = ".latch {} {} {}".format(str(cell.ports["D"]), str(cell.ports["Q"]), str(cell.init))
                 lines.append(line)
 
             # A generic subcircuit
             else:
-
                 # The subcircuit along with its connections
                 line = ".subckt {}".format(cell.type)
                 for port, net in cell.ports.items():
diff --git a/f4pga/utils/quicklogic/repacker/netlist_cleaning.py b/f4pga/utils/quicklogic/repacker/netlist_cleaning.py
index e69ce5c..bb7e015 100644
--- a/f4pga/utils/quicklogic/repacker/netlist_cleaning.py
+++ b/f4pga/utils/quicklogic/repacker/netlist_cleaning.py
@@ -45,7 +45,6 @@
 
         # A pass-through LUT
         if cell.type == "$lut" and cell.init == [0, 1]:
-
             # Get input and output nets
             assert INP_PORT in cell.ports, cell
             net_inp = cell.ports[INP_PORT]
@@ -68,7 +67,6 @@
     # Merge them downstream
     net_map = {}
     for cell in buffers.values():
-
         # Get input and output nets
         assert INP_PORT in cell.ports, cell
         net_inp = cell.ports[INP_PORT]
@@ -83,7 +81,6 @@
         # This cell drives a top-level output directly. Change input nets and
         # leave the output one
         if net_out in netlist.outputs:
-
             # Replace the output net in all cells with the input one
             for c in netlist.cells.values():
                 for port, net in c.ports.items():
@@ -99,7 +96,6 @@
 
         # A regular buffer
         else:
-
             # Replace the output net in all cells with the input one
             for c in netlist.cells.values():
                 for port, net in c.ports.items():
diff --git a/f4pga/utils/quicklogic/repacker/packed_netlist.py b/f4pga/utils/quicklogic/repacker/packed_netlist.py
index 47454f0..e57e8a5 100644
--- a/f4pga/utils/quicklogic/repacker/packed_netlist.py
+++ b/f4pga/utils/quicklogic/repacker/packed_netlist.py
@@ -190,7 +190,6 @@
     """
 
     def __init__(self, name, instance, mode=None, parent=None):
-
         # Basic attributes
         self.name = name
         self.instance = instance
@@ -230,7 +229,6 @@
             xml_ports = elem.find(tag)
             if xml_ports is not None:
                 for xml_port in xml_ports:
-
                     # Got a port rotation map
                     if xml_port.tag == "port_rotation_map":
                         port_name = xml_port.attrib["name"]
@@ -257,7 +255,6 @@
 
         # Recursively parse sub-blocks
         for xml_block in elem.findall("block"):
-
             sub_block = Block.from_etree(xml_block)
 
             sub_block.parent = block
@@ -265,11 +262,9 @@
 
         # Parse attributes and parameters
         for tag, data in zip(["attributes", "parameters"], [block.attributes, block.parameters]):
-
             # Find the list
             xml_list = elem.find(tag)
             if xml_list is not None:
-
                 # Only a leaf block can have attributes / parameters
                 assert block.is_leaf, "Non-leaf block '{}' with {}".format(block.instance, tag)
 
@@ -303,7 +298,6 @@
         # Attributes / parameters
         if self.is_leaf:
             for tag, data in zip(["attributes", "parameters"], [self.attributes, self.parameters]):
-
                 xml_list = ET.Element(tag)
 
                 sub_tag = tag[:-1]
@@ -323,14 +317,12 @@
             for key in keys:
                 port = self.ports[key]
                 if port.type == port_type:
-
                     # Encode port
                     xml_port = port.to_etree()
                     xml_ports.append(xml_port)
 
                     # Rotation map
                     if port.rotation_map:
-
                         # Encode
                         rotation = []
                         for i in range(port.width):
@@ -387,7 +379,6 @@
 
         # Walk towards the tree root
         while block is not None:
-
             # Type or type with index (instance)
             if with_indices:
                 node = block.instance
@@ -413,7 +404,6 @@
         """
 
         def walk(block):
-
             if not block.is_leaf and not block.is_open:
                 block.name = name
 
@@ -429,14 +419,12 @@
         """
 
         def walk(block):
-
             # Rename nets in port connections. Check whether the block itself
             # should be renamed as well (output pads need to be).
             rename_block = block.name.startswith("out:")
 
             for port in block.ports.values():
                 for pin, conn in port.connections.items():
-
                     if isinstance(conn, str):
                         port.connections[pin] = net_map.get(conn, conn)
 
@@ -445,7 +433,6 @@
 
             # Rename the leaf block if necessary
             if block.is_leaf and not block.is_open and rename_block:
-
                 if block.name in net_map:
                     block.name = net_map[block.name]
                 elif block.name.startswith("out:"):
@@ -483,7 +470,6 @@
 
         # Check parent and siblings
         if self.parent is not None:
-
             # Parent
             if self.parent.type == block_type:
                 return self.parent
@@ -530,11 +516,9 @@
 
         # Recursive walk function
         def walk(block):
-
             # Examine block ports
             for port in block.ports.values():
                 for pin in range(port.width):
-
                     net = block.find_net_for_port(port.name, pin)
                     if net:
                         nets.add(net)
@@ -553,7 +537,6 @@
         """
 
         def walk(block, parts):
-
             # Check if instance matches
             instance = "{}[{}]".format(parts[0].name, parts[0].index)
             if block.instance != instance:
@@ -594,7 +577,6 @@
         """
 
         def walk(block, count=0):
-
             # This is a non-ope leaf, count it
             if block.is_leaf and not block.is_open:
                 count += 1
diff --git a/f4pga/utils/quicklogic/repacker/pb_rr_graph.py b/f4pga/utils/quicklogic/repacker/pb_rr_graph.py
index f1046cb..2bbea52 100644
--- a/f4pga/utils/quicklogic/repacker/pb_rr_graph.py
+++ b/f4pga/utils/quicklogic/repacker/pb_rr_graph.py
@@ -95,7 +95,6 @@
     """
 
     def __init__(self):
-
         # Nodes by id
         self.nodes = {}
         # Edges (assorted)
@@ -170,7 +169,6 @@
         # Handler for "lut" pb_types. It creates an additional level of
         # hierarchy to match the representation in packed netlist.
         def process_lut(xml_pbtype, up_node_map, path):
-
             # The parent is actually a leaf so it does not have any modes
             # However, the mode name must equal to the pb_type name.
             curr_path = path + "[{}].lut[0]".format(xml_pbtype.attrib["name"])
@@ -214,14 +212,12 @@
 
             # Process each mode
             for mode, xml_mode in xml_modes.items():
-
                 # Append mode name to the current path
                 curr_path = path + "[{}]".format(mode)
 
                 # Enumerate childern, build their paths
                 children = []
                 for xml_child, index in yield_pb_children(xml_mode):
-
                     child_path = ".".join([curr_path, "{}[{}]".format(xml_child.attrib["name"], index)])
 
                     children.append(
@@ -294,7 +290,6 @@
 
         # Add nodes
         for xml_port in xml_pbtype:
-
             if xml_port.tag in ["input", "output", "clock"]:
                 width = int(xml_port.attrib["num_pins"])
 
@@ -337,7 +332,6 @@
 
         # A helper function
         def get_node_path(pin):
-
             # Split parts
             parts = pin.split(".")
             assert len(parts) == 2, pin
@@ -365,7 +359,6 @@
 
         # Process interconnects
         for xml_conn in xml_ic:
-
             # Direct
             if xml_conn.tag == "direct":
                 inps = list(yield_pins(xml_ic, xml_conn.attrib["input"], False))
@@ -390,7 +383,6 @@
 
                 # Build edges for each input port
                 for inp_port in inp_ports:
-
                     # Get input pins, should be only one
                     inp_pins = list(yield_pins(xml_ic, inp_port, False))
                     assert len(inp_pins) == 1, xml_conn.attrib
@@ -439,7 +431,6 @@
 
             net_colors = {}
             for i, net in enumerate(nets):
-
                 h = i / len(nets)
                 l = 0.50  # noqa: E741
                 s = 1.0
@@ -455,7 +446,6 @@
 
         # Node color
         def node_color(node, highlight=False):
-
             if highlight_nodes:
                 if highlight:
                     return "#FF2020"
@@ -486,7 +476,6 @@
 
         # Edge color
         def edge_color(edge):
-
             if color_by == "net":
                 net = self.edge_net(edge)
                 if net:
@@ -508,7 +497,6 @@
         # Build nodes
         nodes = {}
         for node in self.nodes.values():
-
             if nets_only and node.net is None:
                 continue
 
@@ -555,7 +543,6 @@
 
         # Add edges
         for edge in self.edges:
-
             if nets_only:
                 if not self.edge_net(edge):
                     continue
diff --git a/f4pga/utils/quicklogic/repacker/pb_rr_graph_netlist.py b/f4pga/utils/quicklogic/repacker/pb_rr_graph_netlist.py
index 98fd0bf..34f2e7a 100644
--- a/f4pga/utils/quicklogic/repacker/pb_rr_graph_netlist.py
+++ b/f4pga/utils/quicklogic/repacker/pb_rr_graph_netlist.py
@@ -64,7 +64,6 @@
 
     # Annotate nodes with nets
     for node in clb_graph.nodes.values():
-
         # Disassemble node path parts
         parts = node.path.split(".")
         parts = [PathNode.from_string(p) for p in parts]
@@ -125,7 +124,6 @@
     nodes_up = {}
 
     for edge in clb_graph.edges:
-
         # Check if the edge is active
         if clb_graph.edge_net(edge) is None:
             continue
@@ -138,7 +136,6 @@
     # Create the block hierarchy for nodes that have nets assigned.
     clb_block = None
     for node in clb_graph.nodes.values():
-
         # No net
         if node.net is None:
             continue
@@ -183,7 +180,6 @@
 
     # Add open blocks.
     for node in clb_graph.nodes.values():
-
         # Consider only nodes without nets
         if node.net:
             continue
@@ -218,7 +214,6 @@
 
     # Add block ports and their connections
     for node in clb_graph.nodes.values():
-
         # Disassemble node path parts
         parts = node.path.split(".")
         parts = [PathNode.from_string(p) for p in parts]
@@ -237,14 +232,12 @@
         port_name = parts[-1].name
         port_type = node.port_type.name.lower()
         if port_name not in block.ports:
-
             # The relevant information will be updated as more nodes gets
             # discovered.
             port = packed_netlist.Port(name=port_name, type=port_type)
             block.ports[port_name] = port
 
         else:
-
             port = block.ports[port_name]
             assert port.type == port_type, (port.type, port_type)
 
@@ -265,7 +258,6 @@
 
         # Got a driver, this is an intermediate port
         if driver_node is not None:
-
             # Get the driver pb_type and port
             driver_path = clb_graph.nodes[driver_node].path.split(".")
             driver_path = [PathNode.from_string(driver_path[i]) for i in [-2, -1]]
@@ -287,10 +279,8 @@
 
     # Assign names to leaf blocks
     def leaf_walk(block):
-
         # A leaf
         if block.is_leaf and not block.is_open:
-
             # Identify all output pins that drive nets
             nets = []
             for port in block.ports.values():
diff --git a/f4pga/utils/quicklogic/repacker/pb_rr_graph_router.py b/f4pga/utils/quicklogic/repacker/pb_rr_graph_router.py
index 8a6ce8e..40302e2 100644
--- a/f4pga/utils/quicklogic/repacker/pb_rr_graph_router.py
+++ b/f4pga/utils/quicklogic/repacker/pb_rr_graph_router.py
@@ -77,7 +77,6 @@
         sinks = {}
 
         for node in self.graph.nodes.values():
-
             if node.type not in [NodeType.SOURCE, NodeType.SINK]:
                 continue
 
@@ -100,7 +99,6 @@
         # Make nets
         nets = set(sinks.keys()) | set(sources.keys())
         for net_name in nets:
-
             net = Net(net_name)
 
             # A net may or may not have a source node(s). If there are no
@@ -130,7 +128,6 @@
         top_level_sources = set()
 
         def walk_depth_first(node, curr_route=None):
-
             # FIXME: Two possible places for optimization:
             # - create an edge lookup list indexed by dst node ids
             # - do not copy the current route list for each recursion level
@@ -159,7 +156,6 @@
             # Check all incoming edges
             for edge in self.graph.edges:
                 if edge.dst_id == node.id:
-
                     # Recurse
                     next_node = self.graph.nodes[edge.src_id]
                     route = walk_depth_first(next_node, list(curr_route))
@@ -181,7 +177,6 @@
 
         # Route all sinks to any of the net sources
         for sink in net.sinks:
-
             # Find the route
             node = self.graph.nodes[sink]
 
@@ -191,7 +186,6 @@
             # No route found. Check if we have some free top-level ports that
             # we can use.
             if not route and top_level_sources:
-
                 # Use the frist one
                 top_node_id = next(iter(top_level_sources))
                 top_node = self.graph.nodes[top_node_id]
diff --git a/f4pga/utils/quicklogic/repacker/pb_type.py b/f4pga/utils/quicklogic/repacker/pb_type.py
index 0e58d09..09b602f 100644
--- a/f4pga/utils/quicklogic/repacker/pb_type.py
+++ b/f4pga/utils/quicklogic/repacker/pb_type.py
@@ -96,7 +96,6 @@
 
         # Selected pins
         if range_spec is not None:
-
             # TODO: Compile the regex upfront
             match = re.fullmatch(r"((?P<i1>[0-9]+):)?(?P<i0>[0-9]+)", range_spec)
             assert match is not None, range_spec
@@ -164,7 +163,6 @@
         models = {}
 
         def walk(pb_type):
-
             # This is a mode, recurse
             if isinstance(pb_type, Mode):
                 for child in pb_type.pb_types.values():
@@ -172,7 +170,6 @@
 
             # This is a pb_type. Make a model if it is a leaf
             elif isinstance(pb_type, PbType):
-
                 # Not a leaf, recurse for modes
                 if not pb_type.is_leaf:
                     for mode in pb_type.modes.values():
@@ -282,13 +279,11 @@
         # Build ports
         for xml_port in elem:
             if xml_port.tag in ["input", "output", "clock"]:
-
                 port = Port.from_etree(xml_port)
                 pb_type.ports[port.name] = port
 
         # This is a native LUT leaf pb_type. Add one more level of hierarchy
         if is_leaf_pbtype(elem) and cls == "lut":
-
             # Rename the default mode so that it matches the pb_type name
             mode = pb_type.modes["default"]
             mode.name = pb_type.name
@@ -344,7 +339,6 @@
         # Walk the hierarchy along the path
         pbtype = self
         while True:
-
             # Pop a node from the path
             part = path[0]
             path = path[1:]
@@ -368,7 +362,6 @@
 
             # Mode not given
             else:
-
                 # No more path, return the pb_type
                 if not path:
                     return pbtype
diff --git a/f4pga/utils/quicklogic/repacker/repack.py b/f4pga/utils/quicklogic/repacker/repack.py
index 5fc6099..03701ba 100755
--- a/f4pga/utils/quicklogic/repacker/repack.py
+++ b/f4pga/utils/quicklogic/repacker/repack.py
@@ -85,7 +85,6 @@
     """
 
     def __init__(self, net, block_type, port_spec):
-
         port = PathNode.from_string(port_spec)
 
         self.net = net
@@ -144,7 +143,6 @@
 
         for port in block.ports.values():
             for pin, conn in port.connections.items():
-
                 if port.type in ["input", "clock"]:
                     if blk_inp is None:
                         blk_inp = Port(port, pin)
@@ -221,10 +219,8 @@
     """
 
     def walk(block, net, collected_blocks):
-
         # This is a leaf block
         if block.is_leaf:
-
             # Check every input port connection, identify driving nets. Store
             # the block if at least one input is driven by the given net.
             for port in block.ports.values():
@@ -243,7 +239,6 @@
 
     # Insert buffers for each new net
     for net_inp, net_out in nets:
-
         # Insert the buffer cell. Here it is a LUT-1 configured as buffer.
         cell = Cell("$lut")
         cell.name = net_out
@@ -259,7 +254,6 @@
 
         # Remap block cell connections
         for block in blocks:
-
             # Find cell for the block
             cell = eblif.find_cell(block.name)
             assert cell is not None, block
@@ -321,7 +315,6 @@
 
         # This is not a leaf block
         else:
-
             # Add the implicit LUT hierarchy to the path
             if is_lut:
                 path.append(PathNode.from_string("lut[0]"))
@@ -371,7 +364,6 @@
 
     # Process the path
     for i in range(length):
-
         # Parse both path nodes
         arch_node = PathNode.from_string(arch_path[i])
         block_node = PathNode.from_string(block_path[i])
@@ -415,7 +407,6 @@
     """
 
     def walk(arch_path, pbtype, pbtype_index, curr_path=None):
-
         # Parse the path node
         if arch_path:
             path_node = PathNode.from_string(arch_path[0])
@@ -445,14 +436,12 @@
 
         # Recurse
         for mode_name, mode in pbtype.modes.items():
-
             # Check mode if given
             if path_node.mode is not None and path_node.mode != mode_name:
                 continue
 
             # Recurse for children
             for child, i in mode.yield_children():
-
                 # Recurse
                 part = "{}[{}][{}]".format(pbtype_name, pbtype_index, mode_name)
                 yield from walk(arch_path, child, i, curr_path + [part])
@@ -501,7 +490,6 @@
     nodes_by_net = {}
 
     for node in clb_graph.nodes.values():
-
         # Consider only SOURCE and SINK nodes
         if node.type not in [NodeType.SOURCE, NodeType.SINK]:
             continue
@@ -555,7 +543,6 @@
 
     # Reassign top-level SOURCE and SINK nodes according to the constraints
     for constraint in constraints:
-
         # Check if the constraint is for this block type
         if constraint.block_type != block_type:
             continue
@@ -586,7 +573,6 @@
         # port or vice-versa.
         node_types = set([node.type for node in nodes_by_net[constraint.net]])
         if port_node.type not in node_types:
-
             name_map = {NodeType.SINK: "output", NodeType.SOURCE: "input"}
 
             logging.warning(
@@ -626,7 +612,6 @@
     # Rotate
     new_table = [0 for i in range(2**width)]
     for daddr in range(2**width):
-
         # Remap address bits
         saddr = 0
         for i in range(width):
@@ -711,7 +696,6 @@
     # If the cell is a LUT then rotate its truth table. Append the rotated
     # truth table as a parameter to the repacked cell.
     if cell.type == "$lut":
-
         # Build the init parameter
         init = rotate_truth_table(cell.init, lut_rotation)
         init = "".join(["1" if x else "0" for x in init][::-1])
@@ -729,7 +713,6 @@
     # If the cell is a LUT-based const generator append the LUT parameter as
     # well.
     if cell.type == "$const":
-
         assert lut_width == 0, (cell, lut_width)
 
         # Assume that the model is a LUT. Take its widest input port and use
@@ -745,7 +728,6 @@
 
     # Process parameters for "adder_lut4"
     if cell.type == "adder_lut4":
-
         # Remap the Cin mux select to MODE
         if "IN2_IS_CIN" in cell.parameters:
             repacked_cell.parameters["MODE"] = cell.parameters["IN2_IS_CIN"]
@@ -779,10 +761,8 @@
     """
 
     def walk(block):
-
         # This is a leaf
         if block.is_leaf and not block.is_open:
-
             if any(block.instance.startswith(inst) for inst in ["outpad", "inpad"]):
                 return
 
@@ -845,7 +825,6 @@
     """
 
     for rule in rules:
-
         # Get src and dst pb_types
         path = [PathNode.from_string(p) for p in rule.src.split(".")]
         path = [PathNode(p.name, mode=p.mode) for p in path]
@@ -860,7 +839,6 @@
         # Expand port map
         port_map = {}
         for src_port, dst_port in rule.port_map.items():
-
             # Get pin lists
             src_pins = list(src_pbtype.yield_port_pins(src_port))
             dst_pins = list(dst_pbtype.yield_port_pins(dst_port))
@@ -894,7 +872,6 @@
 
     constraints = []
     for json_constr in json_constrs:
-
         constraint = RepackingConstraint(
             net=json_constr["net"], block_type=json_constr["tile"], port_spec=json_constr["pin"]
         )
@@ -918,7 +895,6 @@
     constraints = []
     for pcf_constr in parse_simple_pcf(pcf):
         if type(pcf_constr).__name__ == "PcfClkConstraint":
-
             # There are only "clb" and "io" tile types
             # We select the same global clock for
             # each tile where net is used
@@ -956,7 +932,6 @@
 
 
 def main():
-
     # Parse arguments
     parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
 
@@ -1151,7 +1126,6 @@
         iter_list = list(blocks_to_repack)
         blocks_to_repack = []
         for block, rule in iter_list:
-
             # Remap index of the destination block pointed by the path of the
             # rule.
             blk_path = block.get_path()
@@ -1197,7 +1171,6 @@
         # Check for conflicts
         repack_targets = set()
         for block, rule, (path, pbtype) in blocks_to_repack:
-
             if path in repack_targets:
                 logging.error("Multiple blocks are to be repacked into '{}'".format(path))
             repack_targets.add(path)
@@ -1295,7 +1268,6 @@
         # Restore names of leaf blocks
         for src_block, rule, (dst_path, dst_pbtype) in blocks_to_repack:
             if dst_path in leaf_block_names:
-
                 search_path = dst_path.split(".", maxsplit=1)[1]
                 dst_block = repacked_clb_block.get_block_by_path(search_path)
                 assert dst_block is not None, dst_path
@@ -1339,7 +1311,6 @@
     # would cause top-level port renaming.
     logging.info("Cleaning repacked circuit netlist...")
     if absorb_buffer_luts:
-
         net_map = netlist_cleaning.absorb_buffer_luts(eblif, outputs=True)
 
         # Synchronize packed netlist net names
@@ -1384,7 +1355,6 @@
         # Find the header line
         for i in range(len(placement)):
             if placement[i].startswith("Netlist_File:"):
-
                 # Replace the header
                 placement[i] = "Netlist_File: {} Netlist_ID: {}\n".format(
                     os.path.basename(net_out_fname), "SHA256:" + net_digest
diff --git a/f4pga/utils/quicklogic/repacker/tests/eblif_roundtrip/test_eblif_roundtrip.py b/f4pga/utils/quicklogic/repacker/tests/eblif_roundtrip/test_eblif_roundtrip.py
index d246dbe..9530ed3 100644
--- a/f4pga/utils/quicklogic/repacker/tests/eblif_roundtrip/test_eblif_roundtrip.py
+++ b/f4pga/utils/quicklogic/repacker/tests/eblif_roundtrip/test_eblif_roundtrip.py
@@ -27,7 +27,6 @@
 
 
 def test_netlist_roundtrip():
-
     basedir = os.path.dirname(__file__)
     golden_file = os.path.join(basedir, "netlist.golden.eblif")
 
@@ -35,7 +34,6 @@
     eblif = Eblif.from_file(golden_file)
 
     with tempfile.TemporaryDirectory() as tempdir:
-
         # Write the EBLIF back
         output_file = os.path.join(tempdir, "netlist.output.eblif")
         eblif.to_file(output_file)
diff --git a/f4pga/utils/quicklogic/repacker/tests/lut_padding/test_lut_padding.py b/f4pga/utils/quicklogic/repacker/tests/lut_padding/test_lut_padding.py
index 4528e41..8c66a5f 100644
--- a/f4pga/utils/quicklogic/repacker/tests/lut_padding/test_lut_padding.py
+++ b/f4pga/utils/quicklogic/repacker/tests/lut_padding/test_lut_padding.py
@@ -57,7 +57,6 @@
     net_in = os.path.join(basedir, "lut{}_{}.net".format(lut_width, lut_inputs))
 
     with tempfile.TemporaryDirectory() as tempdir:
-
         eblif_out = os.path.join(tempdir, "out.eblif")
         net_out = os.path.join(tempdir, "out.net")
 
diff --git a/f4pga/utils/quicklogic/repacker/tests/packed_netlist_roundtrip/test_netlist_roundtrip.py b/f4pga/utils/quicklogic/repacker/tests/packed_netlist_roundtrip/test_netlist_roundtrip.py
index e728925..ff43075 100644
--- a/f4pga/utils/quicklogic/repacker/tests/packed_netlist_roundtrip/test_netlist_roundtrip.py
+++ b/f4pga/utils/quicklogic/repacker/tests/packed_netlist_roundtrip/test_netlist_roundtrip.py
@@ -29,7 +29,6 @@
 
 
 def test_netlist_roundtrip():
-
     basedir = os.path.dirname(__file__)
     golden_file = os.path.join(basedir, "netlist.golden.net")
 
@@ -42,7 +41,6 @@
     xml_tree = ET.parse(golden_file, ET.XMLParser(remove_blank_text=True))
 
     with tempfile.TemporaryDirectory() as tempdir:
-
         # Transform and save the golden file
         sorted_golden_file = os.path.join(tempdir, "netlist.golden.sorted.net")
         with open(sorted_golden_file, "w") as fp:
diff --git a/f4pga/utils/quicklogic/yosys_fixup_cell_names.py b/f4pga/utils/quicklogic/yosys_fixup_cell_names.py
index 011b89d..f39916f 100644
--- a/f4pga/utils/quicklogic/yosys_fixup_cell_names.py
+++ b/f4pga/utils/quicklogic/yosys_fixup_cell_names.py
@@ -41,7 +41,6 @@
         # Process cells
         cells = mod_data["cells"]
         for cell_name in list(cells.keys()):
-
             # Fixup name
             if "." in cell_name:
                 new_name = cell_name.replace(".", "_")
diff --git a/f4pga/utils/vpr_io_place.py b/f4pga/utils/vpr_io_place.py
index 216da00..42757ae 100644
--- a/f4pga/utils/vpr_io_place.py
+++ b/f4pga/utils/vpr_io_place.py
@@ -187,7 +187,6 @@
         # This is an inout net
         if net_name in self.inout_nets:
             for prefix, suffix in zip(["", "out:"], ["_$inp", "_$out"]):
-
                 match = NETNAME_REGEX.match(net_name)
                 name = prefix + match.group(1) + suffix + match.group(2)
 
@@ -225,7 +224,6 @@
                 existing = constrained_blocks[name]
 
                 if existing.x != constraint.x or existing.y != constraint.y or existing.z != constraint.z:
-
                     print("Error: block '{}' has multiple conflicting constraints!".format(name))
                     print("", constrained_blocks[name])
                     print("", constraint)
diff --git a/f4pga/utils/xc7/create_ioplace.py b/f4pga/utils/xc7/create_ioplace.py
index 706cfaa..df0f7fe 100644
--- a/f4pga/utils/xc7/create_ioplace.py
+++ b/f4pga/utils/xc7/create_ioplace.py
@@ -73,7 +73,7 @@
         net_to_pad |= set((constr.net, constr.pad) for constr in parse_simple_pcf(pcf))
     # Check for conflicting pad constraints
     net_to_pad_map = dict()
-    for (net, pad) in net_to_pad:
+    for net, pad in net_to_pad:
         if net not in net_to_pad_map:
             net_to_pad_map[net] = pad
         elif pad != net_to_pad_map[net]:
diff --git a/f4pga/utils/xc7/create_place_constraints.py b/f4pga/utils/xc7/create_place_constraints.py
index 5ee85d9..6b78be5 100644
--- a/f4pga/utils/xc7/create_place_constraints.py
+++ b/f4pga/utils/xc7/create_place_constraints.py
@@ -124,7 +124,6 @@
                 existing = constrained_blocks[name]
 
                 if existing.x != constraint.x or existing.y != constraint.y or existing.z != constraint.z:
-
                     print("Error: block '{}' has multiple conflicting constraints!".format(name))
                     print("", constrained_blocks[name])
                     print("", constraint)
@@ -307,7 +306,7 @@
 def get_cmt(cmt_dict, loc):
     """Returns the clock region of an input location."""
     for k, v in cmt_dict.items():
-        for (x, y) in v["vpr_loc"]:
+        for x, y in v["vpr_loc"]:
             if x == loc[0] and y == loc[1]:
                 return v["clock_region"]
 
@@ -421,7 +420,6 @@
 
 class ClockPlacer(object):
     def __init__(self, vpr_grid, io_locs, blif_data, roi, graph_limit, allow_bufg_logic_sources=False):
-
         self.roi = roi
         self.cmt_to_bufg_tile = {}
         self.bufg_from_cmt = {
@@ -573,7 +571,6 @@
                 clock["sink_nets"].append(sink_net)
 
                 if sink_net not in self.input_pins and sink_net not in self.clock_sources:
-
                     # Allow IBUFs. At this point we cannot distinguish between
                     # IBUFs for clock and logic.
                     if bel == "IBUF_VPR":
@@ -608,7 +605,6 @@
         # Store the parent CMT in clock_cmts.
         for block, loc in block_locs.items():
             if block in self.clock_blocks:
-
                 clock = self.clock_blocks[block]
                 if CLOCKS[clock["subckt"]]["type"] == "BUFGCTRL":
                     pass
@@ -626,7 +622,6 @@
         # Any clocks that were previously constrained must be preserved
         for block, (loc_x, loc_y, _) in blocks.items():
             if block in self.clock_blocks:
-
                 clock = self.clock_blocks[block]
                 if CLOCKS[clock["subckt"]]["type"] == "BUFGCTRL":
                     pass
@@ -677,7 +672,6 @@
         ibuf_cmt_sinks = defaultdict(set)
 
         for net in self.clock_sources:
-
             is_net_ibuf = False
 
             if net not in self.input_pins:
@@ -688,7 +682,6 @@
                         is_net_ibuf = True
 
             for clock_name in self.clock_sources[net]:
-
                 if clock_name in unused_blocks:
                     continue
 
diff --git a/f4pga/utils/xc7/fix_xc7_carry.py b/f4pga/utils/xc7/fix_xc7_carry.py
index a8ec19d..d02246c 100644
--- a/f4pga/utils/xc7/fix_xc7_carry.py
+++ b/f4pga/utils/xc7/fix_xc7_carry.py
@@ -413,7 +413,6 @@
         for port, connections in cell["connections"].items():
             is_output = port_directions[port] == "output"
             for bit_idx, bit in enumerate(connections):
-
                 list_of_cells = bit_to_cells.get(bit, None)
                 if list_of_cells is None:
                     list_of_cells = [None]
@@ -570,7 +569,6 @@
                 # If this is the last CARRY4 in the chain, see if the
                 # remaining part of the chain is idle.
                 elif chain_idx == len(chain) - 1 and check_if_rest_of_carry4_is_unused(cellname, cell_idx + 1):
-
                     # Because the rest of the CARRY4 is idle, it is safe to
                     # use the next row up to output the top of the carry.
                     connections["S{}".format(cell_idx + 1)] = ["1'b0"]
diff --git a/f4pga/utils/yosys_split_inouts.py b/f4pga/utils/yosys_split_inouts.py
index d4fd30f..73fd1e2 100644
--- a/f4pga/utils/yosys_split_inouts.py
+++ b/f4pga/utils/yosys_split_inouts.py
@@ -168,7 +168,6 @@
     net_map = {}
     port_map = []
     for name, port in inouts.items():
-
         # Remove the inout port from the module
         del module["ports"][name]
         nets -= get_nets(port["bits"])
@@ -215,10 +214,8 @@
 
     # Remove remapped nets
     for name, net in list(netnames.items()):
-
         # Remove "bits" used by the net that were re-mapped.
         if len(set(net["bits"]) & set(net_map.keys())):
-
             # Remove
             net["bits"] = ["x" if b in net_map else b for b in net["bits"]]
 
@@ -250,7 +247,6 @@
 
         # Process cell connections
         for port_name, port_nets in list(connections.items()):
-
             # Skip if no net of this connection were remapped
             if len(set(net_map.keys()) & set(port_nets)) == 0:
                 continue
@@ -259,7 +255,6 @@
             # versa.
             for dir in ["input", "output"]:
                 if port_directions[port_name] == dir and port_name.endswith("$" + dir[:3]):
-
                     for i, n in enumerate(port_nets):
                         if n in net_map:
                             mapped_n = net_map[n][dir[0]]
diff --git a/f4pga/wrappers/sh/__init__.py b/f4pga/wrappers/sh/__init__.py
index b134a08..4bace98 100644
--- a/f4pga/wrappers/sh/__init__.py
+++ b/f4pga/wrappers/sh/__init__.py
@@ -144,7 +144,6 @@
 
 
 def p_parse_vpr_args_xc7(vpr_options=None, log_suffix=None):
-
     parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter)
     parser.add_argument("--device", "-d", required=False, type=str, help="")
     parser.add_argument("--eblif", "-e", required=True, type=str, help="")
@@ -253,7 +252,6 @@
 
 
 def p_parse_vpr_args_quicklogic(vpr_options=None, log_suffix=None):
-
     parser = ArgumentParser(description=__doc__, formatter_class=RawDescriptionHelpFormatter)
     parser.add_argument("--device", "-d", required=True, type=str, help="")
     parser.add_argument("--family", "-f", required=True, type=str, help="")
