COMPILE ROUTINE FIX_PROD_SPEC(Dummy) ROWDEF(CHARSTR) DECLARE SUBROUTINE obj_Schedule,Send_Dyn,Send_Info, RList, ErrMsg, obj_Prod_Spec, Btree.Extract, obj_PRS_Stage DECLARE FUNCTION Get_Status, Set_Printer, obj_Prod_Spec, NextKEy $INSERT PROD_SPEC_EQUATES $INSERT QUOTE_SPEC_EQU $INSERT PART_EQUATES $INSERT CUST_EPI_PART_EQUATES $INSERT PRS_STAGE_EQUATES $INSERT PROD_VER_EQUATES EQU TAB$ TO \09\:'/' EQU CRLF$ TO \0D0A\ OPEN 'PROD_SPEC' TO ProdSpecTable ELSE DEBUG GOTO Bail END OPEN 'DICT.PROD_SPEC' TO DictProdSpec Else DEBUG GOTO Bail END OPEN 'PRS_STAGE' TO StageTable ELSE DEBUG GOTO Bail END OPEN 'PART_WORK' TO PartWorkTable ELSE DEBUG GOTO Bail END OPEN 'CUST_EPI_PART' TO CustEpiTable ELSE DEBUG GOTO Bail END DEBUG GOTO Bail SELECT ProdSpecTable RList('SELECT PROD_SPEC WITH TRANS_MEAS_TYPE NE "" OR WITH STRESS_MEAS_TYPE NE ""',5) CleanTools = '' Done = 0 RecCnt = @RECCOUNT FixCnt = 0 DEBUG LOOP READNEXT PSNo ELSE Done = 1 UNTIL Done Send_Dyn(PSNo) obj_Prod_Spec('PushTech',PSNo) REPEAT GOTO Bail ******************************************************************* SELECT ProdSpecTable RList('SELECT PROD_SPEC BY-DSND SEQ',5) CleanTools = '' Done = 0 RecCnt = @RECCOUNT FixCnt = 0 DEBUG LOOP READNEXT PSNo ELSE Done = 1 UNTIL Done READ ProdSpecRec FROM ProdSpecTable,PSNo THEN StageKeys = ProdSpecRec StageCnt = COUNT(StageKeys,@VM) + (StageKeys NE '') FOR I = 1 TO StageCnt StageKey = StageKeys<1,I> READ StageRec FROM StageTable,StageKey THEN RecCnt += 1 WriteFlag = 0 IF StageRec NE '' THEN StageRec = 1 WriteFlag = 1 END IF StageRec NE '' OR StageRec NE '' THEN StageRec = 1 WriteFlag = 1 END IF StageRec NE '' THEN StageRec = 1 WriteFlag = 1 END IF WriteFlag = 1 THEN *WRITE StageRec ON StageTable,StageKey THEN FixCnt += 1 Send_Info(FixCnt:TAB$:RecCnt:TAB$:StageKey) *END END ;* End of check for WriteFlag END NEXT I END REPEAT GOTO Bail ********************** ctCnt = COUNT(CleanTools,@FM) + (CleanTools NE '') DEBUG FOR I = 1 TO ctCnt CTool = TRIM(CleanTools) OrgCTool = CTool CONVERT @LOWER_CASE TO @UPPER_CASE in CTool SWAP 'AKRION 1' WITH 'AKRION1' in CTool IF CTool[1,2] _EQC 'NO' THEN CTool = '' IF CTool[1,2] _EQC 'IF' THEN CTool = '' SWAP ' OR ' WITH @VM IN CTool SWAP 'SC1+SC2' WITH 'CB3' IN CTool SWAP 'ONLY' WITH '' IN CTool SWAP 'HF+ SC1' WITH 'CB3' IN CTool SWAP 'SC1' WITH 'CB3' IN CTool intCTools = TRIM(CTool) nCnt = COUNT(intCTools,@VM) + (intCTools NE '') Fixed = 0 FOR N = 1 TO nCnt intCTool = intCTools<1,N> IF IntCTool = 'AKRION' THEN intCTools<1,N> = 'AKRION1':@VM:'AKRION2' Fixed = 1 END UNTIL Fixed NEXT N SWAP @VM WITH ', ' IN intCTools Send_Dyn(OrgCTool:' -> ':intCTools) NEXT I GOTO Bail * * * * * * * * SELECT ProdSpecTable RList('SELECT PROD_SPEC BY-DSND SEQ',5) Done = 0 RecCnt = @RECCOUNT FixCnt = 0 LOOP READNEXT PSNo ELSE Done = 1 UNTIL Done READ PsRec FROM ProdSpecTable,PSNo THEN * Pre Epi Cleans *************** PreTool = PSRec PreToolRecipe = PSRec IF PreTool[1,2] _EQC 'NO' THEN PreTool = '' IF PreTool[1,2] _EQC 'IF' THEN PreTool = '' IF PreToolRecipe[1,2] _EQC 'NO' THEN PreToolRecipe = '' SWAP 'Akrion1' WITH 'Akrion' IN PreTool SWAP ' or ' WITH @VM IN PreTool SWAP 'SC1+SC2' WITH 'CB3' IN PreTool SWAP 'Only' WITH '' IN PreTool PreTool = TRIM(PreTool) PreFlag = 0 IF PreTool OR PreToolRecipe THEN PreFlag = 1 Send_Dyn(PSNo:' Pre: Cleans ':PreTool:TAB$:PreToolRecipe) END * Pre Epi Inspection ** PreBrightlightFlag = PSRec PreMicroscopeFlag = PSRec IF PreBrightlightFlag = 1 or PreMicroscopeFlag = 1 THEN Send_Dyn(PSNo:' Pre: Inspection Brightlight ':PreBrightlightFlag:TAB$:' Microscope ':PreMicroscopeFlag) END * Pre Epi SurfScan ** PreSurfscanRecipe = PSRec IF PreSurfscanRecipe THEN Send_Dyn(PSNo:' Pre: SurfScan ':PreSurfscanFlag:TAB$:PreSurfscanRecipe) END * Wafer Inspection **************** Spec_FWI_LWI = PSRec ;* FWI OR LWI IF Spec_FWI_LWI = 'FWI' THEN FwiBrightLightFlag = PSRec FwiMicroscopeFlag = PSRec IF FwiBrightLightFlag = 1 OR FwiMicroscopeFlag = 1 THEN Send_Dyn(PSNo:' FWI Inspection Brightlight ':FwiBrightLightFlag:TAB$:'Microscope ':FwiMicroscopeFlag) END FwiSurfscanFlag = PSRec FwiSurfscanRecipe = PSRec IF FwiSurfscanFlag = 1 OR FwiSurfscanRecipe THEN Send_Dyn(PSNo:' FWI Inspection Surfscan Flag ':FwiSurfscanFlag:TAB$:' Recipe ':FwiSurfscanRecipe) END END IF Spec_FWI_LWI = 'LWI' THEN LwiBrightLightFlag = PSRec LwiMicroscopeFlag = PSRec IF LwiBrightLightFlag = 1 OR LwiMicroscopeFlag = 1 THEN Send_Dyn(PSNo:' LWI Inspection Brightlight ':LwiBrightLightFlag:TAB$:'Microscope ':LwiMicroscopeFlag) END LwiSurfscanFlag = PSRec LwiSurfscanRecipe = PSRec IF LwiSurfscanFlag = 1 OR LwiSurfscanRecipe = 1 THEN Send_Dyn(PSNo:' LWI Inspection Surfscan Flag ':LwiSurfscanFlag:TAB$:' Recipe ':LwiSurfscanRecipe) END END * Post Epi Cleans **************** PostTool = PSRec PostToolRecipe = PSRec IF PostTool[1,2] _EQC 'NO' THEN PostTool = '' IF PostToolRecipe[1,2] _EQC 'NO' THEN PostToolRecipe = '' IF PostTool NE '' OR PostToolRecipe NE '' THEN Send_Dyn(PSNo:' POST Clean ':PostTool:TAB$:PostToolRecipe) END * Post Epi Inspection ** PostBrightLight = PSRec IF PostBrightLight = 1 THEN Send_Dyn(PSNo:' POST Inspection Brightlight ':PostBrightlight) END * PostEpi SurfScan PostSurfscan = PSRec PostSurfscanRecipe = PSRec IF PostSurfscan OR PostSurfscanRecipe NE '' THEN Send_Dyn(PSNo:' POST Surfscan Flag ':PostSurfscan:TAB$:PostSurfscanRecipe) END Send_Dyn(' ') END ;* End of ProdSpecRec read REPEAT GOTO Bail **************************************** RList('SELECT PROD_SPEC BY-DSND SEQ',5) Done = 0 RecCnt = @RECCOUNT DEBUG LOOP READNEXT PSNo ELSE Done = 1 UNTIL Done READ ProdSpecRec FROM ProdSpecTable,PSNo THEN ModeCodes = 'U':@VM:'Q':@VM:'E':@VM:'P' ProdSpecRec = ModeCodes *PROD_SPEC_MODE_SIG$ *PROD_SPEC_MODE_SIG_DTM$ SpecAddtl = ProdSpecRec SpecType = ProdSpecRec PreQualSig = SpecAddtl<1,QSAddPreQualSig$> PreQualDate = OCONV(SpecAddtl<1,QSAddPreQualSigDate$>,'D4/') PreQualTime = OCONV(SpecAddtl<1,QSAddPreQualSigTime$>,'MTS') IF PreQualSig NE '' THEN ProdSpecRec = PreQualSig ProdSpecRec = ICONV(PreQualDate:' ':PreQualTime,'DT') END QualSig = SpecAddtl<1,QSAddQualSig$> QualDate = OCONV(SpecAddtl<1,QSAddQualSigDate$>,'D4/') QualTime = OCONV(SpecAddtl<1,QSAddQualSigTime$>,'MTS') IF QualSig NE '' THEN ProdSpecRec = QualSig ProdSpecRec = ICONV(QualDate:' ':QualTime,'DT') END PreProdSig = SpecAddtl<1,QSAddPreProdSig$> PreProdDate = OCONV(SpecAddtl<1,QSAddPreProdSigDate$>,'D4/') PreProdTime = OCONV(SpecAddtl<1,QSAddPreProdSigTime$>,'MTS') IF PreProdSig NE '' THEN ProdSpecRec = PreProdSig ProdSpecRec = ICONV(PreProdDate:' ':PreProdTime,'DT') END ProdSig = SpecAddtl<1,QSAddProdSig$> ProdDate = OCONV(SpecAddtl<1,QSAddProdSigDate$>,'D4/') ProdTime = OCONV(SpecAddtl<1,QSAddProdSigTime$>,'MTS') IF PreProdSig NE '' THEN ProdSpecRec = ProdSig ProdSpecRec = ICONV(ProdDate:' ':ProdTime,'DT') END Send_Dyn(PSNo:' - ':SpecType:' - ') Send_Dyn(PSNo:ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) Send_Dyn(PSNo:ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) Send_Dyn(PSNo:ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) Send_Dyn(PSNo:ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) Send_Dyn(' ') WRITE ProdSpecRec ON ProdSpecTable,PSNo THEN *Send_Dyn(PSNo:' ':ReactType:' ':ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) END END REPEAT GOTO Bail ***************************** *SelectSent = 'REACTOR_TYPE':@VM:'P':@FM SelectSent = 'STATUS':@VM:'A':@FM Btree.Extract(SelectSent,'PROD_SPEC',DictProdSpec,EpiProSpecNos,'','') IF Get_Status(errCode) THEN DEBUG Done = 0 RecCnt = COUNT(EpiProSpecNos,@VM) + (EpiProSpecNos NE '') FOR I = 1 TO RecCnt PSNo = EpiProSpecNos<1,I> READ ProdSpecRec FROM ProdSpecTable,PSNo THEN ReactType = XLATE('PROD_SPEC',PSNo,'REACTOR_TYPE','X') ThickMin = OCONV(XLATE('PROD_SPEC',PSNo,'THICK_MIN_ALL','X')[-1,'B':@VM],'MD2') ThickMax = OCONV(XLATE('PROD_SPEC',PSNo,'THICK_MAX_ALL','X')[-1,'B':@VM],'MD2') ResMin = OCONV(XLATE('PROD_SPEC',PSNo,'RES_MIN_ALL','X')[-1,'B':@VM],'MD3') ResMax = OCONV(XLATE('PROD_SPEC',PSNo,'RES_MAX_ALL','X')[-1,'B':@VM],'MD3') IF ReactType = 'P' THEN SubstrateInfo = ProdSpecRec TestCnt = 1 IF INDEX(SubstrateInfo,'FLEXUS',1) THEN ProdSpecRec = 'FLEXUS' ProdSpecRec = '5' ProdSpecRec = '1' ProdSpecRec = 'A' ;* All Wafers ProdSpecRec = 'MO_QA' TestCnt += 1 END ProdSpecRec = 'ADE' ProdSpecRec = ThickMin ProdSpecRec = ThickMax ProdSpecRec = '1' ProdSpecRec = '1' ProdSpecRec = '2' ProdSpecRec = 'MO_QA' END ELSE SubstrateInfo = ProdSpecRec TestCnt = 1 ProdSpecRec = 'THICK_ONLY' ProdSpecRec = ThickMin ProdSpecRec = ThickMax ProdSpecRec = '2' ProdSpecRec = '1' ProdSpecRec = 'L' ProdSpecRec = 'UNLOAD' TestCnt += 1 IF ProdSpecRec NE '' OR ProdSpecRec NE '' THEN ProdSpecRec = 'LW_RHO' ProdSpecRec = ResMin ProdSpecRec = ResMax ProdSpecRec = '1' ProdSpecRec = '1' ProdSpecRec = 'L' ProdSpecRec = 'UNLOAD' TestCnt += 1 END ProdSpecRec = 'ADE' ProdSpecRec = ThickMin ProdSpecRec = ThickMax ProdSpecRec = '1' ProdSpecRec = '1' ProdSpecRec = 'L' ProdSpecRec = 'QA' TestCnt += 1 IF INDEX(SubstrateInfo,'FLEXUS',1) THEN ProdSpecRec = 'FLEXUS' ProdSpecRec = '5' ProdSpecRec = '1' ProdSpecRec = 'A' ;* All Wafers ProdSpecRec = 'QA' TestCnt += 1 END IF ProdSpecRec NE '' OR ProdSpecRec NE '' THEN ProdSpecRec = 'LW_RHO' ProdSpecRec = ResMin ProdSpecRec = ResMax ProdSpecRec = '1' ProdSpecRec = '1' ProdSpecRec = 'L' ProdSpecRec = 'QA' TestCnt += 1 END END WRITE ProdSpecRec ON ProdSpecTable,PSNo THEN Send_Dyn(PSNo:' ':ReactType:' ':ProdSpecRec:' ':ProdSpecRec:' ':ProdSpecRec) END END NEXT I GOTO Bail RList('SELECT PROD_SPEC WITH SUB_SUPPLIED_BY "C" AND WITH BOM_EPI_PART_NO NE "" AND WITH STATUS = "A"',5) Done = 0 RecCnt = 0 LOOP READNEXT PSNo ELSE Done = 1 UNTIL Done READ ProdSpecRec FROM ProdSpecTable,PSNo THEN SubPartNos = ProdSpecRec SubMfgs = ProdSpecRec CustNo = ProdSpecRec BOMEpiPartNos = XLATE('PROD_SPEC',PSNo,'BOM_EPI_PART_NO','X') EpiPartNo = BOMEpiPartNos<1,1> IF SubPartNos NE '' AND EpiPartNo NE '' AND CustNo NE '' THEN READ CustEpiRec FROM CustEpiTable,CustNo:'*':EpiPartNo THEN CustEpiRec = SubPartNos CustEpiRec = SubMfgs WRITE CustEpiRec ON CustEpiTable,CustNo:'*':EpiPartNo THEN Send_Dyn(CustNo:'*':EpiPartNo) END END END END REPEAT GOTO Bail /* RList('SELECT PROD_SPEC WITH BOM_NO NE "" AND WITH EPI_PART_NO = "" ',5) SelCnt = @RECCOUNT DEBUG Done = 0 RecCnt = 0 FixCnt = 0 LOOP READNEXT ProdSpecNo ELSE Done = 1 UNTIL Done READ ProdSpecRec FROM ProdSpecTable,ProdSpecNo THEN BomNo = ProdSpecRec EpiPartNo = XLATE('BOM',BomNo,BOM_EPI_PART_NO$,'X') ProdSpecRec = EpiPartNo FixCnt += 1 *WRITE ProdSpecRec ON ProdSpecTable,ProdSpecNo THEN Send_Dyn(RecCnt:' - ':FixCnt:' ':ProdSpecNo:' BOM: ':BomNo:' -> ':EpiPartNo) *END END ;* End of read REPEAT GOTO Bail */ RList('SELECT PROD_SPEC WITH STATUS = "A" AND WITH EPI_PART_NO NE "" ',5) SelCnt = @RECCOUNT DEBUG Done = 0 RecCnt = 0 FixCnt = 0 LOOP READNEXT ProdSpecNo ELSE Done = 1 UNTIL Done READ ProdSpecRec FROM ProdSpecTable,ProdSpecNo THEN obj_Prod_Spec('PushSplit',ProdSpecNo) FixCnt += 1 Send_Info(RecCnt:' - ':FixCnt) END ;* End of read REPEAT * * * * * * * Bail: * * * * * * * END