Add /scripts/blocks.* to generate graphs of each block using dot (graphviz)
authorNick Downing <nick@ndcode.org>
Sat, 19 Jul 2025 14:43:28 +0000 (00:43 +1000)
committerNick Downing <nick@ndcode.org>
Sun, 20 Jul 2025 03:22:24 +0000 (13:22 +1000)
.gitignore
8085/Makefile
8085/node_names.txt
scripts/blocks.py [new file with mode: 0755]
scripts/blocks.sh [new file with mode: 0755]

index 23e43a5..abba946 100644 (file)
@@ -13,6 +13,7 @@
 /8085/buried.png
 /8085/channels.txt
 /8085/diff.png
+/8085/dot
 /8085/layers.png
 /8085/layers_rev.png
 /8085/metal.png
index b6e0938..bea3d48 100644 (file)
@@ -32,10 +32,10 @@ node_sizes.txt: nodes.txt
        ../scripts/node_sizes.py nodes.txt >$@
 
 node_gnd.png: nodes.txt
-       ../scripts/node_image.py --adjacency nodes.txt pad_GND $@ ${COLOURS}
+       ../scripts/node_image.py --adjacency nodes.txt GND $@ ${COLOURS}
 
 node_vcc.png: nodes.txt
-       ../scripts/node_image.py --adjacency nodes.txt pad_VCC $@ ${COLOURS}
+       ../scripts/node_image.py --adjacency nodes.txt VCC $@ ${COLOURS}
 
 node_phi0.png: nodes.txt
        ../scripts/node_image.py --adjacency nodes.txt 3_0455_4632 $@ ${COLOURS}
index 3921303..cf4e403 100644 (file)
 2_1702_0327 pad_AD6
 2_2033_6937 pad_RESET_OUT
 2_2046_0229 pad_AD7
-2_2507_0147 pad_GND
+2_2507_0147 GND # omit prefix for brevity
 2_2517_7052 pad_X2
 2_2839_7059 pad_X1
 2_2946_0292 pad_SUBSTRATE
-2_3232_6986 pad_VCC
+2_3232_6986 VCC # omit prefix for brevity
 2_3322_0333 pad_A8
 2_3595_0329 pad_A9
 2_3619_6926 pad_HOLD
diff --git a/scripts/blocks.py b/scripts/blocks.py
new file mode 100755 (executable)
index 0000000..958850a
--- /dev/null
@@ -0,0 +1,86 @@
+#!/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')
diff --git a/scripts/blocks.sh b/scripts/blocks.sh
new file mode 100755 (executable)
index 0000000..7c81bd7
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+rm -rf dot
+mkdir dot
+`dirname $0`/blocks.py channels.txt dot
+(
+  cd dot
+  for i in *.dot
+  do
+    dot -Tps -o `basename $i .dot`.ps $i
+  done
+)