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')
