Add wafer layouts and RBF heatmap functionality

- Introduced new YAML layout files for wafers B, C, D, F, X, Z, and their reversed versions.
- Implemented RBF heatmap interpolation using CuPy and NumPy for GPU acceleration.
- Created a backend module to load wafer layouts from YAML files, mirroring the existing schema.
- Developed a QQuickPaintedItem for rendering wafer maps, including sensor markers, heatmaps, and labels.
- Enhanced the drawing capabilities with concentric rings, crosshair axes, and orientation markers.
This commit is contained in:
jack
2026-06-11 11:56:55 -07:00
parent ca1a514f23
commit b52b983bb2
10 changed files with 887 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# This will be the name of the output files
name: aepwafer
wafers: ["A", "E", "P"]
# round or square wafer
shape: round
# diameter/edge size of the wafer
size: 300
# large or small markers and labels
marker_size: large
font_size: large
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top implies that the X/Y values
# for that axis are negative, or else we'll be drawing outside the image.
x_origin: left
y_origin: bottom
# sensor X and Y values, in mm relative to the origin
X: [150, 204, 249, 280, 290, 280, 249, 204, 150, 97, 51, 21, 10, 21, 51, 97,
150, 203, 241, 255, 241, 203, 150, 98, 59, 45, 59, 98, 171, 207, 228, 228,
207, 171, 130, 94, 73, 73, 94, 130, 150, 186, 200, 186, 150, 115, 100, 115]
Y: [290, 280, 249, 204, 150, 97, 51, 21, 10, 21, 51, 97, 150, 204, 249, 280,
255, 241, 203, 150, 98, 59, 45, 59, 98, 150, 203, 241, 228, 207, 171, 130,
94, 73, 73, 94, 130, 171, 207, 228, 200, 186, 150, 115, 100, 115, 150, 186]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 1
# Normally, positive X is to the right, and positive Y is up.
# These settings can be used to reverse one or both of these.
reverse_x: false
reverse_y: false
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
4: { top: [0, 0] },
5: { top: [0, 0] },
6: { top: [0, 0] },
}
+46
View File
@@ -0,0 +1,46 @@
# This will be the name of the output files
name: bcdwafer
wafers: ["B", "C", "D"]
# round or square wafer
shape: round
# diameter/edge size of the wafer
size: 300
# large or small markers and labels
marker_size: large
font_size: large
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top implies that the X/Y values
# for that axis are negative, or else we'll be drawing outside the image.
x_origin: center
y_origin: center
# sensor X and Y values, in mm relative to the origin
X: [0, 72.50, 125.57, 145.00, 125.57, 72.50, 0, -72.50, -125.57, -145.00,
-125.57, -72.50, 0, 47.50, 82.27, 95.00, 82.27, 47.50, 0, -47.50, -82.27,
-95.00, -82.27, -47.50, 38.97, 22.50, -38.97, -22.50, 0]
Y: [145.00, 125.57, 72.50, 0, -72.50, -125.57, -145.00, -125.57, -72.50, 0,
72.50, 125.57, 95.00, 82.27, 47.50, 0, -47.50, -82.27, -95.00, -82.27,
-47.50, 0, 47.50, 82.27, 22.50, -38.97, -22.50, 38.97, 0]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 1
# Normally, positive X is to the right, and positive Y is up.
# These settings can be used to reverse one or both of these.
reverse_x: false
reverse_y: false
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
2: { left: [1, 0] },
3: { left: [1, 0] },
4: { left: [1, 0] },
5: { left: [1, 0] },
6: { left: [1, 0] },
}
+43
View File
@@ -0,0 +1,43 @@
# This will be the name of the output files
name: fwafer
wafers: ["F"]
# round or square wafer
shape: round
# diameter/edge size of the wafer
size: 200
# large or small markers and labels
marker_size: large
font_size: large
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top implies that the X/Y values
# for that axis are negative, or else we'll be drawing outside the image.
x_origin: center
y_origin: center
# sensor X and Y values, in mm relative to the origin
X: [0.0, 47.5, 82.3, 95.0, 82.3, 47.5, 0.0, -47.5, -82.3, -95.0, -82.3, -47.5,
-55.0, -14.8, 39.7, 55.0, 14.8, -39.7, -14.7, 25.5, 14.7, -25.5]
Y: [95.0, 82.3, 47.5, 0.0, -47.5, -82.3, -95.0, -82.3, -47.5, 0.0, 47.5, 82.3,
13.3, 54.4, 40.0, -13.3, -54.4, -40.0, 25.5, 14.7, -25.5, -14.7]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 1
# Normally, positive X is to the right, and positive Y is up.
# These settings can be used to reverse one or both of these.
reverse_x: false
reverse_y: false
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
2: { left: [1, 0] },
3: { left: [1, 0] },
4: { left: [1, 0] },
5: { left: [1, 0] },
}
+69
View File
@@ -0,0 +1,69 @@
# This will be the name of the output files
name: xwafer
wafers: ["X"]
# round or square wafer
shape: square
# diameter/edge size of the wafer
size: 310
# large or small markers and labels
marker_size: small
font_size: small
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top implies that the X/Y values
# for that axis are negative, or else we'll be drawing outside the image.
x_origin: left
y_origin: bottom
# sensor X and Y values, in mm relative to the origin
X: [ 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00,
13.00, 23.00, 46.43, 89.86, 133.29, 176.72, 220.15, 263.58, 287.01, 297.01,
307.01, 307.01, 307.01, 307.01, 307.01, 307.01, 307.01, 307.01, 307.01,
307.01, 307.01, 307.01, 297.01, 287.01, 263.58, 220.15, 176.72, 133.29,
89.86, 46.43, 23.00, 13.00, 46.43, 46.43, 46.43, 46.43, 46.43, 46.43,
89.86, 133.29, 176.72, 220.15, 263.58, 263.58, 263.58, 263.58, 263.58,
263.58, 220.15, 176.72, 133.29, 89.86, 89.86, 89.86, 89.86, 89.86,
133.29, 176.72, 220.15, 220.15, 220.15, 220.15, 176.72, 133.29, 133.29,
133.29, 176.72, 176.72]
Y: [ 3.00, 13.07, 23.07, 46.50, 89.93, 133.36, 176.79, 220.22, 263.65, 287.08,
297.08, 307.08, 307.08, 307.08, 307.08, 307.08, 307.08, 307.08, 307.08,
307.08, 307.08, 307.08, 307.08, 297.08, 287.08, 263.65, 220.22, 176.79,
133.36, 89.93, 46.50, 23.07, 13.07, 3.00, 3.00, 3.00, 3.00, 3.00, 3.00,
3.00, 3.00, 3.00, 3.00, 3.00, 46.50, 89.93, 133.36, 176.79, 220.22, 263.65,
263.65, 263.65, 263.65, 263.65, 263.65, 220.22, 176.79, 133.36, 89.93,
46.50, 46.50, 46.50, 46.50, 46.50, 89.93, 133.36, 176.79, 220.22, 220.22,
220.22, 220.22, 176.79, 133.36, 89.93, 89.93, 89.93, 133.36, 176.79,
176.79, 133.36 ]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 1
# Normally, positive X is to the right, and positive Y is up.
# These settings can be used to reverse one or both of these.
reverse_x: false
reverse_y: false
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
21: { left: [0, 0] },
22: { left: [0, 0] },
23: { left: [0, 0] },
24: { left: [0, 0] },
25: { left: [0, 0] },
26: { left: [0, 0] },
27: { left: [0, 0] },
28: { left: [0, 0] },
29: { left: [0, 0] },
30: { left: [0, 0] },
31: { left: [0, 0] },
32: { left: [0, 0] },
33: { left: [0, 0] },
34: { left: [0, 0] },
35: { left: [0, 0] },
36: { left: [0, 0] }
}
+68
View File
@@ -0,0 +1,68 @@
# This will be the name of the output files
name: zwafer
wafers: ["Z"]
# round or square wafer
shape: round
# diameter/size of the wafer
size: 300
# large or small markers and labels
marker_size: small
font_size: small
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top probably also needs
# reverse_x/reverse_y to be set as well.
x_origin: center
y_origin: center
# sensor X and Y values, in mm relative to the wafer center
X: [0.00, -1.17, 8.92, 1.17, -8.92, 22.52, 29.35, -22.52, -29.35, 45.05, 73.37,
58.71, 9.66, -45.05, -73.37, -58.71, -9.66, 79.85, 89.06, 46.10, -23.86,
-79.85, -89.06, -46.10, 23.86, 66.96, 109.06, 87.27, 14.36, -66.96,
-109.06, -87.27, -14.36, 121.24, 135.23, 70.00, -36.23, -121.24, -135.23,
-70.00, 36.23, 124.71, 139.09, 72.00, -37.27, -124.71, -139.09, -72.00,
37.27, 89.49, 127.31, 145.74, 141.99, 116.62, 73.50, 19.19, -38.05, -89.49,
-127.31, -145.74, -141.99, -116.62, -73.50, -19.19, 38.05]
Y: [0.00, -8.92, -1.17, 8.92, 1.17, -29.35, 22.52, 29.35, -22.52, -58.71,
-9.66, 45.05, 73.37, 58.71, 9.66, -45.05, -73.37, -46.10, 23.86, 79.85,
89.06, 46.10, -23.86, -79.85, -89.06, -87.27, -14.36, 66.96, 109.06, 87.27,
14.36, -66.96, -109.06, -70.00, 36.23, 121.24, 135.23, 70.00, -36.23,
-121.24, -135.23, -72.00, 37.27, 124.71, 139.09, 72.00, -37.27, -124.71,
-139.09, -116.62, -73.50, -19.19, 38.05, 89.49, 127.31, 145.74, 141.99,
116.62, 73.50, 19.19, -38.05, -89.49, -127.31, -145.74, -141.99]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 0
# If one or both axes are reversed, this can be used to fix it
# without having to edit all of the coordinates.
# These should be false for most normal wafers.
reverse_x: false
reverse_y: false
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
33: { left: [0, 0] },
34: { left: [0, 0] },
41: { top: [0, 0] },
42: { bottom: [0, 0] },
45: { top: [1, 0] },
46: { bottom: [0.5, 0] },
49: { left: [0, 0] },
50: { bottom: [-1.75, -0.5] },
51: { top: [-1, 0] },
52: { top: [-1, 0] },
53: { bottom: [0, 0] },
54: { left: [0, -0.75] },
55: { right: [0, 0.5] },
58: { bottom: [-0.75, 0] },
60: { top: [0, 0] },
62: { right: [0, 1] },
63: { right: [0, 0] },
64: { left: [0, 0.25] }
}
+71
View File
@@ -0,0 +1,71 @@
# This will be the name of the output files
name: zwafer_rev
wafers: [] # the reversed version doesn't represent any real wafer
# round or square wafer
shape: round
# diameter/size of the wafer
size: 300
# large or small markers and labels
marker_size: small
font_size: small
# origin settings. x_origin can be left, right, or center. y_origin can
# be top, bottom, or center. Using right or top probably also needs
# reverse_x/reverse_y to be set as well.
x_origin: center
y_origin: center
# sensor X and Y values, in mm relative to the wafer center
X: [0.00, -1.17, 8.92, 1.17, -8.92, 22.52, 29.35, -22.52, -29.35, 45.05, 73.37,
58.71, 9.66, -45.05, -73.37, -58.71, -9.66, 79.85, 89.06, 46.10, -23.86,
-79.85, -89.06, -46.10, 23.86, 66.96, 109.06, 87.27, 14.36, -66.96,
-109.06, -87.27, -14.36, 121.24, 135.23, 70.00, -36.23, -121.24, -135.23,
-70.00, 36.23, 124.71, 139.09, 72.00, -37.27, -124.71, -139.09, -72.00,
37.27, 89.49, 127.31, 145.74, 141.99, 116.62, 73.50, 19.19, -38.05, -89.49,
-127.31, -145.74, -141.99, -116.62, -73.50, -19.19, 38.05]
Y: [0.00, -8.92, -1.17, 8.92, 1.17, -29.35, 22.52, 29.35, -22.52, -58.71,
-9.66, 45.05, 73.37, 58.71, 9.66, -45.05, -73.37, -46.10, 23.86, 79.85,
89.06, 46.10, -23.86, -79.85, -89.06, -87.27, -14.36, 66.96, 109.06, 87.27,
14.36, -66.96, -109.06, -70.00, 36.23, 121.24, 135.23, 70.00, -36.23,
-121.24, -135.23, -72.00, 37.27, 124.71, 139.09, 72.00, -37.27, -124.71,
-139.09, -116.62, -73.50, -19.19, 38.05, 89.49, 127.31, 145.74, 141.99,
116.62, 73.50, 19.19, -38.05, -89.49, -127.31, -145.74, -141.99]
# set this to either 0 or 1 for the initial sensor number (usually 1)
start_sn: 0
# If one or both axes are reversed, this can be used to fix it
# without having to edit all of the coordinates.
# These should be false for most normal wafers.
reverse_x: true
reverse_y: true
# these are sensors whose labels need to be repositioned. Sensor numbers
# start at start_sn. Directions are up, down, left, and right, and values
# are multiples of the marker size.
label_exceptions: {
37: { left: [0, 0] },
38: { left: [0, 0] },
39: { left: [0, 0] },
41: { top: [1.5, 0] },
42: { bottom: [1, 0] },
43: { left: [0, -1] },
45: { bottom: [-1, -1] },
46: { bottom: [0, -1] },
47: { right: [0, 1] },
48: { left: [0, 0] },
50: { bottom: [-1, 0] },
52: { top: [0, 0] },
54: { right: [0.5, 1] },
56: { left: [0, 0.5] },
57: { left: [0, 0] },
58: { top: [0.5, 0] },
59: { left: [0, 0] },
60: { top: [-1, 0] },
61: { left: [0, 0] },
62: { left: [0, -1] },
63: { right: [0, 1] },
}