862 lines
24 KiB
Plaintext
862 lines
24 KiB
Plaintext
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
|
|
|
|
|
|
|