Source code for spinnman.model.p2p_table
import struct
from spinnman.model.enums import P2PTableRoute
[docs]class P2PTable(object):
""" Represents a P2P table read from the machine
"""
def __init__(self, width, height, column_data):
self._routes = dict()
self._width = width
self._height = height
for x in range(len(column_data)):
y = 0
pos = 0
while y < height:
(data, offset) = column_data[x]
next_word = struct.unpack_from(
"<I", data, offset + (pos * 4))[0]
pos += 1
for entry in range(min(8, height - y)):
route = P2PTableRoute((next_word >> (3 * entry)) & 0b111)
if route is not P2PTableRoute.NONE:
self._routes[x, y] = route
y += 1
[docs] @staticmethod
def get_n_column_bytes(height):
""" Get the number of bytes to be read for each column of the table
:param height: The height of the machine
"""
return ((height + 7) // 8) * 4
[docs] @staticmethod
def get_column_offset(column):
""" Get the offset of the next column in the table from the P2P base\
address
:param column: The column to be read
"""
return (((256 * column) // 8) * 4)
@property
def width(self):
""" The width of the machine that this table represents
"""
return self._width
@property
def height(self):
""" The height of the machine that this table represents
"""
return self._height
[docs] def iterchips(self):
""" Get an iterator of tuples of (x, y) coordinates in the table
"""
return self._routes.iterkeys()
[docs] def is_route(self, x, y):
""" Determines if there is a route in the P2P table to the given chip
:param x: The x-coordinate of the chip to look up
:param y: The y-coordinate of the chip to look up
"""
return (
(x, y) in self._routes and
self._routes[(x, y)] != P2PTableRoute.NONE)
[docs] def get_route(self, x, y):
""" Get the route to follow from this chip to the given chip
:param x: The x-coordinate of the chip to find the route to
:param y: The y-coordinate of the chip to find the route to
"""
if (x, y) in self._routes:
return self._routes[x, y]
return P2PTableRoute.NONE