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