def cyclic_xranges(start_time, duration, cycle_time):
    """
    Where a range crosses the cycle time boundary, split into 2 ranges.

    Parameters
    ----------
    start_time: float
    duration: float
    cycle_time: float

    Returns
    -------
    list
        List of operation time ranges.
    """
    if 0 <= start_time < cycle_time:
        if start_time + duration > cycle_time:
            return [
                (0, duration - (cycle_time - start_time)),
                (start_time, cycle_time - start_time),
            ]
        return [(start_time, duration)]
    raise ValueError("start time out of range")