<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def spinn5_eth_coords(width, height, root_x=0, root_y=0):
 """Generate a list of board coordinates with Ethernet connectivity in a SpiNNaker machine. Specifically, generates the coordinates for the Ethernet connected chips of SpiNN-5 boards arranged in a standard torus topology. .. warning:: In general, applications should use :py:class:`rig.machine_control.MachineController.get_system_info` and :py:meth:`~rig.machine_control.machine_controller.SystemInfo.ethernet_connected_chips` to gather the coordinates of Ethernet connected chips which are actually functioning. For example:: >> from rig.machine_control import MachineController >> mc = MachineController("my-machine") >> si = mc.get_system_info() >> print(list(si.ethernet_connected_chips())) [((0, 0), "1.2.3.4"), ((4, 8), "1.2.3.5"), ((8, 4), "1.2.3.6")] Parameters width, height : int Width and height of the system in chips. root_x, root_y : int The coordinates of the root chip (i.e. the chip used to boot the machine), e.g. from :py:attr:`rig.machine_control.MachineController.root_chip`. """

    # In oddly-shaped machines where chip (0, 0) does not exist, we must offset
    # the coordinates returned in accordance with the root chip's location.
    root_x %= 12
    root_x %= 12

    # Internally, work with the width and height rounded up to the next
    # multiple of 12
    w = ((width + 11) // 12) * 12
    h = ((height + 11) // 12) * 12

    for x in range(0, w, 12):
        for y in range(0, h, 12):
            for dx, dy in ((0, 0), (4, 8), (8, 4)):
                nx = (x + dx + root_x) % w
                ny = (y + dy + root_y) % h
                # Skip points which are outside the range available
                if nx < width and ny < height:
                    yield (nx, ny)