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