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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4d062217b6f69bd8190818c2b24c2574bb163dab
4
- data.tar.gz: 9b139b2ef824933744d66c817baba75524ff7d3b
2
+ SHA256:
3
+ metadata.gz: 75b1fa14ed70e74c6a983c7214b55a575b346563b296ef6381b0d90be0ac9383
4
+ data.tar.gz: 644ea157e1e0b4fd0586ef09360566dd6b9d9bbfa1fb216da16b9f6de3688616
5
5
  SHA512:
6
- metadata.gz: 5f0e2c810aa3f8826897a16099274fc65d307c1650dab5d60ca9d3ef84da37e390932d3802c5e4980f81304cefff12b6b31de53ee798ad132f9e708cc3aa03df
7
- data.tar.gz: b1bf66931f6056f6ae314715b7e9b368534cb13b5a4bed46e364f2318e80fe57d07fd50e071adc158b8d29a3129ab49ecb724e16fa52e3e344dcd379d21b9413
6
+ metadata.gz: 67267f477fb2fa7796e92e0d742137781b8450125fee7756c8d3996f7511db6de66069b8a1564ca436295fd928318fc2a85c47a4d198155953b8126cca49f569
7
+ data.tar.gz: a9bb49fb80816c242860a099f9215c30d58080d535aae0cefd61f5f7875939968ba0a376af3b87c7839e52eef57713835b1f2fbab32b67a4e64a5aa7b92b242f
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenTesters
2
2
  MAJOR = 0
3
- MINOR = 48
3
+ MINOR = 49
4
4
  BUGFIX = 1
5
5
  DEV = nil
6
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -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) && args[0].keys.include?(:step)
585
- fail 'Loop must specify :from, :to, :step'
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 4-element array to loop node to simplify downstream parser
590
- # last element, 'var', will be nil if not specified by loop call
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: ':<opertor>(var1, var2)'"
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)
@@ -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
@@ -430,7 +430,8 @@ module OrigenTesters
430
430
  end
431
431
 
432
432
  def clean_flag(flag)
433
- flag = flag.to_s
433
+ # Added .dup to below line to get an unfrozen copy of the string, corrects a run time error
434
+ flag = flag.to_s.dup
434
435
  if flag[0] == '$'
435
436
  flag[0] = ''
436
437
  end
@@ -10,14 +10,20 @@ module OrigenTesters
10
10
  def on_test(node)
11
11
  super
12
12
  ins = node.find(:object).value
13
- if ins.respond_to?(:lo_limit) && (ins.lo_limit || ins.hi_limit) || ins.respond_to?(:lo) && (ins.lo || ins.hi)
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
@@ -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.48.1
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: 2020-10-27 00:00:00.000000000 Z
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
- rubyforge_project:
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