Source code for spinnman.utilities.io.abstract_io
# Copyright (c) 2017-2019 The University of Manchester
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
from abc import (ABCMeta, abstractmethod, abstractproperty)
from six import add_metaclass
from spinnman.processes.fill_process import FillDataType
[docs]@add_metaclass(ABCMeta)
class AbstractIO(object):
__slots__ = []
@abstractmethod
def __len__(self):
""" The size of the entire region of memory
"""
@abstractmethod
def __getitem__(self, new_slice):
""" Get a sub-region of this memory object. The index or slice must\
be in range of the current region to be valid.
:param new_slice:\
A single index for a single byte of memory, or a contiguous slice
:rtype: :py:class:`~MemoryIO`
:raise ValueError:\
If the index or slice is outside of the current region
"""
@abstractmethod
def __enter__(self):
""" Enter a new block which will call :py:meth:`~.close` when exited.
"""
@abstractmethod
def __exit__(self, exception_type, exception_value, traceback):
""" Exit a block and call :py:meth:`~.close`.
"""
[docs] @abstractmethod
def close(self):
""" Close the IO object
"""
@abstractproperty
def closed(self):
""" Indicates if the object has been closed
"""
[docs] @abstractmethod
def flush(self):
""" Flush any outstanding written data
"""
[docs] @abstractmethod
def seek(self, n_bytes, from_what=os.SEEK_SET):
""" Seek to a position within the region
"""
[docs] @abstractmethod
def tell(self):
""" Return the current position within the region relative to the start
"""
@abstractproperty
def address(self):
""" Return the current absolute address within the region
"""
[docs] @abstractmethod
def read(self, n_bytes=None):
""" Read a number of bytes, or the rest of the data if n_bytes is None\
or negative
:param n_bytes: The number of bytes to read
:rtype: bytes
:raise EOFError: If the read will be beyond the end of the region
"""
[docs] @abstractmethod
def write(self, data):
""" Write some data to the region
:param data: The data to write
:type data: bytes
:return: The number of bytes written
:rtype: int
:raise EOFError: If the write will go over the end of the region
"""
[docs] @abstractmethod
def fill(
self, repeat_value, bytes_to_fill=None,
data_type=FillDataType.WORD):
""" Fill the next part of the region with repeated data
:param repeat_value: The value to repeat
:type repeat_value: int
:param bytes_to_fill:\
Optional number of bytes to fill from current position, or None\
to fill to the end
:type bytes_to_fill: int
:param data_type: The type of the repeat value
:type data_type: :py:class:`spinnman.process.fill_process.FillDataType`
:raise EOFError: If the amount of data to fill is more than the region
"""