288 lines
12 KiB
Plaintext
288 lines
12 KiB
Plaintext
Compile function DIALOG_LOAD_SUSCEPTOR_EVENTS(CtrlEntId, Event, @PARAMS)
|
|
#pragma precomp SRP_PreCompiler
|
|
#window DIALOG_LOAD_SUSCEPTOR
|
|
|
|
$Insert APP_INSERTS
|
|
$Insert EVENT_SETUP
|
|
$Insert REACT_RUN_EQUATES
|
|
$Insert REACTOR_EQUATES
|
|
$Insert EPI_SUSCEPTOR_EQUATES
|
|
$Insert WO_WFR_EQUATES
|
|
$Insert WO_MAT_WFR_EQUATES
|
|
$Insert RUN_STAGE_EQUATES
|
|
|
|
Declare Subroutine SRP_Show_Window, Database_Services, Set_Property, Error_Services, End_Dialog, ErrMsg, GaN_Services
|
|
Declare function Database_Services, Gan_Services, Error_Services, DateTime, GaN_Services
|
|
|
|
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
|
If Event EQ 'OLE' then
|
|
Transfer Event to OIEvent
|
|
Transfer Param1 to Event
|
|
Transfer Param2 to Param1
|
|
Transfer Param3 to Param2
|
|
Transfer Param4 to Param3
|
|
Transfer Param5 to Param4
|
|
Transfer Param6 to Param5
|
|
Transfer Param7 to Param6
|
|
Transfer Param8 to Param7
|
|
end
|
|
|
|
GoToEvent Event for CtrlEntId else
|
|
// Event not implemented
|
|
end
|
|
|
|
Return EventFlow or 1
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// EVENT HANDLERS
|
|
//-----------------------------------------------------------------------------
|
|
|
|
Event WINDOW.CREATE(CreateParam)
|
|
|
|
|
|
RDSNo = Field(CreateParam, @FM, 1, 1)
|
|
Stage = Field(CreateParam, @FM, 2, 1)
|
|
Reactor = Field(CreateParam, @FM, 3, 1)
|
|
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
|
|
|
|
GaNRunID = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
|
|
WONo = ReactRunRec<REACT_RUN_WO_NO$>
|
|
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>
|
|
|
|
Ctrls = @WINDOW:'.RDS_NO':@RM ; Props = 'DEFPROP':@RM ; Vals = RDSNo:@RM
|
|
Ctrls := @WINDOW:'.GAN_RUN':@RM ; Props := 'DEFPROP':@RM ; Vals := GanRunID:@RM
|
|
Ctrls := @WINDOW:'.STAGE':@RM ; Props := 'DEFPROP':@RM ; Vals := Stage:@RM
|
|
Ctrls := @WINDOW:'.REACTOR':@RM ; Props := 'DEFPROP':@RM ; Vals := Reactor:@RM
|
|
Ctrls := @WINDOW:'.WO_NO':@RM ; Props := 'DEFPROP':@RM ; Vals := WONo:@RM
|
|
Ctrls := @WINDOW:'.WO_STEP' ; Props := 'DEFPROP' ; Vals := WOStep
|
|
|
|
Set_Property(Ctrls,Props,Vals)
|
|
|
|
PrerunInfo = Gan_Services('GetRunInfo', GanRunID)
|
|
SuscSerial = PreRunInfo<2,1>
|
|
Pockets = PrerunInfo<3>
|
|
Scribes = PrerunInfo<4>
|
|
SatIDs = PrerunInfo<5>
|
|
Usages = ''
|
|
InWfrIDs = ''
|
|
NumWfrsNeeded = 0
|
|
NumDummyWfrs = 0
|
|
|
|
Set_Property(Window:'.SUSC_SERIAL', 'TEXT', SuscSerial)
|
|
|
|
For each Scribe in Scribes using @VM setting vPos
|
|
WaferID = GanRunID[1,7]:'W'
|
|
DummyID = GanRunID[1,7]:'D'
|
|
EmptyID = GaNRunID[1,7]:'E'
|
|
EmptyFlag = (Indexc(Scribe, 'EMPTY', 1) > 0)
|
|
DummyFlag = (Indexc(Scribe, 'DUMMY', 1) > 0)
|
|
|
|
Begin Case
|
|
Case ( (Scribe[1,8] EQ DummyID) or (DummyFlag EQ True$) )
|
|
Usages<1, vPos> = 'DUMMY'
|
|
NumDummyWfrs += 1
|
|
|
|
Case ( (Scribe[1,8] EQ EmptyID) or (EmptyFlag EQ True$) )
|
|
Usages<1, vPos> = 'EMPTY'
|
|
|
|
Case Scribe[1,8] EQ WaferID
|
|
Usages<1, vPos> = 'PROD'
|
|
NumWfrsNeeded += 1
|
|
|
|
Case Otherwise$
|
|
Usages<1, vPos> = 'PROD'
|
|
NumWfrsNeeded += 1
|
|
End Case
|
|
|
|
Next Scribe
|
|
|
|
AvailInWfrs = GaN_Services('GetPreEpiWfrs', WONo, NumWfrsNeeded)
|
|
If Error_Services('NoError') then
|
|
AvailInWfrIndex = 1
|
|
For each Usage in Usages using @VM setting vPos
|
|
If Usage EQ 'PROD' then
|
|
InWfrIDs<1, vPos> = AvailInWfrs<1, AvailInWfrIndex>
|
|
AvailInWfrIndex += 1
|
|
end
|
|
Next Usage
|
|
SuscConfigID = Xlate('REACTOR', Reactor, REACTOR_SUSC_CONFIG_ID$, 'X')
|
|
If SuscConfigID NE '' then
|
|
SuscRec = Database_Services('ReadDataRow', 'EPI_SUSCEPTOR', SuscConfigID)
|
|
CarrSlots = ''
|
|
CarrWfrIDs = ''
|
|
pCnt = DCount(Pockets, @VM)
|
|
For PocketIndex = 1 to pCnt
|
|
Locate PocketIndex in SuscRec<EPI_SUSCEPTOR_POCKET_NO$> using @VM setting Pos then
|
|
CarrSlot = SuscRec<EPI_SUSCEPTOR_CARR_SLOT$,Pos>
|
|
CarrSlots<1,PocketIndex> = CarrSlot
|
|
CarrWfrIDs<1,PocketIndex> = RDSNo:'.':CarrSlot
|
|
end
|
|
Next PocketIndex
|
|
ReactorLoadList = ''
|
|
ReactorLoadList<1> = Usages
|
|
ReactorLoadList<2> = Pockets
|
|
ReactorLoadList<3> = Scribes
|
|
ReactorLoadList<4> = SatIDs
|
|
ReactorLoadList<5> = InWfrIDs
|
|
ReactorLoadList<6> = CarrSlots
|
|
ReactorLoadList<7> = CarrWfrIDs
|
|
Set_Property(@Window:'.REACTOR_TABLE', 'ARRAY', ReactorLoadList)
|
|
Set_Property(@Window, '@NUM_DUMMY_WFRS', NumDummyWfrs)
|
|
|
|
// Verify wafer list is complete, otherwise disable the load confirmation button.
|
|
NumWfrs = 0
|
|
For WfrIndex = 1 to 8
|
|
If InWfrIDs<0, WfrIndex> NE '' then NumWfrs += 1
|
|
Next WfrIndex
|
|
If NumWfrs LT 5 then
|
|
ErrorMessage = 'There was an error retrieving run information. Unable to load at this time.'
|
|
ErrMsg(ErrorMessage)
|
|
Set_Property(@Window:'.CONFIRM_BUTTON', 'ENABLED', -1)
|
|
end
|
|
FormSize = ''
|
|
SRP_Show_Window(@Window, 'REACT_RUN', 'C', 'C', 1, '', False$, False$, FormSize)
|
|
end else
|
|
ErrorMessage = 'SUSC_CONFIG_ID value has not been set up on reactor ':Reactor:'. Unable to load.'
|
|
ErrMsg(ErrorMessage)
|
|
End_Dialog(@Window, False$)
|
|
end
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
ErrMsg(ErrorMessage)
|
|
End_Dialog(@Window, False$)
|
|
end
|
|
|
|
End Event
|
|
|
|
|
|
Event WINDOW.CLOSE(CancelFlag)
|
|
|
|
End_Dialog(@Window, CancelFlag)
|
|
|
|
end event
|
|
|
|
|
|
Event CANCEL_BUTTON.CLICK()
|
|
|
|
End_Dialog(@Window, False$)
|
|
|
|
end event
|
|
|
|
|
|
Event CONFIRM_BUTTON.CLICK()
|
|
|
|
CurrDTM = DateTime()
|
|
StageDesc = Get_Property(@Window:'.STAGE', 'TEXT')
|
|
StageIndex = GaN_Services('GetStageIndex', '', StageDesc)
|
|
StageID = GaN_Services('GetStageID', StageDesc)
|
|
SuscSerial = Get_Property(@Window:'.SUSC_SERIAL', 'TEXT')
|
|
ReactorLoadArray = Get_Property(@Window:'.REACTOR_TABLE', 'ARRAY')
|
|
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
|
GaNRunID = Get_Property(@Window:'.GAN_RUN', 'TEXT')
|
|
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
|
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
|
|
ToolID = 'R':Reactor
|
|
Usages = ReactorLoadArray<1>
|
|
Pockets = ReactorLoadArray<2>
|
|
Scribes = ReactorLoadArray<3>
|
|
SatIDs = ReactorLoadArray<4>
|
|
InWfrIDs = ReactorLoadArray<5>
|
|
CarrSlots = ReactorLoadArray<6>
|
|
CarrWfrIDs = ReactorLoadArray<7>
|
|
|
|
// Update REACT_RUN record
|
|
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
|
|
ReactRunRec<REACT_RUN_IN_SLOT_ID$> = InWfrIDs
|
|
ReactRunRec<REACT_RUN_IN_WFR_ID$> = InWfrIDs
|
|
ReactRunRec<REACT_RUN_LOAD_SIG$> = @User4
|
|
ReactRunRec<REACT_RUN_LOAD_SIG_DTM$> = CurrDTM
|
|
ReactRunRec<REACT_RUN_IN_WFR_CHAR$> = Usages
|
|
ReactRunRec<REACT_RUN_CARR_SLOT_NO$> = CarrSlots
|
|
ReactRunRec<REACT_RUN_PKT_SAT_ID$> = SatIDs
|
|
ReactRunRec<REACT_RUN_GAN_SUSC_SERIAL$> = SuscSerial
|
|
|
|
// Bind current GaN Param Keys from the PSN to the REACT_RUN record
|
|
PSNo = Xlate('REACT_RUN', RDSNo, 'PS_NO', 'X')
|
|
|
|
GaNParamKeys = Xlate('PROD_SPEC', PSNo, 'GAN_PARAM_KEYS', 'X')
|
|
If GaNParamKeys NE '' then
|
|
ReactRunRec<REACT_RUN_GAN_PARAM_KEYS$> = GaNParamKeys
|
|
// Store list of critical stages
|
|
CritStages = ''
|
|
For each GaNParamKey in GaNParamKeys using @VM
|
|
CritStage = Field(GaNParamKey, '*', 2, 1)
|
|
CritStages<0, -1> = CritStage
|
|
Next GaNParamKey
|
|
ReactRunRec<REACT_RUN_GAN_CRITICAL_STAGES$> = CritStages
|
|
end
|
|
|
|
GaNStageRoute = Xlate('PROD_SPEC', PSNo, 'PRS_STAGE_ROUTE', 'X')
|
|
If GaNStageRoute NE '' then
|
|
ReactRunRec<REACT_RUN_GAN_STAGE_ROUTE$> = GaNStageRoute
|
|
end else
|
|
ReactRunRec<REACT_RUN_GAN_STAGE_ROUTE$> = Database_Services('ReadDataRow', 'APP_INFO', 'DEFAULT_GAN_STAGE_ROUTE')
|
|
end
|
|
Database_Services('WriteDataRow', 'REACT_RUN', RDSNo, ReactRunRec, True$, False$, True$)
|
|
|
|
// Update WO_WFR record(s) with scribe, event, location, DTM, etc.
|
|
For each InWfrID in InWfrIDs using @VM setting vPos
|
|
// Ensure the wafer is PROD by looking for a value
|
|
If InWfrID NE '' then
|
|
WOWfrRec = Database_Services('ReadDataRow', 'WO_WFR', InWfrID)
|
|
LocDTMs = WOWfrRec<WO_WFR_LOC_DTM$>
|
|
NextIndex = DCount(LocDTMs, @VM) + 1
|
|
WOWfrRec<WO_WFR_LOC_DTM$, NextIndex> = CurrDTM
|
|
WOWfrRec<WO_WFR_LOC_BY$, NextIndex> = @User4
|
|
WOWfrRec<WO_WFR_LOC_EVENT$, NextIndex> = 'LOAD'
|
|
WOWfrRec<WO_WFR_SLOT_ID$> = InWfrID
|
|
WOWfrRec<WO_WFR_RUN_LOC$, NextIndex> = RDSNo:'.':vPos:'.'
|
|
WOWfrRec<WO_WFR_CARR_SLOT$, NextIndex> = CarrWfrIDs<0, vPos>
|
|
WOWfrRec<WO_WFR_GAN_RUN_ID$> = GaNRunID
|
|
WOWfrRec<WO_WFR_TOOL_ID$, NextIndex> = ToolID
|
|
WOWfrRec<WO_WFR_INV_LOC$, NextIndex> = ''
|
|
WOWfrRec<WO_WFR_SCRIBE$> = Scribes<0, vPos>
|
|
WOWfrRec<WO_WFR_POCKET$> = Pockets<0, vPos>
|
|
Database_Services('WriteDataRow', 'WO_WFR', InWfrID, WOWfrRec, True$, False$, True$)
|
|
// Move wafer(s) to appropriate TOOL_WFR queue
|
|
GaN_Services('MoveWfrToQueue', InWfrID, ToolID)
|
|
// Mark inbound material consumed (i.e. move WfrID to PrevWfrID within WO_MAT_WFR (WorkOrder*InboundCassette) record)
|
|
InboundCass = Field(InWfrID, '*', 2, 1)
|
|
WOMatWfrKey = WONo:'*':InboundCass
|
|
WOMatWfrRec = Database_Services('ReadDataRow', 'WO_MAT_WFR', WOMatWfrKey)
|
|
ReadyQ = WOMatWfrRec<WO_MAT_WFR_IN_WFR_ID$>
|
|
ConsumedQ = WOMatWfrRec<WO_MAT_WFR_IN_PREV_WFR_ID$>
|
|
SlotNo = Field(InWfrID, '*', 3, 1)
|
|
ReadyQ<0, SlotNo> = ''
|
|
ConsumedQ<0, SlotNo> = InWfrID
|
|
WOMatWfrRec<WO_MAT_WFR_IN_WFR_ID$> = ReadyQ
|
|
WOMatWfrRec<WO_MAT_WFR_IN_PREV_WFR_ID$> = ConsumedQ
|
|
Database_Services('WriteDataRow', 'WO_MAT_WFR', WOMatWfrKey, WOMatWfrRec, True$, False$, True$)
|
|
end
|
|
Next InWfrID
|
|
// Remove run number from current LOCATION queue
|
|
WOMatKey = Xlate('REACT_RUN', RDSNo, 'WO_MAT_KEY', 'X')
|
|
GaN_Services('RemoveCassFromWIP', WOMatKey)
|
|
// Close dialog. Return True$ for success, otherwise present error message
|
|
If Error_Services('NoError') then
|
|
// Update RUN_STAGE record
|
|
RunStageKey = RDSNo:'*':StageID
|
|
RunStageRec = Database_Services('ReadDataRow', 'RUN_STAGE', RunStageKey)
|
|
InvAct = 'LOAD'
|
|
InvActs = RunStageRec<RUN_STAGE_SPEC_INV_ACTION$>
|
|
Locate InvAct in InvActs using @VM setting vPos then
|
|
RunStageRec<RUN_STAGE_TOOL_ID$> = ToolID
|
|
RunStageRec<RUN_STAGE_SIA_COMP_BY$, vPos> = @User4
|
|
RunStageRec<RUN_STAGE_SIA_COMP_DTM$, vPos> = CurrDTM
|
|
RunStageRec<RUN_STAGE_STATUS$> = 'START'
|
|
Database_Services('WriteDataRow', 'RUN_STAGE', RunStageKey, RunStageRec, True$, False$, True$)
|
|
Result = True$
|
|
end
|
|
End_Dialog(@Window, Result)
|
|
end else
|
|
ErrorMessage = Error_Services('GetMessage')
|
|
ErrMsg(ErrorMessage)
|
|
end
|
|
|
|
end event
|
|
|