--- /dev/null
+#!/usr/bin/env python3
+
+import re
+import sys
+
+if len(sys.argv) < 3:
+ print(f'usage: {sys.argv[0]:s} channels.txt dot_dir')
+ sys.exit(1)
+channels_txt = sys.argv[1]
+dot_dir = sys.argv[2]
+
+blocks = {}
+nets = {}
+channels = []
+with open(channels_txt) as fin:
+ line = fin.readline()
+ while len(line):
+ fields = line.split()
+ assert len(fields) == 7
+ channel = fields[0]
+ block = fields[1]
+ poly_net = fields[2]
+ n_diff_nets = int(fields[3])
+ x = float(fields[4])
+ y = float(fields[5])
+ mass = int(fields[6])
+ diff_nets = []
+ r_matrix = []
+ for i in range(n_diff_nets):
+ line = fin.readline()
+ assert len(line)
+ fields = line.split()
+ assert len(fields) == 1 + i
+ diff_nets.append(fields[0])
+ r_matrix.append([float(j) for j in fields[1:]])
+
+ if block not in blocks:
+ blocks[block] = []
+ blocks[block].append(len(channels))
+ channels.append(
+ (channel, block, poly_net, diff_nets, x, y, mass, r_matrix)
+ )
+
+ for net in set([poly_net] + diff_nets):
+ if net not in nets:
+ nets[net] = set() # blocks (of the channels) that the net visits
+ nets[net].add(block)
+
+ line = fin.readline()
+
+for block, block_channels in sorted(blocks.items()):
+ with open(f'{dot_dir:s}/{block:s}.dot', 'w') as fout:
+ fout.write(f'digraph "{block:s}" {{\n')
+
+ net_nodes = set()
+ for channel_no in block_channels:
+ channel, block, poly_net, diff_nets, x, y, mass, r_matrix = \
+ channels[channel_no]
+ label = channel
+ if len(r_matrix) == 2:
+ label += f'\nR={r_matrix[1][0]:.3f}'
+ else:
+ label += f'\nC={mass / 2e4:.3f}'
+ fout.write(f' "{channel:s}" [label="{label:s}"]\n')
+
+ def make_net_node(net):
+ if len(nets[net]) > 1:
+ # global net, make a new copy each time
+ net_node = f'{channel:s}:{net:s}'
+ shape = 'box'
+ else:
+ # local net, make a shared copy
+ net_node = net
+ shape = 'plaintext'
+ if net_node not in net_nodes:
+ net_nodes.add(net_node)
+ fout.write(f' "{net_node:s}" [shape={shape:s}, label="{net:s}"]\n')
+ return net_node
+
+ net_node = make_net_node(poly_net)
+ fout.write(f' "{net_node:s}" -> "{channel:s}"\n')
+
+ for diff_net in diff_nets:
+ net_node = make_net_node(diff_net)
+ fout.write(f' "{channel:s}" -> "{net_node:s}"\n')
+ fout.write('}\n')