origen_testers 0.48.2 → 0.49.2

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
2
  SHA256:
3
- metadata.gz: 55301a17d683ca18d323223ba90def92f9d4696152f160e2cd48f6a60f34fa01
4
- data.tar.gz: 1049c5cd883d006bba7702acf5090355de254c3e44e8ff76b391b9a10a610199
3
+ metadata.gz: 4ea968535c042745fa87c069932af23a54532acc9a0e22583a38ae58e25b2b87
4
+ data.tar.gz: aec4d331fa4a4933c31228500d450846dbdd954f5e44087d727b752ae51df952
5
5
  SHA512:
6
- metadata.gz: c8065dab6a6d37ae9c6e8346c6cba7c4a95be66360edfb667727921f85e5ba712172b5266bb7eba4280426c70294342fdea1d6b17fc79997c92e5dab3f3a3bbd
7
- data.tar.gz: f52e174c381f347ae489a5c5cced814a844675b5ee0b13f33e7cf2d7c43617efbfe2dffe51818eafa3a63655eb1e749486974776b86dcfe467f22553331a6922
6
+ metadata.gz: 119ed16f37c02c94dbe2648df2019275729cb3827dfcebedff30d1beacd5b2ff329edc70eaeafed1f3ea22cfab234f8b2a1b5c46a0b9673ebb53c8c1842b8a63
7
+ data.tar.gz: 00e51035094d97540785dae4ca1ada4e229bbe5b9f89d7183d66feb32a4ec8e7afac6c22c62133cf30c502e851b89167be3cb28b08410bbcf9ff2c48bfa1ef4d
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 = 2
5
5
  DEV = nil
6
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -11,6 +11,7 @@ module OrigenTesters
11
11
  attr_accessor :includes
12
12
  attr_accessor :comment_level
13
13
  attr_accessor :generating
14
+
14
15
  # Get/Set the overlay style
15
16
  #
16
17
  # This method changes the way overlay is handled.
@@ -19,6 +20,7 @@ module OrigenTesters
19
20
  # @example
20
21
  # tester.overlay_style = :label
21
22
  attr_accessor :overlay_style
23
+
22
24
  # Get/Set the capture style
23
25
  #
24
26
  # This method changes the way tester.store() implements the store
@@ -49,10 +51,18 @@ module OrigenTesters
49
51
  end
50
52
  alias_method :pattern_extension, :pat_extension
51
53
 
54
+ def comment_char=(val)
55
+ @comment_char = val
56
+ end
57
+
52
58
  def comment_char
53
59
  @comment_char || '//'
54
60
  end
55
61
 
62
+ def program_comment_char=(val)
63
+ @program_comment_char = val
64
+ end
65
+
56
66
  def program_comment_char
57
67
  @program_comment_char || comment_char
58
68
  end
@@ -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
@@ -23,6 +23,7 @@ module OrigenTesters
23
23
  limit.type = :use_limit
24
24
  limit.opcode = 'Use-Limit'
25
25
  limit.parameter = nil
26
+ limit.tnum = nil # Don't duplate test numbers, allow auto-increment by leaving blank
26
27
  if ins.respond_to?(:lo_limit)
27
28
  lo = ins.lo_limit
28
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
@@ -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?
@@ -99,8 +99,10 @@ module OrigenTesters
99
99
  @min_repeat_loop = 33
100
100
  if smt8?
101
101
  @pat_extension = 'pat'
102
+ @program_comment_char = ['println', '//']
102
103
  else
103
104
  @pat_extension = 'avc'
105
+ @program_comment_char = ['print_dl', '//']
104
106
  end
105
107
  @compress = true
106
108
  # @support_repeat_previous = true
@@ -115,6 +117,7 @@ module OrigenTesters
115
117
  @overlay_style = :subroutine # default to use subroutine for overlay
116
118
  @capture_style = :hram # default to use hram for capture
117
119
  @overlay_subr = nil
120
+ @overlay_history = {} # used to track labels, subroutines, digsrc pins used etc
118
121
 
119
122
  if options[:add_flow_enable]
120
123
  self.add_flow_enable = options[:add_flow_enable]
@@ -203,6 +206,12 @@ module OrigenTesters
203
206
  when :subroutine, :default
204
207
  subroutine_overlay(overlay_str, options)
205
208
  ovly_style = :subroutine
209
+ when :label, :global_label
210
+ options[:dont_compress] = true
211
+ unless @overlay_history.key?(overlay_str)
212
+ cc "#{overlay_str}"
213
+ @overlay_history[overlay_str] = { is_label: true }
214
+ end
206
215
  when :handshake
207
216
  if @delayed_handshake
208
217
  if @delayed_handshake != overlay_str
@@ -458,7 +467,6 @@ module OrigenTesters
458
467
  # Ensure the match pins are don't care by default
459
468
  pin.dont_care
460
469
  options[:pin2].dont_care if options[:pin2]
461
-
462
470
  if !options[:pin2]
463
471
  cc "for the #{pin.name.upcase} pin to go #{state.to_s.upcase}"
464
472
  match_block(timeout_in_cycles, options) do |match_or_conditions, fail_conditions|
@@ -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/prb1.rb CHANGED
@@ -8,6 +8,10 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_description: 'Prob
8
8
  self.resources_filename = 'prb1'
9
9
  end
10
10
 
11
+ # Extra log below not in approved/ folder to show that comments are
12
+ # being skipped correctly during the difference checks
13
+ log 'PRB1 Test Flow Version 00001 - do not copy me to approved!'
14
+
11
15
  import 'components/prb1_main'
12
16
 
13
17
  import 'test' # import top-level test.rb directly, note that Flow.create options of sub-flow will be ignored!
@@ -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.2
4
+ version: 0.49.2
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-30 00:00:00.000000000 Z
11
+ date: 2021-09-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
@@ -543,7 +558,6 @@ files:
543
558
  - templates/origen_guides/pattern/stil.md.erb
544
559
  - templates/origen_guides/pattern/timing.md.erb
545
560
  - templates/origen_guides/pattern/ultraflex.md.erb
546
- - templates/origen_guides/pattern/ultraflex.md.erb~
547
561
  - templates/origen_guides/pattern/v93k.md.erb
548
562
  - templates/origen_guides/program/charz.md.erb
549
563
  - templates/origen_guides/program/code.md.erb
@@ -1,30 +0,0 @@
1
- % render "layouts/guides.html" do
2
-
3
- This page will be used to document any UltraFLEX-only APIs related to pattern generation,
4
- however the goal is to have as few of these as possible so that Origen pattern source code can re-target
5
- automatically to any supported platform.
6
-
7
- There are no significant APIs in this category currently, therefore refer to the
8
- [Common Pattern API](<%= path "guides/pattern/common" %>) which can fully target the UltraFLEX.
9
-
10
- ### DigSrc
11
-
12
- UltraFlex supports <code>:digsrc</code> as a <code>tester.overlay_style</code> set like this:
13
-
14
- ~~~ruby
15
- tester.overlay_style = :digsrc
16
- ~~~
17
-
18
- By default Origen will automatically place the digsrc start opcode at the beginning of the resulting pattern
19
- when overlay is used. In some cases (like when the pattern is used in a pattern set that has already started
20
- the instrument in a previous pattern, or possibly in svm_patterns) this behavior is undesirable.
21
-
22
- The insertion of this start opcode can be disabled by placing the following code **before** any overlay operations
23
- for a given pin.
24
-
25
- ~~~ruby
26
- tester.digsrc_skip_start :pin_or_group_name if tester.ultraflex?
27
- # Overlay operations can happen after this point
28
- ~~~
29
-
30
- % end