From 0553eacea8f6ff9a76b8b2489262b9b20459cb08 Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Sun, 20 Jul 2025 00:43:28 +1000 Subject: [PATCH] Add /scripts/blocks.* to generate graphs of each block using dot (graphviz) --- .gitignore | 1 + 8085/Makefile | 4 +-- 8085/node_names.txt | 4 +-- scripts/blocks.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ scripts/blocks.sh | 11 ++++++ 5 files changed, 102 insertions(+), 4 deletions(-) create mode 100755 scripts/blocks.py create mode 100755 scripts/blocks.sh diff --git a/.gitignore b/.gitignore index 23e43a5..abba946 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/8085/Makefile b/8085/Makefile index b6e0938..bea3d48 100644 --- a/8085/Makefile +++ b/8085/Makefile @@ -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} diff --git a/8085/node_names.txt b/8085/node_names.txt index 3921303..cf4e403 100644 --- a/8085/node_names.txt +++ b/8085/node_names.txt @@ -188,11 +188,11 @@ 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 index 0000000..958850a --- /dev/null +++ b/scripts/blocks.py @@ -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 index 0000000..7c81bd7 --- /dev/null +++ b/scripts/blocks.sh @@ -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 +) -- 2.34.1