<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def set_power(self, state, cabinet, frame, board, delay=0.0, post_power_on_delay=5.0):
 """Control power to the SpiNNaker chips and FPGAs on a board. Returns ------- state : bool True for power on, False for power off. board : int or iterable Specifies the board to control the power of. This may also be an iterable of multiple boards (in the same frame). The command will actually be sent board 0, regardless of the set of boards specified. delay : float Number of seconds delay between power state changes of different boards. post_power_on_delay : float Number of seconds for this command to block once the power on command has been carried out. A short delay (default) is useful at this point since power-supplies and SpiNNaker chips may still be coming on line immediately after the power-on command is sent. .. warning:: If the set of boards to be powered-on does not include board 0, this timeout should be extended by 2-3 seconds. This is due to the fact that BMPs immediately acknowledge power-on commands to boards other than board 0 but wait for the FPGAs to be loaded before responding when board 0 is powered on. """

        if isinstance(board, int):
            boards = [board]
        else:
            boards = list(board)

        arg1 = int(delay * 1000) << 16 | (1 if state else 0)
        arg2 = sum(1 << b for b in boards)

        # Allow additional time for response when powering on (since FPGAs must
        # be loaded). Also, always send the command to board 0. This is
        # required by the BMPs which do not correctly handle the power-on
        # command being sent to anything but board 0. Though this is a bug in
        # the BMP firmware, it is considered sufficiently easy to work-around
        # that no fix is planned.
        self._send_scp(cabinet, frame, 0, SCPCommands.power,
                       arg1=arg1, arg2=arg2,
                       timeout=consts.BMP_POWER_ON_TIMEOUT if state else 0.0,
                       expected_args=0)
        if state:
            time.sleep(post_power_on_delay)