| import argparse | |
| import sys | |
| import re | |
| import scipy.io as sio | |
| # Popping node CLBLL_L_X28Y15/CLBLL_LL_C (2993186) (cost: 4.59618e-13) | |
| POP_RE = re.compile( | |
| r'Popping node ([A-Za-z0-9_/]+) \(([0-9]+)\) \(cost: ([0-9+\-.e]+)\)' | |
| ) | |
| # Adding node 2993187 to heap from init route tree with cost 4.59618e-13 | |
| ADD_RE = re.compile( | |
| r'Adding node[ ]+([0-9]+) to heap from init route tree with cost ([0-9.e\-+])' | |
| ) | |
| # rt_node: CLBLM_R_X27Y37/CLBLM_M_AMUX (1923687) (OPIN) | |
| # rt_node: CLBLL_L_X38Y24/CLBLL_LL_C1 (3202101) (IPIN) | |
| PIN_RE = re.compile( | |
| r'rt_node: ([A-Za-z0-9_/]+) \(([0-9]+)\) \(([^\)]+)\)(\*?)' | |
| ) | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--outmat') | |
| args = parser.parse_args() | |
| final_route = [] | |
| pop_map = {} | |
| inode_cost = {} | |
| inode_names = {} | |
| pops = 0 | |
| for idx, l in enumerate(sys.stdin): | |
| m = POP_RE.search(l) | |
| if m is not None: | |
| pops += 1 | |
| inode = int(m.group(2)) | |
| if inode not in pop_map: | |
| pop_map[inode] = (idx + 1, pops) | |
| new_cost = float(m.group(3)) | |
| if new_cost < inode_cost.get(inode, float('inf')): | |
| inode_cost[inode] = new_cost | |
| m = PIN_RE.search(l) | |
| if m is not None: | |
| final_route.append(int(m.group(2))) | |
| inode_names[int(m.group(2))] = m.group(1) | |
| if args.outmat: | |
| mat_data = { | |
| 'final_route': final_route, | |
| 'pop_map_inodes': list(pop_map.keys()), | |
| 'inode_cost_inodes': list(inode_cost.keys()), | |
| 'inode_names_inodes': list(inode_names.keys()), | |
| } | |
| mat_data['pop_map'] = [ | |
| pop_map[inode] for inode in mat_data['pop_map_inodes'] | |
| ] | |
| mat_data['inode_cost'] = [ | |
| inode_cost[inode] for inode in mat_data['inode_cost_inodes'] | |
| ] | |
| mat_data['inode_names'] = [ | |
| inode_names[inode] for inode in mat_data['inode_names_inodes'] | |
| ] | |
| mat_data['route_pop'] = [ | |
| pop_map[inode] for inode in final_route if inode in pop_map | |
| ] | |
| mat_data['route_pop_inodes'] = [ | |
| inode for inode in final_route if inode in pop_map | |
| ] | |
| mat_data['route_cost'] = [ | |
| inode_cost[inode] for inode in final_route if inode in inode_cost | |
| ] | |
| mat_data['route_cost_inodes'] = [ | |
| inode for inode in final_route if inode in inode_cost | |
| ] | |
| sio.savemat(args.outmat, mat_data) | |
| else: | |
| for idx, inode in enumerate(final_route): | |
| if inode not in pop_map: | |
| pop_str = 'unknown' | |
| else: | |
| line, pop_count = pop_map[inode] | |
| pop_str = '{} ({} %) @ {}'.format( | |
| pop_count, 100. * float(pop_count) / pops, line | |
| ) | |
| print( | |
| '{}. {} "{}", cost = {}, first explored at pop {}'.format( | |
| idx + 1, inode, inode_names.get(inode, "N/A"), | |
| inode_cost.get(inode, 'N/A'), pop_str | |
| ) | |
| ) | |
| if __name__ == "__main__": | |
| main() |