2281 lines
56 KiB
Plaintext
2281 lines
56 KiB
Plaintext
COMPILE FUNCTION obj_React_Run(Method,Parms)
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
/*
|
|
Methods for REACT_RUN table
|
|
|
|
02/20/2004 JCH - Initial Coding
|
|
|
|
Properties:
|
|
|
|
Methods:
|
|
|
|
Create(DataStruct) ;* Create new record
|
|
|
|
|
|
*/
|
|
|
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
|
DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg, obj_Post_Log, Logging_Services
|
|
|
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
|
|
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
|
|
|
|
$INSERT APP_INSERTS
|
|
$INSERT REACT_RUN_EQUATES
|
|
$INSERT REACTOR_EQUATES
|
|
$INSERT MSG_EQUATES
|
|
$INSERT WO_VERIFY_EQU
|
|
$INSERT WO_LOG_EQUATES
|
|
$INSERT WO_WFR_EQUATES
|
|
$INSERT RDS_LAYER_EQUATES
|
|
$INSERT RDS_TEST_EQUATES
|
|
$INSERT RUN_STAGE_EQUATES
|
|
$INSERT RUN_STAGE_WFR_EQUATES
|
|
$INSERT TOOL_EQUATES
|
|
$INSERT TOOL_CLASS_EQUATES
|
|
$INSERT POPUP_EQUATES
|
|
$INSERT LOGICAL
|
|
$INSERT QUOTE_SPEC_EQU
|
|
$INSERT PROD_SPEC_EQUATES
|
|
$INSERT WO_STEP_EQU
|
|
$INSERT WO_MAT_EQUATES
|
|
|
|
|
|
EQU COL$POCKET TO 1 ;* Susceptor Load columns
|
|
EQU COL$USAGE TO 2
|
|
EQU COL$ZONE TO 3
|
|
EQU COL$SAT_ID TO 4
|
|
EQU COL$WAFER_TYPE TO 5
|
|
EQU COL$IN_SLOT_ID TO 6
|
|
EQU COL$WFR_ID TO 7
|
|
EQU COL$OUT_SLOT_ID TO 8
|
|
|
|
|
|
EQU COL$WO_NO TO 1 ;* Data structure equates for EpiMetData
|
|
EQU COL$RDS_NO TO 2
|
|
EQU COL$REACTOR TO 3
|
|
EQU COL$Z1_MET_NO TO 4
|
|
EQU COL$Z1_THICKNESS TO 5
|
|
EQU COL$Z1_4PP_SHEET_RHO TO 6
|
|
EQU COL$Z1_HGCV_RESL1 TO 7
|
|
EQU COL$Z1_HGCV_RESL2 TO 8
|
|
EQU COL$Z2_MET_NO TO 9
|
|
EQU COL$Z2_THICKNESS TO 10
|
|
EQU COL$Z2_4PP_SHEET_RHO TO 11
|
|
EQU COL$Z2_HGCV_RESL1 TO 12
|
|
EQU COL$Z2_HGCV_RESL2 TO 13
|
|
|
|
EQU GWS$STAGE TO 1 ;* Used to extract data from 'GAN_WFR_STAGE' popup
|
|
EQU GWS$DESC TO 2
|
|
EQU GWS$CHAR TO 3
|
|
EQU GWS$TOOL_CLASS TO 4
|
|
|
|
$INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec values
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\REACT_RUN'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LOAD_WFR_CNT.csv'
|
|
Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'LOAD_WFR_CNT'
|
|
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
ErrTitle = 'Error in Stored Procedure "obj_React_Run"'
|
|
ErrorMsg = ''
|
|
ErrCode = ''
|
|
|
|
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
|
|
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
RETURN ''
|
|
END
|
|
|
|
|
|
Result = ''
|
|
|
|
BEGIN CASE
|
|
|
|
CASE Method = 'RunStatus' ; GOSUB RunStatus
|
|
CASE Method = 'Create' ; GOSUB Create
|
|
CASE Method = 'GetMetKeys' ; GOSUB GetMetKeys
|
|
CASE Method = 'Delete' ; GOSUB Delete
|
|
CASE Method = 'ChangeFlag' ; GOSUB ChangeFlag
|
|
CASE Method = 'EpiMetData' ; GOSUB EpiMetData
|
|
CASE Method = 'SetSchedQty' ; GOSUB SetSchedQty
|
|
CASE Method = 'WafersUnloaded' ; GOSUB WafersUnloaded
|
|
CASE Method = 'Zone' ; GOSUB Zone
|
|
CASE Method = 'SigProfile' ; GOSUB SigProfile
|
|
CASE Method = 'SigBy' ; GOSUB SigBy
|
|
CASE Method = 'SigDTM' ; GOSUB SigDTM
|
|
CASE Method = 'WfrsUnloadedDt' ; GOSUB WfrsUnloadedDt
|
|
CASE Method = 'AddCI' ; GOSUB AddCI
|
|
CASE Method = 'GetCINo' ; GOSUB GetCINo
|
|
CASE Method = 'LoadMat' ; GOSUB LoadMat
|
|
CASE Method = 'ReturnMat' ; GOSUB ReturnMat
|
|
CASE Method = 'UnloadMat' ; GOSUB UnloadMat
|
|
CASE Method = 'ReloadMat' ; GOSUB ReloadMat
|
|
CASE Method = 'UnloadGan' ; GOSUB UnloadGan
|
|
CASE Method = 'ReloadGan' ; GOSUB ReloadGan
|
|
CASE Method = 'SplitWfr' ; GOSUB SplitWfr
|
|
CASE Method = 'UnSplitWfr' ; GOSUB UnSplitWfr
|
|
CASE Method = 'GetWfrSigKeys' ; GOSUB GetWfrSigKeys
|
|
CASE Method = 'NextWfrStage' ; GOSUB NextWfrStage
|
|
CASE Method = 'ShipGANWfrs' ; GOSUB ShipGANWfrs
|
|
CASE Method = 'UnShipGANWfrs' ; GOSUB UnShipGANWfrs
|
|
CASE Method = 'CharWfrDest' ; GOSUB CharWfrDest
|
|
CASE Method = 'CharWfrStatus' ; GOSUB CharWfrStatus
|
|
CASE Method = 'ClearCarrNCR' ; GOSUB ClearCarrNCR
|
|
CASE Method = 'GaNDispStatus' ; GOSUB GaNDispStatus
|
|
Case Method = 'WfrStageUnloadQ' ; Gosub WfrStageUnloadQ
|
|
CASE Method = 'StageUnloadQ' ; GOSUB StageUnloadQ
|
|
|
|
CASE 1
|
|
|
|
END CASE
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
END
|
|
|
|
RETURN Result
|
|
|
|
* * * * * * *
|
|
Create:
|
|
* * * * * * *
|
|
|
|
WONo = Parms[1,@RM]
|
|
WOStep = Parms[COL2()+1,@RM]
|
|
CassNo = Parms[COL2()+1,@RM]
|
|
PSNo = Parms[COL2()+1,@RM]
|
|
|
|
IF WONo = '' THEN ErrorMsg = 'Null Parameter "WONo" passed to routine. (':Method:')'
|
|
IF WOStep = '' THEN ErrorMsg = 'Null Parameter "WOStep" passed to routine. (':Method:')'
|
|
IF CassNo = '' THEN ErrorMsg = 'Null Parameter "CassNo" passed to routine. (':Method:')'
|
|
IF PSNo = '' THEN ErrorMsg = 'Null Parameter "PSNo" passed to routine. (':Method:')'
|
|
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
RunNo = NextKey('REACT_RUN')
|
|
|
|
|
|
RunRec = ''
|
|
|
|
RunRec<REACT_RUN_WO_NO$> = WONo
|
|
RunRec<REACT_RUN_WO_STEP$> = WOStep
|
|
RunRec<REACT_RUN_CASS_NO$> = CassNo
|
|
RunRec<REACT_RUN_ENTER_BY$> = @USER4
|
|
RunRec<REACT_RUN_ENTER_DTM$> = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MT'),'DT')
|
|
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$>
|
|
|
|
RunRec<REACT_RUN_SPECIAL_INST$> = PSRec<Prod_Spec_Spec_Substrate$,QSSubInstructions$>
|
|
|
|
LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNo:@RM:@RM:1) ;* Returns specs for all layers in internal format
|
|
|
|
|
|
* LayerSpecs is @RM between layers, @FM between fields, LayerSet ID is in the first Field and needs to peeled off
|
|
* before the equates match up correctly
|
|
|
|
* Prod_Spec table has layer specs all in one field
|
|
* RDS has First layer stuff in individual fields and then has 2 and 3 shoved into Field 33 (Layer Info)
|
|
|
|
LayerSpec = FIELD(LayerSpecs,@RM,1) ;* Take the first Layer
|
|
LayerSet = FIELD(LayerSpec,@FM,1) ;* Not used here but shown for clarity
|
|
LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
|
|
|
RecipeNo = LayerSpec<PRS_LAYER_RECIPE$>
|
|
RecipeRec = XLATE('RECIPE',RecipeNo,'','X') ;* This used in 2nd and 3rd layer stuff (in error it appears)
|
|
|
|
|
|
FOR I = 1 TO COUNT(LayerSpecs,@RM) + (LayerSpecs NE '')
|
|
LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer
|
|
LayerSet = FIELD(LayerSpec,@FM,1)
|
|
LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
|
|
|
obj_RDS_Layer('Create',RunNo:@RM:LayerSet:@RM:PSNo)
|
|
|
|
RunRec<REACT_RUN_RDS_LAYER_KEYS$,I> = RunNo:'*':LayerSet
|
|
|
|
obj_RDS_Test('Create',RunNo:@RM:LayerSet:@RM:PSNo)
|
|
|
|
NEXT I
|
|
|
|
|
|
************************
|
|
psCnt = COUNT(PRSStageKeys,@VM) + (PRSStageKeys NE '')
|
|
|
|
FOR N = 1 TO psCnt
|
|
Stage = FIELD(PRSStageKey<1,N>,'*',2)
|
|
|
|
IF Stage = 'PRE' AND ReactorType NE 'EPP' THEN
|
|
|
|
CINo = obj_Clean_Insp('Create',RunNo:@RM:Stage:@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record
|
|
RunRec = INSERT(RunRec,REACT_RUN_CI_NO$,Pos,0,CINo)
|
|
RunRec = INSERT(RunRec,REACT_RUN_CI_STAGE$,Pos,0,Stage)
|
|
|
|
END ;* End of check for EpiPRO reactor
|
|
|
|
|
|
|
|
IF INDEX(PRSStageKeys,'WI',1) THEN
|
|
WfrCINo = obj_Clean_Insp('Create',RunNo:@RM:'WFR':@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record
|
|
RunRec<REACT_RUN_WFR_CI_NO$> = WfrCINo
|
|
END
|
|
|
|
IF ReactorType NE 'EPP' THEN
|
|
|
|
IF INDEX(PRSStageKeys,'POST',1) THEN
|
|
PostCINo = obj_Clean_Insp('Create',RunNo:@RM:'POST':@RM:PSNo:@RM:PSRec) ;* This is a new CLEAN_INSP record
|
|
RunRec<REACT_RUN_POST_CI_NO$> = PostCINo
|
|
END
|
|
END ;* End of check for EpiPRO reactor
|
|
NEXT N
|
|
|
|
obj_Tables('WriteRec','REACT_RUN':@RM:RunNo:@RM:@RM:RunRec)
|
|
|
|
Result = RunNo
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
RunStatus:
|
|
* * * * * * *
|
|
|
|
IF NOT(ASSIGNED(RDSNo)) THEN
|
|
RDSNo = Parms[1,@RM]
|
|
ReactRunRec = Parms[COL2()+1,@RM]
|
|
END
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF ReactRunRec = '' THEN
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
|
|
|
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
|
|
|
|
IF MetOutOfSpec > 0 THEN
|
|
Result = 'SPEC'
|
|
RETURN
|
|
END
|
|
|
|
ReactType = XLATE('REACTOR',ReactRunRec<REACT_RUN_REACTOR$>,REACTOR_REACT_TYPE$,'X')
|
|
|
|
IF ReactType = 'EPP' THEN
|
|
|
|
PocketChars = ReactRunRec<REACT_RUN_POCKET_CHAR$>
|
|
InCassNos = ReactRunRec<REACT_RUN_IN_CASS_NO$>
|
|
OutCassNos = ReactRunRec<REACT_RUN_OUT_CASS_NO$>
|
|
WaferChars = ReactRunRec<REACT_RUN_WAFER_CHAR$>
|
|
UnloadSig = ReactRunRec<REACT_RUN_UNLOAD_SIG$>
|
|
|
|
TestFlag = 0
|
|
ProdTestFlag = 0
|
|
ProductionWafersLoaded = 0
|
|
ProductionWafersUnloaded = 0
|
|
|
|
FOR I = 1 TO COUNT(InCassNos,@VM) + (InCassNos NE '')
|
|
PocketChar = PocketChars<1,I>
|
|
WaferChar = WaferChars<1,I>
|
|
IF PocketChar = 'TEST' THEN
|
|
IF WaferChar = 'PROD' THEN ProdTestFlag = 1
|
|
IF WaferChar = 'TEST' THEN TestFlag = 1
|
|
END ELSE
|
|
IF PocketChar = '' THEN
|
|
IF InCassNos<1,I> NE '' THEN ProductionWafersLoaded += 1
|
|
IF OutCassNos<1,I> NE '' THEN ProductionWafersUnloaded += 1
|
|
END
|
|
END
|
|
NEXT I
|
|
|
|
MetEntered = XLATE('RDS_LAYER',LSKeys,'TEST_MET_ENTERED','X')
|
|
IF INDEX(MetEntered,'0',1) THEN
|
|
MetComplete = 0
|
|
END ELSE
|
|
MetComplete = 1
|
|
END
|
|
|
|
BEGIN CASE
|
|
CASE ProductionWafersLoaded = 0 AND (TestFlag = 1 OR ProdTestFlag = 1) AND UnloadSig = '' ; Result = 'TLOAD'
|
|
CASE ProductionWafersLoaded = 0 AND (TestFlag = 1 OR ProdTestFlag = 1) AND UnloadSig NE '' ; Result = 'TULOAD'
|
|
CASE ProductionWafersLoaded = 0 AND TestFlag = 0 ; Result = 'RLOAD'
|
|
CASE ProductionWafersLoaded > 0 AND ProductionWafersUnloaded = 0 ; Result = 'LOAD'
|
|
CASE ProductionWafersLoaded = ProductionWafersUnloaded AND MetComplete = 1 ; Result = 'ULOAD'
|
|
CASE ProductionWafersLoaded = ProductionWafersUnloaded AND MetComplete = 0 ; Result = 'ULMET'
|
|
CASE 1 ; *Result = 'UNK'
|
|
|
|
END CASE
|
|
|
|
END ELSE
|
|
|
|
WONo = ReactRunRec<REACT_RUN_WO_NO$>
|
|
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
|
|
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
|
|
|
RDSKeys = ''
|
|
RSCnt = 0
|
|
RunSigProfs = ''
|
|
RunSignatures = ''
|
|
RunSigDTMs = ''
|
|
|
|
AllSigs = WOMatRec<WO_MAT_SIG_PROFILE$>
|
|
|
|
asCnt = COUNT(AllSigs,@VM) + (AllSigs NE '')
|
|
|
|
FOR I = 1 TO asCnt
|
|
IF AllSigs<1,I>[1,1] = WOStep THEN
|
|
RSCnt += 1
|
|
RunSigProfs<1,RSCnt> = AllSigs<1,I>
|
|
RunSignatures<1,RSCnt> = WOMatRec<WO_MAT_SIGNATURE$,I>
|
|
RunSigDTMs<1,RSCnt> = WOMatRec<WO_MAT_SIG_DTM$,I>
|
|
END
|
|
NEXT I
|
|
|
|
ProcessStart = 0
|
|
ProcessComp = 0
|
|
|
|
LOOP
|
|
RunSignature = RunSignatures<1,1>
|
|
RunSigProf = RunSigProfs<1,1>
|
|
UNTIL RunSignature = ''
|
|
ProcessStart = 1
|
|
RunSignatures = DELETE(RunSignatures,1,1,0)
|
|
RunSigProfs = DELETE(RunSigProfs,1,1,0)
|
|
REPEAT
|
|
|
|
IF RunSignature = '' AND RunSigProf = '' AND ProcessStart = 1 THEN
|
|
Result = 'COMP'
|
|
RETURN
|
|
END ELSE
|
|
Result = RunSigProf[2,20]
|
|
RETURN
|
|
END
|
|
|
|
END
|
|
|
|
// ROTR inspection failure check -> Set status to PSTC (PostCleans)
|
|
If Result EQ 'ULOAD' then
|
|
RotrAction = XLATE('REACT_RUN',RDSNo,'ROTR_ACTION','X')
|
|
|
|
IF RotrAction = 'F' Then ;* Drive the CURR_STATUS to PostEpi Clean if the ROTR fails
|
|
Result = 'PSTC'
|
|
RETURN
|
|
END
|
|
end
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
GetMetKeys:
|
|
* * * * * * *
|
|
|
|
* Returns data structure of 'LSID*ZONE' - @VM in first column associated RDS_TEST numbers in 2nd Column.
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
|
|
IF RdsNo = '' THEN RETURN
|
|
|
|
SortedLSKeys = XLATE('REACT_RUN',RdsNo,'RDS_LS_SORTED','X')
|
|
CONVERT @VM TO @FM IN SortedLSKeys
|
|
|
|
IF SortedLSKeys NE '' THEN
|
|
LSMetKeys = XLATE('RDS_LAYER',SortedLSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X')
|
|
RDSMetZones = XLATE('RDS_TEST',LSMetKeys,RDS_TEST_ZONE$,'X')
|
|
ResultLine = 0
|
|
FOR I = 1 TO COUNT(SortedLSKeys,@FM) + (SortedLSKeys NE '')
|
|
SortedLSKey = SortedLSKeys<I>
|
|
LSMetKey = LSMetKeys<I>
|
|
|
|
FOR N = 1 TO COUNT(LSMetKey,@VM) + (LSMetKey NE '')
|
|
ResultLine += 1
|
|
Result<1,ResultLine> = FIELD(SortedLSKey,'*',2):'*':RDSMetZones<I,N>
|
|
Result<2,ResultLine> = LSMetKeys<I,N>
|
|
NEXT N
|
|
NEXT I
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
Delete:
|
|
* * * * * * *
|
|
|
|
RdsNos = Parms[1,@RM]
|
|
TableVar = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RdsNos = '' THEN RETURN
|
|
IF TableVar = '' THEN RETURN ;* Lock set should be called just prior to this to lock all the RDS's for deletion
|
|
|
|
RdsDTMs = XLATE('REACT_RUN',RdsNos,REACT_RUN_VER_SIG_DTM$,'X')
|
|
|
|
CONVERT @FM TO @VM IN RdsDTMs
|
|
|
|
TestString = RdsDTMs
|
|
|
|
CONVERT @VM TO '' IN TestString
|
|
|
|
IF TestString NE '' THEN
|
|
FOR I = 1 TO COUNT(RdsDTMs,@VM) + (RdsDTMs NE '')
|
|
IF RdsDTMs<1,I> NE '' THEN
|
|
Result<1,-1> = RdsNos<1,I> ;* Return list of RdsNos that have started processing and cannot be deleted
|
|
END
|
|
NEXT I
|
|
ErrorMsg = 'Production started on one or more RDS No(s).'
|
|
RETURN
|
|
END
|
|
|
|
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
|
|
RdsNo = RdsNos<1,I>
|
|
ReactRunRec = XLATE('REACT_RUN',RdsNo,'','X')
|
|
|
|
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
|
MetKeys = XLATE('RDS_LAYER',LSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X')
|
|
|
|
RTParms = 'REACT_RUN':@RM:RdsNo:@RM:TableVar:@RM
|
|
obj_Tables('UnlockRec',RTParms)
|
|
|
|
IF ReactRunRec<REACT_RUN_PRE_CI_NO$> NE '' THEN
|
|
obj_Clean_Insp('Delete',ReactRunRec<REACT_RUN_PRE_CI_NO$>)
|
|
END
|
|
|
|
IF ReactRunRec<REACT_RUN_WFR_CI_NO$> NE '' THEN
|
|
obj_Clean_Insp('Delete',ReactRunRec<REACT_RUN_WFR_CI_NO$>)
|
|
END
|
|
|
|
IF ReactRunRec<REACT_RUN_POST_CI_NO$> NE '' THEN
|
|
obj_Clean_Insp('Delete',ReactRunRec<REACT_RUN_POST_CI_NO$>)
|
|
END
|
|
|
|
obj_RDS_Test('Delete',MetKeys)
|
|
|
|
obj_RDS_Layer('Delete',LSKeys)
|
|
|
|
obj_Tables('DeleteRec','REACT_RUN':RTParms) ;* Deletes and removes the lock
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ChangeFlag:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
FieldNo = Parms[COL2()+1,@RM]
|
|
Value = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
IF FieldNo = '' THEN ErrorMsg = 'Null parameter "Property" passed to routine. (':Method:')'
|
|
|
|
IF Value = '' OR Value = '0' OR Value = '1' ELSE
|
|
ErrorMsg = 'Invalid Flag ':QUOTE(Value):' passed to routine. (':Method:')'
|
|
END
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
ReactRunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN RETURN ;* Probably locked -> return
|
|
|
|
ReactRunRec<FieldNo> = Value
|
|
|
|
otParms = FieldStore(OtParms,@RM,4,0,ReactRunRec) ;* Put record in 4th field of OtParms
|
|
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
SetSchedQty:
|
|
* * * * * * *
|
|
|
|
* This looks like it isn't finished JCH 1/6/2009 JCH **************************
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
ReactRunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN RETURN ;* Probably locked -> return
|
|
|
|
IF ReactRunRec<REACT_RUN_WO_STEP$> = 1 OR ReactRunRec<REACT_RUN_VER_WFR_CNT$> NE '' THEN
|
|
obj_Tables('UnlockRec',otParms)
|
|
RETURN
|
|
END
|
|
|
|
WONo = ReactRunRec<REACT_RUN_WO_NO$>
|
|
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
|
|
|
|
WOMatRec = ''
|
|
|
|
otParms = FieldStore(OtParms,@RM,4,0,ReactRunRec) ;* Put record in 4th field of OtParms
|
|
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
EpiMetData:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
ReactRunRec = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF ReactRunRec = '' THEN
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
IF ReactRunRec = '' THEN RETURN
|
|
|
|
Reactor = ReactRunRec<REACT_RUN_REACTOR$>
|
|
ReactType = XLATE('REACTOR',Reactor,1,'X')
|
|
|
|
IF ReactType NE 'EPP' THEN RETURN
|
|
|
|
|
|
|
|
DataArray = ''
|
|
|
|
DataArray<1,COL$WO_NO> = 'WO No'
|
|
DataArray<1,COL$RDS_NO> = 'RDS No'
|
|
DataArray<1,COL$REACTOR> = 'Reactor'
|
|
DataArray<1,COL$Z1_MET_NO> = 'Z1 Met No'
|
|
DataArray<1,COL$Z1_THICKNESS> = 'Z1 Thickness'
|
|
DataArray<1,COL$Z1_4PP_SHEET_RHO> = 'Z1 4PP Sheet Rho'
|
|
DataArray<1,COL$Z1_HGCV_RESL1> = 'Z1 HgCV Res L1'
|
|
DataArray<1,COL$Z1_HGCV_RESL2> = 'Z1 HgCV Res L2'
|
|
DataArray<1,COL$Z2_MET_NO> = 'Z2 Met No'
|
|
DataArray<1,COL$Z2_THICKNESS> = 'Z2 Thickness'
|
|
DataArray<1,COL$Z2_4PP_SHEET_RHO> = 'Z2 4PP Sheet Rho'
|
|
DataArray<1,COL$Z2_HGCV_RESL1> = 'Z2 HgCV Res L1'
|
|
DataArray<1,COL$Z2_HGCV_RESL2> = 'Z2 HgCV Res L2'
|
|
|
|
|
|
NextLine = 2
|
|
|
|
|
|
WONo = ReactRunRec<REACT_RUN_WO_NO$>
|
|
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
|
Z1MetKeys = {MET_KEYS_Z1}
|
|
Z2MetKeys = {MET_KEYS_Z2}
|
|
Z1MetNo = Z1MetKeys[-1,'B':@VM]
|
|
Z2MetNo = Z2MetKeys[-1,'B':@VM]
|
|
|
|
Z1MetRec = XLATE('RDS_TEST',Z1MetNo,'','X')
|
|
Z2MetRec = XLATE('RDS_TEST',Z2MetNo,'','X')
|
|
|
|
Z1TestPointMap = Z1MetRec<RDS_TEST_TEST_POINT_MAP$>
|
|
Z2TestPointMap = Z2MetRec<RDS_TEST_TEST_POINT_MAP$>
|
|
|
|
Z1MetReadings = ''
|
|
Z2MetReadings = ''
|
|
Z1Results = ''
|
|
Z2Results = ''
|
|
|
|
Z1MetKeyCnt = COUNT(Z1MetKeys,@VM) + (Z1MetKeys NE '')
|
|
|
|
FOR I = 1 TO Z1MetKeyCnt
|
|
|
|
Z1MetKey = Z1MetKeys<1,I>
|
|
Z1LMetReadings = obj_RDS_Test('GetReadSet',Z1MetKey)
|
|
|
|
IF I = 1 THEN
|
|
Z1MetReadings<1> = Z1LMetReadings<1> ;* Line Numbers
|
|
Z1MetReadings<3> = Z1LMetReadings<3> ;* SheetRho
|
|
Z1MetReadings<4> = Z1LMetReadings<4> ;* Hgcv
|
|
END
|
|
|
|
IF Z1MetKeyCnt = 1 THEN
|
|
Z1MetReadings<2> = Z1LMetReadings<2> ;* Thickness readings
|
|
END ELSE
|
|
IF I = 2 THEN Z1MetReadings<5> = Z1LMetReadings<4> ;* Hgcv
|
|
IF I = 3 THEN Z1MetReadings<2> = Z1LMetReadings<2> ;* Thickness readings
|
|
END
|
|
|
|
NEXT I
|
|
|
|
IF Z1MetReadings<1> NE '' THEN
|
|
CONVERT @FM TO @RM IN Z1MetReadings
|
|
oTPM_Parms = Z1TestPointMap:@RM:Z1MetReadings
|
|
Z1Results = obj_Test_Point_Map('PointToResult',oTPM_Parms)
|
|
END
|
|
|
|
|
|
Z2MetKeyCnt = COUNT(Z2MetKeys,@VM) + (Z2MetKeys NE '')
|
|
|
|
FOR I = 1 TO Z2MetKeyCnt
|
|
|
|
Z2MetKey = Z2MetKeys<1,I>
|
|
|
|
Z2LMetReadings = obj_RDS_Test('GetReadSet',Z2MetKey)
|
|
|
|
IF I = 1 THEN
|
|
Z2MetReadings<1> = Z2LMetReadings<1> ;* Line Numbers
|
|
Z2MetReadings<3> = Z2LMetReadings<3> ;* SheetRho
|
|
Z2MetReadings<4> = Z2LMetReadings<4> ;* Hgcv
|
|
END
|
|
|
|
IF Z2MetKeyCnt = 1 THEN
|
|
Z2MetReadings<2> = Z2LMetReadings<2> ;* Thickness readings
|
|
END ELSE
|
|
IF I = 2 THEN Z2MetReadings<5> = Z2LMetReadings<4> ;* Hgcv
|
|
IF I = 3 THEN Z2MetReadings<2> = Z2LMetReadings<2> ;* Thickness readings
|
|
END
|
|
|
|
NEXT I
|
|
|
|
IF Z2MetReadings<1> NE '' THEN
|
|
CONVERT @FM TO @RM IN Z2MetReadings
|
|
oTPM_Parms = Z2TestPointMap:@RM:Z2MetReadings
|
|
Z2Results = obj_Test_Point_Map('PointToResult',oTPM_Parms)
|
|
END
|
|
|
|
Z1Cnt = COUNT(Z1Results<1>,@VM) + (Z1Results<1> NE '')
|
|
Z2Cnt = COUNT(Z2Results<1>,@VM) + (Z2Results<1> NE '')
|
|
ResultCnt = Z1Cnt
|
|
IF Z2Cnt > ResultCnt THEN ResultCnt = Z2Cnt
|
|
|
|
IF ResultCnt = 0 THEN
|
|
DataArray<NextLine,COL$WO_NO> = WONo
|
|
DataArray<NextLine,COL$REACTOR> = Reactor
|
|
DataArray<NextLine,COL$RDS_NO> = @ID
|
|
DataArray<NextLine,COL$Z1_MET_NO> = Z1MetNo
|
|
DataArray<NextLine,COL$Z2_MET_NO> = Z2MetNo
|
|
NextLine += 1
|
|
END
|
|
|
|
FOR N = 1 TO ResultCnt
|
|
IF N = 1 THEN
|
|
DataArray<NextLine,COL$WO_NO> = WONo
|
|
DataArray<NextLine,COL$REACTOR> = Reactor
|
|
DataArray<NextLine,COL$RDS_NO> = @ID
|
|
DataArray<NextLine,COL$Z1_MET_NO> = Z1MetNo
|
|
DataArray<NextLine,COL$Z2_MET_NO> = Z2MetNo
|
|
END
|
|
|
|
DataArray<NextLine,COL$Z1_THICKNESS> = Z1Results<2,N>
|
|
DataArray<NextLine,COL$Z1_4PP_SHEET_RHO> = Z1Results<3,N>
|
|
DataArray<NextLine,COL$Z1_HGCV_RESL1> = Z1Results<4,N>
|
|
DataArray<NextLine,COL$Z1_HGCV_RESL2> = Z1Results<5,N>
|
|
|
|
DataArray<NextLine,COL$Z2_THICKNESS> = Z2Results<2,N>
|
|
DataArray<NextLine,COL$Z2_4PP_SHEET_RHO> = Z2Results<3,N>
|
|
DataArray<NextLine,COL$Z2_HGCV_RESL1> = Z2Results<4,N>
|
|
DataArray<NextLine,COL$Z2_HGCV_RESL2> = Z2Results<5,N>
|
|
|
|
NextLine += 1
|
|
NEXT N
|
|
|
|
Result = DataArray
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
WafersUnloaded:
|
|
* * * * * * *
|
|
|
|
IF NOT(ASSIGNED(RDSNo)) THEN RDSNo = Parms[1,@RM]
|
|
IF NOT(ASSIGNED(ReactRunRec)) THEN ReactRunRec = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
IF ReactRunRec = '' THEN ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
|
|
|
|
ReactNo = ReactRunRec<REACT_RUN_REACTOR$>
|
|
|
|
ReactType = XLATE('REACTOR',ReactNo,REACTOR_REACT_TYPE$,'X')
|
|
|
|
IF ReactType = 'EPP' THEN
|
|
* EpiPro run
|
|
OutCassNos = ReactRunRec<REACT_RUN_OUT_CASS_NO$>
|
|
OutCassCnt = COUNT(OutCassNos,@VM) + (OutCassNos NE '')
|
|
UnloadQty = ''
|
|
FOR I = 1 TO OutCassCnt
|
|
IF OutCassNos<1,I> NE '' THEN UnloadQty += 1
|
|
NEXT I
|
|
|
|
Result = UnloadQty ;* Qty unloaded into WMO cassette (no product test wafers)
|
|
|
|
|
|
END ELSE
|
|
* ASM run
|
|
WafersIn = ReactRunRec<REACT_RUN_LOAD_WFR_CNT$> ;* Operator verified wafer qty loaded into reactor
|
|
If Not(Num(WafersIn)) then
|
|
// Log the WafersIn value
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = RDSNo
|
|
LogData<3> = WafersIn
|
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
|
WafersIn = WafersIn<1, 1, 1>
|
|
end
|
|
|
|
TestKeys = XLATE('RDS_LAYER',ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>,3,'X')
|
|
TWProd = obj_RDS_Test('ProdTestCount',TestKeys)
|
|
IF WafersIn > 0 AND TWProd <= WafersIn THEN
|
|
Result = WafersIn - TWProd
|
|
END ELSE
|
|
Result = ''
|
|
END
|
|
|
|
END
|
|
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
Zone:
|
|
* * * * * * *
|
|
|
|
RunIDs = Parms[1,@RM]
|
|
|
|
IF RunIDs = '' THEN RETURN
|
|
|
|
ItemCnt = Count(RunIDs,@VM) + (RunIDs NE '')
|
|
|
|
PrevRDS = ''
|
|
Ans = ''
|
|
|
|
FOR I = 1 TO ItemCnt
|
|
|
|
RunID = RunIDs<1,I>
|
|
RDSNo = RunID[1,'.']
|
|
Pocket = RunID[COL2()+1,'.']
|
|
|
|
IF RDSNo NE PrevRDS THEN
|
|
PreRDS = RDSNo
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
|
|
LOCATE Pocket IN ReactRunRec<REACT_RUN_POCKET$> USING @VM SETTING Pos THEN
|
|
Result<1,I> = ReactRunRec<REACT_RUN_ZONE$,Pos>
|
|
END
|
|
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
SigProfile:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RRunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RRunRec = '' THEN
|
|
RRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
IF RRunRec = '' THEN RETURN
|
|
|
|
ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X')
|
|
|
|
WONo = RRunRec<REACT_RUN_WO_NO$>
|
|
WOStep = RRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
IF ReactType = 'GAN' THEN
|
|
|
|
SigProfile = RRunRec<REACT_RUN_RUN_STAGE_KEY$>
|
|
|
|
SWAP RDSNo:'*' WITH '' IN SigProfile
|
|
|
|
|
|
END ELSE
|
|
|
|
CassNo = RRunRec<REACT_RUN_CASS_NO$>
|
|
|
|
AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X')
|
|
|
|
SigProfile = ''
|
|
ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '')
|
|
FOR I = 1 TO ASigCnt
|
|
IF AllSigProfile<1,I>[1,1] = WOStep THEN
|
|
SigProfile<1,-1> = AllSigProfile<1,I>
|
|
END
|
|
NEXT I
|
|
|
|
END ;* End of check for ReactType
|
|
|
|
|
|
Result = SigProfile
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
SigBy:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RRunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RRunRec = '' THEN
|
|
RRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
IF RRunRec = '' THEN RETURN
|
|
|
|
ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X')
|
|
|
|
WONo = RRunRec<REACT_RUN_WO_NO$>
|
|
WOStep = RRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
IF ReactType = 'GAN' THEN
|
|
|
|
StageKeys = RRunRec<REACT_RUN_RUN_STAGE_KEY$>
|
|
|
|
SigBys = XLATE('RUN_STAGE',StageKeys,RUN_STAGE_COMP_BY$,'X')
|
|
|
|
END ELSE
|
|
|
|
CassNo = RRunRec<REACT_RUN_CASS_NO$>
|
|
|
|
AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X')
|
|
AllSigBys = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIGNATURE$,'X')
|
|
|
|
SigBys = ''
|
|
ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '')
|
|
FOR I = 1 TO ASigCnt
|
|
IF AllSigProfile<1,I>[1,1] = WOStep THEN
|
|
SigBys<1,-1> = AllSigBys<1,I>
|
|
END
|
|
NEXT I
|
|
|
|
END ;* End of check for ReactType
|
|
|
|
Result = SigBys
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
SigDTM:
|
|
* * * * * * *
|
|
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RRunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RRunRec = '' THEN
|
|
RRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
IF RRunRec = '' THEN RETURN
|
|
|
|
ReactType = XLATE('REACT_RUN',RDSNo,'PS_REACT_TYPE_CODE','X')
|
|
|
|
WONo = RRunRec<REACT_RUN_WO_NO$>
|
|
WOStep = RRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
IF ReactType = 'GAN' THEN
|
|
|
|
StageKeys = RRunRec<REACT_RUN_RUN_STAGE_KEY$>
|
|
SigDTMs = XLATE('RUN_STAGE',StageKeys,RUN_STAGE_COMP_DTM$,'X')
|
|
|
|
END ELSE
|
|
|
|
CassNo = RRunRec<REACT_RUN_CASS_NO$>
|
|
|
|
AllSigProfile = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X')
|
|
AllSigDtms = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_DTM$,'X')
|
|
|
|
SigDtms = ''
|
|
ASigCnt = COUNT(AllSigProfile,@VM) + (AllSigProfile NE '')
|
|
FOR I = 1 TO ASigCnt
|
|
IF AllSigProfile<1,I>[1,1] = WOStep THEN
|
|
SigDTMs<1,-1> = AllSigDTMs<1,I>
|
|
END
|
|
NEXT I
|
|
|
|
END ;* End of check for ReactType
|
|
|
|
Result = SigDTMs
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
WfrsUnloadedDt:
|
|
* * * * * * *
|
|
|
|
ReactNo = Parms[1,@RM]
|
|
UnloadDt = Parms[COL2()+1,@RM]
|
|
|
|
IF ReactNo = '' THEN RETURN
|
|
IF UnloadDt = '' THEN UnloadDt = OCONV(Date(),'D4/') ;* Default to today's date
|
|
|
|
thisUnloadDt = ICONV(UnloadDt,'D')
|
|
|
|
IF thisUnloadDt = '' THEN
|
|
RETURN
|
|
END
|
|
|
|
|
|
OPEN 'DICT.REACT_RUN' TO DictVar ELSE
|
|
ErrorMsg = 'Unable to open "DICT.REACT_RUN" for lookup'
|
|
RETURN
|
|
END
|
|
|
|
SearchString = 'REACT_NO_UNLOAD_DT':@VM:ReactNo:'.':thisUnloadDt:@FM
|
|
|
|
|
|
Option = ''
|
|
Flag = ''
|
|
|
|
Btree.Extract(SearchString,'REACT_RUN',DictVar,ReactRunKeys,Option,Flag)
|
|
|
|
RunCnt = COUNT(ReactRunKeys,@VM) + (ReactRunKeys NE '')
|
|
|
|
TotWfrsUnloaded = 0
|
|
|
|
FOR RKPos = 1 TO RunCnt
|
|
RDSNo = ReactRunKeys<1,RKPos>
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
|
|
GOSUB WafersUnloaded
|
|
|
|
TotWfrsUnloaded += Result
|
|
|
|
Result = ''
|
|
|
|
NEXT RKPos
|
|
|
|
Result = TotWfrsUnloaded
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
AddCI:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
Stage = Parms[COL2()+1,@RM]
|
|
CINo = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
IF Stage = '' THEN ErrorMsg = 'Null parameter "Stage" passed to routine. (':Method:')'
|
|
IF CINo = '' THEN ErrorMsg = 'Null parameter "CINo" passed to routine. (':Method:')'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
|
|
RunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN RETURN
|
|
|
|
|
|
RunRec = INSERT(RunRec,REACT_RUN_CI_NO$,1,0,CINo)
|
|
RunRec = INSERT(RunRec,REACT_RUN_CI_STAGE$,1,0,Stage)
|
|
|
|
|
|
otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms
|
|
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
GetCINo:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
ReactRunRec = Parms[COL2()+1,@RM]
|
|
Stage = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
IF Stage = '' THEN ErrorMsg = 'Null parameter "Stage" passed to routine. (':Method:')'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
IF ReactRunRec = '' THEN
|
|
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
END
|
|
|
|
IF ReactRunRec = '' THEN RETURN
|
|
|
|
LOCATE Stage IN ReactRunRec<REACT_RUN_CI_STAGE$> USING @VM SETTING Pos THEN
|
|
Result = ReactRunRec<REACT_RUN_CI_NO$,Pos>
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
LoadMat:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration
|
|
SlotWfrKeys = Parms[COL2()+1,@RM] ;* Contains SlotInID:@VM:WfrID:@VM:Scribe on each line
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.'
|
|
IF SlotWfrKeys = '' THEN ErrorMsg = 'Null parameter "SlotWfrKeys" passeed to routine.'
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading REACT_RUN ':RdsNo:'...')
|
|
|
|
lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
FOR I = lCnt TO 1 STEP -1
|
|
TestVal = ReactorList<I,1>
|
|
UNTIL TestVal NE ''
|
|
ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table
|
|
NEXT I
|
|
|
|
Set_Status(0)
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms)
|
|
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.'
|
|
RETURN
|
|
END
|
|
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
|
|
WfrIDs = ''
|
|
RunLocs = ''
|
|
CurrSlotIDS = ''
|
|
Scribes = ''
|
|
|
|
|
|
|
|
swPointer = 1
|
|
|
|
FOR I = 1 TO rCnt
|
|
|
|
IF ReactorList<I,COL$IN_SLOT_ID> = '' AND ReactorList<I,COL$WAFER_TYPE> = '' AND ReactorList<I,COL$USAGE> NE 'DUMMY' THEN
|
|
|
|
* Empty Pocket and needs a wafer
|
|
|
|
CurrSlot = SlotWfrKeys<swPointer,1>
|
|
WfrID = SlotWfrKeys<swPointer,2>
|
|
Scribe = SlotWfrKeys<swPointer,3>
|
|
|
|
NewSlot = ''
|
|
RunLoc = RDSNo:'.':ReactorList<I,COL$POCKET>:'.':ReactorList<I,COL$ZONE>
|
|
|
|
WfrIDs<1,-1> = WfrID
|
|
RunLocs<1,-1> = RunLoc
|
|
CurrSlotIDs<1,-1> = CurrSlot
|
|
Scribes<1,-1> = Scribe
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'LOAD':@RM ;* Event
|
|
owwParms := '':@RM ;* New Slot ID
|
|
owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := CurrSlot:@RM ;* Current Slot ID
|
|
owwParms := ToolID:@RM ;* New ToolID
|
|
owwParms := '':@RM ;* Curr Tool ID
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'I':@RM ;* Wfr Side
|
|
owwParms := '':@RM ;* NewCarrLocs
|
|
owwParms := '':@RM ;* CurrCarrLocs
|
|
owwParms := Scribe ;* Scribe ;* Added 9/7/2016 JCH
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
RR_Rec<REACT_RUN_IN_SLOT_ID$,I> = CurrSlot
|
|
RR_Rec<REACT_RUN_IN_WFR_ID$,I> = WfrID
|
|
RR_Rec<REACT_RUN_IN_WFR_CHAR$,I> = 'PROD'
|
|
|
|
swPointer += 1
|
|
|
|
END ELSE
|
|
|
|
RR_Rec<REACT_RUN_IN_SLOT_ID$,I> = ''
|
|
RR_Rec<REACT_RUN_IN_WFR_ID$,I> = ''
|
|
RR_Rec<REACT_RUN_IN_WFR_CHAR$,I> = ReactorList<I,COL$WAFER_TYPE>
|
|
|
|
END
|
|
|
|
RR_Rec<REACT_RUN_RUN_PKT$,I> = ReactorList<I,COL$POCKET>
|
|
RR_Rec<REACT_RUN_RUN_ZONE$,I> = ReactorList<I,COL$ZONE>
|
|
RR_Rec<REACT_RUN_PKT_CHAR$,I> = ReactorList<I,COL$USAGE>
|
|
RR_Rec<REACT_RUN_PKT_SAT_ID$,I> = ReactorList<I,COL$SAT_ID>
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,I> = ''
|
|
|
|
|
|
NEXT I
|
|
|
|
ReactNo = ToolID[2,20]
|
|
|
|
RR_Rec<REACT_RUN_REACTOR$> = ReactNo
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
ReturnMat:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading RDS Record ':RdsNo:'...')
|
|
|
|
Set_Status(0)
|
|
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms)
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.'
|
|
RETURN
|
|
END
|
|
|
|
WONo = RR_Rec<REACT_RUN_WO_NO$>
|
|
WOStep = RR_Rec<REACT_RUN_WO_STEP$>
|
|
|
|
RLCnt = COUNT(RR_Rec<REACT_RUN_RUN_PKT$>,@VM) + (RR_Rec<REACT_RUN_RUN_PKT$> NE '')
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
FOR I = 1 TO RLCnt
|
|
|
|
WfrID = RR_Rec<REACT_RUN_IN_WFR_ID$,I>
|
|
NewSlot = RR_Rec<REACT_RUN_IN_SLOT_ID$,I>
|
|
|
|
IF WfrID NE '' THEN
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'REPLACE':@RM ;* Event
|
|
owwParms := NewSlot:@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* NewToolID (Load Tool)
|
|
owwParms := ToolID:@RM ;* CurrToolD (Unload Tool)
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'I' ;* Wfr Side
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END
|
|
|
|
RR_Rec<REACT_RUN_RUN_PKT$,I> = ''
|
|
RR_Rec<REACT_RUN_RUN_ZONE$,I> = ''
|
|
RR_Rec<REACT_RUN_PKT_CHAR$,I> = ''
|
|
RR_Rec<REACT_RUN_IN_WFR_CHAR$,I> = ''
|
|
RR_Rec<REACT_RUN_IN_SLOT_ID$,I> = ''
|
|
RR_Rec<REACT_RUN_IN_WFR_ID$,I> = ''
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,I> = ''
|
|
|
|
NEXT I
|
|
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
UnloadMat:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration
|
|
UnloadSlots = Parms[COL2()+1,@RM] ;* Contains SlotInID:@VM:WfrID:@VM:Scribe on each line
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.'
|
|
IF UnloadSlots = '' THEN ErrorMsg = 'Null parameter "UnloadSlots" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading REACT_RUN ':RdsNo:'...')
|
|
|
|
lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
FOR I = lCnt TO 1 STEP -1
|
|
TestVal = ReactorList<I,1>
|
|
UNTIL TestVal NE ''
|
|
ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table
|
|
NEXT I
|
|
|
|
Set_Status(0)
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.'
|
|
RETURN
|
|
END
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
|
|
ulPointer = 1
|
|
|
|
FOR I = 1 TO rCnt
|
|
|
|
IF ReactorList<I,REACT_RUN_OUT_SLOT_ID$> = '' AND ReactorList<I,COL$WAFER_TYPE> = 'PROD' AND ReactorList<I,COL$USAGE> = '' THEN
|
|
|
|
* Empty Pocket and needs a wafer
|
|
|
|
NewSlot = UnloadSlots<ulPointer,1>
|
|
WfrID = ReactorList<I,COL$WFR_ID>
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'UNLOAD':@RM ;* Event
|
|
owwParms := NewSlot:@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* New ToolID
|
|
owwParms := ToolID:@RM ;* Curr Tool ID
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'O' ;* Wfr Side
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,I> = NewSlot
|
|
|
|
ulPointer += 1
|
|
|
|
END
|
|
|
|
NEXT I
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ShipGANWfrs:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
ShipSlots = Parms[COL2()+1,@RM]
|
|
ShipWfrs = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
IF ShipSlots = '' THEN ErrorMsg = 'Null parameter "ShipSlots" passeed to routine.'
|
|
IF ShipWfrs = '' THEN ErrorMsg = 'Null parameter "ShipWfrs" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
|
|
Set_Status(0)
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.'
|
|
RETURN
|
|
END
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
wCnt = COUNT(ShipWfrs,@VM) + (ShipWfrs NE '')
|
|
|
|
|
|
FOR I = 1 TO wCnt
|
|
WfrID = ShipWfrs<1,I>
|
|
NewSlot = ShipSlots<1,I>
|
|
|
|
LOCATE WfrID IN RR_Rec<REACT_RUN_IN_WFR_ID$> USING @VM SETTING Pos THEN
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,Pos> = ShipSlots<1,I>
|
|
END
|
|
|
|
LOCATE WfrID IN RR_Rec<REACT_RUN_CARR_WFR_ID$> USING @VM SETTING cPos THEN
|
|
CurrCarrSlot = RR_Rec<REACT_RUN_CARR_SLOT_ID$,cPos>
|
|
|
|
END ELSE
|
|
CurrCarrSlot = ''
|
|
END
|
|
|
|
CurrInvLoc = obj_WO_Wfr('CurrLoc',WfrID)<1,4>
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'DISP':@RM ;* Event
|
|
owwParms := NewSlot:@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* New ToolID
|
|
owwParms := '':@RM ;* Curr Tool ID
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := CurrInvLoc:@RM ;* CurrInvLoc ;* GaN Disposition Queue
|
|
owwParms := 'O':@RM ;* Wfr Side
|
|
owwParms := '':@RM ;* New Carrier Loc
|
|
owwParms := CurrCarrSlot ;* Curr Carrier Loc
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
|
|
NEXT I
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
UnShipGANWfrs:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
ShipSlots = Parms[COL2()+1,@RM]
|
|
ShipWfrs = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
IF ShipSlots = '' THEN ErrorMsg = 'Null parameter "ShipSlots" passeed to routine.'
|
|
IF ShipWfrs = '' THEN ErrorMsg = 'Null parameter "ShipWfrs" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Set_Status(0)
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.'
|
|
RETURN
|
|
END
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
wCnt = COUNT(ShipWfrs,@VM) + (ShipWfrs NE '')
|
|
|
|
FOR I = 1 TO wCnt
|
|
WfrID = ShipWfrs<1,I>
|
|
CurrSlot = ShipSlots<1,I>
|
|
|
|
LOCATE WfrID IN RR_Rec<REACT_RUN_IN_WFR_ID$> USING @VM SETTING Pos THEN
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,Pos> = ''
|
|
END
|
|
|
|
CurrCarrSlot = ''
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'DISP':@RM ;* Event
|
|
owwParms := '':@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := CurrSlot:@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* New ToolID
|
|
owwParms := '':@RM ;* Curr Tool ID
|
|
owwParms := 'GCH*Q_PACK':@RM ;* NewInvLoc ;* GaN Disposition Queue
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'O':@RM ;* Wfr Side
|
|
owwParms := '':@RM ;* New Carrier Loc
|
|
owwParms := CurrCarrSlot ;* Curr Carrier Loc
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
NEXT I
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ReloadMat:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading RDS Record ':RdsNo:'...')
|
|
|
|
Set_Status(0)
|
|
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms)
|
|
*RR_Rec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.'
|
|
RETURN
|
|
END
|
|
|
|
|
|
RLCnt = COUNT(RR_Rec<REACT_RUN_RUN_PKT$>,@VM) + (RR_Rec<REACT_RUN_RUN_PKT$> NE '')
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
FOR I = 1 TO RLCnt
|
|
|
|
WfrID = RR_Rec<REACT_RUN_IN_WFR_ID$,I>
|
|
OutSlotID = RR_Rec<REACT_RUN_OUT_SLOT_ID$,I>
|
|
|
|
RunLoc = RDSNo:'.':RR_Rec<REACT_RUN_RUN_PKT$,I>:'.':RR_Rec<REACT_RUN_RUN_ZONE$,I>
|
|
|
|
IF OutSlotID NE '' THEN
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'RELOAD':@RM ;* Event
|
|
owwParms := '':@RM ;* New Slot ID
|
|
owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := OutSlotID:@RM ;* Current Slot ID
|
|
owwParms := ToolID:@RM ;* NewToolID (Load Tool)
|
|
owwParms := '':@RM ;* CurrToolD (Unload Tool)
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'O' ;* Wfr Side
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END
|
|
|
|
RR_Rec<REACT_RUN_OUT_SLOT_ID$,I> = ''
|
|
|
|
NEXT I
|
|
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * These CarrWfrID methods are not used. Leave until done with development * * * * * * *
|
|
|
|
* * * * * * *
|
|
SetCarrWfrID:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
WfrID = Parms[COL2()+1,@RM]
|
|
|
|
If RDSNol = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')'
|
|
If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then Return
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
RRunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
Locate WfrID In RRunRec<REACT_RUN_CARR_WFR_ID$> USING @VM SETTING Pos Then
|
|
obj_Tables('UnlockRec',otParms)
|
|
End Else
|
|
RRunRec = Insert(RRunRec,REACT_RUN_CARR_WFR_ID$ ,-1,0, WfrID) ;* Wafer ID is added to the END of the list i.e. no sort order
|
|
otParms = FieldStore(otParms,@RM,4,0,RRunRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
END
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ClearCarrWfrID:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
WfrID = Parms[COL2()+1,@RM]
|
|
|
|
If RDSNo = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')'
|
|
If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then Return
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
RRunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
Locate WfrID In RRunRec<REACT_RUN_CARR_WFR_ID$> USING @VM SETTING Pos Then
|
|
RRunRec = Delete(RRunRec,REACT_RUN_CARR_WFR_ID$,Pos,0)
|
|
otParms = FieldStore(otParms,@RM,4,0,RRunRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
End Else
|
|
obj_Tables('UnlockRec',otParms)
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ClearCarrNCR:
|
|
* * * * * * *
|
|
! deprecated 2/24/20 - djs - do not use !
|
|
RDSNo = Parms[1,@RM]
|
|
NCRNo = Parms[COL2()+1,@RM]
|
|
|
|
If RDSNo = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')'
|
|
If NCRNo = '' THEN ErrorMsg = 'Null Parameter "NCRNo" passed to routine. (':Method:')'
|
|
|
|
If ErrorMsg NE '' Then Return
|
|
|
|
otParms = 'REACT_RUN':@RM:RDSNo
|
|
RRunRec = obj_Tables('ReadRec',otParms)
|
|
|
|
sCnt = COUNT(RRunRec<REACT_RUN_CARR_SLOT_NO$>,@VM) + (RRunRec<REACT_RUN_CARR_SLOT_NO$> NE '')
|
|
|
|
WriteFlag = ''
|
|
FOR I = 1 TO sCnt
|
|
IF RRunRec<REACT_RUN_CARR_NCR_NO$,I> = NCRNo THEN
|
|
WriteFlag = 1
|
|
RRunRec<REACT_RUN_CARR_WFR_ID$,I> = RRunRec<REACT_RUN_CARR_PREV_WFR_ID$,I>
|
|
RRunRec<REACT_RUN_CARR_NCR_NO$,I> = ''
|
|
END
|
|
NEXT I
|
|
|
|
IF WriteFlag = 1 THEN
|
|
otParms = FieldStore(otParms,@RM,4,0,RRunRec)
|
|
obj_Tables('WriteRec',otParms)
|
|
END ELSE
|
|
obj_Tables('UnlockRec',otParms)
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * End of CarrWfrID methods. * * * * * * *
|
|
|
|
|
|
* * * * * * *
|
|
UnloadGan:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration
|
|
UnloadSlots = Parms[COL2()+1,@RM] ;* Contains CarrSlotNo:@FM:RDSNo:'.':CarrSlotNo for each wafer being "unloaded"
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.'
|
|
IF UnloadSlots = '' THEN ErrorMsg = 'Null parameter "UnloadSlots" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading REACT_RUN ':RdsNo:'...')
|
|
|
|
lCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
FOR I = lCnt TO 1 STEP -1
|
|
TestVal = ReactorList<I,1>
|
|
UNTIL TestVal NE ''
|
|
ReactorList = DELETE(ReactorList,I,0,0) ;* Strip empty lines from the user interface edit table
|
|
NEXT I
|
|
|
|
Set_Status(0)
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms) ;* REACT_RUN is locked here
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read REACT_RUN ':QUOTE(RdsNo):' for UnloadEpi update.'
|
|
RETURN
|
|
END
|
|
|
|
ToolRec = XLATE('TOOL',ToolID,'','X')
|
|
|
|
|
|
* Get QOutKey for Reactor or Reactor Class
|
|
|
|
QOutKey = ''
|
|
|
|
WHCd = ToolRec<TOOL_QOUT_WH$>
|
|
LocCd = ToolRec<TOOL_QOUT_LOC$>
|
|
|
|
IF WHCd NE '' AND LocCd NE '' THEN
|
|
QOutKey = WHCd:'*':LocCd
|
|
END ELSE
|
|
|
|
ToolClassRec = XLATE('TOOL_CLASS',ToolRec<TOOL_CLASS$>,'','X')
|
|
|
|
WHCd = ToolClassRec<TOOL_CLASS_QOUT_WH$>
|
|
LocCd = ToolClassRec<TOOL_CLASS_QOUT_LOC$>
|
|
|
|
IF WHCd NE '' AND LocCd NE '' THEN
|
|
QOutKey = WHCd:'*':LocCd
|
|
END
|
|
|
|
END
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
rCnt = COUNT(ReactorList,@FM) + (ReactorList NE '')
|
|
|
|
FOR I = 1 TO rCnt
|
|
|
|
IF ReactorList<I,REACT_RUN_OUT_SLOT_ID$> = '' AND ReactorList<I,COL$WAFER_TYPE> = 'PROD' AND ReactorList<I,COL$USAGE> = '' THEN
|
|
|
|
* Empty Pocket and needs a wafer
|
|
* Wafers are "placed" into a carrier slot AND into the Dispo Queue
|
|
|
|
|
|
CarrSlotID = UnloadSlots<I,2>
|
|
CarrSlotNo = UnloadSlots<I,1>
|
|
|
|
WfrID = ReactorList<I,COL$WFR_ID>
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'UNLOAD':@RM ;* Event
|
|
owwParms := '':@RM ;* New Slot ID
|
|
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := '':@RM ;* New ToolID
|
|
owwParms := ToolID:@RM ;* Curr Tool ID
|
|
owwParms := QOutKey:@RM ;* NewInvLoc ;* Outbound Que for tool
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'O':@RM ;* Wfr Side
|
|
owwParms := CarrSlotID:@RM ;* New Carrier Slot
|
|
owwParms := '' ;* Curr Carrier Slot
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
LOCATE WfrID IN RR_Rec<REACT_RUN_IN_WFR_ID$> USING @VM SETTING Pos THEN
|
|
RR_Rec<REACT_RUN_CARR_SLOT_ID$,Pos> = CarrSlotID
|
|
END
|
|
|
|
RR_Rec<REACT_RUN_CARR_WFR_ID$,Pos> = WfrID
|
|
RR_Rec<REACT_RUN_CARR_SLOT_NO$,Pos> = CarrSlotNo
|
|
|
|
END
|
|
|
|
NEXT I
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ReloadGan:
|
|
* * * * * * *
|
|
|
|
RdsNo = Parms[1,@RM]
|
|
ToolID = Parms[COL2()+1,@RM]
|
|
|
|
IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.'
|
|
|
|
IF ErrorMsg NE '' THEN RETURN
|
|
|
|
Send_Info('Reading RDS Record ':RdsNo:'...')
|
|
|
|
Set_Status(0)
|
|
|
|
RTParms = 'REACT_RUN':@RM:RdsNo
|
|
RR_Rec = obj_Tables('ReadRec',RTParms)
|
|
|
|
|
|
IF Get_Status(errCode) THEN
|
|
ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.'
|
|
RETURN
|
|
END
|
|
|
|
RLCnt = COUNT(RR_Rec<REACT_RUN_RUN_PKT$>,@VM) + (RR_Rec<REACT_RUN_RUN_PKT$> NE '')
|
|
|
|
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
|
|
|
FOR I = 1 TO RLCnt
|
|
|
|
WfrID = RR_Rec<REACT_RUN_IN_WFR_ID$,I>
|
|
CurrCarrSlotID = RR_Rec<REACT_RUN_CARR_SLOT_ID$,I>
|
|
|
|
RunLoc = RDSNo:'.':RR_Rec<REACT_RUN_RUN_PKT$,I>:'.':RR_Rec<REACT_RUN_RUN_ZONE$,I>
|
|
|
|
IF CurrCarrSlotID NE '' THEN
|
|
|
|
owwParms = WfrID:@RM ;* WfrID
|
|
owwParms := CurrDTM:@RM ;* EventDtm
|
|
owwParms := @USER4:@RM ;* EventBy
|
|
owwParms := 'RELOAD':@RM ;* Event
|
|
owwParms := '':@RM ;* New Slot ID
|
|
owwParms := RunLoc:@RM ;* RPZ (RDSNo*Pocket*Zone)
|
|
owwParms := '':@RM ;* NCRNo
|
|
owwParms := '':@RM ;* TWUse ID
|
|
owwParms := '':@RM ;* Current Slot ID
|
|
owwParms := ToolID:@RM ;* NewToolID (Load Tool)
|
|
owwParms := '':@RM ;* CurrToolD (Unload Tool)
|
|
owwParms := '':@RM ;* NewInvLoc
|
|
owwParms := '':@RM ;* CurrInvLoc
|
|
owwParms := 'O':@RM ;* Wfr Side
|
|
owwParms := '':@RM ;* New Carrier Slot
|
|
owwParms := CurrCarrSlotID ;* Curr Carrier Slot
|
|
|
|
obj_WO_Wfr('AddEvent',owwParms)
|
|
|
|
END
|
|
|
|
RR_Rec<REACT_RUN_CARR_WFR_ID$,I> = ''
|
|
RR_Rec<REACT_RUN_CARR_SLOT_ID$,I> = ''
|
|
|
|
NEXT I
|
|
|
|
|
|
RTParms = FieldStore(RTParms, @RM, 4, 1, RR_Rec)
|
|
obj_Tables('WriteRec',RTParms)
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
SplitWfr:
|
|
* * * * * * *
|
|
! Deprecated 11/06/2019 DJS
|
|
* RDSNo = Parms[1,@RM]
|
|
* WfrID = Parms[COL2()+1,@RM]
|
|
*
|
|
* IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
* IF WfrID = '' THEN ErrorMsg = 'Null parameter "WfrID" passed to routine. (':Method:')'
|
|
*
|
|
* IF ErrorMsg NE '' THEN RETURN
|
|
*
|
|
* otParms = 'REACT_RUN':@RM:RDSNo
|
|
*
|
|
* RunRec = obj_Tables('ReadRec',otParms)
|
|
*
|
|
* IF Get_Status(errCode) THEN RETURN
|
|
*
|
|
* LOCATE WfrID IN RunRec<REACT_RUN_CARR_WFR_ID$> USING @VM SETTING Pos THEN
|
|
*
|
|
* RunRec<REACT_RUN_CARR_PREV_WFR_ID$,Pos> = WfrID
|
|
* RunRec<REACT_RUN_CARR_WFR_ID$,Pos> = ''
|
|
*
|
|
*
|
|
* chCnt = COUNT(RunRec<REACT_RUN_CHAR_WFR_ID$>,@VM) + (RunRec<REACT_RUN_CHAR_WFR_ID$> NE '')
|
|
* NextLine = chCnt + 1
|
|
*
|
|
* SplitBy = @USER4
|
|
*
|
|
* IF SplitBy = '' THEN SplitBy = 'UNKNOWN'
|
|
*
|
|
* SplitDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT')
|
|
*
|
|
* RunRec<REACT_RUN_CHAR_WFR_ID$,NextLine> = WfrID
|
|
* RunRec<REACT_RUN_CHAR_SPLIT_BY$,NextLine> = SplitBy
|
|
* RunRec<REACT_RUN_CHAR_SPLIT_DTM$,NextLine> = SplitDTM
|
|
*
|
|
* otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms
|
|
* obj_Tables('WriteRec',otParms)
|
|
*
|
|
* END ELSE
|
|
* obj_Tables('UnlockRec',otParms)
|
|
* END
|
|
*
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
UnSplitWfr:
|
|
* * * * * * *
|
|
! Deprecated 11/06/2019 DJS
|
|
* RDSNo = Parms[1,@RM]
|
|
* WfrID = Parms[COL2()+1,@RM]
|
|
*
|
|
* IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')'
|
|
* IF WfrID = '' THEN ErrorMsg = 'Null parameter "WfrID" passed to routine. (':Method:')'
|
|
*
|
|
* IF ErrorMsg NE '' THEN RETURN
|
|
*
|
|
* otParms = 'REACT_RUN':@RM:RDSNo
|
|
*
|
|
* RunRec = obj_Tables('ReadRec',otParms)
|
|
*
|
|
* IF Get_Status(errCode) THEN RETURN
|
|
*
|
|
* LOCATE WfrID IN RunRec<REACT_RUN_CARR_PREV_WFR_ID$> USING @VM SETTING Pos THEN
|
|
*
|
|
* RunRec<REACT_RUN_CARR_PREV_WFR_ID$,Pos> = ''
|
|
* RunRec<REACT_RUN_CARR_WFR_ID$,Pos> = WfrID
|
|
*
|
|
* LOCATE WfrID IN RunRec<REACT_RUN_CHAR_WFR_ID$> USING @VM SETTING cPos THEN
|
|
*
|
|
* UnSplitBy = @USER4
|
|
*
|
|
* IF UnSplitBy = '' THEN UnSplitBy = 'UNKNOWN'
|
|
*
|
|
* UnSplitDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT')
|
|
*
|
|
* RunRec<REACT_RUN_CHAR_RETURN_BY$,cPos> = UnSplitBy
|
|
* RunRec<REACT_RUN_CHAR_RETURN_DTM$,cPos> = UnSplitDTM
|
|
*
|
|
* END
|
|
*
|
|
* otParms = FieldStore(OtParms,@RM,4,0,RunRec) ;* Put record in 4th field of OtParms
|
|
* obj_Tables('WriteRec',otParms)
|
|
*
|
|
* END ELSE
|
|
* obj_Tables('UnlockRec',otParms)
|
|
* END
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
GetWfrSigKeys:
|
|
* * * * * * *
|
|
|
|
|
|
IF NOT(Assigned(RDSNo)) THEN RDSNo = Parms[1,@RM]
|
|
IF NOT(Assigned(WfrIDs)) THEN WfrIDs = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
IF WfrIDs = '' THEN RETURN
|
|
|
|
FirstWfrID = WfrIDs<1,1>
|
|
|
|
WONo = FirstWfrID<1,1>[1,'*']
|
|
WOMatKey = FIELD(FirstWfrID,'*',1,2)
|
|
|
|
SigProfile = XLATE('REACT_RUN',RDSNo, REACT_RUN_WFR_STAGE$,'X')
|
|
|
|
spCnt = COUNT(SigProfile,@VM) + (SigProfile NE '')
|
|
|
|
WfrSigKeys = ''
|
|
wfrCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '')
|
|
|
|
FOR W = 1 TO wfrCnt
|
|
WfrID = WfrIDs<1,W>
|
|
|
|
IF WfrID NE '' THEN
|
|
FOR I = 1 TO spCnt
|
|
Stage = SigProfile<1,I>
|
|
WfrKID = WfrID
|
|
CONVERT '*' TO '.' IN WfrKID
|
|
|
|
WfrSigKeys<W,I> = RDSNo:'*':Stage:'*':WfrKID
|
|
|
|
NEXT I
|
|
END
|
|
NEXT W
|
|
|
|
Result = WfrSigKeys
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
NextWfrStage:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
END
|
|
|
|
WfrIDs = RunRec<REACT_RUN_CHAR_WFR_ID$>
|
|
|
|
GOSUB GetWfrSigKeys
|
|
|
|
AllWfrStageKeys = Result
|
|
|
|
Result = ''
|
|
|
|
WfrCnt = COUNT(AllWfrStageKeys,@FM) + (AllWfrStageKeys NE '')
|
|
|
|
FOR I = 1 TO WfrCnt
|
|
|
|
WfrStageKeys = AllWfrStageKeys<I>
|
|
|
|
StageCompSigs = XLATE('RUN_STAGE_WFR',WfrStageKeys,RUN_STAGE_WFR_COMP_BY$,'X')
|
|
|
|
scCnt = COUNT(StageCompSigs,@VM) + (StageCompSigs NE '')
|
|
|
|
NextWfrStage = ''
|
|
FOR S = scCnt TO 1 STEP -1
|
|
UNTIL StageCompSigs<1,S> NE ''
|
|
NextWfrStage = WfrStageKeys<1,S>
|
|
NEXT S
|
|
|
|
IF NextWfrStage = '' THEN
|
|
Result<1,I> = '-'
|
|
END ELSE
|
|
Result<1,I> = FIELD(NextWfrStage,'*',2)
|
|
END
|
|
|
|
NEXT I
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
CharWfrDest:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
END
|
|
|
|
WfrIDs = RunRec<REACT_RUN_CHAR_WFR_ID$>
|
|
|
|
GOSUB GetWfrSigKeys
|
|
AllWfrStageKeys = Result
|
|
Result = ''
|
|
|
|
WfrCnt = COUNT(AllWfrStageKeys,@FM) + (AllWfrStageKeys NE '')
|
|
|
|
|
|
FOR I = 1 TO WfrCnt
|
|
|
|
WfrStageKeys = AllWfrStageKeys<I>
|
|
|
|
StageDestTests = XLATE('RUN_STAGE_WFR',WfrStageKeys,'DEST_TEST','X')
|
|
StageCompSigs = XLATE('RUN_STAGE_WFR',WfrStageKeys,RUN_STAGE_WFR_COMP_BY$,'X')
|
|
|
|
scCnt = COUNT(StageCompSigs,@VM) + (StageCompSigs NE '')
|
|
|
|
|
|
Destroyed = ''
|
|
FOR S = scCnt TO 1 STEP -1
|
|
IF StageDestTests<1,S> = 1 AND StageCompSigs<1,S> NE '' THEN
|
|
Destroyed = 1
|
|
END
|
|
UNTIL Destroyed
|
|
NEXT S
|
|
|
|
Result<1,I> = Destroyed
|
|
|
|
NEXT I
|
|
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
CharWfrStatus:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
END
|
|
|
|
WfrIDs = RunRec<REACT_RUN_CHAR_WFR_ID$>
|
|
|
|
wCnt = COUNT( WfrIDs,@VM) + (WfrIDs NE '')
|
|
|
|
WfrStatuses = ''
|
|
|
|
|
|
GOSUB NextWfrStage
|
|
|
|
NextWfrStages = Result
|
|
Result = ''
|
|
|
|
FOR M = 1 TO wCnt
|
|
WfrID = WfrIDs<1,M>
|
|
|
|
NextWfrStage = NextWfrStages<1,M>
|
|
|
|
IF NextWfrStage NE '-' THEN
|
|
CONVERT '*' TO '.' IN WfrID
|
|
|
|
NextWfrStageKey = RDSNo:'*':NextWfrStage:'*':WfrID
|
|
|
|
WfrStatuses<1,M> = XLATE('RUN_STAGE_WFR',NextWfrStageKey,'CURR_STATUS','X')
|
|
END ELSE
|
|
WfrStatuses<1,M> = 'COMP'
|
|
END
|
|
NEXT I
|
|
|
|
Result = WfrStatuses
|
|
|
|
|
|
Return
|
|
|
|
* * * * * * *
|
|
WfrStageUnloadQ:
|
|
* * * * * * *
|
|
|
|
ErrMsg('Notify FI TEAM if you get this message')
|
|
|
|
RETURN
|
|
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
StageID = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
End
|
|
|
|
* Get Next Stages and Add 'DISP' stage to the end
|
|
|
|
RunWfrStages = RunRec<REACT_RUN_WFR_STAGE$>
|
|
|
|
ValidStages = obj_Popup('AllCodes','GAN_WIP_STAGES') ;* List of all valid GaN WIP Stage codes from the popup
|
|
|
|
WfrStages = ''
|
|
InLocIDs = ''
|
|
|
|
rwsCnt = COUNT(RunWfrStages,@VM) + (RunWfrStages NE '')
|
|
|
|
ResCnt = 0
|
|
|
|
FOR I = 1 TO rwsCnt
|
|
|
|
LOCATE RunWfrStages<1,I> IN ValidStages USING @VM Setting Pos THEN
|
|
|
|
NextStage = RunWfrStages<1,I+1>
|
|
|
|
ColToReturn = 4
|
|
|
|
ToolClass = obj_Popup('CodeDesc','GAN_WIP_STAGES':@RM:NextStage:@RM:ColToReturn)
|
|
|
|
TCRec = XLATE('TOOL_CLASS',ToolClass,'','X')
|
|
|
|
QInWH = TCRec<TOOL_CLASS_QIN_WH$>
|
|
QInLoc = TCRec<TOOL_CLASS_QIN_LOC$>
|
|
|
|
IF QInWH NE '' AND QInLoc NE '' THEN
|
|
|
|
ResCnt += 1
|
|
InLocIDs<1,ResCnt> = QInWH:'*':QInLoc ;* * Have a good location to unload into
|
|
WfrStages<1,ResCnt> = RunWfrStages<1,I>
|
|
|
|
END ELSE
|
|
|
|
ResCnt += 1
|
|
WfrStages<1,ResCnt> = RunWfrStages<1,I> ;* Disposition Stage
|
|
InLocIDs<1,ResCnt> = 'GGR*Q_DISP' ;* Unload into DISP(osition) Queue
|
|
|
|
END
|
|
END
|
|
|
|
NEXT I
|
|
|
|
IF StageID NE '' THEN
|
|
LOCATE StageID IN WfrStages USING @VM SETTING RetPos THEN
|
|
Result = InLocIDs<1,RetPos>
|
|
END
|
|
END ELSE
|
|
Result = InLocIDs
|
|
END
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
StageUnloadQ:
|
|
* * * * * * *
|
|
|
|
* * Returns Unload Location for GaN Run or Wfr processing stage code * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
StageID = Parms[COL2()+1,@RM]
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
IF StageID = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
End
|
|
|
|
AllStageData = Xlate('SYSREPOSPOPUPS','LSL2**GAN_WIP_STAGES',PDISPLAY$,'X') ;* Raw Data from Popup
|
|
|
|
CONVERT @VM:@SVM TO @FM:@VM IN AllStageData
|
|
|
|
AllStages = ''
|
|
AllChars = ''
|
|
AllToolClasses = ''
|
|
|
|
aCnt = 0
|
|
|
|
LOOP
|
|
|
|
StageLine = AllStageData[1,@FM]
|
|
AllStageData[1,COL2()] = ''
|
|
|
|
UNTIL StageLine = ''
|
|
|
|
IF StageLine<1,GWS$STAGE> NE '' AND StageLine<1,GWS$TOOL_CLASS> NE '' THEN
|
|
aCnt += 1
|
|
AllStages<1,aCnt> = StageLine<1,GWS$STAGE>
|
|
AllChars<1,aCnt> = StageLine<1,GWS$CHAR>
|
|
AllToolClasses<1,aCnt> = StageLine<1,GWS$TOOL_CLASS>
|
|
END
|
|
|
|
REPEAT
|
|
|
|
NextQ = ''
|
|
|
|
LOCATE StageID IN AllStages USING @VM SETTING Pos THEN
|
|
|
|
IF AllChars<1,Pos> = 1 THEN
|
|
ReactRunStages = RunRec<REACT_RUN_WFR_STAGE$>
|
|
END ELSE
|
|
ReactRunStages = RunRec<REACT_RUN_RUN_STAGE_KEY$>
|
|
|
|
SWAP RDSNo:'*' WITH '' IN ReactRunStages ;* Strips "RDSNo*" from keys leaving just the stage
|
|
END
|
|
END ELSE
|
|
RETURN ;* No material movements specified
|
|
END
|
|
|
|
|
|
rrCnt = COUNT(ReactRunStages,@VM) + (ReactRunStages NE '')
|
|
|
|
IReactRunStages = ''
|
|
IReactRunToolClasses = ''
|
|
|
|
iCnt = 0
|
|
|
|
FOR I = 1 TO rrCnt
|
|
|
|
ReactRunStage = ReactRunStages<1,I>
|
|
|
|
LOCATE ReactRunStage IN AllStages USING @VM SETTING Pos THEN
|
|
IF AllToolClasses<1,I> NE '' THEN
|
|
iCnt += 1
|
|
IReactRunStages<1,iCnt> = ReactRunStage
|
|
IReactRunToolClasses<1,iCnt> = AllToolClasses<1,Pos>
|
|
END
|
|
END
|
|
|
|
NEXT I
|
|
|
|
LOCATE StageID IN IReactRunStages USING @VM SETTING RPos THEN
|
|
NextStage = IReactRunStages<1,RPos+1>
|
|
NextToolClass = IReactRunToolClasses<1,RPos+1>
|
|
|
|
IF NextStage = '' THEN
|
|
NextQ = 'GGR*Q_DISP'
|
|
END ELSE
|
|
TCRec = XLATE('TOOL_CLASS',NextToolClass,'','X')
|
|
NextQ = TCRec<TOOL_CLASS_QIN_WH$>:'*':TCRec<TOOL_CLASS_QIN_LOC$>
|
|
END
|
|
END
|
|
|
|
Result = NextQ
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
GaNDispStatus:
|
|
* * * * * * *
|
|
|
|
RDSNo = Parms[1,@RM]
|
|
RunRec = Parms[COL2()+1,@RM]
|
|
|
|
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
IF RunRec = '' THEN
|
|
RunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
|
IF RunRec = '' THEN RETURN
|
|
END
|
|
|
|
|
|
RETURN
|
|
|