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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1eb8eec2e4b2ea9b43e9f85db05a9e20a67e9fed
4
- data.tar.gz: 364c16ce86593110cf00d77192b184f6134cfc31
3
+ metadata.gz: 6a52647531345037e756ea1413fad9e55af38d5e
4
+ data.tar.gz: d2f632b5f8fc173a407a367e44f76f11bff71a9a
5
5
  SHA512:
6
- metadata.gz: 02288e643e51cc7828820ffed4d611a031f3cee0d5b7a4ba95701db4e56cd53624d96656ac1b8bbeb0e9d66daaa1365aaeb4130a0e7718dccecf4afa9fdc7575
7
- data.tar.gz: d876aa27f74e159ebd21b66634529db508b71f3a3fd45121ab8da21b7fa3fb90fa4c53e0a4d32c1690829b4aef657a49497387f5bd9d97b84a8b1e7ca59eb8c7
6
+ metadata.gz: 37665c194131cff9784e4eb867750aa1d44dc1f50fe899348696f6872ed5f3d8d096ca1b636ade17aaaf5a268af3be0380e4be7882b51d915c9123982581e4fe
7
+ data.tar.gz: 74af03290ef3057d9347294c75a028ff18d3784f9b1d9585e7c9ab5de6d93e6d508aa51b7e5a799ea5183aaf8d7d82bcfbd3eaf67ef12638fb68fc8a2ee8f747
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenTesters
2
2
  MAJOR = 0
3
3
  MINOR = 5
4
- BUGFIX = 6
4
+ BUGFIX = 7
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -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 :max_site
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
- @testerconfig[testconfigname][slot.split('.').first.to_i] = slotnum.new(slot.split('.').first.to_i, instrument, idprom.chomp)
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 - 2
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
@@ -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.6
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-02-03 00:00:00.000000000 Z
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