origen_testers 0.48.1 → 0.49.1
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 +5 -5
- data/config/version.rb +1 -1
- data/lib/origen_testers/atp/flow.rb +24 -6
- data/lib/origen_testers/flow.rb +5 -1
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +2 -1
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +7 -1
- data/lib/origen_testers/labview_based_tester/pxie6570.rb +1 -1
- data/lib/origen_testers/smartest_based_tester/base.rb +7 -0
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +35 -0
- data/lib/origen_testers/smartest_based_tester/base/limits_file.rb +12 -1
- data/lib/origen_testers/test/interface.rb +25 -0
- data/program/flow_control.rb +33 -1
- data/program/flow_control_flag_bug.rb +25 -0
- data/program/test.rb +2 -0
- data/templates/origen_guides/program/flowapi.md.erb +33 -0
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 75b1fa14ed70e74c6a983c7214b55a575b346563b296ef6381b0d90be0ac9383
|
4
|
+
data.tar.gz: 644ea157e1e0b4fd0586ef09360566dd6b9d9bbfa1fb216da16b9f6de3688616
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67267f477fb2fa7796e92e0d742137781b8450125fee7756c8d3996f7511db6de66069b8a1564ca436295fd928318fc2a85c47a4d198155953b8126cca49f569
|
7
|
+
data.tar.gz: a9bb49fb80816c242860a099f9215c30d58080d535aae0cefd61f5f7875939968ba0a376af3b87c7839e52eef57713835b1f2fbab32b67a4e64a5aa7b92b242f
|
data/config/version.rb
CHANGED
@@ -439,6 +439,8 @@ module OrigenTesters::ATP
|
|
439
439
|
children << on_pass(options[:on_pass]) if options[:on_pass]
|
440
440
|
end
|
441
441
|
|
442
|
+
children << priority(options[:priority]) if options[:priority]
|
443
|
+
|
442
444
|
save_conditions
|
443
445
|
n(:test, children)
|
444
446
|
end
|
@@ -581,14 +583,26 @@ module OrigenTesters::ATP
|
|
581
583
|
end
|
582
584
|
|
583
585
|
def loop(*args, &block)
|
584
|
-
unless args[0].keys.include?(:from) && args[0].keys.include?(:to)
|
585
|
-
fail 'Loop must specify :from, :to
|
586
|
+
unless args[0].keys.include?(:from) && args[0].keys.include?(:to)
|
587
|
+
fail 'Loop must specify :from, :to'
|
588
|
+
end
|
589
|
+
# assume 1 if :step not provided
|
590
|
+
unless args[0].keys.include?(:step)
|
591
|
+
args[0][:step] = 1
|
592
|
+
end
|
593
|
+
# assume 1 if :test_num_inc not provided
|
594
|
+
unless args[0].keys.include?(:test_num_inc)
|
595
|
+
args[0][:test_num_inc] = 1
|
596
|
+
end
|
597
|
+
# Add node for set of flag to be used for loop
|
598
|
+
unless args[0][:var].nil?
|
599
|
+
set(args[0][:var], 0)
|
586
600
|
end
|
587
601
|
extract_meta!(options) do
|
588
602
|
apply_conditions(options) do
|
589
|
-
# always pass
|
590
|
-
#
|
591
|
-
params = [args[0][:from], args[0][:to], args[0][:step], args[0][:var]]
|
603
|
+
# always pass 5-element array to loop node to simplify downstream parser
|
604
|
+
# element, 'var', will be nil if not specified by loop call
|
605
|
+
params = [args[0][:from], args[0][:to], args[0][:step], args[0][:var], args[0][:test_num_inc]]
|
592
606
|
|
593
607
|
node = n(:loop, params)
|
594
608
|
node = append_to(node) { block.call }
|
@@ -601,7 +615,7 @@ module OrigenTesters::ATP
|
|
601
615
|
define_method method do |*args, &block|
|
602
616
|
options = args.pop if args.last.is_a?(Hash)
|
603
617
|
unless args.size == 2
|
604
|
-
fail "Format for relational operation must match: ':<
|
618
|
+
fail "Format for relational operation must match: ':<operator>(var1, var2)'"
|
605
619
|
end
|
606
620
|
n2(method.to_sym, args[0], args[1])
|
607
621
|
end unless method_defined?(method)
|
@@ -810,6 +824,10 @@ module OrigenTesters::ATP
|
|
810
824
|
n1(:id, name)
|
811
825
|
end
|
812
826
|
|
827
|
+
def priority(name)
|
828
|
+
n1(:priority, name)
|
829
|
+
end
|
830
|
+
|
813
831
|
def on_fail(options = {})
|
814
832
|
if options.is_a?(Proc)
|
815
833
|
node = n0(:on_fail)
|
data/lib/origen_testers/flow.rb
CHANGED
@@ -205,6 +205,8 @@ module OrigenTesters
|
|
205
205
|
def active_description
|
206
206
|
flow_file = OrigenTesters::Flow.callstack.last
|
207
207
|
called_from = caller.find { |l| l =~ /^#{flow_file}:.*/ }
|
208
|
+
# Windows fix - prevent the drive letter in the file name from changing the index of the line_no below
|
209
|
+
called_from.gsub!(flow_file, '')
|
208
210
|
desc = nil
|
209
211
|
if called_from
|
210
212
|
called_from = called_from.split(':')
|
@@ -257,8 +259,10 @@ module OrigenTesters
|
|
257
259
|
flow_file = OrigenTesters::Flow.callstack.last
|
258
260
|
called_from = caller.find { |l| l =~ /^#{flow_file}:.*/ }
|
259
261
|
if called_from
|
262
|
+
# Splitting on ':' when file names are included will yield a different index for everything in Windows
|
263
|
+
called_from.gsub!(flow_file, '')
|
260
264
|
called_from = called_from.split(':')
|
261
|
-
options[:source_file] = called_from[0]
|
265
|
+
options[:source_file] = flow_file # called_from[0]
|
262
266
|
options[:source_line_number] = called_from[1].to_i
|
263
267
|
end
|
264
268
|
end
|
@@ -10,14 +10,20 @@ module OrigenTesters
|
|
10
10
|
def on_test(node)
|
11
11
|
super
|
12
12
|
ins = node.find(:object).value
|
13
|
-
|
13
|
+
|
14
|
+
# allow defer limits when limits are only given in sub tests
|
15
|
+
if ins.respond_to?(:defer_limits)
|
14
16
|
if ins.defer_limits
|
15
17
|
completed_lines.last.opcode = 'Test-defer-limits'
|
16
18
|
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if ins.respond_to?(:lo_limit) && (ins.lo_limit || ins.hi_limit) || ins.respond_to?(:lo) && (ins.lo || ins.hi)
|
17
22
|
limit = completed_lines.last.dup
|
18
23
|
limit.type = :use_limit
|
19
24
|
limit.opcode = 'Use-Limit'
|
20
25
|
limit.parameter = nil
|
26
|
+
limit.tnum = nil # Don't duplate test numbers, allow auto-increment by leaving blank
|
21
27
|
if ins.respond_to?(:lo_limit)
|
22
28
|
lo = ins.lo_limit
|
23
29
|
hi = ins.hi_limit
|
@@ -36,7 +36,7 @@ module OrigenTesters
|
|
36
36
|
unless options[:subroutine_pat]
|
37
37
|
stage.with_bank(:body) do
|
38
38
|
# find the first vector
|
39
|
-
stage.bank.delete_at(0) until stage.bank[0].is_a?(OrigenTesters::Vector)
|
39
|
+
stage.bank.delete_at(0) until stage.bank[0].is_a?(OrigenTesters::Vector) || stage.bank.empty?
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -115,6 +115,7 @@ module OrigenTesters
|
|
115
115
|
@overlay_style = :subroutine # default to use subroutine for overlay
|
116
116
|
@capture_style = :hram # default to use hram for capture
|
117
117
|
@overlay_subr = nil
|
118
|
+
@overlay_history = {} # used to track labels, subroutines, digsrc pins used etc
|
118
119
|
|
119
120
|
if options[:add_flow_enable]
|
120
121
|
self.add_flow_enable = options[:add_flow_enable]
|
@@ -203,6 +204,12 @@ module OrigenTesters
|
|
203
204
|
when :subroutine, :default
|
204
205
|
subroutine_overlay(overlay_str, options)
|
205
206
|
ovly_style = :subroutine
|
207
|
+
when :label, :global_label
|
208
|
+
options[:dont_compress] = true
|
209
|
+
unless @overlay_history.key?(overlay_str)
|
210
|
+
cc "#{overlay_str}"
|
211
|
+
@overlay_history[overlay_str] = { is_label: true }
|
212
|
+
end
|
206
213
|
when :handshake
|
207
214
|
if @delayed_handshake
|
208
215
|
if @delayed_handshake != overlay_str
|
@@ -462,6 +462,41 @@ module OrigenTesters
|
|
462
462
|
alias_method :on_whenever_any, :on_whenever
|
463
463
|
alias_method :on_whenever_all, :on_whenever
|
464
464
|
|
465
|
+
def on_loop(node, options = {})
|
466
|
+
# TODO: don't have the SMT8 way to do this yet
|
467
|
+
if smt8?
|
468
|
+
fail 'Flow loop control not yet supported for SMT8!'
|
469
|
+
end
|
470
|
+
start = node.to_a[0]
|
471
|
+
stop = node.to_a[1]
|
472
|
+
step = node.to_a[2]
|
473
|
+
if node.to_a[3].nil?
|
474
|
+
fail 'You must supply a loop variable name!'
|
475
|
+
else
|
476
|
+
var = generate_flag_name(node.to_a[3])
|
477
|
+
end
|
478
|
+
test_num_inc = node.to_a[4]
|
479
|
+
unless smt8?
|
480
|
+
var = "@#{var}"
|
481
|
+
end
|
482
|
+
num = (stop - start) / step + 1
|
483
|
+
# Handle increment/decrement
|
484
|
+
if step < 0
|
485
|
+
compare = '>'
|
486
|
+
incdec = "- #{step * -1}"
|
487
|
+
else
|
488
|
+
compare = '<'
|
489
|
+
incdec = "+ #{step}"
|
490
|
+
end
|
491
|
+
line "for #{var} = #{start}; #{var} #{compare} #{stop + step} ; #{var} = #{var} #{incdec}; do"
|
492
|
+
line "test_number_loop_increment = #{test_num_inc}"
|
493
|
+
line '{'
|
494
|
+
@indent += 1
|
495
|
+
process_all(node.children)
|
496
|
+
@indent -= 1
|
497
|
+
line '}'
|
498
|
+
end
|
499
|
+
|
465
500
|
def generate_expr_string(node, options = {})
|
466
501
|
return node unless node.respond_to?(:type)
|
467
502
|
case node.type
|
@@ -119,6 +119,7 @@ module OrigenTesters
|
|
119
119
|
o[:test_name] = extract_test_name(node, o)
|
120
120
|
o[:test_number] = extract_test_number(node, o)
|
121
121
|
o[:limits] = extract_limits(node, o)
|
122
|
+
o[:priority] = extract_priority(node, o)
|
122
123
|
o[:test_text] = node.find(:test_text).try(:value)
|
123
124
|
if on_fail = node.find(:on_fail)
|
124
125
|
if set_result = on_fail.find(:set_result)
|
@@ -141,7 +142,7 @@ module OrigenTesters
|
|
141
142
|
end
|
142
143
|
if smt8?
|
143
144
|
if o[:bin_s_num]
|
144
|
-
limits_workbook.add_softbin o[:bin_s_num], name: o[:bin_s_name], bin: o[:bin_h_num]
|
145
|
+
limits_workbook.add_softbin o[:bin_s_num], name: o[:bin_s_name], bin: o[:bin_h_num], priority: o[:priority]
|
145
146
|
end
|
146
147
|
if o[:bin_h_num]
|
147
148
|
limits_workbook.add_bin o[:bin_h_num], name: o[:bin_h_name]
|
@@ -217,6 +218,16 @@ module OrigenTesters
|
|
217
218
|
name
|
218
219
|
end
|
219
220
|
|
221
|
+
def extract_priority(node, o)
|
222
|
+
test_obj = node.find(:priority).to_a[0]
|
223
|
+
if test_obj.is_a?(Hash)
|
224
|
+
priority = test_obj['Priority']
|
225
|
+
else
|
226
|
+
priority = test_obj.respond_to?(:priority) ? test_obj.priority : test_obj if test_obj
|
227
|
+
end
|
228
|
+
priority
|
229
|
+
end
|
230
|
+
|
220
231
|
def extract_test_name(node, o)
|
221
232
|
test_obj = node.find(:object).to_a[0]
|
222
233
|
if smt8?
|
@@ -285,6 +285,31 @@ module OrigenTesters
|
|
285
285
|
end
|
286
286
|
end
|
287
287
|
|
288
|
+
def meas_multi_limits(name, options = {})
|
289
|
+
options = {
|
290
|
+
duration: :static
|
291
|
+
}.merge(options)
|
292
|
+
|
293
|
+
name = "measmulti_#{name}" unless name.to_s =~ /measmulti/
|
294
|
+
|
295
|
+
if tester.uflex?
|
296
|
+
ins = test_instances.functional(name)
|
297
|
+
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
298
|
+
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
299
|
+
ins.defer_limits = options[:defer_limits]
|
300
|
+
|
301
|
+
# some made up sub test limits
|
302
|
+
options[:sub_tests] = [sub_test('limit1', lo: 0, hi: 7), sub_test('limit2', lo: 3, hi: 8)]
|
303
|
+
|
304
|
+
pname = "#{name}_pset"
|
305
|
+
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
306
|
+
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
307
|
+
ins.pattern = pname
|
308
|
+
|
309
|
+
flow.test(ins, options)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
288
313
|
def meas(name, options = {})
|
289
314
|
options = {
|
290
315
|
duration: :static
|
data/program/flow_control.rb
CHANGED
@@ -254,7 +254,6 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_name: "Flow Contro
|
|
254
254
|
enable :nvm_minimum_ft, if_enable: "nvm_minimum_room", if_job: :fr
|
255
255
|
enable :nvm_minimum_ft, if_enable: "nvm_minimum_cold", if_job: :fc
|
256
256
|
disable :nvm_minimum_ft, if_enable: "nvm_minimum_hot", if_job: :fh
|
257
|
-
|
258
257
|
log "Test enable words that wrap a lot of tests"
|
259
258
|
if_enable :word1 do
|
260
259
|
5.times do |i|
|
@@ -340,6 +339,39 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_name: "Flow Contro
|
|
340
339
|
func :test36, on_fail: { render: 'multi_bin;' }, if_flag: :my_flag, number: 51570
|
341
340
|
end
|
342
341
|
|
342
|
+
if tester.v93k? && !tester.smt8?
|
343
|
+
log "Tests of flow loop"
|
344
|
+
loop from: 0, to: 5, step: 1, var: '$LOOP_VARIABLE' do
|
345
|
+
func :test_myloop, number: 56000
|
346
|
+
end
|
347
|
+
|
348
|
+
log "Tests of flow loop, no step"
|
349
|
+
loop from: 0, to: 5, var: '$LOOP_VARIABLE' do
|
350
|
+
func :test_myloop2, number: 5610
|
351
|
+
end
|
352
|
+
|
353
|
+
log "Tests of flow loop, non-default test number increment"
|
354
|
+
loop from: 0, to: 5, var: '$LOOP_VARIABLE', test_num_inc: 2 do
|
355
|
+
func :test_myloop3, number: 56200
|
356
|
+
end
|
357
|
+
|
358
|
+
log "Tests of decrementing loop"
|
359
|
+
loop from: 5, to: 2, step: -1, var: '$LOOP_VARIABLE' do
|
360
|
+
func :test_myloop4, number: 56300
|
361
|
+
end
|
362
|
+
|
363
|
+
log "Tests of nested flow loop, depth 3"
|
364
|
+
loop from: 0, to: 9, step: 2, var: '$LOOP_VARIABLE1'do
|
365
|
+
loop from: 1, to: 10, step: 1, var: '$LOOP_VARIABLE2' do
|
366
|
+
loop from: 1, to: 5, step: 1, var: '$LOOP_VARIABLE3' do
|
367
|
+
func :test_myloop5, number: 56400
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# Test of skipping variable name not yet ready
|
373
|
+
end
|
374
|
+
|
343
375
|
log 'An optimization test case, this should not generate a flag on V93K'
|
344
376
|
func :test1, id: :t1a, number: 51580
|
345
377
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Flow to exercise the Flow Control API
|
2
|
+
#
|
3
|
+
# Some of the other flows also cover the flow control API and those tests are used
|
4
|
+
# to guarantee that the test ID references work when sub-flows are involved.
|
5
|
+
# This flow provides a full checkout of all flow control methods.
|
6
|
+
Flow.create interface: 'OrigenTesters::Test::Interface', flow_name: "Flow Control Testing" do
|
7
|
+
flow.flow_description = 'Flow to exercise the Flow Control API' if tester.v93k?
|
8
|
+
|
9
|
+
self.resources_filename = 'flow_control'
|
10
|
+
|
11
|
+
log "Mixed-case manual flags"
|
12
|
+
test :test1, on_fail: { set_flag: :$My_Mixed_Flag }, continue: true, number: 51420
|
13
|
+
test :test2, if_flag: "$My_Mixed_Flag", number: 51430
|
14
|
+
unless_flag "$My_Mixed_Flag" do
|
15
|
+
test :test3, number: 51440
|
16
|
+
end
|
17
|
+
|
18
|
+
log "Mixed-case manual flags - induce frozen string error"
|
19
|
+
test :test4, on_fail: { set_flag: :$My_Mixed_Flag }, continue: true, number: 51450
|
20
|
+
test :test5, if_flag: "$My_Mixed_Flag", number: 51460
|
21
|
+
unless_flag "$My_Mixed_Flag" do
|
22
|
+
test :test6, number: 51470
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/program/test.rb
CHANGED
@@ -28,6 +28,8 @@ Flow.create interface: 'OrigenTesters::Test::Interface' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
if tester.uflex?
|
31
|
+
meas_multi_limits :bin_now, tnum: 3000, bin: 119, soft_bin: 2
|
32
|
+
meas_multi_limits :bin_later, tnum: 3000, bin: 119, soft_bin: 2, defer_limits: true
|
31
33
|
log "Test of ultraflex render API"
|
32
34
|
line = flow.ultraflex.use_limit
|
33
35
|
line.units = "Hz"
|
@@ -339,4 +339,37 @@ end
|
|
339
339
|
~~~
|
340
340
|
|
341
341
|
|
342
|
+
#### Flow Loops for V93k (SMT7 only)
|
343
|
+
Use flow loop control to permit re-running tests without using additional sequence labels.
|
344
|
+
|
345
|
+
~~~ruby
|
346
|
+
loop from: 0, to: 5, step: 1, var: '$LOOP_VARIABLE' do
|
347
|
+
func :test_myloop, number: 56000
|
348
|
+
end
|
349
|
+
~~~
|
350
|
+
|
351
|
+
Indicating step value is optional, default is 1.
|
352
|
+
|
353
|
+
These loops can also be nested:
|
354
|
+
~~~ruby
|
355
|
+
loop from: 0, to: 9, step: 2, var: '$LOOP_VARIABLE1'do
|
356
|
+
loop from: 1, to: 10, step: 1, var: '$LOOP_VARIABLE2' do
|
357
|
+
loop from: 1, to: 5, step: 1, var: '$LOOP_VARIABLE3' do
|
358
|
+
func :test_myloop5, number: 56400
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
~~~
|
363
|
+
|
364
|
+
You can also indicate a test number increment if desired (default is 1):
|
365
|
+
~~~ruby
|
366
|
+
loop from: 0, to: 5, var: '$LOOP_VARIABLE', test_num_inc: 2 do
|
367
|
+
func :test_myloop3, number: 56200
|
368
|
+
end
|
369
|
+
~~~
|
370
|
+
|
371
|
+
Decrementing loops, having `from:` value > `to:` value and using negative `step:`, is also supported.
|
372
|
+
|
373
|
+
|
374
|
+
|
342
375
|
% end
|
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.
|
4
|
+
version: 0.49.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.57.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dentaku
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: simplecov
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -516,6 +530,7 @@ files:
|
|
516
530
|
- program/components/_temp.rb
|
517
531
|
- program/custom_tests.rb
|
518
532
|
- program/flow_control.rb
|
533
|
+
- program/flow_control_flag_bug.rb
|
519
534
|
- program/prb1.rb
|
520
535
|
- program/prb1_resources.rb
|
521
536
|
- program/prb2.rb
|
@@ -584,8 +599,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
584
599
|
- !ruby/object:Gem::Version
|
585
600
|
version: '0'
|
586
601
|
requirements: []
|
587
|
-
|
588
|
-
rubygems_version: 2.6.14.4
|
602
|
+
rubygems_version: 3.1.4
|
589
603
|
signing_key:
|
590
604
|
specification_version: 4
|
591
605
|
summary: This plugin provides Origen tester models to drive ATE type testers like
|