diff --git a/programmer/MANIFEST.in b/programmer/MANIFEST.in index a2068e8..b411759 100644 --- a/programmer/MANIFEST.in +++ b/programmer/MANIFEST.in @@ -4,6 +4,7 @@ include *.md # Include the license file include LICENSE +include *.py include *.sh include *.toml include .coveragerc diff --git a/programmer/check_doctests.py b/programmer/check_doctests.py new file mode 100755 index 0000000..3696011 --- /dev/null +++ b/programmer/check_doctests.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python +import doctest +import tinyprog +doctest.testmod(tinyprog) diff --git a/programmer/tinyprog/__init__.py b/programmer/tinyprog/__init__.py index 373451d..451e8de 100644 --- a/programmer/tinyprog/__init__.py +++ b/programmer/tinyprog/__init__.py @@ -33,10 +33,22 @@ def pretty_hex(data): - output = "" + """ + >>> print(pretty_hex("abc123")) + 61 62 63 31 32 33 + >>> print(pretty_hex(b"abc123")) + 61 62 63 31 32 33 + >>> print(pretty_hex(u"abc123")) + 61 62 63 31 32 33 + >>> print(pretty_hex("\\x00a\\x02"*12)) + 00 61 02 00 61 02 00 61 02 00 61 02 00 61 02 00 + 61 02 00 61 02 00 61 02 00 61 02 00 61 02 00 61 + 02 00 61 02 + """ + output = [] for i in range(0, len(data), 16): - output += " ".join(["%02x" % ord(x) for x in data[i:i + 16]]) + "\n" - return output + output.append(" ".join("%02x" % to_int(x) for x in data[i:i + 16])) + return "\n".join(output) def to_int(value): @@ -44,7 +56,7 @@ def to_int(value): >>> to_int('A') 65 >>> to_int(0xff) - 256 + 255 >>> list(to_int(i) for i in ['T', 'i', 'n', 'y', 0xff, 0, 0]) [84, 105, 110, 121, 255, 0, 0] """ @@ -71,7 +83,8 @@ def get_ports(device_id): try: ports += [ UsbPort(usb, d) - for d in usb.core.find(idVendor=vid, idProduct=pid, find_all=True) + for d in usb.core.find( + idVendor=vid, idProduct=pid, find_all=True) if not d.is_kernel_driver_active(1) ] except usb.core.USBError as e: @@ -90,6 +103,7 @@ def get_ports(device_id): class PortError(Exception): pass + class SerialPort(object): def __init__(self, port_name): self.port_name = port_name @@ -129,6 +143,7 @@ def read(self, length): except serial.SerialException as e: raise PortError("Failed to read from serial port:\n%s" % str(e)) + class UsbPort(object): def __init__(self, usb, device): self.usb = usb @@ -166,6 +181,7 @@ def read(self, length): except self.usb.core.USBError as e: raise PortError("Failed to read from USB:\n%s" % str(e)) + def _mirror_byte(b): return bit_reverse_table[to_int(b)] @@ -185,7 +201,11 @@ def __init__(self, prog): def _parse_json(self, data): try: - return json.loads(bytes(data).replace(b"\x00", b"").replace(b"\xff", b"").decode("utf-8")) + data = bytes(data) + data = data.replace(b"\x00", b"") + data = data.replace(b"\xff", b"") + data = data.decode("utf-8") + return json.loads(data) except BaseException: return None @@ -239,7 +259,8 @@ def userdata_addr_range(self): def _get_addr_range(self, name): # get the bootmeta's addrmap or fallback to the root's addrmap. - addr_map = self.root.get(u"bootmeta", {}).get(u"addrmap", self.root.get(u"addrmap", None)) + addr_map = self.root.get(u"bootmeta", {}).get( + u"addrmap", self.root.get(u"addrmap", None)) if addr_map is None: raise Exception("Missing address map from device metadata") addr_str = addr_map.get(name, None) diff --git a/programmer/tinyprog/__main__.py b/programmer/tinyprog/__main__.py index b10b04c..cf45634 100644 --- a/programmer/tinyprog/__main__.py +++ b/programmer/tinyprog/__main__.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python + +from __future__ import print_function + import sys import argparse import json @@ -355,7 +359,8 @@ def parse_int(str_value): if args.update_bootloader: boards_needing_update = ( - check_for_wrong_tinyfpga_bx_vidpid() + check_for_new_bootloader()) + check_for_wrong_tinyfpga_bx_vidpid() + + check_for_new_bootloader()) if len(boards_needing_update) == 0: print("""\ @@ -365,7 +370,8 @@ def parse_int(str_value): perform_bootloader_update(port) # program the flash memory - if (args.program is not None) or (args.program_userdata is not None) or ( + if (args.program is not None) or ( + args.program_userdata is not None) or ( args.program_image is not None): boot_fpga = False @@ -422,7 +428,8 @@ def progress(info): sys.exit(1) if check_if_overwrite_bootloader( - addr, len(bitstream), fpga.meta.userdata_addr_range()): + addr, len(bitstream), + fpga.meta.userdata_addr_range()): boot_fpga = True print(" Programming at addr {:06x}".format(addr)) if not fpga.program_bitstream(addr, bitstream): diff --git a/programmer/tox.ini b/programmer/tox.ini index 26f55f5..56c2f7c 100644 --- a/programmer/tox.ini +++ b/programmer/tox.ini @@ -16,11 +16,13 @@ commands = python setup.py --version check-manifest --ignore tox.ini,tinyprog/full_version.py python setup.py check -m -s - flake8 --exclude=data_tables.py setup.py tinyprog + python check_doctests.py + flake8 setup.py tinyprog python setup.py install tinyprog --help tinyprog --version [flake8] -exclude = .tox,*.egg,build,data +exclude = .tox,*.egg,build,data,data_tables.py select = E,W,F +ignore=W503