¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?El siguiente script de ejemplo obtiene el rendimiento del "Parámetro de proceso" por "ID de oblea en ID de lote" utilizando la tabla de datos de capacidad de semiconductores de muestra.
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" );Ahora llamemos a un parámetro de proceso "PP", al grupo de parámetros de proceso "PPG" y a una ID de oblea en el ID de lote "wfrIDinLotID".
A continuación quiero extraer el rendimiento de PPG por wfrIDinLotID donde los PPG se definen como:
- Todos los PNP en un grupo
- Todos los NPN en otro grupo
- Todos los INM están en otro grupo y así sucesivamente.
es decir, todos los PP generados por la línea siguiente pero sin los números al final forman los nombres de PPG.
cdt_ps << Summary(Group( :Process Parameter ), Freq( "None" ), Weight( "None" ));
Todavía no sé cómo obtener los nombres de PPG en una nueva columna en JSL. Entonces, necesito ayuda aquí.
Algunos PPG pueden tener un solo miembro, lo cual está bien.
Creo que el recuento de fallos de un PPG determinado es la suma de los recuentos de fallos de cada uno de sus miembros, que luego estará disponible en el script anterior.
Por lo tanto, para un wfrIDinLotID particular, se espera que el "Recuento fuera de especificación" para un PPG determinado tenga un valor numérico único. Esto irá a una nueva columna, llamémosla OOSC_PPG.
El rendimiento de PPG para un wfrIDinLotID determinado sería entonces 100*(número de SITIOS con OOSC_PPG = 0)/Total de SITIOS probados.
El total de sitios probados por wfrIDinLotID es 5 en la tabla de datos de ejemplo.
Finalmente, me gustaría generar un informe con 3 columnas: wfrIDinLotID, PPG, rendimiento de PPG.
¿Podría darme alguna indicación sobre cómo proceder con JSL?
Automatización y secuencias de comandosventanasRe: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?¿Qué has probado?
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?
Buen truco: "abusar" de la plataforma Process Screening para salirse de los recuentos de especificaciones por oblea.
muy útil : )
@Neo escribió:
El recuento de fracasos de un PPG determinado es, creo, la suma de los recuentos de fracasos de cada uno de sus miembros.
Me temo: no
- al menos: no en general.
Aquí hay un ejemplo para NPN5 y NPN6. Si sumas los recuentos de fallos, contarás los puntos azul+naranja dos veces.
Para generar rendimientos agrupados (a través de información de pasa/falla agrupada), debe comenzar desde los datos sin procesar.

Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@jthi . Primero necesito separar las letras de los números en los nombres de los parámetros del proceso para organizarlos en grupos. No sé cómo separar texto de números en JSL.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi . Mmmm..
>>>Para generar rendimientos agrupados (a través de información de aprobación/rechazo agrupada), debe comenzar desde los datos sin procesar
Me lo temía....
pero pensando de nuevo y al contrario de lo que pensaba antes, si alguno de los miembros de un PPG en particular no cumple con las especificaciones, el sitio probado falla para ese PPG en particular.
Tengo la sensación de que esto se puede manejar sin tener que volver a los datos sin procesar.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?
@Neo escribió: el sitio probado falla para el PPG en particular.
Pero con el enfoque actual, se agrega en la plataforma de detección de procesos y se pierde la información del sitio.
Digamos que para una de las obleas, NPN5 falla en los sitios 1, 2, 3 y NPN6 falla en 2, 3, 4.
Luego, en la plataforma Process Screening , obtendrás para esta oblea:
- fuera del recuento de especificaciones NPN5: 3
- fuera del recuento de especificaciones NPN6: 3
Creo que la única forma de saber cuántos sitios fallaron para esta oblea (NPN5 o NPN6) es:
ir a la tabla original, contar: 1,2,3,4
-> #falla = 4
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?Estoy de acuerdo con @hogi , debes realizar el cálculo en el nivel en el que todavía tienes acceso al sitio. Si utiliza la selección de procesos, no podrá diferenciar entre superposiciones. Considere que tiene 5 sitios en una oblea y 10 pruebas. Si las obleas solo tienen fallas en el sitio 1 y en TODAS las pruebas, ¿le gustaría contarlo como 1 sitio fallido o como 10 pruebas fallidas ( la publicación de hogi tiene otro ejemplo)? Creo que no quieres contar esto como 10 sitios fallidos.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@jthi @hogi Gracias. Puedo colorear los valores OOS usando lo siguiente
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
); entonces necesito hacer lo siguiente
1. Forme una columna para PPG
2. Asignar una falla a un PPG en particular si alguno de sus miembros tiene una celda de color
Esto sólo necesitará los datos sin procesar.
Todavía no sé cómo realizar ninguno de los dos pasos anteriores, por lo que solicito alguna orientación aquí.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@jthi . Si para una oblea determinada, cualquiera de los miembros de un PPG en particular está fuera de servicio, entonces la prueba falla para este PPG. Un sitio puede no pasar una prueba de PPG en particular pero pasar las pruebas de todos los demás PPG.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?colorea las celdas y luego reúne todas las filas con colores: ¡qué solución tan creativa!
en una versión futura de JMP será mucho más fácil: si este deseo reúne suficientes felicitaciones...
:folded_hands: está en especificación (valor)
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?Después de apoyar << obtener color de celda con un Kudo, mientras esperaba JMP19++,
Podría generar un subconjunto auxiliar, sobrescribir los valores con la información de aprobación/desaprobación 0/1 y sumarlos mediante PPG:
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
);
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi Probando tu script en mi JMP 16.2
La segunda línea parece tener un error tipográfico. Debería ser
col_names = dt << Get Column Group( "Processes" );
y esta parte arroja un error
dt sub << Group Columns( "PPGs", failcols );
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?lo siento -> editado.
Debería haber borrado los símbolos antes de comprobar si el código enviado funciona.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?La creación de grupos se puede hacer usando Regex() y obtener las celdas coloreadas se ha resuelto varias veces en la comunidad, aquí hay una publicación anterior Cómo obtener el número de fila de celdas coloreadas en una columna y asignarle una etiqueta (diga "1 ") en una columna recién creada? . Es posible que este patrón no sea correcto porque no estoy seguro de cómo se deben crear los grupos.
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");
);
y para comprender el patrón, sugiero usar https://regex101.com/ o algún modelo de lenguaje grande (son bastante buenos para explicar patrones de expresiones regulares)
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?También puede ser más fácil utilizar una mesa apilada con algo como esto.

Al menos, es más fácil verificar visualmente lo que está sucediendo (no he verificado estos cálculos)

Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi He probado tu script y funciona como se esperaba. Sin embargo, no entiendo por qué la suma () (¿suma del recuento de errores?) es necesaria aquí.
Eval (Eval Expr(dtsub << new column (PPGs[i], << Set Property( "Spec Limits", {LSL( 0 ), USL(0)} ), set each value (sum (Expr(Name Expr(colGroup)))))))
);¿Podrías arrojar algo de luz por favor?
Gracias
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?ColGroup contiene una lista de nombres de columnas que se están sumando. Para la columna denominada "NPN Fail", la función Suma() se expande a
sum( :NPN1, :NPN2, :NPN3, :NPN4, :NPN5, :NPN6, :NPN7, :NPN8, :NPN9, :NPN10, :NPN11 )
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi @txnelson Gracias. Observo que esta parte del script agrega la cantidad de fallas por sitio para cada miembro para un PPG determinado. No estoy seguro de entender esto.
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)))))))
);Si un sitio falla para cualquier miembro de un PPG determinado, este sitio falla el PPG determinado y no importa si más miembros bajo este PPG fallan en este sitio (¿o importa?) para el rendimiento/oblea del PPG en un lote ?
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?Hola @neo
sí, exactamente, esta es la lógica aplicada para especificar el rendimiento por Grupo PP:
sume los fallos y use USL = 0
si un sitio falla en una especificación, falla.
Si la suma de todos los candidatos es 0, ninguno de ellos falla -> así que pase por el grupo completo en el sitio específico.
¿Preferirías otra lógica?
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi . ¡¡Astuto!! Ahora lo entiendo. No puedo estar más de acuerdo con tu afirmación anterior . Por cierto, lo obtuve originalmente de aquí .
Todavía preferiría la palabra "explotar"...

Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?@hogi Ahora estoy probando el script con mi tabla de datos real.
Los nombres de los parámetros en mi caso tienen la forma ABCD_1_X_Y_1_Z y los PPG se definen mediante varias combinaciones de ABCD...GH (A es siempre una letra, mientras que el resto pueden ser letras o números).
X e Y son números, mientras que Z puede ser un número, una letra o una combinación.
No me pregunten por qué el nombre tiene esa forma: no es obra mía.
Los PPG se forman de la siguiente manera.
- U33P_1_0_0.... estará contenido en el PPG "U33P"
- CASMAPUL23Out_1_0_1_...estará contenido en el PPG "CASMAPUL23Out", y así sucesivamente
Entonces, para obtener el nombre de PPG, necesito obtener la combinación de letras antes del primer guión bajo en el nombre del parámetro. Cómo modificar lo siguiente para que funcione en mi caso.
colGroup = Filter Each({col}, col_names, Substr(col << getname(),1,3) == myName);Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?Consulte las funciones Word() y Words(), suelen ser muy útiles para algo como esto.
Re: ¿Cómo obtener el rendimiento del grupo de parámetros de proceso por "ID de oblea en ID de lote"?Como dice @jthi ,
colGroup = Filter Each({col}, col_names, Word(1, col << getname(),"_") == myName);hará el trabajo 