Updated Method to determine if test wafer is required.

This commit is contained in:
Infineon\Ouellette 2025-01-30 14:51:45 -07:00 committed by Ouellette Jonathan (CSC FI SPS MESLEO)
parent 2768c1e7f9
commit 0da14ae4ae
2 changed files with 155 additions and 42 deletions

View File

@ -89,7 +89,7 @@ Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_Reac
Declare subroutine Lot_Services Declare subroutine Lot_Services
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
Declare function QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services Declare function QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services
Declare function Datetime Declare function Datetime, Test_Run_Services
SubclassInfo = Form_Services('FindSubclassControl') SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1> Subclass = SubclassInfo<1>
@ -351,9 +351,63 @@ Event PUB_SIGN.CLICK()
If (Valid EQ True$) then If (Valid EQ True$) then
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ then if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ then
UsingTestWafers = False$ UsingTestWafers = False$
if ReactorType NE 'EPP' then ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?') If ExistingTestWafersLogged EQ '' then
end if ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
end
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If UsingTestWafers then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else
If IsTWReqd then
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
If Override then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If ContinueLoad then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end
end else
if IsTWReqd EQ False$ then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
If Override then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end else
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ then
UsingTestWafers = False$
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged EQ '' then
if ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
end
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo) IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If UsingTestWafers then If UsingTestWafers then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor) TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
@ -361,7 +415,13 @@ Event PUB_SIGN.CLICK()
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else end else
If IsTWReqd then If IsTWReqd then
Msg(@Window, 'Unable to sign load because test wafer logging is required on this run.') UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
If Override then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else end else
ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?') ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If ContinueLoad then If ContinueLoad then
@ -373,27 +433,20 @@ Event PUB_SIGN.CLICK()
if IsTWReqd EQ False$ then if IsTWReqd EQ False$ then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else end else
Msg(@Window, 'Unable to sign load because test wafer logging is required on this run.') UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
If Override then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end end
end end
end else end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end end
end
end else
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
If UsingTestWafers then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else
ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If ContinueLoad then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end else end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide) QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end end
@ -720,3 +773,4 @@ return

View File

@ -70,6 +70,7 @@ $Insert REACT_RUN_EQUATES
$Insert REACTOR_EQUATES $Insert REACTOR_EQUATES
$Insert WO_MAT_QA_EQUATES $Insert WO_MAT_QA_EQUATES
$Insert PRS_STAGE_EQUATES $Insert PRS_STAGE_EQUATES
$Insert PRS_PROP_EQUATES
$Insert WO_LOG_EQUATES $Insert WO_LOG_EQUATES
$Insert WM_OUT_EQUATES $Insert WM_OUT_EQUATES
$Insert REACT_UTIL_EQU $Insert REACT_UTIL_EQU
@ -743,31 +744,88 @@ Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
Response = IsValid Response = IsValid
end service end service
Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
table = "RDS"
ErrorMessage = ''
RDSRecords = ''
RDSSortedByAssignmentDTM = ''
Open "DICT ":table To @DICT Else
ErrorMessage = 'Error opening RDS dictionary'
End
If ErrorMessage EQ '' then
srch_strng = "WO":@VM:WO:@FM:"REACTOR":@VM:ReactorNo:@FM
option = ""
flag = ""
Btree.Extract(srch_strng, table, @DICT, RDSRecords, option, flag)
end
RDSRecordsWithPreEpiSig = ''
for each RDSKey in RDSRecords using @VM setting RDSPos
ThisRDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey, True$, 0, False$)
ThisRDSPreEpiDT = ThisRDSRec<RDS_PRE_EPI_SIG_DATE$>
ThisRDSPreEpiTM = ThisRDSRec<RDS_PRE_EPI_SIG_TIME$>
ThisRDSPreEpiDTM = SRP_Datetime('Combine', ThisRDSPreEpiDT, ThisRDSPreEpiTM)
RDSRecordsWithPreEpiSig<1, RDSPos> = RDSKey
RDSRecordsWithPreEpiSig<2, RDSPos> = ThisRDSPreEpiDTM
Next RDSKey
RDSSortedByAssignmentDTM = SRP_Sort_Array(RDSRecordsWithPreEpiSig, 'AN2', 0)
FinalRDSSortedByAssignmentDTM = ''
for each RDS in RDSSortedByAssignmentDTM<1> using @VM setting SortedRDSPos
ThisRDSDtm = RDSSortedByAssignmentDTM<2, SortedRDSPos>
if ThisRDSDtm GT 0 then
FinalRDSSortedByAssignmentDTM<1, -1> = RDS
FinalRDSSortedByAssignmentDTM<2, -1> = OConv(ThisRDSDtm, 'DT')
end
Next RDS
Response = FinalRDSSortedByAssignmentDTM<1>
end service
Service IsTWLoggingReqd(RDSNo) Service IsTWLoggingReqd(RDSNo)
Response = False$ IsTWReqd = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo, True$, 0, False$) ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
ReactorNo = RDSRec<RDS_REACTOR$> If ExistingTWRuns EQ '' then
ReactorType = Database_Services('ReadDataColumn', 'REACTOR', ReactorNo, REACTOR_REACT_TYPE$) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
If ReactorType NE 'EPP' then WONo = RDSRec<RDS_WO$>
IsHGCVReqd = obj_RDS('MetPropFlag', RDSNo:@RM:RDSRec:@RM:'CRES') ReactNo = RDSRec<RDS_REACTOR$>
If IsHGCVReqd EQ True$ then ThisReactorRunOrder = 0
ExistingTWKeys = Test_Run_Services('GetTestRunKeysByRDS', RDSNo) ReactRDSNos = RDS_Services('GetRDSRunHistoryByReactorAndWO', ReactNo, WONo)
If ExistingTWKeys EQ '' then LOCATE RDSNo IN ReactRDSNos USING @VM SETTING ThisReactorRunOrder ELSE Return
Response = True$ PSNo = RDSRec<RDS_PROD_SPEC_ID$>
end else PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
Response = False$ PRSLayerKeys = PSRec<PROD_SPEC_PRS_LAYER_KEY$>
end for each PRSLayerKey in PRSLayerKeys using @VM
PRSPropKeys = Database_Services('ReadDataColumn', 'PRS_LAYER', PRSLayerKey, 5)
end else for each PRSPropKey in PRSPropKeys using @VM
Response = False$ PRSPropRec = Database_Services('ReadDataRow', 'PRS_PROP', PRSPropKey)
end WaferType = PRSPropRec<6>
TestType = Field(PRSPropKey, '*', 3)
Layer = Field(PRSPropKey, '*', 2)
MeasureFreq = PRSPropRec<PRS_PROP_FREQ$>
Start = PRSPropRec<PRS_PROP_MET_START$>
If WaferType NE 'Product' AND WaferType NE 'Prod' then
BEGIN CASE
CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1
CASE ThisReactorRunOrder = Start ; IsTWReqd = 1
CASE NUM(MeasureFreq)
IF MOD(ThisReactorRunOrder,MeasureFreq) - Start = 0 THEN
IsTWReqd = True$
END
END CASE
end
Until IsTWReqd EQ True$
Next PRSPropKey
Until IsTWReqd EQ True$
Next PRSLayerKey
end else end else
Response = False$ IsTWReqd = False$
end end
//The code below will be removed upon final production usage.
TWTrackingSystemActive = Database_Services('ReadDataColumn', 'APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, True$, 0, False$) TWTrackingSystemActive = Database_Services('ReadDataColumn', 'APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, True$, 0, False$)
If TWTrackingSystemActive EQ False$ then If TWTrackingSystemActive EQ False$ then
Response = False$ IsTWReqd = False$
end end
Response = IsTWReqd
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -1703,3 +1761,4 @@ return