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

861 lines
24 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<COL$REC_NO> = HeaderText<COL$REC_NO>:CHAR(13):'<dc>'
HeaderText<COL$THK_UNITS> = HeaderText<COL$THK_UNITS>:CHAR(13):'<dc>'
HeaderText<COL$RES_UNITS> = HeaderText<COL$RES_UNITS>:CHAR(13):'<dc>'
HeaderText<COL$CON_UNITS> = HeaderText<COL$CON_UNITS>:CHAR(13):'<dc>'
HeaderText<COL$CRES_UNITS> = HeaderText<COL$CRES_UNITS>:CHAR(13):'<dc>'
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<I,COL$LS_ID> = Layer
LSList<I,COL$REC_NO > = EpiLayer<1,QSEpiRecipe$>
LSList<I,COL$REC_DESC> = EpiLayer<1,QSEpiRecipeName$>
LSList<I,COL$THK_MIN> = OCONV(EpiLayer<1,QSEpiMinThick$>,'MD3')
LSList<I,COL$THK_MAX> = OCONV(EpiLayer<1,QSEpiMaxThick$>,'MD3')
LSList<I,COL$THK_UNITS> = EpiLayer<1,QSEpiThickUnits$>
LSList<I,COL$RES_MIN> = OCONV(EpiLayer<1,QSEpiResMinThick$>,'MD3')
LSList<I,COL$RES_MAX> = OCONV(EpiLayer<1,QSEpiResMaxThick$>,'MD3')
LSList<I,COL$RES_UNITS> = EpiLayer<1,QSEpiResUnits$>
LSList<I,COL$CON_MIN> = OCONV(EpiLayer<1,QSEpiConcMinThick$>,'MS21')
LSList<I,COL$CON_MAX> = OCONV(EpiLayer<1,QSEpiConcMaxThick$>,'MS21')
LSList<I,COL$CON_UNITS> = EpiLayer<1,QSEpiConcUnits$>
LSList<I,COL$CRES_MIN> = OCONV(EpiLayer<1,QSEpiCresMin$>,'MD3')
LSList<I,COL$CRES_MAX> = OCONV(EpiLayer<1,QSEpiCresMax$>,'MD3')
LSList<I,COL$CRES_UNITS> = EpiLayer<1,QSEpiCresUnits$>
LSList<I,COL$CRES_PHASE_MIN> = EpiLayer<1,QSEpiCresPhaseMin$>
LSAList<I,COL$LS_ID> = Layer
LSAList<I,COL$DOPANT> = EpiLayer<1,QSEpiDopant$>
LSAList<I,COL$THK_MEASURE> = EpiLayer<1,QSEpiThickMeasure$>
LSAList<I,COL$RES_MEASURE> = EpiLayer<1,QSEpiResMeasure$>
LSAList<I,COL$CON_MEASURE> = EpiLayer<1,QSEpiConcMeasure$>
LSAList<I,COL$CRES_MEASURE> = 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<PTITLE$> = 'Thickness Units of Measurement'
TypeOver<PDISPLAY$> = 'THICK':@SVM:'Thickness':@SVM:'Micron':@SVM:'æm':@VM
TypeOver<PDISPLAY$> = TypeOver<PDISPLAY$>:'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<PTITLE$> = 'Resistance Units of Measurement'
TypeOver<PDISPLAY$> = 'RES':@SVM:'Resistivity':@SVM:'Ohms.Cm':@SVM:'ê-cm':@VM
TypeOver<PDISPLAY$> = TypeOver<PDISPLAY$>:'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<PTITLE$> = 'Concentration - Units of Measurement'
TypeOver<PDISPLAY$> = 'CONC':@SVM:'Concentration':@SVM:'Carriers.Cubic Centimeter':@SVM:'cm-3'
TypeOver<PINITSELECT$> = 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<PTITLE$> = 'Mercury Probe - Units of Measurement'
TypeOver<PDISPLAY$> = 'CRES':@SVM:'HgCvResistivity':@SVM:'Ohms.Cm':@SVM:'ê-cm'
TypeOver<PINITSELECT$> = 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<COL$LS_ID>
* 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<COL$LS_ID> NE Layer THEN
Set_Property(CtrlEntID,'INVALUE',Layer,COL$LS_ID:@FM:I)
END
NEXT I
IF LSAList<PrevRow,PrevCol> NE '' THEN
BEGIN CASE
CASE PrevCol = COL$DOPANT
SpecDopant = LSAList<PrevRow,PrevCol>
RecipeID = LSList<PrevRow,COL$REC_NO>
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<PrevRow - 1,RecLEpiDopant$>
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<COL$LS_ID>
* 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<COL$LS_ID> 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<PrevRow,COL$DOPANT>
RecipeID = LSList<PrevRow,COL$REC_NO>
RecipeName = LSList<PrevRow,COL$REC_DESC>
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<PrevRow - 1,RecLEpiDopant$>
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<PrevRow - 1,RecLEpiDopant$>
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<COL$THK_MIN,PrevRow>
ThickMax = LSInArray<COL$THK_MAX,PrevRow>
IF ThickMin NE '' AND ThickMax NE '' THEN
IF ThickMin > ThickMax THEN
ErrMsg('Thickness Minimum is greater than the Thickness Maximum in ':LSInArray<COL$LS_ID,PrevRow>:'.')
Set_Property(CtrlEntID,'SELPOS',PrevPos)
END
END
CASE PrevCol = COL$RES_MIN OR PrevCOl = COL$RES_MAX
ResMin = LSInArray<COL$RES_MIN,PrevRow>
ResMax = LSInArray<COL$RES_MAX,PrevRow>
IF ResMin NE '' AND ResMax NE '' THEN
IF ResMin > ResMax THEN
ErrMsg('Resistance Minimum is greater than the Resistance Maximum in ':LSInArray<COL$LS_ID,PrevRow>:'.')
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<COL$CRES_MIN>
CResMax = LSInArray<COL$CRES_MAX>
IF CResMin NE '' AND CResMax NE '' THEN
IF CResMin > CResMax THEN
ErrMsg('CResistance Minimum is greater than the CResistance Maximum in ':LSInArray<COL$LS_ID,PrevRow>:'.')
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<COL$LS_ID>
* 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<COL$LS_ID>
* 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<I,COL$LS_ID> NE '' THEN
ThickMin = LSList<I,COL$THK_MIN> ; ThickMax = LSList<I,COL$THK_MAX> ; ThickUnits = LSList<I,COL$THK_UNITS>
IF ThickMin NE '' OR ThickMax NE '' THEN
IF ThickMin = '' OR ThickMax = '' OR ThickUnits = '' THEN
ErrMsg('Incomplete Thickness Specification on Layer Set ':LSList<I,COL$LS_ID>:'...')
RETURN
END
END
ResMin = LSList<I,COL$RES_MIN> ; ResMax = LSList<I,COL$RES_MAX> ; ResUnits = LSList<I,COL$RES_UNITS>
IF ResMin NE '' OR ResMax NE '' THEN
IF ResMin = '' OR ResMax = '' OR ResUnits = '' THEN
ErrMsg('Incomplete Resistivity Specification on Layer Set ':LSList<I,COL$LS_ID>:'...')
RETURN
END
END
ConMin = LSList<I,COL$CON_MIN> ; ConMax = LSList<I,COL$CON_MAX> ; ConUnits = LSList<I,COL$CON_UNITS>
IF ConMin NE '' OR ConMax NE '' THEN
IF ConMin = '' OR ConMax = '' OR ConUnits = '' THEN
ErrMsg('Incomplete Concentration Specification on Layer Set ':LSList<I,COL$LS_ID>:'...')
RETURN
END
END
CResMin = LSList<I,COL$CRES_MIN> ; CResMax = LSList<I,COL$CRES_MAX> ; CResUnits = LSList<I,COL$CRES_UNITS>
IF CResMin NE '' OR CResMax NE '' THEN
IF CResMin = '' OR CResMax = '' OR CResUnits = '' THEN
ErrMsg('Incomplete CResistivity Specification on Layer Set ':LSList<I,COL$LS_ID>:'...')
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<COL$REC_NO,1>
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$> = MText
MsgInfo<micon$> = '!'
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<COL$LS_ID,I>
UNTIL LSID = ''
SaveEpiInfo<I,QSEpiRecipe$> = LSArray<COL$REC_NO,I>
SaveEpiInfo<I,QSEpiRecipeName$> = LSArray<COL$REC_DESC,I>
SaveEpiInfo<I,QSEpiConcMinThick$> = LSArray<COL$CON_MIN,I>
SaveEpiInfo<I,QSEpiConcMaxThick$> = LSArray<COL$CON_MAX,I>
SaveEpiInfo<I,QSEpiConcUnits$> = LSArray<COL$CON_UNITS,I>
SaveEpiInfo<I,QSEpiResMinThick$> = LSArray<COL$RES_MIN,I>
SaveEpiInfo<I,QSEpiResMaxThick$> = LSArray<COL$RES_MAX,I>
SaveEpiInfo<I,QSEpiResUnits$> = LSArray<COL$RES_UNITS,I>
SaveEpiInfo<I,QSEpiMinThick$> = LSArray<COL$THK_MIN,I>
SaveEpiInfo<I,QSEpiMaxThick$> = LSArray<COL$THK_MAX,I>
SaveEpiInfo<I,QSEpiThickUnits$> = LSArray<COL$THK_UNITS,I>
SaveEpiInfo<I,QSEpiCresMin$> = LSArray<COL$CRES_MIN,I>
SaveEpiInfo<I,QSEpiCresMax$> = LSArray<COL$CRES_MAX,I>
SaveEpiInfo<I,QSEpiCresUnits$> = LSArray<COL$CRES_UNITS,I>
SaveEpiInfo<I,QSEpiCresPhaseMin$> = LSArray<COL$CRES_PHASE_MIN,I>
SaveEpiInfo<I,QSEpiDopant$> = LSAArray<COL$DOPANT,I>
SaveEpiInfo<I,QSEpiThickMeasure$> = LSAArray<COL$THK_MEASURE,I>
SaveEpiInfo<I,QSEpiResMeasure$> = LSAArray<COL$RES_MEASURE,I>
SaveEpiInfo<I,QSEpiConcMeasure$> = LSAArray<COL$CON_MEASURE,I>
SaveEpiInfo<I,QSEpiCresMeasure$> = LSAArray<COL$CRES_MEASURE,I>
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