From 70b53794105a5c7bc3ddba1712f471dd01a81dfe Mon Sep 17 00:00:00 2001 From: Nick Downing Date: Sat, 19 Jul 2025 12:05:51 +1000 Subject: [PATCH] Add /8085/blocks.png which manually separates the chip into any obvious blocks, change /conn_matrix.txt and /Makefile to include blocks.png in the analysis (it will generate reports to indicate the association between channels and blocks) --- .gitignore | 14 +++++++++++- 8085/Makefile | 50 ++++++++++++++++++++++++++++++++++--------- 8085/blocks.png | Bin 0 -> 20137 bytes 8085/conn_matrix.txt | 24 +++++++++++---------- scripts/is_colour.py | 29 +++++++++++++++++++++++++ scripts/to_mono.py | 2 ++ 6 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 8085/blocks.png create mode 100755 scripts/is_colour.py diff --git a/.gitignore b/.gitignore index 65ab88e..8d92249 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,19 @@ /8080/channels.txt /8080/nets.txt /8080/sizes.txt -/8085/*.png +/8085/buried.png +/8085/diff.png +/8085/layers.png +/8085/layers_rev.png +/8085/metal.png +/8085/net_gnd.png +/8085/net_phi0.png +/8085/net_phi1.png +/8085/net_vcc.png +/8085/pads.png +/8085/poly.png +/8085/split_diff.png +/8085/vias.png /8085/channels.txt /8085/nets.txt /8085/sizes.txt diff --git a/8085/Makefile b/8085/Makefile index 02af468..7273d05 100644 --- a/8085/Makefile +++ b/8085/Makefile @@ -1,3 +1,14 @@ +# colour assignment: +# 0: black, empty +# 1: blue, metal +# 2: cyan, channel +# 3: green, poly +# 4: red, diff +# 5: magenta, blocks + pads +# 6: yellow, buried +# 7: white, vias +COLOURS=0,0,5,1,2,4,6,3,7 + all: \ channels.txt \ sizes.txt \ @@ -15,49 +26,52 @@ layers_rev.png #vias2.png channels.txt: nets.txt - ../scripts/net_channels.py nets.txt 3,4,5,6 >$@ + ../scripts/net_channels.py nets.txt 4,5,6,7 >$@ sizes.txt: nets.txt ../scripts/net_sizes.py nets.txt >$@ net_gnd.png: nets.txt - ../scripts/net_image.py --adjacency nets.txt 4036 $@ 0,5,1,2,4,6,3,7 + ../scripts/net_image.py --adjacency nets.txt 4036 $@ ${COLOURS} net_vcc.png: nets.txt - ../scripts/net_image.py --adjacency nets.txt 5091 $@ 0,5,1,2,4,6,3,7 + ../scripts/net_image.py --adjacency nets.txt 5091 $@ ${COLOURS} net_phi0.png: nets.txt - ../scripts/net_image.py --adjacency nets.txt 23254 $@ 0,5,1,2,4,6,3,7 + ../scripts/net_image.py --adjacency nets.txt 109896 $@ ${COLOURS} net_phi1.png: nets.txt - ../scripts/net_image.py --adjacency nets.txt 17568 $@ 0,5,1,2,4,6,3,7 + ../scripts/net_image.py --adjacency nets.txt 104210 $@ ${COLOURS} nets.txt: \ pads.png \ +blocks.png \ metal.png \ poly.png \ split_diff.png \ vias.png \ conn_matrix.txt - ../scripts/image_nets.py pads.png,metal.png,poly.png,split_diff.png,vias.png conn_matrix.txt $@ + ../scripts/image_nets.py pads.png,blocks.png,metal.png,poly.png,split_diff.png,vias.png conn_matrix.txt $@ # this one follows same layering as nets.txt and we can't see pads layer layers.png: \ pads.png \ +blocks.png \ metal.png \ poly.png \ split_diff.png \ vias.png - ../scripts/image_layers.py pads.png,metal.png,poly.png,split_diff.png,vias.png $@ 0,5,1,2,4,6,3,7 + ../scripts/image_layers.py pads.png,blocks.png,metal.png,poly.png,split_diff.png,vias.png $@ ${COLOURS} -# this one has alternative layering and allows us to see pads layer +# this one has alternative layering and allows us to see pads and metal layers layers_rev.png: \ +blocks.png \ poly.png \ split_diff.png \ metal.png \ vias.png \ pads.png - ../scripts/image_layers.py poly.png,split_diff.png,metal.png,vias.png,pads.png $@ 0,2,4,6,3,1,7,5 + ../scripts/image_layers.py blocks.png,poly.png,split_diff.png,metal.png,vias.png,pads.png $@ 0,5,2,4,6,3,1,7,5 split_diff.png: diff.png poly.png buried.png ../scripts/image_stack.py diff.png,poly.png,buried.png $@ 0,1,0,3,0,1,0,2 @@ -117,4 +131,20 @@ vias2.png: vias1.png ../scripts/boolean.py 'vias.png^vias1.png' $@ clean: - rm -f *.png channels.txt sizes.txt nets.txt + rm -f \ +buried.png \ +diff.png \ +layers.png \ +layers_rev.png \ +metal.png \ +net_gnd.png \ +net_phi0.png \ +net_phi1.png \ +net_vcc.png \ +pads.png \ +poly.png \ +split_diff.png \ +vias.png \ +channels.txt \ +sizes.txt \ +nets.txt diff --git a/8085/blocks.png b/8085/blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6902e1a4ec419c6d4cac1b73686eb5f82094a5 GIT binary patch literal 20137 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 literal 0 HcmV?d00001 diff --git a/8085/conn_matrix.txt b/8085/conn_matrix.txt index c1dcf1f..7b542c7 100644 --- a/8085/conn_matrix.txt +++ b/8085/conn_matrix.txt @@ -1,16 +1,18 @@ # 0: empty # 1: pads -- merge if touches metal -# 2: metal -- merge if touches vias -# 3: poly -- merge if touches vias or buried, report if touches channel -# 4: diff -- merge if touches vias or buried, report if touches channel -# 5: buried (diff) -- report if touches channel, cannot touch vias -# 6: channel (diff) -- cannot touch vias -# 7: vias +# 2: blocks -- report if touches channel +# 3: metal -- merge if touches vias +# 4: poly -- merge if touches vias or buried, report if touches channel +# 5: diff -- merge if touches vias or buried, report if touches channel +# 6: buried (diff) -- report if touches channel, cannot touch vias +# 7: channel (diff) -- cannot touch vias +# 8: vias 1 0 1 -0 1 1 -0 0 0 1 +0 0 1 +0 1 0 1 0 0 0 0 1 -0 0 0 1 1 1 -0 0 0 2 2 2 1 -0 0 1 1 1 3 3 1 +0 0 0 0 0 1 +0 0 0 0 1 1 1 +0 0 2 0 2 2 2 1 +0 0 0 1 1 1 3 3 1 diff --git a/scripts/is_colour.py b/scripts/is_colour.py new file mode 100755 index 0000000..4592526 --- /dev/null +++ b/scripts/is_colour.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +import PIL.Image +import numpy +import sys + +PIL.Image.warnings.simplefilter('ignore', PIL.Image.DecompressionBombWarning) + +if len(sys.argv) < 4: + print( + f'usage: {sys.argv[0]:s} colour image_in image_out' + ) + sys.exit(1) +colour = int(sys.argv[1]) +image_in = sys.argv[2] +image_out = sys.argv[3] + +image = PIL.Image.open(image_in) +image.load() +#print('mode', image.mode) +#print('palette', image.palette) +#print('width', image.width) +#print('height', image.height) +image = numpy.array(image) +#print('shape', image.shape) +#print('dtype', image.dtype) +assert len(image.shape) == 2 and image.dtype == numpy.uint8 + +PIL.Image.fromarray(image == colour).save(image_out) diff --git a/scripts/to_mono.py b/scripts/to_mono.py index 4867abc..abe157e 100755 --- a/scripts/to_mono.py +++ b/scripts/to_mono.py @@ -23,6 +23,8 @@ image.load() image = numpy.array(image) #print('shape', image.shape) #print('dtype', image.dtype) +if len(image.shape) == 2: + image = image[:, :, numpy.newaxis] assert len(image.shape) == 3 and image.dtype == numpy.uint8 image = image >= 0x80 -- 2.34.1