Source code for spinn_front_end_common.interface.buffer_management.storage_objects.channel_buffer_state
from spinn_front_end_common.utilities.constants import BUFFERING_OPERATIONS
import struct
[docs]class ChannelBufferState(object):
""" Stores information related to a single channel output\
buffering state, as it is retrieved at the end of a simulation on the\
SpiNNaker system.
"""
__slots__ = [
# start buffering area memory address (32 bits)
"_start_address",
# address where data was last written (32 bits)
"_current_write",
# address where the dma write got up to (32 bits)
"_current_dma_write",
# address where data was last read (32 bits)
"_current_read",
# The address of first byte after the buffer (32 bits)
"_end_address",
# The id of the region (8 bits)
"_region_id",
# True if the region overflowed during the simulation (8 bits)
"_missing_info",
# Last operation performed on the buffer - read or write (8 bits)
"_last_buffer_operation",
# bool check for if its extracted data from machine
"_update_completed",
]
# 4 for _start_address, 4 for _current_write, 4 for current_dma_write,
# 4 for _current_read, 4 for _end_address, 1 for _region_id,
# 1 for _missing_info, 1 for _last_buffer_operation,
ChannelBufferStateSize = 24
def __init__(
self, start_address, current_write, current_dma_write,
current_read, end_address, region_id, missing_info,
last_buffer_operation):
"""
:param start_address: start buffering area memory address (32 bits)
:param current_write: address where data was last written (32 bits)
:param current_read: address where data was last read (32 bits)
:param end_address: The address of first byte after the buffer\
(32 bits)
:param region_id: The id of the region (8 bits)
:param missing_info: True if the region overflowed during the\
simulation (8 bits)
:param last_buffer_operation: Last operation performed on the buffer\
- read or write (8 bits)
"""
self._start_address = start_address
self._current_write = current_write
self._current_dma_write = current_dma_write
self._current_read = current_read
self._end_address = end_address
self._region_id = region_id
self._missing_info = missing_info
self._last_buffer_operation = last_buffer_operation
self._update_completed = False
@property
def start_address(self):
return self._start_address
@property
def current_write(self):
return self._current_write
@property
def current_read(self):
return self._current_read
@property
def end_address(self):
return self._end_address
@property
def region_id(self):
return self._region_id
@property
def missing_info(self):
return self._missing_info
@property
def last_buffer_operation(self):
return self._last_buffer_operation
@property
def is_state_updated(self):
return self._update_completed
[docs] def update_last_operation(self, operation):
self._last_buffer_operation = operation
[docs] def update_read_pointer(self, read_ptr):
self._current_read = read_ptr
[docs] def set_update_completed(self):
self._update_completed = True
[docs] @staticmethod
def create_from_bytearray(data):
(start_address, current_write, current_dma_write, current_read,
end_address, region_id, missing_info, last_buffer_operation) = \
struct.unpack_from("<IIIIIBBBx", data)
if last_buffer_operation == 0:
last_buffer_operation = BUFFERING_OPERATIONS.BUFFER_READ.value
else:
last_buffer_operation = BUFFERING_OPERATIONS.BUFFER_WRITE.value
buffer_state = ChannelBufferState(
start_address, current_write, current_dma_write, current_read,
end_address, region_id, missing_info, last_buffer_operation)
return buffer_state
[docs] @staticmethod
def size_of_channel_state():
return ChannelBufferState.ChannelBufferStateSize