如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?以下示例脚本使用示例半导体能力数据表获取每个“批次 ID 中的晶圆 ID”的“工艺参数”产量。
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" );现在让我们调用工艺参数“PP”、工艺参数组“PPG”和批次 ID“wfrIDinLotID”中的晶圆 ID
接下来我想提取每个 wfrIDinLotID 的 PPG 收益,其中 PPG 定义为:
- 所有 PNP 均位于一个组中
- 另一组中的所有 NPN
- 所有的 INM 都属于另一个组,依此类推。
即,所有由下面一行生成的 PP,但末尾没有数字,构成 PPG 名称。
cdt_ps << Summary(Group( :Process Parameter ), Freq( "None" ), Weight( "None" ));
我还不知道如何在 JSL 的新列中获取 PPG 名称。因此,需要一些帮助。
一些 PPG 可能只有一名成员,这没问题。
我认为,给定 PPG 的失败计数是其每个成员的失败计数的总和,稍后可从上述脚本中获得。
因此,对于特定的 wfrIDinLotID,给定 PPG 的“超出规格数量”预计只有一个数值。这将进入一个新列,我们称之为 OOSC_PPG。
给定 wfrIDinLotID 的 PPG 收益将为 100*(OOSC_PPG = 0 的 SITE 数量)/ 测试的 SITE 总数。
在示例数据表中,每个 wfrIDinLotID 测试的站点总数为 5。
最后,我想要生成一个包含 3 列的报告:wfrIDinLotID、PPG、PPG 收益率。
请问您能给我一些有关如何继续使用 JSL 的指导吗?
自动化和脚本视窗回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?你尝试过什么?
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?
很酷的技巧:“滥用”工艺筛选平台来摆脱每个晶圆的规格数量。
很有帮助 : )
@Neo写道:
我认为,给定 PPG 的失败计数是其每个成员的失败计数的总和
我担心:没有
- 至少:一般来说不是。
这是 NPN5 和 NPN6 的示例。如果将失败次数相加,您将计算蓝色+橙色点两次。
要生成分组收益(通过分组的通过/失败信息),您必须从原始数据开始。

回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@jthi 。首先,我需要将流程参数名称中的字母与数字分开,以便将它们分组排列。不知道如何在 JSL 中将文本与数字分开。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi 。嗯..
>>>要生成分组产量(通过分组通过/失败信息),您必须从原始数据开始
我是如此害怕......
但再想想,与我之前的想法相反,如果特定PPG 的任何一个成员不符合规格,则测试站点对于特定 PPG 来说就会失败。
我觉得,无需返回原始数据就可以处理这个问题。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?
@Neo写道:测试站点未达到特定的 PPG 标准。
但采用当前的方法,您会在流程筛选平台中进行聚合 - 并丢失站点信息。
假设其中一个晶圆的 NPN5 在站点 1、2、3 发生故障,而 NPN6 在站点 2、3、4 发生故障。
然后在工艺筛选平台中,您将获得此晶圆的以下信息:
- 超出规格数量 NPN5 : 3
- 超出规格数量 NPN6 : 3
我认为找出此晶圆(NPN5 或 NPN6)有多少个站点发生故障的唯一方法是:
转到原始表格,计数:1,2,3,4
-> #失败 = 4
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?我同意@hogi的观点,您必须在您仍可以访问该站点的级别上执行计算。如果您使用流程筛选,您将无法区分重叠。假设您在晶圆上有 5 个站点和 10 个测试。如果晶圆仅在站点 1 上出现故障,并且所有测试都失败,您想将其算作 1 个失败站点还是 10 个失败测试( hogi 的帖子有其他示例)。我想您不想将其算作 10 个失败站点?
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@jthi @hogi谢谢。我可以使用以下方法为 OOS 值着色
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
); 然后我需要做以下事情
1. 为 PPG 建立一个专栏
2. 如果某个 PPG 的任何成员有彩色单元格,则将该 PPG 标记为失败
这只需要原始数据。
我还不知道如何执行上述两个步骤,因此在此请求一些指导。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@jthi 。如果对于给定的晶圆,特定 PPG 的任何一个成员为 OOS,则该 PPG 的测试失败。一个站点可能未通过特定 PPG 测试,但通过了所有其他 PPG 的测试。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?给单元格着色,然后收集所有有颜色的行 - 多么有创意的解决方法!
在 JMP 的未来版本中,它将变得更加容易 - 如果这个愿望收集到足够多的 Kudos...
:folded_hands: 符合规格(价值)
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?在等待 JMP19++ 时,支持<< 使用 Kudo 获取单元格颜色之后,
您可以生成一个辅助子集,用通过/失败 0/1 信息覆盖这些值,然后通过 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
);
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi在我的 JMP 16.2 中测试你的脚本
第二行似乎有拼写错误。应该是
col_names = dt << Get Column Group( "Processes" );
这部分正在抛出错误
dt sub << Group Columns( "PPGs", failcols );
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?抱歉 -> 已编辑。
我应该在仔细检查提交的代码是否有效之前清除符号。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?可以使用 Regex() 创建组,而获取彩色单元格的问题在社区中已多次得到解决,这里有一篇较旧的帖子如何获取列中彩色单元格的行数并在新创建的列中为其分配标签(例如“1”)?。这种模式可能不正确,因为我不确定应该如何创建组
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");
);
为了理解这种模式,我建议使用https://regex101.com/或一些大型语言模型(它们非常擅长解释正则表达式模式)
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?另外,使用类似这样的堆叠表也可以更容易

如果没有其他事情,更容易通过视觉验证正在发生的事情(我还没有验证这些计算)

回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi我测试了你的脚本,它按预期工作。但是,我不明白为什么这里需要 sum()(失败次数之和?)。
Eval (Eval Expr(dtsub << new column (PPGs[i], << Set Property( "Spec Limits", {LSL( 0 ), USL(0)} ), set each value (sum (Expr(Name Expr(colGroup)))))))
);您能解释一下吗?
谢谢
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?ColGroup 包含要汇总在一起的列名列表。对于名为“NPN Fail”的列,Sum() 函数扩展为
sum( :NPN1, :NPN2, :NPN3, :NPN4, :NPN5, :NPN6, :NPN7, :NPN8, :NPN9, :NPN10, :NPN11 )
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi @txnelson谢谢。我注意到脚本的这一部分为给定的 PPG 中的每个成员添加了每个站点的失败次数。我不确定我是否理解了这一点。
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)))))))
);如果某个站点对于给定的 PPG 中的任何一个成员都发生故障,那么该站点就不符合给定的 PPG 的要求,并且对于某个批次的 PPG 良率/晶圆而言,即使该 PPG 下的更多成员在此站点发生故障也无所谓(或者这有关系吗?)?
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?嗨@Neo
是的,确实如此,这是指定每个 PP 组收益率的应用逻辑:
汇总失败并使用USL = 0
如果一个站点不符合某项规范,那么它就失败了。
如果所有候选人的总和为 0,则没有候选人失败 -> 因此整个组在特定站点通过。
您想要其他逻辑吗?
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi 。狡猾!!我现在明白了。我非常同意你之前的说法。顺便说一句,我最初是从这里得到这个消息的。
我还是更喜欢“利用”这个词...

回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?@hogi我现在正在用我的实际数据表测试脚本。
在我的例子中,参数名称的形式为ABCD_1_X_Y_1_Z,PPG 由 ABCD...GH 的各种组合定义(A 始终是字母,而其余可以是字母或数字)。
X 和 Y 是数字,而 Z 可以是数字、字母或组合。
不要问我为什么采用这样的命名形式——这不是我做的。
PPG 的形成方式如下
- U33P_1_0_0....将包含在PPG“U33P”中
- CASMAPUL23Out_1_0_1_...将包含在 PPG“CASMAPUL23Out”中,依此类推
因此,要获取 PPG 名称,我需要获取参数名称中第一个下划线之前的字母组合。如何修改以下内容以适用于我的情况。
colGroup = Filter Each({col}, col_names, Substr(col << getname(),1,3) == myName);回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?检查 Word() 和 Words() 函数,它们通常对于这样的事情非常有用。
回复:如何获取每个“批次 ID 中的晶圆 ID”的工艺参数组产量?正如@jthi所说,
colGroup = Filter Each({col}, col_names, Word(1, col << getname(),"_") == myName);可以完成工作:)