Source code for spinnman.utilities.reports
# Copyright (c) 2014 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 io import TextIOBase
import logging
import os.path
import time
from typing import List
from spinn_utilities.log import FormatAdapter
from spinn_machine import Machine, Chip
from spinnman.connections.abstract_classes import Connection
logger = FormatAdapter(logging.getLogger(__name__))
_REPORT_NAME = "machine_structure.rpt"
[docs]
def generate_machine_report(
report_directory: str, machine: Machine,
connections: List[Connection]) -> None:
"""
Generate report on the physical structure of the target SpiNNaker machine.
:param str report_directory: the directory to which reports are stored
:param ~spinn_machine.Machine machine: the machine python object
:param list(Connection) connections:
the list of connections to the machine
:raise IOError: when a file cannot be opened for some reason
"""
file_name = os.path.join(report_directory, _REPORT_NAME)
time_date_string = time.strftime("%c")
try:
with open(file_name, "w", encoding="utf-8") as f:
_write_header(f, time_date_string, machine, connections)
# TODO: Add further details on the target machine.
for chip in machine.chips:
_write_chip_router_report(f, chip)
except IOError:
logger.exception(
"Generate_placement_reports: Can't open file {} for writing.",
file_name)
raise
def _write_header(f: TextIOBase, timestamp: str, machine: Machine,
connections: List[Connection]) -> None:
"""
:param str timestamp:
:param ~spinn_machine.Machine machine:
:param list(Connection) connections:
"""
f.write("\t\tTarget SpiNNaker Machine Structure\n")
f.write("\t\t==================================\n")
f.write(f"\nGenerated: {timestamp} for target machine '{connections}'\n\n")
f.write(f"Machine dimensions (in chips) x : {machine.width} "
f"y : {machine.height}\n\n")
f.write("\t\tMachine router information\n")
f.write("\t\t==========================\n")
def _write_chip_router_report(f: TextIOBase, chip: Chip) -> None:
"""
:param ~spinn_machine.Chip chip:
"""
f.write(f"\nInformation for chip {chip.x}:{chip.y}\n")
f.write("Neighbouring chips\n"
f"{chip.router.get_neighbouring_chips_coords()}\n")
f.write("Router list of links for this chip are: \n")
for link in chip.router.links:
f.write(f"\t{link}\n")
f.write("\t\t==========================\n")