origen_testers 0.5.6 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/version.rb +1 -1
- data/lib/origen_testers/igxl_based_tester/base.rb +62 -6
- data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +965 -0
- data/lib/origen_testers/origen_ext/pins/pin.rb +78 -0
- data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -0
- data/lib/origen_testers.rb +3 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a52647531345037e756ea1413fad9e55af38d5e
|
4
|
+
data.tar.gz: d2f632b5f8fc173a407a367e44f76f11bff71a9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37665c194131cff9784e4eb867750aa1d44dc1f50fe899348696f6872ed5f3d8d096ca1b636ade17aaaf5a268af3be0380e4be7882b51d915c9123982581e4fe
|
7
|
+
data.tar.gz: 74af03290ef3057d9347294c75a028ff18d3784f9b1d9585e7c9ab5de6d93e6d508aa51b7e5a799ea5183aaf8d7d82bcfbd3eaf67ef12638fb68fc8a2ee8f747
|
data/config/version.rb
CHANGED
@@ -9,7 +9,8 @@ module OrigenTesters
|
|
9
9
|
attr_accessor :memory_test_en
|
10
10
|
attr_accessor :testerconfig
|
11
11
|
attr_accessor :channelmap
|
12
|
-
attr_accessor :
|
12
|
+
attr_accessor :default_channelmap
|
13
|
+
attr_accessor :default_testerconfig
|
13
14
|
|
14
15
|
# NOTE: DO NOT USE THIS CLASS DIRECTLY ONLY USED AS PARENT FOR
|
15
16
|
# DESIRED TESTER CLASS
|
@@ -64,9 +65,13 @@ module OrigenTesters
|
|
64
65
|
File.open(current_config_file, 'r').each_line do |line|
|
65
66
|
if line =~ /^\d*.0/
|
66
67
|
(slot, blank1, instrument, blank2, idprom) = line.split(/\t/)
|
67
|
-
|
68
|
+
if (!slot.nil?) && (!instrument.nil?) && (!idprom.nil?)
|
69
|
+
@testerconfig[testconfigname][slot.split('.').first.to_i] = slotnum.new(slot.split('.').first.to_i, instrument, idprom.chomp)
|
70
|
+
end
|
68
71
|
end
|
69
72
|
end
|
73
|
+
|
74
|
+
@default_testerconfig ||= testconfigname # Default TesterConfig gets set if it's not nil
|
70
75
|
end
|
71
76
|
|
72
77
|
def get_tester_instrument(testconfigname, slot)
|
@@ -106,8 +111,8 @@ module OrigenTesters
|
|
106
111
|
end
|
107
112
|
end
|
108
113
|
if index == 5
|
109
|
-
siteloc = line.split(/\t/).size -
|
110
|
-
@max_site_s = line.split(/\t/)[siteloc].split(/\s/)[1]
|
114
|
+
siteloc = line.strip.split(/\t/).size - 1 # strip all white spaces and grab second to last
|
115
|
+
@max_site_s = line.split(/\t/)[siteloc].strip.split(/\s/)[1]
|
111
116
|
@max_site = @max_site_s.to_i
|
112
117
|
(0..@max_site).each do |sitenum|
|
113
118
|
@channelmap[chanmapname][sitenum] ||= {}
|
@@ -116,11 +121,12 @@ module OrigenTesters
|
|
116
121
|
if index > 5
|
117
122
|
(blank1, pinname, packagepin, type) = line.split(/\t/)
|
118
123
|
(0..@max_site).each do |sitenum|
|
119
|
-
channel = line.split(/\t/)[4 + sitenum]
|
120
|
-
@channelmap[chanmapname][sitenum][pinname] = chanassignment.new(pinname, sitenum, channel.chomp, type, packagepin)
|
124
|
+
channel = line.split(/\t/)[4 + sitenum].to_s
|
125
|
+
@channelmap[chanmapname][sitenum][pinname.downcase.intern] = chanassignment.new(pinname.downcase.intern, sitenum, channel.chomp, type.chomp, packagepin)
|
121
126
|
end
|
122
127
|
end
|
123
128
|
end
|
129
|
+
@default_channelmap ||= chanmapname # Default Channelmap gets set if it's not nil
|
124
130
|
end
|
125
131
|
|
126
132
|
def get_tester_channel(chanmapname, pinname, sitenum)
|
@@ -132,6 +138,56 @@ module OrigenTesters
|
|
132
138
|
end
|
133
139
|
end
|
134
140
|
|
141
|
+
# Check if a specific pin for a given channelmap for a given site number is using merged channel.
|
142
|
+
# If yes, return x2 for Merged2, x4 for Merged4, etc. If no, return nil.
|
143
|
+
def merged_channels(chanmapname, pinname, sitenum)
|
144
|
+
if sitenum <= @max_site
|
145
|
+
if @channelmap[chanmapname][sitenum][pinname].type.include?('Merged')
|
146
|
+
@merged_channels = @channelmap[chanmapname][sitenum][pinname].type.split('Merged')[1]
|
147
|
+
return 'x' + @merged_channels
|
148
|
+
end
|
149
|
+
else
|
150
|
+
return nil
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Check if a specific HexVS supply is HexVS+ variety, which has +/-2mV accuracy as opposed to
|
155
|
+
# +/-7mV accuracy.
|
156
|
+
# If the specific HexVS is HexVS+ variety, returns a "+" string, otherwise nil.
|
157
|
+
def is_hexvs_plus(testconfigname, slot)
|
158
|
+
if @testerconfig[testconfigname][slot][:instrument].to_s == 'HexVS'
|
159
|
+
@productnum = @testerconfig[testconfigname][slot][:idprom].split(' ')[0]
|
160
|
+
if (@productnum.include?('974-294-')) && (@productnum.split('-')[2].to_i >= 20)
|
161
|
+
return '+'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
nil # if nothing matched
|
165
|
+
end
|
166
|
+
|
167
|
+
# Check if a specific VHDVS (UVS256) supply is High-Accuracy (HA) variety, which has +/-5mV+0.1%*SUPPLY accuracy as opposed to
|
168
|
+
# +/-10mV+0.1%*SUPPLY accuracy.
|
169
|
+
# If the specific VHDVS is of High-Accuracy variety, returns a "+" string, otherwise nil.
|
170
|
+
def is_vhdvs_plus(testconfigname, slot)
|
171
|
+
if @testerconfig[testconfigname][slot][:instrument].to_s == 'VHDVS'
|
172
|
+
@productnum = @testerconfig[testconfigname][slot][:idprom].split(' ')[0]
|
173
|
+
# binding.pry
|
174
|
+
if (@productnum.include?('805-052-')) && (@productnum.split('-')[2].to_i >= 05)
|
175
|
+
return '+'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
nil # if nothing matched
|
179
|
+
end
|
180
|
+
# Check if a specific VHDVS (UVS256) channel assignment is _HC variety (high-current)
|
181
|
+
# If the specific VHDVS channel is _HC variety, returns a "_HC" string, otherwise nil.
|
182
|
+
def is_vhdvs_hc(chanmapname, pinname, sitenum)
|
183
|
+
if sitenum <= @max_site
|
184
|
+
if @channelmap[chanmapname][sitenum][pinname].channel.downcase.include?('hc')
|
185
|
+
return '_HC'
|
186
|
+
end
|
187
|
+
end
|
188
|
+
nil # if nothing matched
|
189
|
+
end
|
190
|
+
|
135
191
|
def assign_dc_instr_pins(dc_pins)
|
136
192
|
if !dc_pins.is_a?(Array)
|
137
193
|
@dc_pins = [] << dc_pins
|
@@ -0,0 +1,965 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class UltraFLEX
|
4
|
+
class ATEHardware
|
5
|
+
attr_accessor :instrument
|
6
|
+
|
7
|
+
def initialize(instrumentname)
|
8
|
+
@name = 'ultraflex'
|
9
|
+
@instrument ||= instrumentname
|
10
|
+
end
|
11
|
+
|
12
|
+
def ppmu
|
13
|
+
ppmu = Struct.new(:forcei, :forcev, :measi, :measv, :vclamp)
|
14
|
+
|
15
|
+
if @instrument == 'HSD-M' # also known as HSD1000
|
16
|
+
forcei = [20.uA, 200.uA, 2.mA, 50.mA]
|
17
|
+
forcev = { forcei_50mA__gt_20mA: (-0.1.V..4.5.V),
|
18
|
+
forcei_50mA__lte_20mA: (-1.V..6.V),
|
19
|
+
forcei_Non50mA__half_scale: (-1..6.V),
|
20
|
+
forcei_Non50mA__full_scale: (-1.V..5.5.V) }
|
21
|
+
measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA]
|
22
|
+
measv = { measi_50mA__gt_20mA: (-0.1.V..4.5.V),
|
23
|
+
measi_50mA__lte_20mA: (-1.V..6.V),
|
24
|
+
measi_20mA__0p5mA_to_20mA: (-1.V..5.5.V),
|
25
|
+
measi_20mA__0p05mA_to_1mA: (-1.V..6.V),
|
26
|
+
measi_20mA__n0p5mA_to_0p5mA: (-1.85.V..6.V),
|
27
|
+
measi_20mA__n1mA_to_n0p5mA: (-1.V..6.V),
|
28
|
+
measi_20mA__n2mA_to_n1mA: (-1.V..5.5.V),
|
29
|
+
measi_200uA__half_scale: (-1.V..6.V),
|
30
|
+
measi_200uA__full_scale: (-1.V..5.V),
|
31
|
+
measi_20uA__half_scale: (-1.V..6.V),
|
32
|
+
measi_20uA__full_scale: (-1.V..5.5.V) }
|
33
|
+
vclamp = (-2.V..6.5.V)
|
34
|
+
ppmu.new(forcei, forcev, measi, measv, vclamp)
|
35
|
+
elsif @instrument == 'HSD-U' # also known as Ultrapin1600 or Utah
|
36
|
+
forcei = [20.uA, 200.uA, 2.mA, 50.mA]
|
37
|
+
forcev = { forcei_50mA__20mA_to_50mA: (-0.1.V..4.5.V),
|
38
|
+
forcei_50mA__0mA_to_20mA: (-1.V..6.V),
|
39
|
+
forcei_50mA__n20mA_to_0mA: (-0.1.V..6.V),
|
40
|
+
forcei_50mA__n35mA_to_n20mA: (0.5.V..5.1.V),
|
41
|
+
forcei_50mA__n50mA_to_n35mA: (1.1.V..4.5.V),
|
42
|
+
forcei_Non50mA: (-1.V..6.V) }
|
43
|
+
measi = [2.uA, 20.uA, 200.uA, 2.mA, 50.mA]
|
44
|
+
measv = { measi_50mA: (-1.V..6.V),
|
45
|
+
measi_200uA: (-1.V..6.V),
|
46
|
+
measi_20uA: (-1.V..6.V),
|
47
|
+
measi_2mA__1mA_to_2mA: (-1.V..6.V),
|
48
|
+
measi_2mA__n1mA_to_1mA: (-1.5.V..6.V),
|
49
|
+
measi_2mA__n2mA_to_n1mA: (-1.V..6.V) }
|
50
|
+
vclamp = (-1.5.V..6.5.V)
|
51
|
+
ppmu.new(forcei, forcev, measi, measv, vclamp)
|
52
|
+
elsif @instrument == 'HSD-4G'
|
53
|
+
forcei = [200.uA, 2.mA, 30.mA]
|
54
|
+
forcev = { measi_30mA: [min: '1.5V, 1.5V - 50mV/mA * Idut', max: '0V, -50mV/mA * Idut'],
|
55
|
+
measi_2mA: (-1.V..1.5.V),
|
56
|
+
measi_200uA: (-1.V..1.5.V) }
|
57
|
+
measi = [200.uA, 2.mA, 30.mA]
|
58
|
+
measv = (-1.V..1.5.V)
|
59
|
+
vclamp = 'n/a'
|
60
|
+
ppmu.new(forcei, forcev, measi, measv, vclamp)
|
61
|
+
elsif @instrument == 'HSS-6G' # also known as SB6G
|
62
|
+
forcei = [200.uA, 2.mA, 50.mA]
|
63
|
+
forcev = { forcei_50mA__gt_20mA: (-0.1.V..3.6.V),
|
64
|
+
forcei_50mA__lte_20mA: (-1.V..3.6.V),
|
65
|
+
forcei_2mA: (-1.V..3.6.V),
|
66
|
+
forcei_200uA: (-1.V..3.6.V) }
|
67
|
+
measi = [200.uA, 2.mA, 50.mA]
|
68
|
+
measv = { measi_50mA__gt_20mA: (-0.1.V..3.6.V),
|
69
|
+
measi_50mA__lte_20mA: (-1.V..3.6.V),
|
70
|
+
measi_200uA: (-1.V..3.6.V),
|
71
|
+
measi_2mA: (-1.V..3.6.V) }
|
72
|
+
vclamp = (-1.3.V..3.9.V)
|
73
|
+
ppmu.new(forcei, forcev, measi, measv, vclamp)
|
74
|
+
else
|
75
|
+
puts "please enter an instrument type: e.g. $tester.ate_hardware(\"HSD-M\").ppmu"
|
76
|
+
puts "Instrument type available: \"HSD-M\", \"HSD-U\", \"HSD-4G\", and \"HSS-6G\" "
|
77
|
+
puts 'HSD-U is also known as Ultrapin1600. HSS-6G is also known as SB6G.'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def supply
|
82
|
+
supply = Struct.new(:forcev, :irange, :source_overload_i, :source_overload_t, :source_fold_i,
|
83
|
+
:source_fold_t, :sink_overload_i, :sink_overload_t, :sink_fold_i,
|
84
|
+
:sink_fold_t, :meter_irange, :meter_vrange, :tdelay, :accuracy,
|
85
|
+
:filter, :bandwidth)
|
86
|
+
if @instrument == 'VSM'
|
87
|
+
forcev = (0.V..4.V)
|
88
|
+
irange = [1.A, 11.A, 21.A, 51.A, 81.A]
|
89
|
+
source_overload_i = { irange_1A: (100.mA..1.08.A),
|
90
|
+
irange_11A: (1.1.A..11.88.A),
|
91
|
+
irange_21A: (2.1.A..22.68.A),
|
92
|
+
irange_51A: (5.1.A..55.08.A),
|
93
|
+
irange_81A: (8.1.A..87.48.A) }
|
94
|
+
source_overload_t = (10.uS..8.S)
|
95
|
+
source_fold_i = { irange_1A: (50.mA..1.03.A),
|
96
|
+
irange_11A: (550.mA..11.33.A),
|
97
|
+
irange_21A: (1.05.A..21.63.A),
|
98
|
+
irange_51A: (2.55.A..52.53.A),
|
99
|
+
irange_81A: (4.05.A..83.43.A) }
|
100
|
+
source_fold_t = (10.uS..8.S)
|
101
|
+
sink_overload_i = { irange_1A: [max: 78.mA], # ????? Not programmable?
|
102
|
+
irange_11A: [max: 858.mA], # ????? Not programmable?
|
103
|
+
irange_21A: [max: 1.64.A], # ????? Not programmable?
|
104
|
+
irange_51A: [max: 3.98.A], # ????? Not programmable?
|
105
|
+
irange_81A: [max: 6.32.A] } # ????? Not programmable?
|
106
|
+
sink_overload_t = 0 # ????? Not programmable?
|
107
|
+
sink_fold_i = { irange_1A: [max: 78.mA], # ????? Not programmable?
|
108
|
+
irange_11A: [max: 858.mA], # ????? Not programmable?
|
109
|
+
irange_21A: [max: 1.64.A], # ????? Not programmable?
|
110
|
+
irange_51A: [max: 3.98.A], # ????? Not programmable?
|
111
|
+
irange_81A: [max: 6.32.A] } # ????? Not programmable?
|
112
|
+
sink_fold_t = (10.uS..8.S)
|
113
|
+
meter_irange = { irange_1A: [1.25.A, 2.5.A],
|
114
|
+
irange_11A: [13.75.A, 27.5.A],
|
115
|
+
irange_21A: [26.25.A, 52.5.A],
|
116
|
+
irange_51A: [63.75.A, 127.5.A],
|
117
|
+
irange_81A: [101.25.A, 202.5.A] }
|
118
|
+
meter_vrange = [3.V, 6.V]
|
119
|
+
tdelay = 0 # default tdelay
|
120
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
121
|
+
filter = [635, 2539, 40_625]
|
122
|
+
bandwidth = [0, 1, 2, 3, 4]
|
123
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
124
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
125
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
126
|
+
elsif @instrument == 'VSMx2' # Also known as VSM, Merged2
|
127
|
+
forcev = (0.V..4.V)
|
128
|
+
irange = [1.A, 2.A, 11.A, 21.A, 51.A, 81.A, 102.A, 162.A]
|
129
|
+
source_overload_i = { irange_1A: (100.mA..1.08.A),
|
130
|
+
irange_2A: (200.mA..2.16.A),
|
131
|
+
irange_11A: (1.1.A..11.88.A),
|
132
|
+
irange_21A: (2.1.A..22.68.A),
|
133
|
+
irange_51A: (5.1.A..55.08.A),
|
134
|
+
irange_81A: (8.1.A..87.48.A),
|
135
|
+
irange_102A: (10.2.A..110.16.A),
|
136
|
+
irange_162A: (16.2.A..174.96.A) }
|
137
|
+
source_overload_t = (10.uS..8.S)
|
138
|
+
source_fold_i = { irange_1A: (50.mA..1.03.A),
|
139
|
+
irange_2A: (100.mA..2.06.A),
|
140
|
+
irange_11A: (550.mA..11.33.A),
|
141
|
+
irange_21A: (1.05.A..21.63.A),
|
142
|
+
irange_51A: (2.55.A..52.53.A),
|
143
|
+
irange_81A: (4.05.A..83.43.A),
|
144
|
+
irange_102A: (5.1.A..105.06.A),
|
145
|
+
irange_162A: (8.1.A..166.86.A) }
|
146
|
+
source_fold_t = (10.uS..8.S)
|
147
|
+
sink_overload_i = { irange_1A: [max: 78.mA], # ????? Not programmable?
|
148
|
+
irange_2A: [max: 156.mA], # ????? Not programmable?
|
149
|
+
irange_11A: [max: 858.mA], # ????? Not programmable?
|
150
|
+
irange_21A: [max: 1.64.A], # ????? Not programmable?
|
151
|
+
irange_51A: [max: 3.98.A], # ????? Not programmable?
|
152
|
+
irange_81A: [max: 6.32.A], # ????? Not programmable?
|
153
|
+
irange_102A: [max: 7.96.A], # ????? Not programmable?
|
154
|
+
irange_162A: [max: 12.64.A] } # ????? Not programmable?
|
155
|
+
sink_overload_t = 0 # ????? Not programmable?
|
156
|
+
sink_fold_i = { irange_1A: [max: 78.mA], # ????? Not programmable?
|
157
|
+
irange_2A: [max: 156.mA], # ????? Not programmable?
|
158
|
+
irange_11A: [max: 858.mA], # ????? Not programmable?
|
159
|
+
irange_21A: [max: 1.64.A], # ????? Not programmable?
|
160
|
+
irange_51A: [max: 3.98.A], # ????? Not programmable?
|
161
|
+
irange_81A: [max: 6.32.A], # ????? Not programmable?
|
162
|
+
irange_102A: [max: 7.96.A], # ????? Not programmable?
|
163
|
+
irange_162A: [max: 12.64.A] } # ????? Not programmable?
|
164
|
+
meter_irange = { irange_1A: [1.25.A, 2.5.A],
|
165
|
+
irange_2A: [2.5.A, 5.A],
|
166
|
+
irange_11A: [13.75.A, 27.5.A],
|
167
|
+
irange_21A: [26.25.A, 52.5.A],
|
168
|
+
irange_51A: [63.75.A, 127.5.A],
|
169
|
+
irange_81A: [101.25.A, 202.5.A],
|
170
|
+
irange_102A: [127.5.A, 255.A],
|
171
|
+
irange_162A: [202.5.A, 405.A] }
|
172
|
+
sink_fold_t = (10.uS..8.S)
|
173
|
+
meter_vrange = [3.V, 6.V]
|
174
|
+
tdelay = 0 # default tdelay
|
175
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
176
|
+
filter = [635, 2539, 40_625]
|
177
|
+
bandwidth = [0, 1, 2, 3, 4]
|
178
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
179
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
180
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
181
|
+
elsif @instrument == 'HexVS'
|
182
|
+
forcev = (0.V..5.5.V)
|
183
|
+
irange = 15.A
|
184
|
+
source_overload_i = (1.05.A..16.5.A)
|
185
|
+
source_overload_t = (102.4.uS..300.mS)
|
186
|
+
source_fold_i = (50.mA..15.5.A)
|
187
|
+
source_fold_t = (102.4.uS..5.S)
|
188
|
+
sink_overload_i = (2.A..3.A)
|
189
|
+
sink_overload_t = (102.4.uS..300.mS)
|
190
|
+
sink_fold_i = (1.A..2.A)
|
191
|
+
sink_fold_t = (102.4.uS..5.S)
|
192
|
+
meter_irange = [10.mA, 100.mA, 1.A, 15.A]
|
193
|
+
meter_vrange = [4.V, 8.V]
|
194
|
+
tdelay = 0 # default tdelay
|
195
|
+
accuracy = { neg: -7.mV, pos: 7.mV }
|
196
|
+
filter = 10_000
|
197
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
198
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
199
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
200
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
201
|
+
elsif @instrument == 'HexVSx2' # Also known as HexVS, Merged2
|
202
|
+
forcev = (0.V..5.5.V)
|
203
|
+
irange = [15.A, 30.A]
|
204
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
205
|
+
irange_30A: (2.1.A..33.A) }
|
206
|
+
source_overload_t = (102.4.uS..300.mS)
|
207
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
208
|
+
irange_30A: (100.mA..31.A) }
|
209
|
+
source_fold_t = (102.4.uS..5.S)
|
210
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
211
|
+
irange_30A: (4.A..6.A) }
|
212
|
+
sink_overload_t = (102.4.uS..300.mS)
|
213
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
214
|
+
irange_30A: (2.A..4.A) }
|
215
|
+
sink_fold_t = (102.4.uS..5.S)
|
216
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
217
|
+
irange_30A: [30.A] } # This is verified to be correct on tester.
|
218
|
+
meter_vrange = [4.V, 8.V]
|
219
|
+
tdelay = 0 # default tdelay
|
220
|
+
accuracy = { neg: -7.mV, pos: 7.mV }
|
221
|
+
filter = 10_000
|
222
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
223
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
224
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
225
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
226
|
+
elsif @instrument == 'HexVSx4' # Also known as HexVS, Merged4
|
227
|
+
forcev = (0.V..5.5.V)
|
228
|
+
irange = [15.A, 60.A]
|
229
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
230
|
+
irange_60A: (4.2.A..66.A) }
|
231
|
+
source_overload_t = (102.4.uS..300.mS)
|
232
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
233
|
+
irange_60A: (200.mA..62.A) }
|
234
|
+
source_fold_t = (102.4.uS..5.S)
|
235
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
236
|
+
irange_60A: (8.A..12.A) }
|
237
|
+
sink_overload_t = (102.4.uS..300.mS)
|
238
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
239
|
+
irange_60A: (4.A..8.A) }
|
240
|
+
sink_fold_t = (102.4.uS..5.S)
|
241
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
242
|
+
irange_60A: [60.A] } # This is verified to be correct on tester.
|
243
|
+
meter_vrange = [4.V, 8.V]
|
244
|
+
tdelay = 0 # default tdelay
|
245
|
+
accuracy = { neg: -7.mV, pos: 7.mV }
|
246
|
+
filter = 10_000
|
247
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
248
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
249
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
250
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
251
|
+
elsif @instrument == 'HexVSx6' # Also known as HexVS, Merged6
|
252
|
+
forcev = (0.V..5.5.V)
|
253
|
+
irange = [15.A, 90.A]
|
254
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
255
|
+
irange_90A: (6.3.A..99.A) }
|
256
|
+
source_overload_t = (102.4.uS..300.mS)
|
257
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
258
|
+
irange_90A: (300.mA..93.A) }
|
259
|
+
source_fold_t = (102.4.uS..5.S)
|
260
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
261
|
+
irange_90A: (12.A..18.A) }
|
262
|
+
sink_overload_t = (102.4.uS..300.mS)
|
263
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
264
|
+
irange_90A: (6.A..12.A) }
|
265
|
+
sink_fold_t = (102.4.uS..5.S)
|
266
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
267
|
+
irange_90A: [90.A] } # This is verified to be correct on tester.
|
268
|
+
meter_vrange = [4.V, 8.V]
|
269
|
+
tdelay = 0 # default tdelay
|
270
|
+
accuracy = { neg: -7.mV, pos: 7.mV }
|
271
|
+
filter = 10_000
|
272
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
273
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
274
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
275
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
276
|
+
elsif @instrument == 'HexVS+'
|
277
|
+
forcev = (0.V..5.5.V)
|
278
|
+
irange = 15.A
|
279
|
+
source_overload_i = (1.05.A..16.5.A)
|
280
|
+
source_overload_t = (102.4.uS..300.mS)
|
281
|
+
source_fold_i = (50.mA..15.5.A)
|
282
|
+
source_fold_t = (102.4.uS..5.S)
|
283
|
+
sink_overload_i = (2.A..3.A)
|
284
|
+
sink_overload_t = (102.4.uS..300.mS)
|
285
|
+
sink_fold_i = (1.A..2.A)
|
286
|
+
sink_fold_t = (102.4.uS..5.S)
|
287
|
+
meter_irange = [10.mA, 100.mA, 1.A, 15.A]
|
288
|
+
meter_vrange = [4.V, 8.V]
|
289
|
+
tdelay = 0 # default tdelay
|
290
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
291
|
+
filter = 10_000
|
292
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
293
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
294
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
295
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
296
|
+
elsif @instrument == 'HexVS+x2' # Also known as HexVS+, Merged2
|
297
|
+
forcev = (0.V..5.5.V)
|
298
|
+
irange = [15.A, 30.A]
|
299
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
300
|
+
irange_30A: (2.1.A..33.A) }
|
301
|
+
source_overload_t = (102.4.uS..300.mS)
|
302
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
303
|
+
irange_30A: (100.mA..31.A) }
|
304
|
+
source_fold_t = (102.4.uS..5.S)
|
305
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
306
|
+
irange_30A: (4.A..6.A) }
|
307
|
+
sink_overload_t = (102.4.uS..300.mS)
|
308
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
309
|
+
irange_30A: (2.A..4.A) }
|
310
|
+
sink_fold_t = (102.4.uS..5.S)
|
311
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
312
|
+
irange_30A: [30.A] } # This is verified to be correct on tester.
|
313
|
+
meter_vrange = [4.V, 8.V]
|
314
|
+
tdelay = 0 # default tdelay
|
315
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
316
|
+
filter = 10_000
|
317
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
318
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
319
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
320
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
321
|
+
elsif @instrument == 'HexVS+x4' # Also known as HexVS+, Merged4
|
322
|
+
forcev = (0.V..5.5.V)
|
323
|
+
irange = [15.A, 60.A]
|
324
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
325
|
+
irange_60A: (4.2.A..66.A) }
|
326
|
+
source_overload_t = (102.4.uS..300.mS)
|
327
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
328
|
+
irange_60A: (200.mA..62.A) }
|
329
|
+
source_fold_t = (102.4.uS..5.S)
|
330
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
331
|
+
irange_60A: (8.A..12.A) }
|
332
|
+
sink_overload_t = (102.4.uS..300.mS)
|
333
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
334
|
+
irange_60A: (4.A..8.A) }
|
335
|
+
sink_fold_t = (102.4.uS..5.S)
|
336
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
337
|
+
irange_60A: [60.A] } # This is verified to be correct on tester.
|
338
|
+
meter_vrange = [4.V, 8.V]
|
339
|
+
tdelay = 0 # default tdelay
|
340
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
341
|
+
filter = 10_000
|
342
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
343
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
344
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
345
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
346
|
+
elsif @instrument == 'HexVS+x6' # Also known as HexVS+, Merged6
|
347
|
+
forcev = (0.V..5.5.V)
|
348
|
+
irange = [15.A, 90.A]
|
349
|
+
source_overload_i = { irange_15A: (1.05.A..16.5.A),
|
350
|
+
irange_90A: (6.3.A..99.A) }
|
351
|
+
source_overload_t = (102.4.uS..300.mS)
|
352
|
+
source_fold_i = { irange_15A: (50.mA..15.5.A),
|
353
|
+
irange_90A: (300.mA..93.A) }
|
354
|
+
source_fold_t = (102.4.uS..5.S)
|
355
|
+
sink_overload_i = { irange_15A: (2.A..3.A),
|
356
|
+
irange_90A: (12.A..18.A) }
|
357
|
+
sink_overload_t = (102.4.uS..300.mS)
|
358
|
+
sink_fold_i = { irange_15A: (1.A..2.A),
|
359
|
+
irange_90A: (6.A..12.A) }
|
360
|
+
sink_fold_t = (102.4.uS..5.S)
|
361
|
+
meter_irange = { irange_15A: [10.mA, 100.mA, 1.A, 15.A],
|
362
|
+
irange_90A: [90.A] } # This is verified to be correct on tester.
|
363
|
+
meter_vrange = [4.V, 8.V]
|
364
|
+
tdelay = 0 # default tdelay
|
365
|
+
accuracy = { neg: -2.mV, pos: 2.mV }
|
366
|
+
filter = 10_000
|
367
|
+
bandwidth = [0, 1, 2, 3, 4, 5, 6, 7]
|
368
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
369
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
370
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
371
|
+
elsif @instrument == 'HDVS1' # also known as HDVS
|
372
|
+
forcev = (0.V..7.V)
|
373
|
+
irange = 1.A
|
374
|
+
source_overload_i = 'n/a'
|
375
|
+
source_overload_t = 'n/a'
|
376
|
+
source_fold_i = (5.mA..1.A)
|
377
|
+
source_fold_t = (0.S..167.77.mS)
|
378
|
+
sink_overload_i = 'n/a'
|
379
|
+
sink_overload_t = 'n/a'
|
380
|
+
sink_fold_i = (5.mA..200.mA)
|
381
|
+
sink_fold_t = (0.S..167.77.mS)
|
382
|
+
meter_irange = [10.uA, 100.uA, 1.mA, 10.mA, 100.mA, 1.A]
|
383
|
+
meter_vrange = 7.V
|
384
|
+
tdelay = 0 # default tdelay
|
385
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
386
|
+
filter = [1356, 2712, 5425, 10_850, 21_701, 43_402, 86_805, 173_611, 347_222,
|
387
|
+
694_444, 1_388_888, 2_777_777, 5_555_555]
|
388
|
+
bandwidth = [0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24,
|
389
|
+
100, 101, 102, 103, 104, 220, 221, 222, 223, 224, 470,
|
390
|
+
471, 472, 473, 474]
|
391
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
392
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
393
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
394
|
+
elsif @instrument == 'HDVS1x2' # also known as HDVS, Merged2
|
395
|
+
forcev = (0.V..7.V)
|
396
|
+
irange = 2.A
|
397
|
+
source_overload_i = 'n/a'
|
398
|
+
source_overload_t = 'n/a'
|
399
|
+
source_fold_i = (10.mA..2.A)
|
400
|
+
source_fold_t = (0.S..167.77.mS)
|
401
|
+
sink_overload_i = 'n/a'
|
402
|
+
sink_overload_t = 'n/a'
|
403
|
+
sink_fold_i = (10.mA..400.mA)
|
404
|
+
sink_fold_t = (0.S..167.77.mS)
|
405
|
+
meter_irange = [20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 2.A]
|
406
|
+
meter_vrange = 7.V
|
407
|
+
tdelay = 0 # default tdelay
|
408
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
409
|
+
filter = [1356, 2712, 5425, 10_850, 21_701, 43_402, 86_805, 173_611, 347_222,
|
410
|
+
694_444, 1_388_888, 2_777_777, 5_555_555]
|
411
|
+
bandwidth = [0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24,
|
412
|
+
100, 101, 102, 103, 104, 220, 221, 222, 223, 224, 470,
|
413
|
+
471, 472, 473, 474]
|
414
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
415
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
416
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
417
|
+
elsif @instrument == 'HDVS1x4' # also known as HDVS, Merged4
|
418
|
+
forcev = (0.V..7.V)
|
419
|
+
irange = [4.A]
|
420
|
+
source_overload_i = 'n/a'
|
421
|
+
source_overload_t = 'n/a'
|
422
|
+
source_fold_i = (20.mA..4.A)
|
423
|
+
source_fold_t = (0.S..167.77.mS)
|
424
|
+
sink_overload_i = 'n/a'
|
425
|
+
sink_overload_t = 'n/a'
|
426
|
+
sink_fold_i = (20.mA..800.mA)
|
427
|
+
sink_fold_t = (0.S..167.77.mS)
|
428
|
+
meter_irange = [40.uA, 400.uA, 4.mA, 40.mA, 400.mA, 4.A]
|
429
|
+
meter_vrange = 7.V
|
430
|
+
tdelay = 0 # default tdelay
|
431
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
432
|
+
filter = [1356, 2712, 5425, 10_850, 21_701, 43_402, 86_805, 173_611, 347_222,
|
433
|
+
694_444, 1_388_888, 2_777_777, 5_555_555]
|
434
|
+
bandwidth = [0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24,
|
435
|
+
100, 101, 102, 103, 104, 220, 221, 222, 223, 224, 470,
|
436
|
+
471, 472, 473, 474]
|
437
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
438
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
439
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
440
|
+
elsif @instrument == 'VHDVS' # also known as UVS256
|
441
|
+
forcev = (-2.V..18.V)
|
442
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA]
|
443
|
+
source_overload_i = 'n/a'
|
444
|
+
source_overload_t = 'n/a'
|
445
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
446
|
+
irange_20uA: (2.5.uA..20.uA),
|
447
|
+
irange_200uA: (25.uA..200.uA),
|
448
|
+
irange_2mA: (250.uA..2.mA),
|
449
|
+
irange_20mA: (2.5.mA..20.mA),
|
450
|
+
irange_200mA: (25.mA..200.mA) }
|
451
|
+
source_fold_t = (300.uS..2.S)
|
452
|
+
sink_overload_i = 'n/a'
|
453
|
+
sink_overload_t = 'n/a'
|
454
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
455
|
+
irange_20uA: (2.5.uA..20.uA),
|
456
|
+
irange_200uA: (25.uA..200.uA),
|
457
|
+
irange_2mA: (250.uA..2.mA),
|
458
|
+
irange_20mA: (2.5.mA..20.mA),
|
459
|
+
irange_200mA: (25.mA..75.mA) }
|
460
|
+
sink_fold_t = (300.uS..2.S)
|
461
|
+
meter_irange = { irange_4uA: 4.uA,
|
462
|
+
irange_20uA: 20.uA,
|
463
|
+
irange_200uA: 200.uA,
|
464
|
+
irange_2mA: 2.mA,
|
465
|
+
irange_20mA: 20.mA,
|
466
|
+
irange_200mA: 200.mA }
|
467
|
+
meter_vrange = 18.V
|
468
|
+
tdelay = 0 # default tdelay
|
469
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
470
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
471
|
+
bandwidth = (0..255) # Integers
|
472
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
473
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
474
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
475
|
+
elsif @instrument == 'VHDVS_HC' # also known as UVS256, High-Current
|
476
|
+
forcev = (-2.V..18.V)
|
477
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 800.mA]
|
478
|
+
source_overload_i = 'n/a'
|
479
|
+
source_overload_t = 'n/a'
|
480
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
481
|
+
irange_20uA: (2.5.uA..20.uA),
|
482
|
+
irange_200uA: (25.uA..200.uA),
|
483
|
+
irange_2mA: (250.uA..2.mA),
|
484
|
+
irange_20mA: (2.5.mA..20.mA),
|
485
|
+
irange_200mA: (25.mA..200.mA),
|
486
|
+
irange_700mA: (100.mA..700.mA),
|
487
|
+
irange_800mA: (100.mA..800.mA) }
|
488
|
+
source_fold_t = (300.uS..2.S)
|
489
|
+
sink_overload_i = 'n/a'
|
490
|
+
sink_overload_t = 'n/a'
|
491
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
492
|
+
irange_20uA: (2.5.uA..20.uA),
|
493
|
+
irange_200uA: (25.uA..200.uA),
|
494
|
+
irange_2mA: (250.uA..2.mA),
|
495
|
+
irange_20mA: (2.5.mA..20.mA),
|
496
|
+
irange_200mA: (25.mA..75.mA),
|
497
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
498
|
+
irange_800mA: (90.mA..110.mA) } # This is verified on tester
|
499
|
+
sink_fold_t = (300.uS..2.S)
|
500
|
+
meter_irange = { irange_4uA: 4.uA,
|
501
|
+
irange_20uA: 20.uA,
|
502
|
+
irange_200uA: 200.uA,
|
503
|
+
irange_2mA: 2.mA,
|
504
|
+
irange_20mA: 20.mA,
|
505
|
+
irange_200mA: 200.mA,
|
506
|
+
irange_700mA: 700.mA,
|
507
|
+
irange_800mA: 800.mA }
|
508
|
+
meter_vrange = 18.V
|
509
|
+
tdelay = 0 # default tdelay
|
510
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
511
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
512
|
+
bandwidth = (0..255) # Integers
|
513
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
514
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
515
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
516
|
+
elsif @instrument == 'VHDVSx2' # also known as UVS256, Merged2
|
517
|
+
forcev = (-2.V..18.V)
|
518
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 40.mA, 200.mA, 400.mA]
|
519
|
+
source_overload_i = 'n/a'
|
520
|
+
source_overload_t = 'n/a'
|
521
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
522
|
+
irange_20uA: (2.5.uA..20.uA),
|
523
|
+
irange_200uA: (25.uA..200.uA),
|
524
|
+
irange_2mA: (250.uA..2.mA),
|
525
|
+
irange_20mA: (2.5.mA..20.mA),
|
526
|
+
irange_40mA: (5.mA..40.mA),
|
527
|
+
irange_200mA: (25.mA..200.mA),
|
528
|
+
irange_400mA: (50.mA..400.mA) }
|
529
|
+
source_fold_t = (300.uS..2.S)
|
530
|
+
sink_overload_i = 'n/a'
|
531
|
+
sink_overload_t = 'n/a'
|
532
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
533
|
+
irange_20uA: (2.5.uA..20.uA),
|
534
|
+
irange_200uA: (25.uA..200.uA),
|
535
|
+
irange_2mA: (250.uA..2.mA),
|
536
|
+
irange_20mA: (2.5.mA..20.mA),
|
537
|
+
irange_40mA: (5.mA..40.mA),
|
538
|
+
irange_200mA: (25.mA..75.mA),
|
539
|
+
irange_400mA: (50.mA..150.mA) }
|
540
|
+
sink_fold_t = (300.uS..2.S)
|
541
|
+
meter_irange = { irange_4uA: 4.uA,
|
542
|
+
irange_20uA: 20.uA,
|
543
|
+
irange_200uA: 200.uA,
|
544
|
+
irange_2mA: 2.mA,
|
545
|
+
irange_20mA: 20.mA,
|
546
|
+
irange_40mA: 40.mA,
|
547
|
+
irange_200mA: 200.mA,
|
548
|
+
irange_400mA: 400.mA }
|
549
|
+
meter_vrange = 18.V
|
550
|
+
tdelay = 0 # default tdelay
|
551
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
552
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
553
|
+
bandwidth = (0..255) # Integers
|
554
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
555
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
556
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
557
|
+
elsif @instrument == 'VHDVS_HCx2' # also known as UVS256, High-Current, Merged2
|
558
|
+
forcev = (-2.V..18.V)
|
559
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 40.mA, 200.mA, 400.mA, 700.mA, 1.4.A]
|
560
|
+
source_overload_i = 'n/a'
|
561
|
+
source_overload_t = 'n/a'
|
562
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
563
|
+
irange_20uA: (2.5.uA..20.uA),
|
564
|
+
irange_200uA: (25.uA..200.uA),
|
565
|
+
irange_2mA: (250.uA..2.mA),
|
566
|
+
irange_20mA: (2.5.mA..20.mA),
|
567
|
+
irange_40mA: (5.mA..40.mA),
|
568
|
+
irange_200mA: (25.mA..200.mA),
|
569
|
+
irange_400mA: (50.mA..400.mA),
|
570
|
+
irange_700mA: (100.mA..700.mA),
|
571
|
+
irange_1p4A: (200.mA..1.4.A) }
|
572
|
+
source_fold_t = (300.uS..2.S)
|
573
|
+
sink_overload_i = 'n/a'
|
574
|
+
sink_overload_t = 'n/a'
|
575
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
576
|
+
irange_20uA: (2.5.uA..20.uA),
|
577
|
+
irange_200uA: (25.uA..200.uA),
|
578
|
+
irange_2mA: (250.uA..2.mA),
|
579
|
+
irange_20mA: (2.5.mA..20.mA),
|
580
|
+
irange_40mA: (5.mA..40.mA),
|
581
|
+
irange_200mA: (25.mA..75.mA),
|
582
|
+
irange_400mA: (50.mA..150.mA),
|
583
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
584
|
+
irange_1p4A: (190.mA..210.mA) } # This is verified on tester
|
585
|
+
sink_fold_t = (300.uS..2.S)
|
586
|
+
meter_irange = { irange_4uA: 4.uA,
|
587
|
+
irange_20uA: 20.uA,
|
588
|
+
irange_200uA: 200.uA,
|
589
|
+
irange_2mA: 2.mA,
|
590
|
+
irange_20mA: 20.mA,
|
591
|
+
irange_40mA: 40.mA,
|
592
|
+
irange_200mA: 200.mA,
|
593
|
+
irange_400mA: 400.mA,
|
594
|
+
irange_700mA: 700.mA,
|
595
|
+
irange_1p4A: 1.4.A }
|
596
|
+
meter_vrange = 18.V
|
597
|
+
tdelay = 0 # default tdelay
|
598
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
599
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
600
|
+
bandwidth = (0..255) # Integers
|
601
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
602
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
603
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
604
|
+
elsif @instrument == 'VHDVS_HCx4' # also known as UVS256, High-Current, Merged4
|
605
|
+
forcev = (-2.V..18.V)
|
606
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 2.8.A]
|
607
|
+
source_overload_i = 'n/a'
|
608
|
+
source_overload_t = 'n/a'
|
609
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
610
|
+
irange_20uA: (2.5.uA..20.uA),
|
611
|
+
irange_200uA: (25.uA..200.uA),
|
612
|
+
irange_2mA: (250.uA..2.mA),
|
613
|
+
irange_20mA: (2.5.mA..20.mA),
|
614
|
+
irange_200mA: (25.mA..200.mA),
|
615
|
+
irange_700mA: (100.mA..700.mA),
|
616
|
+
irange_2p8A: (400.mA..2.8.A) }
|
617
|
+
source_fold_t = (300.uS..2.S)
|
618
|
+
sink_overload_i = 'n/a'
|
619
|
+
sink_overload_t = 'n/a'
|
620
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
621
|
+
irange_20uA: (2.5.uA..20.uA),
|
622
|
+
irange_200uA: (25.uA..200.uA),
|
623
|
+
irange_2mA: (250.uA..2.mA),
|
624
|
+
irange_20mA: (2.5.mA..20.mA),
|
625
|
+
irange_200mA: (25.mA..75.mA),
|
626
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
627
|
+
irange_2p8A: (390.mA..410.mA) } # This is verified on tester
|
628
|
+
sink_fold_t = (300.uS..2.S)
|
629
|
+
meter_irange = { irange_4uA: 4.uA,
|
630
|
+
irange_20uA: 20.uA,
|
631
|
+
irange_200uA: 200.uA,
|
632
|
+
irange_2mA: 2.mA,
|
633
|
+
irange_20mA: 20.mA,
|
634
|
+
irange_200mA: 200.mA,
|
635
|
+
irange_700mA: 700.mA,
|
636
|
+
irange_2p8A: 2.8.A }
|
637
|
+
meter_vrange = 18.V
|
638
|
+
tdelay = 0 # default tdelay
|
639
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
640
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
641
|
+
bandwidth = (0..255) # Integers
|
642
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
643
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
644
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
645
|
+
elsif @instrument == 'VHDVS_HCx8' # also known as UVS256, High-Current, Merged8
|
646
|
+
forcev = (-2.V..18.V)
|
647
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 5.6.A]
|
648
|
+
source_overload_i = 'n/a'
|
649
|
+
source_overload_t = 'n/a'
|
650
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
651
|
+
irange_20uA: (2.5.uA..20.uA),
|
652
|
+
irange_200uA: (25.uA..200.uA),
|
653
|
+
irange_2mA: (250.uA..2.mA),
|
654
|
+
irange_20mA: (2.5.mA..20.mA),
|
655
|
+
irange_200mA: (25.mA..200.mA),
|
656
|
+
irange_700mA: (100.mA..700.mA),
|
657
|
+
irange_5p6A: (800.mA..5.6.A) }
|
658
|
+
source_fold_t = (300.uS..2.S)
|
659
|
+
sink_overload_i = 'n/a'
|
660
|
+
sink_overload_t = 'n/a'
|
661
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
662
|
+
irange_20uA: (2.5.uA..20.uA),
|
663
|
+
irange_200uA: (25.uA..200.uA),
|
664
|
+
irange_2mA: (250.uA..2.mA),
|
665
|
+
irange_20mA: (2.5.mA..20.mA),
|
666
|
+
irange_200mA: (25.mA..75.mA),
|
667
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
668
|
+
irange_5p6A: (790.mA..810.mA) } # This is verified on tester
|
669
|
+
sink_fold_t = (300.uS..2.S)
|
670
|
+
meter_irange = { irange_4uA: 4.uA,
|
671
|
+
irange_20uA: 20.uA,
|
672
|
+
irange_200uA: 200.uA,
|
673
|
+
irange_2mA: 2.mA,
|
674
|
+
irange_20mA: 20.mA,
|
675
|
+
irange_200mA: 200.mA,
|
676
|
+
irange_700mA: 700.mA,
|
677
|
+
irange_5p6A: 5.6.A }
|
678
|
+
meter_vrange = 18.V
|
679
|
+
tdelay = 0 # default tdelay
|
680
|
+
accuracy = { neg: '-0.001xSUPPLY-10.mV', pos: '0.001xSUPPLY+10.mV' }
|
681
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
682
|
+
bandwidth = (0..255) # Integers
|
683
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
684
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
685
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
686
|
+
elsif @instrument == 'VHDVS+' # also known as UVS256, High-Accuracy
|
687
|
+
forcev = (-2.V..18.V)
|
688
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA]
|
689
|
+
source_overload_i = 'n/a'
|
690
|
+
source_overload_t = 'n/a'
|
691
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
692
|
+
irange_20uA: (2.5.uA..20.uA),
|
693
|
+
irange_200uA: (25.uA..200.uA),
|
694
|
+
irange_2mA: (250.uA..2.mA),
|
695
|
+
irange_20mA: (2.5.mA..20.mA),
|
696
|
+
irange_200mA: (25.mA..200.mA) }
|
697
|
+
source_fold_t = (300.uS..2.S)
|
698
|
+
sink_overload_i = 'n/a'
|
699
|
+
sink_overload_t = 'n/a'
|
700
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
701
|
+
irange_20uA: (2.5.uA..20.uA),
|
702
|
+
irange_200uA: (25.uA..200.uA),
|
703
|
+
irange_2mA: (250.uA..2.mA),
|
704
|
+
irange_20mA: (2.5.mA..20.mA),
|
705
|
+
irange_200mA: (25.mA..75.mA) }
|
706
|
+
sink_fold_t = (300.uS..2.S)
|
707
|
+
meter_irange = { irange_4uA: 4.uA,
|
708
|
+
irange_20uA: 20.uA,
|
709
|
+
irange_200uA: 200.uA,
|
710
|
+
irange_2mA: 2.mA,
|
711
|
+
irange_20mA: 20.mA,
|
712
|
+
irange_200mA: 200.mA }
|
713
|
+
meter_vrange = 18.V
|
714
|
+
tdelay = 0 # default tdelay
|
715
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
716
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
717
|
+
bandwidth = (0..255) # Integers
|
718
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
719
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
720
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
721
|
+
elsif @instrument == 'VHDVS_HC+' # also known as UVS256, High-Current, High-Accuracy
|
722
|
+
forcev = (-2.V..18.V)
|
723
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 800.mA]
|
724
|
+
source_overload_i = 'n/a'
|
725
|
+
source_overload_t = 'n/a'
|
726
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
727
|
+
irange_20uA: (2.5.uA..20.uA),
|
728
|
+
irange_200uA: (25.uA..200.uA),
|
729
|
+
irange_2mA: (250.uA..2.mA),
|
730
|
+
irange_20mA: (2.5.mA..20.mA),
|
731
|
+
irange_200mA: (25.mA..200.mA),
|
732
|
+
irange_700mA: (100.mA..700.mA),
|
733
|
+
irange_800mA: (100.mA..800.mA) }
|
734
|
+
source_fold_t = (300.uS..2.S)
|
735
|
+
sink_overload_i = 'n/a'
|
736
|
+
sink_overload_t = 'n/a'
|
737
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
738
|
+
irange_20uA: (2.5.uA..20.uA),
|
739
|
+
irange_200uA: (25.uA..200.uA),
|
740
|
+
irange_2mA: (250.uA..2.mA),
|
741
|
+
irange_20mA: (2.5.mA..20.mA),
|
742
|
+
irange_200mA: (25.mA..75.mA),
|
743
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
744
|
+
irange_800mA: (90.mA..110.mA) } # This is verified on tester
|
745
|
+
sink_fold_t = (300.uS..2.S)
|
746
|
+
meter_irange = { irange_4uA: 4.uA,
|
747
|
+
irange_20uA: 20.uA,
|
748
|
+
irange_200uA: 200.uA,
|
749
|
+
irange_2mA: 2.mA,
|
750
|
+
irange_20mA: 20.mA,
|
751
|
+
irange_200mA: 200.mA,
|
752
|
+
irange_700mA: 700.mA,
|
753
|
+
irange_800mA: 800.mA }
|
754
|
+
meter_vrange = 18.V
|
755
|
+
tdelay = 0 # default tdelay
|
756
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
757
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
758
|
+
bandwidth = (0..255) # Integers
|
759
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
760
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
761
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
762
|
+
elsif @instrument == 'VHDVS+x2' # also known as UVS256, High-Accuracy, Merged2
|
763
|
+
forcev = (-2.V..18.V)
|
764
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 40.mA, 200.mA, 400.mA]
|
765
|
+
source_overload_i = 'n/a'
|
766
|
+
source_overload_t = 'n/a'
|
767
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
768
|
+
irange_20uA: (2.5.uA..20.uA),
|
769
|
+
irange_200uA: (25.uA..200.uA),
|
770
|
+
irange_2mA: (250.uA..2.mA),
|
771
|
+
irange_20mA: (2.5.mA..20.mA),
|
772
|
+
irange_40mA: (5.mA..40.mA),
|
773
|
+
irange_200mA: (25.mA..200.mA),
|
774
|
+
irange_400mA: (50.mA..400.mA) }
|
775
|
+
source_fold_t = (300.uS..2.S)
|
776
|
+
sink_overload_i = 'n/a'
|
777
|
+
sink_overload_t = 'n/a'
|
778
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
779
|
+
irange_20uA: (2.5.uA..20.uA),
|
780
|
+
irange_200uA: (25.uA..200.uA),
|
781
|
+
irange_2mA: (250.uA..2.mA),
|
782
|
+
irange_20mA: (2.5.mA..20.mA),
|
783
|
+
irange_40mA: (5.mA..40.mA),
|
784
|
+
irange_200mA: (25.mA..75.mA),
|
785
|
+
irange_400mA: (50.mA..150.mA) }
|
786
|
+
sink_fold_t = (300.uS..2.S)
|
787
|
+
meter_irange = { irange_4uA: 4.uA,
|
788
|
+
irange_20uA: 20.uA,
|
789
|
+
irange_200uA: 200.uA,
|
790
|
+
irange_2mA: 2.mA,
|
791
|
+
irange_20mA: 20.mA,
|
792
|
+
irange_40mA: 40.mA,
|
793
|
+
irange_200mA: 200.mA,
|
794
|
+
irange_400mA: 400.mA }
|
795
|
+
meter_vrange = 18.V
|
796
|
+
tdelay = 0 # default tdelay
|
797
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
798
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
799
|
+
bandwidth = (0..255) # Integers
|
800
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
801
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
802
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
803
|
+
elsif @instrument == 'VHDVS_HC+x2' # also known as UVS256, High-Current, High-Accuracy, Merged2
|
804
|
+
forcev = (-2.V..18.V)
|
805
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 40.mA, 200.mA, 400.mA, 700.mA, 1.4.A]
|
806
|
+
source_overload_i = 'n/a'
|
807
|
+
source_overload_t = 'n/a'
|
808
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
809
|
+
irange_20uA: (2.5.uA..20.uA),
|
810
|
+
irange_200uA: (25.uA..200.uA),
|
811
|
+
irange_2mA: (250.uA..2.mA),
|
812
|
+
irange_20mA: (2.5.mA..20.mA),
|
813
|
+
irange_40mA: (5.mA..40.mA),
|
814
|
+
irange_200mA: (25.mA..200.mA),
|
815
|
+
irange_400mA: (50.mA..400.mA),
|
816
|
+
irange_700mA: (100.mA..700.mA),
|
817
|
+
irange_1p4A: (200.mA..1.4.A) }
|
818
|
+
source_fold_t = (300.uS..2.S)
|
819
|
+
sink_overload_i = 'n/a'
|
820
|
+
sink_overload_t = 'n/a'
|
821
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
822
|
+
irange_20uA: (2.5.uA..20.uA),
|
823
|
+
irange_200uA: (25.uA..200.uA),
|
824
|
+
irange_2mA: (250.uA..2.mA),
|
825
|
+
irange_20mA: (2.5.mA..20.mA),
|
826
|
+
irange_40mA: (5.mA..40.mA),
|
827
|
+
irange_200mA: (25.mA..75.mA),
|
828
|
+
irange_400mA: (50.mA..150.mA),
|
829
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
830
|
+
irange_1p4A: (190.mA..210.mA) } # This is verified on tester
|
831
|
+
sink_fold_t = (300.uS..2.S)
|
832
|
+
meter_irange = { irange_4uA: 4.uA,
|
833
|
+
irange_20uA: 20.uA,
|
834
|
+
irange_200uA: 200.uA,
|
835
|
+
irange_2mA: 2.mA,
|
836
|
+
irange_20mA: 20.mA,
|
837
|
+
irange_40mA: 40.mA,
|
838
|
+
irange_200mA: 200.mA,
|
839
|
+
irange_400mA: 400.mA,
|
840
|
+
irange_700mA: 700.mA,
|
841
|
+
irange_1p4A: 1.4.A }
|
842
|
+
meter_vrange = 18.V
|
843
|
+
tdelay = 0 # default tdelay
|
844
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
845
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
846
|
+
bandwidth = (0..255) # Integers
|
847
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
848
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
849
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
850
|
+
elsif @instrument == 'VHDVS_HC+x4' # also known as UVS256, High-Current, High-Accuracy, Merged4
|
851
|
+
forcev = (-2.V..18.V)
|
852
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 2.8.A]
|
853
|
+
source_overload_i = 'n/a'
|
854
|
+
source_overload_t = 'n/a'
|
855
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
856
|
+
irange_20uA: (2.5.uA..20.uA),
|
857
|
+
irange_200uA: (25.uA..200.uA),
|
858
|
+
irange_2mA: (250.uA..2.mA),
|
859
|
+
irange_20mA: (2.5.mA..20.mA),
|
860
|
+
irange_200mA: (25.mA..200.mA),
|
861
|
+
irange_700mA: (100.mA..700.mA),
|
862
|
+
irange_2p8A: (400.mA..2.8.A) }
|
863
|
+
source_fold_t = (300.uS..2.S)
|
864
|
+
sink_overload_i = 'n/a'
|
865
|
+
sink_overload_t = 'n/a'
|
866
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
867
|
+
irange_20uA: (2.5.uA..20.uA),
|
868
|
+
irange_200uA: (25.uA..200.uA),
|
869
|
+
irange_2mA: (250.uA..2.mA),
|
870
|
+
irange_20mA: (2.5.mA..20.mA),
|
871
|
+
irange_200mA: (25.mA..75.mA),
|
872
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
873
|
+
irange_2p8A: (390.mA..410.mA) } # This is verified on tester
|
874
|
+
sink_fold_t = (300.uS..2.S)
|
875
|
+
meter_irange = { irange_4uA: 4.uA,
|
876
|
+
irange_20uA: 20.uA,
|
877
|
+
irange_200uA: 200.uA,
|
878
|
+
irange_2mA: 2.mA,
|
879
|
+
irange_20mA: 20.mA,
|
880
|
+
irange_200mA: 200.mA,
|
881
|
+
irange_700mA: 700.mA,
|
882
|
+
irange_2p8A: 2.8.A }
|
883
|
+
meter_vrange = 18.V
|
884
|
+
tdelay = 0 # default tdelay
|
885
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
886
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
887
|
+
bandwidth = (0..255) # Integers
|
888
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
889
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
890
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
891
|
+
elsif @instrument == 'VHDVS_HC+x8' # also known as UVS256, High-Current, High-Accuracy, Merged8
|
892
|
+
forcev = (-2.V..18.V)
|
893
|
+
irange = [4.uA, 20.uA, 200.uA, 2.mA, 20.mA, 200.mA, 700.mA, 5.6.A]
|
894
|
+
source_overload_i = 'n/a'
|
895
|
+
source_overload_t = 'n/a'
|
896
|
+
source_fold_i = { irange_4uA: (500.nA..4.uA),
|
897
|
+
irange_20uA: (2.5.uA..20.uA),
|
898
|
+
irange_200uA: (25.uA..200.uA),
|
899
|
+
irange_2mA: (250.uA..2.mA),
|
900
|
+
irange_20mA: (2.5.mA..20.mA),
|
901
|
+
irange_200mA: (25.mA..200.mA),
|
902
|
+
irange_700mA: (100.mA..700.mA),
|
903
|
+
irange_5p6A: (800.mA..5.6.A) }
|
904
|
+
source_fold_t = (300.uS..2.S)
|
905
|
+
sink_overload_i = 'n/a'
|
906
|
+
sink_overload_t = 'n/a'
|
907
|
+
sink_fold_i = { irange_4uA: (500.nA..4.uA),
|
908
|
+
irange_20uA: (2.5.uA..20.uA),
|
909
|
+
irange_200uA: (25.uA..200.uA),
|
910
|
+
irange_2mA: (250.uA..2.mA),
|
911
|
+
irange_20mA: (2.5.mA..20.mA),
|
912
|
+
irange_200mA: (25.mA..75.mA),
|
913
|
+
irange_700mA: (90.mA..110.mA), # This is verified on tester
|
914
|
+
irange_5p6A: (790.mA..810.mA) } # This is verified on tester
|
915
|
+
sink_fold_t = (300.uS..2.S)
|
916
|
+
meter_irange = { irange_4uA: 4.uA,
|
917
|
+
irange_20uA: 20.uA,
|
918
|
+
irange_200uA: 200.uA,
|
919
|
+
irange_2mA: 2.mA,
|
920
|
+
irange_20mA: 20.mA,
|
921
|
+
irange_200mA: 200.mA,
|
922
|
+
irange_700mA: 700.mA,
|
923
|
+
irange_5p6A: 5.6.A }
|
924
|
+
meter_vrange = 18.V
|
925
|
+
tdelay = 0 # default tdelay
|
926
|
+
accuracy = { neg: '-0.001xSUPPLY-5.mV', pos: '0.001xSUPPLY+5.mV' }
|
927
|
+
filter = [49, 98, 195, 391, 781, 1563, 3125, 6250, 12_500, 25_000, 50_000, 100_000, 200_000]
|
928
|
+
bandwidth = (0..255) # Integers
|
929
|
+
supply.new(forcev, irange, source_overload_i, source_overload_t, source_fold_i,
|
930
|
+
source_fold_t, sink_overload_i, sink_overload_t, sink_fold_i,
|
931
|
+
sink_fold_t, meter_irange, meter_vrange, tdelay, accuracy, filter, bandwidth)
|
932
|
+
else
|
933
|
+
puts "please enter an instrument type: e.g. $tester.ate_hardware(\"VSM\").supply"
|
934
|
+
puts "Instrument type available: \"VSM\", \"VSMx2\", \"VSMx4\","
|
935
|
+
puts "\"HexVS\", \"HexVSx2\", \"HexVSx4\", \"HexVSx6\","
|
936
|
+
puts "\"HexVS+\", \"HexVS+x2\", \"HexVS+x4\", \"HexVS+x6\", \"HDVS1\","
|
937
|
+
puts "\"HDVS1x2\", \"HDVS1x4\", \"VHDVS\", \"VHDVS_HC\", \"VHDVSx2\","
|
938
|
+
puts "\"VHDVS_HCx2\", \"VHDVS_HCx4\", and \"VHDVS_HCx8\"."
|
939
|
+
puts "\"VHDVS+\", \"VHDVS_HC+\", \"VHDVS+x2\","
|
940
|
+
puts "\"VHDVS_HC+x2\", \"VHDVS_HC+x4\", and \"VHDVS_HC+x8\"."
|
941
|
+
puts 'HDVS1 is also known as HDVS. VHDVS is also known as UVS256.'
|
942
|
+
puts 'x2 is Merged2, x4 is Merged4, x6 is Merged6. _HC is High-Current.'
|
943
|
+
puts '+ is High-Accuracy.'
|
944
|
+
end
|
945
|
+
end
|
946
|
+
end
|
947
|
+
|
948
|
+
# ate_hardware stores "key" UltraFLEX hardware information needed for test program generation
|
949
|
+
# Instrument types available for ppmu: "HSD-M", "HSD-U", "HSD-4G", and "HSS-6G".
|
950
|
+
# Sample usage: $tester.ate_hardware("HSD-U").ppmu
|
951
|
+
# Instrument types available for supply: "VSM", "VSMx2", "VSMx4", "HexVS", "HexVSx2", "HexVSx4",
|
952
|
+
# "HexVSx6", "HexVS+x2", "HexVS+x4", "HexVS+x6", "HDVS1", "HDVS1x2", "HDVS1x4", "VHDVS",
|
953
|
+
# "VHDVS_HC", "VHDVSx2", "VHDVS_HCx2", "VHDVS_HCx4", "VHDVS_HCx8", "VHDVS+", "VHDVS_HC+",
|
954
|
+
# "VHDVS+x2", "VHDVS_HC+x2", "VHDVS_HC+x4", and "VHDVS_HC+x8".
|
955
|
+
# HDVS1 is also known as HDVS. VHDVS is also known as UVS256.
|
956
|
+
# x2 is Merged2, x4 is Merged4, x6 is Merged6. _HC is High-Current.
|
957
|
+
# + is High-Accuracy.
|
958
|
+
# Sample usage: $tester.ate_hardware("VSM").supply
|
959
|
+
# Sample usage: $tester.ate_hardware("HSD-M").ppmu
|
960
|
+
def ate_hardware(instrumentname = '')
|
961
|
+
@ate_hardware = ATEHardware.new(instrumentname)
|
962
|
+
end
|
963
|
+
end
|
964
|
+
end
|
965
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# This code is used to extend Origen Core's pin class with additional functionality
|
2
|
+
|
3
|
+
require 'origen/pins/pin'
|
4
|
+
|
5
|
+
module Origen
|
6
|
+
module Pins
|
7
|
+
class Pin
|
8
|
+
# Returns the channel number for the pin on a given tester site (default = 0), based on a given tester channel
|
9
|
+
# map (default_channelmap). Optionally user can specify site or channelmap.
|
10
|
+
def channel(options = {})
|
11
|
+
options = {
|
12
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
13
|
+
site: 0 # Default is to use site 0.
|
14
|
+
}.merge(options)
|
15
|
+
unless $tester.channelmap[options[:chanmapname]]
|
16
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
17
|
+
end
|
18
|
+
|
19
|
+
channelinfo = Struct.new(:channel, :chanmapname, :site)
|
20
|
+
channelinfo.new($tester.get_tester_channel(options[:chanmapname], name, options[:site]), options[:chanmapname], options[:site])
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the instrument type for the pin on a given tester site (default = 0), based on a given tester channel
|
24
|
+
# map (default_channelmap) and a given tester configuration (default_testerconfig).
|
25
|
+
# Optionally user can specify site, channelmap, or testerconfig.
|
26
|
+
def instrument_type(options = {})
|
27
|
+
options = {
|
28
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
29
|
+
site: 0, # Default is to use site 0.
|
30
|
+
testerconfigname: $tester.default_testerconfig # Default is to use default_testerconfig
|
31
|
+
}.merge(options)
|
32
|
+
|
33
|
+
unless $tester.channelmap[options[:chanmapname]]
|
34
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
35
|
+
end
|
36
|
+
unless $tester.testerconfig[options[:testerconfigname]]
|
37
|
+
fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type"
|
38
|
+
end
|
39
|
+
|
40
|
+
instrumentinfo = Struct.new(:instrument, :chanmapname, :site, :testerconfigname)
|
41
|
+
instrumentinfo.new($tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i), options[:chanmapname], options[:site], options[:testerconfigname])
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns ATE Hardware information for the pin (channel # and instrument type) on a given tester site
|
45
|
+
# (default = 0), based on a given tester channelmap (default_channelmap) and a given tester
|
46
|
+
# configuration (default_testerconfig). # Optionally user can specify site, channelmap, or testerconfig.
|
47
|
+
def ate_hardware(options = {})
|
48
|
+
options = {
|
49
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
50
|
+
site: 0, # Default is to use site 0.
|
51
|
+
testerconfigname: $tester.default_testerconfig # Default is to use default_testerconfig
|
52
|
+
}.merge(options)
|
53
|
+
|
54
|
+
unless $tester.channelmap[options[:chanmapname]]
|
55
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
56
|
+
end
|
57
|
+
unless $tester.testerconfig[options[:testerconfigname]]
|
58
|
+
fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type"
|
59
|
+
end
|
60
|
+
if Origen.top_level.power_pin_groups.keys.include?(name) # Power Pin Groups do not need :ppmu, but need :supply
|
61
|
+
instrumentinfo = Struct.new(:channel, :instrument, :chanmapname, :site, :testerconfigname, :supply)
|
62
|
+
@channel = $tester.get_tester_channel(options[:chanmapname], name, options[:site])
|
63
|
+
@instrument = $tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i) + $tester.is_vhdvs_hc(options[:chanmapname], name, options[:site]).to_s + $tester.is_hexvs_plus(options[:testerconfigname], @channel.split('.')[0].to_i).to_s + $tester.is_vhdvs_plus(options[:testerconfigname], @channel.split('.')[0].to_i).to_s + $tester.merged_channels(options[:chanmapname], name, options[:site]).to_s
|
64
|
+
@supply = $tester.ate_hardware(@instrument).supply
|
65
|
+
instrumentinfo.new(@channel, @instrument, options[:chanmapname], options[:site], options[:testerconfigname], @supply)
|
66
|
+
else
|
67
|
+
if $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i == 24
|
68
|
+
instrumentinfo = Struct.new(:channel, :instrument, :chanmapname, :site, :testerconfigname)
|
69
|
+
instrumentinfo.new($tester.get_tester_channel(options[:chanmapname], name, options[:site]), $tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i), options[:chanmapname], options[:site], options[:testerconfigname])
|
70
|
+
else
|
71
|
+
instrumentinfo = Struct.new(:channel, :instrument, :chanmapname, :site, :testerconfigname, :ppmu)
|
72
|
+
instrumentinfo.new($tester.get_tester_channel(options[:chanmapname], name, options[:site]), $tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i), options[:chanmapname], options[:site], options[:testerconfigname], $tester.ate_hardware($tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i)).ppmu)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# This code is used to extend Origen Core's pin_collection class with additional functionality
|
2
|
+
|
3
|
+
require 'origen/pins/pin_collection'
|
4
|
+
|
5
|
+
module Origen
|
6
|
+
module Pins
|
7
|
+
class PinCollection
|
8
|
+
# Returns the channel number for the pin_collection on a given tester site (default = 0), based on a given tester channel
|
9
|
+
# map (default_channelmap). Optionally user can specify site or channelmap.
|
10
|
+
def channel(options = {})
|
11
|
+
options = {
|
12
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
13
|
+
site: 0 # Default is to use site 0.
|
14
|
+
}.merge(options)
|
15
|
+
unless $tester.channelmap[options[:chanmapname]]
|
16
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
17
|
+
end
|
18
|
+
|
19
|
+
channelinfo = Struct.new(:channel, :chanmapname, :site)
|
20
|
+
channelinfo.new($tester.get_tester_channel(options[:chanmapname], name, options[:site]), options[:chanmapname], options[:site])
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the instrument type for the pin_collection on a given tester site (default = 0), based on a given tester channel
|
24
|
+
# map (default_channelmap) and a given tester configuration (default_testerconfig).
|
25
|
+
# Optionally user can specify site, channelmap, or testerconfig.
|
26
|
+
def instrument_type(options = {})
|
27
|
+
options = {
|
28
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
29
|
+
site: 0, # Default is to use site 0.
|
30
|
+
testerconfigname: $tester.default_testerconfig # Default is to use default_testerconfig
|
31
|
+
}.merge(options)
|
32
|
+
|
33
|
+
unless $tester.channelmap[options[:chanmapname]]
|
34
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
35
|
+
end
|
36
|
+
unless $tester.testerconfig[options[:testerconfigname]]
|
37
|
+
fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type"
|
38
|
+
end
|
39
|
+
|
40
|
+
instrumentinfo = Struct.new(:instrument, :chanmapname, :site, :testerconfigname)
|
41
|
+
instrumentinfo.new($tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i), options[:chanmapname], options[:site], options[:testerconfigname])
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns ATE Hardware information for the pin_collection (channel # and instrument type) on a given tester site
|
45
|
+
# (default = 0), based on a given tester channelmap (default_channelmap) and a given tester
|
46
|
+
# configuration (default_testerconfig). # Optionally user can specify site, channelmap, or testerconfig.
|
47
|
+
def ate_hardware(options = {})
|
48
|
+
options = {
|
49
|
+
chanmapname: $tester.default_channelmap, # Default is to use default_channelmap
|
50
|
+
site: 0, # Default is to use site 0.
|
51
|
+
testerconfigname: $tester.default_testerconfig # Default is to use default_testerconfig
|
52
|
+
}.merge(options)
|
53
|
+
|
54
|
+
unless $tester.channelmap[options[:chanmapname]]
|
55
|
+
fail "You must first import the tester channel map (e.g. $tester.channelmap = \"probe_x32\") before calling pin.channel"
|
56
|
+
end
|
57
|
+
unless $tester.testerconfig[options[:testerconfigname]]
|
58
|
+
fail "You must first import the tester configuration (e.g. $tester.testerconfig = \"UflexConfigA\") before calling pin.instrument_type"
|
59
|
+
end
|
60
|
+
|
61
|
+
if Origen.top_level.power_pin_groups.keys.include?(name) # Power Pin Groups do not need :ppmu, but need :supply
|
62
|
+
instrumentinfo = Struct.new(:channel, :instrument, :chanmapname, :site, :testerconfigname, :supply)
|
63
|
+
@channel = $tester.get_tester_channel(options[:chanmapname], name, options[:site])
|
64
|
+
@instrument = $tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], name, options[:site]).split('.')[0].to_i) + $tester.is_vhdvs_hc(options[:chanmapname], name, options[:site]).to_s + $tester.is_hexvs_plus(options[:testerconfigname], @channel.split('.')[0].to_i).to_s + $tester.is_vhdvs_plus(options[:testerconfigname], @channel.split('.')[0].to_i).to_s + $tester.merged_channels(options[:chanmapname], name, options[:site]).to_s
|
65
|
+
@supply = $tester.ate_hardware(@instrument).supply
|
66
|
+
instrumentinfo.new(@channel, @instrument, options[:chanmapname], options[:site], options[:testerconfigname], @supply)
|
67
|
+
else # Collecting information of individual members and put in arrays
|
68
|
+
instrumentinfo = Struct.new(:members, :channel, :instrument, :chanmapname, :site, :testerconfigname, :ppmu)
|
69
|
+
@members = []
|
70
|
+
@channel = []
|
71
|
+
@instrument = []
|
72
|
+
@ppmu = []
|
73
|
+
Origen.top_level.pin_groups(name).map(&:id).each do |pinname|
|
74
|
+
@members << Origen.top_level.pins(pinname).name
|
75
|
+
@channel << $tester.get_tester_channel(options[:chanmapname], Origen.top_level.pins(pinname).name, options[:site])
|
76
|
+
@instrument << $tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], Origen.top_level.pins(pinname).name, options[:site]).split('.')[0].to_i)
|
77
|
+
@ppmu << $tester.ate_hardware($tester.get_tester_instrument(options[:testerconfigname], $tester.get_tester_channel(options[:chanmapname], Origen.top_level.pins(pinname).name, options[:site]).split('.')[0].to_i)).ppmu
|
78
|
+
end
|
79
|
+
instrumentinfo.new(@members, @channel, @instrument, options[:chanmapname], options[:site], options[:testerconfigname], @ppmu)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/origen_testers.rb
CHANGED
@@ -13,6 +13,7 @@ module OrigenTesters
|
|
13
13
|
autoload :Parser, 'origen_testers/parser'
|
14
14
|
autoload :BasicTestSetups, 'origen_testers/basic_test_setups'
|
15
15
|
autoload :ProgramGenerators, 'origen_testers/program_generators'
|
16
|
+
|
16
17
|
# not yet autoload :Time, 'origen_testers/time'
|
17
18
|
end
|
18
19
|
|
@@ -22,3 +23,5 @@ require 'origen_testers/pattern_compilers'
|
|
22
23
|
|
23
24
|
require 'origen_testers/callback_handlers'
|
24
25
|
require_relative '../config/application.rb'
|
26
|
+
require 'origen_testers/origen_ext/pins/pin'
|
27
|
+
require 'origen_testers/origen_ext/pins/pin_collection'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen_testers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/origen_testers/igxl_based_tester/parser/timeset.rb
|
199
199
|
- lib/origen_testers/igxl_based_tester/parser/timesets.rb
|
200
200
|
- lib/origen_testers/igxl_based_tester/ultraflex.rb
|
201
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb
|
201
202
|
- lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb
|
202
203
|
- lib/origen_testers/igxl_based_tester/ultraflex/flow.rb
|
203
204
|
- lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb
|
@@ -219,6 +220,8 @@ files:
|
|
219
220
|
- lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb
|
220
221
|
- lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb
|
221
222
|
- lib/origen_testers/interface.rb
|
223
|
+
- lib/origen_testers/origen_ext/pins/pin.rb
|
224
|
+
- lib/origen_testers/origen_ext/pins/pin_collection.rb
|
222
225
|
- lib/origen_testers/parser.rb
|
223
226
|
- lib/origen_testers/parser/description_lookup.rb
|
224
227
|
- lib/origen_testers/parser/searchable_array.rb
|