open-insight/LSL2/STPROC/OBJ_PROD_SPEC.txt
2024-10-24 16:37:24 -07:00

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