-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmap_subsite_stepping.py
More file actions
95 lines (75 loc) · 3.59 KB
/
map_subsite_stepping.py
File metadata and controls
95 lines (75 loc) · 3.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from sentio_prober_control.Sentio.ProberSentio import *
from sentio_prober_control.Sentio.Enumerations import Module, AxisOrient, ColorScheme, TestSelection, RoutingStartPoint, RoutingPriority, RemoteCommandError, ChuckSite
from sentio_prober_control.Communication.CommunicatorGpib import *
from sentio_prober_control.Communication.CommunicatorTcpIp import *
def main():
prober = SentioProber(CommunicatorTcpIp.create("127.0.0.1:35555"))
x, y, z, t = prober.move_chuck_site(ChuckSite.Wafer)
print("absolute chuck position is x={0}; y={1}; z={2}; theta={3}°".format(x, y, z, t))
hasHome, hasContact, overtravelActive, vacuumOn = prober.get_chuck_site_status(ChuckSite.Wafer)
if not hasHome:
raise Exception("Home position must be set to execute this script!")
if not hasContact:
raise Exception("Contact must be set for stepping!")
prober.select_module(Module.Wafermap)
# setup a wafermap
prober.map.create(100)
prober.map.set_flat_params(90, 50000)
prober.map.set_grid_params(15000, 15000, 0, 0, 1000)
prober.map.set_street_size(0, 0)
prober.map.set_grid_origin(0, 0)
prober.map.set_home_die(1, 1)
prober.map.set_axis_orient(AxisOrient.UpRight)
prober.map.set_color_scheme(ColorScheme.ColorFromBin)
# set up 4 subsites
prober.map.subsites.reset() # This call will create 1 single subsite
prober.map.subsites.add("site2", 2000, 2000)
prober.map.subsites.add("site3", 2000, 0)
prober.map.subsites.add("site4", 0, 2000)
# Load binning table
prober.map.bins.load("C:\\ProgramData\\MPI Corporation\\Sentio\\config\\defaults\\default_bins.xbt")
prober.map.bins.clear_all()
# Select dies for test
prober.map.path.select_dies(TestSelection.All)
prober.map.path.set_routing(RoutingStartPoint.UpperRight, RoutingPriority.ColBiDir)
#
# Subsite Stepping Version 1: Stepping over all dies repeatedly for each subsite
#
# You don't do subsite stepping. You select the subsite when you submit step_first_die and
# then do normal wafer stepping. Repeat for each subsite...
# You step over all dies for each subsite
num_sites = prober.map.subsites.get_num()
for testSite in range(0,num_sites):
col, row, site = prober.map.step_first_die(testSite) # <- SUBSITE SELECTED HERE!
print("Position {0}, {1} (Site: {2})".format(col, row, site))
try:
while True:
bin_value = testSite
prober.map.bins.set_bin(bin_value, col, row, site)
col, row, site = prober.map.step_next_die()
print(f'Position {col}, {row} (Site: {site})')
except ProberException as e:
# An end of route error is normal with this workflow.
# Everything else will terminate the loop
if e.error() != RemoteCommandError.EndOfRoute:
raise
#
# Subsite Stepping Version 2: Use subsite stepping command
#
# Step over all sites of the first die, then proceed to the next die.
# Repeat until all subsites of all dies were measured
#
try:
col, row, site = prober.map.step_first_die()
bin_value = 0
while True:
col, row, site = prober.map.subsites.bin_step_next(bin_value)
print(f'Position {col}, {row} (Site: {site})')
bin_value = 0 if site == 0 else bin_value + 1
except ProberException as e:
# An end of route error is normal with this workflow.
# Everything else will terminate the loop
if e.error() != RemoteCommandError.EndOfRoute:
raise
if __name__ == "__main__":
main()