COMPILE FUNCTION Comm_Prod_Spec_SI(Instruction, Parm1,Parm2) /* Commuter module for PROD_SPEC_SI (Product Specification SI) window 01/16/2009 - John C. Henry, J.C. Henry & Co., Inc. */ DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, obj_AppWindow DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.Ixvals DECLARE FUNCTION Send_Message, obj_PR_Spec, Msg, Security_Check, Start_Window $INSERT MSG_EQUATES $INSERT APPCOLORS $INSERT LSL_USERS_EQU $INSERT PROD_SPEC_EQU $INSERT QUOTE_SPEC_EQU $INSERT RECIPE_EQU $INSERT RECIPE_LAYER_INFO_EQU ;* Another *($&@^! rathole! $INSERT POPUP_EQUATES EQU CRLF$ TO \0D0A\ EQU COL$LS_ID TO 1 EQU COL$REC_NO TO 2 EQU COL$REC_DESC TO 3 EQU COL$THK_MIN TO 4 EQU COL$THK_MAX TO 5 EQU COL$THK_UNITS TO 6 EQU COL$RES_MIN TO 7 EQU COL$RES_MAX TO 8 EQU COL$RES_UNITS TO 9 EQU COL$CON_MIN TO 10 EQU COL$CON_MAX TO 11 EQU COL$CON_UNITS TO 12 EQU COL$CRES_MIN TO 13 EQU COL$CRES_MAX TO 14 EQU COL$CRES_UNITS TO 15 EQU COL$CRES_PHASE_MIN TO 16 EQU COL$DOPANT TO 2 EQU COL$THK_MEASURE TO 3 EQU COL$RES_MEASURE TO 4 EQU COL$CON_MEASURE TO 5 EQU COL$CRES_MEASURE TO 6 ErrTitle = 'Error in Comm_Prod_Spec_SI' ErrorMsg = '' Result = '' BEGIN CASE CASE Instruction = 'Create' ; GOSUB Create CASE Instruction = 'LSATableDC' ; GOSUB LSATableDC CASE Instruction = 'LSTableDC' ; GOSUB LSTableDC CASE Instruction = 'LSTableDel' ; GOSUB LSTableDel CASE Instruction = 'LSATableDel' ; GOSUB LSATableDel CASE Instruction = 'Save' ; GOSUB Save CASE Instruction = 'LSAPC' ; GOSUB LSAPC CASE Instruction = 'LSPC' ; GOSUB LSPC CASE 1 ErrorMsg = 'Unknown Instruction passed to routine.' ErrMsg(ErrorMsg) END CASE RETURN Result * * * * * * Create: * * * * * * SaveCheckControls = '' obj_AppWindow('Create') Set_Property(@WINDOW:'.LS_TABLE','VISIBLE',1) Set_Property(@WINDOW:'.LSA_TABLE','VISIBLE',1) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$REC_NO) ColStyle = bitor(ColStyle, 262144) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$REC_NO, ColStyle) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$THK_UNITS) ColStyle = bitor(ColStyle, 262144) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$THK_UNITS, ColStyle) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$RES_UNITS) ColStyle = bitor(ColStyle, 262144) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$RES_UNITS, ColStyle) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$CON_UNITS) ColStyle = bitor(ColStyle, 262144) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$CON_UNITS, ColStyle) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$CRES_UNITS) ColStyle = bitor(ColStyle, 262144) ColStyle = Send_Message(@WINDOW:'.LS_TABLE', 'COLSTYLE', COL$CRES_UNITS, ColStyle) Set_Property(@WINDOW:'.LS_TABLE','HEADERHEIGHT',30) HeaderText = Get_Property(@WINDOW:'.LS_TABLE','LABEL') HeaderText = HeaderText:CHAR(13):'' HeaderText = HeaderText:CHAR(13):'' HeaderText = HeaderText:CHAR(13):'' HeaderText = HeaderText:CHAR(13):'' HeaderText = HeaderText:CHAR(13):'' Set_Property(@WINDOW:'.LS_TABLE','LABEL',HeaderText) SubstrateInfo = Parm1[1,CHAR(244)] EpiInfo = Parm1[COL2()+1,CHAR(244)] AddlInfo = Parm1[COL2()+1,CHAR(244)] NDInfo = Parm1[COL2()+1,CHAR(244)] PPInfo = Parm1[COL2()+1,CHAR(244)] CONVERT @SVM TO '' IN EpiInfo LSCnt = COUNT(EpiInfo,Char(248)) + (EpiInfo NE '') LSList = '' LSAList = '' FOR I = 1 TO LSCnt BEGIN CASE CASE I = 1 Layer = 'L1' CASE I = 2 IF LSCnt = 3 THEN Layer = 'L2' END ELSE Layer = '2' END CASE I = 3 ; Layer = '2' CASE 1 ; Layer = I-1 END CASE EpiLayer = FIELD(EpiInfo,CHAR(248),I) LSList = Layer LSList = EpiLayer<1,QSEpiRecipe$> LSList = EpiLayer<1,QSEpiRecipeName$> LSList = OCONV(EpiLayer<1,QSEpiMinThick$>,'MD3') LSList = OCONV(EpiLayer<1,QSEpiMaxThick$>,'MD3') LSList = EpiLayer<1,QSEpiThickUnits$> LSList = OCONV(EpiLayer<1,QSEpiResMinThick$>,'MD3') LSList = OCONV(EpiLayer<1,QSEpiResMaxThick$>,'MD3') LSList = EpiLayer<1,QSEpiResUnits$> LSList = OCONV(EpiLayer<1,QSEpiConcMinThick$>,'MS21') LSList = OCONV(EpiLayer<1,QSEpiConcMaxThick$>,'MS21') LSList = EpiLayer<1,QSEpiConcUnits$> LSList = OCONV(EpiLayer<1,QSEpiCresMin$>,'MD3') LSList = OCONV(EpiLayer<1,QSEpiCresMax$>,'MD3') LSList = EpiLayer<1,QSEpiCresUnits$> LSList = EpiLayer<1,QSEpiCresPhaseMin$> LSAList = Layer LSAList = EpiLayer<1,QSEpiDopant$> LSAList = EpiLayer<1,QSEpiThickMeasure$> LSAList = EpiLayer<1,QSEpiResMeasure$> LSAList = EpiLayer<1,QSEpiConcMeasure$> LSAList = EpiLayer<1,QSEpiCresMeasure$> NEXT I IF LSCnt = 0 THEN LSList = STR(@VM,16) LSAList = STR(@VM,5) END Set_Property(@WINDOW:'.LSA_TABLE','LIST',LSAList) Set_Property(@WINDOW:'.LS_TABLE','LIST',LSList) RETURN * * * * * * * LSTableDC: * * * * * * * RowData = Get_Property(@WINDOW:'.LS_TABLE','ROWDATA') CONVERT @FM TO @VM IN RowData CurrPos = Get_Property(@WINDOW:'.LS_TABLE','SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> MDataCurr = RowData<1,CurrCol> BEGIN CASE CASE CurrCol = COL$REC_NO RecID = '' Option = Msg(@WINDOW,'','RECIPE_OPTIONS') ; * Select, Create New or Cancel BEGIN CASE CASE Option = 1 RecID = Popup(@WINDOW,'','CHOOSE_RECIPE') ;* Select List CASE Option = 2 IF MDataCurr = '' THEN Void = Start_Window( 'RECIPE', @WINDOW, '*Choosing', '', '' ) END ELSE Void = Start_Window( 'RECIPE', @WINDOW, MDataCurr:'*CENTER', '', '' ) END CASE 1 RETURN END CASE IF RecID NE '' THEN oaParms = RecID:@RM:@WINDOW:'.LS_TABLE':@RM:COL$REC_NO:@FM:CurrRow obj_Appwindow('LUValReturn',oaParms) END CASE CurrCol = COL$THK_UNITS TypeOver = '' TypeOver = 'Thickness Units of Measurement' TypeOver = 'THICK':@SVM:'Thickness':@SVM:'Micron':@SVM:'æm':@VM TypeOver = TypeOver:'THICK':@SVM:'Thickness':@SVM:'Angstrom':@SVM:'' Units = Popup(@WINDOW,TypeOver,'METROLOGY_UNITS') IF Units NE '' THEN oaParms = Units:@RM:@WINDOW:'.LS_TABLE':@RM:COL$THK_UNITS:@FM:CurrRow obj_Appwindow('LUValReturn',oaParms) END CASE CurrCol = COL$RES_UNITS TypeOver = '' TypeOver = 'Resistance Units of Measurement' TypeOver = 'RES':@SVM:'Resistivity':@SVM:'Ohms.Cm':@SVM:'ê-cm':@VM TypeOver = TypeOver:'RES':@SVM:'Resistivity':@SVM:'Ohms/Sq':@SVM:'ê/Ü' Units = Popup(@WINDOW,TypeOver,'METROLOGY_UNITS') IF Units NE '' THEN oaParms = Units:@RM:@WINDOW:'.LS_TABLE':@RM:COL$RES_UNITS:@FM:CurrRow obj_Appwindow('LUValReturn',oaParms) END CASE CurrCol = COL$CON_UNITS TypeOver = '' TypeOver = 'Concentration - Units of Measurement' TypeOver = 'CONC':@SVM:'Concentration':@SVM:'Carriers.Cubic Centimeter':@SVM:'cm-3' TypeOver = 1 Units = Popup(@WINDOW,TypeOver,'METROLOGY_UNITS') IF Units NE '' THEN oaParms = Units:@RM:@WINDOW:'.LS_TABLE':@RM:COL$CON_UNITS:@FM:CurrRow obj_Appwindow('LUValReturn',oaParms) END CASE CurrCol = COL$CRES_UNITS TypeOver = '' TypeOver = 'Mercury Probe - Units of Measurement' TypeOver = 'CRES':@SVM:'HgCvResistivity':@SVM:'Ohms.Cm':@SVM:'ê-cm' TypeOver = 1 Units = Popup(@WINDOW,TypeOver,'METROLOGY_UNITS') IF Units NE '' THEN oaParms = Units:@RM:@WINDOW:'.LS_TABLE':@RM:COL$CRES_UNITS:@FM:CurrRow obj_Appwindow('LUValReturn',oaParms) END END CASE RETURN * * * * * * * LSATableDC: * * * * * * * RowData = Get_Property(@WINDOW:'.LSA_TABLE','ROWDATA') CONVERT @FM TO @VM IN RowData CurrPos = Get_Property(@WINDOW:'.LSA_TABLE','SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> MDataCurr = RowData<1,CurrCol> BEGIN CASE CASE CurrCol = COL$THK_MEASURE MType = 'THICK' MDesc = 'Thickness' MDataNew = Dialog_Box( 'PROD_SPEC_SI4', @WINDOW, MDataCurr:CHAR(245):MType:CHAR(245):' ':MDesc:CHAR(245):'CENTER' ) IF MDataNew NE '' AND MDataNew NE MDataCurr THEN Set_Property(@WINDOW:'.LSA_TABLE','CELLPOS',MDataNew,COL$THK_MEASURE:@FM:CurrRow) END CASE CurrCol = COL$RES_MEASURE MType = 'RES' MDesc = 'Resistivity' MDataNew = Dialog_Box( 'PROD_SPEC_SI4', @WINDOW, MDataCurr:CHAR(245):MType:CHAR(245):' ':MDesc:CHAR(245):'CENTER' ) IF MDataNew NE '' AND MDataNew NE MDataCurr THEN Set_Property(@WINDOW:'.LSA_TABLE','CELLPOS',MDataNew,COL$RES_MEASURE:@FM:CurrRow) END CASE CurrCol = COL$CON_MEASURE MType = 'CON' MDesc = 'Concentration' MDataNew = Dialog_Box( 'PROD_SPEC_SI4', @WINDOW, MDataCurr:CHAR(245):MType:CHAR(245):' ':MDesc:CHAR(245):'CENTER' ) IF MDataNew NE '' AND MDataNew NE MDataCurr THEN Set_Property(@WINDOW:'.LSA_TABLE','CELLPOS',MDataNew,COL$CON_MEASURE:@FM:CurrRow) END CASE CurrCol = COL$CRES_MEASURE MType = 'RCON' MDesc = 'Concentration Resistance' MDataNew = Dialog_Box( 'PROD_SPEC_SI4', @WINDOW, MDataCurr:CHAR(245):MType:CHAR(245):' ':MDesc:CHAR(245):'CENTER' ) IF MDataNew NE '' AND MDataNew NE MDataCurr THEN Set_Property(@WINDOW:'.LSA_TABLE','CELLPOS',MDataNew,COL$CRES_MEASURE:@FM:CurrRow) END END CASE RETURN * * * * * * * LSAPC: * * * * * * * CtrlEntID = 'PROD_SPEC_SI.LSA_TABLE' LSAList = Get_Property(CtrlEntID,'LIST') LSAInArray = Get_Property(CtrlEntID,'INVALUE') LSList = Get_Property('PROD_SPEC_SI.LS_TABLE','LIST') PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS") PrevCol = PrevSelPos<1> PrevRow = PrevSelPos<2> CurrPos = Get_Property(CtrlEntId,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> * LostFocus checks LSIds = LSAInArray * This section maintains the Layer Set ID column GoodLines = 0 LineCnt = COUNT(LSAList,@FM) + (LSAList NE '') LOOP TestLine = LSAList[-1,'B':@FM] TestLine = FIELD(TestLine,@VM,2,14) UNTIL TestLine NE STR(@VM,13) LSAList = DELETE(LSAList,LineCnt,0,0) Set_Property(CtrlEntID,'INVALUE','',COL$LS_ID:@FM:LineCnt) LineCnt -= 1 REPEAT LSArray = '' FOR I = 1 TO LineCnt BEGIN CASE CASE I = 1 Layer = 'L1' CASE I = 2 IF LineCnt = 3 THEN Layer = 'L2' END ELSE Layer = '2' END CASE I = 3 ; Layer = '2' CASE 1 ; Layer = I-1 END CASE IF LSAInArray NE Layer THEN Set_Property(CtrlEntID,'INVALUE',Layer,COL$LS_ID:@FM:I) END NEXT I IF LSAList NE '' THEN BEGIN CASE CASE PrevCol = COL$DOPANT SpecDopant = LSAList RecipeID = LSList IF SpecDopant NE '' AND RecipeID NE '' THEN IF PrevRow = 1 THEN RecipeDopant = XLATE( 'RECIPE', RecipeID, RECIPE_EPI_DOPANT$, 'X' ) END ELSE RecLayInfo = XLATE( 'RECIPE', RecipeID, RECIPE_LAYER_INFO$, 'X' ) ;* Retrives rathole data for layers > 1 RecipeDopant = RecLayInfo END IF SpecDopant NE RecipeDopant THEN ErrMsg('Dopant entered ':Quote(SpecDopant):' does not match the dopant on the recipe ':QUOTE(RecipeDopant):'.') Set_Property(CtrlEntID,"SELPOS",PrevSelPos) Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* Clear entered field END END END CASE END * Gotfocus checks IF CurrCol = COL$LS_ID THEN Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow) END RETURN * * * * * * * LSPC: * * * * * * * CtrlEntID = 'PROD_SPEC_SI.LS_TABLE' LSList = Get_Property(CtrlEntID,'LIST') LSInArray = Get_Property(CtrlEntID,'INVALUE') LSAList = Get_Property('PROD_SPEC_SI.LSA_TABLE','LIST') PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS") PrevCol = PrevSelPos<1> PrevRow = PrevSelPos<2> CurrPos = Get_Property(CtrlEntId,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> * LostFocus checks LSIds = LSInArray * This section maintains the Layer Set ID column GoodLines = 0 LineCnt = COUNT(LSList,@FM) + (LSList NE '') LOOP TestLine = LSList[-1,'B':@FM] TestLine = FIELD(TestLine,@VM,2,14) UNTIL TestLine NE STR(@VM,13) LSList = DELETE(LSList,LineCnt,0,0) Set_Property(CtrlEntID,'INVALUE','',COL$LS_ID:@FM:LineCnt) LineCnt -= 1 REPEAT LSArray = '' FOR I = 1 TO LineCnt BEGIN CASE CASE I = 1 Layer = 'L1' CASE I = 2 IF LineCnt = 3 THEN Layer = 'L2' END ELSE Layer = '2' END CASE I = 3 ; Layer = '2' CASE 1 ; Layer = I-1 END CASE IF LSInArray NE Layer THEN Set_Property(CtrlEntID,'INVALUE',Layer,COL$LS_ID:@FM:I) END NEXT I BEGIN CASE CASE PrevCol = COL$REC_NO SpecDopant = LSAList RecipeID = LSList RecipeName = LSList IF SpecDopant NE '' AND RecipeID NE '' THEN IF PrevRow = 1 THEN RecipeDopant = XLATE( 'RECIPE', RecipeID, RECIPE_EPI_DOPANT$, 'X' ) END ELSE RecLayInfo = XLATE( 'RECIPE', RecipeID, RECIPE_LAYER_INFO$, 'X' ) ;* Retrives rathole data for layers > 1 RecipeDopant = RecLayInfo END IF SpecDopant NE RecipeDopant THEN ErrMsg('Dopant entered ':Quote(SpecDopant):' does not match the dopant on the recipe ':QUOTE(RecipeDopant):'.') Set_Property(CtrlEntID,"SELPOS",PrevSelPos) Set_Property(CtrlEntID,'INVALUE','',PrevSelPos) ;* Clear entered field END END IF SpecDopant = '' AND RecipeID NE '' THEN IF PrevRow = 1 THEN RecipeDopant = XLATE( 'RECIPE', RecipeID, RECIPE_EPI_DOPANT$, 'X' ) END ELSE RecLayInfo = XLATE( 'RECIPE', RecipeID, RECIPE_LAYER_INFO$, 'X' ) ;* Retrives rathole data for layers > 1 RecipeDopant = RecLayInfo END Set_Property('PROD_SPEC_SI.LSA_TABLE','INVALUE',RecipeDopant,COL$DOPANT:@FM:PrevRow) ;* Sets null default for Dopant END IF RecipeID NE '' THEN RecipeName = XLATE( 'RECIPE', RecipeId, RECIPE_RECIPE_NAME$, 'X' ) END ELSE RecipeName = '' END Set_Property(CtrlEntID,"SELPOS",COL$REC_DESC:@FM:PrevRow) Set_Property(CtrlEntID,'INVALUE',RecipeName,COL$REC_DESC:@FM:PrevRow) CASE PrevCol = COL$THK_MIN OR PrevCol = COL$THK_MAX ThickMin = LSInArray ThickMax = LSInArray IF ThickMin NE '' AND ThickMax NE '' THEN IF ThickMin > ThickMax THEN ErrMsg('Thickness Minimum is greater than the Thickness Maximum in ':LSInArray:'.') Set_Property(CtrlEntID,'SELPOS',PrevPos) END END CASE PrevCol = COL$RES_MIN OR PrevCOl = COL$RES_MAX ResMin = LSInArray ResMax = LSInArray IF ResMin NE '' AND ResMax NE '' THEN IF ResMin > ResMax THEN ErrMsg('Resistance Minimum is greater than the Resistance Maximum in ':LSInArray:'.') Set_Property(CtrlEntID,'SELPOS',PrevPos) END END CASE PrevCol = COL$CON_MIN OR PrevCol = COL$CON_MAX NULL CASE PrevCol = COL$CRES_MIN OR PrevCol = COL$CRES_MAX CResMin = LSInArray CResMax = LSInArray IF CResMin NE '' AND CResMax NE '' THEN IF CResMin > CResMax THEN ErrMsg('CResistance Minimum is greater than the CResistance Maximum in ':LSInArray:'.') Set_Property(CtrlEntID,'SELPOS',PrevPos) END END END CASE IF CurrCol = COL$LS_ID THEN Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow) END RETURN * * * * * * * LSTableDel: * * * * * * * CtrlEntID = 'PROD_SPEC_SI.LS_TABLE' LSList = Get_Property(CtrlEntID,'LIST') LSInArray = Get_Property(CtrlEntID,'INVALUE') LSAList = Get_Property('PROD_SPEC_SI.LSA_TABLE','LIST') PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS") PrevCol = PrevSelPos<1> PrevRow = PrevSelPos<2> CurrPos = Get_Property(CtrlEntId,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> LSIds = LSInArray * This section maintains the Layer Set ID column GoodLines = 0 LineCnt = COUNT(LSList,@FM) + (LSList NE '') LOOP TestLine = LSList[-1,'B':@FM] TestLine = FIELD(TestLine,@VM,2,14) UNTIL TestLine NE STR(@VM,13) LSList = DELETE(LSList,LineCnt,0,0) Set_Property(CtrlEntID,'INVALUE','',COL$LS_ID:@FM:LineCnt) LineCnt -= 1 REPEAT RETURN * * * * * * * LSATableDel: * * * * * * * CtrlEntID = 'PROD_SPEC_SI.LSA_TABLE' LSList = Get_Property(CtrlEntID,'LIST') LSInArray = Get_Property(CtrlEntID,'INVALUE') LSAList = Get_Property('PROD_SPEC_SI.LSA_TABLE','LIST') PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS") PrevCol = PrevSelPos<1> PrevRow = PrevSelPos<2> CurrPos = Get_Property(CtrlEntId,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> LSIds = LSInArray * This section maintains the Layer Set ID column GoodLines = 0 LineCnt = COUNT(LSList,@FM) + (LSList NE '') LOOP TestLine = LSList[-1,'B':@FM] TestLine = FIELD(TestLine,@VM,2,14) UNTIL TestLine NE STR(@VM,13) LSList = DELETE(LSList,LineCnt,0,0) Set_Property(CtrlEntID,'INVALUE','',COL$LS_ID:@FM:LineCnt) LineCnt -= 1 REPEAT RETURN * * * * * * * Save: * * * * * * * * New completeness check added on 20 JAN 2011 by JCH LSList = Get_Property(@WINDOW:'.LS_TABLE','LIST') LineCnt = COUNT(LSList,@FM) + (LSList NE '') FOR I = 1 TO LineCnt IF LSList NE '' THEN ThickMin = LSList ; ThickMax = LSList ; ThickUnits = LSList IF ThickMin NE '' OR ThickMax NE '' THEN IF ThickMin = '' OR ThickMax = '' OR ThickUnits = '' THEN ErrMsg('Incomplete Thickness Specification on Layer Set ':LSList:'...') RETURN END END ResMin = LSList ; ResMax = LSList ; ResUnits = LSList IF ResMin NE '' OR ResMax NE '' THEN IF ResMin = '' OR ResMax = '' OR ResUnits = '' THEN ErrMsg('Incomplete Resistivity Specification on Layer Set ':LSList:'...') RETURN END END ConMin = LSList ; ConMax = LSList ; ConUnits = LSList IF ConMin NE '' OR ConMax NE '' THEN IF ConMin = '' OR ConMax = '' OR ConUnits = '' THEN ErrMsg('Incomplete Concentration Specification on Layer Set ':LSList:'...') RETURN END END CResMin = LSList ; CResMax = LSList ; CResUnits = LSList IF CResMin NE '' OR CResMax NE '' THEN IF CResMin = '' OR CResMax = '' OR CResUnits = '' THEN ErrMsg('Incomplete CResistivity Specification on Layer Set ':LSList:'...') RETURN END END END ;* End of check for Layer Set ID NEXT I * This needs to end up setting @EpiInfo on the window LSAArray = Get_Property(@WINDOW:'.LSA_TABLE','INVALUE') LSArray = Get_Property(@WINDOW:'.LS_TABLE','INVALUE') Product = Get_Property(@WINDOW:'.SUB_PRODUCTS','TEXT') IF Product NE '' THEN CurProducts = xlate( 'LISTBOX_CONFIG', 'PRODUCTS', '', 'X' ) LOCATE Product IN CurProducts USING @VM SETTING Ppos ELSE MsgInfo = '' ErrMsg('Product ':QUOTE(Product):' is not valid.') RETURN END END ELSE ErrMsg('You must select a product.') RETURN END L1RecipeID = LSArray IF L1RecipeID NE '' THEN RecipePSNs = XLATE( 'RECIPE', L1RecipeID, RECIPE_PROD_SPEC_IDS$, 'X' ) CurPSN = Get_Property( 'PROD_SPEC.PROD_SPEC_ID', 'TEXT' ) LOCATE CurPSN IN RecipePSNs USING @VM SETTING FPos ELSE MsgInfo = '' MText = 'This PSN ':quote(CurPSN):' is not set up in recipe ':quote(L1RecipeID) MText := " with it's own recipe limits. If this PSN is activated and goes through the" MText := ' system without these limits, the system will use the top row limits in the' MText := ' recipe. Please notify an engineer to handle this issue.' MsgInfo = MText MsgInfo = '!' Msg( '', MsgInfo ) END END SubPreClean = Get_Property( @WINDOW:'.SUB_PRE_CLEAN', 'TEXT' ) IF INDEX( SubPreClean,'Akrion', 1 ) THEN PreAkrionRecipe = Get_Property( @WINDOW:'.PRECLEAN_AKRIONRECIPES', 'TEXT' ) IF PreAkrionRecipe = '' THEN MsgInfo = '' ErrMsg('You must select a pre clean akrion recipe...') RETURN END END SubPostClean = Get_Property( @WINDOW:'.SUB_POST_CLEAN', 'TEXT' ) IF INDEX( SubPostClean, 'Akrion', 1 ) THEN PostAkrionRecipe = Get_Property( @WINDOW:'.POSTCLEAN_AKRIONRECIPES', 'TEXT' ) IF PostAkrionRecipe = '' THEN ErrMsg('You must select a post clean akrion recipe...') RETURN END END Result = 1 SaveEpiInfo = '' LSIDs = '' FOR I = 1 TO 9 LSID = LSArray UNTIL LSID = '' SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSArray SaveEpiInfo = LSAArray SaveEpiInfo = LSAArray SaveEpiInfo = LSAArray SaveEpiInfo = LSAArray SaveEpiInfo = LSAArray NEXT I CONVERT @FM TO CHAR(248) IN SaveEpiInfo Set_Property(@WINDOW,'@EpiInfoTest',SaveEpiInfo) Controls = Get_Property( @WINDOW, '@SubControls' ) SubstrateInfo = Get_Property( Controls, 'INVALUE' ) CONVERT @RM TO @VM IN SubstrateInfo SWAP @TM WITH CRLF$ IN SubstrateInfo Controls = Get_Property( @WINDOW, '@AddlControls' ) AddlInfo = Get_Property( Controls, 'INVALUE' ) CONVERT @RM TO @VM IN AddlInfo SWAP @TM WITH CRLF$ IN AddlInfo Controls = Get_Property( @WINDOW, '@NDControls' ) NDInfo = Get_Property( Controls, 'INVALUE' ) CONVERT @RM TO @VM IN NDInfo Controls = Get_Property( @WINDOW, '@PPControls' ) PPInfo = Get_Property( Controls, 'INVALUE' ) CONVERT @RM TO @VM IN PPInfo ReturnData = SubstrateInfo:CHAR(244):SaveEpiInfo:CHAR(244):AddlInfo:CHAR(244):NDInfo:CHAR(244):PPInfo Set_Property(@WINDOW,'@ReturnData', ReturnData) Result = ReturnData RETURN