1000  !****************************************************
1010  !*
1020  !* FILE       : ANALYSIS
1030  !* DESCRIPTION: Program for DC Drain Avalanche
1040  !*              Hot Carrier Induced Degradation
1050  !*              Data Analysis
1090  !* PRODUCT    : 4155,4156
1100  !* REVISION   : Rev.A.02.03
1110  !*
1120  !*   (c) Copyright Agilent Technologies 1994, 1995
1130  !*              All right 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  !/////////// PROGRAM TO DISPLAY STRESS GRAPH ////////
1480  COM @Hp415x,@Form_off
1490  COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(1:12),Result(1:12)
1500  COM /Meas_info2/ REAL Vdstr,Vgstr,Gate_length,Gate_width
1510  COM /File_name1/ Idlin_data$[4],Gmmax_data$[4],Vtext_data$[4],Vtci_data$[4]
1520  COM /File_name2/ Save_file$[6]
1530  COM /Meas_data1/ INTEGER Data_points(1:12),REAL Meas_str_time(1:12,1:82)
1540  COM /Meas_data2/ REAL Idlin_init(1:12),Gmmax_init(1:12),Vtext_init(1:12),Vtci_init(1:12)
1550  COM /Meas_data3/ REAL Idlin_shift(1:12,1:82),Gmmax_shift(1:12,1:82)
1560  COM /Meas_data4/ REAL Vtext_shift(1:12,1:82),Vtci_shift(1:12,1:82)
1570  COM /Ana_data1/ REAL Tdc_idlin(1:12),Tdc_gmmax(1:12),Tdc_vtext(1:12),Tdc_vtci(1:12)
1580  COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
1590  !
1600  Hpib_sc=8
1610  Hpib_addr=0
1620  ASSIGN @Hp415x TO Hpib_sc*100+Hpib_addr
1630  ASSIGN @Form_off TO Hpib_sc*100+Hpib_addr;FORMAT OFF
1640  !
1650  ! --------------- Input Parameters ---------------
1660  No_of_devices=4                        ! Number of devices to be evaluated
1670  !
1680  ! ---------- Flag to PAUSE program after each Tdc analysis --------------
1690  ! If the following flag is 1, this program is paused
1700  ! after drawing Shift parameter v.s. Stress time graph.
1710  ! During pause, you can manually save analyzed data to
1720  ! a DAT file. Then press continue. If you don't want to
1730  ! PAUSE program, change following flag to 0.
1740  Pause_to_save=1
1750  !
1760  ! ---------- Save ASCII file name ---------------------------------------
1770  Save_file$="ANAHCI"
1780  !
1790  ! ---------- Get file name ----------------------------------------------
1800  Idlin_data$="ID"           ! Idlin shift data file name
1810  Gmmax_data$="GM"           ! Gmmax shift data file name
1820  Vtext_data$="VTE"          ! Vtext shift data file name
1830  Vtci_data$="VTI"           ! Vtci shift data file name
1840  !
1850  ! ---------- Specify input parameters -----------------------------------
1860  OUTPUT @Hp415x;":DISP:WIND:ALL BAS"    ! All IBASIC screen
1870  !
1880  PRINT "Enter number of devices"
1890  INPUT No_of_devices
1900  CLEAR SCREEN
1910  !
1920  ON KEY 1 LABEL "Idlin" GOTO Idlin
1930  ON KEY 2 LABEL "Gmmax" GOTO Gmmax
1940  ON KEY 3 LABEL "Vtext" GOTO Vtext
1950  ON KEY 4 LABEL "Vtci" GOTO Vtci
1960  ON KEY 5 LABEL "ALL" GOTO All
1970  ON KEY 6 LABEL "" GOTO Loop
1980  ON KEY 7 LABEL "END " GOTO End
1990 Loop: !
2000  LOOP
2010  END LOOP 
2020 Idlin: !
2030  Choice=1
2040  GOTO Start_analysis
2050 Gmmax:!
2060  Choice=2
2070  GOTO Start_analysis
2080 Vtext:!
2090  Choice=3
2100  GOTO Start_analysis
2110 Vtci:!
2120  Choice=4
2130  GOTO Start_analysis
2140 All: !
2150  Choice=0
2160  GOTO Start_analysis
2170  !//////////////////// Main ////////////////////
2180  !
2190 Start_analysis: !
2200  CALL Init_setting            ! Initial setting
2210  !
2220  FOR Device=1 TO No_of_devices
2230  !
2240    IF Invalid(Device)=0 THEN  ! Skip analysis if invalid
2250  !
2260  ! -------- Idlin Shift Analysis --------
2270      IF Choice=1 OR Choice=0 THEN
2280        CALL Trans_iddata      ! Transfer Idlin_shift test data
2290        CALL Stress_idgraph    ! Draw shift vs stress graph
2300        CALL Analysis1(1)      ! Determine Tdc by linear interpolation
2310        IF Pause_to_save=1 THEN
2320          DISP "Save analyzed data. Then press Continue"
2330          PAUSE
2340          DISP 
2350        END IF 
2360      END IF 
2370  !
2380  ! -------- Gmmax Shift Analysis --------
2390      IF Choice=2 OR Choice=0 THEN
2400        CALL Trans_gmdata      ! Transfer Gmmax_shift test data
2410        CALL Stress_gmgraph    ! Draw shift vs stress graph
2420        CALL Analysis1(2)      ! Determine Tdc by linear interpolation
2430        IF Pause_to_save=1 THEN
2440          DISP "Save analyzed data. Then press Continue"
2450          PAUSE
2460          DISP 
2470        END IF 
2480      END IF 
2490  !
2500  ! -------- Vtext Shift Analysis --------
2510      IF Choice=3 OR Choice=0 THEN
2520        CALL Trans_vtedata     ! Transfer vtext_shift test data
2530        CALL Stress_vtegraph   ! Draw shift vs stress graph
2540        CALL Analysis2(3)      ! Determine Tdc by linear interpolation
2550        IF Pause_to_save=1 THEN
2560          DISP "Save analyzed data. Then press Continue"
2570          PAUSE
2580          DISP 
2590        END IF 
2600      END IF 
2610  !
2620  ! -------- Vtci Shift Analysis --------
2630      IF Choice=4 OR Choice=0 THEN
2640        CALL Trans_vtidata     ! Transfer vtci_shift test data
2650        CALL Stress_vtigraph   ! Draw shift vs stress graph
2660        CALL Analysis2(4)      ! Determine Tdc by linear interpolation
2670        IF Pause_to_save=1 THEN
2680          DISP "Save analyzed data. Then press Continue"
2690          PAUSE
2700          DISP 
2710        END IF 
2720      END IF 
2730  !
2740    END IF 
2750  !
2760  NEXT Device
2770  !
2780  CALL Calculate               ! Calculate average Tdc
2790  CALL Save_calc_data          ! Save calculated data to ASCII file
2800  CALL Print_calc_data         ! Print calculated data on IBASIC screen
2810  !
2820 End: !
2830  CALL Test_end                ! End of Test
2840  DISP "Analysis is completed!"
2850  !
2860  END
2870  ! ///////////////// Sub //////////////////////
2880 Init_setting:SUB Init_setting
2890  !
2900    COM @Hp415x,@Form_off
2910    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
2920    COM /Meas_info2/ REAL Vdstr,Vgstr,Gate_length,Gate_width
2930    COM /File_name1/ Idlin_data$,Gmmax_data$,Vtext_data$,Vtci_data$
2940    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
2950    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
2960    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
2970    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
2980    COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
2990    COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
3000    !
3010    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! IBASIC status screen
3020    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
3030    !
3040    FOR Device=1 TO No_of_devices
3050      IF Choice=1 OR Choice=0 THEN         ! Get Idlin measurement date
3060        File$=Idlin_data$&VAL$(Device)
3070        ASSIGN @File TO File$;FORMAT ON
3080        ENTER @File;Vdstr,Vgstr,Gate_length,Gate_width
3090        ENTER @File;Data_points(Device),Idlin_init(Device)
3100        IF Data_points(Device)=0 THEN
3110          Invalid(Device)=1
3120        ELSE 
3130          Invalid(Device)=0
3140          DISP "Getting data."
3150          ALLOCATE Shift_data(1:Data_points(Device)),Time_data(1:Data_points(Device))
3160          ENTER @File;Shift_data(*)
3170          ENTER @File;Time_data(*)
3180          FOR I=1 TO Data_points(Device)
3190            Idlin_shift(Device,I)=Shift_data(I)
3200            Meas_str_time(Device,I)=Time_data(I)
3210          NEXT I
3220          DEALLOCATE Shift_data(*),Time_data(*)
3230        END IF 
3240        ASSIGN @File TO *
3250      END IF 
3260  !
3270      IF Choice=2 OR Choice=0 THEN         ! Get Gmmax measurement data
3280        File$=Gmmax_data$&VAL$(Device)
3290        ASSIGN @File TO File$;FORMAT ON
3300        ENTER @File;Vdstr,Vgstr,Gate_length,Gate_width
3310        ENTER @File;Data_points(Device),Gmmax_init(Device)
3320        IF Data_points(Device)=0 THEN
3330          Invalid(Device)=1
3340        ELSE 
3350          Invalid(Device)=0
3360          ALLOCATE Shift_data(1:Data_points(Device)),Time_data(1:Data_points(Device))
3370          ENTER @File;Shift_data(*)
3380          ENTER @File;Time_data(*)
3390          FOR I=1 TO Data_points(Device)
3400            Gmmax_shift(Device,I)=Shift_data(I)
3410            Meas_str_time(Device,I)=Time_data(I)
3420          NEXT I
3430          DEALLOCATE Shift_data(*),Time_data(*)
3440        END IF 
3450        ASSIGN @File TO *
3460      END IF 
3470  !
3480      IF Choice=3 OR Choice=0 THEN         ! Get Vtext measurement data
3490        File$=Vtext_data$&VAL$(Device)
3500        ASSIGN @File TO File$;FORMAT ON
3510        ENTER @File;Vdstr,Vgstr,Gate_length,Gate_width
3520        ENTER @File;Data_points(Device),Vtext_init(Device)
3530        IF Data_points(Device)=0 THEN
3540          Invalid(Device)=1
3550        ELSE 
3560          Invalid(Device)=0
3570          ALLOCATE Shift_data(1:Data_points(Device)),Time_data(1:Data_points(Device))
3580          ENTER @File;Shift_data(*)
3590          ENTER @File;Time_data(*)
3600          FOR I=1 TO Data_points(Device)
3610            Vtext_shift(Device,I)=Shift_data(I)
3620            Meas_str_time(Device,I)=Time_data(I)
3630          NEXT I
3640          DEALLOCATE Shift_data(*),Time_data(*)
3650        END IF 
3660        ASSIGN @File TO *
3670      END IF 
3680  !
3690      IF Choice=4 OR Choice=0 THEN         ! Get Vtci measurement data
3700        File$=Vtci_data$&VAL$(Device)
3710        ASSIGN @File TO File$;FORMAT ON
3720        ENTER @File;Vdstr,Vgstr,Gate_length,Gate_width
3730        ENTER @File;Data_points(Device),Vtci_init(Device)
3740        IF Data_points(Device)=0 THEN
3750          Invalid(Device)=1
3760        ELSE 
3770          Invalid(Device)=0
3780          ALLOCATE Shift_data(1:Data_points(Device)),Time_data(1:Data_points(Device))
3790          ENTER @File;Shift_data(*)
3800          ENTER @File;Time_data(*)
3810          FOR I=1 TO Data_points(Device)
3820            Vtci_shift(Device,I)=Shift_data(I)
3830            Meas_str_time(Device,I)=Time_data(I)
3840          NEXT I
3850          DEALLOCATE Shift_data(*),Time_data(*)
3860        END IF 
3870        ASSIGN @File TO *
3880      END IF 
3890  !
3900    NEXT Device
3910    DISP 
3920  SUBEND
3930  !
3940 Trans_iddata:SUB Trans_iddata          ! Transfer Idlin Data
3950  !
3960    COM @Hp415x,@Form_off
3970    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
3980    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
3990    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
4000    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
4010    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
4020    !
4030    ALLOCATE Id_shift_xfer(1:Data_points(Device))
4040    ALLOCATE Str_time_xfer(1:Data_points(Device))
4050    ALLOCATE Init_data(1:Data_points(Device))
4060    !
4070    FOR I=1 TO Data_points(Device)
4080      Id_shift_xfer(I)=Idlin_shift(Device,I)
4090      Str_time_xfer(I)=Meas_str_time(Device,I)
4100      Init_data(I)=Idlin_init(Device)
4110    NEXT I
4120    !
4130    IF MAX(Id_shift_xfer(*))>=10 THEN
4140      Result(Device)=1
4150    ELSE 
4160      Result(Device)=0
4170    END IF 
4180    !
4190    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
4200    OUTPUT @Hp415x;":TRAC:DEL:ALL"
4210    OUTPUT @Hp415x;":TRAC:DEF 'Stress',"&VAL$(Data_points(Device))
4220    OUTPUT @Hp415x;":TRAC:DEF 'IdINT',"&VAL$(Data_points(Device))
4230    OUTPUT @Hp415x;":TRAC:DEF 'IdSFT',"&VAL$(Data_points(Device))
4240    OUTPUT @Hp415x;":TRAC:UNIT 'Stress','sec'"
4250    OUTPUT @Hp415x;":TRAC:UNIT 'IdINT','A'"
4260    OUTPUT @Hp415x;":TRAC:UNIT 'IdSFT','%'"
4270    !
4280    OUTPUT @Hp415x;":FORM:DATA REAL,64"
4290    OUTPUT @Hp415x;":FORM:BORD NORM"
4300    OUTPUT @Hp415x;":TRAC 'IdINT',#0";
4310    OUTPUT @Form_off;Init_data(*),END
4320    OUTPUT @Hp415x;":TRAC 'Stress',#0";
4330    OUTPUT @Form_off;Str_time_xfer(*),END
4340    OUTPUT @Hp415x;":TRAC 'IdSFT',#0";
4350    OUTPUT @Form_off;Id_shift_xfer(*),END
4360    OUTPUT @Hp415x;":FORM:DATA ASCII"
4370    !
4380    DEALLOCATE Id_shift_xfer(*)
4390    DEALLOCATE Str_time_xfer(*)
4400    DEALLOCATE Init_data(*)
4410    !
4420  SUBEND
4430    !
4440 Trans_gmdata:SUB Trans_gmdata        ! Transfer Gmmax data
4450    !
4460    COM @Hp415x,@Form_off
4470    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
4480    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
4490    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
4500    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
4510    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
4520    !
4530    ALLOCATE Gm_shift_xfer(1:Data_points(Device))
4540    ALLOCATE Str_time_xfer(1:Data_points(Device))
4550    ALLOCATE Init_data(1:Data_points(Device))
4560    !
4570    FOR I=1 TO Data_points(Device)
4580      Gm_shift_xfer(I)=Gmmax_shift(Device,I)
4590      Str_time_xfer(I)=Meas_str_time(Device,I)
4600      Init_data(I)=Gmmax_init(Device)
4610    NEXT I
4620    !
4630    IF MAX(Gm_shift_xfer(*))=10 THEN
4640      Result(Device)=1
4650    ELSE 
4660      Result(Device)=0
4670    END IF 
4680    !
4690    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
4700    OUTPUT @Hp415x;":TRAC:DEL:ALL"
4710    OUTPUT @Hp415x;":TRAC:DEF 'Stress',"&VAL$(Data_points(Device))
4720    OUTPUT @Hp415x;":TRAC:DEF 'GmINT',"&VAL$(Data_points(Device))
4730    OUTPUT @Hp415x;":TRAC:DEF 'GmSFT',"&VAL$(Data_points(Device))
4740    OUTPUT @Hp415x;":TRAC:UNIT 'Stress','sec'"
4750    OUTPUT @Hp415x;":TRAC:UNIT 'GmINT','S'"
4760    OUTPUT @Hp415x;":TRAC:UNIT 'GmSFT','%'"
4770    !
4780    OUTPUT @Hp415x;":FORM:DATA REAL,64"
4790    OUTPUT @Hp415x;":FORM:BORD NORM"
4800    OUTPUT @Hp415x;":TRAC 'GmINT',#0";
4810    OUTPUT @Form_off;Init_data(*),END
4820    OUTPUT @Hp415x;":TRAC 'Stress',#0";
4830    OUTPUT @Form_off;Str_time_xfer(*),END
4840    OUTPUT @Hp415x;":TRAC 'GmSFT',#0";
4850    OUTPUT @Form_off;Gm_shift_xfer(*),END
4860    OUTPUT @Hp415x;":FORM:DATA ASCII"
4870    !
4880    DEALLOCATE Gm_shift_xfer(*)
4890    DEALLOCATE Str_time_xfer(*)
4900    DEALLOCATE Init_data(*)
4910    !
4920  SUBEND
4930    !
4940 Trans_vtedata:SUB Trans_vtedata          ! Transfer Vtext data
4950    COM @Hp415x,@Form_off
4960    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
4970    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
4980    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
4990    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
5000    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
5010    !
5020    ALLOCATE Vte_shift_xfer(1:Data_points(Device))
5030    ALLOCATE Str_time_xfer(1:Data_points(Device))
5040    ALLOCATE Init_data(1:Data_points(Device))
5050    !
5060    FOR I=1 TO Data_points(Device)
5070      Vte_shift_xfer(I)=Vtext_shift(Device,I)
5080      Str_time_xfer(I)=Meas_str_time(Device,I)
5090      Init_data(I)=Gmmax_init(Device)
5100    NEXT I
5110    !
5120    IF MAX(Vte_shift_xfer(*))>=.02 THEN
5130      Result(Device)=1
5140    ELSE 
5150      Result(Device)=0
5160    END IF 
5170    !
5180    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
5190    OUTPUT @Hp415x;":TRAC:DEL:ALL"
5200    OUTPUT @Hp415x;":TRAC:DEF 'Stress',"&VAL$(Data_points(Device))
5210    OUTPUT @Hp415x;":TRAC:DEF 'VteINT',"&VAL$(Data_points(Device))
5220    OUTPUT @Hp415x;":TRAC:DEF 'VteSFT',"&VAL$(Data_points(Device))
5230    OUTPUT @Hp415x;":TRAC:UNIT 'Stress','sec'"
5240    OUTPUT @Hp415x;":TRAC:UNIT 'VteINT','V'"
5250    OUTPUT @Hp415x;":TRAC:UNIT 'VteSFT','V'"
5260    !
5270    OUTPUT @Hp415x;":FORM:DATA REAL,64"
5280    OUTPUT @Hp415x;":FORM:BORD NORM"
5290    OUTPUT @Hp415x;":TRAC 'VteINT',#0";
5300    OUTPUT @Form_off;Init_data(*),END
5310    OUTPUT @Hp415x;":TRAC 'Stress',#0";
5320    OUTPUT @Form_off;Str_time_xfer(*),END
5330    OUTPUT @Hp415x;":TRAC 'VteSFT',#0";
5340    OUTPUT @Form_off;Vte_shift_xfer(*),END
5350    OUTPUT @Hp415x;":FORM:DATA ASCII"
5360    !
5370    DEALLOCATE Vte_shift_xfer(*)
5380    DEALLOCATE Str_time_xfer(*)
5390    DEALLOCATE Init_data(*)
5400    !
5410  SUBEND
5420    !
5430 Trans_vtidata:SUB Trans_vtidata           ! Transfer Vtci data
5440    !
5450    COM @Hp415x,@Form_off
5460    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
5470    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
5480    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
5490    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
5500    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
5510    !
5520    ALLOCATE Vti_shift_xfer(1:Data_points(Device))
5530    ALLOCATE Str_time_xfer(1:Data_points(Device))
5540    ALLOCATE Init_data(1:Data_points(Device))
5550    !
5560    FOR I=1 TO Data_points(Device)
5570      Vti_shift_xfer(I)=Vtci_shift(Device,I)
5580      Str_time_xfer(I)=Meas_str_time(Device,I)
5590      Init_data(I)=Vtci_init(Device)
5600    NEXT I
5610    !
5620    IF MAX(Vti_shift_xfer(*))>=.02 THEN
5630      Result(Device)=1
5640    ELSE 
5650      Result(Device)=0
5660    END IF 
5670    !
5680    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
5690    OUTPUT @Hp415x;":TRAC:DEL:ALL"
5700    OUTPUT @Hp415x;":TRAC:DEF 'Stress',"&VAL$(Data_points(Device))
5710    OUTPUT @Hp415x;":TRAC:DEF 'VtiINT',"&VAL$(Data_points(Device))
5720    OUTPUT @Hp415x;":TRAC:DEF 'VtiSFT',"&VAL$(Data_points(Device))
5730    OUTPUT @Hp415x;":TRAC:UNIT 'Stress','sec'"
5740    OUTPUT @Hp415x;":TRAC:UNIT 'VtiINT','V'"
5750    OUTPUT @Hp415x;":TRAC:UNIT 'VtiSFT','V'"
5760    !
5770    OUTPUT @Hp415x;":FORM:DATA REAL,64"
5780    OUTPUT @Hp415x;":FORM:BORD NORM"
5790    OUTPUT @Hp415x;":TRAC 'VtiINT',#0";
5800    OUTPUT @Form_off;Init_data(*),END
5810    OUTPUT @Hp415x;":TRAC 'Stress',#0";
5820    OUTPUT @Form_off;Str_time_xfer(*),END
5830    OUTPUT @Hp415x;":TRAC 'VtiSFT',#0";
5840    OUTPUT @Form_off;Vti_shift_xfer(*),END
5850    OUTPUT @Hp415x;":FORM:DATA ASCII"
5860    !
5870    DEALLOCATE Vti_shift_xfer(*)
5880    DEALLOCATE Str_time_xfer(*)
5890    DEALLOCATE Init_data(*)
5900    !
5910  SUBEND
5920    !
5930 Stress_idgraph:SUB Stress_idgraph        ! Draw graph of Idlin shift
5940    !
5950    COM @Hp415x,@Form_off
5960    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
5970    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
5980    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
5990    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
6000    DIM Comment$[58]
6010    !
6020    Comment$="HCI Idlin Shift(Str="&VAL$(Meas_str_time(Device,Data_points(Device)))
6030    Comment$=Comment$&"sec, Device="&VAL$(Device)&")"
6040    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"
6050    !
6060    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'Stress'"
6070    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'IdSFT'"
6080    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"
6090    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:SCAL LOG"
6100    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MIN "&VAL$(MIN(Meas_str_time(Device,1),10))
6110    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MAX "&VAL$(MAX(Meas_str_time(Device,Data_points(Device)),100))
6120    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:SCAL LOG"
6130    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MIN "&VAL$(MIN(Idlin_shift(Device,1),.01))
6140    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MAX "&VAL$(MAX(Idlin_shift(Device,Data_points(Device)),100.))
6150    !
6160    OUTPUT @Hp415x;":PAGE:DISP:DVAR:DEL:ALL"
6170    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'IdINT'"
6180    !
6190    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE1:MODE DIS"
6200    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE2:MODE DIS"
6210    OUTPUT @Hp415x;":PAGE:DISP:ANAL:MARK:DIS"
6220    !
6230    OUTPUT @Hp415x;":PAGE:GLIS:INT OFF"
6240    OUTPUT @Hp415x;":PAGE:GLIS:LINE OFF"
6250    OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
6260    OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X MAX"
6270    DISP "DEVICE No = ";Device
6280    !
6290  SUBEND
6300    !
6310 Stress_gmgraph:SUB Stress_gmgraph        ! Draw graph of Gmmax shift
6320    !
6330    COM @Hp415x,@Form_off
6340    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
6350    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
6360    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
6370    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
6380    DIM Comment$[58]
6390    !
6400    Comment$="HCI Gmmax Shift(Str="&VAL$(Meas_str_time(Device,Data_points(Device)))
6410    Comment$=Comment$&"sec, Device="&VAL$(Device)&")"
6420    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"
6430    !
6440    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'Stress'"
6450    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'GmSFT'"
6460    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"
6470    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:SCAL LOG"
6480    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MIN "&VAL$(MIN(Meas_str_time(Device,1),10))
6490    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MAX "&VAL$(MAX(Meas_str_time(Device,Data_points(Device)),100))
6500    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:SCAL LOG"
6510    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MIN "&VAL$(MIN(Gmmax_shift(Device,1),.1))
6520    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MAX "&VAL$(MAX(Gmmax_shift(Device,Data_points(Device)),100.))
6530    !
6540    OUTPUT @Hp415x;":PAGE:DISP:DVAR:DEL:ALL"
6550    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'GmINT'"
6560    !
6570    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE1:MODE DIS"
6580    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE2:MODE DIS"
6590    OUTPUT @Hp415x;":PAGE:DISP:ANAL:MARK:DIS"
6600    !
6610    OUTPUT @Hp415x;":PAGE:GLIS:INT OFF"
6620    OUTPUT @Hp415x;":PAGE:GLIS:LINE OFF"
6630    OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
6640    OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X MAX"
6650    DISP "DEVICE No = ";Device
6660    !
6670  SUBEND
6680    !
6690 Stress_vtegraph:SUB Stress_vtegraph      !  Draw graph of Vtext shift
6700    !
6710    COM @Hp415x,@Form_off
6720    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
6730    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
6740    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
6750    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
6760    DIM Comment$[58]
6770    !
6780    Comment$="HCI Vtext Shift(Str="&VAL$(Meas_str_time(Device,Data_points(Device)))
6790    Comment$=Comment$&"sec, Device="&VAL$(Device)&")"
6800    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"
6810    !
6820    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'Stress'"
6830    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'VteSFT'"
6840    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"
6850    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:SCAL LOG"
6860    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MIN "&VAL$(MIN(Meas_str_time(Device,1),10))
6870    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MAX "&VAL$(MAX(Meas_str_time(Device,Data_points(Device)),100))
6880    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:SCAL LOG"
6890    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MIN "&VAL$(MIN(Vtext_shift(Device,1),1.E-6))
6900    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MAX "&VAL$(MAX(Vtext_shift(Device,Data_points(Device)),.1))
6910    !
6920    OUTPUT @Hp415x;":PAGE:DISP:DVAR:DEL:ALL"
6930    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'VteINT'"
6940    !
6950    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE1:MODE DIS"
6960    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE2:MODE DIS"
6970    OUTPUT @Hp415x;":PAGE:DISP:ANAL:MARK:DIS"
6980    !
6990    OUTPUT @Hp415x;":PAGE:GLIS:INT OFF"
7000    OUTPUT @Hp415x;":PAGE:GLIS:LINE OFF"
7010    OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
7020    OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X MAX"
7030    DISP "DEVICE No = ";Device
7040    !
7050  SUBEND
7060    !
7070 Stress_vtigraph:SUB Stress_vtigraph      ! Draw graph of Vci shift
7080    !
7090    COM @Hp415x,@Form_off
7100    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
7110    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
7120    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
7130    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
7140    DIM Comment$[58]
7150    !
7160    Comment$="HCI Vtci Shift(Str="&VAL$(Meas_str_time(Device,Data_points(Device)))
7170    Comment$=Comment$&"sec, Device="&VAL$(Device)&")"
7180    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"
7190    !
7200    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'Stress'"
7210    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'VtiSFT'"
7220    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"
7230    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:SCAL LOG"
7240    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MIN "&VAL$(MIN(Meas_str_time(Device,1),10))
7250    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:MAX "&VAL$(MAX(Meas_str_time(Device,Data_points(Device)),100))
7260    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:SCAL LOG"
7270    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MIN "&VAL$(MIN(Vtci_shift(Device,1),1.E-6))
7280    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:MAX "&VAL$(MAX(Vtci_shift(Device,Data_points(Device)),.1))
7290    !
7300    OUTPUT @Hp415x;":PAGE:DISP:DVAR:DEL:ALL"
7310    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'VtiINT'"
7320    !
7330    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE1:MODE DIS"
7340    OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE2:MODE DIS"
7350    OUTPUT @Hp415x;":PAGE:DISP:ANAL:MARK:DIS"
7360    !
7370    OUTPUT @Hp415x;":PAGE:GLIS:INT OFF"
7380    OUTPUT @Hp415x;":PAGE:GLIS:LINE OFF"
7390    OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
7400    OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X MAX"
7410    DISP "DEVICE No = ";Device
7420    !
7430  SUBEND
7440    !
7450 Analysis1:SUB Analysis1(INTEGER Para) !  Idlin/Gmmax Analysis
7460    COM @Hp415x,@Form_off
7470    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
7480    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
7490    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
7500    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
7510    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
7520    COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
7530    COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
7540    !
7550    OUTPUT @Hp415x;":DISP OFF"
7560    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Tdc','sec','@IX'"
7570    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'Tdc'"
7580    OUTPUT @Hp415x;":PAGE:GLIS:INT ON"
7590    !
7600    OUTPUT @Hp415x;":PAGE:GLIS:LINE:LSEL 1"
7610    OUTPUT @Hp415x;":PAGE:GLIS:LINE ON"
7620    !
7630    SELECT Result(Device)
7640    !
7650    CASE 1              ! Shift criterion is exceeded = Normal line
7660    !
7670      OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
7680      OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE NORM"
7690      OUTPUT @Hp415x;":PAGE:GLIS:CURS SHOR"
7700      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
7710      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
7720      OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
7730      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)-1))
7740      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
7750    !
7760    CASE ELSE           ! Shift criterion is not exceeded = Regression line
7770    !
7780      OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
7790      OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE REGR"
7800      OUTPUT @Hp415x;":PAGE:GLIS:CURS SHOR"
7810      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
7820      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
7830      OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
7840      IF Data_points(Device)>6 THEN
7850        OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)-6))
7860      ELSE 
7870        OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,1))
7880      END IF 
7890      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
7900    !
7910    END SELECT 
7920    !
7930    OUTPUT @Hp415x;":PAGE:GLIS:LINE:LSEL 2"
7940    OUTPUT @Hp415x;":PAGE:GLIS:LINE ON"
7950    OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE NORM"
7960    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:X "&VAL$(Meas_str_time(Device,1))
7970    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:Y1 10"
7980    OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
7990    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
8000    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:Y1 10"
8010    !
8020    OUTPUT @Hp415x;":DISP ON"
8030    !
8040    OUTPUT @Hp415x;":TRAC? 'Tdc'"
8050    IF Para=1 THEN
8060      ENTER @Hp415x;Tdc_idlin(Device)     ! Extract Tdc from Idlin data
8070    ELSE 
8080      ENTER @Hp415x;Tdc_gmmax(Device)     ! Extract Tdc from Gmmax data
8090    END IF 
8100    !
8110  SUBEND
8120    !
8130 Analysis2:SUB Analysis2(INTEGER Para)  ! Vtext/Vtci analysis
8140    COM @Hp415x,@Form_off
8150    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
8160    COM /Meas_data1/ INTEGER Data_points(*),REAL Meas_str_time(*)
8170    COM /Meas_data2/ REAL Idlin_init(*),Gmmax_init(*),Vtext_init(*),Vtci_init(*)
8180    COM /Meas_data3/ REAL Idlin_shift(*),Gmmax_shift(*)
8190    COM /Meas_data4/ REAL Vtext_shift(*),Vtci_shift(*)
8200    COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
8210    COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
8220    !
8230    OUTPUT @Hp415x;":DISP OFF"
8240    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Tdc','sec','@IX'"
8250    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'Tdc'"
8260    OUTPUT @Hp415x;":PAGE:GLIS:INT ON"
8270    !
8280    OUTPUT @Hp415x;":PAGE:GLIS:LINE:LSEL 1"
8290    OUTPUT @Hp415x;":PAGE:GLIS:LINE ON"
8300    !
8310    SELECT Result(Device)
8320    !
8330    CASE 1              ! Shift criterion is exceeded = Normal line
8340    !
8350      OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
8360      OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE NORM"
8370      OUTPUT @Hp415x;":PAGE:GLIS:CURS SHOR"
8380      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
8390      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
8400      OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
8410      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)-1))
8420      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
8430    !
8440    CASE ELSE           ! Shift criterion is not exceeded = Regression line
8450    !
8460      OUTPUT @Hp415x;":PAGE:GLIS:MARK ON"
8470      OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE REGR"
8480      OUTPUT @Hp415x;":PAGE:GLIS:CURS SHOR"
8490      OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
8500      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
8510      OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
8520      IF Data_points(Device)>6 THEN
8530        OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)-6))
8540      ELSE 
8550        OUTPUT @Hp415x;":PAGE:GLIS:MARK:DIR:X "&VAL$(Meas_str_time(Device,1))
8560      END IF 
8570      OUTPUT @Hp415x;":PAGE:GLIS:LINE:CTM"
8580    !
8590    END SELECT 
8600    !
8610    OUTPUT @Hp415x;":PAGE:GLIS:LINE:LSEL 2"
8620    OUTPUT @Hp415x;":PAGE:GLIS:LINE ON"
8630    OUTPUT @Hp415x;":PAGE:GLIS:LINE:MODE NORM"
8640    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:X "&VAL$(Meas_str_time(Device,1))
8650    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:Y1 20E-3"
8660    OUTPUT @Hp415x;":PAGE:GLIS:LINE:SCUR"
8670    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:X "&VAL$(Meas_str_time(Device,Data_points(Device)))
8680    OUTPUT @Hp415x;":PAGE:GLIS:CURS:DIR:Y1 20E-3"
8690    !
8700    OUTPUT @Hp415x;":DISP ON"
8710    !
8720    OUTPUT @Hp415x;":TRAC? 'Tdc'"
8730    IF Para=3 THEN
8740      ENTER @Hp415x;Tdc_vtext(Device)     ! Extract Tdc from Vtext data
8750    ELSE 
8760      ENTER @Hp415x;Tdc_vtci(Device)      ! Extract Tdc from Vtci data
8770    END IF 
8780  SUBEND
8790    !
8800 Calculate:SUB Calculate                  ! Calculate average Tdc
8810    !
8820    COM @Hp415x,@Form_off
8830    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
8840    COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
8850    COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
8860    INTEGER Valid_device_no
8870    REAL Ttl_tdc_idlin,Ttl_tdc_gmmax,Ttl_tdc_vtext,Ttl_tdc_vtci
8880    !
8890    Valid_device_no=0
8900    Ttl_tdc_idlin=0
8910    Ttl_tdc_gmmax=0
8920    Ttl_tdc_vtext=0
8930    Ttl_tdc_vtci=0
8940    !
8950    FOR Device=1 TO No_of_devices
8960      IF Invalid(Device)=0 THEN
8970        Valid_device_no=Valid_device_no+1
8980    !
8990        IF Choice=0 OR Choice=1 THEN
9000          Ttl_tdc_idlin=Ttl_tdc_idlin+Tdc_idlin(Device)
9010        END IF 
9020        IF Choice=0 OR Choice=2 THEN
9030          Ttl_tdc_gmmax=Ttl_tdc_gmmax+Tdc_gmmax(Device)
9040        END IF 
9050        IF Choice=0 OR Choice=3 THEN
9060          Ttl_tdc_vtext=Ttl_tdc_vtext+Tdc_vtext(Device)
9070        END IF 
9080        IF Choice=0 OR Choice=4 THEN
9090          Ttl_tdc_vtci=Ttl_tdc_vtci+Tdc_vtci(Device)
9100        END IF 
9110      END IF 
9120    NEXT Device
9130    !
9140    Avg_tdc_idlin=Ttl_tdc_idlin/Valid_device_no
9150    Avg_tdc_gmmax=Ttl_tdc_gmmax/Valid_device_no
9160    Avg_tdc_vtext=Ttl_tdc_vtext/Valid_device_no
9170    Avg_tdc_vtci=Ttl_tdc_vtci/Valid_device_no
9180    !
9190    !
9200  SUBEND
9210    !
9220 Save_calc_data:SUB Save_calc_data        ! Save calculated data to ASCII file
9230    !
9240    COM @Hp415x,@Form_off
9250    COM /File_name2/ Save_file$[6]
9260    COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
9270    COM /Meas_info2/ REAL Vdstr,Vgstr,Gate_length,Gate_width
9280    COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
9290    COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
9300    DISP "Saving ASCII file"
9310    ON ERROR GOSUB Error
9320    CREATE Save_file$,100
9330    OFF ERROR
9340    ASSIGN @File TO Save_file$;FORMAT ON
9350    !
9360    OUTPUT @File;No_of_devices
9370    OUTPUT @File;Vdstr,Vgstr,Gate_length,Gate_width
9380    !
9390    IF Choice=0 OR Choice=1 THEN
9400      OUTPUT @File;"Idlin"
9410      OUTPUT @File;"Device ";"Validity ","Tdc_idlin"
9420      FOR Device=1 TO No_of_devices
9430        OUTPUT @File;Device,Invalid(Device),Tdc_idlin(Device)
9440      NEXT Device
9450      OUTPUT @File;"Averaged Tdc_idlin ",Avg_tdc_idlin
9460    END IF 
9470    !
9480    IF Choice=0 OR Choice=2 THEN
9490      OUTPUT @File;"Gmmax"
9500      OUTPUT @File;"Device ";" Validity ";"Tdc_gmmax"
9510      FOR Device=1 TO No_of_devices
9520        OUTPUT @File;Device,Invalid(Device),Tdc_gmmax(Device)
9530      NEXT Device
9540      OUTPUT @File;"Averaged Tdc_gmmax ",Avg_tdc_gmmax
9550    END IF 
9560    !
9570    IF Choice=0 OR Choice=3 THEN
9580      OUTPUT @File;"Vtext"
9590      OUTPUT @File;"Device ";"Validity ";"Tdc_vtext"
9600      FOR Device=1 TO No_of_devices
9610        OUTPUT @File;Device,Invalid(Device),Tdc_vtext(Device)
9620      NEXT Device
9630      OUTPUT @File;"Averaged Tdc_vtext ",Avg_tdc_vtext
9640    END IF 
9650    !
9660    IF Choice=0 OR Choice=4 THEN
9670      OUTPUT @File;"Vtci "
9680      OUTPUT @File;"Device ";"Validity ";"Tdc_vtci "
9690    !
9700      FOR Device=1 TO No_of_devices
9710        OUTPUT @File;Device,Invalid(Device),Tdc_vtci(Device)
9720      NEXT Device
9730      OUTPUT @File;"Averaged Tdc_vtci  ",Avg_tdc_vtci
9740    END IF 
9750    !
9760    ASSIGN @File TO *
9770    DISP 
9780    !
9790    SUBEXIT
9800    !
9810 Error:   !
9820    !
9830    OUTPUT @Hp415x;":DISP:WIND:ALL BAS"    ! All IBASIC screen
9840    IF ERRN=56 THEN
9850      PRINT "Old";Save_file$;"exists. Purge old file and press [Continue]."
9860    ELSE 
9870      PRINT ERRM$
9880      PRINT "Take measure(s) to prevent the error and press [Continue]."
9890    END IF 
9900    PAUSE
9910    !
9920    CLEAR SCREEN
9930    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! Display IBASIC status screen
9940    !
9950    RETURN
9960  SUBEND
9970  !
9980 Print_calc_data:SUB Print_calc_data       ! Print calculated data on IBASIC screen
9990    !
10000   COM @Hp415x,@Form_off
10010   COM /Meas_info1/ INTEGER No_of_devices,Device,Choice,Invalid(*),Result(*)
10020   COM /Meas_info2/ REAL Vdstr,Vgstr,Gate_length,Gate_width
10030   COM /Ana_data1/ REAL Tdc_idlin(*),Tdc_gmmax(*),Tdc_vtext(*),Tdc_vtci(*)
10040   COM /Ana_data2/ REAL Avg_tdc_idlin,Avg_tdc_gmmax,Avg_tdc_vtext,Avg_tdc_vtci
10050   !
10060   PRINT "No of devices:";No_of_devices
10070   PRINT "Vdstr:";Vdstr,"Vgstr:";Vgstr
10080   PRINT "Gate length:";Gate_length,"Gate width:";Gate_width
10090   !
10100   IF Choice=0 OR Choice=1 THEN
10110     PRINT "Idlin"
10120     PRINT "Device    Validity    Tdc_idlin"
10130     FOR Device=1 TO No_of_devices
10140       PRINT Device,Invalid(Device),Tdc_idlin(Device)
10150     NEXT Device
10160     PRINT "Averaged Tdc_idlin:";Avg_tdc_idlin
10170   END IF 
10180   !
10190   IF Choice=0 OR Choice=2 THEN
10200     PRINT "Gmmax"
10210     PRINT "Device    Validity    Tdc_gmmax"
10220     FOR Device=1 TO No_of_devices
10230       PRINT Device,Invalid(Device),Tdc_gmmax(Device)
10240     NEXT Device
10250     PRINT "Averaged Tdc_gmmax:";Avg_tdc_gmmax
10260   END IF 
10270   !
10280   IF Choice=0 OR Choice=3 THEN
10290     PRINT "Vtext"
10300     PRINT "Device    Validity    Tdc_vtext"
10310     FOR Device=1 TO No_of_devices
10320       PRINT Device,Invalid(Device),Tdc_vtext(Device)
10330     NEXT Device
10340     PRINT "Averaged Tdc_vtext:";Avg_tdc_vtext
10350   END IF 
10360   !
10370   IF Choice=0 OR Choice=4 THEN
10380     PRINT "Vtci "
10390     PRINT "Device    Validity    Tdc_vtci"
10400     FOR Device=1 TO No_of_devices
10410       PRINT Device,Invalid(Device),Tdc_vtci(Device)
10420     NEXT Device
10430     PRINT "Averaged Tdc_vtci :";Avg_tdc_vtci
10440   END IF 
10450   !
10460   DISP 
10470   !
10480 SUBEND
10490 !
10500 Test_end:SUB Test_end
10510   COM @Hp415x,@Form_off
10520   !
10530   OUTPUT @Hp415x;"*RST"                   ! Device reset
10540   OUTPUT @Hp415x;"*CLS"                   ! Clear status data
10550   OUTPUT @Hp415x;":DISP:WIND:STAT ON"     ! Screen update on
10560   OUTPUT @Hp415x;":DISP:WIND:ALL BAS"     ! All IBASIC screen
10570   !
10580 SUBEND
