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