{ "header": { "version": 1, "type": "record" }, "body": { "record1": { "<1>": "declare function rowexists, msg, post_event, fieldcount, dialog_box, start_window, ex_vm_rem\r\ndeclare function rds_comm, send_event, send_message, Get_Property, Get_Status, SRP_Array\r\ndeclare subroutine forward_event, record_lock, create_note, Set_Status,ErrMsg, Set_Property, Send_Event, Post_Event\r\nDECLARE SUBROUTINE RDS_React_Run, obj_React_Status\r\n\r\n$insert recipe_equ\r\n$insert msg_equates\r\n$insert rds_equ\r\n$insert prod_spec_equates\r\n$insert quote_spec_equ\r\n$insert rds_layer_info_equ\r\n$insert logical\r\n$insert recipe_info_array_equ\r\n\r\nequ Hidden$ to 32\r\n\r\nRDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')\r\n\r\nIF RowExists('RDS',RDSNo) ELSE\r\n\r\n\tMsg(@WINDOW,'','INVALID_RDS_NO')\r\n\tPost_Event(@WINDOW,'CLEAR')\t\r\n\t\r\n\tRETURN 0\r\n\t\r\nEND\r\n\r\n\r\nIF Get_Property(@WINDOW:'.FW_SIG','TEXT') <> '' THEN\r\n\t\r\n\tLayerArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')\r\n\tLSIDs = LayerArray<1>\r\n\tCompleteFlags = LayerArray<6>\r\n\tFOR L = 1 TO COUNT(LSIDs,@VM) + (LSIDs NE '')\r\n\t\tLSID = LSIDs<1,L>\r\n\t\tCompleteFlag = ICONV(CompleteFlags<1,L>,'B')\r\n\tUNTIL LSID = ''\r\n\t\tIF CompleteFlag = 0 THEN\r\n\t\t\tMsgInfo = ''\r\n\t\t\tMsgInfo = 'Layer Set ':LSID:' is missing parameter information.'\r\n\t\t\tMsgInfo = 'H'\r\n\t\t\tVoid = msg( '', MsgInfo )\r\n\t\t\t\r\n\t\t\tSet_Property(@WINDOW:'.RDS_LS_ID','SELPOS',1:@FM:L)\r\n\t\t\tSend_Event(@WINDOW:'.RDS_LS_ID','DBLCLK')\r\n\t\t\tRETURN 0\r\n\t\tEND\r\n\tNEXT L\r\n\t\r\n\t\r\nEND ELSE\r\n if .qxj_post->visible then ;* so we do not wipe out the qxj lot\r\n if .qxj_post->text = '' then\r\n .qxj_post->text = 0\r\n end\r\n end\r\nend\r\n\r\nRdsNo = .rds_no->text\r\nPSNID = .psn->text\r\nSubstrateInfo = xlate( 'PROD_SPEC', PSNID, prod_spec_spec_substrate$, 'X' )\r\nBL1 = SubstrateInfo<1,QSSubBl1Dopant$>\r\nBL2 = SubstrateInfo<1,QSSubBl2Dopant$>\r\nBL3 = SubstrateInfo<1,QSSubBl3Dopant$>\r\nError = false$\r\nif ( .fw_sig->text <> '' ) then ;* THEY HAVE SIGNED\r\n\r\n\t*IF SUBSTRATE HAS BURIED LAYER THEN FORCE THE ENTRY OF ALL SURFACE INFORMATION\r\n * THE FIRST 10 COLUMNS IN SURFACE_INFO ARE ALWAYS REQUIRED AND THE LAST TWO\r\n * ARE BASED ON THE SPECIFICATION FOR HAZE AND SURFACE DEFECTS\r\n * WHICH WILL BE FORCED ON THE WINDOW FOR SURFACE REQUIREMENT\r\n \r\n\tSurfaceInfo = .surface_info->array\r\n\tSCnt = fieldcount( SurfaceInfo, @fm )\r\n\t\r\n\tfor i = 1 to 8\t\t\t\t\t\t\t\t;* Changed from 10 on 4/19/2004 by jch, J.C. Henry & Co.\r\n\t if SurfaceInfo = '' then\r\n\t * NORMAL ERROR WE DON'T HAVE DATA AND WE WANT AN ENTRY ON\r\n\t * EVERYTHING EXCEPT BL_DEFECTS IF IT IS A VIRGIN WAFER\r\n\t if ( i = 4 ) and ( BL1 = '' ) and ( BL2 = '' ) and ( BL3 = '' ) then\r\n\t * OK CAUSE MATERIAL IS A VIRGIN\r\n\t end else\r\n\t * 4 IS THE BL_DEFECTS POSITION THAT IS PASSED TO RDS_SURF_ENT\r\n\t Error = true$\r\n\t end\r\n\t end \r\n\tnext i\r\n\t\r\n\tif Error then\r\n\t MsgInfo = ''\r\n\t MsgInfo = 'You must enter a value in every applicable field for the surface information.'\r\n\t MsgInfo = '!'\r\n\t Void = msg( '', MsgInfo )\r\n\t Void = send_event( @window:'.SURFACE_Q_BUTTON', 'CLICK' )\r\n\t return 0\r\n\tend\r\n\t\r\n\t* Section added 04/19/2004 by jch, J.C. Henry & Co.\r\n\tSurfScanRequired = XLATE('PROD_SPEC',PSNID,prod_spec_first_surfscan$,'X')\r\n\tIF XLATE('PROD_SPEC',PSNID,prod_spec_first_surfscan$,'X') = 1 THEN\r\n\t\r\n\t\t* surfscan required\r\n\t\t\t\t\r\n\t\tCtrls = @WINDOW:'.WO':@RM\t\t\t; Props = 'TEXT':@RM\r\n\t\tCtrls := @WINDOW:'.CASS_NO':@RM\t\t; Props = 'TEXT':@RM\r\n\t\tCtrls := @WINDOW:'.WO_STEP':@RM\t\t; Props = 'TEXT':@RM\r\n\t\tCtrls := @WINDOW:'.RDS_NO'\t\t\t; Props = 'TEXT'\r\n\r\n\t\tVals = Get_Property(Ctrls,Props)\r\n\r\n\t\tWONo \t= Vals[1,@RM]\r\n\t\tCassNo\t= Vals[COL2()+1,@RM]\r\n\t\tWOStep\t= Vals[COL2()+1,@RM]\r\n\t\tRDSNo\t= Vals[COL2()+1,@RM]\r\n\r\n\t\tStage = 'FW'\t\t\t\t\t;* First Wafer / Post Epi\r\n\r\n\t\tSurfScanKey = WONo:'*':WOStep:'*':CassNo:'*':Stage\r\n\t\t\r\n\t\t/*\r\n\t\tIF XLATE('SURFACE_SCAN',SurfScanKey,'','X') = '' THEN\r\n\t\t\r\n\t\t\t* No surfscan record yet\r\n\t\t\t\r\n\t\t\tMsgInfo = ''\r\n\t\t\t\r\n\t\t\tMsgInfo = 'Surface scan information is required for this RDS!'\r\n\t\t\tMsgInfo = '!'\r\n\t\t\tVoid = msg( '', MsgInfo )\r\n\t\t\tVoid = send_event( @window:'.SURF_SCAN_BUTTON', 'CLICK' )\r\n\t\t\treturn 0\r\n\t\tEND \r\n\t\t*/\r\n\tEND \r\n\t* End of mods by jch on 04/19/2004\r\n\t\r\n\t\r\nend else\r\n * DO NOT FORCE THE SURFACE INFORMATION CAUSE THEY HAVE NOT SIGNED\r\nend\r\n\r\n* LOOK AT RECIPE PARAMATERS AND WARN BUT DON'T FORCE \r\n\r\nOrigRecipeInfo = get_property( @window, '@OrigRecipeInfo' )\r\nRecipeInfo = .recipe_info->array\r\n\r\nif RecipeInfo <> OrigRecipeInfo then\r\n\r\n * ONLY VALIDATE IF SOMETHING HAS CHANGED CAUSE OTHERWISE \r\n * THEY WOULD GET AN ERROR EVERY TIME THEY LEAVE THE FIELD\r\n * AND EVENT THOUGH IT IS OUT OF THE LIMIT IT COULD BE A VALID ENTRY\r\n Void = iconv( 'NOTHING', '[RDS_RECIPE_PARAMS_VALID]' )\r\nend\r\n\r\nif .qxj_post->visible then\r\n\tif ( .qxj_post->text <> '' ) and ( .qxj_pre->text <> '' ) else\r\n\t\tMsgInfo = ''\r\n\t\tMsgInfo = 'This run requires wafer etch information - you must enter the Pre and Post readings.'\r\n\t\tMsgInfo = 'H'\r\n\t\tVoid = msg( '', MsgInfo )\r\n\t\tVoid = post_event( @window:'.QXJ_PRE', 'GOTFOCUS', '' )\r\n\t\tVoid = set_property( @window:'.QXJ_PRE', 'FOCUS', 1 ) \r\n\t\treturn 0\r\n\tend\r\nend\r\n\r\n\r\nRDSId = Get_Property(@WINDOW:'.RDS_NO','TEXT')\r\n\r\n* NEED TO READ THE MOD_ID AND MOD_DATE FROM RDS CAUSE WE ARE IGNORING SELF LOCKS\r\n* WHICH MEANS THIS RDS COULD BE CURRENTLY VIEWED VIA ANOTHER WINDOW\r\n\r\nif @@window->savewarn then\r\n Void = rds_comm( 'STAMP_MOD' )\r\n Void = rds_comm( 'WRITE_STAMP' )\r\nend\r\n\r\nReactor = .reactor->text\r\nWONo = .wo->text\r\nCassNo = .cass_no->text\r\nReactType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')\r\n\r\nForward_Event()\r\n\r\nRDS_React_Run(RDSId)\t;* Conversion of data to REACT_RUN and REACT_RUN_CI & Adds Sig to WO_MAT 3/18/2008 JCH\r\n\r\n\r\n* NOW WRITE OUT THE EX SIG INFO IF IT EXISTS\r\n* LOCK THE ROW AND WRITE IF THERE IS DATA IN EXSIGINFO\r\n\r\nExSigInfo = get_property( @window, '@ExSigInfo' )\r\nif get_property( @window, '@ExSigWrite' ) then ;* THERE ARE SIXTEEN FIELDS \r\n\topen 'RDS' to RDSTable else\r\n\t Void = msg( '', 'Unable to open RDS...' )\r\n\t return 0\r\n\tend\r\n\trecord_lock( RDSTable, 'RDS', RDSId )\r\n\tRDSRec = xlate( 'RDS', RDSId, '', 'X' )\r\n\t\r\n\tUnloadEx1Signed = ( (RDSRec EQ '') and (ExSigInfo<1> NE '') )\r\n\tUnloadEx1Unsigned = ( (RDSRec NE '') and (ExSigInfo<1> EQ '') )\r\n\t\r\n\tLoadEx2Signed = ( (RDSRec EQ '') and (ExSigInfo<5> NE '') )\r\n\tLoadEx2Unsigned = ( (RDSRec NE '') and (ExSigInfo<5> EQ '') )\r\n\t\r\n\tUnloadEx2Signed = ( (RDSRec EQ '') and (ExSigInfo<9> NE '') )\r\n\tUnloadEx2Unsigned = ( (RDSRec NE '') and (ExSigInfo<9> EQ '') )\r\n\t\r\n\tLoadEx3Signed = ( (RDSRec EQ '') and (ExSigInfo<13> NE '') )\t\r\n\tLoadEx3Unsigned = ( (RDSRec NE '') and (ExSigInfo<13> EQ '') )\t\r\n\t\r\n\t\r\n\tRDSRec = ExSigInfo<1>\r\n\tRDSRec = ExSigInfo<3>\r\n\tRDSRec = ExSigInfo<4>\r\n\tRDSRec = ExSigInfo<5>\r\n\tRDSRec = ExSigInfo<7>\r\n\tRDSRec = ExSigInfo<8>\r\n\tRDSRec = ExSigInfo<9>\r\n\tRDSRec = ExSigInfo<11>\r\n\tRDSRec = ExSigInfo<12>\r\n\tRDSRec = ExSigInfo<13>\r\n\tRDSRec = ExSigInfo<15>\r\n\tRDSRec = ExSigInfo<16>\r\n\t\r\n\twrite RDSRec on RDSTable, RDSId else\r\n\t Void = msg( '', 'Unable to open RDS...' )\r\n\t return 0 \r\n\tend\r\n\t\r\n\t// Extra unload signed\r\n\tIf UnloadEx1Signed or UnloadEx2Signed then\r\n\t\t// Call CassUnload/ReactorUnload to update REACT_STATUS record\r\n\t\tIf UnloadEx1Signed then\r\n\t\t\tUnloadDTM = OConv(ExSigInfo<3>, 'D') :' ': OConv(ExSigInfo<4>, 'MT')\r\n\t\tend else\r\n\t\t\tUnloadDTM = OConv(ExSigInfo<11>, 'D') :' ': OConv(ExSigInfo<12>, 'MT')\r\n\t\tend\t\t\r\n\t\tIf ReactType NE 'EPP' then \r\n\t\t\tobj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)\r\n\t\tend else\r\n\t\t\tInCassettes = RDSRec\r\n \tInCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)\r\n \tobj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)\r\n end\r\n\tend \r\n\t\r\n\t\r\n\t// Extra unload unsigned\r\n\tIf UnloadEx1Unsigned or UnloadEx2Unsigned then\t\r\n\t\tobj_React_Status('HandleUnloadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:@User4)\r\n\tend\r\n\t\r\n\t\r\n\t// Extra load signed\r\n\tIf LoadEx2Signed or LoadEx3Signed then \r\n\t\t// Call CassLoad/ReactorLoad to update REACT_STATUS record\r\n\t\tIf LoadEx2Signed then\r\n\t\t\tLoadDTM = OConv(ExSigInfo<7>, 'D') :' ': OConv(ExSigInfo<8>, 'MT')\r\n\t\tend else\r\n\t\t\tLoadDTM = OConv(ExSigInfo<15>, 'D') :' ': OConv(ExSigInfo<16>, 'MT')\r\n\t\tend\t\t\r\n\t\tIf ReactType NE 'EPP' then\r\n\t\t\tobj_React_Status('CassLoad',Reactor:@RM:WONo:@RM:CassNo:@RM:LoadDTM:@RM:RDSNo)\r\n\t\tend else\r\n\t\t\tInCassettes = RDSRec\r\n \tInCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)\r\n\t\t\tobj_React_Status('ReactorLoad',Reactor:@RM:WONo:@RM:InCassettes:@RM:LoadDTM:@RM:RDSNo)\r\n\t\tend\r\n\tend\r\n\t\r\n\t\r\n\t// Extra load unsigned\r\n\tIf LoadEx2Unsigned or LoadEx3Unsigned then \r\n\t\t// Call CassLoad/ReactorLoad to update REACT_STATUS record\r\n\t\tobj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:@User4)\r\n\tend\r\n\t\r\n\tunlock RDSTable, RDSId else\r\n\t Void = msg( '', 'Unable to unlock RDS ':RDSId )\r\n\t return 0\t\r\n\tend\r\nend\r\nreturn 0" } } }