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 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