origen_testers 0.8.7 → 0.8.8

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.
@@ -3,7 +3,7 @@
3
3
  # Some of the other flows also cover the flow control API and those tests are used
4
4
  # to guarantee that the test ID references work when sub-flows are involved.
5
5
  # This flow provides a full checkout of all flow control methods.
6
- Flow.create do
6
+ Flow.create interface: 'OrigenTesters::Test::Interface' do
7
7
 
8
8
  self.resources_filename = 'flow_control'
9
9
 
@@ -60,6 +60,11 @@ Flow.create do
60
60
  func :probe_only_test2
61
61
  end
62
62
 
63
+ log "Test that the block form of if_job can be overridden, prb9 should be removed"
64
+ if_job [:prb1, :prb2, :prb9] do
65
+ func :probe_only_test1
66
+ end
67
+
63
68
  log "Test that unless_job works"
64
69
  func :warmish_test, unless_job: :fc
65
70
 
@@ -2,7 +2,7 @@
2
2
  # passed in here, iterators and other
3
3
  # argument passing will be supported
4
4
  # similar to Pattern.create.
5
- Flow.create do
5
+ Flow.create interface: 'OrigenTesters::Test::Interface' do
6
6
 
7
7
  self.resources_filename = 'prb1'
8
8
 
@@ -1,5 +1,5 @@
1
1
  # Similar to the test flows an interface instance is passed in as the first argument.
2
- Resources.create do
2
+ Resources.create interface: 'OrigenTesters::Test::Interface' do
3
3
 
4
4
  self.resources_filename = 'prb1'
5
5
 
@@ -1,6 +1,6 @@
1
1
  # An example of creating an entire test program from
2
2
  # a single source file
3
- Flow.create do
3
+ Flow.create interface: 'OrigenTesters::Test::Interface' do
4
4
 
5
5
  self.resources_filename = 'prb2'
6
6
 
@@ -2,7 +2,7 @@
2
2
  # passed in here, iterators and other
3
3
  # argument passing will be supported
4
4
  # similar to Pattern.create.
5
- Flow.create do
5
+ Flow.create interface: 'OrigenTesters::Test::Interface' do
6
6
 
7
7
  # Instantiate tests via the
8
8
  # interface
@@ -1,4 +1,4 @@
1
- Resources.create do
1
+ Resources.create interface: 'OrigenTesters::Test::Interface' do
2
2
 
3
3
  pinmap :pinmap_test
4
4
 
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.8.7
4
+ version: 0.8.8
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-12-08 00:00:00.000000000 Z
11
+ date: 2016-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -277,12 +277,8 @@ files:
277
277
  - lib/origen_testers/test/custom_test_interface.rb
278
278
  - lib/origen_testers/test/dut.rb
279
279
  - lib/origen_testers/test/dut2.rb
280
- - lib/origen_testers/test/j750_base_interface.rb
281
- - lib/origen_testers/test/j750_hpt_interface.rb
282
- - lib/origen_testers/test/j750_interface.rb
280
+ - lib/origen_testers/test/interface.rb
283
281
  - lib/origen_testers/test/nvm.rb
284
- - lib/origen_testers/test/ultraflex_interface.rb
285
- - lib/origen_testers/test/v93k_interface.rb
286
282
  - lib/origen_testers/timing.rb
287
283
  - lib/origen_testers/vector.rb
288
284
  - lib/origen_testers/vector_based_tester.rb
@@ -1,145 +0,0 @@
1
- module OrigenTesters
2
- module Test
3
- class J750BaseInterface
4
- # Options passed to Flow.create and Library.create will be passed in here, use as
5
- # desired to configure your interface
6
- def initialize(options = {})
7
- end
8
-
9
- def log(msg)
10
- flow.logprint(msg)
11
- end
12
-
13
- def func(name, options = {})
14
- options = {
15
- duration: :static
16
- }.merge(options)
17
-
18
- block_loop(name, options) do |block, i, group|
19
- ins = test_instances.functional(name)
20
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
21
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
22
- if group
23
- pname = "#{name}_b#{i}_pset"
24
- patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
25
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
26
- ins.pattern = pname
27
- flow.test(group, options) if i == 0
28
- else
29
- pname = "#{name}_pset"
30
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
31
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
32
- ins.pattern = pname
33
- if options[:cz_setup]
34
- flow.cz(ins, options[:cz_setup], options)
35
- else
36
- flow.test(ins, options)
37
- end
38
- end
39
- end
40
- end
41
-
42
- def block_loop(name, options)
43
- if options[:by_block]
44
- test_instances.group do |group|
45
- group.name = name
46
- $dut.blocks.each_with_index do |block, i|
47
- yield block, i, group
48
- end
49
- end
50
- else
51
- yield
52
- end
53
- end
54
-
55
- def por(options = {})
56
- options = {
57
- instance_not_available: true
58
- }.merge(options)
59
- flow.test('por_ins', options)
60
- end
61
-
62
- def para(name, options = {})
63
- options = {
64
- high_voltage: false
65
- }.merge(options)
66
- if options.delete(:high_voltage)
67
- ins = test_instances.bpmu(name)
68
- else
69
- ins = test_instances.ppmu(name)
70
- end
71
- ins.dc_category = 'NVM_PARA'
72
- flow.test(ins, options)
73
- patsets.add("#{name}_pset", pattern: "#{name}.PAT")
74
- end
75
-
76
- # OR 2 IDS together into 1 flag
77
- def or_ids(options = {})
78
- flow.or_flags(options[:id1], options[:id2], options)
79
- end
80
-
81
- def nop(options = {})
82
- flow.nop options
83
- end
84
-
85
- def mto_memory(name, options = {})
86
- options = {
87
- duration: :static
88
- }.merge(options)
89
-
90
- block_loop(name, options) do |block, i, group|
91
- ins = test_instances.mto_memory(name)
92
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
93
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
94
- if group
95
- pname = "#{name}_b#{i}_pset"
96
- patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
97
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
98
- ins.pattern = pname
99
- flow.test(group, options) if i == 0
100
- else
101
- pname = "#{name}_pset"
102
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
103
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
104
- ins.pattern = pname
105
- if options[:cz_setup]
106
- flow.cz(ins, options[:cz_setup], options)
107
- else
108
- flow.test(ins, options)
109
- end
110
- end
111
- end
112
-
113
- def meas(name, options = {})
114
- options = {
115
- duration: :static
116
- }.merge(options)
117
-
118
- name = "meas_#{name}" unless name.to_s =~ /meas/
119
-
120
- if options[:pins] == :hi_v
121
- ins = test_instances.board_pmu(name)
122
- elsif options[:pins] == :power
123
- ins = test_instances.powersupply(name)
124
- else
125
- ins = test_instances.pin_pmu(name)
126
- end
127
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
128
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
129
- ins.lo_limit = options[:lo_limit]
130
- ins.hi_limit = options[:hi_limit]
131
-
132
- pname = "#{name}_pset"
133
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
134
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
135
- ins.pattern = pname
136
- if options[:cz_setup]
137
- flow.cz(ins, options[:cz_setup], options)
138
- else
139
- flow.test(ins, options)
140
- end
141
- end
142
- end
143
- end
144
- end
145
- end
@@ -1,8 +0,0 @@
1
- require 'origen_testers/test/j750_base_interface'
2
- module OrigenTesters
3
- module Test
4
- class J750HPTInterface < J750BaseInterface
5
- include OrigenTesters::J750_HPT::Generator
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- require 'origen_testers/test/j750_base_interface'
2
- module OrigenTesters
3
- module Test
4
- class J750Interface < J750BaseInterface
5
- include OrigenTesters::J750::Generator
6
- end
7
- end
8
- end
@@ -1,377 +0,0 @@
1
- module OrigenTesters
2
- module Test
3
- class UltraFLEXInterface
4
- include OrigenTesters::UltraFLEX::Generator
5
-
6
- # Options passed to Flow.create and Library.create will be passed in here, use as
7
- # desired to configure your interface
8
- def initialize(options = {})
9
- end
10
-
11
- def log(msg)
12
- flow.logprint(msg)
13
- end
14
-
15
- def func(name, options = {})
16
- options = {
17
- duration: :static
18
- }.merge(options)
19
-
20
- block_loop(name, options) do |block, i, group|
21
- ins = test_instances.functional(name)
22
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
23
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
24
- if group
25
- pname = "#{name}_b#{i}_pset"
26
- patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
27
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
28
- ins.pattern = pname
29
- flow.test(group, options) if i == 0
30
- else
31
- pname = "#{name}_pset"
32
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
33
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
34
- ins.pattern = pname
35
- if options[:cz_setup]
36
- flow.cz(ins, options[:cz_setup], options)
37
- else
38
- flow.test(ins, options)
39
- end
40
- end
41
- end
42
- end
43
-
44
- def meas(name, options = {})
45
- options = {
46
- duration: :static
47
- }.merge(options)
48
-
49
- name = "meas_#{name}" unless name.to_s =~ /meas/
50
-
51
- ins = test_instances.functional(name)
52
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
53
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
54
- ins.lo_limit = options[:lo_limit]
55
- ins.hi_limit = options[:hi_limit]
56
- ins.scale = options[:scale]
57
- ins.units = options[:units]
58
- ins.defer_limits = options[:defer_limits]
59
-
60
- pname = "#{name}_pset"
61
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
62
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
63
- ins.pattern = pname
64
- if options[:cz_setup]
65
- flow.cz(ins, options[:cz_setup], options)
66
- else
67
- flow.test(ins, options)
68
- end
69
- end
70
-
71
- def block_loop(name, options)
72
- if options[:by_block]
73
- test_instances.group do |group|
74
- group.name = name
75
- $dut.blocks.each_with_index do |block, i|
76
- yield block, i, group
77
- end
78
- end
79
- else
80
- yield
81
- end
82
- end
83
-
84
- def por(options = {})
85
- options = {
86
- instance_not_available: true
87
- }.merge(options)
88
- flow.test('por_ins', options)
89
- end
90
-
91
- def para(name, options = {})
92
- print "UltraFLEX Parametric Test not yet supported for UltraFlex!\n"
93
- end
94
-
95
- # OR 2 IDS together into 1 flag
96
- def or_ids(options = {})
97
- flow.or_flags(options[:id1], options[:id2], options)
98
- end
99
-
100
- def nop(options = {})
101
- flow.nop options
102
- end
103
-
104
- def mto_memory(args)
105
- # DO NOTHING, NOT YET SUPPORTED IN ULTRAFLEX
106
- end
107
-
108
- def bin(number, options = {})
109
- end
110
-
111
- # Assign relevant pins for pinmap sheet generation
112
- def pinmap(name, options = {})
113
- pinmap = pinmaps("#{name}")
114
- Origen.top_level.add_pin_group :JTAG, :tdi, :tdo, :tms
115
- Origen.top_level.power_pin_groups.keys.each do |grp_key|
116
- pinmap.add_power_pin(grp_key, type: 'Power', comment: "# #{grp_key}")
117
- end
118
- Origen.top_level.virtual_pins.keys.each do |util_pin|
119
- upin = Origen.top_level.virtual_pins(util_pin)
120
- case upin.type
121
- when :virtual_pin
122
- pinmap.add_utility_pin(upin.name, type: 'Utility', comment: "# #{util_pin}")
123
- when :ate_ch
124
- pinmap.add_utility_pin(upin.name, type: 'I/O', comment: "# #{util_pin}")
125
- end
126
- end
127
- Origen.top_level.pin.keys.each do |pkey|
128
- pinmap.add_pin(Origen.top_level.pin(pkey).name, type: 'I/O', comment: "# #{pkey}")
129
- end
130
- Origen.top_level.pin_groups.keys.sort.each do |gkey|
131
- # Do not include pins that are aliased to themselves
132
- Origen.top_level.pin(gkey).each do |pin|
133
- pinmap.add_group_pin(gkey, Origen.top_level.pin(pin.id).name, type: 'I/O', comment: "# #{gkey}")
134
- end
135
- end
136
- end
137
-
138
- # Assign relevant edges in preparation for edgeset/timeset sheet generation
139
- def edge(category, pin, options = {})
140
- options = {
141
- d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
142
- d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
143
- d0_edge: '', # time at which the input drive is turned on
144
- d1_edge: '', # time of the initial data drive edge
145
- d2_edge: '', # time of the return format data drive edge
146
- d3_edge: '', # time at which the input drive is turned off
147
- c_mode: 'Edge', # output compare mode
148
- c1_edge: '', # time of the initial output compare edge
149
- c2_edge: '', # time of the final output compare edge (window compare)
150
- t_res: 'Machine', # timing resolution (possibly ATE-specific)
151
- clk_per: '' # clock period equation - for use with MCG
152
- }.merge(options)
153
-
154
- @edge_collection = edges
155
- @edge_collection.add(category, pin, options)
156
- end
157
-
158
- def edge_collection
159
- @edge_collection
160
- end
161
-
162
- def edgeset(sheet_name, options = {})
163
- options = {
164
- edgeset: :es_default,
165
- period: 'cycle', # tester cycle period
166
- t_mode: 'Machine' # edgeset timing mode (possibly ATE-specific)
167
- }.merge(options)
168
- edgeset = options.delete(:edgeset)
169
- pin = options.delete(:pin)
170
- edge = options.delete(:edge)
171
-
172
- @edgeset = edgesets(sheet_name, options)
173
- @edgeset.add(edgeset, pin, edge, options)
174
- collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
175
- end
176
-
177
- def timeset(sheet_name, options = {})
178
- options = {
179
- timeset: :default,
180
- master_ts: :default
181
- }.merge(options)
182
- timeset = options.delete(:timeset)
183
- pin = options.delete(:pin)
184
- eset = options.delete(:eset)
185
-
186
- @timeset = timesets(sheet_name, options)
187
- @timeset.add(timeset, pin, eset, options)
188
- end
189
-
190
- def ac_specset(sheet_name, expression, options = {})
191
- options = {
192
- specset: :default,
193
- nom: { typ: nil }
194
- }.merge(options)
195
-
196
- ss = ac_specsets(sheet_name)
197
- add_ac_specs(ss, expression, options)
198
- end
199
-
200
- # Collects AC Spec object(s) from the given expression and adds them to the given Specset
201
- def collect_ac_specs(ssname, edge, options = {})
202
- options = {
203
- nom: { typ: nil }
204
- }.merge(options)
205
-
206
- # Create a Specsets object from the UFlex program generator API
207
- ss = ac_specsets(ssname.to_sym)
208
- add_ac_specs(ss, edge.clk_per, options)
209
- add_ac_specs(ss, edge.d0_edge, options)
210
- add_ac_specs(ss, edge.d1_edge, options)
211
- add_ac_specs(ss, edge.d2_edge, options)
212
- add_ac_specs(ss, edge.d3_edge, options)
213
- add_ac_specs(ss, edge.c1_edge, options)
214
- add_ac_specs(ss, edge.c2_edge, options)
215
- end
216
-
217
- # Adds new AC Spec object(s) to the given Specset
218
- def add_ac_specs(ss, expression, options = {})
219
- options = {
220
- specset: :default
221
- }.merge(options)
222
-
223
- return unless expression.is_a? String
224
- # collect all variable names within the expression
225
- vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
226
- vars.each do |var|
227
- next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/
228
- # The substitutions below are used for backward compatibility
229
- next if var =~ /^(d_on|d_data|d_ret|d_off|c_open|c_close)$/
230
- next if var =~ /^(nS|uS|mS|S)$/i
231
- next if ss.ac_specsets.key?(options[:specset]) && ss.ac_specsets[options[:specset]].include?(var)
232
-
233
- ss.add(var, options)
234
- end
235
- end
236
-
237
- # Assign relevant power supply levels in preparation for levelset sheet generation
238
- def pwr_level(category, options = {})
239
- options = {
240
- vmain: 1.8, # Main supply voltage
241
- valt: 1.8, # Alternate supply voltage
242
- ifold: 1, # Supply clamp current
243
- delay: 0 # Supply power-up delay
244
- }.merge(options)
245
-
246
- @level_collection = levels
247
- @level_collection.add_power_level(category, options)
248
- end
249
-
250
- # Assign relevant single-ended pin levels in preparation for levelset sheet generation
251
- def pin_level_se(category, options = {})
252
- options = {
253
- vil: 0, # Input drive low
254
- vih: 1.8, # Input drive high
255
- vol: 1.0, # Output compare low
256
- voh: 0.8, # Output compare high
257
- vcl: -1, # Voltage clamp low
258
- vch: 2.5, # Voltage clamp high
259
- vt: 0.9, # Termination voltage
260
- voutlotyp: 0, #
261
- vouthityp: 0, #
262
- dmode: 'Largeswing-VT' # Driver mode
263
- }.merge(options)
264
-
265
- @level_collection = levels
266
- @level_collection.add_se_pin_level(category, options)
267
- end
268
-
269
- def level_collection
270
- @level_collection
271
- end
272
-
273
- def levelset(sheet_name, options = {})
274
- pin = options.delete(:pin)
275
- level = options.delete(:level)
276
-
277
- @levelset = levelsets(sheet_name)
278
- @levelset.add(sheet_name, pin, level, options)
279
- collect_dc_specs(@levelset.spec_sheet, level)
280
- end
281
-
282
- def dc_specset(sheet_name, expression, options = {})
283
- options = {
284
- min: { min: nil },
285
- nom: { typ: nil },
286
- max: { max: nil }
287
- }.merge(options)
288
-
289
- ss = dc_specsets(sheet_name.to_sym)
290
- add_dc_specs(ss, expression, options)
291
- end
292
-
293
- # Collects DC Spec object(s) from the given expression and adds them to the given Specset
294
- def collect_dc_specs(ssname, level, options = {})
295
- options = {
296
- nom: { typ: nil },
297
- min: { min: nil },
298
- max: { max: nil }
299
- }.merge(options)
300
-
301
- # Create a Specsets object from the UFlex program generator API
302
- ss = dc_specsets(ssname.to_sym)
303
- if level.respond_to?(:vmain)
304
- add_dc_specs(ss, level.vmain, options)
305
- add_dc_specs(ss, level.valt, options)
306
- add_dc_specs(ss, level.ifold, options)
307
- elsif level.respond_to?(:vil)
308
- add_dc_specs(ss, level.vil, options)
309
- add_dc_specs(ss, level.vih, options)
310
- add_dc_specs(ss, level.vol, options)
311
- add_dc_specs(ss, level.voh, options)
312
- add_dc_specs(ss, level.vcl, options)
313
- add_dc_specs(ss, level.vch, options)
314
- add_dc_specs(ss, level.vt, options)
315
- add_dc_specs(ss, level.voutlotyp, options)
316
- add_dc_specs(ss, level.vouthityp, options)
317
- end
318
- end
319
-
320
- # Adds new DC Spec object(s) to the given Specset
321
- def add_dc_specs(ss, expression, options = {})
322
- options = {
323
- specset: :default
324
- }.merge(options)
325
-
326
- return unless expression.is_a? String
327
- vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
328
- vars.each do |var|
329
- next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i
330
-
331
- ss.add(var, options)
332
- end
333
- end
334
-
335
- def global_spec(var, options = {})
336
- options = {
337
- job: nil,
338
- value: nil,
339
- comment: nil
340
- }.merge(options)
341
-
342
- global_specs('SpecsGlobal').add(var, job: options[:job], value: options[:value], comment: options[:comment])
343
- end
344
-
345
- def job_def(jname, options = {})
346
- options = {
347
- pinmap: pinmap_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
348
- instances: test_instance_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
349
- flows: flow_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
350
- ac_specs: ac_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
351
- dc_specs: dc_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
352
- patsets: patset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
353
- patgroups: patgroup_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
354
- bintables: [],
355
- cz: [],
356
- test_procs: [],
357
- mix_sig_timing: [],
358
- wave_defs: [],
359
- psets: [],
360
- sigs_port_map: [],
361
- fract_bus: [],
362
- comment: nil
363
- }.merge(options)
364
-
365
- program_jobs('Jobs').add(jname, options)
366
- end
367
-
368
- def reference(reference, options = {})
369
- options = {
370
- comment: nil
371
- }.merge(options)
372
-
373
- references('Refs').add(reference, options)
374
- end
375
- end
376
- end
377
- end