Source code for pacman.operations.routing_table_generators.basic_routing_table_generator
# Copyright (c) 2016 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 spinn_utilities.progress_bar import ProgressBar
from spinn_machine import MulticastRoutingEntry
from pacman.data import PacmanDataView
from pacman.model.routing_tables import (
UnCompressedMulticastRoutingTable, MulticastRoutingTables)
[docs]def basic_routing_table_generator():
"""
An basic algorithm that can produce routing tables.
:rtype: MulticastRoutingTables
"""
routing_infos = PacmanDataView.get_routing_infos()
routing_table_by_partitions = (
PacmanDataView.get_routing_table_by_partition())
progress = ProgressBar(
routing_table_by_partitions.n_routers, "Generating routing tables")
routing_tables = MulticastRoutingTables()
for x, y in progress.over(routing_table_by_partitions.get_routers()):
parts = routing_table_by_partitions.get_entries_for_router(x, y)
routing_tables.add_routing_table(__create_routing_table(
x, y, parts, routing_infos))
return routing_tables
def __create_routing_table(x, y, partitions_in_table, routing_infos):
"""
:param int x:
:param int y:
:param partitions_in_table:
:type partitions_in_table:
dict(((ApplicationVertex or MachineVertex), str),
MulticastRoutingTableByPartitionEntry)
:param RoutingInfo routing_infos:
:rtype: MulticastRoutingTable
"""
table = UnCompressedMulticastRoutingTable(x, y)
for source_vertex, partition_id in partitions_in_table:
r_info = routing_infos.get_routing_info_from_pre_vertex(
source_vertex, partition_id)
entry = partitions_in_table[source_vertex, partition_id]
table.add_multicast_routing_entry(
__create_entry(r_info.key_and_mask, entry))
return table
def __create_entry(key_and_mask, entry):
"""
:param BaseKeyAndMask key_and_mask:
:param MulticastRoutingTableByPartitionEntry entry:
:rtype: MulticastRoutingEntry
"""
return MulticastRoutingEntry(
routing_entry_key=key_and_mask.key_combo,
defaultable=entry.defaultable, mask=key_and_mask.mask,
link_ids=entry.link_ids, processor_ids=entry.processor_ids)