COMPILE FUNCTION obj_React_Run_CI(Method,Parms) /* Methods for REACT_RUN_CI table 02/21/2008 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 DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In DECLARE SUBROUTINE ErrMsg $INSERT MSG_EQUATES $INSERT DICT_EQUATES $INSERT REACT_RUN_CI_EQUATES $INSERT QUOTE_SPEC_EQU $INSERT PROD_SPEC_EQUATES EQU CRLF$ TO \0D0A\ EQU TAB$ TO CHAR(9) $INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec_CI values ErrTitle = 'Error in Stored Procedure "obj_React_Run_CI"' 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 = 'SendToSPC' ; GOSUB SendToSPC CASE 1 END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * Create: * * * * * * * CIKey = Parms[1,@RM] RunNo = Parms[COL2()+1,@RM] PSRec = Parms[COL2()+1,@RM] IF CIKey = '' THEN ErrorMsg = 'Null Parameter "CIKey" passed to routine. (':Method:')' IF PSRec = '' THEN ErrorMsg = 'Null Parameter "PSRec" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN ReactorType = PSRec ;* Not used in this program 9/2/2014 JCH CompWaferSize = PSRec ;* looks like "5 in 125 mm" RunCIRec = '' RunCIRec = RunNo RunCIRec = CompWaferSize ;* Added 10/29/2008 JCH IF FIELD(CIKey,'*',4) = 'PRE' THEN RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec END IF FIELD(CIKey,'*',4)[1,3] = 'WFR' THEN RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec END IF FIELD(CIKey,'*',4) = 'POST' THEN RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec RunCIRec = PSRec END obj_Tables('WriteRec','REACT_RUN_CI':@RM:CIKey:@RM:@RM:RunCIRec) RETURN * * * * * * * Desc: * * * * * * * CIKey = Parms[1,@RM] CIRec = Parms[COL2()+1,@RM] IF CIKey = '' THEN ErrorMsg = 'Null Parameter "CIKey" passed to routine. (':Method:')' IF CIRec = '' THEN CIRec = XLATE('REACT_RUN_CI',CIKey,'','X') IF CIRec = '' THEN ErrorMsg = 'Null Parameter "CIRec" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN Stage = FIELD(CIKey,'*',4) SpecFwiLwi = CIRec COxide = CIRec CAngstroms = CIRec CTool = CIRec COxide = CIRec IF CTool = 'No' THEN CTool = '' IBrightlight = CIRec IMicroscope = CIRec Surfscan = CIRec SurfscanRecipe = CIRec BEGIN CASE CASE Stage = 'PRE' ; LabelText = 'Pre Epi ' CASE Stage = 'POST' ; LabelText = 'Post Epi ' CASE Stage = 'WFR' AND SpecFwiLwi = 'FWI' ; LabelText = 'First Wafer ' CASE Stage = 'WFR' AND SpecFwiLwi = 'LWI' ; LabelText = 'Last Wafer ' CASE Stage[1,3] = 'WFR' ; LabelText = 'Wafer ':Stage[4,99]:' Extra ' CASE 1 ; LabelText = 'Cleaning && Inspection' END CASE IF COxide OR CAngstroms OR Ctool OR COxide THEN CleanText = 'Cleaning ' ELSE CleanText = '' IF IBrightLight OR IMicroscope THEN InspText = ' Inspection' ELSE InspText = '' IF Surfscan OR 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: * * * * * * * CIKey = Parms[1,@RM] CIRec = Parms[COL2()+1,@RM] IF CIKey = '' THEN ErrorMsg = 'Null Parameter "CIKey" passed to routine. (':Method:')' IF CIRec = '' THEN CIRec = XLATE('REACT_RUN_CI',CIKey,'','X') IF CIRec = '' THEN ErrorMsg = 'Null Parameter "CIRec" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN Stage = FIELD(CIKey,'*',4) 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 IF IBrightLight OR IMicroscope 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 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 Result = 'RTS' RETURN END END END END RETURN * * * * * * * Delete: * * * * * * * RRCIKeys = Parms[1,@RM] IF RRCIKeys = '' THEN RETURN CONVERT @VM:@SVM TO @FM:@FM IN RRCIKeys OPEN 'REACT_RUN_CI' TO CIFile THEN KeyCnt = COUNT(RRCIKeys,@FM) + (RRCIKeys NE '') FOR I = 1 TO KeyCnt DELETE CIFile,RRCIKeys ELSE NULL NEXT I END RETURN * * * * * * * SendToSPC: * * * * * * * DEBUG ReactRunCIKey = Parms[1,@RM] RRCIRec = XLATE('REACT_RUN_CI',ReactRunCIKey,'','X') RRParms = 'REACT_RUN':@RM:ReactRunCIKey RRCIRec = obj_Tables('ReadRec',RRParms) IF Get_Status(errCode) THEN RETURN DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X') RDSNo = RRCIRec Stage = ReactRunCIKey[-1,'B*'] ;* Last part of the four part key ScanTool = RRCIRec ReactNo = XLATE('REACT_RUN_CI',ReactRunCIKey,'REACT_NO','X') WaferSize = RRCIRec WaferSize = WaferSize[1,' '] ;* Data looks like "125 mm 6 in" UserName = OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]') LOCATE REACT_RUN_CI_SS_SUM_OF_DEF_MIN$ IN DictInfo SETTING Pos THEN SumOfDefMin = OCONV(RRCIRec,DictInfo) END ELSE SumOfDefMin = RRCIRec END LOCATE REACT_RUN_CI_SS_SUM_OF_DEF_MAX$ IN DictInfo SETTING Pos THEN SumOfDefMax = OCONV(RRCIRec,DictInfo) END ELSE SumOfDefMax = RRCIRec END LOCATE REACT_RUN_CI_SS_SUM_OF_DEF_AVG$ IN DictInfo SETTING Pos THEN SumOfDefAvg = OCONV(RRCIRec,DictInfo) END ELSE SumOfDefAvg = RRCIRec END LOCATE REACT_RUN_CI_SS_HAZE_AVG_AVG$ IN DictInfo SETTING Pos THEN HazeAvgAvg = OCONV(RRCIRec,DictInfo) END ELSE HazeAvgAvg = RRCIRec END LOCATE REACT_RUN_CI_SPOTS$ IN DictInfo SETTING Pos THEN Spots = OCONV(RRCIRec,DictInfo) END ELSE Spots = RRCIRec END LOCATE REACT_RUN_CI_FOV$ IN DictInfo SETTING Pos THEN FOV = OCONV(RRCIRec,DictInfo) END ELSE FOV = RRCIRec END LOCATE REACT_RUN_CI_SCRATCHES$ IN DictInfo SETTING Pos THEN Scratches = OCONV(RRCIRec,DictInfo) END ELSE Scratches = RRCIRec END LOCATE REACT_RUN_CI_SCRATCH_LEN$ IN DictInfo SETTING Pos THEN ScratchLen = OCONV(RRCIRec,DictInfo) END ELSE ScratchLen = RRCIRec END LOCATE REACT_RUN_CI_SS_SCRATCH_MAX$ IN DictInfo SETTING Pos THEN SSScratchMax = OCONV(RRCIRec,DictInfo) END ELSE SSScratchMax = RRCIRec END LOCATE REACT_RUN_CI_SS_SCRATCH_AVG$ IN DictInfo SETTING Pos THEN SSScratchAvg = OCONV(RRCIRec,DictInfo) END ELSE SSScratchAvg = RRCIRec END 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' * * * * * * * 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') RRCIRec = ICONV(CurrDTM,'DT') RRParms = FieldStore(RRParms,@RM,4,1,RRCIRec) obj_Tables('WriteRec',RRParms) RETURN