349 lines
11 KiB
Plaintext
349 lines
11 KiB
Plaintext
compile function SPC_WAFER_ETCH_RPT1()
|
|
|
|
begin condition
|
|
pre:
|
|
post:
|
|
end condition
|
|
|
|
* THIS FUNCTION WILL PLOT INTEGER VALUES UP TO A MAXIMUM OF 20 POINTS
|
|
|
|
declare function msg, set_property, send_event, dialog_box, utility, get_property
|
|
declare function set_printer, get_printer, fieldcount, Printer_Select
|
|
declare subroutine rlist, or_view, activate_save_select, yield
|
|
|
|
$insert rlist_equates
|
|
$insert msg_equates
|
|
$insert oiprint_equates
|
|
$insert spc_limits_equ
|
|
$insert logical
|
|
|
|
$insert spc_wafer_etch_equ
|
|
|
|
TableToUse = 'SPC_WAFER_ETCH'
|
|
open TableToUse to TableVar else
|
|
MsgInfo = ''
|
|
MsgInfo<mcol$> = -2
|
|
MsgInfo<mrow$> = -2
|
|
MsgInfo<mtext$> = 'Unable to open ':TableToUse:'...'
|
|
Void = msg( '', MsgInfo )
|
|
return 0
|
|
end
|
|
|
|
Params = dialog_box( 'SPC_WAFER_ETCH_RPT1', @window, '*CENTER' )
|
|
if Params = 'CANCEL' or Params = '' then
|
|
return 0
|
|
end
|
|
|
|
** PROGRAM IS DESIGNED TO ONLY GO UP TO 20 POINTS AND THE SPC_LIMITS WINDOW FOR
|
|
** WAFER ETCH VALIDATES FOR 1-20 AND IS INCREMENTED BY .01
|
|
|
|
convert '*' to @fm in Params
|
|
TestDateFrom = Params<1>
|
|
TestDateThru = Params<2>
|
|
Reactor = Params<3>
|
|
DirToPrinter = Params<4>
|
|
|
|
Stat = utility( 'CURSOR', 'H' )
|
|
Stmt = 'SELECT ':TableToUse:' BY DATE_TESTED BY TIME_TESTED'
|
|
|
|
* XPOSS ARE STATIC CAUSE THERE WILL ONLY BE SEVEN PLOTS PRINTED PER PAPER
|
|
XPosS1 = 1.11:@fm:2.49:@fm:3.87:@fm:5.25:@fm:6.63:@fm:8.01:@fm:9.38
|
|
XPosS2 = 1.17:@fm:2.55:@fm:3.93:@fm:5.31:@fm:6.69:@fm:8.07:@fm:9.44
|
|
|
|
|
|
YStartPos1 = ''
|
|
YStartPos2 = ''
|
|
|
|
XPosLast2 = ''
|
|
YPosLast2 = ''
|
|
|
|
EndStmt = ''
|
|
* TEST DATE INFORMATION
|
|
if TestDateFrom and TestDateThru then
|
|
EndStmt := " WITH DATE_TESTED FROM ":QUOTE(TestDateFrom):' TO ':QUOTE(TestDateThru)
|
|
end else
|
|
if TestDateFrom then
|
|
EndStmt := " WITH TEST_DATE GE ":QUOTE(TestDateFrom)
|
|
end
|
|
if TestDateThru then
|
|
EndStmt := " WITH TEST_DATE LE ":QUOTE(TestDateThru)
|
|
end
|
|
end
|
|
EndStmt := " AND WITH REACTOR = ":QUOTE(Reactor)
|
|
Stmt:=EndStmt
|
|
Void = set_status(0)
|
|
rlist( Stmt, target_activelist$, '', '', '' )
|
|
|
|
if @reccount then
|
|
|
|
TestDateS = ''
|
|
TestTimeS = ''
|
|
ShiftS = ''
|
|
EntryIDS = ''
|
|
PreS = ''
|
|
PostS = ''
|
|
DeltaS = ''
|
|
PointsPlotted = 0
|
|
YDeltaNums = ''
|
|
PrintPageBreak = 0
|
|
|
|
if DirToPrinter = 'Yes' then
|
|
PrnFlag = 0
|
|
end else
|
|
PrnFlag = 3 ;* THREE IN OIPI IS SCREEN MAXIMIZED
|
|
end
|
|
* PULL OFF VARIABLES
|
|
SPCLimitInfo = xlate( 'CONFIG', 'SPC_LIMITS', '', 'X' )
|
|
EtchMin = oconv( SPCLimitInfo<WafEtchMin$>, 'MD3' )
|
|
EtchMax = oconv( SPCLimitInfo<WafEtchMax$>, 'MD3' )
|
|
EtchTarget = oconv( iconv( ( EtchMin + ( (EtchMax-EtchMin)/2 ) ), 'MD3' ), 'MD3' )
|
|
|
|
EtchDateChg = oconv( SPCLimitInfo<WafEtchDate$>, 'D2/' )
|
|
|
|
PrintPath = Printer_Select('',1) ;* Get default printer path
|
|
Void = set_printer( 'INIT', '', '', '':@fm:'':@fm:'':@fm:.19, 1, PrnFlag:@fm:75 ,PrintPath)
|
|
|
|
Void = set_printer( 'LINESTYLE', PS_SOLID:@fm:1 )
|
|
Void = set_printer( 'FILLSTYLE', BS_SOLID )
|
|
|
|
* NOW SET UP YPOS ARRAYS
|
|
* REASON FOR THIS IS CAUSE MAX AND MIN CAN CHANGE
|
|
TStartPos1 = 2.44
|
|
TStartPos2 = 2.5
|
|
* MAX CAN ONLY BE 20 DUE TO PAPER REAL ESTATE
|
|
EtchDiff = EtchMax-EtchMin
|
|
if EtchDiff > .02 then
|
|
BotVal = EtchMin-.010
|
|
end else
|
|
BotVal = EtchMin
|
|
end
|
|
for i = EtchMax to BotVal step -.010
|
|
TVal = field( i, '.', 2 )
|
|
if len( TVal ) = 1 then
|
|
TVal := 0
|
|
end
|
|
YDeltaNums<-1> = TVal;* SO WE CAN LOCATE LATER
|
|
next i
|
|
NumRows = fieldcount( YDeltaNums, @fm )
|
|
TarRow = oconv( NumRows/2, 'MD0' )
|
|
|
|
gosub PrintTOF
|
|
|
|
Eof = false$
|
|
NumKeys = @reccount
|
|
Cnt = 0
|
|
loop
|
|
readnext WEKey else Eof = true$
|
|
until Eof
|
|
read WEEntry from TableVar, WEKey else
|
|
MsgInfo = ''
|
|
MsgInfo<mcol$> = -2
|
|
MsgInfo<mrow$> = -2
|
|
MsgInfo<mtext$> = 'Error reading ':WEKey:' from ':TableToUse:'!'
|
|
MsgInfo<micon$> = '!'
|
|
Void = MSG( '', MsgInfo )
|
|
return 0
|
|
end
|
|
* PULL OFF VARIABLES
|
|
TestDate = oconv( WEEntry<spc_wafer_etch_date_tested$>, 'D2/' )
|
|
TestTime = oconv( WEEntry<spc_wafer_etch_time_tested$>, 'MTH' )
|
|
Shift = WEEntry<spc_wafer_etch_shift$>
|
|
EntryID = WEEntry<spc_wafer_etch_entry_id$>
|
|
Pre = oconv( WEEntry<spc_wafer_etch_pre$>, 'MD3' )
|
|
Post = oconv( WEEntry<spc_wafer_etch_post$>, 'MD3' )
|
|
Delta = xlate( 'SPC_WAFER_ETCH', WEKey, 'DELTA', 'X' )
|
|
* ROUND OUT TO THE THOUSANDS
|
|
Delta = oconv( Delta, 'MD3' )
|
|
HoldDelta = Delta
|
|
DeltaToLoc = iconv( Delta, 'MD2' )
|
|
Delta = oconv( iconv( Delta, 'MD2' )*10, 'MD3' )
|
|
Delta = oconv( iconv( Delta, 'MD2' )*10, 'MD3' )
|
|
*
|
|
locate DeltaToLoc in YDeltaNums using @fm setting DPos then
|
|
YPosToUse1 = YStartPos1<DPos>
|
|
YPosToUse2 = YStartPos2<DPos>
|
|
end else
|
|
if Delta > EtchMax then
|
|
* POINT OUT OF CONTROL HIGH
|
|
* SET OTHER VARS UP TOP FOR OUT OF CONTROL
|
|
YPosToUse1 = OutofControlHighY
|
|
YPosToUse2 = OutofControlHighY+.06
|
|
end else
|
|
if Delta < EtchMin then
|
|
* POINT OUT OF CONTROL LOW
|
|
YPosToUse1 = OutofControlLowY
|
|
YPosToUse2 = OutofControlLowY+.06
|
|
end
|
|
end
|
|
end
|
|
if PointsPlotted = 7 then ;* CAN ONLY PLOT SEVEN SO DO A PAGEBREAK AND PRINT TOF AND PRINT COLUMNS
|
|
PrintPageBreak = 1
|
|
gosub PrintBOF
|
|
gosub PrintTOF
|
|
end
|
|
XPosToUse1 = XPosS1<PointsPlotted+1>
|
|
XPosToUse2 = XPosS2<PointsPlotted+1>
|
|
if YPosToUse1 = OutofControlHighY then
|
|
Void = set_printer( "TEXTXY", HoldDelta, XPosToUse1-.19:@fm:OutofControlHighY-.19, '', 0 )
|
|
end
|
|
if YPosToUse1 = OutofControlLowY then
|
|
Void = set_printer( "TEXTXY", HoldDelta, XPosToUse1-.19:@fm:OutofControlLowY+.06, '', 0 )
|
|
end
|
|
|
|
*
|
|
TestDateS<1,-1> = TestDate
|
|
TestTimeS<1,-1> = TestTime
|
|
ShiftS<1,-1> = Shift
|
|
EntryIDS<1,-1> = EntryID
|
|
PreS<-1> = Pre
|
|
PostS<-1> = Post
|
|
DeltaS<-1> = HoldDelta
|
|
|
|
* SET YOUR POINT AND THEN SET XY FOR THE LINE TO
|
|
Void = set_printer( 'ELLIPSE', XPosToUse1:@FM:YPosToUse1:@FM:XPosToUse2:@FM:YPosToUse2, 0 )
|
|
PointsPlotted += 1
|
|
if PointsPlotted > 1 then
|
|
Void = set_printer( 'LINE', XPosLast2-.03:@fm:YPosLast2:@fm:XPosToUse2-.03:@fm:YPosToUse2, 0 )
|
|
end
|
|
YPosLast2 = YPosToUse2
|
|
XPosLast2 = XPosToUse2
|
|
repeat
|
|
PrintPageBreak = 0
|
|
gosub PrintBOF
|
|
Void = set_printer( 'TERM', 1 )
|
|
end else
|
|
MsgInfo = ''
|
|
MsgInfo<mcol$> = -2
|
|
MsgInfo<mrow$> = -2
|
|
MsgInfo<mtext$> = 'NO Records meeting your date criteria!!'
|
|
MsgInfo<micon$> = '!'
|
|
Void = MSG( '', MsgInfo )
|
|
end
|
|
return 0
|
|
*===============================================================================================*
|
|
PrintTOF:
|
|
Font = "Courier New,18,C,1"
|
|
convert ',' to @fm in Font
|
|
Tfont = Font
|
|
Stat = set_printer( 'FONT', Font )
|
|
Void = set_printer( 'TEXT', 'Reactor# ':Reactor:' Wafer Etch Control Chart' )
|
|
Font<2> = 12
|
|
Font<3> = 'L'
|
|
Stat = set_printer( 'FONT', Font )
|
|
Void = set_printer( 'TEXT', '' )
|
|
|
|
TableColInfo = '^+4680':@vm:'^+4680':@vm:'^+4680'
|
|
PrintTbl = 'Characteristic Measured: FTIR':@vm:'Recipe: Production':@vm:'Date ctl Limits Calculated: ':EtchDateChg
|
|
Void = set_printer( 'ADDTABLE', TableColInfo, '', PrintTbl, '', '', 0, TB_ALL:@fm:'C' )
|
|
|
|
PrintTbl = 'Unit of Measure: Delta (Post-Pre)':@vm:'Frequency: Weekly':@vm:'Limits Calculated By: Peter Z.'
|
|
Void = set_printer( 'ADDTABLE', TableColInfo, '', PrintTbl, '', '', 0, TB_ALL:@fm:'C' )
|
|
|
|
PrintTbl = 'Sample ID: P+ 100 or N+ 100 > 10um':@vm:'UCL: ':EtchMax:' LCL: ':EtchMin:@vm:'Target: ':EtchTarget
|
|
Void = set_printer( 'ADDTABLE', TableColInfo, '', PrintTbl, '', '', 0, TB_ALL:@fm:'C' )
|
|
|
|
Void = set_printer( 'TEXT', '' )
|
|
Void = set_printer( 'TEXT', 'Delta X-Bar' )
|
|
|
|
Void = set_printer( 'TEXT', '' )
|
|
Void = set_printer( 'TEXT', 'UCL-':EtchMax )
|
|
|
|
TableColInfo = '^+720':@vm:'^+1987':@vm:'^+1987':@vm:'^+1987':@vm:'^+1987':@vm:'^+1987':@vm:'^+1987':@vm:'^+1987'
|
|
CurPos = get_printer( 'POS' )<2>
|
|
OutofControlHighY = CurPos-.13
|
|
RowsPrinted = 0
|
|
YStartPos1 = ''
|
|
YStartPos2 = ''
|
|
for i = EtchMax to BotVal step -.01
|
|
TVar = '.':field( i, '.', 2 ):'0'
|
|
if len( TVar ) = 3 then
|
|
TVar := 0
|
|
end
|
|
PrintTbl = TVar:@vm:'':@vm:'':@vm:'':@vm:'':@vm:'':@vm:'':@vm:''
|
|
Void = set_printer( 'ADDTABLE', TableColInfo, '', PrintTbl, '', '', 1, TB_ALL:@fm:'L' )
|
|
CurPos = get_printer( 'POS' )<2>
|
|
CurPos-=.13
|
|
TStartPos1 = CurPos
|
|
TStartPos2 = CurPos+.06
|
|
YStartPos1<-1> = TStartPos1
|
|
YStartPos2<-1> = TStartPos2
|
|
RowsPrinted += 1
|
|
if RowsPrinted = TarRow then
|
|
Void = set_printer( 'LINESTYLE', PS_SOLID:@fm:.5 )
|
|
Void = set_printer( 'LINE', .5:@fm:CurPos+.035:@fm:10.06:@fm:CurPos+.035, 0 )
|
|
end
|
|
next i
|
|
CurPos = get_printer( 'POS' )<2>
|
|
OutofControlLowY = CurPos+.06
|
|
Void = set_printer( 'TEXT', 'LCL-':EtchMin )
|
|
Void = set_printer( 'LINESTYLE', PS_SOLID:@fm:1 )
|
|
return
|
|
*===============================================================================================*
|
|
PrintBOF:
|
|
Void = set_printer( 'TEXT', '' )
|
|
Font<2> = 7
|
|
Font<3> = 'L'
|
|
Stat = set_printer( 'FONT', Font )
|
|
|
|
ColSize = '^+662':@vm:'^+662':@vm:'^+662'
|
|
NewColSize = ''
|
|
ColData = 'Pre':@vm:'Post':@vm:'Delta'
|
|
for i = 1 to PointsPlotted
|
|
NewColSize<1,-1> = ColSize
|
|
ColData<1,-1> = 'Pre':@vm:'Post':@vm:'Delta'
|
|
next i
|
|
NewColSize = '^+720':@vm:NewColSize
|
|
ColData = '':@vm:ColData
|
|
Void = set_printer( 'ADDTABLE', NewColSize, '', ColData, '', '', 0, TB_ALL:@fm:'L' )
|
|
|
|
ColData = ''
|
|
for i = 1 to PointsPlotted
|
|
ColData<1,-1> = PreS<i>
|
|
ColData<1,-1> = PostS<i>
|
|
ColData<1,-1> = DeltaS<i>
|
|
next i
|
|
ColData = '':@vm:ColData
|
|
Void = set_printer( 'ADDTABLE', NewColSize, '', ColData, '', '', 1, TB_ALL:@fm:'L' )
|
|
*
|
|
Void = set_printer( 'TEXT', '' )
|
|
Font<2> = 8
|
|
Font<3> = 'L'
|
|
Stat = set_printer( 'FONT', Font )
|
|
ColSize = '^+1987'
|
|
NewColSize = ''
|
|
for i = 1 to PointsPlotted
|
|
NewColSize<1,-1> = ColSize
|
|
next i
|
|
NewColSize = '^+720':@vm:NewColSize
|
|
|
|
NewColData = ''
|
|
NewColData<-1> = TestDateS
|
|
NewColData<-1> = TestTimeS
|
|
NewColData<-1> = ShiftS
|
|
NewColData<-1> = EntryIDS
|
|
NewColData = insert( NewColData, 1, 1, 0, 'Date' )
|
|
NewColData = insert( NewColData, 2, 1, 0, 'Time' )
|
|
NewColData = insert( NewColData, 3, 1, 0, 'Shift' )
|
|
NewColData = insert( NewColData, 4, 1, 0, 'User' )
|
|
|
|
Void = set_printer( 'ADDTABLE', NewColSize, '', NewColData, '', '', 1, TB_ALL:@fm:'L' )
|
|
|
|
TestDateS = ''
|
|
TestTimeS = ''
|
|
ShiftS = ''
|
|
EntryIDS = ''
|
|
PreS = ''
|
|
PostS = ''
|
|
DeltaS = ''
|
|
PointsPlotted = 0
|
|
Font<2> = 12
|
|
Font<3> = 'L'
|
|
Stat = set_printer( 'FONT', Font )
|
|
|
|
if PrintPageBreak then
|
|
Void = set_printer( 'PAGEBREAK' )
|
|
end
|
|
return
|
|
*===============================================================================================*
|
|
|