2113 lines
64 KiB
Plaintext
2113 lines
64 KiB
Plaintext
COMPILE FUNCTION obj_Prod_Spec(Method,Parms)
|
|
/*
|
|
Methods for Prod_Spec original product specification table
|
|
Used to wrap messy original file in something cleaner while working on a transistion
|
|
|
|
08/08/2004 JCH - Initial Coding
|
|
|
|
06/13/24 djm Add support for EPP signature profile.
|
|
|
|
Properties:
|
|
|
|
Methods:
|
|
|
|
GetLayerProp(PSNo,LayerSet)
|
|
SpecType(PSNo)
|
|
|
|
*/
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, OBJ_POPUP
|
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Make.List, Btree.Extract, ErrMsg, obj_Epi_Part, obj_Cust_Epi_Part, obj_PRS_Stage
|
|
DECLARE SUBROUTINE Send_Dyn, Update_Index
|
|
|
|
$INSERT MSG_EQUATES
|
|
$INSERT POPUP_EQUATES
|
|
$INSERT PROD_SPEC_EQUATES
|
|
$INSERT QUOTE_SPEC_EQU
|
|
$INSERT PRS_LAYER_EQU
|
|
$INSERT PROD_VER_EQUATES
|
|
$INSERT PRS_LAYER_EQUATES
|
|
$INSERT PRS_PROP_EQUATES
|
|
$INSERT PRS_STAGE_EQUATES
|
|
$INSERT RECIPE_EQUATES
|
|
$INSERT RECIPE_LAYER_INFO_EQU ;* Used with LAYER_INFO field rathole data in the RECIPE table
|
|
$INSERT QA_MET_EQUATES ;* Used in GetQAMet return data structure
|
|
$INSERT LOGICAL
|
|
|
|
EQU LS_ID$ TO 1 ;* Use these equates for the PRS_LAYER records until converstion is done and PRS_LAYER_EQU can go away.
|
|
EQU LAYER_TYPE$ TO 2
|
|
EQU RECIPE$ TO 3
|
|
|
|
EQU UNIT$THICK TO CHAR(230):'m' ;* Microns
|
|
EQU UNIT$THICKA TO CHAR(143) ;* Angstroms
|
|
EQU UNIT$RES TO CHAR(234):'-cm' ;* Ohms.Cm
|
|
EQU UNIT$SRES TO CHAR(234):'/':CHAR(220) ;* Ohms/Square
|
|
EQU UNIT$CRES TO CHAR(234):'-cm' ;* Ohms.Cm
|
|
EQU UNIT$CONC TO 'CM-3' ;* Carriers.Cubic Centimeter
|
|
EQU UNIT$STRESS TO 'dyne/cm-2' ;* Dyne/Square Centimeter
|
|
EQU UNIT$BOW TO CHAR(230):'m' ;* Microns
|
|
EQU UNIT$TRANS TO CHAR(230):'m' ;* Microns
|
|
|
|
EQU MET_PROP$CODE TO 1 ;* Used with MET_PROPERTY popup contents
|
|
EQU MET_PROP$PROPERTY TO 2
|
|
EQU MET_PROP$IN_CONV TO 3
|
|
EQU MET_PROP$OUT_CONV TO 4
|
|
EQU MET_PROP$SYMBOL TO 5
|
|
EQU MET_PROP$UNITS TO 6
|
|
|
|
ErrTitle = 'Error in Stored Procedure "obj_Prod_Spec"'
|
|
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 = 'GetSpec' ; GOSUB GetSpec
|
|
CASE Method = 'GetProp' ; GOSUB GetProp
|
|
CASE Method = 'GetLayerProp' ; GOSUB GetLayerProp
|
|
CASE Method = 'SpecType' ; GOSUB SpecType
|
|
CASE Method = 'Quotes' ; GOSUB Quotes
|
|
CASE Method = 'GetSubSupplier' ; GOSUB GetSubSupplier
|
|
CASE Method = 'CheckLastActivity' ; GOSUB CheckLastActivity
|
|
CASE Method = 'GetSigProfile' ; GOSUB GetSigProfile
|
|
CASE Method = 'GetRunSigProfile' ; GOSUB GetRunSigProfile
|
|
CASE Method = 'GetWfrSigProfile' ; GOSUB GetWfrSigProfile
|
|
CASE Method = 'GetCIProfile' ; GOSUB GetCIProfile
|
|
CASE Method = 'AvailMUWafers' ; GOSUB AvailMUWafers
|
|
CASE Method = 'PartNos' ; GOSUB PartNos
|
|
CASE Method = 'PSNId' ; GOSUB PSNId
|
|
CASE Method = 'GetStage' ; GOSUB GetStage
|
|
CASE Method = 'PushSplit' ; GOSUB PushSplit
|
|
CASE Method = 'ProdVerSortKeys' ; GOSUB ProdVerSortKeys
|
|
CASE Method = 'PushTech' ; GOSUB PushTech
|
|
CASE Method = 'StageSortKeys' ; GOSUB StageSortKeys
|
|
CASE Method = 'CEPSortKeys' ; GOSUB CEPSortKeys
|
|
CASE Method = 'Duplicate' ; GOSUB Duplicate
|
|
CASE Method = 'GetQAMet' ; GOSUB GetQAMet
|
|
|
|
CASE 1
|
|
|
|
END CASE
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
RETURN ''
|
|
END
|
|
|
|
RETURN Result
|
|
|
|
|
|
* * * * * * *
|
|
GetSpec:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM] ;*
|
|
LayerNo = Parms[COL2()+1,@RM] ;* Pass Null for all Layers
|
|
PropCode = Parms[COL2()+1,@RM] ;* Pass Property Code or pass as null for Fields in the PRS_LAYER table
|
|
FieldNo = Parms[COL2()+1,@RM] ;* Pass FieldNo as an equate
|
|
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN RETURN
|
|
|
|
LayerKeys = PSRec<PROD_SPEC_PRS_LAYER_KEY$>
|
|
|
|
LayerCnt = COUNT(LayerKeys,@VM) + (LayerKeys NE '')
|
|
|
|
FOR I = 1 TO LayerCnt
|
|
LayerKey = LayerKeys<1,I>
|
|
|
|
IF PropCode NE '' THEN
|
|
PropVal = ICONV(XLATE('PRS_PROP',LayerKey:'*':PropCode,FieldNo,'X'),'[MET_PROP_CONV,':PropCode:']')
|
|
Result<1,I> = OCONV( PropVal,'[MET_PROP_CONV,':PropCode:']')
|
|
END ELSE
|
|
LayerRec = XLATE('PRS_LAYER',LayerKey,'','X')
|
|
Result = LayerRec<FieldNo>
|
|
END
|
|
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetProp:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
DictFieldName = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN RETURN
|
|
|
|
PropCds = obj_Popup('AllCodes','MET_PROPERTY')
|
|
|
|
PropCd = DictFieldName[1,'_']
|
|
IF PropCd = 'CON' THEN PropCd = 'CONC'
|
|
|
|
LOCATE PropCd IN PropCds USING @VM SETTING Pos THEN
|
|
DictFieldName[1,COL2()] = ''
|
|
LayerNo = DictFieldName[-1,'B_']
|
|
DictFieldName[COL1(),COL2()] = ''
|
|
|
|
IF DictFieldName = 'MIN' OR DictFieldName = 'MAX' THEN
|
|
DictfieldName = 'RAW_':DictFieldName
|
|
END
|
|
|
|
IF LayerNo[1,1] _eqc 'A' THEN
|
|
|
|
* All Layers
|
|
|
|
LSKeys = PSRec<PROD_SPEC_PRS_LAYER_KEY$>
|
|
lsCnt = COUNT(LSKeys,@VM) + (LSKeys NE '')
|
|
|
|
FOR I = 1 TO lsCnt
|
|
LSKey = LSKeys<1,I>
|
|
Val = XLATE('PRS_PROP',LSKey:'*':PropCd,DictFieldName,'X')
|
|
Result<1,I> = OCONV(Val,'[MET_PROP_CONV,':PropCd:']')
|
|
NEXT I
|
|
|
|
END ELSE
|
|
|
|
* Single Layer
|
|
|
|
CONVERT 'L' TO '' IN LayerNo
|
|
Val = XLATE('PRS_PROP',PSNo:'*':LayerNo:'*':PropCd,DictFieldName,'X')
|
|
Result = OCONV(Val,'[MET_PROP_CONV,':PropCd:']')
|
|
END
|
|
|
|
|
|
END ;* End of check for Met Property code in the first postion
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetLayerProp:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
LayerSets = Parms[COL2()+1,@RM] ;* @VM Delimited list of LayerSets - Returns all layers if passed null
|
|
NoConversion = Parms[COL2()+1,@RM] ;* Don't do output conversion
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
EpiLayers = PSRec<15>
|
|
|
|
CONVERT CHAR(248) TO @RM IN EpiLayers
|
|
CONVERT @VM TO @FM IN EpiLayers
|
|
CONVERT @SVM TO @VM IN EpiLayers
|
|
CONVERT '~' TO @VM IN EpiLayers
|
|
|
|
SpecAddtls = PSRec<25>
|
|
|
|
CONVERT CHAR(248) TO @RM IN SpecAddtls
|
|
CONVERT @VM TO @FM IN SpecAddtls
|
|
CONVERT @SVM TO @VM IN SpecAddtls
|
|
CONVERT '~' TO @VM IN SpecAddtls
|
|
|
|
CompResult = ''
|
|
|
|
LayerCount = COUNT(EpiLayers,@RM) + (EpiLayers NE '')
|
|
|
|
FOR I = 1 TO LayerCount
|
|
|
|
EpiLayer = FIELD(EpiLayers,@RM,I,1)
|
|
SpecAddtl = FIELD(SpecAddtls,@RM,I,1)
|
|
|
|
BEGIN CASE
|
|
CASE I = 1
|
|
Layer = 'L1'
|
|
|
|
CASE I = 2
|
|
IF LayerCount = 3 THEN
|
|
Layer = 'L2'
|
|
END ELSE
|
|
Layer = '2'
|
|
END
|
|
|
|
CASE I = 3 ; Layer = '2'
|
|
CASE 1 ; Layer = I-1
|
|
END CASE
|
|
|
|
ResultLine = ''
|
|
|
|
Dopant = EpiLayer<10>
|
|
Recipe = EpiLayer<11>
|
|
RecipeName = EpiLayer<12>
|
|
ConcMin = EpiLayer<1,1> ;* This could have @SVM's in it - (old stuff-not used anymore)
|
|
ConcMax = EpiLayer<2,1> ;* This could have @SVM's in it - (old stuff-not used anymore)
|
|
ConcUnits = EpiLayer<3>
|
|
ConcMeasure = EpiLayer<15> ;* This is a measurment data structure
|
|
ResMin = EpiLayer<4>
|
|
ResMax = EpiLayer<5>
|
|
ResUnits = EpiLayer<6>
|
|
ResMeasure = EpiLayer<14> ;* This is a measurment data structure
|
|
ThickMin = EpiLayer<7>
|
|
ThickMax = EpiLayer<8>
|
|
ThickUnits = EpiLayer<9>
|
|
ThickMeasure = Epilayer<13> ;* This is a measurment data structure
|
|
CResMin = Epilayer<16> ;* CRes Added 4/9/2009 JCH
|
|
CResMax = Epilayer<17>
|
|
CresUnits = Epilayer<18>
|
|
CResMeasure = Epilayer<19> ;* This is a measurment data structure
|
|
CResPhaseMin = Epilayer<20>
|
|
StressMin = SpecAddtl<QSAddStressMin$>
|
|
StressMax = SpecAddtl<QSAddStressMax$>
|
|
StressMeasure = SpecAddtl<QSAddStressMeasure$> ;* This is a measurment data structure
|
|
TransSpec = SpecAddtl<QSAddTransSpec$>
|
|
TransMeasure = SpecAddtl<QSAddTransMeasure$> ;* This is a measurment data structure
|
|
|
|
ResultLine<PRS_LAYER_DOPANT$> = Dopant
|
|
ResultLine<PRS_LAYER_RECIPE$> = Recipe
|
|
ResultLine<PRS_LAYER_RECIPE_NAME$> = RecipeName
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_CONC_MIN$> = ConcMin
|
|
ResultLine<PRS_LAYER_CONC_MAX$> = ConcMax
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_CONC_MIN$> = OCONV(ConcMin,'MS21')
|
|
ResultLine<PRS_LAYER_CONC_MAX$> = OCONV(ConcMax,'MS21')
|
|
END
|
|
|
|
ResultLine<PRS_LAYER_CONC_UNITS$> = ConcUnits
|
|
ResultLine<PRS_LAYER_CONC_MEASUREMENT$> = ConcMeasure
|
|
|
|
* CRes Added 4/9/2009 JCH
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_CRES_MIN$> = CResMin
|
|
ResultLine<PRS_LAYER_CRES_MAX$> = CResMax
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_CRES_MIN$> = OCONV(CResMin,'MD3')
|
|
ResultLine<PRS_LAYER_CRES_MAX$> = OCONV(CResMax,'MD3')
|
|
END
|
|
|
|
ResultLine<PRS_LAYER_CRES_UNITS$> = CResUnits
|
|
ResultLine<PRS_LAYER_CRES_MEASUREMENT$> = CResMeasure
|
|
ResultLine<PRS_LAYER_CRES_PHASE_MIN$> = CResPhaseMin
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_RES_MIN$> = ResMin
|
|
ResultLine<PRS_LAYER_RES_MAX$> = ResMax
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_RES_MIN$> = OCONV(ResMin,'MD3')
|
|
ResultLine<PRS_LAYER_RES_MAX$> = OCONV(ResMax,'MD3')
|
|
END
|
|
|
|
ResultLine<PRS_LAYER_RES_UNITS$> = ResUnits
|
|
ResultLine<PRS_LAYER_RES_MEASUREMENT$> = ResMeasure
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_THICK_MIN$> = ThickMin
|
|
ResultLine<PRS_LAYER_THICK_MAX$> = ThickMax
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_THICK_MIN$> = OCONV(ThickMin,'MD3')
|
|
ResultLine<PRS_LAYER_THICK_MAX$> = OCONV(ThickMax,'MD3')
|
|
END
|
|
|
|
ResultLine<PRS_LAYER_THICK_UNITS$> = ThickUnits
|
|
ResultLine<PRS_LAYER_THICK_MEASUREMENT$> = ThickMeasure
|
|
ResultLine<PRS_LAYER_STRESS_MIN$> = StressMin
|
|
ResultLine<PRS_LAYER_STRESS_MAX$> = StressMax
|
|
ResultLine<PRS_LAYER_STRESS_MEASUREMENT$> = StressMeasure
|
|
ResultLine<PRS_LAYER_TRANS_SPEC$> = TransSpec
|
|
ResultLine<PRS_LAYER_TRANS_MEASUREMENT$> = TransMeasure
|
|
|
|
ConcMin = ICONV(ConcMin,'MS')
|
|
ConcMax = ICONV(ConcMax,'MS')
|
|
IF ConcMin NE '' AND ConcMax NE '' THEN
|
|
IF NUM(ConcMin) AND NUM(ConcMax) THEN
|
|
IF ConcMin = ConcMax THEN
|
|
ConcTarget = ConcMin
|
|
END ELSE
|
|
ConcDelta = INT((ConcMax - ConcMin)/2)
|
|
ConcTarget = (ConcMin + ConcDelta)
|
|
END
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_CONC_TARGET$> = ConcTarget
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_CONC_TARGET$> = OCONV(ConcTarget,'MS21')
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
* CRes Added 4/9/2009 JCH
|
|
IF CResMin NE '' AND CResMax NE '' THEN
|
|
IF NUM(CResMin) AND NUM(CResMax) THEN
|
|
IF CResMin = CResMax THEN
|
|
CResTarget = CResMin
|
|
END ELSE
|
|
CResDelta = INT((CResMax - CResMin)/2)
|
|
CResTarget = (CResMin + CResDelta)
|
|
END
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_CRES_TARGET$> = CResTarget
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_CRES_TARGET$> = OCONV(CResTarget,'MD3')
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
IF ResMin NE '' AND ResMax NE '' THEN
|
|
IF NUM(ResMin) AND NUM(ResMax) THEN
|
|
IF ResMin = ResMax THEN
|
|
ResTarget = ResMin
|
|
END ELSE
|
|
ResDelta = INT((ResMax - ResMin)/2)
|
|
ResTarget = (ResMin + ResDelta)
|
|
END
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_RES_TARGET$> = ResTarget
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_RES_TARGET$> = OCONV(ResTarget,'MD3')
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
IF ThickMin NE '' AND ThickMax NE '' THEN
|
|
IF NUM(ThickMin) AND NUM(ThickMax) THEN
|
|
IF ThickMin = ThickMax THEN
|
|
ThickTarget = ThickMin
|
|
END ELSE
|
|
ThickDelta = INT((ThickMax - ThickMin)/2) ;* Same as above
|
|
ThickTarget = (ThickMin + ThickDelta)
|
|
END
|
|
|
|
IF NoConversion THEN
|
|
ResultLine<PRS_LAYER_THICK_TARGET$> = ThickTarget
|
|
END ELSE
|
|
ResultLine<PRS_LAYER_THICK_TARGET$> = OCONV(ThickTarget,'MD2')
|
|
END
|
|
|
|
END
|
|
END
|
|
|
|
|
|
IF LayerSets = '' THEN
|
|
CompResult := Layer:@FM:ResultLine:@RM
|
|
END ELSE
|
|
LOCATE Layer IN LayerSets USING @VM Setting Pos THEN
|
|
CompResult := Layer:@FM:ResultLine:@RM
|
|
END
|
|
END
|
|
|
|
NEXT I
|
|
|
|
IF CompResult[-1,1] = @RM THEN CompResult[-1,1] = ''
|
|
Result = CompResult
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
SpecType:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
|
|
IF NOT(ASSIGNED(PSNo)) THEN RETURN
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
PSStatus = PSRec<PROD_SPEC_STATUS$>
|
|
|
|
IF PSStatus = 'I' THEN
|
|
RETURN ;* Return null - Specification is inactive
|
|
END
|
|
|
|
IF PSRec = '' THEN
|
|
ErrorMsg = 'No PROD_SPEC record found for PSNo ':QUOTE(PSNo):'. (':Method:')'
|
|
RETURN
|
|
END
|
|
|
|
SpecAddtls = PSRec<25>
|
|
|
|
NumSigs = DCount(PSRec<PROD_SPEC_MODE_SIG$>, @VM)
|
|
CurrMode = PSRec<PROD_SPEC_MODE_CODE$, NumSigs>
|
|
|
|
* ProdSig = PSRec<PROD_SPEC_MODE_SIG$,4>
|
|
* QualSig = PSRec<PROD_SPEC_MODE_SIG$,2>
|
|
* PreProdSig = PSRec<PROD_SPEC_MODE_SIG$,3>
|
|
* PreQualSig = PSRec<PROD_SPEC_MODE_SIG$,1>
|
|
|
|
|
|
BEGIN CASE
|
|
|
|
Case CurrMode EQ 'U'
|
|
StatText = 'PreQualification'
|
|
|
|
Case CurrMode EQ 'Q'
|
|
StatText = 'Qualification'
|
|
|
|
Case CurrMode EQ 'E'
|
|
StatText = 'PreProduction'
|
|
|
|
Case CurrMode EQ 'P'
|
|
StatText = 'Production'
|
|
|
|
Case Otherwise$
|
|
StatText = 'Setup'
|
|
|
|
End Case
|
|
|
|
Result = StatText
|
|
|
|
Return
|
|
|
|
* CASE ProdSig NE ''
|
|
* StatText = 'Production'
|
|
*
|
|
* CASE PreProdSig NE ''
|
|
* StatText = 'PreProduction'
|
|
*
|
|
* CASE QualSig NE ''
|
|
* StatText = 'Qualification'
|
|
*
|
|
* CASE PreQualSig NE ''
|
|
* StatText = 'PreQualification'
|
|
|
|
|
|
* * * * * * *
|
|
Quotes:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
|
|
IF NOT(ASSIGNED(PSNo)) THEN RETURN
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
OPEN 'DICT.QUOTE' TO DictVar ELSE
|
|
ErrorMsg = 'Unable to open "DICT.QUOTE" in routine.'
|
|
RETURN
|
|
END
|
|
|
|
SearchString = 'PROC_STEP_PSN':@VM:PSNo:@FM
|
|
|
|
QuoteNos = ''
|
|
Btree.Extract(SearchString,'QUOTE',DictVar,QuoteNos,'',Flag)
|
|
|
|
errCode = ''
|
|
IF Get_Status(errCode) THEN DEBUG
|
|
|
|
FOR I = 1 TO COUNT(QuoteNos,@VM) + (QuoteNos NE '')
|
|
QuoteNo = QuoteNos<0, I>
|
|
LOCATE QuoteNo IN Result BY 'AR' USING @VM SETTING Pos ELSE
|
|
Result = INSERT(Result,1,Pos,0,QuoteNo)
|
|
END
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetSubSupplier:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
SubPartNo = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
IF SubPartNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
SubPartNos = PSRec<PROD_SPEC_SUB_PART_NUMS$>
|
|
SubSuppliers = PSRec<PROD_SPEC_SUB_WAFER_MFG$>
|
|
|
|
LOCATE SubPartNo IN SubPartNos USING @VM SETTING Pos THEN
|
|
Result = SubSuppliers<1,Pos>
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
CheckLastActivity:
|
|
* * * * * * *
|
|
|
|
Days = Parms[1,@RM]
|
|
PSNo = Parms[COL2()+1,@RM]
|
|
|
|
* Checks for activity in the last N days
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
IF Days = '' THEN RETURN
|
|
|
|
|
|
OPEN 'DICT.WO_LOG' TO DictVar ELSE RETURN
|
|
|
|
SearchString = 'PS_NO':@VM:'[':PSNo:']':@FM
|
|
SearchString := 'ENTRY_DATE':@VM:'>=':OConv(DATE()-Days, 'D4/'):@FM
|
|
|
|
Option = ''
|
|
Flag = ''
|
|
|
|
Keys = ''
|
|
Btree.Extract(SearchString, 'WO_LOG', Dictvar, Keys, Option, Flag)
|
|
|
|
IF Keys NE '' THEN Result = 1
|
|
|
|
Return
|
|
|
|
|
|
* * * * * * *
|
|
GetWfrSigProfile:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
GOSUB GetStage
|
|
|
|
StageKeys = Result<2>
|
|
Result = ''
|
|
|
|
SWAP PSNo:'*' WITH '' IN StageKeys
|
|
|
|
Result = StageKeys
|
|
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetRunSigProfile:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
GOSUB GetStage
|
|
|
|
StageKeys = Result<1>
|
|
Result = ''
|
|
|
|
SWAP PSNo:'*' WITH '' IN StageKeys
|
|
|
|
Result = StageKeys
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
GetSigProfile:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
WOMatKey = Parms[COL2()+1,@RM]
|
|
RDSNo = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$>
|
|
|
|
Sigs = ''
|
|
|
|
Begin CASE
|
|
Case ReactorType = 'P' OR ReactorType = 'EPP'
|
|
/*
|
|
* * * * * * * * * * * * * * * * * * * * No signatures on the inbound material * * * * * * * *
|
|
|
|
Sigs<1,-1> = 'MI_VER'
|
|
|
|
* * WM_IN Cleaning and Inspection * *
|
|
|
|
SCSubOxide = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxide$>
|
|
SCAngstroms = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxideAngstroms$>
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_PRE_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_PRE_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_PRE_SURFSCAN_RECIPE$>
|
|
|
|
|
|
IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'MI_PREC'
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'MI_PREI'
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'MI_PRES'
|
|
|
|
* * Reactor Run
|
|
|
|
Sigs<1,-1> = 'RN_LOAD'
|
|
Sigs<1,-1> = 'RN_UNLOAD'
|
|
|
|
* * First/Last Wafer Cleaning and Inspection * *
|
|
|
|
Spec_FWI_LWI = PSRec<PROD_SPEC_POST_FWI_LWI$> ;* FWI OR LWI
|
|
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_FIRST_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_FIRST_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_FIRST_SURFSCAN_RECIPE$>
|
|
|
|
IF SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'RN_WFRC'
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'RN_WFRI'
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'RN_WFRS'
|
|
|
|
*Sigs<1,-1> = 'PVER' ;************ This is conditional from somewhere
|
|
|
|
*/
|
|
* * WM_OUT - Cleaning and Inspection * *
|
|
If RDSNo NE '' then
|
|
|
|
Sigs<1,-1> = 'VER'
|
|
|
|
* * Pre Epi Cleaning and Inspection * *
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*PRE','','X') ;* 1/15/2013 JCH **********
|
|
|
|
IF StageRec<PRS_STAGE_CLEAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PREC'
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PREI'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PRES'
|
|
|
|
Sigs<1,-1> = 'LOAD'
|
|
|
|
* * First Wafer Inspection and Surfscan * *
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*FWI','','X') ;* 1/15/2013 JCH **********
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'FWII'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'FWIS'
|
|
|
|
Sigs<1,-1> = 'UNLOAD'
|
|
|
|
* * Last Wafer Inspection and Surfscan ****************** ;* 1/15/2013 JCH **********
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*LWI','','X') ;* 1/15/2013 JCH **********
|
|
|
|
InspReq = True$
|
|
InspSig = ''
|
|
|
|
// Old records may have more than one RDS
|
|
If RowExists('RDS', RDSNo) then
|
|
LWICINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')<0, 1>
|
|
InspInterval = Xlate('CLEAN_INSP', LWICINo, 'INSP_INTERVAL', 'X')<0, 1>
|
|
If InspInterval NE '' then
|
|
// Use the stored interval
|
|
StageKey = PSNo:'*LWI'
|
|
WONo = Field(WOMatKey, '*', 1)<0, 1>
|
|
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')<0, 1>
|
|
RunNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')<0, 1>
|
|
LastRun = ( (RunNo * 25) EQ WOQty )
|
|
InspReq = ( (Mod((RunNo - 1), InspInterval) EQ 0) or LastRun )
|
|
end else
|
|
// Use the current PRS_STAGE interval
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
end
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'SPEC_INSP_REQ', 'X')
|
|
If InspReq EQ '' then InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
InspSig = Xlate('CLEAN_INSP', LWICINo, 'INSP_SIG', 'X')
|
|
end
|
|
|
|
If ( (StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1) and ( (InspReq EQ True$) or (InspSig NE '') ) ) then
|
|
Sigs<1,-1> = 'LWII'
|
|
end
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'LWIS'
|
|
|
|
* * Post Epi Clean and Inspection ****************** ;* 1/15/2013 JCH **********
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH **********
|
|
|
|
IF StageRec<PRS_STAGE_CLEAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTC'
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTI'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTS'
|
|
|
|
end
|
|
|
|
If WOMatKey NE '' then
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH **********
|
|
|
|
IF StageRec<PRS_STAGE_CLEAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'MO_PSTC'
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'MO_PSTI'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'MO_PSTS'
|
|
|
|
Sigs<1,-1> = 'MO_QA'
|
|
|
|
end
|
|
|
|
Case ReactorType = 'GAN'
|
|
|
|
|
|
Sigs<1,-1> = 'G_FQA' ;* This is the Final QA on the shipping cassette
|
|
|
|
|
|
Case 1
|
|
|
|
Sigs<1,-1> = 'VER'
|
|
|
|
* * Pre Epi Cleaning and Inspection * *
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*PRE','','X') ;* 1/15/2013 JCH **********
|
|
|
|
IF StageRec<PRS_STAGE_CLEAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PREC'
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PREI'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PRES'
|
|
|
|
Sigs<1,-1> = 'LOAD'
|
|
|
|
* * First Wafer Inspection and Surfscan * *
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*FWI','','X') ;* 1/15/2013 JCH **********
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'FWII'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'FWIS'
|
|
|
|
Sigs<1,-1> = 'UNLOAD'
|
|
|
|
* * Last Wafer Inspection and Surfscan ****************** ;* 1/15/2013 JCH **********
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*LWI','','X') ;* 1/15/2013 JCH **********
|
|
|
|
InspReq = True$
|
|
InspSig = ''
|
|
If WOMatKey NE '' then
|
|
// Old records may have more than one RDS
|
|
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')<0, 1>
|
|
If RowExists('RDS', RDSNo) then
|
|
LWICINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')<0, 1>
|
|
InspInterval = Xlate('CLEAN_INSP', LWICINo, 'INSP_INTERVAL', 'X')<0, 1>
|
|
If InspInterval NE '' then
|
|
// Use the stored interval
|
|
StageKey = PSNo:'*LWI'
|
|
WONo = Field(WOMatKey, '*', 1)<0, 1>
|
|
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')<0, 1>
|
|
RunNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')<0, 1>
|
|
LastRun = ( (RunNo * 25) EQ WOQty )
|
|
InspReq = ( (Mod((RunNo - 1), InspInterval) EQ 0) or LastRun )
|
|
end else
|
|
// Use the current PRS_STAGE interval
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
end
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'SPEC_INSP_REQ', 'X')
|
|
If InspReq EQ '' then InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X')
|
|
InspSig = Xlate('CLEAN_INSP', LWICINo, 'INSP_SIG', 'X')
|
|
end
|
|
end
|
|
If ( (StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1) and ( (InspReq EQ True$) or (InspSig NE '') ) ) then
|
|
Sigs<1,-1> = 'LWII'
|
|
end
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'LWIS'
|
|
|
|
* * Post Epi Clean and Inspection ****************** ;* 1/15/2013 JCH **********
|
|
|
|
StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH **********
|
|
|
|
IF StageRec<PRS_STAGE_CLEAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTC'
|
|
IF StageRec<PRS_STAGE_INSP_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTI'
|
|
IF StageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = 1 THEN Sigs<1,-1> = 'PSTS'
|
|
|
|
Sigs<1,-1> = 'QA'
|
|
End CASE
|
|
|
|
|
|
Result = Sigs
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetCIProfile:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$>
|
|
|
|
Stages = ''
|
|
TypeCodes = ''
|
|
|
|
*IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
|
|
|
|
* * WM_IN Cleaning and Inspection * *
|
|
|
|
SCSubOxide = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxide$>
|
|
SCAngstroms = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxideAngstroms$>
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_PRE_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_PRE_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_PRE_SURFSCAN_RECIPE$>
|
|
|
|
TypeCode = ''
|
|
|
|
IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C'
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN TypeCode := 'I'
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'S'
|
|
|
|
IF TypeCode NE '' THEN
|
|
Stages<1,-1> = 'PRE'
|
|
TypeCodes<1,-1> = TypeCode
|
|
END
|
|
|
|
* * First/Last Wafer Cleaning and Inspection * *
|
|
|
|
Spec_FWI_LWI = PSRec<PROD_SPEC_POST_FWI_LWI$> ;* FWI OR LWI
|
|
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_FIRST_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_FIRST_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_FIRST_SURFSCAN_RECIPE$>
|
|
|
|
TypeCode = ''
|
|
|
|
IF SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C'
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN TypeCode := 'I'
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'S'
|
|
|
|
IF TypeCode NE '' THEN
|
|
Stages<1,-1> = Spec_FWI_LWI
|
|
TypeCodes<1,-1> = TypeCode
|
|
END
|
|
|
|
* * WM_OUT - Cleaning and Inspection * *
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_POST_CLEAN_BRIGHTLIGHT$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN_RECIPE$>
|
|
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
TypeCode = ''
|
|
|
|
IF SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C'
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'I'
|
|
IF SBrightLight = 1 THEN TypeCode := 'S'
|
|
|
|
IF TypeCode NE '' THEN
|
|
Stages<1,-1> = 'POST'
|
|
TypeCodes<1,-1> = TypeCode
|
|
END
|
|
|
|
|
|
*END ELSE
|
|
/*
|
|
|
|
* * Pre Epi Cleaning and Inspection * *
|
|
|
|
SCSubOxide = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxide$>
|
|
SCAngstroms = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubOxideAngstroms$>
|
|
SCAngstroms = ''
|
|
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPreAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_PRE_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_PRE_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_PRE_SURFSCAN_RECIPE$>
|
|
|
|
|
|
IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN
|
|
Sigs<1,-1> = 'PREC'
|
|
END
|
|
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN
|
|
Sigs<1,-1> = 'PREI'
|
|
END
|
|
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN
|
|
Sigs<1,-1> = 'PRES'
|
|
END
|
|
|
|
Sigs<1,-1> = 'LOAD'
|
|
|
|
* * First/Last Wafer Cleaning and Inspection * *
|
|
|
|
Spec_FWI_LWI = PSRec<PROD_SPEC_POST_FWI_LWI$> ;* FWI OR LWI
|
|
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_FIRST_BRIGHTLIGHT$>
|
|
SMicroscope = PSRec<PROD_SPEC_FIRST_MICROSCOPE$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_FIRST_SURFSCAN_RECIPE$>
|
|
|
|
|
|
|
|
IF SBrightLight = 1 OR SMicroscope = 1 THEN
|
|
Sigs<1,-1> = 'WFRI'
|
|
END
|
|
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN
|
|
Sigs<1,-1> = 'WFRS'
|
|
END
|
|
|
|
*Sigs<1,-1> = 'PVER' ;************ This is conditional from somewhere
|
|
Sigs<1,-1> = 'UNLOAD'
|
|
|
|
|
|
* * Post Epi Cleaning and Inspection * *
|
|
|
|
|
|
SCTool = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostClean$>
|
|
SCToolRecipe = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubPostAkrionRecipe$>
|
|
|
|
IF SCTool[1,2] _EQC 'NO' THEN SCTool = ''
|
|
IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = ''
|
|
|
|
SBrightLight = PSRec<PROD_SPEC_POST_CLEAN_BRIGHTLIGHT$>
|
|
|
|
SSurfscan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
|
SSurfscanRecipe = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN_RECIPE$>
|
|
|
|
IF SCTool NE '' OR SCToolRecipe NE '' THEN
|
|
Sigs<1,-1> = 'PSTC'
|
|
END
|
|
|
|
IF SBrightLight = 1 THEN
|
|
Sigs<1,-1> = 'PSTI'
|
|
END
|
|
|
|
IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN
|
|
Sigs<1,-1> = 'PSTS'
|
|
END
|
|
|
|
Sigs<1,-1> = 'QA'
|
|
*/
|
|
*END
|
|
|
|
Result = Stages:@FM:TypeCodes
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
AvailMUWafers:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$>
|
|
|
|
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
|
|
|
|
OPEN 'DICT.WM_OUT' TO DictVar ELSE
|
|
ErrMsg('Unable to open DICT.WM_OUT in COMM_WM_OUT.')
|
|
END
|
|
|
|
SearchString = 'MU_PS_NO':@VM:PSNo:@FM
|
|
|
|
Set_Status(0)
|
|
|
|
MUWMOutIDs = ""
|
|
Option = ""
|
|
Flag = ""
|
|
Btree.Extract(SearchString, 'WM_OUT', DictVar, MUWMOutIDs, option, flag)
|
|
|
|
IF Get_Status(errCode) THEN RETURN ;* Called from dictionary
|
|
|
|
Result = SUM(XLATE('WM_OUT',MUWMOutIDs,'WFRS_OUT','X'))
|
|
|
|
END ELSE
|
|
|
|
TableName = 'WO_MAT'
|
|
|
|
OPEN 'DICT.':TableName TO DictVar ELSE
|
|
ErrMsg('Unable to open DICT.':TableName:' in obj_MUWafers.')
|
|
|
|
RETURN
|
|
END
|
|
|
|
SearchString = 'MU_PS_NO':@VM:PSNo:@FM
|
|
SearchString := 'CURR_STATUS':@VM:'RTU':@FM
|
|
|
|
Set_Status(0)
|
|
|
|
OpenRecordIDs = ""
|
|
Option = ""
|
|
Flag = ""
|
|
Btree.Extract(SearchString, TableName, DictVar, OpenRecordIDs, option, flag)
|
|
|
|
IF Get_Status(errCode) THEN RETURN ;* Called from dictionary
|
|
|
|
Result = SUM(XLATE('WO_MAT',OpenRecordIDs,'CURR_WFR_CNT','X'))
|
|
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
PartNos:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
ReactType = OCONV(PSRec<PROD_SPEC_REACTOR_TYPE$>,'[REACT_TYPE_CONV,CODE]')
|
|
SubPartNos = PSRec<97>
|
|
PSNIDs = XLATE('PROD_SPEC',PSNo,'PSN_ID','X')
|
|
|
|
SPNCnt = COUNT(SubPartNos,@VM) + (SubPartNos NE '')
|
|
PSNIdCnt = COUNT(PSNIDs,@VM) + (PSNIDs NE '')
|
|
|
|
Ans = ''
|
|
FOR I = 1 TO SPNCnt
|
|
SubPartNo = TRIM(SubPartNos<1,I>)
|
|
|
|
CONVERT @LOWER_CASE TO @UPPER_CASE IN SubPartNo
|
|
|
|
PartWorkKeys = ''
|
|
FOR N = 1 TO PSNIdCnt
|
|
PartWorkKeys = SubPartNo:'*':ReactType:'*':PSNIDs<1,N>
|
|
NEXT N
|
|
|
|
PartNos = XLATE('PART_WORK',PartWorkKeys,1,'X')
|
|
|
|
CONVERT @VM TO ',' IN PartNos
|
|
|
|
Ans<1,I> = PartNos
|
|
|
|
NEXT I
|
|
|
|
Result = Ans
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
PSNId:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
QuoteStatii = XLATE('PROD_SPEC',PSNo,'QUOTE_STATUS','X')
|
|
QuotePSNIDs = XLATE('PROD_SPEC',PSNo,'QUOTE_PSN_ID','X')
|
|
|
|
QSCnt = COUNT(QuoteStatii,@VM) + (QuoteStatii NE '')
|
|
|
|
PSNIDs = ''
|
|
|
|
FOR N = 1 TO QSCnt
|
|
IF QuoteStatii<1,N> = 'O' THEN
|
|
QuotePSNID = QuotePSNIDs<1,N>
|
|
LOCATE QuotePSNID IN PSNIDs USING @VM SETTING Pos ELSE
|
|
PSNIDs = INSERT(PSNIDs,1,Pos,0,QuotePSNID)
|
|
END
|
|
END
|
|
NEXT N
|
|
|
|
Result = PSNIDs
|
|
|
|
RETURN
|
|
|
|
* * * * * * *
|
|
GetStage:
|
|
* * * * * * *
|
|
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN Return
|
|
|
|
StageKeys = PSRec<PROD_SPEC_PRS_STAGE_KEY$>
|
|
AllStages = obj_Popup('AllCodes','STAGE')
|
|
SortedKeys = ''
|
|
SortedWfrKeys = ''
|
|
|
|
skCnt = COUNT(StageKeys,@VM) + (StageKeys NE '')
|
|
|
|
|
|
FOR I = 1 TO skCnt
|
|
StageKey = StageKeys<1,I>
|
|
Stage = FIELD(StageKey,'*',2)
|
|
WfrFlag = obj_Popup('CodeDesc','STAGE':@RM:Stage:@RM:4)
|
|
|
|
IF WfrFlag = 1 THEN
|
|
LOCATE Stage IN AllStages USING @VM SETTING Pos THEN
|
|
SortedWfrKeys<1,Pos> = StageKey
|
|
END
|
|
END ELSE
|
|
LOCATE Stage IN AllStages USING @VM SETTING Pos THEN
|
|
SortedKeys<1,Pos> = StageKey
|
|
END
|
|
END
|
|
NEXT I
|
|
|
|
|
|
CONVERT @VM TO ' ' IN SortedKeys
|
|
SortedKeys = TRIM(SortedKeys)
|
|
CONVERT ' ' TO @VM IN SortedKeys
|
|
|
|
CONVERT @VM TO ' ' IN SortedWfrKeys
|
|
SortedWfrKeys = TRIM(SortedWfrKeys)
|
|
CONVERT ' ' TO @VM IN SortedWfrKeys
|
|
|
|
|
|
Result = SortedKeys:@FM:SortedWfrKeys
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
PushSplit:
|
|
* * * * * * *
|
|
|
|
* Push data to EPI_PART, CUST_EPI_PART AND PROD_VER Tables until we cut over JCH 5/26/2011
|
|
* Called as a POST WRITE event from event handler in window
|
|
|
|
|
|
RETURN
|
|
|
|
PSNo = Parms[1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
EpiPN = ''
|
|
*EpiPN = PSRec<PROD_SPEC_EPI_PART_NO$>
|
|
|
|
IF EpiPN NE '' THEN
|
|
obj_Epi_Part('SetSubstrate',EpiPN:@RM:PSNo:@RM:PSRec)
|
|
obj_Cust_Epi_Part('Convert',PSNo:@RM:PSRec)
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
PushTech:
|
|
* * * * * * *
|
|
******************************************************************************
|
|
******************************************************************************
|
|
PSNo = Parms[1,@RM]
|
|
|
|
* Added 4/2/2015 JCH
|
|
* Properties and layers deleted from the rathole data are not being removed from the PRS_LAYER and PRS_PROP tables
|
|
* Check keys from last push, remove newly built keys during process, anything left over -> delete from new tables
|
|
|
|
OrgPRSLayerKeys = XLATE('PROD_SPEC',PSNo,PROD_SPEC_PRS_LAYER_KEY$,'X')
|
|
OrgPRSPropKeys = XLATE('PRS_LAYER',OrgPRSLayerKeys,PRS_LAYER_PRS_PROP_KEY$,'X')
|
|
|
|
GOSUB GetLayerProp
|
|
|
|
LayerSpecs = Result
|
|
Result = ''
|
|
|
|
LayerCnt = COUNT(LayerSpecs,@RM) + (LayerSpecs NE '')
|
|
|
|
FOR N = 1 TO LayerCnt
|
|
LayerNo = N
|
|
LayerSpec = FIELD(LayerSpecs,@RM,N)
|
|
LSID = LayerSpec<1>
|
|
LayerSpec = FIELD(LayerSpec,@FM,2,99)
|
|
|
|
Dopant = LayerSpec<PRS_LAYER_DOPANT$>
|
|
|
|
IF LSID = 'L1' THEN
|
|
Recipe = LayerSpec<PRS_LAYER_RECIPE$>
|
|
END
|
|
|
|
|
|
IF NUM(LSID) THEN
|
|
LSType = 'CMB'
|
|
Recipe = ''
|
|
END ELSE
|
|
LSType = 'DEP'
|
|
END
|
|
|
|
PRSLayerKey = PSNo:'*':LayerNo
|
|
PRSLayerRec = LSID:@FM:LSType:@FM:Recipe
|
|
|
|
LOCATE PRSLayerKey IN OrgPRSLayerKeys USING @VM SETTING Pos THEN
|
|
OrgPRSLayerKeys = DELETE(OrgPRSLayerKeys,1,Pos,0)
|
|
END
|
|
|
|
OtParms = 'PRS_LAYER':@RM:PRSLayerKey:@RM:@RM:PRSLayerRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
IF LayerSpec<PRS_LAYER_THICK_MIN$> NE '' OR LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MTOOL$> NE ''THEN
|
|
|
|
IF LayerSpec<PRS_LAYER_THICK_UNITS$> = UNIT$THICK THEN
|
|
Prop = 'THICK'
|
|
END ELSE
|
|
Prop = 'THICKA'
|
|
END
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*':Prop
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
PRSRec = ''
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_THICK_MIN$>,'MD5')
|
|
PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_THICK_MAX$>,'MD5')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = LayerSpec<PRS_LAYER_THICK_UNITS$>
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_THICK_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
END ;* End of Thickness Property
|
|
|
|
IF LayerSpec<PRS_LAYER_RES_MIN$> NE '' OR LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MTOOL$> NE '' THEN
|
|
|
|
Prop = ''
|
|
|
|
IF LayerSpec<PRS_LAYER_RES_UNITS$> = UNIT$RES THEN
|
|
Prop = 'RES'
|
|
END
|
|
|
|
IF LayerSpec<PRS_LAYER_RES_UNITS$> = UNIT$SRES THEN
|
|
Prop = 'SRES'
|
|
END
|
|
|
|
|
|
IF Prop NE '' THEN
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*':Prop
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
PRSRec = ''
|
|
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_RES_MIN$>,'MD5')
|
|
PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_RES_MAX$>,'MD5')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = LayerSpec<PRS_LAYER_RES_UNITS$>
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
END ELSE
|
|
|
|
Send_Dyn("PSN: ":PSNo:" Prop: ":Prop:" Units: ":LayerSpec<PRS_LAYER_RES_UNITS$>)
|
|
|
|
END
|
|
|
|
END ;* End of Resistivity Property
|
|
|
|
IF LayerSpec<PRS_LAYER_CRES_MIN$> NE '' OR LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MTOOL$> NE '' THEN
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*CRES'
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
PRSRec = ''
|
|
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_CRES_MIN$>,'MD5')
|
|
PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_CRES_MAX$>,'MD5')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = LayerSpec<PRS_LAYER_CRES_UNITS$>
|
|
PRSRec<PRS_PROP_PHASE_MIN$> = LayerSpec<PRS_LAYER_CRES_PHASE_MIN$>
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_CRES_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
END ;* End of HgCvResistivity Property
|
|
|
|
IF LayerSpec<PRS_LAYER_CONC_MIN$> NE '' OR LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MTOOL$> NE '' THEN
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*CONC'
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
PRSRec = ''
|
|
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_CONC_MIN$>,'MS21')
|
|
PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_CONC_MAX$>,'MS21')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = LayerSpec<PRS_LAYER_CONC_UNITS$>
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_CONC_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
|
|
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
END ;* End of Concentration Property
|
|
|
|
IF LayerSpec<PRS_LAYER_STRESS_MIN$> NE '' OR LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MTOOL$> NE '' THEN
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*STRESS'
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
SpecAddtl = XLATE('PROD_SPEC',PSNo,PROD_SPEC_SPEC_ADDTL$,'X')
|
|
StressMeasure = SpecAddtl<1,QSAddStressMeasure$>
|
|
|
|
PRSRec = ''
|
|
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_STRESS_MIN$>,'MS21')
|
|
PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_STRESS_MAX$>,'MS21')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = UNIT$STRESS
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_STRESS_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
END ;* End of Stress Property
|
|
|
|
IF LayerSpec<PRS_LAYER_TRANS_SPEC$> NE '' OR LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MTOOL$> NE '' THEN
|
|
|
|
PRSPropKey = PSNo:'*':LayerNo:'*TRANS'
|
|
|
|
LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN
|
|
OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0)
|
|
END
|
|
|
|
PRSRec = ''
|
|
|
|
*PRSRec<PRS_PROP_LS_ID$> = LSID
|
|
PRSRec<PRS_PROP_RAW_MIN$> = ICONV(LayerSpec<PRS_LAYER_TRANS_SPEC$>,'MD0')
|
|
*PRSRec<PRS_PROP_RAW_MAX$> = ICONV(LayerSpec<PRS_LAYER_TRANS_MAX$>,'MD0')
|
|
PRSRec<PRS_PROP_UNITS_ORG$> = UNIT$TRANS
|
|
PRSRec<PRS_PROP_TOOL$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MTOOL$>
|
|
PRSRec<PRS_PROP_MET_WFR_TYPE$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MTYPE$>
|
|
PRSRec<PRS_PROP_RECIPE$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MRECIPE$>
|
|
PRSRec<PRS_PROP_FREQ$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
PRSRec<PRS_PROP_PROVEIN_WFR_TYPE$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MPROVEIN$>
|
|
PRSRec<PRS_PROP_FIRST$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
PRSRec<PRS_PROP_LAST$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
PRSRec<PRS_PROP_SPC$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MSPC$>
|
|
PRSRec<PRS_PROP_OVERGROW$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MOVERGROW$>
|
|
PRSRec<PRS_PROP_EXP_TW_QTY$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MEXP_TW_QTY$>
|
|
PRSRec<PRS_PROP_PATTERN$> = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MPATTERN$>
|
|
PRSRec<PRS_PROP_MET_SLOT$> = 1
|
|
|
|
Freq = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MFREQ$>
|
|
First = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MFIRST$>
|
|
Last = LayerSpec<PRS_LAYER_TRANS_MEASUREMENT$,PRS_PROP_MLAST$>
|
|
|
|
BEGIN CASE
|
|
CASE NUM(Freq) AND Freq NE ''
|
|
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = Freq
|
|
PRSRec<PRS_PROP_MET_START$> = 1
|
|
|
|
CASE First = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'F'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
CASE Last = 1
|
|
PRSRec<PRS_PROP_MET_INTERVAL$> = 'L'
|
|
PRSRec<PRS_PROP_MET_START$> = ''
|
|
|
|
END CASE
|
|
|
|
OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
END ;* End of Resistivity Property
|
|
|
|
* Where is the BOW property coming from????????
|
|
|
|
NEXT N
|
|
|
|
|
|
IF OrgPRSPropKeys NE '' THEN
|
|
|
|
pCnt = COUNT(OrgPRSPropKeys,@VM) + (OrgPRSPropKeys NE '')
|
|
|
|
FOR I = 1 TO pCnt
|
|
OrgPRSPropKey = OrgPRSPropKeys<1,I>
|
|
|
|
IF OrgPRSPropKey NE '' THEN
|
|
otParms = 'PRS_PROP':@RM:OrgPRSPropKey
|
|
obj_Tables('DeleteRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN
|
|
DEBUG
|
|
END
|
|
END
|
|
|
|
NEXT I
|
|
END
|
|
|
|
IF OrgPRSLayerKeys NE '' THEN
|
|
|
|
lCnt = COUNT(OrgPRSLayerKeys,@VM) + (OrgPRSLayerKeys NE '')
|
|
|
|
FOR I = 1 TO lCnt
|
|
OrgPRSLayerKey = OrgPRSLayerKeys<1,I>
|
|
|
|
IF OrgPRSLayerKey NE '' THEN
|
|
otParms = 'PRS_LAYER':@RM:OrgPRSLayerKey
|
|
obj_Tables('DeleteRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN
|
|
DEBUG
|
|
END
|
|
END
|
|
NEXT I
|
|
|
|
END
|
|
|
|
* obj_PRS_Stage('Convert',PSNo) ;* Dead JCH 3/11/2013
|
|
// Flush pending index transactions
|
|
Update_Index("PRS_LAYER", "PRS_PROP_KEY", False$, True$)
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
ProdVerSortKeys:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN RETURN
|
|
|
|
IF PSRec<PROD_SPEC_STATUS$> NE 'A' THEN RETURN
|
|
|
|
|
|
SubSuppBy = PSRec<PROD_SPEC_SPEC_SUBSTRATE$,QSSubWafersSupBy$>
|
|
ReactType = OCONV(PSRec<PROD_SPEC_REACTOR_TYPE$>,'[REACT_TYPE_CONV,CODE]')
|
|
ProdVerNo = XLATE('PRS_PROD_VER',PSNo,1,'X')<1,1>
|
|
|
|
PSNId = XLATE('PROD_VER',ProdVerNo,PROD_VER_PROC_STEP_PSN$,'X')
|
|
|
|
CONVERT @VM TO '.' IN PSNId
|
|
|
|
Result = ''
|
|
|
|
IF SubSuppBy = 'L' THEN
|
|
* Supplied by IR
|
|
SubPartNos = PSRec<PROD_SPEC_SUB_PART_NUMS$>
|
|
|
|
PNCnt = COUNT(SubPartNos,@VM) + (SubPartNos NE '')
|
|
FOR I = 1 TO PNCnt
|
|
Result<1,-1> = TRIM(SubPartNos<1,I>):'*':ReactType:'*':PSNId:'*'
|
|
NEXT I
|
|
|
|
END ELSE
|
|
* Customer Supplied
|
|
CustPartNos = PSRec<PROD_SPEC_CUST_PART_NO$>
|
|
|
|
PNCnt = COUNT(CustPartNos,@VM) + (CustPartNos NE '')
|
|
|
|
FOR I = 1 TO PNCnt
|
|
Result<1,-1> = '*':ReactType:'*':PSNId:'*':TRIM(CustPartNos<1,I>)
|
|
NEXT I
|
|
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
StageSortKeys:
|
|
* * * * * * *
|
|
|
|
IF NOT(Assigned(PSNo)) THEN
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
END
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN RETURN
|
|
|
|
StageKeys = PSRec<PROD_SPEC_PRS_STAGE_KEY$>
|
|
|
|
AllStages = obj_Popup('AllCodes','STAGE')
|
|
|
|
SortedKeys = ''
|
|
|
|
skCnt = COUNT(StageKeys,@VM) + (StageKeys NE '')
|
|
|
|
FOR I = 1 TO skCnt
|
|
StageKey = StageKeys<1,I>
|
|
Stage = FIELD(StageKey,'*',2)
|
|
LOCATE Stage IN AllStages USING @VM SETTING Pos THEN
|
|
SortedKeys<1,Pos> = StageKey
|
|
END
|
|
NEXT I
|
|
|
|
CONVERT @VM TO ' ' IN SortedKeys
|
|
|
|
SortedKeys = TRIM(SortedKeys)
|
|
|
|
CONVERT ' ' TO @VM IN SortedKeys
|
|
|
|
Result = SortedKeys
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
CEPSortKeys:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
|
|
IF PSNo = '' THEN RETURN
|
|
|
|
IF PSRec = '' THEN
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
END
|
|
|
|
IF PSRec = '' THEN RETURN
|
|
|
|
ProdVerKeys = XLATE('PRS_PROD_VER',PSNo,1,'X')
|
|
|
|
CustNos = XLATE('PROD_VER',ProdVerKeys,PROD_VER_CUST_NO$,'X')
|
|
EpiParts = XLATE('PROD_VER',ProdVerKeys,PROD_VER_EPI_PART_NO$,'X')
|
|
|
|
CEPKeys = ''
|
|
|
|
CustCnt = COUNT(CustNos,@VM) + (CustNos NE '')
|
|
|
|
FOR I = 1 TO CustCnt
|
|
CEPKey = CustNos<1,I>:'*':EpiParts<1,I>
|
|
|
|
LOCATE CEPKey IN CEPKeys USING @VM SETTING Pos ELSE
|
|
CEPKeys = INSERT(CEPKeys,1,Pos,0,CEPKey)
|
|
END
|
|
NEXT I
|
|
|
|
Result = CEPKeys
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
Duplicate:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
|
|
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
|
|
|
* * * Build New PROD_SPEC record from original * * *
|
|
|
|
NewRec = ''
|
|
NewRec<PROD_SPEC_ENTRY_ID$> = @USER4
|
|
NewRec<PROD_SPEC_ENTRY_DATE$> = Date()
|
|
NewRec<PROD_SPEC_SPEC_INST$> = PSRec<PROD_SPEC_SPEC_INST$>
|
|
NewRec<PROD_SPEC_PROVEIN_MIN$> = PSRec<PROD_SPEC_PROVEIN_MIN$>
|
|
NewRec<PROD_SPEC_QUAL_REACTS$> = PSRec<PROD_SPEC_QUAL_REACTS$>
|
|
NewRec<PROD_SPEC_PROVE_IN_INST$> = PSRec<PROD_SPEC_PROVE_IN_INST$>
|
|
NewRec<PROD_SPEC_RECIPE_TYPE$> = PSRec<PROD_SPEC_RECIPE_TYPE$>
|
|
NewRec<PROD_SPEC_REACTOR_TYPE$> = PSRec<PROD_SPEC_REACTOR_TYPE$>
|
|
NewRec<PROD_SPEC_WAND_RESTRICTER$> = PSRec<PROD_SPEC_WAND_RESTRICTER$>
|
|
NewRec<PROD_SPEC_RATIOS$> = PSRec<PROD_SPEC_RATIOS$ >
|
|
NewRec<PROD_SPEC_TUBE_PRESSURE_TYPE$> = PSRec<PROD_SPEC_TUBE_PRESSURE_TYPE$>
|
|
NewRec<PROD_SPEC_MINUTES_PER_WAFER$> = PSRec<PROD_SPEC_MINUTES_PER_WAFER$>
|
|
NewRec<PROD_SPEC_LW_RHO_MIN$> = PSRec<PROD_SPEC_LW_RHO_MIN$>
|
|
NewRec<PROD_SPEC_LW_RHO_MAX$> = PSRec<PROD_SPEC_LW_RHO_MAX$>
|
|
NewRec<PROD_SPEC_SUSCEPTOR_TYPE$> = PSRec<PROD_SPEC_SUSCEPTOR_TYPE$>
|
|
NewRec<PROD_SPEC_BLOCKED_REACTS$> = PSRec<PROD_SPEC_BLOCKED_REACTS$>
|
|
NewRec<PROD_SPEC_VERIFY_INSP_REQ$> = PSRec<PROD_SPEC_VERIFY_INSP_REQ$>
|
|
NewRec<PROD_SPEC_PI_PARTICLE_QUAL$> = PSRec<PROD_SPEC_PI_PARTICLE_QUAL$>
|
|
NewRec<PROD_SPEC_THICKFILM_MET$> = PSRec<PROD_SPEC_THICKFILM_MET$>
|
|
NewRec<PROD_SPEC_TEST_POINT_MAP$> = PSRec<PROD_SPEC_TEST_POINT_MAP$>
|
|
NewRec<PROD_SPEC_SMALL_REACTOR_DELTA$> = PSRec<PROD_SPEC_SMALL_REACTOR_DELTA$>
|
|
NewRec<PROD_SPEC_DEP_TIME_RATIO$> = PSRec<PROD_SPEC_DEP_TIME_RATIO$>
|
|
NewRec<PROD_SPEC_MET_TEST$> = PSRec<PROD_SPEC_MET_TEST$>
|
|
NewRec<PROD_SPEC_MET_INTERVAL$> = PSRec<PROD_SPEC_MET_INTERVAL$>
|
|
NewRec<PROD_SPEC_MET_START$> = PSRec<PROD_SPEC_MET_START$>
|
|
NewRec<PROD_SPEC_MET_SLOT$> = PSRec<PROD_SPEC_MET_SLOT$>
|
|
NewRec<PROD_SPEC_MET_RUN_STEP$> = PSRec<PROD_SPEC_MET_RUN_STEP$>
|
|
NewRec<PROD_SPEC_MET_MIN$> = PSRec<PROD_SPEC_MET_MIN$>
|
|
NewRec<PROD_SPEC_MET_MAX$> = PSRec<PROD_SPEC_MET_MAX$>
|
|
NewRec<PROD_SPEC_MODE_CODE$> = PSRec<PROD_SPEC_MODE_CODE$>
|
|
|
|
NewPSNo = '9999'
|
|
|
|
*NewPSNo = NextKey('PROD_SPEC')
|
|
|
|
otParms = 'PROD_SPEC':@RM:NewPSNo:@RM:@RM:NewRec
|
|
obj_Tables('WriteRec',otParms)
|
|
|
|
IF Get_Status(errCode) THEN RETURN ;***** Check for error in the commuter that called this
|
|
|
|
PRSLayerKeys = PSRec<PROD_SPEC_PRS_LAYER_KEY$>
|
|
PRSStageKeys = PSRec<PROD_SPEC_PRS_STAGE_KEY$>
|
|
|
|
NewPRSLayerKeys = PRSLayerKeys
|
|
|
|
SWAP PSNo WITH NewPSNo IN NewPRSLayerKeys
|
|
|
|
lCnt = COUNT(NewPRSLayerKeys,@VM) + (NewPRSLayerKeys NE '')
|
|
|
|
FOR I = 1 TO lCnt
|
|
|
|
PRSLayerKey = PRSLayerKeys<1,I>
|
|
NewPRSLayerKey = NewPRSLayerKeys<1,I>
|
|
|
|
PRSLayerRec = XLATE('PRS_LAYER',PRSLayerKey,'','X')
|
|
|
|
NewLayerRec = ''
|
|
NewLayerRec<PRS_LAYER_LS_ID$> = PRSLayerRec<PRS_LAYER_LS_ID$>
|
|
NewLayerRec<PRS_LAYER_LAYER_TYPE$> = PRSLayerRec<PRS_LAYER_LAYER_TYPE$>
|
|
NewLayerRec<PRS_LAYER_RECIPE_ID$> = PRSLayerRec<PRS_LAYER_RECIPE_ID$>
|
|
|
|
otParms = 'PRS_LAYER':@RM:NewPRSLayerKey:@RM:@RM:NewLayerRec
|
|
|
|
obj_Tables('WriteRec',otParms)
|
|
IF Get_Status(errCode) THEN RETURN
|
|
|
|
PRSPropKeys = PRSLayerRec<PRS_LAYER_PRS_PROP_KEY$>
|
|
|
|
NewPRSPropKeys = PRSPropKeys
|
|
|
|
SWAP PSNo WITH NewPSNo IN NewPRSPropKeys
|
|
|
|
pCnt = COUNT(NewPRSPropKeys,@VM) + (NewPRSPropKeys NE '')
|
|
|
|
FOR N = 1 TO PCnt
|
|
|
|
PRSPropKey = PRSPropKeys<1,N>
|
|
NewPRSPropKEy = NewPRSPropKeys<1,N>
|
|
|
|
PRSPropRec = XLATE('PRS_PROP',PRSPropKey, '','X')
|
|
|
|
NewPropRec = ''
|
|
NewPropRec<PRS_PROP_TOOL$> = PRSPropRec<PRS_PROP_TOOL$>
|
|
NewPropRec<PRS_PROP_MET_WFR_TYPE$> = PRSPropRec<PRS_PROP_MET_WFR_TYPE$>
|
|
NewPropRec<PRS_PROP_RECIPE$> = PRSPropRec<PRS_PROP_RECIPE$>
|
|
NewPropRec<PRS_PROP_FREQ$> = PRSPropRec<PRS_PROP_FREQ$>
|
|
NewPropRec<PRS_PROP_PROVEIN_WFR_TYPE$> = PRSPropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
|
NewPropRec<PRS_PROP_FIRST$> = PRSPropRec<PRS_PROP_FIRST$>
|
|
NewPropRec<PRS_PROP_LAST$> = PRSPropRec<PRS_PROP_LAST$>
|
|
NewPropRec<PRS_PROP_SPC$> = PRSPropRec<PRS_PROP_SPC$>
|
|
NewPropRec<PRS_PROP_OVERGROW$> = PRSPropRec<PRS_PROP_OVERGROW$>
|
|
NewPropRec<PRS_PROP_EXP_TW_QTY$> = PRSPropRec<PRS_PROP_EXP_TW_QTY$>
|
|
NewPropRec<PRS_PROP_PATTERN$> = PRSPropRec<PRS_PROP_PATTERN$>
|
|
|
|
otParms = 'PRS_PROP':@RM:NewPRSPropKey:@RM:@RM:NewPropRec
|
|
|
|
obj_Tables('WriteRec',otParms)
|
|
IF Get_Status(errCode) THEN RETURN
|
|
|
|
NEXT N
|
|
|
|
NEXT I
|
|
|
|
|
|
NewPRSStageKeys = PRSStageKeys
|
|
|
|
SWAP PSNo WITH NewPSNo IN NewPRSStageKeys
|
|
|
|
sCnt = COUNT(NewPRSStageKeys,@VM) + (NewPRSStageKeys NE '')
|
|
|
|
|
|
FOR I = 1 TO sCnt
|
|
PRSStageKey = PRSStageKeys<1,I>
|
|
NewPRSStageKey = NewPRSStageKeys<1,I>
|
|
|
|
PRSStageRec = XLATE('PRS_STAGE',PRSStageKey,'','X')
|
|
|
|
NewStageRec = ''
|
|
|
|
NewStageRec<PRS_STAGE_INST$> = PRSStageRec<PRS_STAGE_INST$>
|
|
NewStageRec<PRS_STAGE_BRIGHTLIGHT$> = PRSStageRec<PRS_STAGE_BRIGHTLIGHT$>
|
|
NewStageRec<PRS_STAGE_MICROSCOPE$> = PRSStageRec<PRS_STAGE_MICROSCOPE$>
|
|
NewStageRec<PRS_STAGE_SURFSCAN_SIG_REQ$> = PRSStageRec<PRS_STAGE_SURFSCAN_SIG_REQ$>
|
|
NewStageRec<PRS_STAGE_SURFSCAN_RECIPE$> = PRSStageRec<PRS_STAGE_SURFSCAN_RECIPE$>
|
|
NewStageRec<PRS_STAGE_CLEAN_TOOL$ > = PRSStageRec<PRS_STAGE_CLEAN_TOOL$ >
|
|
NewStageRec<PRS_STAGE_CLEAN_RECIPE$> = PRSStageRec<PRS_STAGE_CLEAN_RECIPE$>
|
|
NewStageRec<PRS_STAGE_SURF_HAZE$> = PRSStageRec<PRS_STAGE_SURF_HAZE$>
|
|
NewStageRec<PRS_STAGE_SURF_DEFECTS$> = PRSStageRec<PRS_STAGE_SURF_DEFECTS$>
|
|
NewStageRec<PRS_STAGE_PITS$> = PRSStageRec<PRS_STAGE_PITS$>
|
|
NewStageRec<PRS_STAGE_MOUNDS$> = PRSStageRec<PRS_STAGE_MOUNDS$>
|
|
NewStageRec<PRS_STAGE_BL_DEFECTS$> = PRSStageRec<PRS_STAGE_BL_DEFECTS$>
|
|
NewStageRec<PRS_STAGE_SPOTS$> = PRSStageRec<PRS_STAGE_SPOTS$>
|
|
NewStageRec<PRS_STAGE_FOV$> = PRSStageRec<PRS_STAGE_FOV$>
|
|
NewStageRec<PRS_STAGE_SCRATCHES$> = PRSStageRec<PRS_STAGE_SCRATCHES$>
|
|
NewStageRec<PRS_STAGE_SCRATCH_LEN$> = PRSStageRec<PRS_STAGE_SCRATCH_LEN$>
|
|
NewStageRec<PRS_STAGE_LPD$> = PRSStageRec<PRS_STAGE_LPD$>
|
|
NewStageRec<PRS_STAGE_STACK_FAULTS$> = PRSStageRec<PRS_STAGE_STACK_FAULTS$>
|
|
NewStageRec<PRS_STAGE_SPIKES$> = PRSStageRec<PRS_STAGE_SPIKES$>
|
|
NewStageRec<PRS_STAGE_FWI_LWI$> = PRSStageRec<PRS_STAGE_FWI_LWI$>
|
|
NewStageRec<PRS_STAGE_SS_SAMP_QTY$> = PRSStageRec<PRS_STAGE_SS_SAMP_QTY$>
|
|
NewStageRec<PRS_STAGE_CLEAN_SIG_REQ$> = PRSStageRec<PRS_STAGE_CLEAN_SIG_REQ$>
|
|
NewStageRec<PRS_STAGE_INSP_SIG_REQ$> = PRSStageRec<PRS_STAGE_INSP_SIG_REQ$>
|
|
|
|
otParms = 'PRS_STAGE':@RM:NewPRSStageKey:@RM:@RM:NewStageRec
|
|
obj_Tables('WriteRec',otParms)
|
|
IF Get_Status(errCode) THEN RETURN
|
|
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
GetQAMet:
|
|
* * * * * * *
|
|
|
|
PSNo = Parms[1,@RM]
|
|
PSRec = Parms[COL2()+1,@RM]
|
|
ReactSchedFlag = Parms[COL2()+1,@RM]
|
|
|
|
GOSUB StageSortKeys
|
|
|
|
PSStageKeys = Result
|
|
Result = ''
|
|
|
|
pssCnt = COUNT(PSStageKeys,@VM) + (PSStageKeys NE '')
|
|
ResLineCnt = 0
|
|
|
|
FOR N = 1 TO pssCnt
|
|
PSStageKey = PSStageKeys<1,N>
|
|
PSStageRec = XLATE('PRS_STAGE',PSStageKey,'','X')
|
|
|
|
MetCnt = COUNT(PSStageRec<PRS_STAGE_MET_TEST$>,@VM) + (PSStageRec<PRS_STAGE_MET_TEST$> NE '')
|
|
|
|
FOR TestNo = 1 TO MetCnt
|
|
|
|
IF PSStageRec<PRS_STAGE_MET_TEST$,TestNo> NE '' THEN
|
|
|
|
IF ReactSchedFlag = 1 THEN
|
|
|
|
IF PSStageRec<PRS_STAGE_MET_REACT_SCHED$,TestNo> = 1 THEN
|
|
|
|
ResLineCnt += 1
|
|
Result<COL$QA_MET_STAGE,ResLineCnt> = FIELD(PSStageKey,'*',2)
|
|
Result<COL$QA_MET_TEST,ResLineCnt> = PSStageRec<PRS_STAGE_MET_TEST$,TestNo>
|
|
Result<COL$QA_MET_PROP,ResLineCnt> = PSStageRec<PRS_STAGE_MET_PROP$,TestNo>
|
|
Result<COL$QA_MET_TOOL_CLASS,ResLineCnt> = PSStageRec<PRS_STAGE_MET_TOOL_CLASS$,TestNo>
|
|
Result<COL$QA_MET_RECIPE,ResLineCnt> = PSStageRec<PRS_STAGE_MET_RECIPE$,TestNo>
|
|
Result<COL$QA_MET_RECIPE_PATTERN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_RECIPE_PATTERN$,TestNo>
|
|
Result<COL$QA_MET_MIN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_MIN$,TestNo>
|
|
Result<COL$QA_MET_MAX,ResLineCnt> = PSStageRec<PRS_STAGE_MET_MAX$,TestNo>
|
|
Result<COL$QA_MET_SLOT,ResLineCnt> = PSStageRec<PRS_STAGE_MET_SLOT$,TestNo>
|
|
Result<COL$QA_MET_REACT_SCHED,ResLineCnt> = PSStageRec<PRS_STAGE_MET_REACT_SCHED$,TestNo>
|
|
Result<COL$QA_MET_INTERVAL,ResLineCnt> = PSStageRec<PRS_STAGE_MET_INTERVAL$,TestNo>
|
|
Result<COL$QA_MET_START,ResLineCnt> = PSStageRec<PRS_STAGE_MET_START$,TestNo>
|
|
Result<COL$QA_MET_WFR_QTY,ResLineCnt> = PSStageRec<PRS_STAGE_MET_WFR_QTY$,TestNo>
|
|
Result<COL$QA_MET_WFR_TYPE,ResLineCnt> = PSStageRec<PRS_STAGE_MET_WFR_TYPE$,TestNo> ;* Possible Future
|
|
Result<COL$QA_MET_SHIP_DOC,ResLineCnt> = PSStageRec<PRS_STAGE_MET_SHIP_DOC$,TestNo> ;* 12/3/2016 JCH for Mark
|
|
Result<COL$QA_MET_PHASE_MIN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_PHASE_MIN$,TestNo>
|
|
|
|
END
|
|
|
|
END ELSE
|
|
|
|
ResLineCnt += 1
|
|
Result<COL$QA_MET_STAGE,ResLineCnt> = FIELD(PSStageKey,'*',2)
|
|
Result<COL$QA_MET_TEST,ResLineCnt> = PSStageRec<PRS_STAGE_MET_TEST$,TestNo>
|
|
Result<COL$QA_MET_PROP,ResLineCnt> = PSStageRec<PRS_STAGE_MET_PROP$,TestNo>
|
|
Result<COL$QA_MET_TOOL_CLASS,ResLineCnt> = PSStageRec<PRS_STAGE_MET_TOOL_CLASS$,TestNo>
|
|
Result<COL$QA_MET_RECIPE,ResLineCnt> = PSStageRec<PRS_STAGE_MET_RECIPE$,TestNo>
|
|
Result<COL$QA_MET_RECIPE_PATTERN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_RECIPE_PATTERN$,TestNo>
|
|
Result<COL$QA_MET_MIN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_MIN$,TestNo>
|
|
Result<COL$QA_MET_MAX,ResLineCnt> = PSStageRec<PRS_STAGE_MET_MAX$,TestNo>
|
|
Result<COL$QA_MET_SLOT,ResLineCnt> = PSStageRec<PRS_STAGE_MET_SLOT$,TestNo>
|
|
Result<COL$QA_MET_REACT_SCHED,ResLineCnt> = PSStageRec<PRS_STAGE_MET_REACT_SCHED$,TestNo>
|
|
Result<COL$QA_MET_INTERVAL,ResLineCnt> = PSStageRec<PRS_STAGE_MET_INTERVAL$,TestNo>
|
|
Result<COL$QA_MET_START,ResLineCnt> = PSStageRec<PRS_STAGE_MET_START$,TestNo>
|
|
Result<COL$QA_MET_WFR_QTY,ResLineCnt> = PSStageRec<PRS_STAGE_MET_WFR_QTY$,TestNo>
|
|
Result<COL$QA_MET_WFR_TYPE,ResLineCnt> = PSStageRec<PRS_STAGE_MET_WFR_TYPE$,TestNo> ;* Possible future
|
|
Result<COL$QA_MET_SHIP_DOC,ResLineCnt> = PSStageRec<PRS_STAGE_MET_SHIP_DOC$,TestNo> ;* 12/3/2016 JCH for Mark
|
|
Result<COL$QA_MET_PHASE_MIN,ResLineCnt> = PSStageRec<PRS_STAGE_MET_PHASE_MIN$,TestNo>
|
|
|
|
END ;* End of check for ReactSchedFlag
|
|
END
|
|
NEXT TestNo
|
|
NEXT N
|
|
|
|
RETURN
|
|
|
|
|
|
|