origen_testers 0.8.7 → 0.8.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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