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 7b78d4a..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,43 +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]
+                # 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
@@ -313,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)
 
@@ -324,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 = [
@@ -346,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')
@@ -366,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)
 
@@ -388,8 +351,7 @@
                     width,
                     '',
                     width,
-                )
-            )
+                ))
         f.write("\n")
         f.write('(* CLASS="%s" *)\n' % mux_class)
 
@@ -411,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())
@@ -428,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)
@@ -481,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')
 
@@ -531,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})
 
@@ -574,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
     ]
