Source code for spinnman.messages.scp.impl.app_copy_run
# Copyright (c) 2017 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from spinn_utilities.overrides import overrides
from spinnman.exceptions import SpinnmanInvalidParameterException
from spinnman.messages.scp import SCPRequestHeader
from spinnman.messages.scp.abstract_messages import AbstractSCPRequest
from spinnman.messages.scp.enums import SCPCommand
from spinnman.messages.sdp import SDPFlag, SDPHeader
from spinnman.messages.scp.impl.check_ok_response import CheckOKResponse
_WAIT_FLAG = 0x1 << 18
[docs]class AppCopyRun(AbstractSCPRequest):
"""
An SCP request to copy an application and start it.
"""
__slots__ = ["__link"]
def __init__(self, x, y, link, size, app_id, processors, chksum,
wait=False):
"""
:param int x:
The x-coordinate of the chip to read from, between 0 and 255
:param int y:
The y-coordinate of the chip to read from, between 0 and 255
:param int link: The ID of the link from which to copy
:param int size: The number of bytes to read, must be divisible by 4
:param int app_id: The app to associate the copied binary with
:param list(int) processors: The processors to start on the chip
:param int chksum: The checksum of the data to copy
:param bool wait: Whether to start in wait mode or not
"""
# pylint: disable=too-many-arguments
if size % 4 != 0:
raise SpinnmanInvalidParameterException(
"size", size, "The size must be a multiple of 4")
processor_mask = 0
if processors is not None:
for processor in processors:
processor_mask |= (1 << processor)
processor_mask |= (app_id << 24)
if wait:
processor_mask |= _WAIT_FLAG
self.__link = link
arg1 = ((chksum & 0x1FFFFFFF) << 3) | link
super().__init__(
SDPHeader(
flags=SDPFlag.REPLY_EXPECTED, destination_port=0,
destination_cpu=0, destination_chip_x=x,
destination_chip_y=y),
SCPRequestHeader(command=SCPCommand.CMD_APP_COPY_RUN),
argument_1=arg1, argument_2=size, argument_3=processor_mask)
def __repr__(self):
return f"{super(AppCopyRun, self).__repr__()} (Link {self.__link})"
[docs] @overrides(AbstractSCPRequest.get_scp_response)
def get_scp_response(self):
return CheckOKResponse(
f"Application Copy Run (Link {self.__link})",
SCPCommand.CMD_APP_COPY_RUN)