blob: 6c1387ae9a58361a8a915d9adb50eddc3d2e1bc0 [file] [log] [blame]
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()