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

2055 lines
62 KiB
Plaintext

COMPILE FUNCTION obj_RDS_Test(Method,Parms,Override)
/*
Methods for RDS Metrology (RDS_TEST) table
02/14/2006 JCH - Initial Coding
Properties:
Methods:
New() ;* Creates New Records
*/
#pragma precomp SRP_PreCompiler
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, ErrMsg, Btree.Extract, Post_Metrology_Manual_Data_Entry_Log, SRP_Stopwatch
Declare subroutine Memory_Services, Environment_Services, Logging_Services, Database_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, obj_WO_Log, NextKey, SRP_Encode
DECLARE FUNCTION obj_Prod_Spec, obj_RDS_Test, obj_Popup, Database_Services, SRP_Array, Memory_Services
Declare function Environment_Services, Logging_Services, Error_Services
$insert LOGICAL
$INSERT MSG_EQUATES
$INSERT RDS_EQU
$INSERT RDS_LAYER_EQUATES
$INSERT RDS_TEST_EQUATES
$INSERT RDS_TEST_PROP_EQUATES
$INSERT PRS_LAYER_EQU
$INSERT PROD_SPEC_EQU
$INSERT TW_USE_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT REACT_RUN_EQUATES
EQU STAT_AVG$ TO 1
EQU STAT_STDV$ TO 2
EQU STAT_UNIF$ TO 3
EQU STAT_MIN$ TO 4
* This section used in PushProps method
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 SHEETRHO_SPEC_UNITS$ TO 'ê/Ü'
EQU RES_SPEC_UNITS$ TO \EA2D636D\
EQU STAT_MAX$ TO 5
EQU CRLF$ TO \0D0A\
ErrTitle = 'Error in Stored Procedure "obj_RDS_Test"'
ErrorMsg = ''
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
IF NOT(ASSIGNED(Override)) then Override = False$
IF ErrorMsg NE '' THEN
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
RETURN ''
END
Result = ''
BEGIN CASE
CASE Method = 'Create' ; GOSUB Create
CASE Method = 'CalcStats' ; GOSUB CalcStats
CASE Method = 'Resistivity' ; GOSUB Resistivity
CASE Method = 'CopyStats' ; GOSUB CopyStats
CASE Method = 'Delete' ; GOSUB Delete
CASE Method = 'CalcMissing' ; GOSUB CalcMissing ;* Used for the conversion process
CASE Method = 'OutOfSpec' ; GOSUB OutOfSpec
CASE Method = 'TestWfrCount' ; GOSUB TestWfrCount
CASE Method = 'PrimeWfrCount' ; GOSUB PrimeWfrCount
CASE Method = 'ProdTestCount' ; GOSUB ProdTestCount
CASE Method = 'CustTWCount' ; GOSUB CustTWCount
CASE Method = 'ReclaimCount' ; GOSUB ReclaimCount
CASE Method = 'SetReadSet' ; GOSUB SetReadSet
CASE Method = 'GetReadSet' ; GOSUB GetReadSet
CASE Method = 'SetZone' ; GOSUB SetZone
CASE Method = 'TWSignedOff' ; GOSUB TWSignedOff
CASE Method = 'ExpReadings' ; GOSUB ExpReadings
CASE Method = 'ExpTower' ; GOSUB ExpTower
CASE Method = 'ExpIR' ; GOSUB ExpIR
CASE Method = 'RefreshSpecs' ; GOSUB RefreshSpecs
CASE Method = 'TestComplete' ; GOSUB TestComplete
CASE Method = 'TestPropKeys' ; GOSUB TestPropKeys
CASE Method = 'PushProps' ; GOSUB PushProps
CASE Method = 'ExpCOA' ; GOSUB ExpCOA
CASE 1
ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.'
END CASE
IF ErrorMsg NE '' THEN
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
RETURN ''
END
RETURN Result
* * * * * * *
Create:
* * * * * * *
RDSNo = Parms[1,@RM]
LayerSet = Parms[COL2()+1,@RM]
PSNId = Parms[COL2()+1,@RM]
Zone = Parms[COL2()+1,@RM]
IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine (':Method:').' ; RETURN
IF LayerSet = '' THEN ErrorMsg = 'Null parameter "LayerSet" passed to routine (':Method:').' ; RETURN
IF PSNId = '' THEN
PSNId = XLATE('RDS',RDSNo, RDS_PROD_SPEC_ID$ ,'X')
IF PSNId = '' THEN
ErrorMsg = 'Null parameter "PSNId" passed to routine (':Method:').' ; RETURN
END
END
LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LayerSet:@RM:1) ;* Last parameter specifies no output conversion on return data
LayerSpecs = FIELD(LayerSpecs,@FM,2,99) ;* Returns with the layer set ID in the first field of each line
IF Get_Status(errCode) THEN RETURN
WaferSize = XLATE( 'PROD_SPEC', PSNId, 'SUB_WAFER_SIZE', 'X' )
SubOrientation = XLATE('PROD_SPEC',PSNId,'SUB_ORIENTATION','X')
ResUnits = LayerSpecs<PRS_LAYER_RES_UNITS$>
ReactorType = XLATE('PROD_SPEC',PSNId,PROD_SPEC_REACTOR_TYPE$,'X')
ThickFilmMet = XLATE('PROD_SPEC',PSNId,PROD_SPEC_THICKFILM_MET$,'X') ;* Added 1/16/2009 JCH
RDSTestRec = ''
RDSTestRec<RDS_TEST_RDS_NO$> = RDSNo
RDSTestRec<RDS_TEST_LS_ID$> = LayerSet
RDSTestRec<RDS_TEST_ZONE$> = Zone
RDSTestRec<RDS_TEST_WAFER_SIZE$> = WaferSize
RDSTestRec<RDS_TEST_SUB_ORIENTATION$> = SubOrientation
RDSTestRec<RDS_TEST_SPEC_DOPANT$> = LayerSpecs<PRS_LAYER_DOPANT$>
RDSTestRec<RDS_TEST_SPEC_RECIPE$> = LayerSpecs<PRS_LAYER_RECIPE$>
RDSTestRec<RDS_TEST_SPEC_RECIPE_NAME$> = LayerSpecs<PRS_LAYER_RECIPE_NAME$>
RDSTestRec<RDS_TEST_SPEC_THICK_MIN$> = LayerSpecs<PRS_LAYER_THICK_MIN$>
RDSTestRec<RDS_TEST_SPEC_THICK_TARGET$> = LayerSpecs<PRS_LAYER_THICK_TARGET$>
RDSTestRec<RDS_TEST_SPEC_THICK_MAX$> = LayerSpecs<PRS_LAYER_THICK_MAX$>
RDSTestRec<RDS_TEST_SPEC_THICK_UNITS$> = LayerSpecs<PRS_LAYER_THICK_UNITS$>
RDSTestRec<RDS_TEST_SPEC_RES_MIN$> = LayerSpecs<PRS_LAYER_RES_MIN$>
RDSTestRec<RDS_TEST_SPEC_RES_TARGET$> = LayerSpecs<PRS_LAYER_RES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_RES_MAX$> = LayerSpecs<PRS_LAYER_RES_MAX$>
RDSTestRec<RDS_TEST_SPEC_RES_UNITS$> = LayerSpecs<PRS_LAYER_RES_UNITS$>
RDSTestRec<RDS_TEST_SPEC_CON_MIN$> = LayerSpecs<PRS_LAYER_CONC_MIN$>
RDSTestRec<RDS_TEST_SPEC_CON_TARGET$> = LayerSpecs<PRS_LAYER_CONC_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CON_MAX$> = LayerSpecs<PRS_LAYER_CONC_MAX$>
RDSTestRec<RDS_TEST_SPEC_CON_UNITS$> = LayerSpecs<PRS_LAYER_CONC_UNITS$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MIN$> = LayerSpecs<PRS_LAYER_STRESS_MIN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MAX$> = LayerSpecs<PRS_LAYER_STRESS_MAX$>
RDSTestRec<RDS_TEST_SPEC_TRANS$> = LayerSpecs<PRS_LAYER_TRANS_SPEC$>
RDSTestRec<RDS_TEST_SPEC_CRES_MIN$> = LayerSpecs<PRS_LAYER_CRES_MIN$>
RDSTestRec<RDS_TEST_SPEC_CRES_TARGET$> = LayerSpecs<PRS_LAYER_CRES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CRES_MAX$> = LayerSpecs<PRS_LAYER_CRES_MAX$>
RDSTestRec<RDS_TEST_SPEC_CRES_UNITS$> = LayerSpecs<PRS_LAYER_CRES_UNITS$>
FOR A = 11 TO 19
RDSTestRec<A> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,A-10>
NEXT A
FOR A = 24 TO 32
RDSTestRec<A> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,A-23>
NEXT A
FOR A = 37 TO 45
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,A-36>
NEXT A
FOR A = 50 to 58
RDSTestRec<A> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,A-49>
NEXT A
FOR A = 121 TO 129
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,A-120>
NEXT A
RDSTestRec<RDS_TEST_SPEC_THICK_MPATTERN$> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_RES_MPATTERN$> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CON_MPATTERN$> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MPATTERN$> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_SPEC_CRES_MPATTERN$> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,PRS_MPATTERN$>
RDSTestRec<RDS_TEST_REACTOR_TYPE$> = ReactorType
IF ReactorType = 'P' OR ReactorType = 'EPP' OR ThickFilmMet = 1 THEN
SpecMap = XLATE('PROD_SPEC',PSNId,PROD_SPEC_TEST_POINT_MAP$,'X') ;* Added 4/8/2009 JCH new field in PROD_SPEC
IF SpecMap NE '' THEN
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = SpecMap
END ELSE
;* Added ThickFilmMet check - 1/16/2009 JCH
AllTargetThicks = XLATE('PROD_SPEC',PSNId,'THICK_TARGET_ALL','X')
TargetCnt = COUNT(AllTargetThicks,@VM) + (AllTargetThicks NE '')
BEGIN CASE
CASE TargetCnt = 2
CombinedThick = SUM(AllTargetThicks)
CASE TargetCnt = 1 OR TargetCnt = 3
CombinedThick = AllTargetThicks[-1,'B':@VM]
END CASE
IF OCONV(CombinedThick,'MD2') > '65.0' THEN
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR_T'
END ELSE
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR'
END
END
END ELSE
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'ASM17' ;* 17 Point linear test pattern until PROD_SPEC is updated support other types
END
RDSTestKey = NextKey('RDS_TEST')
obj_Tables('WriteRec','RDS_TEST':@RM:RDSTestKey:@RM:@RM:RDSTestRec)
Result = RDSTestKey
RETURN
* * * * * * *
CalcStats:
* * * * * * *
IF NOT(ASSIGNED(Readings)) THEN
Readings = Parms[1,@RM]
Conversion = Parms[COL2()+1,@RM]
END
IF Conversion = '' THEN ErrorMsg = 'Null parameter "Conversion" passed to routine (':Method:').'
IF ErrorMsg THEN RETURN
thisReadings = Readings
StatAvg = ''
StatStdv = ''
StatUnif = ''
StatMin = ''
StatMax = ''
StatRange = ''
StatRangePcnt = ''
AvgCount = 0
AvgTotal = 0
ReadCount = COUNT(thisReadings,@VM) + (thisReadings NE '')
FOR I = 1 TO ReadCount
thisReading = ThisReadings<1,I>
IF thisReading NE '' AND thisReading NE 0.00 THEN
AvgCount += 1
AvgTotal += thisReading
IF thisReading _LEX StatMin OR StatMin = '' THEN StatMin = thisReading
IF thisReading _GEX StatMax OR StatMax = '' THEN StatMax = thisReading
END
NEXT I
IF AvgCount > 0 THEN
StatAvg = AvgTotal/AvgCount
Mean = AvgTotal/AvgCount
StatRange = StatMax - StatMin
StatRangePcnt = (StatRange/Mean)*100
SumDiffSq = 0
FOR I = 1 TO ReadCount
thisReading = thisReadings<1,I>
IF thisReading NE '' THEN
*SumDiffSq += ( thisReading - Mean )**2
SumDiffSq += ( thisReading - Mean ) * ( thisReading - Mean )
END
NEXT I
IF SumDiffSq _GEX 0.00 AND AvgCount > 1 THEN
StatStdv = Sqrt( SumDiffSq / (AvgCount - 1) )
END
IF SumDiffSq _EQX 0 AND AvgCount > 1 THEN StatStdv = 0
END
IF StatMin NE '' AND StatMax NE '' AND StatMin _GEX 0 AND StatMin _GEX 0 THEN
StatUnif = OCONV(((StatMax - StatMin)/(StatMax + StatMin))*10000, 'MD2' )
END
StatAvg = ICONV(StatAvg,Conversion)
StatStdv = ICONV(StatStdv,'MD4')
StatMin = ICONV(StatMin,Conversion)
StatMax = ICONV(StatMax,Conversion)
StatRange = ICONV(StatRange,Conversion)
StatRangePcnt = ICONV(StatRangePcnt,'MD4')
Result = OCONV(StatAvg,Conversion):@RM
Result := OCONV(StatStdv,'MD4'):@RM
Result := StatUnif:@RM
Result := OCONV(StatMin,Conversion):@RM
Result := OCONV(StatMax,Conversion):@RM
Result := OCONV(StatRange,Conversion):@RM
Result := OCONV(StatRangePcnt,'MD4S%')
RETURN
* * * * * * *
Resistivity:
* * * * * * *
IF NOT(ASSIGNED(RDSTestKey)) THEN
* Get parameters if not called from another method in this program
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
NoConversion = Parms[COL2()+1,@RM]
END
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
ReactorType = RDSTestRec<RDS_TEST_REACTOR_TYPE$>
RDSNo = RDSTestRec<RDS_TEST_RDS_NO$>
SheetRhoReads = OCONV(RDSTestRec<RDS_TEST_READ_SHEET_RHO$>,'MD3')
ThickReads = OCONV(RDSTestRec<RDS_TEST_READ_THICK$>,'MD2')
ThickOvergrowAvg = OCONV(RDSTestRec<RDS_TEST_THICK_OVERGROW_AVG$>,'MD2')
ReadCnt = COUNT(SheetRhoReads,@VM) + (SheetRhoReads NE '')
IF ReadCnt = '' THEN
ReadCnt = COUNT(ThickReads,@VM) + (ThickReads NE '')
END
FOR I = 1 TO ReadCnt
SheetRhoRead = SheetRhoReads<1,I>
CalcValue = ThickReads<1,I>
ThickRead = OCONV(ICONV((CalcValue),'MD2'),'MD2')
IF ThickOvergrowAvg NE '' THEN ThickRead = ThickOverGrowAvg
IF SheetRhoRead = '' AND ThickRead = '' THEN
Result<1,I> = ''
END ELSE
IF SheetRhoRead NE 0 AND ThickRead NE 0 THEN
IF NoConversion THEN
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
Result<1,I> = ICONV((SheetRhoRead * ThickRead)/10000,'MD3')*10
END ELSE
Result<1,I> = ICONV((SheetRhoRead * ThickRead)/10000,'MD4')
END
END ELSE
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
Result<1,I> = OCONV(ICONV((SheetRhoRead * ThickRead/10000)*10,'MD3'),'MD4')
END ELSE
Result<1,I> = OCONV(ICONV((SheetRhoRead * ThickRead/10000),'MD4'),'MD4')
END
END
END ELSE
Result<1,I> = ''
END
END
NEXT I
RETURN
* * * * * * *
CopyStats:
* * * * * * *
SourceRDSTestKeys = Parms[1,@RM]
DestRDSTestKeys = Parms[COL2()+1,@RM]
IF SourceRDSTestKeys = '' THEN ErrorMsg = 'Null parameter "SourceRDSTestKeys" passed to routine. (':Method:')'
IF DestRDSTestKeys = '' THEN ErrorMsg = 'Null parameter "DestRDSTestKeys" passed to routine. (':Method:')'
RTParms = 'RDS_TEST'
LockedRDSTestKeys = ''
FOR I = 1 TO COUNT(DestRDSTestKeys,@VM) + (DestRDSTestKeys NE '')
DestRDSTestKey = DestRDSTestKeys<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, DestRDSTestKey)
// No longer lock records when copying metrology. This avoids unnecessary overhad and contention for a simple
// operation. - 08/04/2017
* obj_Tables('LockRec',RTParms)
* IF Get_Status(errCode) THEN
* FOR N = 1 TO COUNT(LockedRDSTestKeys,@VM) + (LockedRDSTestKeys NE '')
* RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSTestKeys<1,N>)
* obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
* NEXT N
* ErrorMsg = 'Unable to lock RDS_TEST ':QUOTE(DestRDSTestKey):' for Update.'
*
* RETURN
* END ELSE
LockedRDSTestKeys<1,I> = DestRDSTestKey
* END
NEXT I
* RDSTestTableVar = FIELD(RTParms,@RM,3)
RDSTestTableVar = Database_Services('GetTableHandle', 'RDS_TEST')
RDSTestKeyCount = DCount(LockedRDSTestKeys, @VM)
FOR I = 1 TO RDSTestKeyCount
LockedRDSTestKey = LockedRDSTestKeys<1,I>
READ DestRDSTestRec FROM RDSTestTableVar,LockedRDSTestKey THEN
SourceRDSTestKey = SourceRDSTestKeys<1,I>
SourceRDSTestRec = XLATE('RDS_TEST',SourceRDSTestKey,'','X')
DestRDSTestRec<RDS_TEST_READ_THICK$> = SourceRDSTestRec<RDS_TEST_READ_THICK$>
DestRDSTestRec<RDS_TEST_READ_SHEET_RHO$> = SourceRDSTestRec<RDS_TEST_READ_SHEET_RHO$>
DestRDSTestRec<RDS_TEST_READ_RES$> = SourceRDSTestRec<RDS_TEST_READ_RES$>
DestRDSTestRec<RDS_TEST_READ_HGCV1_RES$> = SourceRDSTestRec<RDS_TEST_READ_HGCV1_RES$>
DestRDSTestRec<RDS_TEST_THICK_OVERGROW_AVG$> = SourceRDSTestRec<RDS_TEST_THICK_OVERGROW_AVG$>
DestRDSTestRec<RDS_TEST_HGCV_MEAN$> = SourceRDSTestRec<RDS_TEST_HGCV_MEAN$>
DestRDSTestRec<RDS_TEST_HGCV_STDV$> = SourceRDSTestRec<RDS_TEST_HGCV_STDV$>
DestRDSTestRec<RDS_TEST_THICK_AVG$> = SourceRDSTestRec<RDS_TEST_THICK_AVG$>
DestRDSTestRec<RDS_TEST_THICK_STDV$> = SourceRDSTestRec<RDS_TEST_THICK_STDV$>
DestRDSTestRec<RDS_TEST_THICK_UNIF$> = SourceRDSTestRec<RDS_TEST_THICK_UNIF$>
DestRDSTestRec<RDS_TEST_THICK_MIN$> = SourceRDSTestRec<RDS_TEST_THICK_MIN$>
DestRDSTestRec<RDS_TEST_THICK_MAX$> = SourceRDSTestRec<RDS_TEST_THICK_MAX$>
DestRDSTestRec<RDS_TEST_THICK_RANGE$> = SourceRDSTestRec<RDS_TEST_THICK_RANGE$>
DestRDSTestRec<RDS_TEST_THICK_RANGE_PCNT$> = SourceRDSTestRec<RDS_TEST_THICK_RANGE_PCNT$>
DestRDSTestRec<RDS_TEST_SHEETRHO_AVG$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_AVG$>
DestRDSTestRec<RDS_TEST_SHEETRHO_STDV$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_STDV$>
DestRDSTestRec<RDS_TEST_SHEETRHO_UNIF$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_UNIF$>
DestRDSTestRec<RDS_TEST_SHEETRHO_MIN$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_MIN$>
DestRDSTestRec<RDS_TEST_SHEETRHO_MAX$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_MAX$>
DestRDSTestRec<RDS_TEST_SHEETRHO_RANGE$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_RANGE$>
DestRDSTestRec<RDS_TEST_SHEETRHO_RANGE_PCNT$> = SourceRDSTestRec<RDS_TEST_SHEETRHO_RANGE_PCNT$>
DestRDSTestRec<RDS_TEST_RES_AVG$> = SourceRDSTestRec<RDS_TEST_RES_AVG$>
DestRDSTestRec<RDS_TEST_RES_STDV$> = SourceRDSTestRec<RDS_TEST_RES_STDV$>
DestRDSTestRec<RDS_TEST_RES_UNIF$> = SourceRDSTestRec<RDS_TEST_RES_UNIF$>
DestRDSTestRec<RDS_TEST_RES_MIN$> = SourceRDSTestRec<RDS_TEST_RES_MIN$>
DestRDSTestRec<RDS_TEST_RES_MAX$> = SourceRDSTestRec<RDS_TEST_RES_MAX$>
DestRDSTestRec<RDS_TEST_RES_RANGE$> = SourceRDSTestRec<RDS_TEST_RES_RANGE$>
DestRDSTestRec<RDS_TEST_RES_RANGE_PCNT$> = SourceRDSTestRec<RDS_TEST_RES_RANGE_PCNT$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_AVG$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_AVG$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_STDV$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_STDV$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_UNIF$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_UNIF$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_MIN$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_MIN$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_MAX$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_MAX$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_RANGE$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_RANGE$>
DestRDSTestRec<RDS_TEST_HGCV1_RES_RANGE_PCNT$> = SourceRDSTestRec<RDS_TEST_HGCV1_RES_RANGE_PCNT$>
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSTestKey)
RTParms = FieldStore(RTParms, @RM, 4, 1, DestRDSTestRec)
* obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS_TEST records
obj_Tables('WriteOnlyRec',RTParms) ;* Write but don't worry about unlocking.
END
NEXT I
RETURN
* * * * * * *
Delete:
* * * * * * *
MetKeys = Parms[1,@RM]
IF MetKeys = '' THEN RETURN
CONVERT @VM:@SVM TO @FM:@FM IN MetKeys
OPEN 'RDS_TEST' TO MetFile ELSE
ErrorMsg = 'Unable to open "RDS_TEST" table.(':Method:').'
RETURN
END
OPEN 'TW_USE' TO UseFile ELSE
ErrorMsg = 'Unable to open "TW_USE" table.(':Method:').'
RETURN
END
KeyCnt = COUNT(MetKeys,@FM) + (MetKeys NE '')
FOR I = 1 TO KeyCnt
MetKey = MetKeys<I>
TWUseKeys = XLATE('RDS_TEST',MetKey,RDS_TEST_TW_USE_ID$,'X')
UseRecordsCleared = 1
UseCnt = COUNT(TWUseKeys,@VM) + (TWUseKeys NE '')
FOR N = 1 TO UseCnt
TWUseKey = TWUseKeys<1,N>
DELETE UseFile,TWUseKey ELSE UseRecordsCleared = 0
NEXT N
IF UseRecordsCleared = 1 THEN
DELETE MetFile,MetKeys<I> ELSE NULL
END
NEXT I
RETURN
* * * * * * *
CalcMissing:
* * * * * * *
RDSTestRec = Parms[1,@RM]
IF RDSTestRec = '' THEN RETURN
* Calculate the resistivity values
SheetRhoReads = OCONV(RDSTestRec<RDS_TEST_READ_SHEET_RHO$>,'MD3')
ThickReads = OCONV(RDSTestRec<RDS_TEST_READ_THICK$>,'MD2')
ThickOvergrowAvg = OCONV(RDSTestRec<RDS_TEST_THICK_OVERGROW_AVG$>,'MD2')
ReactorType = RdsTestRec<RDS_TEST_REACTOR_TYPE$>
IF RDSTestRec<RDS_TEST_SPEC_RES_UNITS$> = RES_SPEC_UNITS$ THEN
* Calculate Resistivity Reads and Statistics
ReadCnt = COUNT(SheetRhoReads,@VM) + (SheetRhoReads NE '')
Readings = ''
FOR I = 1 TO ReadCnt
SheetRhoRead = SheetRhoReads<1,I>
ThickRead = ThickReads<1,I>
IF ThickOvergrowAvg _NEX '' THEN ThickRead = ThickOverGrowAvg
IF SheetRhoRead _NEX 0 AND SheetRhoRead NE '' AND ThickRead _NEX 0 AND ThickRead NE '' THEN
IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
Readings<1,I> = OCONV(ICONV((SheetRhoRead * ThickRead/10000),'MD3')*10,'MD4Z') ;* Crutch for EpiPRO with to tight of specs 7/3/2008 JCH
END ELSE
Readings<1,I> = OCONV(ICONV((SheetRhoRead * ThickRead/10000),'MD4'),'MD4Z')
END
END ELSE
Readings<1,I> = ''
END
NEXT I
IF Readings NE '' THEN
Results = obj_RDS_Test('CalcStats',Readings:@RM:'MD4')
CONVERT @RM TO @FM IN Results
RDSTestRec<RDS_TEST_RES_AVG$> = ICONV(Results[1,@FM],'MD4')
RDSTestRec<RDS_TEST_RES_STDV$> = ICONV(Results[COL2()+1,@FM],'MD4')
RDSTestRec<RDS_TEST_RES_UNIF$> = ICONV(Results[COL2()+1,@FM],'MD2')
RDSTestRec<RDS_TEST_RES_MIN$> = ICONV(Results[COL2()+1,@FM],'MD4')
RDSTestRec<RDS_TEST_RES_MAX$> = ICONV(Results[COL2()+1,@FM],'MD4')
END
END ELSE
* Calculate SheetRho statistics
Readings = OCONV(RDSTestRec<RDS_TEST_READ_SHEET_RHO$>,'MD3')
IF Readings NE '' THEN
Results = obj_RDS_Test('CalcStats',Readings:@RM:'MD3')
CONVERT @RM TO @FM IN Results
RDSTestRec<RDS_TEST_SHEETRHO_AVG$> = ICONV(Results[1,@FM],'MD3')
RDSTestRec<RDS_TEST_SHEETRHO_STDV$> = ICONV(Results[COL2()+1,@FM],'MD4')
RDSTestRec<RDS_TEST_SHEETRHO_UNIF$> = ICONV(Results[COL2()+1,@FM],'MD3')
RDSTestRec<RDS_TEST_SHEETRHO_MIN$> = ICONV(Results[COL2()+1,@FM],'MD3')
RDSTestRec<RDS_TEST_SHEETRHO_MAX$> = ICONV(Results[COL2()+1,@FM],'MD3')
END
END
Result = RDSTestRec
RETURN
* * * * * * *
OutOfSpec:
* * * * * * *
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
RDSNo = RdsTestRec<RDS_TEST_RDS_NO$>
LSId = RdsTestRec<RDS_TEST_LS_ID$>
ReactorType = RdsTestRec<RDS_TEST_REACTOR_TYPE$>
NoConversion = 1
GOSUB Resistivity ;* Calculate Resistvity values
ResReads = Result
Result = ''
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
HgCvReads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
SpecThickMin = RDSTestRec<RDS_TEST_SPEC_THICK_MIN$>
SpecThickMax = RDSTestRec<RDS_TEST_SPEC_THICK_MAX$>
SpecResMin = RDSTestRec<RDS_TEST_SPEC_RES_MIN$>
SpecResMax = RDSTestRec<RDS_TEST_SPEC_RES_MAX$>
SpecResUnits = RDSTestRec<RDS_TEST_SPEC_RES_UNITS$>
ReadLineCnt = COUNT(ThickReads,@VM) + (ThickReads NE '')
ThickSpecFlag = 0
SheetRhoSpecFlag = 0
ResistivitySpecFlag = 0
HgCvSpecFlag = 0
FOR I = 1 TO ReadLineCnt
ThickVal = ThickReads<1,I>
ThickVal = ICONV(ThickVal, "MD1")
IF ThickVal NE '' THEN
IF ThickVal > SpecThickMax OR ThickVal < SpecThickMin THEN ThickSpecFlag = 1
END
IF SpecResUnits = SHEETRHO_SPEC_UNITS$ THEN
ResVal = SheetRhoReads<1,I>
IF ResVal NE '' THEN
IF ResVal > SpecResMax OR ResVal < SpecResMin THEN SheetRhoSpecFlag = 1
END
END
IF SpecResUnits = RES_SPEC_UNITS$ THEN
ResVal = ResReads<1,I>
IF ResVal = 0 THEN ResVal = ''
IF ResVal NE '' THEN
IF ResVal > SpecResMax*10 OR ResVal < SpecResMin*10 THEN ResistivitySpecFlag = 1
END
HgCvVal = HgCvReads<1,I>
IF HgCvVal NE '' THEN
IF HgCvVal > SpecResMax OR HgCvVal < SpecResMin THEN HgCvSpecFlag = 1
END
END
NEXT I
ThickMinValue = RDSTestRec<RDS_TEST_THICK_MIN$>
ThickMaxValue = RDSTestRec<RDS_TEST_THICK_MAX$>
ThickMinValue = ICONV(ThickMinValue, "MD1")
ThickMaxValue = ICONV(ThickMaxValue, "MD1")
IF ThickMinValue < SpecThickMin AND ThickMinValue NE '' THEN ThickSpecFlag = 1
IF ThickMaxValue > SpecThickMax AND ThickMaxValue NE '' THEN ThickSpecFlag = 1
BEGIN CASE
CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
ResMinValue = RDSTestRec<RDS_TEST_SHEETRHO_MIN$>
ResMaxValue = RDSTestRec<RDS_TEST_SHEETRHO_MAX$>
IF ResMinValue < SpecResMin AND ResMinValue NE ''THEN SheetRhoSpecFlag = 1
IF ResMaxValue > SpecResMax AND ResMaxValue NE '' THEN SheetRhoSpecFlag = 1
CASE SpecResUnits = RES_SPEC_UNITS$
ResMinValue = RDSTestRec<RDS_TEST_RES_MIN$>
ResMaxValue = RDSTestRec<RDS_TEST_RES_MAX$>
SpecResMin = SpecResMin*10
SpecResMax = SpecResMax*10
IF ResMinValue < SpecResMin AND ResMinValue NE '' THEN ResistivitySpecFlag = 1 ;* Spec adjusted for Resistivity change to MD4 - JCH 7/1/2008
IF ResMaxValue > SpecResMax AND ResMaxValue NE '' THEN ResistivitySpecFlag = 1 ;* Spec adjusted for Resistivity change to MD4 - JCH 7/1/2008
HgCvMinValue = RDSTestRec<RDS_TEST_RES_MIN$>
HgCvMaxValue = RDSTestRec<RDS_TEST_RES_MAX$>
IF HgCvMinValue < SpecResMin AND HgCvMinValue NE '' THEN HgCvSpecFlag = 1
IF HgCvMaxValue > SpecResMax AND HgCvMaxValue NE '' THEN HgCvSpecFlag = 1
CASE 1
NULL
END CASE
ASETSpecFlag = 0
ASETResults = RDSTestRec<RDS_TEST_ASET_RESULTS$>
IF ASETResults > 179 THEN ASETSpecFlag = 1
IF ThickSpecFlag OR SheetRhoSpecFlag OR ResistivitySpecFlag OR HgCvSpecFlag OR ASETSpecFlag THEN
Result = 1
END ELSE
Result = ''
END
RETURN Result
* * * * * * *
TestWfrCount:
* * * * * * *
RDSTestKeys = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKeys = '' THEN RETURN
TestWfrCnt = 0
PopupData = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
TestTypes = ''
FOR I = 1 TO COUNT(PopupData,@VM) + (PopupData NE '')
IF PopupData<1,I,3> NE 'PROD' AND PopupData<1,I,3> NE 'CUST'THEN
TestTypes<1,-1> = PopupData<1,I,1>
END
NEXT I
CONVERT @LOWER_CASE TO @UPPER_CASE IN TestTypes
FOR N = 1 TO COUNT(RDSTestKeys,@VM) + (RDSTestKeys NE '')
RDSTestKey = RDSTestKeys<1,N>
IF N = 1 AND RDSTestRec = '' THEN
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END ELSE
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
IF TWUseIDs NE '' THEN
TWTypes = XLATE('TW_USE',TWUseIDs,TW_USE_TW_TYPE$,'X')
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
END ELSE
TWTypes = RDSTestRec<RDS_TEST_TW_TYPE$>
TWCnts = RDSTestRec<RDS_TEST_TW_CNT$>
END
CONVERT @LOWER_CASE TO @UPPER_CASE IN TWTypes
FOR I = 1 TO COUNT(TWTypes,@VM) + (TWTypes NE '')
TWType = TWTypes<1,I>
LOCATE TWType IN TestTypes USING @VM SETTING Dummy THEN
TestWfrCnt += TWCnts<1,I>
END
NEXT I
NEXT N
IF TestWfrCnt > 0 THEN Result = TestWfrCnt ELSE Result = ''
RETURN
* * * * * * *
PrimeWfrCount:
* * * * * * *
RDSTestKeys = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKeys = '' THEN RETURN
TestWfrCnt = 0
PopupData = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
PrimeTypes = ''
FOR I = 1 TO COUNT(PopupData,@VM) + (PopupData NE '')
IF PopupData<1,I,3> = 'PRIME' THEN
PrimeTypes<1,-1> = PopupData<1,I,1>
END
NEXT I
CONVERT @LOWER_CASE TO @UPPER_CASE IN PrimeTypes
FOR N = 1 TO COUNT(RDSTestKeys,@VM) + (RDSTestKeys NE '')
RDSTestKey = RDSTestKeys<1,N>
IF N = 1 AND RDSTestRec = '' THEN
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END ELSE
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
IF TWUseIDs NE '' THEN
TWTypes = XLATE('TW_USE',TWUseIDs,TW_USE_TW_TYPE$,'X')
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
END ELSE
TWTypes = RDSTestRec<RDS_TEST_TW_TYPE$>
TWCnts = RDSTestRec<RDS_TEST_TW_CNT$>
END
CONVERT @LOWER_CASE TO @UPPER_CASE IN TWTypes
FOR I = 1 TO COUNT(TWTypes,@VM) + (TWTypes NE '')
TWType = TWTypes<1,I>
LOCATE TWType IN PrimeTypes USING @VM SETTING Dummy THEN
TestWfrCnt += TWCnts<1,I>
END
NEXT I
NEXT N
IF TestWfrCnt > 0 THEN Result = TestWfrCnt ELSE Result = ''
RETURN
* * * * * * *
ProdTestCount:
* * * * * * *
RDSTestKeys = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKeys = '' THEN RETURN
RDSTestKeysHex = SRP_Encode(RDSTestKeys, 'HEX')
If Memory_Services('IsValueExpired', RDSTestKeysHex, 1) then
// Caching effectively disabled until further notice.
// An unintended side effect of caching is stale data being displayed.
ProdTypes = Memory_Services('GetValue', 'PROD_TW_TYPES')
If ProdTypes EQ '' then
PopupData = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
ProdTypes = ''
FOR I = 1 TO COUNT(PopupData,@VM) + (PopupData NE '')
IF PopupData<1,I,3> = 'PROD' THEN
ProdTypes<1,-1> = PopupData<1,I,1>
END
NEXT I
CONVERT @LOWER_CASE TO @UPPER_CASE IN ProdTypes
Memory_Services('SetValue', 'PROD_TW_TYPES', ProdTypes)
end
SRP_Stopwatch('Start', 'ProdTestCount-NoCache')
ProdWfrCnt = 0
FOR N = 1 TO COUNT(RDSTestKeys,@VM) + (RDSTestKeys NE '')
RDSTestKey = RDSTestKeys<1,N>
IF N = 1 AND RDSTestRec = '' THEN
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END ELSE
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
IF TWUseIDs NE '' THEN
TWTypes = XLATE('TW_USE',TWUseIDs,TW_USE_TW_TYPE$,'X')
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
END ELSE
TWTypes = RDSTestRec<RDS_TEST_TW_TYPE$>
TWCnts = RDSTestRec<RDS_TEST_TW_CNT$>
END
CONVERT @LOWER_CASE TO @UPPER_CASE IN TWTypes
FOR I = 1 TO COUNT(TWTypes,@VM) + (TWTypes NE '')
TWType = TWTypes<1,I>
LOCATE TWType IN ProdTypes USING @VM SETTING Dummy THEN
ProdWfrCnt += TWCnts<1,I>
END
NEXT I
NEXT N
IF ProdWfrCnt > 0 THEN Result = ProdWfrCnt ELSE Result = ''
Memory_Services('SetValue', RDSTestKeysHex, Result)
SRP_Stopwatch('Stop', 'ProdTestCount-NoCache')
end else
Result = Memory_Services('GetValue', RDSTestKeysHex)
end
RETURN
* * * * * * *
ReclaimCount:
* * * * * * *
RDSTestKeys = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKeys = '' THEN RETURN
PopupData = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
ReclTypes = ''
FOR I = 1 TO COUNT(PopupData,@VM) + (PopupData NE '')
IF PopupData<1,I,3> = 'RECL' THEN
ReclTypes<1,-1> = PopupData<1,I,1>
END
NEXT I
CONVERT @LOWER_CASE TO @UPPER_CASE IN ReclTypes
ReclWfrCnt = 0
FOR N = 1 TO COUNT(RDSTestKeys,@VM) + (RDSTestKeys NE '')
RDSTestKey = RDSTestKeys<1,N>
IF N = 1 AND RDSTestRec = '' THEN
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END ELSE
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
IF TWUseIDs NE '' THEN
TWTypes = XLATE('TW_USE',TWUseIDs,TW_USE_TW_TYPE$,'X')
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
END ELSE
TWTypes = RDSTestRec<RDS_TEST_TW_TYPE$>
TWCnts = RDSTestRec<RDS_TEST_TW_CNT$>
END
CONVERT @LOWER_CASE TO @UPPER_CASE IN TWTypes
FOR I = 1 TO COUNT(TWTypes,@VM) + (TWTypes NE '')
TWType = TWTypes<1,I>
LOCATE TWType IN ReclTypes USING @VM SETTING Dummy THEN
ReclWfrCnt += TWCnts<1,I>
END
NEXT I
NEXT N
IF ReclWfrCnt > 0 THEN Result = ReclWfrCnt ELSE Result = ''
RETURN
* * * * * * *
CustTWCount:
* * * * * * *
RDSTestKeys = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKeys = '' THEN RETURN
PopupData = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
CustTypes = ''
FOR I = 1 TO COUNT(PopupData,@VM) + (PopupData NE '')
IF PopupData<1,I,3> = 'CUST' THEN
CustTypes<1,-1> = PopupData<1,I,1>
END
NEXT I
CustWfrCnt = 0
CONVERT @LOWER_CASE TO @UPPER_CASE IN CustTypes
FOR N = 1 TO COUNT(RDSTestKeys,@VM) + (RDSTestKeys NE '')
RDSTestKey = RDSTestKeys<1,N>
IF N = 1 AND RDSTestRec = '' THEN
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END ELSE
RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
END
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
IF TWUseIDs NE '' THEN
TWTypes = XLATE('TW_USE',TWUseIDs,TW_USE_TW_TYPE$,'X')
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
END ELSE
TWTypes = RDSTestRec<RDS_TEST_TW_TYPE$>
TWCnts = RDSTestRec<RDS_TEST_TW_CNT$>
END
RDSNo = RDSTestRec<RDS_TEST_RDS_NO$>
WONo = XLATE('REACT_RUN',RDSNo,REACT_RUN_WO_NO$,'X')
CustEpiPartKey = XLATE('WO_LOG',WONo,'CUST_EPI_PART_NO','X')
TWRetInst = XLATE('CUST_EPI_PART',CustEpiPartKey,CUST_EPI_PART_TW_RET_INST$,'X')
BEGIN CASE
CASE TWRetInst = 'C' ;* Customer supplied only
CONVERT @LOWER_CASE TO @UPPER_CASE IN TWTypes
FOR I = 1 TO COUNT(TWTypes,@VM) + (TWTypes NE '')
TWType = TWTypes<1,I>
LOCATE TWType IN CustTypes USING @VM SETTING Dummy THEN
CustWfrCnt += TWCnts<1,I>
END
NEXT I
CASE TWRetInst = 'P' ;* Last good P+ and P- test wafers
IF INDEX(TWTypes,'P+',1) THEN CustWfrCnt += 1
IF INDEX(TWTypes,'P-',1) THEN CustWfrCnt += 1
CASE TWRetInst = 'N' ;* None are sent to customer
CustWfrCnt = 0
CASE TWRetInst = ''
CustWfrCnt = 0
END CASE
NEXT N
IF CustWfrCnt > 0 THEN Result = CustWfrCnt ELSE Result = ''
RETURN
* * * * * * *
GetReadSet:
* * * * * * *
MetNo = Parms[1,@RM]
IF MetNo = '' THEN RETURN
MetRec = XLATE('RDS_TEST',MetNo,'','X')
IF MetRec = '' THEN RETURN
TestPointMap = MetRec<RDS_TEST_TEST_POINT_MAP$>
TestPoints = XLATE('RDS_TEST',MetNo,'TEST_POINTS','X')
ThickReads = OCONV(MetRec<RDS_TEST_READ_THICK$>,'MD2')
SheetRhoReads = OCONV(MetRec<RDS_TEST_READ_SHEET_RHO$>,'MD3')
HgCV1Reads = OCONV(MetRec<RDS_TEST_READ_HGCV1_RES$>,'MD3')
LineOut = 0
FOR I = 1 TO 17
IF ThickReads<1,I> NE '' OR SheetRhoReads<1,I> NE '' OR HgCV1Reads<1,I> NE '' THEN
LineOut += 1
Result<1,LineOut> = TestPoints<1,LineOut>
Result<2,LineOut> = ThickReads<1,I>
Result<3,LineOut> = SheetRhoReads<1,I>
Result<4,LineOut> = HgCV1Reads<1,I>
END
NEXT I
RETURN
* * * * * * *
SetReadSet:
* * * * * * *
MetNo = Parms[1,@RM]
ThickReads = Parms[COL2()+1,@RM]
SheetRhoReads = Parms[COL2()+1,@RM]
HgCV1Reads = Parms[COL2()+1,@RM]
IF MetNo = '' THEN ErrorMsg = 'Null parameter "MetNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
Readings = ThickReads
Conversion = 'MD2'
GOSUB CalcStats
ThickAvg = Result[1,@RM]
ThickStdev = Result[COL2()+1,@RM]
ThickUnif = Result[COL2()+1,@RM]
ThickMin = Result[COL2()+1,@RM]
ThickMax = Result[COL2()+1,@RM]
ThickRange = Result[COL2()+1,@RM]
ThickRangePcnt = Result[COL2()+1,@RM]
Result = ''
Readings = SheetRhoReads
Conversion = 'MD3'
GOSUB CalcStats
SheetRhoAvg = Result[1,@RM]
SheetRhoStdev = Result[COL2()+1,@RM]
SheetRhoUnif = Result[COL2()+1,@RM]
SheetRhoMin = Result[COL2()+1,@RM]
SheetRhoMax = Result[COL2()+1,@RM]
SheetRhoRange = Result[COL2()+1,@RM]
SheetRhoRangePcnt = Result[COL2()+1,@RM]
Result = ''
Readings = HgCV1Reads
Conversion = 'MD3'
GOSUB CalcStats
HgCV1Avg = Result[1,@RM]
HgCV1Stdev = Result[COL2()+1,@RM]
HgCV1Unif = Result[COL2()+1,@RM]
HgCV1Min = Result[COL2()+1,@RM]
HgCV1Max = Result[COL2()+1,@RM]
HgCV1Range = Result[COL2()+1,@RM]
HgCV1RangePcnt = Result[COL2()+1,@RM]
thisThickReads = ICONV(ThickReads,'MD2')
thisSheetRhoReads = ICONV(SheetRhoReads,'MD3')
thisHgCV1Reads = ICONV(HgCV1Reads,'MD3')
Set_Status(0)
RTParms = 'RDS_TEST':@RM:MetNo
* MetRec = obj_Tables('ReadRec',RTParms)
MetRec = Database_Services('ReadDataRow', 'RDS_TEST', MetNo)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS_TEST record ':QUOTE(MetNo):' for SetReadSet update.'
RETURN
END
MetRec<RDS_TEST_THICK_AVG$> = ICONV(ThickAvg,'MD2')
MetRec<RDS_TEST_THICK_STDV$> = ICONV(ThickStdev,'MD4')
MetRec<RDS_TEST_THICK_UNIF$> = ICONV(ThickUnif,'MD2')
MetRec<RDS_TEST_THICK_MIN$> = ICONV(ThickMin,'MD2')
MetRec<RDS_TEST_THICK_MAX$> = ICONV(ThickMax,'MD2')
MetRec<RDS_TEST_THICK_RANGE$> = ICONV(ThickRange,'MD2')
MetRec<RDS_TEST_THICK_RANGE_PCNT$> = ICONV(ThickRangePcnt,'MD4S%')
MetRec<RDS_TEST_SHEETRHO_AVG$> = ICONV(SheetRhoAvg,'MD3')
MetRec<RDS_TEST_SHEETRHO_STDV$> = ICONV(SheetRhoStdev,'MD4')
MetRec<RDS_TEST_SHEETRHO_UNIF$> = ICONV(SheetRhoUnif,'MD2')
MetRec<RDS_TEST_SHEETRHO_MIN$> = ICONV(SheetRhoMin,'MD3')
MetRec<RDS_TEST_SHEETRHO_MAX$> = ICONV(SheetRhoMax,'MD3')
MetRec<RDS_TEST_SHEETRHO_RANGE$> = ICONV(SheetRhoRange,'MD3')
MetRec<RDS_TEST_SHEETRHO_RANGE_PCNT$> = ICONV(SheetRhoRangePcnt,'MD2')
MetRec<RDS_TEST_HGCV1_RES_AVG$> = ICONV(HgCV1Avg,'MD3')
MetRec<RDS_TEST_HGCV1_RES_STDV$> = ICONV(HgCV1Stdev,'MD4')
MetRec<RDS_TEST_HGCV1_RES_UNIF$> = ICONV(HgCV1Unif,'MD2')
MetRec<RDS_TEST_HGCV1_RES_MIN$> = ICONV(HgCV1Min,'MD3')
MetRec<RDS_TEST_HGCV1_RES_MAX$> = ICONV(HgCV1Max,'MD3')
MetRec<RDS_TEST_HGCV1_RES_RANGE$> = ICONV(HgCV1Range,'MD3')
MetRec<RDS_TEST_HGCV1_RES_RANGE_PCNT$> = ICONV(HgCV1RangePcnt,'MD4')
TestPointMap = MetRec<RDS_TEST_TEST_POINT_MAP$>
TestPoints = XLATE('TEST_POINT_MAP',TestPointMap,2,'X')
TPCnt = COUNT(TestPoints,@VM) + (TestPoints NE '')
DispCnt = 17
BlankLineCnt = (DispCnt - TPCnt)/2
IF BlankLineCnt > 0 THEN
ThickReads = STR(@VM,BlankLineCnt):thisThickReads:STR(@VM,BlankLineCnt)
SheetRhoReads = STR(@VM,BlankLineCnt):thisSheetRhoReads:STR(@VM,BlankLineCnt)
HgCV1Reads = STR(@VM,BlankLineCnt):thisHgCV1Reads:STR(@VM,BlankLineCnt)
END
RDSNo = MetRec<RDS_TEST_RDS_NO$>
// Check for thickness changes and log if necessary.
If SRP_Array('Clean', MetRec<RDS_TEST_READ_THICK$>, 'TrimTrailing', @VM) NE SRP_Array('Clean', ThickReads, 'TrimTrailing', @VM) then
Post_Metrology_Manual_Data_Entry_Log(@USER4, 'Thickness', RDSNo : ' / ' : MetNo)
end
// Save the changes
MetRec<RDS_TEST_READ_THICK$> = ThickReads
// Check for resistivity changes and log if necessary.
If SRP_Array('Clean', MetRec<RDS_TEST_READ_SHEET_RHO$>, 'TrimTrailing', @VM) NE SRP_Array('Clean', SheetRhoReads, 'TrimTrailing', @VM) then
Post_Metrology_Manual_Data_Entry_Log(@USER4, 'Resistivity', RDSNo : ' / ' : MetNo)
end
// Save the changes
MetRec<RDS_TEST_READ_SHEET_RHO$> = SheetRhoReads
// Check for HgRes changes and log if necessary.
If SRP_Array('Clean', MetRec<RDS_TEST_READ_HGCV1_RES$>, 'TrimTrailing', @VM) NE SRP_Array('Clean', HgCV1Reads, 'TrimTrailing', @VM) then
Post_Metrology_Manual_Data_Entry_Log(@USER4, 'HgRes', RDSNo : ' / ' : MetNo)
end
// Save the changes
MetRec<RDS_TEST_READ_HGCV1_RES$> = HgCV1Reads
Parms = MetRec
GOSUB CalcMissing ;* Calcs the resistivity
MetRec = Result
Result = ''
// Set the override flag if passed in.
MetRec<RDS_TEST_MODIFY_OVERRIDE$> = Override
RTParms = FieldStore(RTParms, @RM, 4, 1, MetRec)
Database_Services('WriteDataRow', 'RDS_TEST', MetNo, MetRec, True$, False$, True$)
* obj_Tables('WriteRec',RTParms)
RETURN
* * * * * * *
SetZone:
* * * * * * *
MetNo = Parms[1,@RM]
Zone = Parms[COL2()+1,@RM]
IF MetNo = '' THEN ErrorMsg = 'Null parameter "MetNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
Set_Status(0)
RTParms = 'RDS_TEST':@RM:MetNo
MetRec = obj_Tables('ReadRec',RTParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Unable to read RDS_TEST record ':QUOTE(MetNo):' for SetReadSet update.'
RETURN
END
MetRec<RDS_TEST_ZONE$> = Zone
RTParms = FieldStore(RTParms, @RM, 4, 1, MetRec)
obj_Tables('WriteRec',RTParms)
RETURN
* * * * * * *
TWSignedOff:
* * * * * * *
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
TWUseIDs = RDSTestRec<RDS_TEST_TW_USE_ID$>
TWCnts = XLATE('TW_USE',TWUseIDs,TW_USE_TW_QTY$,'X')
TWSigs = XLATE('TW_USE',TWUseIDs,TW_USE_SIGNATURE$,'X')
IF TWCnts = '' THEN
*Result = 0
Result = 1
END ELSE
Result = 1
FOR I = 1 TO COUNT(TWCnts,@VM) + (TWCnts NE '')
IF TWCnts<1,I> NE '' AND TWSigs<1,I> = '' THEN
Result = 0
END
UNTIL Result = 0
NEXT I
END
RETURN
* * * * * * *
ExpReadings:
* * * * * * *
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
ExpFormat = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
NoConversion = 1
GOSUB Resistivity
Resistivities = Result
Result = ''
TestPoints = XLATE('TEST_POINT_MAP',RDSTestRec<RDS_TEST_TEST_POINT_MAP$>,2,'X')
TPCnt = COUNT(TestPoints,@VM) +(TestPoints NE '')
DispCnt = 17
BlankLineCnt = (DispCnt - TPCnt)/2
IF BlankLineCnt > 0 THEN
TestPoints = STR(@VM,BlankLineCnt):TestPoints:STR(@VM,BlankLineCnt)
END
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
Hgcv1Reads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
ExpTestPoints = ''
ExpThickReads = ''
ExpSheetRhoReads = ''
ExpHgcv1Reads = ''
ExpResistivities = ''
ResLine = 0
FOR I = 1 TO 17
ThickRead = ThickReads<1,I>
SheetRhoRead = SheetRhoReads<1,I>
Hgcv1Read = Hgcv1Reads<1,I>
IF ThickRead = '' AND SheetRhoRead = '' AND Hgcv1Read = '' ELSE
ResLine += 1
ExpTestPoints<1,ResLine> = TestPoints<1,I>
ExpThickReads<1,ResLine> = ThickReads<1,I>
ExpSheetRhoReads<1,ResLine> = SheetRhoReads<1,I>
ExpHgcv1Reads<1,ResLine> = Hgcv1Reads<1,I>
ExpResistivities<1,ResLine> = Resistivities<1,I>
END
NEXT I
IF ExpFormat = 1 THEN
ExpThickReads = OCONV(ExpThickReads,'MD2')
ExpSheetRhoReads = OCONV(ExpSheetRhoReads,'MD3')
ExpHgcv1Reads = OCONV(ExpHgcv1Reads,'MD3')
ExpResistivities = OCONV(ExpResistivities,'MD4Z')
END
Result = ExpTestPoints:@FM:ExpThickReads:@FM:ExpSheetRhoReads:@FM:ExpHgcv1Reads:@FM:ExpResistivities
RETURN
* * * * * * *
ExpTower:
* * * * * * *
* Customer Specific data Export
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
NoConversion = 1
GOSUB Resistivity
Resistivities = Result
Result = ''
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
Hgcv1Reads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
ResSampSize = ''
ThickSampSize = ''
SheetRhoSampSize = ''
Hgcv1SampSize = ''
FOR I = 1 TO 17
IF Resistivities<1,I> NE '' THEN ResSampSize += 1
IF ThickReads<1,I> NE '' THEN ThickSampSize += 1
IF SheetRhoReads<1,I> NE '' THEN SheetRhoSampSize += 1
IF Hgcv1Reads<1,I> NE '' THEN Hgcv1SampSize += 1
NEXT I
IF ThickSampSize > 0 THEN
NewLine = '"Thickness"':@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_THICK_AVG$>,'MD2'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_THICK_STDV$>,'MD4'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_THICK_MIN$>,'MD2'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_THICK_MAX$>,'MD2'):@VM
NewLine := ThickSampSize:@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_THICK_MIN$>,'MD2'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_THICK_MAX$>,'MD2'):@VM
NewLine := '':@VM
NewLine := '':@VM
NewLine := '"um"'
Result<-1> = NewLine
END
/*
IF SheetRhoSampSize > 0 THEN
NewLine = '"SheetRho"':@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SHEETRHO_AVG$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SHEETRHO_STDV$>,'MD4'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SHEETRHO_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SHEETRHO_MAX$>,'MD3'):@VM
NewLine := SheetRhoSampSize:@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MAX$>,'MD3'):@VM
NewLine := '':@VM
NewLine := '':@VM
NewLine := '"Ohm-cm"'
Result<-1> = NewLine
END
*/
IF Hgcv1SampSize > 0 THEN
NewLine = '"Resistivity-HgCv1"':@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_AVG$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_STDV$>,'MD4'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_MAX$>,'MD3'):@VM
NewLine := Hgcv1SampSize:@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MAX$>,'MD3'):@VM
NewLine := '':@VM
NewLine := '':@VM
NewLine := '"Ohm-cm"'
Result<-1> = NewLine
END
IF ResSampSize > 0 THEN
NewLine = '"Resistivity-Calc"':@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_RES_AVG$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_RES_STDV$>,'MD4'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_RES_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_RES_MAX$>,'MD3'):@VM
NewLine := ResSampSize:@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MIN$>,'MD3'):@VM
NewLine := OCONV(RDSTestRec<RDS_TEST_SPEC_RES_MAX$>,'MD3'):@VM
NewLine := '':@VM
NewLine := '':@VM
NewLine := '"Ohm-cm"'
Result<-1> = NewLine
END
RETURN
* * * * * * *
ExpIR:
* * * * * * *
* Customer Specific data Export
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
NoConversion = 1
GOSUB Resistivity
Resistivities = Result
Result = ''
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
Hgcv1Reads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
ResSampSize = ''
ThickSampSize = ''
SheetRhoSampSize = ''
Hgcv1SampSize = ''
Line = ''
FOR I = 1 TO 17
IF ThickReads<1,I> = '' THEN
Line<1,I> = ''
END ELSE
Line<1,I> = OCONV(ThickReads<1,I>,'MD2')
END
IF Resistivities<1,I> = '' THEN
Line<1,I+17> = ''
END ELSE
Line<1,I+17> = OCONV(Resistivities<1,I>,'MD4')
END
IF Hgcv1Reads<1,I> = '' THEN
Line<1,I+34> = ''
END ELSE
Line<1,I+34> = OCONV(Hgcv1Reads<1,I>,'MD3')
END
NEXT I
Result<-1> = Line
RETURN
* * * * * * *
ExpCOA:
* * * * * * *
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
NoConversion = 1
GOSUB Resistivity
Resistivities = Result
Result = ''
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
Hgcv1Reads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
TimeSTamp = RDSTestRec<RDS_TEST_MODIFY_DTM$>
*JRO New Reads
ThickAvg = OCONV(RDSTestRec<RDS_TEST_THICK_AVG$>, 'MD2')
ThickStdDev = OCONV(RDSTestRec<RDS_TEST_THICK_STDV$>, 'MD4')
ThickMin = OCONV(RDSTestRec<RDS_TEST_THICK_MIN$>, 'MD2')
ThickMax = OCONV(RDSTestRec<RDS_TEST_THICK_MAX$>, 'MD2')
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
Hgcv1Reads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
if RDSTestRec<RDS_TEST_RES_AVG$> NE '' THEN
ResAvg = OCONV(RDSTestRec<RDS_TEST_RES_AVG$>, 'MD4')
ResStdDev = OCONV(RDSTestRec<RDS_TEST_RES_STDV$>, 'MD4')
ResMin = OCONV(RDSTestRec<RDS_TEST_RES_MIN$>, 'MD4')
ResMax = OCONV(RDSTestRec<RDS_TEST_RES_MAX$>, 'MD4')
End else
ResAvg = OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_AVG$>, 'MD3')
ResStdDev = OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_STDV$ >, 'MD3')
ResMin = OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_MIN$>, 'MD3')
ResMax = OCONV(RDSTestRec<RDS_TEST_HGCV1_RES_MAX$>, 'MD3')
end
ResSampSize = ''
ThickSampSize = ''
SheetRhoSampSize = ''
Hgcv1SampSize = ''
Line = ''
Line = ThickAvg : @VM : ThickStdDev : @VM : ThickMin : @VM : ThickMax: @VM : ResAvg: @VM :ResStdDev: @VM :ResMin: @VM :ResMax
Result = Line
RETURN
* * * * * * *
RefreshSpecs:
* * * * * * *
MetNo = Parms[1,@RM]
IF MetNo = '' THEN RETURN
TableVar = ''
OtParms = 'RDS_TEST':@RM:MetNo:@RM:TableVar
RDSTestRec = obj_Tables('ReadRec',OtParms)
IF Get_Status(errCode) THEN RETURN
RDSNo = RDSTestRec<RDS_TEST_RDS_NO$ >
PSNId = XLATE('REACT_RUN',RDSNo,'PS_NO','X')
LayerSet = RDSTestRec<RDS_TEST_LS_ID$>
LayerSpecs = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LayerSet:@RM:1) ;* Last parameter specifies no output conversion on return data
LayerSpecs = FIELD(LayerSpecs,@FM,2,99) ;* Returns with the layer set ID in the first field of each line
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',OtParms)
RETURN
END
RDSTestRec<RDS_TEST_SPEC_DOPANT$> = LayerSpecs<PRS_LAYER_DOPANT$>
RDSTestRec<RDS_TEST_SPEC_RECIPE$> = LayerSpecs<PRS_LAYER_RECIPE$>
RDSTestRec<RDS_TEST_SPEC_RECIPE_NAME$> = LayerSpecs<PRS_LAYER_RECIPE_NAME$>
RDSTestRec<RDS_TEST_SPEC_THICK_MIN$> = LayerSpecs<PRS_LAYER_THICK_MIN$>
RDSTestRec<RDS_TEST_SPEC_THICK_TARGET$> = LayerSpecs<PRS_LAYER_THICK_TARGET$>
RDSTestRec<RDS_TEST_SPEC_THICK_MAX$> = LayerSpecs<PRS_LAYER_THICK_MAX$>
RDSTestRec<RDS_TEST_SPEC_THICK_UNITS$> = LayerSpecs<PRS_LAYER_THICK_UNITS$>
RDSTestRec<RDS_TEST_SPEC_RES_MIN$> = LayerSpecs<PRS_LAYER_RES_MIN$>
RDSTestRec<RDS_TEST_SPEC_RES_TARGET$> = LayerSpecs<PRS_LAYER_RES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_RES_MAX$> = LayerSpecs<PRS_LAYER_RES_MAX$>
RDSTestRec<RDS_TEST_SPEC_RES_UNITS$> = LayerSpecs<PRS_LAYER_RES_UNITS$>
RDSTestRec<RDS_TEST_SPEC_CON_MIN$> = LayerSpecs<PRS_LAYER_CONC_MIN$>
RDSTestRec<RDS_TEST_SPEC_CON_TARGET$> = LayerSpecs<PRS_LAYER_CONC_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CON_MAX$> = LayerSpecs<PRS_LAYER_CONC_MAX$>
RDSTestRec<RDS_TEST_SPEC_CON_UNITS$> = LayerSpecs<PRS_LAYER_CONC_UNITS$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MIN$> = LayerSpecs<PRS_LAYER_STRESS_MIN$>
RDSTestRec<RDS_TEST_SPEC_STRESS_MAX$> = LayerSpecs<PRS_LAYER_STRESS_MAX$>
RDSTestRec<RDS_TEST_SPEC_TRANS$> = LayerSpecs<PRS_LAYER_TRANS_SPEC$>
RDSTestRec<RDS_TEST_SPEC_CRES_MIN$> = LayerSpecs<PRS_LAYER_CRES_MIN$>
RDSTestRec<RDS_TEST_SPEC_CRES_TARGET$> = LayerSpecs<PRS_LAYER_CRES_TARGET$>
RDSTestRec<RDS_TEST_SPEC_CRES_MAX$> = LayerSpecs<PRS_LAYER_CRES_MAX$>
RDSTestRec<RDS_TEST_SPEC_CRES_UNITS$> = LayerSpecs<PRS_LAYER_CRES_UNITS$>
FOR A = 11 TO 19
RDSTestRec<A> = LayerSpecs<PRS_LAYER_THICK_MEASUREMENT$,A-10>
NEXT A
FOR A = 24 TO 32
RDSTestRec<A> = LayerSpecs<PRS_LAYER_RES_MEASUREMENT$,A-23>
NEXT A
FOR A = 37 TO 45
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CONC_MEASUREMENT$,A-36>
NEXT A
FOR A = 50 to 58
RDSTestRec<A> = LayerSpecs<PRS_LAYER_STRESS_MEASUREMENT$,A-49>
NEXT A
FOR A = 121 TO 129
RDSTestRec<A> = LayerSpecs<PRS_LAYER_CRES_MEASUREMENT$,A-120>
NEXT A
WaferSize = XLATE( 'PROD_SPEC', PSNId, 'SUB_WAFER_SIZE', 'X' )
SubOrientation = XLATE('PROD_SPEC',PSNId,'SUB_ORIENTATION','X')
ResUnits = LayerSpecs<PRS_LAYER_RES_UNITS$>
ReactorType = XLATE('PROD_SPEC',PSNId,PROD_SPEC_REACTOR_TYPE$,'X')
ThickFilmMet = XLATE('PROD_SPEC',PSNId,PROD_SPEC_THICKFILM_MET$,'X') ;* Added 1/16/2009 JCH
RDSTestRec<RDS_TEST_REACTOR_TYPE$> = ReactorType
IF ReactorType = 'P' OR ReactorType = 'EPP' OR ThickFilmMet = 1 THEN
SpecMap = XLATE('PROD_SPEC',PSNId,PROD_SPEC_TEST_POINT_MAP$,'X') ;* Added 4/8/2009 JCH new field in PROD_SPEC
IF SpecMap NE '' THEN
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = SpecMap
END ELSE
;* Added ThickFilmMet check - 1/16/2009 JCH
AllTargetThicks = XLATE('PROD_SPEC',PSNId,'THICK_TARGET_ALL','X')
TargetCnt = COUNT(AllTargetThicks,@VM) + (AllTargetThicks NE '')
BEGIN CASE
CASE TargetCnt = 2
CombinedThick = SUM(AllTargetThicks)
CASE TargetCnt = 1 OR TargetCnt = 3
CombinedThick = AllTargetThicks[-1,'B':@VM]
END CASE
IF OCONV(CombinedThick,'MD2') > '65.0' THEN
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR_T'
END ELSE
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'FTIR'
END
END
END ELSE
RDSTestRec<RDS_TEST_TEST_POINT_MAP$> = 'ASM17' ;* 17 Point linear test pattern until PROD_SPEC is updated support other types
END
OtParms = FieldStore(OtParms,@RM,4,1,RDSTestRec)
obj_Tables('WriteRec',OtParms)
*obj_Tables('UnlockRec',OtParms)
RETURN
* * * * * * *
TestComplete:
* * * * * * *
RDSTestKey = Parms[1,@RM]
RDSTestRec = Parms[COL2()+1,@RM]
IF RDSTestKey = '' THEN RETURN
IF RDSTestRec = '' THEN RDSTestRec = XLATE('RDS_TEST',RDSTestKey,'','X')
RDSNo = RdsTestRec<RDS_TEST_RDS_NO$>
LSId = RdsTestRec<RDS_TEST_LS_ID$>
ReactorType = RdsTestRec<RDS_TEST_REACTOR_TYPE$>
NoConversion = 1
GOSUB Resistivity ;* Calculate Resistvity values
ResReads = Result
Result = ''
SheetRhoReads = RDSTestRec<RDS_TEST_READ_SHEET_RHO$>
ThickReads = RDSTestRec<RDS_TEST_READ_THICK$>
HgCvReads = RDSTestRec<RDS_TEST_READ_HGCV1_RES$>
SpecThickMin = RDSTestRec<RDS_TEST_SPEC_THICK_MIN$>
SpecThickMax = RDSTestRec<RDS_TEST_SPEC_THICK_MAX$>
SpecThickTool = RDSTestRec<RDS_TEST_SPEC_THICK_MTOOL$>
SpecResMin = RDSTestRec<RDS_TEST_SPEC_RES_MIN$>
SpecResMax = RDSTestRec<RDS_TEST_SPEC_RES_MAX$>
SpecResTool = RDSTestRec<RDS_TEST_SPEC_RES_MTOOL$>
SpecResUnits = RDSTestRec<RDS_TEST_SPEC_RES_UNITS$>
ReadLineCnt = COUNT(ThickReads,@VM) + (ThickReads NE '')
ThickCompFlag = 0
SheetRhoCompFlag = 0
ResistivityCompFlag = 0
HgCvCompFlag = 0
FOR I = 1 TO ReadLineCnt
ThickVal = ThickReads<1,I>
IF ThickVal NE '' OR SpecThickTool = 'SRP' THEN
ThickCompFlag = 1
END
IF SpecResUnits = SHEETRHO_SPEC_UNITS$ THEN
ResVal = SheetRhoReads<1,I>
IF ResVal NE '' THEN
SheetRhoCompFlag = 1
END
END
IF SpecResUnits = RES_SPEC_UNITS$ THEN
ResVal = ResReads<1,I>
IF ResVal = 0 THEN ResVal = ''
IF ResVal NE '' THEN
ResistivityCompFlag = 1
END
HgCvVal = HgCvReads<1,I>
IF HgCvVal NE '' THEN
HgCvCompFlag = 1
END
END
NEXT I
IF SpecResTool = 'SRP' THEN
SheetRhoCompFlag = 1
ResistivityCompFlag = 1
END
ReadingsComp = 0
BEGIN CASE
CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
IF ThickCompFlag = 1 AND SheetRhoCompFlag = 1 THEN
ReadingsComp = 1
END
CASE SpecResUnits = RES_SPEC_UNITS$
IF ThickCompFlag = 1 AND ( HgCvCompFlag = 1 OR ResistivityCompFlag = 1) THEN
ReadingsComp = 1
END
CASE 1
NULL
END CASE
GOSUB TWSignedOff
TWCompFlag = Result
Result = ''
IF SpecResUnits NE '' THEN
IF ReadingsComp = 1 AND TWCompFlag = 1 THEN
Result = 1
END ELSE
Result = 0
END
END ELSE
Result = TWCompFlag
END
RETURN Result
* * * * * * *
TestPropKeys:
* * * * * * *
MetNo = Parms[1,@RM]
IF MetNo = '' THEN RETURN
OPEN 'DICT.RDS_TEST_PROP' TO DictVar ELSE RETURN
Btree.Extract('MET_NO':@VM:MetNo:@FM, 'RDS_TEST_PROP', DictVar, TestPropKeys, '', '')
SortedProps = obj_Popup('AllCodes','MET_PROPERTY':@RM:2) ;* All Met Prop codes in the MET_PROPERTY popup
tpCnt = COUNT(TestPropKeys,@VM) + (TestPropKeys NE '')
SortedKeys = ''
FOR I = 1 TO tpCnt
TestPropKey = TestPropKeys<1,I>
TestProp = FIELD(TestPropKey,'*',2)
LOCATE TestProp IN SortedProps USING @VM SETTING Pos THEN
SortedKeys = INSERT(SortedKeys,1,Pos,0,TestPropKey)
END
NEXT I
CONVERT @VM TO ' ' IN SortedKeys
SortedKeys = TRIM(SortedKeys)
CONVERT ' ' TO @VM IN SortedKeys
Result = SortedKeys
RETURN
* * * * * * *
PushProps:
* * * * * * *
MetNo = Parms[1,@RM]
IF MetNo = '' THEN RETURN
MetRec = XLATE('RDS_TEST',MetNo,'','X')
IF MetRec = '' THEN RETURN
RETURN
IF MetRec<RDS_TEST_SPEC_THICK_MIN$> NE '' THEN
IF MetRec<RDS_TEST_SPEC_THICK_UNITS$> = UNIT$THICK THEN
Prop = 'THICK'
END ELSE
Prop = 'THICKA'
END
MetPropKey = MetNo:'*':Prop
MetPropRec = ''
MetPropRec<RDS_TEST_PROP_SPEC_MIN$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_THICK_MIN$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_MAX$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_THICK_MAX$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_TARGET$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_THICK_TARGET$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_UNITS$> = MetRec<RDS_TEST_SPEC_THICK_UNITS$>
MetPropRec<RDS_TEST_PROP_SPEC_MTOOL$> = MetRec<RDS_TEST_SPEC_THICK_MTOOL$>
MetPropRec<RDS_TEST_PROP_SPEC_MTYPE$> = MetRec<RDS_TEST_SPEC_THICK_MTYPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MRECIPE$> = MetRec<RDS_TEST_SPEC_THICK_MRECIPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MFREQ$> = MetRec<RDS_TEST_SPEC_THICK_MFREQ$>
MetPropRec<RDS_TEST_PROP_SPEC_MPROVEIN$> = MetRec<RDS_TEST_SPEC_THICK_MPROVEIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MFIRST$ > = MetRec<RDS_TEST_SPEC_THICK_MFIRST$>
MetPropRec<RDS_TEST_PROP_SPEC_MLAST$> = MetRec<RDS_TEST_SPEC_THICK_MLAST$>
MetPropRec<RDS_TEST_PROP_SPEC_MSPC$> = MetRec<RDS_TEST_SPEC_THICK_MSPC$>
MetPropRec<RDS_TEST_PROP_SPEC_MOVERGROW$> = MetRec<RDS_TEST_SPEC_THICK_MOVERGROW$>
MetPropRec<RDS_TEST_PROP_SPEC_MPATTERN$> = MetRec<RDS_TEST_SPEC_THICK_MPATTERN$>
MetPropRec<RDS_TEST_PROP_READING$> = ICONV(OCONV(MetRec<RDS_TEST_READ_THICK$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
OtParms = 'RDS_TEST_PROP':@RM:MetPropKey:@RM:@RM:MetPropRec
obj_Tables('WriteRec',OtParms)
END ;* End of Thickness Property
IF MetRec<RDS_TEST_SPEC_RES_MIN$> NE '' THEN
Prop = ''
IF MetRec<RDS_TEST_SPEC_RES_UNITS$> = UNIT$RES THEN
Prop = 'RES'
END
IF MetRec<RDS_TEST_SPEC_RES_UNITS$> = UNIT$SRES THEN
Prop = 'SRES'
END
MetPropKey = MetNo:'*':Prop
MetPropRec = ''
MetPropRec<RDS_TEST_PROP_SPEC_MIN$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_RES_MIN$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_MAX$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_RES_MAX$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_TARGET$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_RES_TARGET$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_UNITS$> = MetRec<RDS_TEST_SPEC_RES_UNITS$>
MetPropRec<RDS_TEST_PROP_SPEC_MTOOL$> = MetRec<RDS_TEST_SPEC_RES_MTOOL$>
MetPropRec<RDS_TEST_PROP_SPEC_MTYPE$> = MetRec<RDS_TEST_SPEC_RES_MTYPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MRECIPE$> = MetRec<RDS_TEST_SPEC_RES_MRECIPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MFREQ$> = MetRec<RDS_TEST_SPEC_RES_MFREQ$>
MetPropRec<RDS_TEST_PROP_SPEC_MPROVEIN$> = MetRec<RDS_TEST_SPEC_RES_MPROVEIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MFIRST$ > = MetRec<RDS_TEST_SPEC_RES_MFIRST$>
MetPropRec<RDS_TEST_PROP_SPEC_MLAST$> = MetRec<RDS_TEST_SPEC_RES_MLAST$>
MetPropRec<RDS_TEST_PROP_SPEC_MSPC$> = MetRec<RDS_TEST_SPEC_RES_MSPC$>
MetPropRec<RDS_TEST_PROP_SPEC_MOVERGROW$> = MetRec<RDS_TEST_SPEC_RES_MOVERGROW$>
MetPropRec<RDS_TEST_PROP_SPEC_MPATTERN$> = MetRec<RDS_TEST_SPEC_RES_MPATTERN$>
IF Prop = 'RES' THEN
MetPropRec<RDS_TEST_PROP_READING$> = ICONV(OCONV(MetRec<RDS_TEST_READ_SHEET_RHO$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
END ELSE
MetPropRec<RDS_TEST_PROP_READING$> = ICONV(OCONV(MetRec<RDS_TEST_READ_RES$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
END
OtParms = 'RDS_TEST_PROP':@RM:MetPropKey:@RM:@RM:MetPropRec
obj_Tables('WriteRec',OtParms)
END ;* End of RES or SRES Property
IF MetRec<RDS_TEST_SPEC_CRES_MIN$> NE '' THEN
Prop = 'CRES'
MetPropKey = MetNo:'*':Prop
MetPropRec = ''
MetPropRec<RDS_TEST_PROP_SPEC_MIN$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CRES_MIN$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_MAX$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CRES_MAX$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_TARGET$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CRES_TARGET$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_UNITS$> = MetRec<RDS_TEST_SPEC_CRES_UNITS$>
MetPropRec<RDS_TEST_PROP_SPEC_MTOOL$> = MetRec<RDS_TEST_SPEC_CRES_MTOOL$>
MetPropRec<RDS_TEST_PROP_SPEC_MTYPE$> = MetRec<RDS_TEST_SPEC_CRES_MTYPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MRECIPE$> = MetRec<RDS_TEST_SPEC_CRES_MRECIPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MFREQ$> = MetRec<RDS_TEST_SPEC_CRES_MFREQ$>
MetPropRec<RDS_TEST_PROP_SPEC_MPROVEIN$> = MetRec<RDS_TEST_SPEC_CRES_MPROVEIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MFIRST$ > = MetRec<RDS_TEST_SPEC_CRES_MFIRST$>
MetPropRec<RDS_TEST_PROP_SPEC_MLAST$> = MetRec<RDS_TEST_SPEC_CRES_MLAST$>
MetPropRec<RDS_TEST_PROP_SPEC_MSPC$> = MetRec<RDS_TEST_SPEC_CRES_MSPC$>
MetPropRec<RDS_TEST_PROP_SPEC_MOVERGROW$> = MetRec<RDS_TEST_SPEC_CRES_MOVERGROW$>
MetPropRec<RDS_TEST_PROP_SPEC_MPATTERN$> = MetRec<RDS_TEST_SPEC_CRES_MPATTERN$>
MetPropRec<RDS_TEST_PROP_READING$> = ICONV(OCONV(MetRec<RDS_TEST_READ_HGCV1_RES$>,'MD3'),'[MET_PROP_CONV,':Prop:']')
OtParms = 'RDS_TEST_PROP':@RM:MetPropKey:@RM:@RM:MetPropRec
obj_Tables('WriteRec',OtParms)
END ;* End of CRES or HgCv Resistivity Property
IF MetRec<RDS_TEST_SPEC_CON_MIN$> NE '' OR MetRec<RDS_TEST_SPEC_CON_MTOOL$> NE '' THEN
Prop = 'CONC'
MetPropKey = MetNo:'*':Prop
MetPropRec = ''
MetPropRec<RDS_TEST_PROP_SPEC_MIN$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CON_MIN$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_MAX$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CON_MAX$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_TARGET$> = ICONV(OCONV(MetRec<RDS_TEST_SPEC_CON_TARGET$>,'MD2'),'[MET_PROP_CONV,':Prop:']')
MetPropRec<RDS_TEST_PROP_SPEC_UNITS$> = MetRec<RDS_TEST_SPEC_CON_UNITS$>
MetPropRec<RDS_TEST_PROP_SPEC_MTOOL$> = MetRec<RDS_TEST_SPEC_CON_MTOOL$>
MetPropRec<RDS_TEST_PROP_SPEC_MTYPE$> = MetRec<RDS_TEST_SPEC_CON_MTYPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MRECIPE$> = MetRec<RDS_TEST_SPEC_CON_MRECIPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MFREQ$> = MetRec<RDS_TEST_SPEC_CON_MFREQ$>
MetPropRec<RDS_TEST_PROP_SPEC_MPROVEIN$> = MetRec<RDS_TEST_SPEC_CON_MPROVEIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MFIRST$ > = MetRec<RDS_TEST_SPEC_CON_MFIRST$>
MetPropRec<RDS_TEST_PROP_SPEC_MLAST$> = MetRec<RDS_TEST_SPEC_CON_MLAST$>
MetPropRec<RDS_TEST_PROP_SPEC_MSPC$> = MetRec<RDS_TEST_SPEC_CON_MSPC$>
MetPropRec<RDS_TEST_PROP_SPEC_MOVERGROW$> = MetRec<RDS_TEST_SPEC_CON_MOVERGROW$>
MetPropRec<RDS_TEST_PROP_SPEC_MPATTERN$> = MetRec<RDS_TEST_SPEC_CON_MPATTERN$>
OtParms = 'RDS_TEST_PROP':@RM:MetPropKey:@RM:@RM:MetPropRec
obj_Tables('WriteRec',OtParms)
END ;* End of Concentration Property
IF MetRec<RDS_TEST_SPEC_STRESS_MIN$> NE '' OR MetRec<RDS_TEST_SPEC_STRESS_MTOOL$> NE '' THEN
Prop = 'STRESS'
MetPropKey = MetNo:'*':Prop
MetPropRec = ''
MetPropRec<RDS_TEST_PROP_SPEC_MIN$> = MetRec<RDS_TEST_SPEC_STRESS_MIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MAX$> = MetRec<RDS_TEST_SPEC_STRESS_MAX$>
MetPropRec<RDS_TEST_PROP_SPEC_TARGET$> = MetRec<RDS_TEST_SPEC_STRESS_TARGET$>
MetPropRec<RDS_TEST_PROP_SPEC_UNITS$> = MetRec<RDS_TEST_SPEC_STRESS_UNITS$>
MetPropRec<RDS_TEST_PROP_SPEC_MTOOL$> = MetRec<RDS_TEST_SPEC_STRESS_MTOOL$>
MetPropRec<RDS_TEST_PROP_SPEC_MTYPE$> = MetRec<RDS_TEST_SPEC_STRESS_MTYPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MRECIPE$> = MetRec<RDS_TEST_SPEC_STRESS_MRECIPE$>
MetPropRec<RDS_TEST_PROP_SPEC_MFREQ$> = MetRec<RDS_TEST_SPEC_STRESS_MFREQ$>
MetPropRec<RDS_TEST_PROP_SPEC_MPROVEIN$> = MetRec<RDS_TEST_SPEC_STRESS_MPROVEIN$>
MetPropRec<RDS_TEST_PROP_SPEC_MFIRST$ > = MetRec<RDS_TEST_SPEC_STRESS_MFIRST$>
MetPropRec<RDS_TEST_PROP_SPEC_MLAST$> = MetRec<RDS_TEST_SPEC_STRESS_MLAST$>
MetPropRec<RDS_TEST_PROP_SPEC_MSPC$> = MetRec<RDS_TEST_SPEC_STRESS_MSPC$>
MetPropRec<RDS_TEST_PROP_SPEC_MOVERGROW$> = MetRec<RDS_TEST_SPEC_STRESS_MOVERGROW$>
MetPropRec<RDS_TEST_PROP_SPEC_MPATTERN$> = MetRec<RDS_TEST_SPEC_STRESS_MPATTERN$>
OtParms = 'RDS_TEST_PROP':@RM:MetPropKey:@RM:@RM:MetPropRec
obj_Tables('WriteRec',OtParms)
END ;* End of STRESS Property
RETURN