計算を最適化するこんにちは、
ウェーハの中心からの半径距離を計算する JSL コードがあります。データ テーブル XYCoord には、X、Y、ウェーハ ID 列があります。
距離を計算し、中心から1mmの距離列をテーブルに追加します。
現在、656,000 行の場合、プロセスが完了するまでに 3 ~ 4 分以上かかりますが、これは長すぎます。
最適化して高速化する方法はありますか?
自動化とスクリプトRe: 計算を最適化する提供されたデータに対してスクリプトを実行しようとしましたが、失敗しました。最初に修正しようとしたのは、スクリプト内のさまざまな行にある「=」の誤りでした。
23、25、106、139、152行目には、すべて単一の「=」が含まれていました。
次に、エラー メッセージは、以前の実行からクリーンアップされていると思われる列に変わりましたが、指定したテーブルにはそれらの列が存在しないため、スクリプトは失敗します。
RadiusDieCenter、xcentering、ycentering、半径丸め 1mm、半径丸め 0.51mm
問題のある行の周りにTry()を追加しました
21行目の列X座標は参照されていますが、データテーブルに存在しません。
これをU1_xに変更しました。これは実行のx座標列であると想定しています。
その後、コードは 2 分 12 秒でエラーなく実行されましたが、結果が正しいかどうかはわかりません。Xcentering 列と Ycentering 列はすべてゼロです。これは予想どおりでしょうか?

Re: 計算を最適化するこんにちは、ジムさん
はい、その通りです。X と Y のグラフをプロットして 1mm の列の値を強調表示することで結果を確認できます。これをさらに最適化できるかどうか疑問に思っています。上記の添付の jsl ファイルのエラーを修正しました。
Re: 計算を最適化するこんにちは@Jackie_ 、
スクリプトは各ループでいくつかの Col 値を再計算しました。以下を試してください:
終了 - 開始 = 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 );
Re: 計算を最適化する処理を高速化するために使用できると思われるのは、スクリプトを再コーディングし、中間ストレージとしてのテーブル スクリプトの使用を削除することです。
テーブル変数とメモリ変数を使用した場合の効率を確認するために、簡単なテストを実行しました。私のテストでは、テーブル変数方式では処理に 26 秒かかり、メモリ変数方式では 0.5 秒かかりました。
中間計算を保存するには、グローバル メモリ変数を使用するか、名前空間変数を作成することを検討してください。テーブル変数に最終値を持たせたい場合は、スクリプトの最後に 1 回設定するだけで済みます。
Re: 計算を最適化するそれは素晴らしいですね。ジム、シェアしてもらってもいいですか?
Re: 計算を最適化する結果は間違っています@robot

私のスクリプトと一緒にあるはずです

Re: 計算を最適化する私が使用した2つのテストスクリプトは次のとおりです。
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);Re: 計算を最適化するスクリプトをざっと見てみると、おそらくさまざまな最適化を実行できるはずですが、何を計算しているのか少し混乱しています。
- このデータからウェハの中心はどのように決定されるのでしょうか?
- ウェーハの中心から半径何メートルまでの距離ですか?
- ダイ全体が半径に属する必要がありますか、それとも中心だけに属する必要がありますか?
Re: 計算を最適化する多くの仮定が立てられた
/*""" 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();


Re: 計算を最適化する@jthi
1.ウェハの中心は、X 座標と Y 座標の範囲 (つまり、最大値から最小値を引いた値) を計算することによって決定されます。中心の初期推定値は次のように計算されます。
- 中心X座標 = x座標最小値 + x座標範囲 / 4
- 中心Y座標 = y座標最小値 + y座標範囲 / 4
次に、コードは、X軸とY軸の中心合わせ条件が満たされるまで、各反復で座標範囲を1.8で割ってこれらの座標を反復的に調整します。最終的な中心は、両方の軸の中心合わせ式が満たされたときに見つかります。
2. 半径は、ウェーハの中心からダイの入口「RadiusDieCenter」またはダイの端「RadiusDieEdge」まで計算されます。
3. 計算された半径内に収まる必要があるのは、ダイの中心のみです。半径の計算は、ウェーハの中心から各ダイの中心までの距離に焦点を合わせます。