Optimieren Sie die BerechnungHallo,
Ich habe einen JSL-Code zum Berechnen des radialen Abstands vom Mittelpunkt des Wafers. Die Datentabelle XYCoord hat X-, Y- und Wafer-ID-Spalten.
Es berechnet den Abstand und fügt der Tabelle eine Abstandsspalte 1 mm vom Mittelpunkt entfernt hinzu
Derzeit dauert es bei 656.000 Zeilen mehr als 3–4 Minuten, bis der Vorgang abgeschlossen ist, was viel zu lang ist.
Gibt es eine Möglichkeit, es zu optimieren und schneller zu machen?
Automatisierung und SkriptingBetreff: Optimieren Sie die BerechnungIch habe versucht, Ihr Skript mit den von Ihnen bereitgestellten Daten auszuführen, aber es ist fehlgeschlagen. Das erste, was ich zu korrigieren versuchte, waren verirrte "=" in verschiedenen Zeilen des Skripts.
Die Zeilen 23, 25, 106, 139 und 152 hatten alle ein einzelnes "="
Als nächstes wurden die Fehlermeldungen auf etwas gerichtet, das wie Spalten aussieht, die offenbar aus früheren Ausführungen bereinigt wurden. In der von Ihnen bereitgestellten Tabelle sind sie jedoch nicht vorhanden, sodass das Skript fehlschlägt.
RadiusDieCenter, x-Zentrierung, y-Zentrierung, Radius gerundet 1 mm, Radius gerundet 0,51 mm
Ich habe Try() um die fehlerhaften Zeilen hinzugefügt
Die Spalte X-Koordinate in Zeile 21 wird referenziert, existiert aber nicht in der Datentabelle
Ich habe es in U1_x geändert, da ich davon ausgehe, dass dies die x-Koordinatenspalte für den Lauf ist
Der Code lief dann fehlerfrei in 2 Minuten und 12 Sekunden, ich weiß jedoch nicht, ob die Ergebnisse korrekt sind. Die Spalten Xcentering und Ycentering sind alle Nullen. Ist das zu erwarten?

Betreff: Optimieren Sie die BerechnungHallo Jim,
Ja, das ist richtig. Sie können die Ergebnisse überprüfen, indem Sie ein X- und Y-Diagramm zeichnen und die 1-mm-Spaltenwerte markieren. Ich frage mich, ob dies noch weiter optimiert werden kann. Ich habe die Fehler in der oben angehängten JSL-Datei korrigiert
Betreff: Optimieren Sie die BerechnungHallo @Jackie_ ,
Das Skript berechnet bei jeder Schleife mehrere Col-Werte neu. Versuchen Sie Folgendes:
Ende - Anfang = 6,15000000002328;
Names Default To Here( 1 );
start = Tick Seconds();
dt = Current Data Table();
dt << Clear Column Selection;
Try( dt << delete columns( RadiusDieCenter ) );
Try(
dt << delete columns( RadiusDieEdge );
dt << delete columns( Xcentering );
dt << delete columns( Ycentering );
dt << delete columns( Radius Rounded 1mm );
dt << delete columns( Radius Rounded 0.51mm );
dt << delete columns( Radius Rounded 1mm );
);
z5Identifier = 1;
Xaxis = "U1_x";
Yaxis = "U1_y";
DieXSize = 1.160; //in mm
DieYSize = 0.810;//in mm
WaferColumns = N Items( Associative Array( As Column( Xaxis ) ) << Get Keys );
columnsRad = ((WaferColumns * DieXSize) / 2);
MaxRadiusEntry = 147;
dt << Set Table Variable( "DieXSize", DieXSize );
dt << Set Table Variable( "DieYSize", DieYSize );
dt << Set Table Variable( "MaxRadius", MaxRadiusEntry );
dt << begin data update;
xcoordmax = Col Maximum( As Column( Xaxis ) );
xcoordmin = Col Minimum( As Column( Xaxis ) );
ycoordmax = Col Maximum( As Column( Yaxis ) );
ycoordmin = Col Minimum( As Column( Yaxis ) );
New Column( "RadiusDieCenter",
Formula( Sqrt( (Abs( (As Column( Xaxis ) - CenterXCoord) * DieXSize )) ^ 2 + Abs( ((As Column( Yaxis ) - CenterYCoord) * DieYSize) ) ^ 2 ) )
);
New Column( "RadiusDieEdge",
Formula(
Sqrt(
(Abs( (As Column( Xaxis ) - CenterXCoord) * DieXSize ) + Abs( DieXSize / 2 )) ^ 2 + (Abs(
(As Column( Yaxis ) - CenterYCoord) * DieYSize
) + Abs( DieYSize / 2 )) ^ 2
)
)
);
xcoordrange = xcoordmax - xcoordmin;
ycoordrange = ycoordmax - ycoordmin;
dt << Set Table Variable( "CenterXCoord", xcoordmin + xcoordrange / 4 );
dt << Set Table Variable( "CenterYCoord", ycoordmin + ycoordrange / 4 );
dt << Run Formulas;
xiter = Ceiling( Log( xcoordrange * 1600, 1.8 ) );
yiter = Ceiling( Log( ycoordrange * 1600, 1.8 ) );
maxiter = Max( xiter, yiter );
New Column( "Xcentering",
Numeric,
Formula(
If( As Column( Xaxis ) > :CenterXCoord & :RadiusDieEdge > :MaxRadius,
1,
If( As Column( Xaxis ) < :CenterXCoord & :RadiusDieEdge > :MaxRadius,
-1,
0
)
)
)
);
New Column( "Ycentering",
Numeric,
Formula(
If( As Column( Yaxis ) > :CenterYCoord & :RadiusDieEdge > :MaxRadius,
1,
If( As Column( Yaxis ) < :CenterYCoord & :RadiusDieEdge > :MaxRadius,
-1,
0
)
)
)
);
dt << end data update;
sum_x_centering = Col Sum( :Xcentering );
min_x_centering = Col Min( :Xcentering );
max_x_centering = Col Max( :Xcentering );
sum_y_centering = Col Sum( :Ycentering );
min_y_centering = Col Min( :Ycentering );
max_y_centering = Col Max( :Ycentering );
For( i = 1, i <= maxiter, i++,
centerx = Num( dt << Get Table Variable( "CenterXCoord" ) );
centery = Num( dt << Get Table Variable( "CenterYCoord" ) );
xcoordrange = xcoordrange / 1.8;
ycoordrange = ycoordrange / 1.8;
dt << Run Formulas;
If( sum_x_centering > 0,
dt << Set Table Variable( "CenterXCoord", centerx + xcoordrange );
centerx = centerx + xcoordrange;
,
If( sum_x_centering < 0,
dt << Set Table Variable( "CenterXCoord", centerx - xcoordrange );
centerx = centerx + xcoordrange;
)
);
If( sum_y_centering > 0,
dt << Set Table Variable( "CenterYCoord", centery + ycoordrange );
centery = centery + ycoordrange;
,
If( sum_y_centering < 0,
dt << Set Table Variable( "CenterYCoord", centery - ycoordrange );
centery = centery + ycoordrange;
)
);
If( max_x_centering < 1 & min_x_centering > -1 & max_y_centering < 1 & min_y_centering > -1,
OldRadius = dt << Get Table Variable( "MaxRadius" );
NewRadius = Num( OldRadius ) - 0.01;
dt << Set Table Variable( "MaxRadius", Char( NewRadius ) );
xcoordrange = xcoordmax - xcoordmin;
ycoordrange = ycoordmax - ycoordmin;
dt << Run Formulas;
i = 1;
);
dt << Run Formulas;
);
New Column( "Radius Rounded 1mm", Numeric, "Continuous", Format( "Best", 12 ), Formula( Ceiling( :RadiusDieEdge ) ) );
end = Tick Seconds();
Show( end - start );
Betreff: Optimieren Sie die BerechnungMeines Erachtens könnte die Verarbeitung durch eine Neucodierung Ihres Skripts und den Verzicht auf die Verwendung von Tabellenskripten als Zwischenspeicher beschleunigt werden.
Ich habe einen kleinen Test durchgeführt, um die Effizienz der Verwendung einer Tabellenvariablen im Vergleich zur Verwendung einer Speichervariablen zu prüfen. In meinem Test dauerte die Verarbeitung der Tabellenvariablenmethode 26 Sekunden und die Verarbeitung der Speichervariablenmethode 0,5 Sekunden.
Erwägen Sie die Verwendung einer globalen Speichervariable oder die Erstellung einer Namespace-Variable, um Ihre Zwischenberechnungen zu speichern. Wenn Sie möchten, dass die Tabellenvariablen am Ende die endgültigen Werte haben, müssen Sie sie nur einmal am Ende Ihres Skripts festlegen.
Betreff: Optimieren Sie die BerechnungDas ist großartig. Würde es dir etwas ausmachen, Jim zu teilen?
Betreff: Optimieren Sie die BerechnungDie Ergebnisse sind falsch @robot

Sollte mit meinem Skript sein

Betreff: Optimieren Sie die BerechnungHier sind die 2 Testskripte, die ich verwendet habe
names default to here(1);
dt = new table("example");
dt << new table variable("test",42);
start = tick seconds();
dt=current data table();
for(i=1,i<=1000000,i++,
x=num(dt<<GET table="" variable=""></GET>
<CODE class=" language-jsl">names default to here(1);
If(!isnamespace(t), t = new namespace("temp"));
start = tick seconds();
dt=current data table();
t:x=1;
for(i=1,i<=1000000,i++,
y = t:x;
y=y+1;
t:x=y;
);
end = tick seconds();
show(end -start);Betreff: Optimieren Sie die BerechnungBei einem schnellen Blick auf das Skript sind höchstwahrscheinlich viele verschiedene Optimierungen möglich, aber ich bin etwas verwirrt, was Sie berechnen.
- Wie wird aus diesen Daten die Mitte des Wafers bestimmt?
- Abstand vom Mittelpunkt des Wafers zu welchem Radius?
- Muss der ganze Würfel zu den Radien gehören oder nur die Mitte?
Betreff: Optimieren Sie die BerechnungViele Annahmen getroffen
/*""" Optimize the computation
author: jthi
date: 2024-09-05
url: https://community.jmp.com/t5/Discussions/Optimize-the-computation/m-p/795219
keywords/tags: [semiconductor,wafer,distance,matrix,die]
Description: Calculate distance from center of wafer (coordinates) to corner of die
"""*/
Names Default To Here(1);
dt_temp = Open("$DOWNLOADS/XYCoord.jmp");
die_width = 1.160;
die_height = 0.810;
dt = dt_temp << Summary(
Group(:U1_x, :U1_y),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Coords")
);
dt << Delete Scripts(dt << Get Table Script Names);
// Use Update to join the distances back using U1_x and U1_y as linking ids
Close(dt_temp, no save); // Close as not needed for this demo
m_x = Column(dt, "U1_x") << get values;
m_y = Column(dt, "U1_y") << get values;
// Origo to 0, 0 and coordinates to "real" measures
// This most likely will require some adjustments but you know your data so you should be able to modify this as needed
xcoords = (m_x - Max(m_x) / 2) * die_width + die_width / 2;
ycoords = (m_y - Max(m_y) / 2) * die_height + die_height / 2;
// Distance from center to each of the corners of rectangle
// assumes that the "coordinate" is at the center of die
top_left = xcoords - die_width / 2 || ycoords + die_height / 2;
bottom_left = xcoords - die_width / 2 || ycoords - die_height / 2;
top_right = xcoords + die_width / 2 || ycoords + die_height / 2;
bottom_right = xcoords + die_width / 2 || ycoords - die_height / 2;
d_tl = Sqrt(Distance(top_left, [0 0]));
d_bl = Sqrt(Distance(bottom_left, [0 0]));
d_tr = Sqrt(Distance(top_right, [0 0]));
d_br = Sqrt(Distance(bottom_right, [0 0]));
// Assume that furthest part of die is the determining factor for distance
die_distance_to_center = Round(V Max((d_tl || d_bl || d_tr || d_br)`));
dt << New Column("D", Numeric, Ordinal, Values(die_distance_to_center));
nw = New Window("Demo",
H List Box(
dt << Data Filter(
Add Filter(columns(:D), Display(:D, N Items(15), Find(Set Text(""))))
),
gb = dt << Graph Builder(
Size(528, 463),
Show Control Panel(0),
Lock Scales(1),
Variables(X(:U1_x), Y(:U1_y)),
Elements(Points(X, Y, Legend(4))),
SendToReport(
Dispatch({}, "U1_x", ScaleBox,
{Format("Fixed Dec", 12, 0), Min(-2.87573722663528), Max(261.04),
Inc(50), Minor Ticks(1)}
),
Dispatch({}, "U1_y", ScaleBox,
{Format("Fixed Dec", 12, 0), Min(-3.300675), Max(380), Inc(100),
Minor Ticks(4)}
)
)
)
)
);
Write();


Betreff: Optimieren Sie die Berechnung@jthi
1. Der Mittelpunkt des Wafers wird durch Berechnung der Bereiche der X- und Y-Koordinaten (d. h. der Maximalwert minus der Minimalwerte) bestimmt. Die anfänglichen Schätzungen für den Mittelpunkt werden wie folgt berechnet:
- CenterXCoord = xcoordmin + xcoordrange / 4
- CenterYCoord = ycoordmin + ycoordrange / 4
Der Code passt diese Koordinaten dann iterativ an, indem er den Koordinatenbereich in jeder Iteration durch 1,8 dividiert, bis die Zentrierbedingungen für X und Y erfüllt sind. Der endgültige Mittelpunkt wird gefunden, wenn die Zentrierformeln für beide Achsen
2. Der Radius wird vom Waferzentrum bis entweder zum Eingang des Dies "RadiusDieCenter" oder zum Rand des Dies "RadiusDieEdge" berechnet.
3. Nur die Mitte des Chips muss innerhalb der berechneten Radien liegen. Die Radiusberechnungen konzentrieren sich auf den Abstand von der Wafermitte zur Mitte jedes Chips.