blob: 8885ab2d109d74ed99d637aed7fe4bfe64ff3d0c [file] [log] [blame]
from collections import namedtuple
WireInGrid = namedtuple('WireInGrid', 'tile grid_x grid_y wire')
Connection = namedtuple('Connection', 'wire_a wire_b')
class Connections(object):
def __init__(self, tilegrid, tileconn, tile_wires):
self.grid = tilegrid
self.tile_wires = tile_wires
self.coord_to_tile = {}
self.coord_to_tile_type = {}
for tile, tile_info in self.grid.items():
self.coord_to_tile[(tile_info['grid_x'],
tile_info['grid_y'])] = tile
self.coord_to_tile_type[(tile_info['grid_x'],
tile_info['grid_y'])] = tile_info['type']
# Make sure we have tile type info for every tile in the grid.
assert tile_info['type'] in self.tile_wires, (
tile_info['type'], self.tile_wires.keys())
self.potential_connections = {}
for conn in tileconn:
grid_deltas = conn['grid_deltas']
tile_types = conn['tile_types']
for pairs in conn['wire_pairs']:
key = (tile_types[0], pairs[0])
if key not in self.potential_connections:
self.potential_connections[key] = []
self.potential_connections[key].append(
(grid_deltas, tile_types[1], pairs[1]))
def all_possible_connections_from(self, wire_in_grid):
tile_type = self.coord_to_tile_type[(wire_in_grid.grid_x,
wire_in_grid.grid_y)]
key = (tile_type, wire_in_grid.wire)
if key not in self.potential_connections:
return
for relative_coord, target_tile_type, target_wire in (
self.potential_connections[key]):
rel_x, rel_y = relative_coord
target_coord = (wire_in_grid.grid_x + rel_x,
wire_in_grid.grid_y + rel_y)
if target_coord in self.coord_to_tile_type:
if self.coord_to_tile_type[target_coord] == target_tile_type:
yield Connection(
wire_in_grid,
WireInGrid(
tile=self.coord_to_tile[target_coord],
grid_x=target_coord[0],
grid_y=target_coord[1],
wire=target_wire))
def get_connections(self):
""" Yields Connection objects that represent all connections present in
the grid based on tileconn """
for tile, tile_info in self.grid.items():
for wire in self.tile_wires[tile_info['type']]:
wire_in_grid = WireInGrid(
tile=tile,
grid_x=tile_info['grid_x'],
grid_y=tile_info['grid_y'],
wire=wire)
for potential_connection in self.all_possible_connections_from(
wire_in_grid):
yield potential_connection