Wie erhält man die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Das folgende Beispielskript ruft den „Prozessparameter“ Ertrag pro „Wafer-ID in Lot-ID“ unter Verwendung der Beispieldatentabelle zur Halbleiterfähigkeit ab.
Names Default To Here (1);
clear log ();
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp"); // My actual data is similar
col_names = dt << Get Column Group("Processes");
ps = dt << Process Screening (Process Variables( Eval( col_names )),
Spec Limits Dialog( "No (skip columns with no spec limits)" ),
Control Chart Type ("Indiv and MR"),
Grouping (:Wafer ID in lot ID );
);
cdt_ps = Report(ps)[Outline Box( "Process Screening" )][Table Box( 1 )] << Make Combined Data Table;
Wait(1 );
ps<< SendToReport( Dispatch( {}, "Process Screening", OutlineBox, {Close( 1 )} ) );
Wait (1);
ps << close window;
cdt_ps << New Column( "PassingDie", Numeric, "Continuous", Format( "Best", 12 ), Formula(:Count - :Out of Spec Count));
cdt_ps << New Column( "ParaYield [%]", Numeric, "Continuous", Format( "Best", 12 ), Formula(100*(:PassingDie / :Count)));
cdt_ps:Column << Set Name( "Process Parameter" );Nennen wir nun einen Prozessparameter „PP“, die Prozessparametergruppe „PPG“ und eine Wafer-ID in der Lot-ID „wfrIDinLotID“.
Als nächstes möchte ich den PPG-Ertrag pro wfrIDinLotID extrahieren, wobei die PPGs wie folgt definiert sind:
- Alle PNPs in einer Gruppe
- Alle NPNs in einer anderen Gruppe
- Alle INMs sind in einer anderen Gruppe und so weiter.
d. h. alle durch die Zeile darunter generierten PPs, jedoch ohne die Zahlen am Ende, bilden die PPG-Namen.
cdt_ps << Summary(Group( :Process Parameter ), Freq( "None" ), Weight( "None" ));
Ich weiß noch nicht, wie ich die PPG-Namen in eine neue Spalte in JSL bekomme. Ich brauche hier also etwas Hilfe.
Einige PPGs haben möglicherweise nur ein Mitglied, was in Ordnung ist.
Die Fehleranzahl eines bestimmten PPG ist meiner Meinung nach die Summe der Fehleranzahlen aller seiner Mitglieder und ist später im obigen Skript verfügbar.
Daher wird für eine bestimmte wfrIDinLotID erwartet, dass die „Out of Spec Count“ für ein bestimmtes PPG einen einzelnen numerischen Wert hat. Dieser wird in eine neue Spalte eingefügt, nennen wir sie OOSC_PPG.
Der PPG-Ertrag für eine gegebene wfrIDinLotID wäre dann 100*(Anzahl der SITEs mit OOSC_PPG = 0)/Gesamtzahl der getesteten SITEs.
In der Beispieldatentabelle beträgt die Gesamtzahl der pro wfrIDinLotID getesteten Sites 5.
Abschließend möchte ich einen Bericht mit 3 Spalten erstellen: wfrIDinLotID, PPG, PPG-Ertrag.
Könnten Sie mir bitte einige Hinweise geben, wie ich mit JSL weiter vorgehen soll?
Automatisierung und SkriptingWindowsBetreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Was haben Sie versucht?
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?
cooler Trick: „Missbrauchen“ Sie die Prozess-Screening-Plattform, um die Spezifikationsanzahl pro Wafer zu überschreiten.
sehr hilfreich : )
@Neo schrieb:
Die Anzahl der Fehler eines bestimmten PPG ist, glaube ich, die Summe der Anzahl der Fehler aller seiner Mitglieder.
Ich fürchte: nein
– zumindest nicht im Allgemeinen.
hier ist ein Beispiel für NPN5 und NPN6. Wenn Sie die Anzahl der Fehler addieren, zählen Sie die blauen und orangefarbenen Punkte zweimal.
Um gruppierte Erträge (über gruppierte Bestehens-/Nichtbestehensinformationen) zu generieren, müssen Sie von den Rohdaten ausgehen.

Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@jthi . Zuerst muss ich die Buchstaben von den Zahlen in den Prozessparameternamen trennen, um sie in Gruppen anzuordnen. Ich weiß nicht, wie man in JSL Text von Zahlen trennt.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi . Hm..
>>>Um gruppierte Erträge zu generieren (über gruppierte Pass/Fail-Informationen), müssen Sie von den Rohdaten ausgehen
Das habe ich befürchtet....
aber wenn ich es mir noch einmal überlege und es im Gegensatz zu dem steht, was ich vorher dachte, wenn eines der Mitglieder eines bestimmten PPG außerhalb der Spezifikation liegt, schlägt die getestete Site für das bestimmte PPG fehl.
Ich habe das Gefühl, dass dies bewältigt werden kann, ohne auf die Rohdaten zurückzugreifen.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?
@Neo schrieb: die getestete Site schlägt für das jeweilige PPG fehl.
Beim aktuellen Ansatz aggregieren Sie jedoch in der Process Screening Platform – und verlieren die Site-Informationen.
Nehmen wir an, bei einem der Wafer versagt NPN5 an den Stellen 1, 2, 3 und NPN6 an 2, 3, 4.
Dann erhalten Sie in der Process Screening- Plattform für diesen Wafer:
- außerhalb der Spezifikation Anzahl NPN5: 3
- außerhalb der Spezifikation Anzahl NPN6: 3
Ich denke, die einzige Möglichkeit, herauszufinden, wie viele der Stellen bei diesem Wafer (NPN5 oder NPN6) ausgefallen sind, ist:
gehe zur Originaltabelle, Anzahl: 1,2,3,4
-> Anzahl Fehler = 4
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Ich stimme mit @hogi überein, Sie müssen die Berechnung auf der Ebene durchführen, auf der Sie noch Zugriff auf die Site haben. Wenn Sie Prozess-Screening verwenden, können Sie nicht zwischen Überlappungen unterscheiden. Bedenken Sie, dass Sie 5 Sites auf einem Wafer und 10 Tests haben. Wenn die Wafer nur Fehler an Site 1 und ALLEN Tests aufweisen, würden Sie das als 1 fehlgeschlagene Site oder als 10 fehlgeschlagene Tests zählen wollen ( hogis Beitrag enthält ein anderes Beispiel). Ich würde meinen, Sie wollen das nicht als 10 fehlgeschlagene Sites zählen?
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@jthi @hogi Danke. Ich kann die OOS-Werte mit folgendem einfärben
Names Default To Here (1);
clear log ();
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
col_names = dt << Get Column Group("Processes");
ps = dt << Process Screening (Process Variables( Eval( col_names )),
Spec Limits Dialog( "No (skip columns with no spec limits)" ),
Control Chart Type ("Indiv and MR"),
Grouping (:Wafer ID in lot ID ),
Color Out of Spec Values
); Ich muss dann folgendes tun
1. Bilden Sie eine Spalte für PPGs
2. Weisen Sie einem bestimmten PPG einen Fehler zu, wenn eines seiner Mitglieder eine farbige Zelle hat
Hierzu werden nur die Rohdaten benötigt.
Ich weiß noch nicht, wie die beiden oben genannten Schritte ausgeführt werden, deshalb bitte ich hier um eine Anleitung.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@jthi . Wenn für einen bestimmten Wafer eines der Mitglieder eines bestimmten PPG OOS ist, dann ist der Test für dieses PPG fehlgeschlagen. Eine Site kann einen bestimmten PPG-Test nicht bestehen, aber Tests für alle anderen PPGs bestehen.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Färben Sie die Zellen und sammeln Sie dann alle Zeilen mit Farben – was für ein kreativer Workaround!
in einer zukünftigen Version von JMP wird es viel einfacher sein – wenn dieser Wunsch genügend Kudos sammelt …
:folded_hands: liegt im Sollwert
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Nachdem ich << get cell color mit einem Kudo unterstützt habe, während ich auf JMP19++ gewartet habe,
Sie könnten eine Hilfsteilmenge generieren, die Werte mit den Pass/Fail 0/1-Informationen überschreiben und sie nach PPG zusammenfassen:
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
col_names = dt << Get Column Group( "Processes" );
ps = dt << Process Screening(
Process Variables( Eval( col_names ) ),
Spec Limits Dialog( "No (skip columns with no spec limits)" ),
Control Chart Type( "Indiv and MR" ),
Grouping( :Wafer ID in lot ID ),
Color Out of Spec Values
);
dt sub = dt << Subset( All rows, Selected columns only( 0 ) );
For Each( {col}, col_names,
specs = col << Get Property( "Spec limits" );
If( Not( Is Empty( specs ) ),
lsl = specs["LSL"];
usl = specs["USL"];
Eval( Eval Expr( col << set each value( Not( lsl < Expr( Name Expr( col ) ) < usl ) ) ) );
);
);
prefixes = {"NPN","PNP","INM"};
PPGs = transform each ({prefix},prefixes,prefix || " fail");
for each ({myName,i},prefixes,
colGroup = Filter Each({col}, col_names, Substr(col << getname(),1,3) == myName);
Eval (Eval Expr(dtsub << new column (PPGs[i], << Set Property( "Spec Limits", {LSL( 0 ), USL(0)} ), set each value (sum (Expr(Name Expr(colGroup)))))))
);
dt sub << Group Columns( "PPGs", PPGs );
ps = dt sub << Process Screening(
Process Variables( Eval( PPGs ) ),
Spec Limits Dialog( "No (skip columns with no spec limits)" ),
Control Chart Type( "Indiv and MR" ),
Grouping( :Wafer ID in lot ID ),
Color Out of Spec Values
);
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi Teste dein Skript in meinem JMP 16.2
Die zweite Zeile scheint einen Tippfehler zu enthalten. Sie sollte lauten:
col_names = dt << Get Column Group( "Processes" );
und dieser Teil wirft Fehler
dt sub << Group Columns( "PPGs", failcols );
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Entschuldigung -> bearbeitet.
Ich hätte die Symbole löschen sollen, bevor ich noch einmal überprüft habe, ob der übermittelte Code funktioniert.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Das Erstellen der Gruppen kann mit Regex() erfolgen und das Abrufen der farbigen Zellen wurde in der Community bereits mehrfach gelöst, hier ist ein älterer Beitrag : Wie erhalte ich die Zeilennummer der farbigen Zellen in einer Spalte und weise ihr in einer neu erstellten Spalte ein Tag (z. B. „1“) zu? Dieses Muster ist möglicherweise nicht korrekt, da ich nicht sicher bin, wie die Gruppen erstellt werden sollen.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
cont_cols = dt << Get Column Names("Continuous", String);
rgx_pattern = "^(.+?)\d*$";
For Each({colname}, cont_cols,
groupname = Regex(colname, rgx_pattern, "\1");
Write("\!N'", colname, "' belongs to '", groupname, "' group");
);
und um das Muster zu verstehen, empfehle ich die Verwendung von https://regex101.com/ oder eines großen Sprachmodells (sie können Regex-Muster ziemlich gut erklären).
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Auch die Verwendung von gestapelten Tischen mit so etwas kann einfacher sein

Zumindest ist es einfacher, visuell zu überprüfen, was vor sich geht (ich habe diese Berechnungen nicht überprüft).

Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi Ich habe Ihr Skript getestet und es funktioniert wie erwartet. Ich verstehe jedoch nicht, warum die Summe () (Summe der Fehleranzahl?) hier erforderlich ist.
Eval (Eval Expr(dtsub << new column (PPGs[i], << Set Property( "Spec Limits", {LSL( 0 ), USL(0)} ), set each value (sum (Expr(Name Expr(colGroup)))))))
);Könnten Sie bitte etwas Licht ins Dunkel bringen?
Danke
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?ColGroup enthält eine Liste von Spaltennamen, die summiert werden. Für die Spalte mit dem Namen "NPN Fail" wird die Sum()-Funktion erweitert zu
sum( :NPN1, :NPN2, :NPN3, :NPN4, :NPN5, :NPN6, :NPN7, :NPN8, :NPN9, :NPN10, :NPN11 )
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi @txnelson Danke. Mir ist aufgefallen, dass dieser Teil des Skripts die Anzahl der Fehler pro Site für jedes Mitglied für eine bestimmte PPG hinzufügt. Ich bin nicht sicher, ob ich das verstehe.
for each ({myName,i},prefixes,
colGroup = Filter Each({col}, col_names, Substr(col << getname(),1,3) == myName);
Eval (Eval Expr(dtsub << new column (PPGs[i], << Set Property( "Spec Limits", {LSL( 0 ), USL(0)} ), set each value (sum (Expr(Name Expr(colGroup)))))))
);Wenn eine Site für ein beliebiges Mitglied eines bestimmten PPG ausfällt, fällt diese Site für das bestimmte PPG aus, und es spielt für die PPG-Ausbeute/den Wafer in einer Charge keine Rolle, ob an dieser Site weitere Mitglieder unter diesem PPG ausfallen (oder spielt es eine Rolle?)?
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Hallo @Neo
ja, genau, dies ist die angewandte Logik zur Angabe des Ertrags pro PP-Gruppe:
Summieren Sie die Fehler und verwenden Sie USL = 0
Wenn eine Site eine Spezifikation nicht erfüllt, ist sie ein Fehler.
Wenn die Summe aller Kandidaten 0 ist, gilt keiner von ihnen als durchgefallen -> also gilt die gesamte Gruppe an der angegebenen Site als bestanden .
Würden Sie eine andere Logik bevorzugen?
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi . Schlau!! Jetzt verstehe ich es. Ich kann Ihrer früheren Aussage nur zustimmen. Übrigens habe ich es ursprünglich von hier .
Ich würde dennoch das Wort „ausbeuten“ bevorzugen …

Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?@hogi, ich teste das Skript jetzt mit meiner tatsächlichen Datentabelle.
Die Parameternamen haben in meinem Fall die Form ABCD_1_X_Y_1_Z und die PPGs werden durch verschiedene Kombinationen von ABCD...GH definiert (A ist immer ein Buchstabe, der Rest können Buchstaben oder Zahlen sein).
X und Y sind Zahlen, während Z eine Zahl oder ein Buchstabe oder eine Kombination sein kann.
Fragen Sie mich nicht, warum die Namensgebung diese Form hat – das ist nicht meine Schuld.
PPGs werden folgendermaßen gebildet
- U33P_1_0_0.... ist im PPG "U33P" enthalten
- CASMAPUL23Out_1_0_1_...wird im PPG "CASMAPUL23Out" enthalten sein, und so weiter
Um den PPG-Namen zu erhalten, muss ich also die Buchstabenkombination vor dem ersten Unterstrich im Parameternamen ermitteln. Wie ändere ich das Folgende, damit es in meinem Fall funktioniert?
colGroup = Filter Each({col}, col_names, Substr(col << getname(),1,3) == myName);Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Schauen Sie sich die Funktionen Word() und Words() an, sie sind für so etwas normalerweise sehr nützlich.
Betreff: Wie erhalte ich die Prozessparametergruppenausbeute pro „Wafer-ID in Lot-ID“?Wie @jthi sagt,
colGroup = Filter Each({col}, col_names, Word(1, col << getname(),"_") == myName);wird seinen Zweck erfüllen : )