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

269 lines
6.5 KiB
Plaintext

FUNCTION Calc_WO_Stats(RDSNos)
#pragma precomp SRP_PreCompiler
$INSERT RDS_EQU
$INSERT RDS_LAYER_EQUATES
$INSERT RDS_TEST_EQUATES
* Must pass keys in the same work order and they must be delimited by @VM
IF RDSNos = '' THEN RETURN
RdsCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
WOStats = ''
* Get Readings from RDS_TEST records for each RDS
MetThickAvgs = ''
MetResRHOAvgs = ''
ThickAvgLow = ''
ThickAvgHigh = ''
ThickAvgCount = 0
ThickAvgSum = ''
ResRHOAvgLow = ''
ResRHOAvgHigh = ''
ResRHOAvgCount = 0
ResRHOAvgSum = ''
FOR I = 1 to RdsCnt
RDSNo = RDSNos<1,I>
FirstLayerKey = RDSNo:'*L1'
TestKeys = XLATE('RDS_LAYER',FirstLayerKey,RDS_LAYER_RDS_TEST_KEYS$,'X')
TestKey = TestKeys<1,1> ;* There may be multiple keys for each Epi Pro reactor zone - Take just the first for now
MetrologyRec = XLATE('RDS_TEST',TestKey,'','X')
IF I = 1 THEN
SpecThickMin = MetrologyRec<RDS_TEST_SPEC_THICK_MIN$>
SpecThickMax = MetrologyRec<RDS_TEST_SPEC_THICK_MAX$>
SpecThickTarget = MetrologyRec<RDS_TEST_SPEC_THICK_TARGET$>
SpecResUnits = MetrologyRec<RDS_TEST_SPEC_RES_UNITS$>
SpecResMin = MetrologyRec<RDS_TEST_SPEC_RES_MIN$>
SpecResMax = MetrologyRec<RDS_TEST_SPEC_RES_MAX$>
SpecResTarget = MetrologyRec<RDS_TEST_SPEC_RES_TARGET$>
END
MetThickAvg = MetrologyRec<RDS_TEST_THICK_AVG$>
IF MetThickAvg <> "" THEN
MetThickAvgs<I> = MetThickAvg
ThickAvgCount += 1
ThickAvgSum += MetThickAvg
IF ThickAvgLow = '' THEN ThickAvgLow = MetThickAvg
IF ThickAvgHigh = '' THEN ThickAvgHigh = MetThickAvg
IF MetThickAvg < ThickAvgLow THEN ThickAvgLow = MetThickAvg
IF MetThickAvg > ThickAvgHigh THEN ThickAvgHigh = MetThickAvg
END
IF SpecResUnits = 'ê/Ü' THEN
SpecResLabel = 'Sheet Rho'
MetResRHOAvg = MetrologyRec<RDS_TEST_SHEETRHO_AVG$>
END ELSE
SpecResLabel = 'Resistivity'
MetResRHOAvg = MetrologyRec<RDS_TEST_RES_AVG$>
END
MetResRHOAvgs<I> = MetResRhoAvg
IF MetResRHOAvg <> "" THEN
ResRHOAvgCount += 1
ResRHOAvgSum += MetResRHOAvg
IF ResRHOAvgLow = '' THEN ResRHOAvgLow = MetResRHOAvg
IF ResRHOAvgHigh = '' THEN ResRHOAvgHigh = MetResRHOAvg
IF MetResRHOAvg < ResRHOAvgLow THEN ResRHOAvgLow = MetResRHOAvg
IF MetResRHOAvg > ResRHOAvgHigh THEN ResRHOAvgHigh = MetResRHOAvg
END
NEXT I
//DPC - 3/11/2020 - hack to account for formatting/conversion issue in Thick Vals from RDS_Test
IF ThickAvgCount > 0 THEN
StatThickAvg = (ThickAvgSum/ThickAvgCount)*10
WOStats<1,1> = OCONV( StatThickAvg, 'MD3' )
END ELSE
StatThickAvg = 0
END
* * * Standard Deviation * * * *
SumDiffSq = 0
ThickMean = ''
ThickStDev = 0
IF ThickAvgSum and ThickAvgCount THEN
ThickMean = ThickAvgSum/ThickAvgCount
END ELSE
ThickMean = 0
END
FOR I = 1 TO RdsCnt
MetThickAvg = MetThickAvgs<I>
IF MetThickAvg <> "" THEN
SumDiffSq += ( MetThickAvg - ThickMean ) * ( MetThickAvg - ThickMean )
END
NEXT I
IF SumDiffSq AND ThickAvgCount THEN
ThickStDev = (SQRT( SumDiffSq/(ThickAvgCount-1) )) * 10
WOStats<1,3> = OCONV( ThickStDev, 'MD3' )
END
* Minimum and Maximum
IF ThickAvgHigh <> 0 THEN WOStats<1,5> = OCONV( ThickAvgHigh, 'MD2' ) ELSE WOStats<1,5> = ''
IF ThickAvgLow <> 0 THEN WOStats<1,7> = OCONV( ThickAvgLow, 'MD2') ELSE WOStats<1,7> = ''
* Uniformity
IF ThickAvgHigh and ThickAvgLow THEN
WOStats<1,9> = OCONV(((ThickAvgHigh - ThickAvgLow)/(ThickAvgHigh + ThickAvgLow))*10000, 'MD2' )
END
ThickCp = 0
TThickCPK = 0
* Thickness Cp
IF SpecThickMin and SpecThickMax and ThickStdev THEN
ThickCp = ((SpecThickMax-SpecThickMin)/(6*ThickStdev))*1000
WOStats<1,11> = OCONV( ThickCp, 'MD3' )
END
* Thickness CpK
IF ThickCp AND (ABS(SpecThickTarget-StatThickAvg)) AND (SpecThickMax-SpecThickMin) THEN
TThickCPK = ThickCp*(1-((ABS(SpecThickTarget-StatThickAvg))/((SpecThickMax-SpecThickMin)/2)))
WOStats<1,13> = OCONV( TThickCPK, 'MD3' )
END
* Sigma Capabilities
WOStats<1,15> = OCONV( ThickCP*3, 'MD3' ) ;* WOStats<1,11>*3
* Sigma Level
WOStats<1,17> = OCONV( TThickCPK*3, 'MD3' ) ;* WOStats<1,13>*3
* * * * * * *
* Resistivity Calculations
* * * * * * *
* * * Average * * *
IF ResRHOAvgCount THEN
StatResRHOAvg = ResRHOAvgSum/ResRHOAvgCount
IF SpecResUnits = 'ê/Ü' THEN
WOStats<1,2> = OCONV( StatResRHOAvg, 'MD3' )
END ELSE
WOStats<1,2> = OCONV( StatResRHOAvg, 'MD4' )
END
END ELSE
StatResRHOAvg = 0
END
* * * StDev * * *
SumDiffSq = 0
ResRHOStDev = 0
IF ResRHOAvgSum AND ResRHOAvgCount THEN
ResMean = ResRHOAvgSum/ResRHOAvgCount
END ELSE
ResMean = 0
END
FOR I = 1 to RdsCnt
MetResRHOAvg = MetResRHOAvgs<I>
IF MetResRHOAvg <> "" AND MetResRHOAvg <> 0 THEN
*SumDiffSq += ( MetResRHOAvg - ResMean )**2
SumDiffSq += ( MetResRHOAvg - ResMean ) * ( MetResRHOAvg - ResMean )
END
NEXT I
IF SumDiffSq AND ResRHOAvgCount THEN
ResRHOStDev = SQRT( SumDiffSq/(ResRHOAvgCount-1) )
WOStats<1,4> = OCONV( ResRHOStDev, 'MD3' )
END
* * * Minimum and Maximum * * *
IF ResRHOAvgHigh <> 0 THEN
IF SpecResUnits = 'ê/Ü' THEN
WOStats<1,6> = OCONV( ResRHOAvgHigh, 'MD3' )
END ELSE
WOStats<1,6> = OCONV( ResRHOAvgHigh, 'MD4' )
END
END ELSE
WOStats<1,6> = ''
END
IF ResRHOAvgLow <> 0 THEN
IF SpecResUnits = 'ê/Ü' THEN
WOStats<1,8> = OCONV( ResRHOAvgLow, 'MD3' )
END ELSE
WOStats<1,8> = OCONV( ResRHOAvgLow, 'MD4' )
END
END ELSE
WOStats<1,8> = ''
END
* * * uniformity * * *
IF ( ResRHOAvgHigh - ResRHOAvgLow ) and ( ResRHOAvgHigh + ResRHOAvgLow ) THEN
WOStats<1,10>= OCONV(((ResRHOAvgHigh - ResRHOAvgLow)/(ResRHOAvgHigh + ResRHOAvgLow))*10000, 'MD2' )
END
ResRHOCp = 0
TResCPK = 0
* * * Cp * * *
IF SpecResMin and SpecResMax and ResRHOStdev THEN
ResRHOCp = ((SpecResMax-SpecResMin)/(6*ResRHOStdev))*1000
WOStats<1,12> = OCONV( ResRHOCp, 'MD3' )
END
* * * CpK * * *
IF (ABS(SpecResTarget-StatResRHOAvg)) AND ( SpecResMax-SpecResMin ) THEN
TResCPK = ( ResRHOCp*(1-((ABS(SpecResTarget-StatResRHOAvg))/((SpecResMax-SpecResMin)/2))) )
IF TResCPK <> 0 THEN
WOStats<1,14> = OCONV( TResCPK, 'MD3' )
END ELSE
WOStats<1,14> = ''
END
END
* resistivity sigma capabilities
WOStats<1,16> = OCONV( ResRHOCp*3, 'MD3' ) ;* WOStats<1,12>*3
* thickness and resistivity sigma level
WOStats<1,18> = OCONV( TResCPK*3, 'MD3' ) ;* WOStats<1,14>*3
RETURN WOStats