blob: ab47e727f28998261a14e4fe03057746a06d8c64 [file] [log] [blame] [edit]
import capnp
import os.path
import numpy as np
# Remove magic import hook.
capnp.remove_import_hook()
def load_connection_box(schema_path, f_lookahead_map):
""" Read connection box delay map from provided file.close(
Arguments
---------
schema_path : str/Path-like
Path to schema directory containing connection_map.capnp
f_lookahead_map : file-like
Binary file-like that contains connection box delay map data.
"""
connection_map = capnp.load(
os.path.join(schema_path, 'connection_map.capnp')
)
return connection_map.VprCostMap.read(
f_lookahead_map, traversal_limit_in_words=1024 * 1024 * 1024
)
def iterate_connection_box(cost_map):
""" Iterate over connection boxes present in cost_map.
Yields
------
segment : int
Segment ID.
connection_box : int
Connection box ID.
offset : (int, int)
dx/dy value for first element of cost matrix.
m : Matrix capnp object
Cost matrix in capnp.
"""
assert cost_map.costMap.dims[0] == cost_map.offset.dims[0]
assert cost_map.costMap.dims[1] == cost_map.offset.dims[1]
nsegment = cost_map.costMap.dims[0]
nconnection_box = cost_map.costMap.dims[1]
m_itr = iter(cost_map.costMap.data)
offset_itr = iter(cost_map.offset.data)
for segment_idx in range(nsegment):
for connection_box_idx in range(nconnection_box):
m = next(m_itr).value
offset = next(offset_itr).value
x_off = offset.x
y_off = offset.y
yield segment_idx, connection_box_idx, (x_off, y_off), m
def connection_box_to_numpy(offset, m):
""" Convert connection box offset and matrix into numpy arrays.
Returns
-------
x : numpy.array of int
X coordinate suitable for mesh/surface plotting of delay data
y : numpy.array of int
Y coordinate suitable for mesh/surface plotting of delay data
delay : numpy.array of float
Delay matrix in seconds
congestion : numpy.array of float
Congestion matrix.
NOTE: First dimension is the y dimension, per numpy plotting convention.
"""
x_off, y_off = offset
assert len(m.dims) == 2
x_dim = m.dims[0]
y_dim = m.dims[1]
# generate 2 2d grids for the x & y bounds
y, x = np.mgrid[slice(y_off, y_off + y_dim), slice(x_off, x_off + x_dim)]
delay = np.zeros((y_dim, x_dim))
congestion = np.zeros((y_dim, x_dim))
fill = np.zeros((y_dim, x_dim))
itr = iter(m.data)
for x_idx in range(x_dim):
for y_idx in range(y_dim):
value = next(itr)
x_val = x_idx + x_off
y_val = y_idx + y_off
delay[y_idx][x_idx] = value.value.delay
congestion[y_idx][x_idx] = value.value.congestion
fill[y_idx][x_idx] = value.value.fill
assert x[y_idx][x_idx] == x_val
assert y[y_idx][x_idx] == y_val
return x, y, delay, congestion, fill