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`.
    """
    root_x %= 12
    root_x %= 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
                if nx < width and ny < height:
                    yield nx, ny
