diff --git a/setup.py b/setup.py
index 8b634a5..47df2b2 100644
--- a/setup.py
+++ b/setup.py
@@ -17,9 +17,7 @@
 setuptools.setup(
     name="v2x",
     version="0.0.1",
-    entry_points={
-        "console_scripts": ["v2x=v2x.__main__:v2x"]
-    },
+    entry_points={"console_scripts": ["v2x=v2x.__main__:v2x"]},
     author="SymbiFlow Authors",
     author_email="symbiflow@lists.librecores.org",
     description="Python library for generating VPR architecture \
diff --git a/v2x/__main__.py b/v2x/__main__.py
index 7978002..8791a2f 100644
--- a/v2x/__main__.py
+++ b/v2x/__main__.py
@@ -26,18 +26,18 @@
 
     if args.mode == "pb_type":
         with open(args.outfile, "w") as fp:
-            fp.write(vlog_to_pbtype.vlog_to_pbtype(
-                args.infiles, args.outfile, args.top))
+            fp.write(
+                vlog_to_pbtype.vlog_to_pbtype(
+                    args.infiles, args.outfile, args.top))
     else:
         with open(args.outfile, "w") as fp:
-            fp.write(vlog_to_model.vlog_to_model(
-                args.infiles, args.includes, args.top, args.outfile))
+            fp.write(
+                vlog_to_model.vlog_to_model(
+                    args.infiles, args.includes, args.top, args.outfile))
 
 
 def v2x():
-    parser = argparse.ArgumentParser(
-        description="Verilog to XML"
-    )
+    parser = argparse.ArgumentParser(description="Verilog to XML")
     parser.add_argument(
         'infiles',
         metavar='input.v',
@@ -47,15 +47,13 @@
 One or more Verilog input files, that will be passed to Yosys internally.
 They should be enough to generate a flattened representation of the model,
 so that paths through the model can be determined.
-"""
-    )
+""")
     parser.add_argument(
         '--top',
         help="""\
 Top level module, will usually be automatically determined from the file name
 %.sim.v
-"""
-    )
+""")
     parser.add_argument(
         '--outfile',
         '-o',
@@ -63,15 +61,13 @@
         default="output.xml",
         help="""\
 Output filename, default 'output.xml'
-"""
-    )
+""")
     parser.add_argument(
         '--includes',
         help="""\
 Comma separate list of include directories.
 """,
-        default=""
-    )
+        default="")
     parser.add_argument(
         '--mode',
         type=str,
@@ -80,8 +76,7 @@
         help="""\
 Output file type, possible values are: pb_type and model.
 Default value is pb_type
-"""
-    )
+""")
     args = parser.parse_args()
     sys.exit(main(args))
 
diff --git a/v2x/lib/argparse_extra.py b/v2x/lib/argparse_extra.py
index 4dc1ab3..7babe4b 100644
--- a/v2x/lib/argparse_extra.py
+++ b/v2x/lib/argparse_extra.py
@@ -71,8 +71,7 @@
             default=None,
             required=False,
             help=None,
-            metavar=None
-    ):
+            metavar=None):
         self.orig_option_strings = option_strings
         new_option_strings = []
         for s in option_strings:
@@ -90,8 +89,7 @@
             choices=None,
             required=required,
             help=help,
-            metavar=metavar
-        )
+            metavar=metavar)
 
     def value(self, s):
         if not s:
@@ -113,8 +111,7 @@
 
     def __repr__(self):
         return "ActionStoreBool({}, {})".format(
-            self.orig_option_strings, self.default
-        )
+            self.orig_option_strings, self.default)
 
 
 if __name__ == "__main__":
diff --git a/v2x/lib/asserts.py b/v2x/lib/asserts.py
index b2d7b5c..1fcd4e0 100644
--- a/v2x/lib/asserts.py
+++ b/v2x/lib/asserts.py
@@ -37,8 +37,7 @@
 def assert_not_in(needle, haystack, msg=None):
     """Assert equal with better error message."""
     assert needle not in haystack, msg or __safe_error(
-        "already in", needle, haystack
-    )
+        "already in", needle, haystack)
 
 
 def assert_is(a, b):
@@ -47,8 +46,7 @@
 
 
 def assert_type(
-        obj, cls, msg="{obj} ({obj!r}) should be a {cls}, not {objcls}"
-):
+        obj, cls, msg="{obj} ({obj!r}) should be a {cls}, not {objcls}"):
     """Raise a type error if obj is not an instance of cls."""
     if not isinstance(obj, cls):
         raise TypeError(msg.format(obj=obj, objcls=type(obj), cls=cls))
@@ -65,9 +63,5 @@
     # Sanity check
     max_len = max(len(p) for p in v)
     for i, p in enumerate(v):
-        assert len(
-            p
-        ) == max_len, "Length check failed!\n \
-v[{}] has {} elements != {} ({!r})\n{!r}".format(
-            i, len(p), max_len, p, v
-        )
+        assert len(p) == max_len, "Length check failed!\n \
+v[{}] has {} elements != {} ({!r})\n{!r}".format(i, len(p), max_len, p, v)
diff --git a/v2x/lib/mux.py b/v2x/lib/mux.py
index 68b954a..596df19 100644
--- a/v2x/lib/mux.py
+++ b/v2x/lib/mux.py
@@ -63,8 +63,7 @@
             return "output wire"
         else:
             raise TypeError(
-                "Can't convert {} into verilog definition.".format(self)
-            )
+                "Can't convert {} into verilog definition.".format(self))
 
     def direction(self):
         if self in (self.INPUT, self.SELECT):
@@ -73,8 +72,7 @@
             return "output"
         else:
             raise TypeError(
-                "Can't convert {} into verilog definition.".format(self)
-            )
+                "Can't convert {} into verilog definition.".format(self))
 
     def __str__(self):
         return self.value
@@ -92,14 +90,12 @@
         if self.width == 1:
             if self.data_width is not None and self.data_width > 1:
                 return '\t%s [%d:0] %s;\n' % (
-                    self.pin_type.verilog(), self.data_width - 1, self.name
-                )
+                    self.pin_type.verilog(), self.data_width - 1, self.name)
             else:
                 return '\t%s %s;\n' % (self.pin_type.verilog(), self.name)
         else:
             return '\t%s %s %s;\n' % (
-                self.pin_type.verilog(), self.index, self.name
-            )
+                self.pin_type.verilog(), self.index, self.name)
 
 
 def pb_type_xml(mux_type, mux_name, pins, subckt=None, num_pb=1, comment=""):
@@ -131,8 +127,8 @@
     xml.etree.ElementTree
         pb_type.xml for requested mux
     """
-    assert isinstance(comment,
-                      str), "{} {}".format(type(comment), repr(comment))
+    assert isinstance(comment, str), "{} {}".format(
+        type(comment), repr(comment))
 
     if mux_type not in (MuxType.LOGIC, MuxType.ROUTING):
         assert False, "Unknown type {}".format(mux_type)
@@ -141,8 +137,7 @@
         'pb_type', {
             'name': mux_name,
             'num_pb': str(num_pb),
-        }
-    )
+        })
 
     if mux_type == MuxType.LOGIC:
         add_metadata(pb_type_xml, 'bel', 'mux')
@@ -154,8 +149,7 @@
         model.text = '.subckt {}'.format(subckt)
     else:
         assert not subckt, "Provided subckt={} for non-logic mux!".format(
-            subckt
-        )
+            subckt)
 
     if comment is not None:
         pb_type_xml.append(ET.Comment(comment))
@@ -171,8 +165,7 @@
 
         assert port.width == 1 or port.data_width == 1, (
             'Only one of width(%d) or data_width(%d) may > 1 for pin %s' %
-            (port.width, port.data_width, port.name)
-        )
+            (port.width, port.data_width, port.name))
 
         if port.width == 1 and port.data_width > 1:
             num_pins = port.data_width
@@ -244,8 +237,7 @@
 
         meta_fasm_mux = ET.SubElement(meta_root, 'meta', {'key': 'fasm_mux'})
         meta_fasm_mux.text = "\n".join(
-            [""] + ["{0} = {0}".format(i) for i in inputs] + [""]
-        )
+            [""] + ["{0} = {0}".format(i) for i in inputs] + [""])
 
     return pb_type_xml
 
diff --git a/v2x/mux_gen.py b/v2x/mux_gen.py
index a742125..eb6efb9 100755
--- a/v2x/mux_gen.py
+++ b/v2x/mux_gen.py
@@ -8,7 +8,6 @@
 # https://opensource.org/licenses/ISC
 #
 # SPDX-License-Identifier:	ISC
-
 """
 Generate MUX.
 
@@ -30,54 +29,46 @@
 parser = argparse.ArgumentParser(
     description='Generate a MUX wrapper.',
     fromfile_prefix_chars='@',
-    prefix_chars='-~'
-)
+    prefix_chars='-~')
 
 parser.add_argument(
     '--verbose',
     '--no-verbose',
     action=ActionStoreBool,
     default=os.environ.get('V', '') == '1',
-    help="Print lots of information about the generation."
-)
+    help="Print lots of information about the generation.")
 
 parser.add_argument('--width', type=int, default=8, help="Width of the MUX.")
 
 parser.add_argument(
-    '--data-width', type=int, default=1, help="data width of the MUX."
-)
+    '--data-width', type=int, default=1, help="data width of the MUX.")
 
 parser.add_argument(
     '--type',
     choices=['logic', 'routing'],
     default='logic',
-    help="Type of MUX."
-)
+    help="Type of MUX.")
 
 parser.add_argument(
     '--split-inputs',
     action=ActionStoreBool,
     default=False,
-    help="Split the inputs into separate signals"
-)
+    help="Split the inputs into separate signals")
 
 parser.add_argument(
     '--split-selects',
     action=ActionStoreBool,
     default=False,
-    help="Split the selects into separate signals"
-)
+    help="Split the selects into separate signals")
 
 parser.add_argument(
-    '--name-mux', type=str, default='MUX', help="Name of the mux."
-)
+    '--name-mux', type=str, default='MUX', help="Name of the mux.")
 
 parser.add_argument(
     '--name-input',
     type=str,
     default='I',
-    help="Name of the input values for the mux."
-)
+    help="Name of the input values for the mux.")
 
 parser.name_inputs = parser.add_argument(
     '--name-inputs',
@@ -92,15 +83,13 @@
     '--name-output',
     type=str,
     default='O',
-    help="Name of the output value for the mux."
-)
+    help="Name of the output value for the mux.")
 
 parser.add_argument(
     '--name-select',
     type=str,
     default='S',
-    help="Name of the select parameter for the mux."
-)
+    help="Name of the select parameter for the mux.")
 
 parser.name_selects = parser.add_argument(
     '--name-selects',
@@ -108,8 +97,7 @@
     default=None,
     help=  # noqa: E251
     "Comma deliminator list for the name of each select to the mux " +
-    "(implies --split-selects)."
-)
+    "(implies --split-selects).")
 
 parser.add_argument(
     '--order',
@@ -118,54 +106,48 @@
     default='iso',
     help=  # noqa: E251
     """Order of the arguments for the MUX.
-(i - Inputs, o - Output, s - Select)"""
-)
+(i - Inputs, o - Output, s - Select)""")
 
 parser.add_argument(
     '--outdir',
     default=None,
-    help="""Directory to output generated content too."""
-)
+    help="""Directory to output generated content too.""")
 
 parser.add_argument(
     '--outfilename',
     default=None,
-    help="""Filename to output generated content too."""
-)
+    help="""Filename to output generated content too.""")
 
 parser.add_argument(
-    '--comment', default=None, help="""Add some type of comment to the mux."""
-)
+    '--comment', default=None, help="""Add some type of comment to the mux.""")
 
 parser.add_argument(
-    '--num_pb', default=1, help="""Set the num_pb for the mux."""
-)
+    '--num_pb', default=1, help="""Set the num_pb for the mux.""")
 
 parser.add_argument(
-    '--subckt', default=None, help="""Override the subcircuit name."""
-)
+    '--subckt', default=None, help="""Override the subcircuit name.""")
 
 
-def mux_gen(argv=('Python function', ),
-            width=8,
-            data_width=1,
-            datatype='logic',
-            split_inputs=False,
-            split_selects=False,
-            name_mux='MUX',
-            name_input='I',
-            name_inputs=None,
-            name_output='O',
-            name_select='S',
-            name_selects=None,
-            order='iso',
-            outdir=None,
-            outfilename=None,
-            comment=None,
-            num_pb=1,
-            subckt=None,
-            verbose=False
-            ):
+def mux_gen(
+        argv=('Python function', ),
+        width=8,
+        data_width=1,
+        datatype='logic',
+        split_inputs=False,
+        split_selects=False,
+        name_mux='MUX',
+        name_input='I',
+        name_inputs=None,
+        name_output='O',
+        name_select='S',
+        name_selects=None,
+        order='iso',
+        outdir=None,
+        outfilename=None,
+        comment=None,
+        num_pb=1,
+        subckt=None,
+        verbose=False):
     def output_block(name, s):
         if verbose:
             print()
@@ -195,8 +177,7 @@
 
     if data_width > 1 and not split_inputs:
         assert False, "data_width(%d) > 1 requires using split_inputs" % (
-            data_width
-        )
+            data_width)
 
     name_input_default = 'I'
     name_inputs_default = None
@@ -209,14 +190,11 @@
         split_inputs = True
 
         names = name_inputs.split(',')
-        assert len(names) == width, "%s input names, but %s needed." % (
-            names, width
-        )
+        assert len(
+            names) == width, "%s input names, but %s needed." % (names, width)
         name_inputs = names
     elif split_inputs:
-        name_inputs = [
-            name_input + str(i) for i in range(width)
-        ]
+        name_inputs = [name_input + str(i) for i in range(width)]
         name_inputs_default = name_inputs
         assert_eq(name_inputs_default, name_inputs)
 
@@ -227,13 +205,10 @@
 
         names = name_selects.split(',')
         assert len(names) == width_bits, (
-            "%s select names, but %s needed." % (names, width_bits)
-        )
+            "%s select names, but %s needed." % (names, width_bits))
         name_selects = names
     elif split_selects:
-        name_selects = [
-            name_select + str(i) for i in range(width_bits)
-        ]
+        name_selects = [name_select + str(i) for i in range(width_bits)]
         name_selects.default = name_selects
         assert_eq(name_selects_default, name_selects)
 
@@ -266,44 +241,33 @@
             if split_inputs:
                 port_names.extend(
                     mux_lib.ModulePort(
-                        mux_lib.MuxPinType.INPUT, name_inputs[j], 1,
-                        '[%i]' % j, data_width
-                    ) for j in range(width)
-                )
+                        mux_lib.MuxPinType.INPUT, name_inputs[j], 1, '[%i]' %
+                        j, data_width) for j in range(width))
             else:
                 # verilog range bounds are inclusive and convention is
                 # [<width-1>:0]
                 port_names.append(
                     mux_lib.ModulePort(
                         mux_lib.MuxPinType.INPUT, name_input, width,
-                        '[%i:0]' % (width - 1)
-                    )
-                )
+                        '[%i:0]' % (width - 1)))
         elif i == 's':
             if split_selects:
                 port_names.extend(
                     mux_lib.ModulePort(
-                        mux_lib.MuxPinType.SELECT, name_selects[j], 1,
-                        '[%i]' % j
-                    ) for j in range(width_bits)
-                )
+                        mux_lib.MuxPinType.SELECT, name_selects[j], 1, '[%i]' %
+                        j) for j in range(width_bits))
             else:
                 # verilog range bounds are inclusive and convention is
                 # [<width-1>:0]
                 assert name_select is not None
                 port_names.append(
                     mux_lib.ModulePort(
-                        mux_lib.MuxPinType.SELECT, name_select,
-                        width_bits, '[%i:0]' % (width_bits - 1)
-                    )
-                )
+                        mux_lib.MuxPinType.SELECT, name_select, width_bits,
+                        '[%i:0]' % (width_bits - 1)))
         elif i == 'o':
             port_names.append(
                 mux_lib.ModulePort(
-                    mux_lib.MuxPinType.OUTPUT, name_output, 1, '',
-                    data_width
-                )
-            )
+                    mux_lib.MuxPinType.OUTPUT, name_output, 1, '', data_width))
 
     # ------------------------------------------------------------------------
     # Generate the techmap Verilog module
@@ -314,8 +278,8 @@
         with open(techmap_pathname, "w") as f:
             module_args = []
             for port in port_names:
-                if (datatype == 'routing' and
-                        port.pin_type == mux_lib.MuxPinType.SELECT):
+                if (datatype == 'routing'
+                        and port.pin_type == mux_lib.MuxPinType.SELECT):
                     continue
                 module_args.append(port.name)
 
@@ -325,8 +289,7 @@
 
             f.write(
                 "module %s(%s);\n" %
-                (name_mux.upper(), ", ".join(module_args))
-            )
+                (name_mux.upper(), ", ".join(module_args)))
             f.write('\tparameter MODE = "";\n')
 
             modes = [
@@ -347,9 +310,8 @@
             f.write('\tgenerate\n')
             for i, mode in enumerate(modes):
                 f.write(
-                    '\t\t%s ( MODE == "%s" )\n' %
-                    (('if', 'else if')[i > 0], mode)
-                )
+                    '\t\t%s ( MODE == "%s" )\n' % (
+                        ('if', 'else if')[i > 0], mode))
                 f.write('\t\tbegin\n')
                 f.write('\t\t\tassign %s = %s;\n' % (outputs[0], mode))
                 f.write('\t\tend\n')
@@ -367,8 +329,8 @@
     with open(sim_pathname, "w") as f:
         module_args = []
         for port in port_names:
-            if (datatype == 'routing' and
-                    port.pin_type == mux_lib.MuxPinType.SELECT):
+            if (datatype == 'routing'
+                    and port.pin_type == mux_lib.MuxPinType.SELECT):
                 continue
             module_args.append(port.name)
 
@@ -389,8 +351,7 @@
                     width,
                     '',
                     width,
-                )
-            )
+                ))
         f.write("\n")
         f.write('(* CLASS="%s" *)\n' % mux_class)
 
@@ -412,16 +373,14 @@
 
         f.write('(* whitebox *)\n')
         f.write(
-            "module %s(%s);\n" %
-            (name_mux.upper(), ", ".join(module_args))
-        )
+            "module %s(%s);\n" % (name_mux.upper(), ", ".join(module_args)))
         previous_type = None
         for port in port_names:
             if previous_type != port.pin_type:
                 f.write("\n")
                 previous_type = port.pin_type
-            if (datatype == 'routing' and
-                    port.pin_type == mux_lib.MuxPinType.SELECT):
+            if (datatype == 'routing'
+                    and port.pin_type == mux_lib.MuxPinType.SELECT):
                 f.write('\tparameter MODE = "";\n')
             else:
                 f.write(port.getDefinition())
@@ -429,9 +388,7 @@
         f.write("\n")
         if data_width > 1:
             f.write('\tgenvar\tii;\n')
-            f.write(
-                '\tfor(ii=0; ii<%d; ii++) begin: bitmux\n' % (data_width)
-            )
+            f.write('\tfor(ii=0; ii<%d; ii++) begin: bitmux\n' % (data_width))
 
         if datatype == 'logic':
             f.write('\tMUX%s mux (\n' % width)
@@ -482,19 +439,18 @@
             f.write('\tgenerate\n')
             for i, mode in enumerate(modes):
                 f.write(
-                    '\t\t%s ( MODE == "%s" )\n' %
-                    (('if', 'else if')[i > 0], mode)
-                )
+                    '\t\t%s ( MODE == "%s" )\n' % (
+                        ('if', 'else if')[i > 0], mode))
                 f.write('\t\tbegin:SELECT_%s\n' % mode)
                 f.write('\t\t\tassign %s = %s;\n' % (outputs[0], mode))
                 f.write('\t\tend\n')
             f.write('\t\telse\n')
             f.write('\t\tbegin\n')
             f.write(
-                ('\t\t\t//$error("%s: Invalid routing value %%s ' +
-                    '(options are: %s)", MODE);\n')
-                % (name_mux, ", ".join(modes))
-            )
+                (
+                    '\t\t\t//$error("%s: Invalid routing value %%s ' +
+                    '(options are: %s)", MODE);\n') %
+                (name_mux, ", ".join(modes)))
             f.write('\t\tend\n')
             f.write('\tendgenerate\n')
 
@@ -532,14 +488,13 @@
                 ET.SubElement(
                     input_ports, 'port', {
                         'name':
-                            port.name,
+                        port.name,
                         'combinational_sink_ports':
-                            ' '.join(
-                                port.name for port in port_names if
-                                port.pin_type in (mux_lib.MuxPinType.OUTPUT, )
-                            ),
-                    }
-                )
+                        ' '.join(
+                            port.name
+                            for port in port_names
+                            if port.pin_type in (mux_lib.MuxPinType.OUTPUT, )),
+                    })
             elif port.pin_type in (mux_lib.MuxPinType.OUTPUT, ):
                 ET.SubElement(output_ports, 'port', {'name': port.name})
 
@@ -575,26 +530,27 @@
 def main(argv):
     args = parser.parse_args()
 
-    mux_gen(argv=argv,
-            width=args.width,
-            data_width=args.data_width,
-            datatype=args.type,
-            split_inputs=args.split_inputs,
-            split_selects=args.split_selects,
-            name_mux=args.name_mux,
-            name_input=args.name_input,
-            name_inputs=args.name_inputs,
-            name_output=args.name_output,
-            name_select=args.name_select,
-            name_selects=args.name_selects,
-            order=args.order,
-            outdir=args.outdir,
-            outfilename=args.outfilename,
-            comment=args.comment,
-            num_pb=args.num_pb,
-            subckt=args.subckt,
-            verbose=args.verbose,
-            )
+    mux_gen(
+        argv=argv,
+        width=args.width,
+        data_width=args.data_width,
+        datatype=args.type,
+        split_inputs=args.split_inputs,
+        split_selects=args.split_selects,
+        name_mux=args.name_mux,
+        name_input=args.name_input,
+        name_inputs=args.name_inputs,
+        name_output=args.name_output,
+        name_select=args.name_select,
+        name_selects=args.name_selects,
+        order=args.order,
+        outdir=args.outdir,
+        outfilename=args.outfilename,
+        comment=args.comment,
+        num_pb=args.num_pb,
+        subckt=args.subckt,
+        verbose=args.verbose,
+    )
 
 
 if __name__ == "__main__":
diff --git a/v2x/vlog_to_model.py b/v2x/vlog_to_model.py
index 88e99a8..98bc4ee 100755
--- a/v2x/vlog_to_model.py
+++ b/v2x/vlog_to_model.py
@@ -8,7 +8,6 @@
 # https://opensource.org/licenses/ISC
 #
 # SPDX-License-Identifier:	ISC
-
 """
 Convert a Verilog simulation model to a VPR `model.xml`
 
@@ -60,14 +59,10 @@
     -------
     is_clock_assoc: bool
     """
-    clock_assoc_signals = run.get_clock_assoc_signals(
-        infiles, module, clk
-    )
+    clock_assoc_signals = run.get_clock_assoc_signals(infiles, module, clk)
 
     if direction == "input":
-        assoc_outputs = run.get_related_output_for_input(
-            infiles, module, port
-        )
+        assoc_outputs = run.get_related_output_for_input(infiles, module, port)
         for out in assoc_outputs:
             if out in clock_assoc_signals:
                 return True
@@ -104,8 +99,9 @@
     # Check Yosys version
     pfx = run.determine_select_prefix()
     if pfx != "=":
-        print("ERROR The version of Yosys found is outdated and not supported"
-              " by V2X")
+        print(
+            "ERROR The version of Yosys found is outdated and not supported"
+            " by V2X")
         sys.exit(-1)
 
     iname = os.path.basename(infiles[0])
@@ -133,8 +129,7 @@
                 print(
                     """\
     ERROR file name not of format %.sim.v ({}), cannot detect top level.
-    Manually specify the top level module using --top"""
-                ).format(iname)
+    Manually specify the top level module using --top""").format(iname)
                 sys.exit(1)
 
     assert top is not None
@@ -143,8 +138,7 @@
         print(
             """\
     ERROR: more than one module in design, cannot detect top level.
-    Manually specify the top level module using --top"""
-        )
+    Manually specify the top level module using --top""")
         sys.exit(1)
 
     tmod = yj.top_module
@@ -173,19 +167,15 @@
             if wm:
                 model_path = "{}/{}.model.xml".format(
                     module_path,
-                    wm.group(1).lower()
-                )
+                    wm.group(1).lower())
             else:
                 assert False, "included Verilog file name {} does \
-                        not follow pattern %%.sim.v".format(
-                    module_basename
-                )
+                        not follow pattern %%.sim.v".format(module_basename)
             xmlinc.include_xml(
                 parent=models_xml,
                 href=model_path,
                 outfile=outfile,
-                xptr="xpointer(models/child::node())"
-            )
+                xptr="xpointer(models/child::node())")
     else:
         # Is a leaf model
         topname = tmod.attr("MODEL_NAME", top)
@@ -231,8 +221,7 @@
                 else:
                     clks = list()
                     for clk in clocks:
-                        if is_clock_assoc(
-                           infiles, top, clk, name, iodir):
+                        if is_clock_assoc(infiles, top, clk, name, iodir):
 
                             clks.append(clk)
                         if clks and int(port_attrs.get("NO_SEQ", 0)) == 0:
@@ -250,7 +239,7 @@
                                   in VPR models"
 
     if len(models_xml) == 0:
-        models_xml.insert(0,
-                          ET.Comment("this file is intentionally left blank"))
+        models_xml.insert(
+            0, ET.Comment("this file is intentionally left blank"))
 
     return ET.tostring(models_xml, pretty_print=True).decode('utf-8')
diff --git a/v2x/vlog_to_pbtype.py b/v2x/vlog_to_pbtype.py
index 94be02b..99bdb26 100755
--- a/v2x/vlog_to_pbtype.py
+++ b/v2x/vlog_to_pbtype.py
@@ -8,7 +8,6 @@
 # https://opensource.org/licenses/ISC
 #
 # SPDX-License-Identifier:	ISC
-
 """\
 Convert a Verilog simulation model to a VPR `pb_type.xml`
 
@@ -99,8 +98,8 @@
     normalized_name = pb_name.replace('.', '_')
     if index is not None:
         normalized_name = normalized_name.replace(
-            index.group(0), ""
-        ) + index.group(0).replace('[', '_').replace(']', '')
+            index.group(0), "") + index.group(0).replace('[', '_').replace(
+                ']', '')
 
     return normalized_name
 
@@ -124,8 +123,7 @@
 
 # $genblock$/vlog/tests/multiple_instance/multiple_instance.sim.v:12$64[57].\comb
 GENBLOCK_REGEX = re.compile(
-    "^\\$genblock\\$.*:[0-9]+\\$[0-9]+\\[(.*)\\]\\.\\\\(.*)"
-)
+    "^\\$genblock\\$.*:[0-9]+\\$[0-9]+\\[(.*)\\]\\.\\\\(.*)")
 
 
 def strip_name(name: str, include_index=True) -> str:
@@ -156,8 +154,8 @@
 
 
 def create_port(
-        dir_xml: ET.Element, cell_pin: CellPin, direction: str, metadata=None
-) -> ET.Element:
+        dir_xml: ET.Element, cell_pin: CellPin, direction: str,
+        metadata=None) -> ET.Element:
     cell_name, pin_name = cell_pin
     port = dict()
     port['name'] = pin_name
@@ -196,9 +194,7 @@
             assert avalue == dst[attr]
             raise ValueError(
                 '{} on net has value {} but pins have {}'.format(
-                    attr, dst[attr], avalue
-                )
-            )
+                    attr, dst[attr], avalue))
         dst[attr] = avalue
 
 
@@ -232,8 +228,8 @@
 
 
 def make_direct_conn(
-        ic_xml: ET.Element, driver: CellPin, sink: CellPin, path_attr: dict
-) -> ET.Element:
+        ic_xml: ET.Element, driver: CellPin, sink: CellPin,
+        path_attr: dict) -> ET.Element:
     dir_xml = ET.SubElement(ic_xml, 'direct')
     create_port(dir_xml, driver, "input")
     create_port(dir_xml, sink, "output")
@@ -244,8 +240,7 @@
             dir_xml, 'pack_pattern', {
                 'name': pack_name,
                 'type': 'pack'
-            }
-        )
+            })
         create_port(pp_xml, driver, "input")
         create_port(pp_xml, sink, "output")
 
@@ -255,8 +250,7 @@
             dir_xml, 'pack_pattern', {
                 'name': carry_name,
                 'type': 'carry'
-            }
-        )
+            })
         create_port(pp_xml, driver, "input")
         create_port(pp_xml, sink, "output")
 
@@ -265,19 +259,24 @@
 
 def make_mux_conn(
         ic_xml: ET.Element, mux_name: str, mux_inputs: Dict[CellPin, CellPin],
-        mux_outputs: Dict[CellPin, List[CellPin]]
-) -> ET.Element:
+        mux_outputs: Dict[CellPin, List[CellPin]]) -> ET.Element:
 
     mux_xml = ET.SubElement(ic_xml, "mux", {"name": mux_name})
 
     keys = sorted(list(mux_inputs.keys()))
-    for mux_input, driver in [(k, mux_inputs[k],) for k in keys]:
+    for mux_input, driver in [(
+            k,
+            mux_inputs[k],
+    ) for k in keys]:
         metadata = {'fasm_mux': '{}.{}'.format(mux_name, mux_input)}
         create_port(mux_xml, driver, "input", metadata=metadata)
 
     assert len(mux_outputs) == 1, mux_outputs
     keys = sorted(list(mux_outputs.keys()))
-    for mux_pin, sinks in [(k, mux_outputs[k],) for k in keys]:
+    for mux_pin, sinks in [(
+            k,
+            mux_outputs[k],
+    ) for k in keys]:
         assert len(sinks) == 1, sinks
         for sink_pin, path_attr in sinks:
             create_port(mux_xml, sink_pin, "output")
@@ -316,25 +315,20 @@
             drvs = mod.net_drivers(net)
             assert len(drvs) > 0, (
                 "ERROR: pin {}.{} has no driver, \
-                interconnect will be missing\n{}"
-                .format(cname, pin, mod)
-            )
+                interconnect will be missing\n{}".format(cname, pin, mod))
             assert len(drvs) < 2, (
                 "ERROR: pin {}.{} has multiple drivers, \
-                interconnect will be overspecified"
-                .format(cname, pin)
-            )
+                interconnect will be overspecified".format(cname, pin))
             for drv_cell, drv_pin in drvs:
                 net_attr = net_and_pin_attrs(
-                    yj, mod, (drv_cell, drv_pin), (pb_name, pin), net
-                )
+                    yj, mod, (drv_cell, drv_pin), (pb_name, pin), net)
 
                 drv_cell_name = strip_name(drv_cell)
                 assert drv_cell_name in valid_names
                 if drv_cell_name == mod_pname:
                     drv_cell_name = None
-                interconn[(drv_cell_name,
-                           drv_pin)].append(((pb_name, pin), net_attr))
+                interconn[(drv_cell_name, drv_pin)].append(
+                    ((pb_name, pin), net_attr))
 
         # Only consider outputs from cell to top level IO.
         # Inputs to other cells will be dealt with in those cells.
@@ -345,8 +339,7 @@
                 if sink_cell != mod.name:
                     continue
                 net_attr = net_and_pin_attrs(
-                    yj, mod, (pb_name, pin), (None, sink_pin), net
-                )
+                    yj, mod, (pb_name, pin), (None, sink_pin), net)
                 interconn[(pb_name, pin)].append(((None, sink_pin), net_attr))
 
     # Passthrough connections. Get ports along with connections
@@ -409,9 +402,21 @@
     interconn = {}
     for name, width, bits, iodir in mod.ports:
         if iodir == "input":
-            interconn[(None, name)] = [((mode_name, name,), {},)]
+            interconn[(None, name)] = [(
+                (
+                    mode_name,
+                    name,
+                ),
+                {},
+            )]
         else:
-            interconn[(mode_name, name)] = [((None, name,), {},)]
+            interconn[(mode_name, name)] = [(
+                (
+                    None,
+                    name,
+                ),
+                {},
+            )]
     return interconn
 
 
@@ -512,16 +517,14 @@
         return True
 
     assert '[' in v[0], "No index brackets found in item 0: {}\n{}".format(
-        v[0], v
-    )
+        v[0], v)
     list_name = v[0][:v[0].rfind('[')]
     sl = sorted(v, key=len)
     for i in range(0, len(v)):
         expected_item = "{}[{}]".format(list_name, i)
         assert expected_item == sl[
             i], "index {} expected: {} != actual: {}\n{}".format(
-                i, expected_item, sl[i], sl
-        )
+                i, expected_item, sl[i], sl)
     return list_name, len(v)
 
 
@@ -554,13 +557,11 @@
                 port_xml, 'pack_pattern', {
                     'name': carry_name,
                     'type': 'carry'
-                }
-            )
+                })
 
 
 def make_container_pb(
-        outfile, yj, mod, mod_pname, pb_type_xml, routing, children
-):
+        outfile, yj, mod, mod_pname, pb_type_xml, routing, children):
     # Containers have to include children
     # ------------------------------------------------------------
     for child_prefix, (child_type, children_names) in children.items():
@@ -598,8 +599,7 @@
             parent_xml.append(ET.Comment(comment_str))
 
         xmlinc.include_xml(
-            parent=parent_xml, href=pb_type_path, outfile=outfile, xptr=xptr
-        )
+            parent=parent_xml, href=pb_type_path, outfile=outfile, xptr=xptr)
 
     # Contains need interconnect to their children
     # ------------------------------------------------------------
@@ -631,8 +631,11 @@
         if driver_cell in routing_cells:
             continue
 
-        non_routing_sinks = [(sink, path_attr) for sink, path_attr in sinks
-                             if sink[0] not in routing_cells]
+        non_routing_sinks = [
+            (sink, path_attr)
+            for sink, path_attr in sinks
+            if sink[0] not in routing_cells
+        ]
 
         is_forking = len(non_routing_sinks) > 1
 
@@ -648,8 +651,7 @@
 
             make_direct_conn(
                 ic_xml, (normalize_pb_name(driver_cell), driver_pin),
-                (normalize_pb_name(sink_cell), sink_pin), attrs
-            )
+                (normalize_pb_name(sink_cell), sink_pin), attrs)
 
     # Generate the mux interconnects
     for mux_cell in routing_cells:
@@ -662,20 +664,17 @@
         assert len(mux_outputs) == 1, """\
 Mux {} has multiple outputs ({})!
 Currently muxes can only drive a single output.""".format(
-            mux_cell, ", ".join(mux_outputs.keys())
-        )
+            mux_cell, ", ".join(mux_outputs.keys()))
         for mux_output_pin, sinks in mux_outputs.items():
             assert len(sinks) == 1, """\
 Mux {}.{} has multiple outputs ({})!
 Currently muxes can only drive a single output.""".format(
-                mux_cell, mux_output_pin,
-                ", ".join("{}.{}".format(*pin) for pin, path_attr in sinks)
-            )
+                mux_cell, mux_output_pin, ", ".join(
+                    "{}.{}".format(*pin) for pin, path_attr in sinks))
             for (sink_cell, sink_pin), path_attr in sinks:
                 assert sink_cell not in routing_names, """\
 Mux {}.{} is trying to drive mux input pin {}.{}""".format(
-                    mux_cell, mux_output_pin, sink_cell, sink_pin
-                )
+                    mux_cell, mux_output_pin, sink_cell, sink_pin)
 
         mux_inputs = {}
         for (driver_cell, driver_pin), sinks in interconn.items():
@@ -690,8 +689,7 @@
 Pin {}.{} is trying to drive mux pin {}.{} (already driving by {}.{})\
                  """.format(
                     driver_cell, driver_pin, mux_cell, mux_pin,
-                    *mux_inputs[sink_pin]
-                )
+                    *mux_inputs[sink_pin])
                 mux_inputs[mux_pin] = (driver_cell, driver_pin)
 
         make_mux_conn(ic_xml, mux_cell, mux_inputs, mux_outputs)
@@ -744,8 +742,7 @@
                         "in_port": inport,
                         "out_port": port,
                         "max": str(atvalue)
-                    }
-                )
+                    })
             elif attr.startswith(dly_mat_prefix):
                 # Constant delay matrices
                 inp = attr[len(dly_mat_prefix):]
@@ -756,15 +753,18 @@
                         "in_port": inport,
                         "out_port": port,
                         "type": "max"
-                    }
-                )
+                    })
                 xml_mat.text = mat
 
 
 def make_pb_type(
-        infiles, outfile, yj, mod, mode_processing=False,
-        mode_xml=None, mode_name=None
-):
+        infiles,
+        outfile,
+        yj,
+        mod,
+        mode_processing=False,
+        mode_xml=None,
+        mode_name=None):
     """Build the pb_type for a given module. mod is the YosysModule object to
     generate."""
 
@@ -817,8 +817,7 @@
                 "num_pb": "1",
                 "name": mod_pname
             },
-            nsmap={'xi': xmlinc.xi_url}
-        )
+            nsmap={'xi': xmlinc.xi_url})
     else:
         pb_type_xml = ET.SubElement(
             mode_xml,
@@ -826,8 +825,7 @@
                 "num_pb": "1",
                 "name": mode_name
             },
-            nsmap={'xi': xmlinc.xi_url}
-        )
+            nsmap={'xi': xmlinc.xi_url})
 
     if 'blif_model' in pb_attrs:
         ET.SubElement(pb_type_xml, "blif_model",
@@ -874,9 +872,7 @@
                     flatten=False,
                     aig=False,
                     mode=smode,
-                    module_with_mode=mod.name
-                )
-            )
+                    module_with_mode=mod.name))
             mode_mod = mode_yj.module(mod.name)
 
             inter = {}
@@ -884,13 +880,13 @@
             # The mode has no children. Don't generate a pb_type then. Make
             # only the interconnect instead.
             if len(mode_mod.cells) == 0:
-                inter.update(get_interconnects(
-                    mode_yj, mode_mod, smode, [smode]))
+                inter.update(
+                    get_interconnects(mode_yj, mode_mod, smode, [smode]))
 
             # The mode has children, recurse
             else:
-                make_pb_type(infiles, outfile, mode_yj, mode_mod,
-                             True, mode_xml, smode)
+                make_pb_type(
+                    infiles, outfile, mode_yj, mode_mod, True, mode_xml, smode)
                 inter.update(mode_interconnects(mod, smode))
 
             # Add or update the interconnect.
@@ -901,9 +897,7 @@
             for (driv_cell, driv_pin), sinks in inter.items():
                 for (sink_cell, sink_pin), attrs in sinks:
                     make_direct_conn(
-                        ic_xml,
-                        (driv_cell, driv_pin),
-                        (sink_cell, sink_pin),
+                        ic_xml, (driv_cell, driv_pin), (sink_cell, sink_pin),
                         attrs)
 
     if not modes or mode_processing:
@@ -913,8 +907,7 @@
 
         if routing or children:
             make_container_pb(
-                outfile, yj, mod, mod_pname, pb_type_xml, routing, children
-            )
+                outfile, yj, mod, mod_pname, pb_type_xml, routing, children)
         else:
             make_leaf_pb(outfile, yj, mod, mod_pname, pb_type_xml)
 
@@ -926,8 +919,9 @@
     # Check Yosys version
     pfx = run.determine_select_prefix()
     if pfx != "=":
-        print("ERROR The version of Yosys found is outdated and not supported"
-              " by V2X")
+        print(
+            "ERROR The version of Yosys found is outdated and not supported"
+            " by V2X")
         sys.exit(-1)
 
     iname = os.path.basename(infiles[0])
@@ -946,9 +940,7 @@
             print(
                 "ERROR file name not of format %.sim.v ({}),"
                 " cannot detect top level. Manually specify"
-                " the top level module using --top".
-                format(iname)
-            )
+                " the top level module using --top".format(iname))
             sys.exit(1)
 
     top = top.upper()
@@ -958,8 +950,5 @@
     pb_type_xml = make_pb_type(infiles, outfile, yj, tmod)
 
     return ET.tostring(
-        pb_type_xml,
-        pretty_print=True,
-        encoding="utf-8",
-        xml_declaration=True
-    ).decode('utf-8')
+        pb_type_xml, pretty_print=True, encoding="utf-8",
+        xml_declaration=True).decode('utf-8')
diff --git a/v2x/yosys/json.py b/v2x/yosys/json.py
index b17ea1c..4159207 100755
--- a/v2x/yosys/json.py
+++ b/v2x/yosys/json.py
@@ -8,7 +8,6 @@
 # https://opensource.org/licenses/ISC
 #
 # SPDX-License-Identifier:	ISC
-
 """
 This is intended to provide a range of helper functions around the output of
 Yosys' `write_json`. Depending on the tasks, this may need to be flattened
@@ -28,8 +27,7 @@
 
     def __str__(self):
         return "YosysModule({},\n{})".format(
-            self.name, pprint.pformat(self.data)
-        )
+            self.name, pprint.pformat(self.data))
 
     @property
     def ports(self):
@@ -46,8 +44,7 @@
         plist = []
         for port, pdata in sorted(self.data["ports"].items()):
             plist.append(
-                (port, len(pdata["bits"]), pdata["bits"], pdata["direction"])
-            )
+                (port, len(pdata["bits"]), pdata["bits"], pdata["direction"]))
         return plist
 
     @property
@@ -90,8 +87,7 @@
     def nets(self):
         """List the net ids available in the design."""
         return list(
-            sorted(set(n['bits'][0] for n in self.data["netnames"].values()))
-        )
+            sorted(set(n['bits'][0] for n in self.data["netnames"].values())))
 
     def cell_type(self, cell):
         """Return the type of a given cell"""
@@ -240,8 +236,7 @@
                         conn_io.append(port)
                     else:
                         conn_io.append(
-                            "{}[{}]".format(port, pdata["bits"].index(net))
-                        )
+                            "{}[{}]".format(port, pdata["bits"].index(net)))
         return conn_io
 
     def conn_ports(self, net, pdir):
@@ -263,10 +258,8 @@
                         else:
                             conn_ports.append(
                                 (
-                                    cell,
-                                    "{}[{}]".format(port, condata.index(net))
-                                )
-                            )
+                                    cell, "{}[{}]".format(
+                                        port, condata.index(net))))
         return conn_ports
 
     def net_name(self, netid):
@@ -380,9 +373,7 @@
         if module not in self.data["modules"]:
             raise KeyError(
                 "No yosys module named {} (only have {})".format(
-                    module, self.data["modules"].keys()
-                )
-            )
+                    module, self.data["modules"].keys()))
         return YosysModule(module, self.data["modules"][module])
 
     def modules_with_attr(self, attr_name, attr_value):
diff --git a/v2x/yosys/run.py b/v2x/yosys/run.py
index 1a51dbd..92843a2 100755
--- a/v2x/yosys/run.py
+++ b/v2x/yosys/run.py
@@ -179,8 +179,7 @@
     infiles : list of input files
     """
     commands = "read_verilog {} {} {}; ".format(
-        get_defines(), get_includes(), " ".join(infiles)
-    ) + commands
+        get_defines(), get_includes(), " ".join(infiles)) + commands
     params = ["-p", commands]
     return get_output(params)
 
@@ -198,8 +197,7 @@
 
 
 def vlog_to_json(
-        infiles, flatten=False, aig=False, mode=None, module_with_mode=None
-):
+        infiles, flatten=False, aig=False, mode=None, module_with_mode=None):
     """
     Convert Verilog to a JSON representation using Yosys
 
@@ -309,8 +307,7 @@
     innet: Name of input net to find sinks of
     """
     return do_select(
-        infiles, module, "={} %co* =o:* %i ={} %d".format(innet, innet)
-    )
+        infiles, module, "={} %co* =o:* %i ={} %d".format(innet, innet))
 
 
 def list_clocks(infiles, module):
@@ -323,8 +320,7 @@
     """
     return do_select(
         infiles, module,
-        "=c:* %x:+[CLK]:+[clk]:+[clock]:+[CLOCK] =c:* %d =x:* %i"
-    )
+        "=c:* %x:+[CLK]:+[clk]:+[clock]:+[CLOCK] =c:* %d =x:* %i")
 
 
 def get_clock_assoc_signals(infiles, module, clk):
@@ -339,9 +335,7 @@
     return do_select(
         infiles, module,
         "select -list ={} %a %co* %x =i:* =o:* %u %i =a:ASSOC_CLOCK={} %u ={} "
-        "%d".
-        format(clk, clk, clk)
-    )
+        "%d".format(clk, clk, clk))
 
 
 # Find things which affect the given output
@@ -364,8 +358,7 @@
     clk: Name of clock to find associated signals
     """
     return do_select(
-        infiles, module, "select -list =w:*{} %a %co* =o:* %i".format(signal)
-    )
+        infiles, module, "select -list =w:*{} %a %co* =o:* %i".format(signal))
 
 
 def get_related_inputs_for_input(infiles, module, signal):
@@ -379,7 +372,6 @@
     """
     return [
         x for x in do_select(
-            infiles, module,
-            "select -list =w:*{} %a %co* %x =i:* %i".format(signal)
-        ) if x != signal
+            infiles, module, "select -list =w:*{} %a %co* %x =i:* %i".format(
+                signal)) if x != signal
     ]
