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 = PRSStageRec CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection IF Stage = 'PRE' THEN EpiPartNo = XLATE('WO_LOG',WONo,WO_LOG_EPI_PART_NO$,'X') EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X') CIRec = EpiPartRec CIRec = EpiPartRec END CIRec = PRSStageRec CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec CIRec = PRSStageRec ;* Cleans CIRec = PRSStageRec ;* Cleans IF CIRec NE '' THEN CINo = NextKey('CLEAN_INSP') If Error_Services('NoError') then CIRec = WONo CIRec = WOStep CIRec = CassNo CIRec = Stage CIRec = 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 SpecFwiLwi = CIRec CTool = CIRec CRecipe = CIRec IF CTool = 'No' THEN CTool = '' IBrightlight = CIRec IMicroscope = CIRec SurfscanRecipe = CIRec 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 SCTool = CIRec SCAkrionRecipe = CIRec SBrightLight = CIRec SMicroscope = CIRec SSurfscanRecipe = CIRec IF SCTool = 'No' THEN SCTool = '' IF SCSubOxide OR SCTool OR SCAkrionRecipe THEN IF CIRec = '' THEN Result = 'RTC' END END IF SBrightLight OR SMicroscope THEN * Visual Inspection IF CIRec = '' THEN Result = 'RTI' END ELSE SurfaceComp = 1 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' 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,'MD0') SurfDefMax = OCONV(CIRec,'MD0') SurfDefAvg = OCONV(CIRec,'MD3') SpecSurfHaze = OCONV(CIRec,'MD2') SurfHazeAvgAvg = OCONV( CIRec,'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 = '' THEN IF CIRec = '' THEN IF CIRec = '' THEN IF CIRec = '' THEN IF CIRec 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 SCTool = CIRec SCAkrionRecipe = CIRec SBrightLight = CIRec SMicroscope = CIRec SEdge = CIRec SSurfscanRecipe = CIRec IF SCTool = 'No' THEN SCTool = '' * Cleans IF SCSubOxide OR SCTool OR SCAkrionRecipe THEN IF CIRec = '' 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 = '' THEN Result<1,2> = 0 END ELSE Result<1,2> = 1 END END ELSE Result<1,2> = '' END * SurfaceScan IF SSurfscanRecipe THEN IF CIRec = '' 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 WOStep = CIRec CassNo = CIRec Stage = CIRec RDSNo = CIRec CIRec = PRSStageRec CIRec = PRSStageRec CIRec = PRSStageRec CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Visual Inspection CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Surface Scan CIRec = PRSStageRec ;* Cleans CIRec = PRSStageRec ;* 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 = WONo PostStageRec = StepNo PostStageRec = CassNo PostStageRec = Stage PostStageRec = RDSNo SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' IF SCTool NE '' OR SCToolRecipe NE '' THEN PostStageRec = SCTool PostStageRec = SCToolRecipe END PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec IF PostStageRec = 1 THEN PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec END PostStageRec = PSRec PostStageRec = PSRec PostStageRec = PSRec PostStageRec = RDSNo PostStageRec = WMORec PostStageRec = WMORec PostStageRec = WMORec IF WMORec NE '' OR WMORec NE '' OR WMORec NE '' THEN PostStageRec = WMORec PostStageRec = WMORec END PostStageRec = WMORec SurfaceScanRec = XLATE('SURFACE_SCAN',WONO:'*':StepNo:'*':CassNo:'*':'PC','','X') PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec PostStageRec = SurfaceScanRec IF PostStageRec NE '' THEN RETURN END RETURN ***************** Stage = CIRec COxide = CIRec CAngstroms = CIRec CTool = CIRec COxide = CIRec ;********************* fix this !!!!!!!!!!!!!!!!!!!! IF CTool[1,2] = 'No' OR CTool[1,2] = 'If' THEN CTool = '' IBrightlight = CIRec IMicroscope = CIRec Surfscan = CIRec SurfscanRecipe = CIRec IF COxide OR CAngstroms OR CTool OR COxide THEN IF CIRec = '' AND CTool NE '' THEN Result = 'RTC' RETURN END END Stage = CIRec IF (IBrightLight OR IMicroscope) THEN IF CIRec = '' THEN NoSpec = 1 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF CIRec NE '' THEN NoSpec = 0 IF NoSpec THEN Result = 'RTI' RETURN END SurfaceComp = 1 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' THEN SurfaceComp = 0 IF CIRec NE '' AND CIRec = '' 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,'MD0') SurfDefMax = OCONV(CIRec,'MD0') SurfDefAvg = OCONV(CIRec,'MD3') SpecSurfHaze = OCONV(CIRec,'MD2') SurfHazeAvgAvg = OCONV( CIRec,'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 = '' THEN IF CIRec = '' THEN IF CIRec = '' THEN IF CIRec = '' THEN IF CIRec 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 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 BY 'DR' USING @VM SETTING Pos THEN CIRec = CleanTool CIRec = CleanBoatID CIRec = CleanSRDNo CIRec = 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 SWAP @VM WITH ', ' IN SCTool SCAkrionRecipe = CIRec SBrightLight = CIRec SMicroscope = CIRec SEdge = CIRec SSurfscanRecipe = CIRec // 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 NE '' THEN Line += 1 Actions<1,Line> = 'Clean' Sigs<1,Line> = CIRec[-1,'B':@VM] SigDTMS<1,Line> = CIRec[-1,'B':@VM] Tools<1,Line> = CIRec[-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 NE '') ) THEN Line += 1 Actions<1,Line> = 'Inspection' Sigs<1,Line> = CIRec[-1,'B':@VM] SigDTMS<1,Line> = CIRec[-1,'B':@VM] LastTool = CIRec[-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 THEN Line += 1 Actions<1,Line> = 'SurfScan' Sigs<1,Line> = CIRec[-1,'B':@VM] SigDTMS<1,Line> = CIRec[-1,'B':@VM] Tools<1,Line> = CIRec[-1,'B':@VM] SpecSurfscanRecipes<1,Line> = SSurfscanRecipe END Result = Actions Result = Sigs Result = SigDTMs Result = Tools Result = SpecCleanTools Result = SpecMicroscopes Result = SpecBrightlights Result = SpecSurfscanRecipes Result = 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 Stage = CIRec ;* Last part of the four part key ScanTool = CIRec 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 SETTING Pos THEN SumOfDefMin = OCONV(CIRec,DictInfo) END ELSE SumOfDefMin = CIRec END LOCATE CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$ IN DictInfo SETTING Pos THEN SumOfDefMax = OCONV(CIRec,DictInfo) END ELSE SumOfDefMax = CIRec END LOCATE CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$ IN DictInfo SETTING Pos THEN SumOfDefAvg = OCONV(CIRec,DictInfo) END ELSE SumOfDefAvg = CIRec END LOCATE CLEAN_INSP_SCAN_HAZE_AVG_AVG$ IN DictInfo SETTING Pos THEN HazeAvgAvg = OCONV(CIRec,DictInfo) END ELSE HazeAvgAvg = CIRec END LOCATE CLEAN_INSP_INSP_SPOTS$ IN DictInfo SETTING Pos THEN Spots = OCONV(CIRec,DictInfo) END ELSE Spots = CIRec END LOCATE CLEAN_INSP_INSP_FOV$ IN DictInfo SETTING Pos THEN FOV = OCONV(CIRec,DictInfo) END ELSE FOV = CIRec END LOCATE CLEAN_INSP_INSP_SCRATCHES$ IN DictInfo SETTING Pos THEN Scratches = OCONV(CIRec,DictInfo) END ELSE Scratches = CIRec END LOCATE CLEAN_INSP_INSP_SCRATCH_LEN$ IN DictInfo SETTING Pos THEN ScratchLen = OCONV(CIRec,DictInfo) END ELSE ScratchLen = CIRec 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 = ICONV(CurrDTM,'DT') CIParms = FieldStore(CIParms,@RM,4,1,CIRec) obj_Tables('WriteRec',CIParms) RETURN