| import re | 
 | import sys | 
 |  | 
 |  | 
 | def main(): | 
 |     # Popping node CLBLM_R_X27Y37/CLBLM_M_AMUX (1923686) (cost: 0) | 
 |     POP_RE = re.compile( | 
 |         r'Popping node ([A-Za-z0-9_/]+) \([0-9]+\) \(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]+\) \(([^\)]+)\)(\*?)' | 
 |     ) | 
 |  | 
 |     print( | 
 |         """ | 
 | proc animate {idx node_length} { | 
 |     select_objects [get_nodes -of [get_wires [lindex $nodes $idx]]] | 
 |     set idx [expr $idx+1] | 
 |     if { $idx < $node_length } { | 
 |         after 100 [animate $idx $node_length] | 
 |     } | 
 | }""" | 
 |     ) | 
 |     print('set nodes {}') | 
 |  | 
 |     wires = [] | 
 |  | 
 |     final_route = [] | 
 |  | 
 |     for line in sys.stdin: | 
 |         m = POP_RE.search(line) | 
 |  | 
 |         if m: | 
 |             wires.append(m.group(1)) | 
 |  | 
 |         m = PIN_RE.search(line) | 
 |         if m: | 
 |             if m.group(3) == '*': | 
 |                 continue | 
 |  | 
 |             final_route.append((m.group(1), m.group(2))) | 
 |  | 
 |     assert final_route[0][1] == 'OPIN', final_route[0] | 
 |  | 
 |     for r in final_route[1:-1]: | 
 |         assert r[1] in ['CHANX', 'CHANY'], r | 
 |     assert final_route[-1][1] == 'IPIN', final_route[-1] | 
 |  | 
 |     print('unhighlight_objects') | 
 |  | 
 |     for idx, (wire, _) in enumerate(final_route): | 
 |         print( | 
 |             'highlight_objects -color_index {} [get_nodes -of [get_wires {}]]'. | 
 |             format((idx % 20) + 1, wire) | 
 |         ) | 
 |  | 
 |     for wire in wires: | 
 |         print('select_objects [get_nodes -of [get_wires {}]]'.format(wire)) | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |     main() |