text: from spinnman.messages.scp.abstract_messages.abstract_scp_response\
      import AbstractSCPResponse
  from spinnman.messages.scp.scp_result import SCPResult
  from spinnman.exceptions import SpinnmanUnexpectedResponseCodeException
  
  
  class SCPReadLinkResponse(AbstractSCPResponse):
      """ An SCP response to a request to read a region of memory via a link on\
          a chip
      """
  
      def __init__(self):
          """
          """
          super(SCPReadLinkResponse, self).__init__()
          self._data = None
          self._offset = None
          self._length = None
  
      def read_data_bytestring(self, data, offset):
          """ See\
              :py:meth:`spinnman.messages.scp.abstract_scp_response.AbstractSCPResponse.read_data_bytestring`
          """
          result = self.scp_response_header.result
          if result != SCPResult.RC_OK:
              raise SpinnmanUnexpectedResponseCodeException(
                  "ReadLink", "CMD_READ_LINK", result.name)
          self._data = data
          self._offset = offset
          self._length = len(data) - offset
  
      @property
      def data(self):
          """ The data read
  
          :rtype: bytearray
          """
          return self._data
  
      @property
      def offset(self):
          """ The offset where the valid data starts
  
          :rtype: int
          """
          return self._offset
  
      @property
      def length(self):
          """ The length of the valid data
  
          :rtype: int
          """
          return self._length
  