open-insight/LSL2/STPROC/OBJ_CLEAN_INSP.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

1058 lines
38 KiB
Plaintext

COMPILE FUNCTION obj_Clean_Insp(Method,Parms)
/*
Methods for CLEAN_INSP table
08/5/2009 JCH - Initial Coding
Properties:
Methods:
Create(DataStruct) ;* Create new record
*/
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn
DECLARE FUNCTION obj_RDS_Test, Environment_Services, Error_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In,obj_WO_Mat
DECLARE SUBROUTINE ErrMsg
$INSERT MSG_EQUATES
$INSERT DICT_EQUATES
$INSERT CLEAN_INSP_EQUATES
$INSERT QUOTE_SPEC_EQU
$INSERT PROD_SPEC_EQUATES
$INSERT REACT_RUN_EQUATES
$INSERT SURFACE_SCAN_EQUATES
$INSERT WM_OUT_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT PRS_STAGE_EQUATES
$INSERT WO_LOG_EQUATES
$INSERT EPI_PART_EQUATES
EQU CRLF$ TO \0D0A\
EQU TAB$ TO CHAR(9)
EQU ACTION$ACTIONS TO 1 ;* Data structures for each action
EQU ACTION$SIGS TO 2
EQU ACTION$SIG_DTMS TO 3
EQU ACTION$TOOLS TO 4
EQU ACTION$SPEC_CLEAN_TOOL TO 5
EQU ACTION$SPEC_MICROSCOPE TO 6
EQU ACTION$SPEC_BRIGHTLIGHT TO 7
EQU ACTION$SPEC_SURFSCAN_RECIPE TO 8
EQU ACTION$SPEC_EDGE TO 9
$INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec_CI values
ErrTitle = 'Error in Stored Procedure "obj_Clean_Insp"'
ErrorMsg = ''
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 = 'Create' ; GOSUB Create
CASE Method = 'Desc' ; GOSUB Desc
CASE Method = 'Delete' ; GOSUB Delete
CASE Method = 'CurrStatus' ; GOSUB CurrStatus
CASE Method = 'SigComp' ; GOSUB SigComp
CASE Method = 'SetClean' ; GOSUB SetClean
CASE Method = 'SetInsp' ; GOSUB SetInsp
CASE Method = 'SetScan' ; GOSUB SetScan
CASE Method = 'SendToSPC' ; GOSUB SendToSPC
CASE Method = 'WMOConv' ; GOSUB WMOConv
CASE Method = 'GetActions' ; GOSUB GetActions
CASE Method = 'SpecDelta' ; GOSUB SpecDelta
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]
Stages = Parms[COL2()+1,@RM] ;* pass as a @VM'd list of stages
RDSNo = Parms[COL2()+1,@RM]
PSNo = Parms[COL2()+1,@RM]
PSRec = 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 Stages = '' THEN ErrorMsg = 'Null Parameter "Stages" passed to routine. (':Method:')'
IF PSNo = '' THEN ErrorMsg = 'Null Parameter "PSNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF PSRec = '' THEN
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
END
IF PSRec = '' THEN
ErrorMsg = 'Invalid Parameter "PSNo" passed to routine. (':Method:')'
RETURN
END
StageCnt = COUNT(Stages,@VM) + (Stages NE '')
FOR N = 1 TO StageCnt
Stage = Stages<1,N>
PRSStageRec = XLATE('PRS_STAGE',PSNo:'*':Stage,'','X')
CIRec = ''
CIRec<CLEAN_INSP_SPEC_INSP_REQ$> = PRSStageRec<PRS_STAGE_INSP_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$> = PRSStageRec<PRS_STAGE_BRIGHTLIGHT$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_MICROSCOPE$> = PRSStageRec<PRS_STAGE_MICROSCOPE$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_EDGE$> = PRSStageRec<PRS_STAGE_EDGE$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_PITS$> = PRSStageRec<PRS_STAGE_PITS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_MOUNDS$> = PRSStageRec<PRS_STAGE_MOUNDS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BL_DEFECTS$> = PRSStageRec<PRS_STAGE_BL_DEFECTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SPOTS$> = PRSStageRec<PRS_STAGE_SPOTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_FOV$> = PRSStageRec<PRS_STAGE_FOV$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SCRATCHES$> = PRSStageRec<PRS_STAGE_SCRATCHES$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> = PRSStageRec<PRS_STAGE_SCRATCH_LEN$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_LPD$> = PRSStageRec<PRS_STAGE_LPD$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_STACK_FAULTS$> = PRSStageRec<PRS_STAGE_STACK_FAULTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SPIKES$> = PRSStageRec<PRS_STAGE_SPIKES$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BSIDE_SCRATCHES$> = PRSStageRec<PRS_STAGE_BSIDE_SCRATCHES$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BSIDE_SCRATCH_LEN$> = PRSStageRec<PRS_STAGE_BSIDE_SCRATCH_LEN$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BSIDE_NODULES$> = PRSStageRec<PRS_STAGE_BSIDE_NODULES$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BSIDE_SPIKES$> = PRSStageRec<PRS_STAGE_BSIDE_SPIKES$> ;* Visual Inspection
IF Stage = 'PRE' THEN
EpiPartNo = XLATE('WO_LOG',WONo,WO_LOG_EPI_PART_NO$,'X')
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
CIRec<CLEAN_INSP_SPEC_CLEAN_SUBOXIDE$> = EpiPartRec<EPI_PART_SUB_OXIDE$>
CIRec<CLEAN_INSP_SPEC_CLEAN_OXIDE_ANGSTROMS$> = EpiPartRec<EPI_PART_SUB_OXIDE_ANGSTROMS$>
END
CIRec<CLEAN_INSP_SPEC_SURFSCAN_REQ$> = PRSStageRec<PRS_STAGE_SURFSCAN_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$> = PRSStageRec<PRS_STAGE_SURFSCAN_RECIPE$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SURF_HAZE$> = PRSStageRec<PRS_STAGE_SURF_HAZE$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$> = PRSStageRec<PRS_STAGE_SURF_DEFECTS$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$> = PRSStageRec<PRS_STAGE_SS_SAMP_QTY$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_CLEAN_REQ$> = PRSStageRec<PRS_STAGE_CLEAN_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$> = PRSStageRec<PRS_STAGE_CLEAN_TOOL$> ;* Cleans
CIRec<CLEAN_INSP_SPEC_CLEAN_RECIPE$> = PRSStageRec<PRS_STAGE_CLEAN_RECIPE$> ;* Cleans
IF CIRec NE '' THEN
CINo = NextKey('CLEAN_INSP')
If Error_Services('NoError') then
CIRec<CLEAN_INSP_WO_NO$> = WONo
CIRec<CLEAN_INSP_WO_STEP$> = WOStep
CIRec<CLEAN_INSP_CASS_NO$> = CassNo
CIRec<CLEAN_INSP_STAGE$> = Stage
CIRec<CLEAN_INSP_RDS_NO$> = RDSNo
obj_Tables('WriteRec','CLEAN_INSP':@RM:CINo:@RM:@RM:CIRec)
Result<1,N> = CINo
END ELSE
// Failed to get next key ID from sequential counter record (%SK%)
Result = 0
RETURN Result
END
END
NEXT N
RETURN Result
* * * * * * *
Desc:
* * * * * * *
CINo = Parms[1,@RM]
CIRec = Parms[COL2()+1,@RM]
IF CINo = '' THEN RETURN
IF CIRec = '' THEN CIRec = XLATE('CLEAN_INSP',CINo,'','X')
Stage = CIRec<CLEAN_INSP_STAGE$>
SpecFwiLwi = CIRec<CLEAN_INSP_SPEC_FWI_LWI$>
CTool = CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$>
CRecipe = CIRec<CLEAN_INSP_SPEC_CLEAN_RECIPE$>
IF CTool = 'No' THEN CTool = ''
IBrightlight = CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$>
IMicroscope = CIRec<CLEAN_INSP_SPEC_MICROSCOPE$>
SurfscanRecipe = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
BEGIN CASE
CASE Stage = 'PRE' ; LabelText = 'Pre Epi '
CASE Stage = 'POST' ; LabelText = 'Post Epi '
CASE Stage = 'FWI' ; LabelText = 'First Wafer'
CASE Stage = 'LWI' ; LabelText = 'Last Wafer '
CASE Stage = 'WFR' AND SpecFwiLwi = 'FWI' ; LabelText = 'First Wafer '
CASE Stage = 'WFR' AND SpecFwiLwi = 'LWI' ; LabelText = 'Last Wafer '
CASE Stage[1,3] = 'WFR' AND LEN(Stage) > 3 ; LabelText = 'Wafer ':Stage[4,99]:' Extra '
CASE Stage[1,3] = 'WFR' ; LabelText = 'Wafer '
CASE 1 ; LabelText = 'Cleaning & Inspection '
END CASE
IF Ctool OR CRecipe THEN CleanText = 'Cleaning' ELSE CleanText = ''
IF IBrightLight OR IMicroscope THEN InspText = 'Inspection' ELSE InspText = ''
IF SurfscanRecipe THEN ScanText = 'Surfscan' ELSE ScanText = ''
IF CleanText NE '' THEN
LabelText := CleanText
IF InspText NE '' THEN LabelText := ' & ':InspText
IF ScanText NE '' THEN LabelText := ' & ':ScanText
END ELSE
IF InspText NE '' THEN
LabelText := InspText
IF ScanText NE '' THEN LabelText := ' & ':ScanText
END ELSE
IF ScanText NE '' THEN LabelText := ScanText
END
END
Result = LabelText
RETURN
* * * * * * *
CurrStatus:
* * * * * * *
CINo = Parms[1,@RM]
CIRec = Parms[COL2()+1,@RM]
IF CINo = '' THEN RETURN ;* Called from the dictionary
IF CIRec = '' THEN CIRec = XLATE('CLEAN_INSP',CINo,'','X')
IF CIRec = '' THEN RETURN ;* ErrorMsg = 'Null Parameter "CIRec" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
SCSubOxide = CIRec<CLEAN_INSP_SPEC_CLEAN_SUBOXIDE$>
SCTool = CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$>
SCAkrionRecipe = CIRec<CLEAN_INSP_SPEC_CLEAN_AKRION_RECIPE$>
SBrightLight = CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$>
SMicroscope = CIRec<CLEAN_INSP_SPEC_MICROSCOPE$>
SSurfscanRecipe = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
IF SCTool = 'No' THEN SCTool = ''
IF SCSubOxide OR SCTool OR SCAkrionRecipe THEN
IF CIRec<CLEAN_INSP_CLEAN_SIG$,1> = '' THEN
Result = 'RTC'
END
END
IF SBrightLight OR SMicroscope THEN
* Visual Inspection
IF CIRec<CLEAN_INSP_INSP_SIG$,1> = '' THEN
Result = 'RTI'
END ELSE
SurfaceComp = 1
IF CIRec<CLEAN_INSP_SPEC_LPD$> NE '' AND CIRec<CLEAN_INSP_INSP_LPD_IN$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_PITS$> NE '' AND CIRec<CLEAN_INSP_INSP_PITS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_MOUNDS$> NE '' AND CIRec<CLEAN_INSP_INSP_MOUNDS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_BL_DEFECTS$> NE '' AND CIRec<CLEAN_INSP_INSP_BL_DEFECTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_STACK_FAULTS$> NE '' AND CIRec<CLEAN_INSP_INSP_STACK_FAULTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SPIKES$> NE '' AND CIRec<CLEAN_INSP_INSP_SPIKES$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SPOTS$> NE '' AND CIRec<CLEAN_INSP_INSP_SPOTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_FOV$> NE '' AND CIRec<CLEAN_INSP_INSP_FOV$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCHES$> NE '' AND CIRec<CLEAN_INSP_INSP_SCRATCHES$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> NE '' AND CIRec<CLEAN_INSP_INSP_SCRATCH_LEN$> = '' THEN SurfaceComp = 0
IF SurfaceComp = 0 THEN
Result = 'RTI'
RETURN
END
END ;* End of check for Inspection signature
END
IF SSurfscanRecipe THEN
* Surfscan
SpecSurfDef = OCONV(CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$, 1>,'MD0')
SurfDefMax = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, 1>,'MD0')
SurfDefAvg = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, 1>,'MD3')
SpecSurfHaze = OCONV(CIRec<CLEAN_INSP_SPEC_SURF_HAZE$, 1>,'MD2')
SurfHazeAvgAvg = OCONV( CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$, 1>,'MD3')
IF SpecSurfDef NE '' THEN
IF SurfDefMax NE '' THEN
IF SurfDefMax GE SpecSurfDef THEN
Result = 'OUT'
RETURN
END
END
IF SurfDefAvg NE '' THEN
IF SurfDefAvg GE SpecSurfDef THEN
Result = 'OUT'
RETURN
END
END
END
IF SpecSurfHaze NE '' THEN
IF SurfHazeAvgAvg NE '' THEN
IF SurfHazeAvgAvg GE SpecSurfHaze THEN
Result = 'OUT'
RETURN
END
END
END
IF CIRec<CLEAN_INSP_SCAN_SIG$,1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_TOOL$, 1> NE '' THEN
Result = 'RTS'
RETURN
END
END
END
END
END
END
RETURN
* * * * * * *
SigComp:
* * * * * * *
/*
This returns a set of 3 tri-state boolean values, one for each section Cleans/Insp/Surfscan
Null = Nothing specifed
0 = Specified - no signature
1 = Specified and at least one signature complete
*/
CINo = Parms[1,@RM]
CIRec = Parms[COL2()+1,@RM]
IF CINo = '' THEN RETURN ;* Called from the dictionary
IF CIRec = '' THEN CIRec = XLATE('CLEAN_INSP',CINo,'','X')
IF CIRec = '' THEN RETURN ;* ErrorMsg = 'Null Parameter "CIRec" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
SCSubOxide = CIRec<CLEAN_INSP_SPEC_CLEAN_SUBOXIDE$>
SCTool = CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$>
SCAkrionRecipe = CIRec<CLEAN_INSP_SPEC_CLEAN_AKRION_RECIPE$>
SBrightLight = CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$>
SMicroscope = CIRec<CLEAN_INSP_SPEC_MICROSCOPE$>
SEdge = CIRec<CLEAN_INSP_SPEC_EDGE$>
SSurfscanRecipe = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
IF SCTool = 'No' THEN SCTool = ''
* Cleans
IF SCSubOxide OR SCTool OR SCAkrionRecipe THEN
IF CIRec<CLEAN_INSP_CLEAN_SIG$,1> = '' THEN
Result<1,1> = 0
END Else
Result<1,1> = 1
END
END ELSE
Result<1,1> = '' ;* No Cleans specified
END
* Inspection
IF SBrightLight OR SMicroscope OR SEdge THEN
IF CIRec<CLEAN_INSP_INSP_SIG$,1> = '' THEN
Result<1,2> = 0
END ELSE
Result<1,2> = 1
END
END ELSE
Result<1,2> = ''
END
* SurfaceScan
IF SSurfscanRecipe THEN
IF CIRec<CLEAN_INSP_SCAN_SIG_DTM$,1> = '' THEN
Result<1,3> = 0
END ELSE
Result<1,3> = 1
END
END ELSE
Result<1,3> = ''
END
RETURN
* * * * * * *
SpecDelta:
* * * * * * *
CINo = Parms[1,@RM]
PSStageKey = Parms[COL2()+1,@RM]
IF CINo = '' THEN ErrorMsg = 'Null parameter "CINo" passed to routine . (':Method:')'
IF PSStageKey = '' THEN ErrorMsg = 'Null parameter "PSStageKey" passed to routine . (':Method:')'
PRSStageRec = XLATE('PRS_STAGE',PSStageKey,'','X')
IF PRSStageRec = '' THEN
otParms = 'CLEAN_INSP':@RM:CINo
obj_Tables('DeleteRec',otParms)
RETURN
END
IF ErrorMsg NE '' THEN RETURN
otParms = 'CLEAN_INSP':@RM:CINo
CIRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN RETURN
WONo = CIRec<CLEAN_INSP_WO_NO$>
WOStep = CIRec<CLEAN_INSP_WO_STEP$>
CassNo = CIRec<CLEAN_INSP_CASS_NO$>
Stage = CIRec<CLEAN_INSP_STAGE$>
RDSNo = CIRec<CLEAN_INSP_RDS_NO$>
CIRec<CLEAN_INSP_SPEC_INSP_REQ$> = PRSStageRec<PRS_STAGE_INSP_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_SURFSCAN_REQ$> = PRSStageRec<PRS_STAGE_SURFSCAN_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_CLEAN_REQ$> = PRSStageRec<PRS_STAGE_CLEAN_SIG_REQ$>
CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$> = PRSStageRec<PRS_STAGE_BRIGHTLIGHT$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_MICROSCOPE$> = PRSStageRec<PRS_STAGE_MICROSCOPE$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_EDGE$> = PRSStageRec<PRS_STAGE_EDGE$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_PITS$> = PRSStageRec<PRS_STAGE_PITS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_MOUNDS$> = PRSStageRec<PRS_STAGE_MOUNDS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_BL_DEFECTS$> = PRSStageRec<PRS_STAGE_BL_DEFECTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SPOTS$> = PRSStageRec<PRS_STAGE_SPOTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_FOV$> = PRSStageRec<PRS_STAGE_FOV$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SCRATCHES$> = PRSStageRec<PRS_STAGE_SCRATCHES$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> = PRSStageRec<PRS_STAGE_SCRATCH_LEN$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_LPD$> = PRSStageRec<PRS_STAGE_LPD$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_STACK_FAULTS$> = PRSStageRec<PRS_STAGE_STACK_FAULTS$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SPIKES$> = PRSStageRec<PRS_STAGE_SPIKES$> ;* Visual Inspection
CIRec<CLEAN_INSP_INSP_INTERVAL$> = PRSStageRec<PRS_STAGE_INSP_INTERVAL$> ;* Visual Inspection
CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$> = PRSStageRec<PRS_STAGE_SURFSCAN_RECIPE$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SURF_HAZE$> = PRSStageRec<PRS_STAGE_SURF_HAZE$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$> = PRSStageRec<PRS_STAGE_SURF_DEFECTS$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$> = PRSStageRec<PRS_STAGE_SS_SAMP_QTY$> ;* Surface Scan
CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$> = PRSStageRec<PRS_STAGE_CLEAN_TOOL$> ;* Cleans
CIRec<CLEAN_INSP_SPEC_CLEAN_RECIPE$> = PRSStageRec<PRS_STAGE_CLEAN_RECIPE$> ;* Cleans
otParms = FieldStore(otParms,@RM,4,0,CIRec)
obj_Tables('WriteRec',otParms)
IF WONo NE '' AND CassNo NE '' THEN
obj_WO_Mat('RefreshSigProfile',WONo:'*':CassNo)
END
RETURN
********************************************************************************************************************************
* * * * * * *
WMOConv:
* * * * * * *
* appears dead (not called anywhere 1/24/2013 JCH)
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
Stage = 'POST'
RDSNo = ''
WMORec = XLATE('WM_OUT',WONo:'*':StepNo:'*':CassNo,'','X')
* Build Specification driven fields
PostStageRec = ''
PostStageRec<CLEAN_INSP_WO_NO$> = WONo
PostStageRec<CLEAN_INSP_WO_STEP$> = StepNo
PostStageRec<CLEAN_INSP_CASS_NO$> = CassNo
PostStageRec<CLEAN_INSP_STAGE$> = Stage
PostStageRec<CLEAN_INSP_RDS_NO$> = RDSNo
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostClean$>
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostAkrionRecipe$>
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
IF SCTool NE '' OR SCToolRecipe NE '' THEN
PostStageRec<CLEAN_INSP_SPEC_CLEAN_TOOL$> = SCTool
PostStageRec<CLEAN_INSP_SPEC_CLEAN_AKRION_RECIPE$> = SCToolRecipe
END
PostStageRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$> = PSRec<PROD_SPEC_POST_CLEAN_BRIGHTLIGHT$>
PostStageRec<CLEAN_INSP_SPEC_SURFSCAN_REQ$> = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
PostStageRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$> = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN_RECIPE$>
IF PostStageRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$> = 1 THEN
PostStageRec<CLEAN_INSP_SPEC_PITS$> = PSRec<PROD_SPEC_POST_PITS$>
PostStageRec<CLEAN_INSP_SPEC_MOUNDS$> = PSRec<PROD_SPEC_POST_MOUNDS$>
PostStageRec<CLEAN_INSP_SPEC_BL_DEFECTS$> = PSRec<PROD_SPEC_POST_BL_DEFECTS$>
PostStageRec<CLEAN_INSP_SPEC_SPOTS$> = PSRec<PROD_SPEC_POST_SPOTS$>
PostStageRec<CLEAN_INSP_SPEC_FOV$> = PSRec<PROD_SPEC_POST_FOV$>
PostStageRec<CLEAN_INSP_SPEC_SCRATCHES$> = PSRec<PROD_SPEC_POST_SCRATCHES$>
PostStageRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> = PSRec<PROD_SPEC_POST_SCRATCH_LEN$>
PostStageRec<CLEAN_INSP_SPEC_LPD$> = PSRec<PROD_SPEC_POST_LPD$>
PostStageRec<CLEAN_INSP_SPEC_STACK_FAULTS$> = PSRec<PROD_SPEC_POST_STACK_FAULTS$>
PostStageRec<CLEAN_INSP_SPEC_SPIKES$> = PSRec<PROD_SPEC_POST_SPIKES$>
END
PostStageRec<CLEAN_INSP_SPEC_SURF_HAZE$> = PSRec<PROD_SPEC_POST_CLEAN_SURF_HAZE$>
PostStageRec<CLEAN_INSP_SPEC_SURF_DEFECTS$> = PSRec<PROD_SPEC_POST_CLEAN_SURF_DEFECTS$>
PostStageRec<CLEAN_INSP_SPEC_SS_SAMP_QTY$> = PSRec<PROD_SPEC_POST_CLEAN_SS_SAMP_QTY$>
PostStageRec<CLEAN_INSP_RDS_NO$> = RDSNo
PostStageRec<CLEAN_INSP_CLEAN_TOOL$> = WMORec<WM_OUT_POST_CODE$>
PostStageRec<CLEAN_INSP_CLEAN_BOAT_ID$> = WMORec<WM_OUT_POST_BOAT_ID$>
PostStageRec<CLEAN_INSP_CLEAN_SRD_NO$> = WMORec<WM_OUT_POST_SRD_NO$>
IF WMORec<WM_OUT_POST_CODE$> NE '' OR WMORec<WM_OUT_POST_BOAT_ID$> NE '' OR WMORec<WM_OUT_POST_SRD_NO$> NE '' THEN
PostStageRec<CLEAN_INSP_CLEAN_SIG$> = WMORec<WM_OUT_POST_EPI_SIG$>
PostStageRec<CLEAN_INSP_CLEAN_SIG_DTM$> = WMORec<WM_OUT_POST_EPI_SIG_DTM$>
END
PostStageRec<CLEAN_INSP_SHIFT$> = WMORec<WM_OUT_SHIFT$>
SurfaceScanRec = XLATE('SURFACE_SCAN',WONO:'*':StepNo:'*':CassNo:'*':'PC','','X')
PostStageRec<CLEAN_INSP_SCAN_TOOL$> = SurfaceScanRec<SURFACE_SCAN_SCAN_TOOL$>
PostStageRec<CLEAN_INSP_SCAN_SIG_DTM$> = SurfaceScanRec<SURFACE_SCAN_SCAN_DTM$>
PostStageRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$> = SurfaceScanRec<SURFACE_SCAN_SUM_OF_DEF_MIN$>
PostStageRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$> = SurfaceScanRec<SURFACE_SCAN_SUM_OF_DEF_MAX$>
PostStageRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$> = SurfaceScanRec<SURFACE_SCAN_SUM_OF_DEF_AVG$>
PostStageRec<CLEAN_INSP_SCAN_HAZE_AVG_MIN$> = SurfaceScanRec<SURFACE_SCAN_HAZE_AVG_MIN$>
PostStageRec<CLEAN_INSP_SCAN_HAZE_AVG_MAX$> = SurfaceScanRec<SURFACE_SCAN_HAZE_AVG_MAX$>
PostStageRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$> = SurfaceScanRec<SURFACE_SCAN_HAZE_AVG_AVG$>
IF PostStageRec NE '' THEN
RETURN
END
RETURN
*****************
Stage = CIRec<CLEAN_INSP_STAGE$>
COxide = CIRec<CLEAN_INSP_SPEC_CLEAN_SUBOXIDE$>
CAngstroms = CIRec<CLEAN_INSP_SPEC_CLEAN_OXIDE_ANGSTROMS$>
CTool = CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$>
COxide = CIRec<CLEAN_INSP_SPEC_CLEAN_AKRION_RECIPE$> ;********************* fix this !!!!!!!!!!!!!!!!!!!!
IF CTool[1,2] = 'No' OR CTool[1,2] = 'If' THEN CTool = ''
IBrightlight = CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$>
IMicroscope = CIRec<CLEAN_INSP_SPEC_MICROSCOPE$>
Surfscan = CIRec<CLEAN_INSP_SPEC_SURFSCAN_REQ$>
SurfscanRecipe = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
IF COxide OR CAngstroms OR CTool OR COxide THEN
IF CIRec<CLEAN_INSP_CLEAN_SIG$> = '' AND CTool NE '' THEN
Result = 'RTC'
RETURN
END
END
Stage = CIRec<CLEAN_INSP_STAGE$>
IF (IBrightLight OR IMicroscope) THEN
IF CIRec<CLEAN_INSP_INSP_SIG$,1> = '' THEN
NoSpec = 1
IF CIRec<CLEAN_INSP_SPEC_LPD$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_PITS$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_MOUNDS$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_BL_DEFECTS$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_STACK_FAULTS$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_SPIKES$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_SPOTS$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_FOV$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCHES$> NE '' THEN NoSpec = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> NE '' THEN NoSpec = 0
IF NoSpec THEN
Result = 'RTI'
RETURN
END
SurfaceComp = 1
IF CIRec<CLEAN_INSP_SPEC_LPD$> NE '' AND CIRec<CLEAN_INSP_INSP_LPD_IN$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_PITS$> NE '' AND CIRec<CLEAN_INSP_INSP_PITS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_MOUNDS$> NE '' AND CIRec<CLEAN_INSP_INSP_MOUNDS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_BL_DEFECTS$> NE '' AND CIRec<CLEAN_INSP_INSP_BL_DEFECTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_STACK_FAULTS$> NE '' AND CIRec<CLEAN_INSP_INSP_STACK_FAULTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SPIKES$> NE '' AND CIRec<CLEAN_INSP_INSP_SPIKES$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SPOTS$> NE '' AND CIRec<CLEAN_INSP_INSP_SPOTS$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_FOV$> NE '' AND CIRec<CLEAN_INSP_INSP_FOV$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCHES$> NE '' AND CIRec<CLEAN_INSP_INSP_SCRATCHES$> = '' THEN SurfaceComp = 0
IF CIRec<CLEAN_INSP_SPEC_SCRATCH_LEN$> NE '' AND CIRec<CLEAN_INSP_INSP_SCRATCH_LEN$> = '' THEN SurfaceComp = 0
IF SurfaceComp = 0 THEN
Result = 'RTI'
RETURN
END
END ;* End of check for Inspection signature
END
IF Surfscan OR SurfscanRecipe THEN
SpecSurfDef = OCONV(CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$, 1>,'MD0')
SurfDefMax = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, 1>,'MD0')
SurfDefAvg = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, 1>,'MD3')
SpecSurfHaze = OCONV(CIRec<CLEAN_INSP_SPEC_SURF_HAZE$, 1>,'MD2')
SurfHazeAvgAvg = OCONV( CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$, 1>,'MD3')
IF SpecSurfDef NE '' THEN
IF SurfDefMax NE '' THEN
IF SurfDefMax GE SpecSurfDef THEN
Result = 'OUT'
RETURN
END
END
IF SurfDefAvg NE '' THEN
IF SurfDefAvg GE SpecSurfDef THEN
Result = 'OUT'
RETURN
END
END
END
IF SpecSurfHaze NE '' THEN
IF SurfHazeAvgAvg NE '' THEN
IF SurfHazeAvgAvg GE SpecSurfHaze THEN
Result = 'OUT'
RETURN
END
END
END
IF CIRec<CLEAN_INSP_SCAN_SIG$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, 1> = '' THEN
IF CIRec<CLEAN_INSP_SCAN_TOOL$, 1> NE '' THEN
Result = 'RTS'
RETURN
END
END
END
END
END
END
RETURN
* * * * * * *
Delete:
* * * * * * *
CINos = Parms[1,@RM]
IF CINos = '' THEN RETURN
CONVERT @VM:@SVM TO @FM:@FM IN CINos
OPEN 'CLEAN_INSP' TO CIFile THEN
KeyCnt = COUNT(CINos,@FM) + (CINos NE '')
FOR I = 1 TO KeyCnt
DELETE CIFile,CINos<I> ELSE NULL
NEXT I
END
RETURN
* * * * * * *
SetClean:
* * * * * * *
CINo = Parms[1,@RM]
CleanTool = Parms[COL2()+1,@RM]
CleanBoatID = Parms[COL2()+1,@RM]
CleanSRDNo = Parms[COL2()+1,@RM]
CleanSig = Parms[COL2()+1,@RM]
CleanSigDt = Parms[COL2()+1,@RM]
CleanSigTm = Parms[COL2()+1,@RM]
IF CINo = '' THEN ErrorMsg = 'Null Parameter "CINo" passed to routine. (':Method:')'
IF CleanSig = '' THEN ErrorMsg = 'Null Parameter "CleanSig" passed to routine. (':Method:')'
IF CleanSigDt = '' THEN ErrorMsg = 'Null Parameter "CleanSigDt" passed to routine. (':Method:')'
IF CleanSigTm = '' THEN ErrorMsg = 'Null Parameter "CleanSigTm" passed to routine. (':Method:')'
IF CleanTool = '' THEN RETURN ;* Bogus data
IF ErrorMsg NE '' THEN RETURN
thisCleanSigDt = ICONV(CleanSigDt,'D')
IF thisCleanSigDt = '' THEN
ErrorMsg = 'Invalid Parameter ':CleanSigDt:' passed to routine. (':Method:')'
RETURN
END
thisCleanSigTm = ICONV(CleanSigTm,'MT')
IF thisCleanSigTm = '' THEN
ErrorMsg = 'Invalid Parameter ':CleanSigTm:' passed to routine. (':Method:')'
RETURN
END
thisSigDTM = ICONV(OCONV(thisCleanSigDt,'D4/'):' ':OCONV(thisCleanSigTm,'MTHS'),'DT')
CIParms = 'CLEAN_INSP':@RM:CINo
CIRec = obj_Tables('ReadRec',CIParms)
IF Get_Status(errCode) THEN RETURN
LOCATE thisSigDTM IN CIRec<CLEAN_INSP_CLEAN_SIG_DTM$> BY 'DR' USING @VM SETTING Pos THEN
CIRec<CLEAN_INSP_CLEAN_TOOL$,Pos> = CleanTool
CIRec<CLEAN_INSP_CLEAN_BOAT_ID$,Pos> = CleanBoatID
CIRec<CLEAN_INSP_CLEAN_SRD_NO$,Pos> = CleanSRDNo
CIRec<CLEAN_INSP_CLEAN_SIG$,Pos> = CleanSig
END ELSE
CIRec = INSERT(CIRec,CLEAN_INSP_CLEAN_TOOL$,Pos,0,CleanTool)
CIRec = INSERT(CIRec,CLEAN_INSP_CLEAN_BOAT_ID$,Pos,0,CleanBoatID)
CIRec = INSERT(CIRec,CLEAN_INSP_CLEAN_SRD_NO$,Pos,0,CleanSRDNo)
CIRec = INSERT(CIRec,CLEAN_INSP_CLEAN_SIG$,Pos,0,CleanSig)
CIRec = INSERT(CIRec,CLEAN_INSP_CLEAN_SIG_DTM$,Pos,0,thisSigDTM)
END
CIParms = FieldStore(CIParms,@RM,4,1,CIRec)
obj_Tables('WriteRec',CIParms)
RETURN
* * * * * * *
GetActions:
* * * * * * *
CINo = Parms[1,@RM]
CIRec = Parms[COL2()+1,@RM]
IF CINo = '' THEN RETURN ;* Called from the dictionary
IF CIRec = '' THEN CIRec = XLATE('CLEAN_INSP',CINo,'','X')
IF CIRec = '' THEN RETURN ;* ErrorMsg = 'Null Parameter "CIRec" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
SCTool = CIRec<CLEAN_INSP_SPEC_CLEAN_TOOL$>
SWAP @VM WITH ', ' IN SCTool
SCAkrionRecipe = CIRec<CLEAN_INSP_SPEC_CLEAN_RECIPE$>
SBrightLight = CIRec<CLEAN_INSP_SPEC_BRIGHTLIGHT$>
SMicroscope = CIRec<CLEAN_INSP_SPEC_MICROSCOPE$>
SEdge = CIRec<CLEAN_INSP_SPEC_EDGE$>
SSurfscanRecipe = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
//
Convert @VM to @SVM in SSurfscanRecipe
//
IF SCTool = 'No' THEN SCTool = ''
Actions = ''
Sigs = ''
SigDTMs = ''
Tools = ''
SpecCleanTools = ''
SpecMicroscopes = ''
SpecBrightlights = ''
SpecEdges = ''
SpecSurfscanRecipes = ''
Line = 0
IF SCTool OR SCAkrionRecipe OR CIRec<CLEAN_INSP_CLEAN_SIG$> NE '' THEN
Line += 1
Actions<1,Line> = 'Clean'
Sigs<1,Line> = CIRec<CLEAN_INSP_CLEAN_SIG$>[-1,'B':@VM]
SigDTMS<1,Line> = CIRec<CLEAN_INSP_CLEAN_SIG_DTM$>[-1,'B':@VM]
Tools<1,Line> = CIRec<CLEAN_INSP_CLEAN_TOOL$>[-1,'B':@VM]
SpecCleanTools<1,Line> = SCTool
END
InspReq = Xlate('CLEAN_INSP', CINo, 'INSP_REQ', 'X')
IF ( ( (SBrightLight OR SMicroscope OR SEdge) AND InspReq) OR (CIRec<CLEAN_INSP_INSP_SIG$> NE '') ) THEN
Line += 1
Actions<1,Line> = 'Inspection'
Sigs<1,Line> = CIRec<CLEAN_INSP_INSP_SIG$>[-1,'B':@VM]
SigDTMS<1,Line> = CIRec<CLEAN_INSP_INSP_SIG_DTM$>[-1,'B':@VM]
LastTool = CIRec<CLEAN_INSP_INSP_TOOL$>[-1,'B':@VM]
IF LastTool = '' THEN LastTool = ''
Tools<1,Line> = LastTool
SpecMicroscopes<1,Line> = SMicroscope
SpecBrightlights<1,Line> = SBrightLight
SpecEdges<1,Line> = SEdge
END
IF SSurfscanRecipe OR CIRec<CLEAN_INSP_SCAN_SIG$> THEN
Line += 1
Actions<1,Line> = 'SurfScan'
Sigs<1,Line> = CIRec<CLEAN_INSP_SCAN_SIG$>[-1,'B':@VM]
SigDTMS<1,Line> = CIRec<CLEAN_INSP_SCAN_SIG_DTM$>[-1,'B':@VM]
Tools<1,Line> = CIRec<CLEAN_INSP_SCAN_TOOL$>[-1,'B':@VM]
SpecSurfscanRecipes<1,Line> = SSurfscanRecipe
END
Result<ACTION$ACTIONS> = Actions
Result<ACTION$SIGS> = Sigs
Result<ACTION$SIG_DTMS> = SigDTMs
Result<ACTION$TOOLS> = Tools
Result<ACTION$SPEC_CLEAN_TOOL> = SpecCleanTools
Result<ACTION$SPEC_MICROSCOPE> = SpecMicroscopes
Result<ACTION$SPEC_BRIGHTLIGHT> = SpecBrightlights
Result<ACTION$SPEC_SURFSCAN_RECIPE> = SpecSurfscanRecipes
Result<ACTION$SPEC_EDGE> = SpecEdges
RETURN
* * * * * * *
SetInsp:
* * * * * * *
RETURN
* * * * * * *
SetScan:
* * * * * * *
RETURN
* * * * * * *
SendToSPC:
* * * * * * *
CINo = Parms[1,@RM]
CIRec = XLATE('CLEAN_INSP',CINo,'','X')
CIParms = 'CLEAN_INSP':@RM:CINo
CIRec = obj_Tables('ReadRec',CIParms)
IF Get_Status(errCode) THEN RETURN
DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X')
RDSNo = CIRec<CLEAN_INSP_RDS_NO$>
Stage = CIRec<CLEAN_INSP_STAGE$> ;* Last part of the four part key
ScanTool = CIRec<CLEAN_INSP_SCAN_TOOL$>
ReactNo = XLATE('CLEAN_INSP',CINo,'REACT_NO','X')
WaferSize = XLATE('CLEAN_INSP',CINo,'WAFER_SIZE','X')
WaferSize = WaferSize[1,' '] ;* Data looks like "125 mm 6 in"
UserName = OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
LOCATE CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
SumOfDefMin = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$,1>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
SumOfDefMin = CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$,1>
END
LOCATE CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
SumOfDefMax = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$,1>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
SumOfDefMax = CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$,1>
END
LOCATE CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
SumOfDefAvg = OCONV(CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$,1>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
SumOfDefAvg = CIRec<CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$,1>
END
LOCATE CLEAN_INSP_SCAN_HAZE_AVG_AVG$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
HazeAvgAvg = OCONV(CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$,1>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
HazeAvgAvg = CIRec<CLEAN_INSP_SCAN_HAZE_AVG_AVG$,1>
END
LOCATE CLEAN_INSP_INSP_SPOTS$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
Spots = OCONV(CIRec<CLEAN_INSP_INSP_SPOTS$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
Spots = CIRec<CLEAN_INSP_INSP_SPOTS$>
END
LOCATE CLEAN_INSP_INSP_FOV$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
FOV = OCONV(CIRec<CLEAN_INSP_INSP_FOV$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
FOV = CIRec<CLEAN_INSP_INSP_FOV$>
END
LOCATE CLEAN_INSP_INSP_SCRATCHES$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
Scratches = OCONV(CIRec<CLEAN_INSP_INSP_SCRATCHES$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
Scratches = CIRec<CLEAN_INSP_INSP_SCRATCHES$>
END
LOCATE CLEAN_INSP_INSP_SCRATCH_LEN$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
ScratchLen = OCONV(CIRec<CLEAN_INSP_INSP_SCRATCH_LEN$>,DictInfo<FIELDS_CONV$,Pos>)
END ELSE
ScratchLen = CIRec<CLEAN_INSP_INSP_SCRATCH_LEN$>
END
SSScratchAvg = '' ;* No data in these fields 5/29/2012 jch - deprecated
SSScratchMax = '' ;* No data in these fields 5/29/2012 jch - deprecated
DataLine = QUOTE(ReactNo):TAB$
DataLine := QUOTE(RDSNo):TAB$
DataLine := QUOTE(Stage):TAB$
DataLine := QUOTE(ScanTool):TAB$
DataLine := QUOTE(SumOfDefMin):TAB$
DataLine := QUOTE(SumOfDefMax):TAB$
DataLine := QUOTE(SumOfDefAvg):TAB$
DataLine := QUOTE(HazeAvgAvg):TAB$
DataLine := QUOTE(Spots):TAB$
DataLine := QUOTE(FOV):TAB$
DataLine := QUOTE(Scratches):TAB$
DataLine := QUOTE(ScratchLen):TAB$
DataLine := QUOTE(UserName):TAB$
DataLine := QUOTE(SSScratchAvg):TAB$
DataLine := QUOTE(SSScratchMax):TAB$
DataLine := QUOTE(WaferSize)
DOSFile = Environment_Services('GetSPCDataPath') : '\SPC_Surf.txt'
RETURN
* * * * *
DosRead:
* * * * *
Set_Status(0)
OSRead DOSRecord FROM DOSFile ELSE
ErrCode = Status()
IF ErrCode = 4 THEN
DOSRecord = '' ;* File doesn't exist
END ELSE
ErrMsg('Unable to read DOS file "SPC_Data.TXT" for update. ':ErrCode:' Please try again.')
RETURN
END
END
DOSRecord := DataLine:CRLF$
OSWrite DOSRecord ON DOSFile
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
CIRec<CLEAN_INSP_SPC_DTM$> = ICONV(CurrDTM,'DT')
CIParms = FieldStore(CIParms,@RM,4,1,CIRec)
obj_Tables('WriteRec',CIParms)
RETURN