Fixed an issue preventing surfscan sort pass fail values from being evaluated for multiple scans. Updated CLEAN_INSP_ACTIONS to be able to retrieve UCL values from SPC for records related to WM_OUT records.

This commit is contained in:
Infineon\StieberD
2025-11-17 11:16:00 -07:00
parent 165b6cf943
commit 9749af69cf

View File

@ -77,6 +77,7 @@ $Insert IFX_EQUATES
Equ Comma$ to ',' Equ Comma$ to ','
Declare function Error_Services, Database_Services, Environment_Services, QA_Services, RDS_Services, MemberOf Declare function Error_Services, Database_Services, Environment_Services, QA_Services, RDS_Services, MemberOf
Declare function SRP_Array
Declare subroutine Error_Services, Database_Services, Post_Metrology_Manual_Data_Entry_Log, Service_Services Declare subroutine Error_Services, Database_Services, Post_Metrology_Manual_Data_Entry_Log, Service_Services
Declare subroutine Qa_Services Declare subroutine Qa_Services
@ -467,7 +468,7 @@ WRITE_RECORD_PRE:
SODAvg = OConv(ScanDefectsAvg<0, ScanRecipeIndex>, 'MD3') SODAvg = OConv(ScanDefectsAvg<0, ScanRecipeIndex>, 'MD3')
NumFailedWafers = 0 NumFailedWafers = 0
For each WaferSOD in ScanSODPerWafer using @SVM setting WaferIndex For each WaferSOD in ScanSODPerWafer using @SVM setting WaferIndex
WaferSort = ScanSortPerWafer<0, ScanRecipeIndex, WaferIndex> WaferSort = ScanSortPerWafer<0, 0, WaferIndex>
If ( (WaferSOD NE '') or (WaferSort NE '') ) then If ( (WaferSOD NE '') or (WaferSort NE '') ) then
// We have SOD data for this wafer so check if it is < SOD Max // We have SOD data for this wafer so check if it is < SOD Max
If ( (WaferSOD LE SpecDefect) and (WaferSort NE 'FAIL') ) then If ( (WaferSOD LE SpecDefect) and (WaferSort NE 'FAIL') ) then
@ -633,22 +634,29 @@ WRITE_RECORD_PRE:
Case Stage _EQC 'POST' Case Stage _EQC 'POST'
If SpecRecipes NE '' then If SpecRecipes NE '' then
// Check each scan recipe. // Check each scan recipe.
For each ScanRecipeName in ScanRecipes using @VM setting ScanRecipeIndex For each ScanRecipeName in ScanRecipes using @VM setting ScanRecipeIndex
Locate ScanRecipeName in SpecRecipes using @VM setting SpecRecipeIndex then Locate ScanRecipeName in SpecRecipes using @VM setting SpecRecipeIndex then
// Get UCL value from SPC for each spec recipe if they have not yet been retrieved. // Get UCL value from SPC for each spec recipe if they have not yet been retrieved.
UCL = Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex> UCL = Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex>
If (UCL EQ '') or (UCL EQ 0) then If ( (UCL EQ '') or (UCL EQ 0) ) then
// The UCL has not yet been retrieved from SPC or an error could have If IsWmOut then
// occurred when the last attempt to retrieve it, so try to get it now. WMOutKey = Record<CLEAN_INSP_WO_NO$>:'*':Record<CLEAN_INSP_WO_STEP$>:'*':Record<CLEAN_INSP_CASS_NO$>
UCL = QA_Services('PostUCLRequest', RDSKey, ScanRecipeName) RDSKeys = Xlate('WM_OUT', WMOutKey, WM_OUT_RDS$, 'X')
If (UCL NE '') and (UCL NE 0) then RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', 'X')
Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex> = UCL If RDSKeys NE '' then RDSKey = RDSKeys<0, 1>
end else end
ErrorMessage = 'Error retrieving UCL value from QA_Services in CLEAN_INSP_ACTIONS' If (RDSKey NE '') then
Error_Services('Add', ErrorMessage) // The UCL has not yet been retrieved from SPC or an error could have
end // occurred when the last attempt to retrieve it, so try to get it now.
UCL = QA_Services('PostUCLRequest', RDSKey, ScanRecipeName)
If (UCL NE '') and (UCL NE 0) then
Record<CLEAN_INSP_SPEC_SUM_OF_DEF_AVG$, SpecRecipeIndex> = UCL
end else
ErrorMessage = 'Error retrieving UCL value from QA_Services in CLEAN_INSP_ACTIONS'
Error_Services('Add', ErrorMessage)
end
end
end end
SpecSampleQty = Record<CLEAN_INSP_SPEC_SS_SAMP_QTY$, SpecRecipeIndex> SpecSampleQty = Record<CLEAN_INSP_SPEC_SS_SAMP_QTY$, SpecRecipeIndex>
SpecDefect = Oconv(SpecDefects<0, SpecRecipeIndex>, 'MD0') SpecDefect = Oconv(SpecDefects<0, SpecRecipeIndex>, 'MD0')
@ -666,7 +674,7 @@ WRITE_RECORD_PRE:
SODAvg = OConv(ScanDefectsAvg<0, ScanRecipeIndex>, 'MD3') SODAvg = OConv(ScanDefectsAvg<0, ScanRecipeIndex>, 'MD3')
NumFailedWafers = 0 NumFailedWafers = 0
For each WaferSOD in ScanSODPerWafer using @SVM setting WaferIndex For each WaferSOD in ScanSODPerWafer using @SVM setting WaferIndex
WaferSort = ScanSortPerWafer<0, ScanRecipeIndex, WaferIndex> WaferSort = ScanSortPerWafer<0, 0, WaferIndex>
If ( (WaferSOD NE '') or (WaferSort NE '') ) then If ( (WaferSOD NE '') or (WaferSort NE '') ) then
// We have SOD data for this wafer so check if it is < SOD Max // We have SOD data for this wafer so check if it is < SOD Max
If ( (WaferSOD LE SpecDefect) and (WaferSort NE 'FAIL') ) then If ( (WaferSOD LE SpecDefect) and (WaferSort NE 'FAIL') ) then
@ -700,10 +708,7 @@ WRITE_RECORD_PRE:
Case (SigRequired EQ True$) AND (ScanSig EQ '') Case (SigRequired EQ True$) AND (ScanSig EQ '')
ROTRAction = 'F' ROTRAction = 'F'
ROTRActionReason = 'SurfScan signature is missing.' ROTRActionReason = 'SurfScan signature is missing.'
Case (ScanDefect GT SpecDefect) Case (ScanDefect GT SpecDefect) or ( Not(ROTREnabled) and (NumFailedWafers GT 0) ) or ( ROTREnabled and (NumFailedWafers GE ROTRFailLimit) )
ROTRAction = 'F'
ROTRActionReason = 'SurfScan data out of bounds.'
Case ROTREnabled and (NumFailedWafers GE ROTRFailLimit)
ROTRAction = 'F' ROTRAction = 'F'
ROTRActionReason = 'SurfScan data out of bounds.' ROTRActionReason = 'SurfScan data out of bounds.'
Case (ScanHaze GT SpecHaze) Case (ScanHaze GT SpecHaze)