| 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 |