1000 !*************************************************
1010 !*
1020 !* FILE       :  VRAMP
1030 !* DESCRIPTION:  Program for Voltage Ramp Test.
1040 !*
1090 !* PRODUCT    :  4155,4156
1100 !* REVISION   :  Rev.A.02.02
1110 !*
1120 !*   (c) Copyright 1994, Hewlett-Packard Co,
1130 !*              All rights reserved.
1140 !*
1150 !*
1160 !*  Customer shall have the personal, non-
1170 !* transferable right to use, copy or modify
1180 !* this SAMPLE PROGRAM for Customer's internal
1190 !* operations.  Customer shall use the SAMPLE
1200 !* PROGRAM solely and exclusively for its own
1210 !* purpose and shall not license, lease, market
1220 !* or distribute the SAMPLE PROGRAM or modification
1230 !* or any part thereof.
1240 !*
1250 !*  Agilent shall not be liable for the quality,
1260 !* performance or behavior of the SAMPLE PROGRAM.
1270 !* Agilent especially disclaims that the operation
1280 !* of the SAMPLE PROGRAM shall be uninterrupted or
1290 !* error free.  This SAMPLE PROGRAM is provided
1300 !* AS IS.
1310 !*
1320 !*  AGILENT DISCLAIMS THE IMPLIED WARRANTIES OF
1330 !* MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1340 !* PURPOSE.
1350 !*
1360 !*  Agilent shall not be liable for any infringement
1370 !* of any patent, trademark copyright or other
1380 !* proprietary rights by the SAMPLE PROGRAM or
1390 !* its use. Agilent does not warrant that the SAMPLE
1400 !* PROGRAM is free from infringements or such
1410 !* right of third parties. However, Agilent will not
1420 !* knowingly infringe or deliver a software that
1430 !* infringes the patent, trademark, copyright or
1440 !* other proprietary right of a third party.
1450 !*
1460 !*************************************************
1470   ASSIGN @Hp4155 TO 800
1480   COM @Hp4155
1490   COM /File_name/ Init_file$[12],Sweep_file$[12],Save_file$[12]
1500   COM /Err/ Err_num(1:6),Err_message$(1:6)[50]
1510   DIM Result_init$[3],Result_sw$[3],Result_fin$[3]
1520   Init_hp4155                                ! Initialize HP 4155
1530  !
1540   ON INTR 8 CALL Err_check
1550   ENABLE INTR 8;2
1560  !
1570   Test_setting                 ! Set up test parameters etc.
1580   Get_file                     ! LOAD necessary setup files into memory
1590  !
1600   Init_fin_test("Init",Result_init$)         ! Initial test (meas Igleak)
1610   Judge(Result_init$,Result_sw$,Result_fin$) ! Judge initial failure
1620  !
1630   Sweep_test(Result_sw$,Vbd,Qbd)             ! Ramp test
1640   Init_fin_test("Fin",Result_fin$)           ! Post test
1650   Judge(Result_init$,Result_sw$,Result_fin$) ! Judge failure status
1660   Save_data                                  ! Data save etc.
1670   END
1680  !
1690 Test_setting:SUB Test_setting
1700     COM /File_name/ Init_file$,Sweep_file$,Save_file$
1710     COM /Para/ Vuse,Ramp_rate,Tox,Area,Vstart,Vstop,Vstep,Iexpect,Igcomp,Tp,Step_time,Step_delay_t,Step_keep_t
1720    !
1730     Init_file$="VRSPOT.MES"   ! Spot Measurement Setup File Name
1740     Sweep_file$="VRSWEP.MES"  ! Sweep Measurement Setup File Name
1750     Save_file$=TIME$(TIMEDATE)! File Name for saving measurement results
1760     Save_file$="D"&Save_file$[1,2]&Save_file$[4,5]&Save_file$[7,7]&".DAT"
1770    !
1780     Type$="NMOS"              ! Type  NMOS -- P bulk,  PMOS -- N bulk
1790     Vuse=5                    ! Vuse (V)
1800     Ramp_rate=.5*1.E+6        ! Ramp rate (MV/cm*s)
1810     Tox=160*1.E-8             ! Oxide Thickness  (cm)
1820     Area=.001                 ! Gate Area (cm^2)
1830     Vstart=5                  ! Start voltage (V)
1840     Vstop=24                  ! Stop voltage (V)
1850     Vstep=.05                 ! Step voltage (V)
1860     Iexpect=.003              ! Expected breakdown current (A)
1870     Igcomp=.05                ! Ig compliance (A)
1880     Tp=1                      ! Type parameter
1890     IF Type$="NMOS" THEN Tp=-1! Type parameter
1900     Step_time=Vstep/(Ramp_rate*Tox)-.0011     ! Step time
1910     Step_delay_t=Step_time/2                  ! Step Delay time
1920     Step_keep_t=Step_time-Step_delay_t        ! Step Keep time
1930    !
1940    !------  Input parameters check routine -----------
1950     IF Ramp_rate<.1*1.E+6 THEN                 ! parameter check
1960       DISP "Para ERROR : Ramp rate is too small."
1970       STOP
1980     END IF 
1990    !
2000     IF Ramp_rate>1.E+6 THEN
2010       DISP "Para ERROR : Ramp rate is too large."
2020       STOP
2030     END IF 
2040    !
2050     IF Vstop/Tox>15*1.E+6 THEN
2060       DISP "Para ERROR : Maximum E field is too large. Lessen Vstop."
2070       STOP
2080     END IF 
2090    !
2100     IF Iexpect*10>Igcomp THEN
2110       DISP "Para ERROR : Igcomp is too small"
2120       STOP
2130     END IF 
2140    !
2150     IF Step_time>.1 THEN               ! Step time check routine
2160       DISP "Para ERROR : Step time is too large. (Reduce Vstep or Increase Ramp rate.)"
2170       STOP
2180     END IF 
2190    !
2200   SUBEND
2210    !
2220 Init_hp4155:SUB Init_hp4155
2230     COM @Hp4155
2240    !
2250     CLEAR SCREEN
2260     CLEAR @Hp4155
2270     OUTPUT @Hp4155;"*RST"
2280     OUTPUT @Hp4155;"*CLS"
2290     OUTPUT @Hp4155;":STAT:PRES"
2300     OUTPUT @Hp4155;"*ESE 60;*SRE 32;*OPC?"
2310     ENTER @Hp4155;A
2320     OUTPUT @Hp4155;":DISP:WIND:ALL BST"
2330     OUTPUT @Hp4155;":DISP OFF"
2340     PRINT "   <<< Voltage Ramp Test >>>"
2350   SUBEND
2360    !
2370 Get_file:SUB Get_file
2380     COM @Hp4155
2390     COM /File_name/ Init_file$,Sweep_file$,Save_file$
2400    !
2410     OUTPUT @Hp4155;":MMEM:COPY '"&Init_file$&"','DISK','MEM1.MES','MEMORY'"
2420     OUTPUT @Hp4155;":MMEM:COPY '"&Sweep_file$&"','DISK','MEM2.MES','MEMORY'"
2430   SUBEND
2440    !
2450 Init_fin_test:SUB Init_fin_test(I_or_f$,Result$)
2460     COM @Hp4155
2470     COM /Para/ Vuse,Ramp_rate,Tox,Area,Vstart,Vstop,Vstep,Iexpect,Igcomp,Tp,Step_time,Step_delay_t,Step_keep_t
2480    !
2490     IF I_or_f$="Init" THEN
2500       PRINT "[1] Initial Test"
2510     ELSE 
2520       PRINT "[3] Final Test"
2530     END IF 
2540     OUTPUT @Hp4155;":MMEM:LOAD:STAT 0,'MEM1.MES','MEMORY'"
2550     OUTPUT @Hp4155;":PAGE:MEAS:SAMP:CONS:SMU1 "&VAL$(Tp*Vuse)
2560     OUTPUT @Hp4155;":PAGE:GLIS"
2570     OUTPUT @Hp4155;":DISP ON"
2580     OUTPUT @Hp4155;":PAGE:SCON:SING"
2590     OUTPUT @Hp4155;"*OPC?"
2600     ENTER @Hp4155;A
2610     OUTPUT @Hp4155;":DISP OFF"   ! Display lock
2620    !
2630     OUTPUT @Hp4155;":TRAC? 'Ig'"
2640     ENTER @Hp4155;Ig
2650     PRINT "       Ig = ";Ig;"[A]"
2660     IF ABS(Ig)>1.E-6 THEN
2670       Result$="YES"
2680     ELSE 
2690       Result$="NO"
2700     END IF 
2710     PRINT "Result$(init fin)=";Result$
2720   SUBEND
2730    !
2740 Sweep_test:SUB Sweep_test(Result$,Vdb,Qbd)
2750     COM @Hp4155
2760     COM /Para/ Vuse,Ramp_rate,Tox,Area,Vstart,Vstop,Vstep,Iexpect,Igcomp,Tp,Step_time,Step_delay_t,Step_keep_t
2770    !
2780     PRINT "[2] Constant Step Time Sweep Test"
2790     OUTPUT @Hp4155;":MMEM:LOAD:STAT 0,'MEM2.MES','MEMORY'" ! Load Sweep Meas file
2800    !
2810    !------ Update setting --------------------------------------------
2820     OUTPUT @Hp4155;":PAGE:CHAN:UFUN:DEF 'Time','sec','@INDEX*"&VAL$(Step_time)&"'"
2830     OUTPUT @Hp4155;":PAGE:MEAS:SWE:DELay "&VAL$(Step_delay_t)! update delay
2840     OUTPUT @Hp4155;":PAGE:MEAS:OSEQ:TRIG:TIME "&VAL$(Step_keep_t)! keep time
2850     OUTPUT @Hp4155;":PAGE:MEAS:SWE:VAR1:STAR "&VAL$(Tp*Vstart)   ! Vstart
2860     OUTPUT @Hp4155;":PAGE:MEAS:SWE:VAR1:STOP "&VAL$(Tp*Vstop)    ! Vstop
2870     OUTPUT @Hp4155;":PAGE:MEAS:SWE:VAR1:STEP "&VAL$(Tp*Vstep)    ! Vstep
2880     OUTPUT @Hp4155;":PAGE:MEAS:SWE:VAR1:COMP "&VAL$(Igcomp)      ! Igcomp
2890     OUTPUT @Hp4155;":PAGE:MEAS:SWE:CONS:SMU4:COMP "&VAL$(.1)     ! Igcomp
2900     Irange_chk(Igcomp,Range)                         ! check proper range
2910     OUTPUT @Hp4155;":PAGE:MEAS:MSET:SMU1:RANGE "&VAL$(Range)
2920     OUTPUT @Hp4155;":PAGE:MEAS:MSET:SMU4:RANGE "&VAL$(Range)
2930    !
2940     OUTPUT @Hp4155;":PAGE:DISP:SET:GRAP:X:MAX "&VAL$(((Vstop-Vstart)/Vstep)*Step_time)
2950     OUTPUT @Hp4155;":PAGE:DISP:SET:GRAP:Y1:MIN "&VAL$(Tp*1.E-12)
2960     OUTPUT @Hp4155;":PAGE:DISP:SET:GRAP:Y1:MAX "&VAL$(Tp*Igcomp*10)
2970     OUTPUT @Hp4155;":PAGE:DISP:SET:GRAP:Y2:MIN "&VAL$(Tp*Vstart)
2980     OUTPUT @Hp4155;":PAGE:DISP:SET:GRAP:Y2:MAX "&VAL$(Tp*Vstop)
2990    !
3000     OUTPUT @Hp4155;":PAGE:GLIS"        ! change the display page to GRAPH
3010     OUTPUT @Hp4155;":DISP ON"          ! Display unlock
3020     OUTPUT @Hp4155;":PAGE:SCON:SING"   ! Start SINGLE measurement
3030     REPEAT
3040       OUTPUT @Hp4155;":PAGE:SCON:STAT?"! Query operation status
3050       ENTER @Hp4155;Stat$              ! Char data returned.
3060     UNTIL Stat$<>"MEAS"
3070     OUTPUT @Hp4155;":DISP OFF"         ! Display lock
3080    !
3090    !------ Check if breakdown occurred -------------------------
3100     IF Tp=1 THEN
3110       OUTPUT @Hp4155;":PAGE:DISP:ANAL:MARK:POS 'Ig','MAX(Ig)'"! mkr to Igmax
3120     ELSE 
3130       OUTPUT @Hp4155;":PAGE:DISP:ANAL:MARK:POS 'Ig','MIN(Ig)'"! mkr to Igmax
3140     END IF 
3150     OUTPUT @Hp4155;":PAGE:GLIS:GRAP:AAN"                    ! Auto Anlysis
3160     OUTPUT @Hp4155;":PAGE:GLIS:LIST:MARK:DIR? 'Ig'"         ! Trace Igmax
3170     ENTER @Hp4155;Igmax                                     !
3180     OUTPUT @Hp4155;":STAT:MEAS?"       ! Query meas status
3190     ENTER @Hp4155;Meas_stat            ! Decimal data returned
3200     OUTPUT @Hp4155;":PAGE:DISP:ANAL:MARK:POS 'Ig','"&VAL$(Tp*Iexpect*10)&"'"
3210                                         ! Set auto analysis to detect Ig
3220     OUTPUT @Hp4155;":PAGE:GLIS:GRAP:AAN"                    ! Auto Anlysis
3230     OUTPUT @Hp4155;":MMEM:STOR:TRAC DEF,'MEM3.DAT','MEMORY'"! Save to mem
3240    !
3250     IF Meas_stat>=8 OR ABS(Igmax)>=ABS(Iexpect*10) THEN ! Check if compliance or brk
3260       Result$="YES"
3270      !
3280       OUTPUT @Hp4155;":DATA? 'Vbd'"    ! Trace Vbd
3290       ENTER @Hp4155;Vbd
3300       OUTPUT @Hp4155;":PAGE:DISP:SET:LIST:SEL 'Qbd'"
3310       OUTPUT @Hp4155;":PAGE:GLIS:LIST:MARK:DIR? 'Qbd'"! Trace marker value
3320       ENTER @Hp4155;Qbd                               ! Qbd
3330       PRINT "       Vbd = ";Vbd;"[V]"
3340       PRINT "       Qbd = ";Qbd;"[C]"
3350       PRINT "       qbd = ";Qbd/Area;"[C/cm^2]"
3360     ELSE 
3370       Result$="NO"
3380       OUTPUT @Hp4155;":TRAC? '@MY1'"
3390       ENTER @Hp4155;Ig_sw
3400       PRINT "       Ig @brkdwn = ";Ig_sw;"[A]"
3410     END IF 
3420   SUBEND
3430    !
3440 Judge:SUB Judge(Result_init$,Result_sw$,Result_fin$)
3450     COM @Hp4155
3460    !
3470     DISP 
3480     IF Result_init$="YES" THEN
3490       PRINT "        ### Initial Failure (1) ###"
3500       DISP "         ### Initial Failure (1) ###"
3510       CALL Save_data
3520       STOP
3530     END IF 
3540    !
3550     IF Result_sw$="YES" OR Result_sw$="NO" THEN ! If ramp test is performed ...
3560       OUTPUT @Hp4155;":MMEM:LOAD:TRAC DEF,'MEM3.DAT','MEMORY'"
3570       OUTPUT @Hp4155;":PAGE:GLIS"
3580       OUTPUT @Hp4155;":DISP ON"
3590       OUTPUT @Hp4155;":DISP OFF"
3600     END IF 
3610    !
3620     SELECT Result_sw$
3630     CASE "YES"
3640       IF Result_fin$="YES" THEN
3650         PRINT "      ### Catastrophic Failure (2) ###"
3660         DISP "       ### Catastrophic Failure (2) ###"
3670       ELSE 
3680         PRINT "      ### Noncatastrophic Failure (4) ###"
3690         DISP "       ### Noncatastrophic Failure (4) ###"
3700       END IF 
3710     CASE "NO"
3720       IF Result_fin$="YES" THEN
3730         PRINT "      ### Masked Catastrophic Failure (3) ###"
3740         DISP "       ### Masked Catastrophic Failure (3) ###"
3750       ELSE 
3760         PRINT "      ### Others (5) ###"
3770         DISP "       ### Others (5) ###"
3780       END IF 
3790     END SELECT 
3800   SUBEND
3810    !
3820 Save_data: SUB Save_data
3830     COM @Hp4155
3840     COM /File_name/ Init_file$,Sweep_file$,Save_file$
3850    !
3860     OUTPUT @Hp4155;":MMEM:STOR:TRAC DEF,'"&Save_file$&"','DISK'"
3870     OUTPUT @Hp4155;"*OPC?"
3880     ENTER @Hp4155;A
3890     PRINT "  ---  Measurement Completed  ------        "
3900     PRINT "Save Data File Name : ";Save_file$
3910     PRINT "Test End : ";DATE$(TIMEDATE);",";TIME$(TIMEDATE)
3920     OUTPUT @Hp4155;":PAGE:GLIS"
3930     OUTPUT @Hp4155;":DISP ON"
3940   SUBEND
3950    !
3960 Err_check:SUB Err_check
3970     COM @Hp4155
3980     COM /Err/ Err_num(*),Err_message$(*)
3990     INTEGER I,J
4000    !
4010     OUTPUT @Hp4155;":PAGE:SCON:STOP"
4020     I=0
4030     REPEAT
4040       I=I+1
4050       OUTPUT @Hp4155;":SYST:ERR?"
4060       ENTER @Hp4155;Err_num(I),Err_message$(I)
4070     UNTIL Err_num(I)=0
4080    !
4090     IF I=1 THEN
4100       PRINT "No Error"
4110     ELSE 
4120       PRINT 
4130       PRINT 
4140       FOR J=1 TO I-1
4150         PRINT "### ERROR Occurred ###:";Err_num(J);Err_message$(J)
4160         DISP "### ERROR Occurred ###:";Err_num(J);Err_message$(J)
4170       NEXT J
4180       OUTPUT @Hp4155;"DISP ON"
4190       PRINT 
4200       PRINT "              === Test Aborted ==="
4210       STOP
4220     END IF 
4230   SUBEND
4240  !
4250 Irange_chk:SUB Irange_chk(Value,Range)
4260   ! This subprogram returns appropriate range of specified value.
4270     IF Value>.1 THEN Range=1
4280     IF Value<=.1 AND Value>.01 THEN Range=.1
4290     IF Value<=.01 AND Value>.001 THEN Range=.01
4300     IF Value<=.001 AND Value>.0001 THEN Range=.001
4310     IF Value<=.0001 AND Value>1.E-5 THEN Range=.0001
4320     IF Value<=1.E-5 AND Value>1.E-6 THEN Range=1.E-5
4330     IF Value<=1.E-6 AND Value>1.E-7 THEN Range=1.E-6
4340     IF Value<=1.E-7 AND Value>1.E-8 THEN Range=1.E-7
4350     IF Value<=1.E-8 AND Value>1.E-9 THEN Range=1.E-8
4360     IF Value<=1.E-9 AND Value>1.E-10 THEN Range=1.E-9
4370     IF Value<=1.E-10 AND Value>1.E-11 THEN Range=1.E-10
4380     IF Value<=1.E-11 AND Value>1.E-12 THEN Range=1.E-11
4390     IF Value<=1.E-12 THEN Range=1.E-12
4400   SUBEND
