From 3a43e1b643ed7deacf7fb3b26454deebb3e50269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 5 Apr 2023 14:20:06 -0700 Subject: [PATCH] edtlib: make Range a type-annotated dataclass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Converting this to a dataclass will make it easier to type annotate. Adding type annotations is incremental progress towards type checking the entire module. Signed-off-by: Martí Bolívar --- .../src/devicetree/edtlib.py | 54 ++++++------- .../python-devicetree/tests/test_edtlib.py | 78 ++++++++++++++----- 2 files changed, 80 insertions(+), 52 deletions(-) diff --git a/scripts/dts/python-devicetree/src/devicetree/edtlib.py b/scripts/dts/python-devicetree/src/devicetree/edtlib.py index 2b0c52d42fac..55c831c1f90b 100644 --- a/scripts/dts/python-devicetree/src/devicetree/edtlib.py +++ b/scripts/dts/python-devicetree/src/devicetree/edtlib.py @@ -730,6 +730,7 @@ class Register: size: Optional[int] +@dataclass class Range: """ Represents a translation range on a node as described by the 'ranges' property. @@ -761,23 +762,13 @@ class Range: The size of the range in the child address space, or None if the child's #size-cells equals 0. """ - def __repr__(self): - fields = [] - - if self.child_bus_cells is not None: - fields.append("child-bus-cells: " + hex(self.child_bus_cells)) - if self.child_bus_addr is not None: - fields.append("child-bus-addr: " + hex(self.child_bus_addr)) - if self.parent_bus_cells is not None: - fields.append("parent-bus-cells: " + hex(self.parent_bus_cells)) - if self.parent_bus_addr is not None: - fields.append("parent-bus-addr: " + hex(self.parent_bus_addr)) - if self.length_cells is not None: - fields.append("length-cells " + hex(self.length_cells)) - if self.length is not None: - fields.append("length " + hex(self.length)) - - return "".format(", ".join(fields)) + node: 'Node' + child_bus_cells: int + child_bus_addr: Optional[int] + parent_bus_cells: int + parent_bus_addr: Optional[int] + length_cells: int + length: Optional[int] class ControllerAndData: @@ -1565,27 +1556,28 @@ def _init_ranges(self): f"(= {parent_address_cells}) + " f"<#size-cells> (= {child_size_cells}))"): - range = Range() - range.node = self - range.child_bus_cells = child_address_cells + child_bus_cells = child_address_cells if child_address_cells == 0: - range.child_bus_addr = None + child_bus_addr = None else: - range.child_bus_addr = to_num(raw_range[:4*child_address_cells]) - range.parent_bus_cells = parent_address_cells + child_bus_addr = to_num(raw_range[:4*child_address_cells]) + parent_bus_cells = parent_address_cells if parent_address_cells == 0: - range.parent_bus_addr = None + parent_bus_addr = None else: - range.parent_bus_addr = to_num(raw_range[(4*child_address_cells):\ - (4*child_address_cells + 4*parent_address_cells)]) - range.length_cells = child_size_cells + parent_bus_addr = to_num( + raw_range[(4*child_address_cells): + (4*child_address_cells + 4*parent_address_cells)]) + length_cells = child_size_cells if child_size_cells == 0: - range.length = None + length = None else: - range.length = to_num(raw_range[(4*child_address_cells + \ - 4*parent_address_cells):]) + length = to_num( + raw_range[(4*child_address_cells + 4*parent_address_cells):]) - self.ranges.append(range) + self.ranges.append(Range(self, child_bus_cells, child_bus_addr, + parent_bus_cells, parent_bus_addr, + length_cells, length)) def _init_regs(self): # Initializes self.regs diff --git a/scripts/dts/python-devicetree/tests/test_edtlib.py b/scripts/dts/python-devicetree/tests/test_edtlib.py index 0e55eb802ea4..5292835bb237 100644 --- a/scripts/dts/python-devicetree/tests/test_edtlib.py +++ b/scripts/dts/python-devicetree/tests/test_edtlib.py @@ -84,37 +84,73 @@ def test_ranges(): with from_here(): edt = edtlib.EDT("test.dts", ["test-bindings"]) - assert str(edt.get_node("/reg-ranges/parent").ranges) == \ - "[, , ]" + node = edt.get_node("/reg-ranges/parent") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x1, parent_bus_cells=0x2, parent_bus_addr=0xa0000000b, length_cells=0x1, length=0x1), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x2, parent_bus_cells=0x2, parent_bus_addr=0xc0000000d, length_cells=0x1, length=0x2), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x4, parent_bus_cells=0x2, parent_bus_addr=0xe0000000f, length_cells=0x1, length=0x1) + ] - assert str(edt.get_node("/reg-nested-ranges/grandparent").ranges) == \ - "[]" + node = edt.get_node("/reg-nested-ranges/grandparent") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0x0, parent_bus_cells=0x3, parent_bus_addr=0x30000000000000000, length_cells=0x2, length=0x200000002) + ] - assert str(edt.get_node("/reg-nested-ranges/grandparent/parent").ranges) == \ - "[]" + node = edt.get_node("/reg-nested-ranges/grandparent/parent") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x0, parent_bus_cells=0x2, parent_bus_addr=0x200000000, length_cells=0x1, length=0x2) + ] - assert str(edt.get_node("/ranges-zero-cells/node").ranges) == "[]" + assert edt.get_node("/ranges-zero-cells/node").ranges == [] - assert str(edt.get_node("/ranges-zero-parent-cells/node").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-zero-parent-cells/node") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0xa, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x0, length=None), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x1a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x0, length=None), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x2a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x0, length=None) + ] - assert str(edt.get_node("/ranges-one-address-cells/node").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-one-address-cells/node") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0xa, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x1, length=0xb), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x1a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x1, length=0x1b), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x2a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x1, length=0x2b) + ] - assert str(edt.get_node("/ranges-one-address-two-size-cells/node").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-one-address-two-size-cells/node") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0xa, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x2, length=0xb0000000c), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x1a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x2, length=0x1b0000001c), + edtlib.Range(node=node, child_bus_cells=0x1, child_bus_addr=0x2a, parent_bus_cells=0x0, parent_bus_addr=None, length_cells=0x2, length=0x2b0000002c) + ] - assert str(edt.get_node("/ranges-two-address-cells/node@1").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-two-address-cells/node@1") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0xa0000000b, parent_bus_cells=0x1, parent_bus_addr=0xc, length_cells=0x1, length=0xd), + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0x1a0000001b, parent_bus_cells=0x1, parent_bus_addr=0x1c, length_cells=0x1, length=0x1d), + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0x2a0000002b, parent_bus_cells=0x1, parent_bus_addr=0x2c, length_cells=0x1, length=0x2d) + ] - assert str(edt.get_node("/ranges-two-address-two-size-cells/node@1").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-two-address-two-size-cells/node@1") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0xa0000000b, parent_bus_cells=0x1, parent_bus_addr=0xc, length_cells=0x2, length=0xd0000000e), + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0x1a0000001b, parent_bus_cells=0x1, parent_bus_addr=0x1c, length_cells=0x2, length=0x1d0000001e), + edtlib.Range(node=node, child_bus_cells=0x2, child_bus_addr=0x2a0000002b, parent_bus_cells=0x1, parent_bus_addr=0x2c, length_cells=0x2, length=0x2d0000001d) + ] - assert str(edt.get_node("/ranges-three-address-cells/node@1").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-three-address-cells/node@1") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0xa0000000b0000000c, parent_bus_cells=0x2, parent_bus_addr=0xd0000000e, length_cells=0x1, length=0xf), + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0x1a0000001b0000001c, parent_bus_cells=0x2, parent_bus_addr=0x1d0000001e, length_cells=0x1, length=0x1f), + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0x2a0000002b0000002c, parent_bus_cells=0x2, parent_bus_addr=0x2d0000002e, length_cells=0x1, length=0x2f) + ] - assert str(edt.get_node("/ranges-three-address-two-size-cells/node@1").ranges) == \ - "[, , ]" + node = edt.get_node("/ranges-three-address-two-size-cells/node@1") + assert node.ranges == [ + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0xa0000000b0000000c, parent_bus_cells=0x2, parent_bus_addr=0xd0000000e, length_cells=0x2, length=0xf00000010), + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0x1a0000001b0000001c, parent_bus_cells=0x2, parent_bus_addr=0x1d0000001e, length_cells=0x2, length=0x1f00000110), + edtlib.Range(node=node, child_bus_cells=0x3, child_bus_addr=0x2a0000002b0000002c, parent_bus_cells=0x2, parent_bus_addr=0x2d0000002e, length_cells=0x2, length=0x2f00000210) + ] def test_reg(): '''Tests for the regs property'''