docs: def unpack_routing_table_entry(packed):
      """Unpack a routing table entry read from a SpiNNaker machine.
  
      Parameters
      ----------
      packet : :py:class:`bytes`
          Bytes containing a packed routing table.
  
      Returns
      -------
      (:py:class:`~rig.routing_table.RoutingTableEntry`, app_id, core) or None
          Tuple containing the routing entry, the app_id associated with the
          entry and the core number associated with the entry; or None if the
          routing table entry is flagged as unused.
      """
      # Unpack the routing table entry
      _, free, route, key, mask = struct.unpack(consts.RTE_PACK_STRING, packed)
  
      # If the top 8 bits of the route are set then this entry is not in use, so
      # return None.
      if route & 0xff000000 == 0xff000000:
          return None
  
      # Convert the routing table entry
      routes = {r for r in routing_table.Routes if (route >> r) & 0x1}
      rte = routing_table.RoutingTableEntry(routes, key, mask)
  
      # Convert the surrounding data
      app_id = free & 0xff
      core = (free >> 8) & 0x0f
  
      return (rte, app_id, core)