origen_testers 0.45.2 → 0.47.0

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: '09250597b91ce9bfe38f029fa09269acdc311b508cc493d698adf0faaebe4cb7'
4
- data.tar.gz: 955d54bdade5925bd6f84a1ccf61f8b477b3a74fcfc1eef2fae9144bb48f95f6
3
+ metadata.gz: df7294cf891812cfb78d98b161891a459391abb07841eb66d14929185385df22
4
+ data.tar.gz: 2d0bfcc2c6862a2f10abc60136dbba9099f6f1ae0deeecb099b4700d34d95121
5
5
  SHA512:
6
- metadata.gz: 3b97b49afca843c7cf0799fc462062728f2424d463fe2e61eb56b870fe4a9c67254f102b7a12d70afc8082c3cd1a02b466c65756fc2df51e5fd0ee40bbde503e
7
- data.tar.gz: ec7d5196fc86b5eec2bfeb64ae82e3fe0f89be4b7993d6d7a7a67f4343fd0b9e8e29bf473ab64c3a1a1ca16fb20cfef65c1b23d4eb0e91f3ef94e8bdd7b96b05
6
+ metadata.gz: c42eacdbe39b6eb35eddf8dcbeb08e49eab49bca4425c20f2c0474c8b5f977fdbeec9ed5b799001f7b8b7f5e6e87fc3293e3ac9c0ecc7012bc8eea8b7d86183b
7
+ data.tar.gz: f17d9f4f1c7bdb90e58a0f2e6791e406bbf5b80b8ec8b5986a0e2e49e3e5d4145167c81a39773e560fbb8c8392a5b2dbbcf88efc52940e77301c6b4341a88a3a
@@ -1,7 +1,7 @@
1
1
  module OrigenTesters
2
2
  MAJOR = 0
3
- MINOR = 45
4
- BUGFIX = 2
3
+ MINOR = 47
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
7
7
  end
@@ -408,6 +408,10 @@ module OrigenTesters::ATP
408
408
  children << n(:meta, attrs)
409
409
  end
410
410
 
411
+ if options[:test_text]
412
+ children << n(:test_text, [options[:test_text]])
413
+ end
414
+
411
415
  if subs = options[:sub_test] || options[:sub_tests]
412
416
  subs = [subs] unless subs.is_a?(Array)
413
417
  subs.each do |s|
@@ -1041,6 +1041,20 @@ module OrigenTesters
1041
1041
  # stage = sub_name
1042
1042
  end # subroutine_overlay
1043
1043
 
1044
+ # Disable the automatic addition of the digsrc start command at the beginning of the pattern
1045
+ #
1046
+ # @example
1047
+ # tester.digsrc_skip_start :pin_or_group_name
1048
+ #
1049
+ def digsrc_skip_start(pin_or_group)
1050
+ pin_or_group = dut.pin(pin_or_group).name
1051
+ if @overlay_history[pin_or_group].nil?
1052
+ @overlay_history[pin_or_group] = { count: 0, is_digsrc: true, start_applied: true }
1053
+ else
1054
+ Origen.log.warn 'tester.digsrc_skip_start must be called before any overlay actions on the pin'
1055
+ end
1056
+ end
1057
+
1044
1058
  # Perform digsrc overlay (called by tester.cycle)
1045
1059
  def digsrc_overlay(options = {})
1046
1060
  options[:overlay] = { change_data: true }.merge(options[:overlay])
@@ -18,7 +18,7 @@ module OrigenTesters
18
18
  # Returns an array containing all runtime variables which get set by the flow
19
19
  attr_reader :set_runtime_variables
20
20
 
21
- attr_accessor :add_flow_enable, :flow_name, :flow_bypass, :flow_description
21
+ attr_accessor :add_flow_enable, :flow_name, :flow_bypass, :flow_description, :subdirectory
22
22
 
23
23
  def self.generate_flag_name(flag)
24
24
  case flag[0]
@@ -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[:test_text] = node.find(:test_text).try(:value)
122
123
  if on_fail = node.find(:on_fail)
123
124
  if set_result = on_fail.find(:set_result)
124
125
  if bin = set_result.find(:bin)
@@ -252,9 +253,12 @@ module OrigenTesters
252
253
  # "Test Number"
253
254
  l << f(options[:test_number])
254
255
  # "Test Text"
255
- # l << f(options[:bin_s_name] || options[:bin_h_name])
256
- names = ["#{options[:suite_name]}", "#{options[:test_name]}"]
257
- l << f(names.uniq.join('.'))
256
+ if options[:test_text]
257
+ l << f(options[:test_text])
258
+ else
259
+ names = ["#{options[:suite_name]}", "#{options[:test_name]}"]
260
+ l << f(names.uniq.join('.'))
261
+ end
258
262
  if test_modes.empty?
259
263
  # "Low Limit"
260
264
  l << f((options[:limits][nil] || {})[:lsl])
@@ -6,7 +6,7 @@ module OrigenTesters
6
6
  include OrigenTesters::Generator
7
7
 
8
8
  attr_reader :flow, :paths
9
- attr_accessor :filename, :id
9
+ attr_accessor :filename, :id, :subdirectory
10
10
 
11
11
  def initialize(flow = nil)
12
12
  @flow = flow
@@ -18,7 +18,7 @@ module OrigenTesters
18
18
  end
19
19
 
20
20
  def subdirectory
21
- 'vectors'
21
+ @subdirectory ||= 'vectors'
22
22
  end
23
23
 
24
24
  def paths
@@ -85,7 +85,13 @@ module OrigenTesters
85
85
  end
86
86
  # Finally set any initial values that have been supplied
87
87
  options[:attrs].each do |k, v|
88
- send("#{k}=", v) if respond_to?("#{k}=")
88
+ accessor = "#{k}="
89
+ if respond_to?(accessor)
90
+ send(accessor, v)
91
+ else
92
+ accessor = "#{k.to_s.underscore}="
93
+ send(accessor, v) if respond_to?(accessor)
94
+ end
89
95
  end
90
96
  end
91
97
 
@@ -13,14 +13,14 @@ module OrigenTesters
13
13
 
14
14
  def method_missing(method, *args, &block)
15
15
  if definitions[method]
16
- m = platform::TestMethod.new methods: definitions[method].dup,
17
- attrs: (args.first || {}),
18
- type: method,
19
- library: self
20
- test_methods.add(m)
21
- m
16
+ instantiate_test_method(method, args)
22
17
  else
23
- super
18
+ method = method.to_s.underscore.to_sym
19
+ if definitions[method]
20
+ instantiate_test_method(method, args)
21
+ else
22
+ super
23
+ end
24
24
  end
25
25
  end
26
26
 
@@ -31,6 +31,17 @@ module OrigenTesters
31
31
  def definitions
32
32
  @definitions || self.class::TEST_METHODS
33
33
  end
34
+
35
+ private
36
+
37
+ def instantiate_test_method(method, args)
38
+ m = platform::TestMethod.new methods: definitions[method].dup,
39
+ attrs: (args.first || {}),
40
+ type: method,
41
+ library: self
42
+ test_methods.add(m)
43
+ m
44
+ end
34
45
  end
35
46
  end
36
47
  end
@@ -9,7 +9,7 @@ module OrigenTesters
9
9
  test_current: [:current, 10.uA],
10
10
  settling_time: [:time, 1.ms],
11
11
  measurement_mode: [:string, 'PPMUpar', %w(PPMUpar ProgLoad)],
12
- polarity: [:string, 'SPOL', ['SPOL' 'BPOL']],
12
+ polarity: [:string, 'SPOL', %w(SPOL BPOL)],
13
13
  precharge_to_zero_vol: [:string, 'ON', %w(ON OFF)],
14
14
  test_name: [:string, 'passVolt_mv'],
15
15
  output: [:string, 'None', %w(None ReportUI ShowFailOnly)]
@@ -100,6 +100,7 @@ module OrigenTesters
100
100
  f << 'ffv_enable' if ffv_enable
101
101
  f << 'frg_enable' if frg_enable
102
102
  f << 'hw_dsp_disable' if hardware_dsp_disable
103
+ f << 'force_serial' if force_serial
103
104
  f.empty? ? f : f.join(', ')
104
105
  end
105
106
 
@@ -6,13 +6,13 @@ module OrigenTesters
6
6
  include OrigenTesters::Generator
7
7
 
8
8
  attr_reader :variables
9
- attr_accessor :filename, :id
9
+ attr_accessor :filename, :id, :subdirectory
10
10
 
11
11
  def initialize(options = {})
12
12
  end
13
13
 
14
14
  def subdirectory
15
- 'testflow/mfh.testflow.setup'
15
+ @subdirectory ||= 'testflow/mfh.testflow.setup'
16
16
  end
17
17
 
18
18
  def add_variables(vars)
@@ -35,21 +35,25 @@ module OrigenTesters
35
35
 
36
36
  # What SMT7 calls a flag
37
37
  def flags
38
- (variables[:all][:referenced_enables] + variables[:all][:set_enables]).uniq.sort do |x, y|
39
- x = x[0] if x.is_a?(Array)
40
- y = y[0] if y.is_a?(Array)
41
- # Need to use strings for the comparison as some flags can be a string and some a symbol
42
- x.to_s <=> y.to_s
38
+ if variables
39
+ (variables[:all][:referenced_enables] + variables[:all][:set_enables]).uniq.sort do |x, y|
40
+ x = x[0] if x.is_a?(Array)
41
+ y = y[0] if y.is_a?(Array)
42
+ # Need to use strings for the comparison as some flags can be a string and some a symbol
43
+ x.to_s <=> y.to_s
44
+ end
43
45
  end
44
46
  end
45
47
 
46
48
  # What SMT7 calls a declaration
47
49
  def declarations
48
- (variables[:all][:jobs] + variables[:all][:referenced_flags] + variables[:all][:set_flags]).uniq.sort do |x, y|
49
- x = x[0] if x.is_a?(Array)
50
- y = y[0] if y.is_a?(Array)
51
- # Need to use strings for the comparison as some declarations can be a string and some a symbol
52
- x.to_s <=> y.to_s
50
+ if variables
51
+ (variables[:all][:jobs] + variables[:all][:referenced_flags] + variables[:all][:set_flags]).uniq.sort do |x, y|
52
+ x = x[0] if x.is_a?(Array)
53
+ y = y[0] if y.is_a?(Array)
54
+ # Need to use strings for the comparison as some declarations can be a string and some a symbol
55
+ x.to_s <=> y.to_s
56
+ end
53
57
  end
54
58
  end
55
59
 
@@ -3,11 +3,13 @@ language_revision = 1;
3
3
 
4
4
  declarations
5
5
 
6
- % declarations.each do |var|
7
- % if var.is_a?(Array)
6
+ % if declarations
7
+ % declarations.each do |var|
8
+ % if var.is_a?(Array)
8
9
  @<%= var[0].to_s %> = <%= var[1].is_a?(String) || var[1].is_a?(Symbol) ? "\"#{var[1]}\"" : var[1] %>;
9
- % else
10
+ % else
10
11
  @<%= var.to_s %> = 0;
12
+ % end
11
13
  % end
12
14
  % end
13
15
 
@@ -15,11 +17,13 @@ end
15
17
  -----------------------------------------------------------------
16
18
  flags
17
19
 
18
- % flags.each do |var|
19
- % if var.is_a?(Array)
20
+ % if flags
21
+ % flags.each do |var|
22
+ % if var.is_a?(Array)
20
23
  user <%= var[0].to_s %> = <%= var[1].is_a?(String) || var[1].is_a?(Symbol) ? "\"#{var[1]}\"" : var[1] %>;
21
- % else
24
+ % else
22
25
  user <%= var.to_s %> = 0;
26
+ % end
23
27
  % end
24
28
  % end
25
29
 
@@ -115,7 +115,6 @@ module OrigenTesters
115
115
  l << " site_control = #{wrap_if_string(site_control)};" if site_control
116
116
  l << " site_match = #{wrap_if_string(site_match)};" if site_match
117
117
  l << " test_level = #{test_level};" if test_level
118
- l << " force_serial = #{wrap_if_string(force_serial)};" if force_serial
119
118
  l
120
119
  end
121
120
  end
@@ -0,0 +1,41 @@
1
+ Pattern.create(name: "test_overlay_no_start") do
2
+ tester.overlay_style = :digsrc
3
+ # increase coverage by changing tdi dig src settings
4
+ tester.source_memory :digsrc do |mem|
5
+ mem.pin :tdi, size: 32
6
+ end
7
+ cc 'should get a repeat count added to this vector for digsrc start minimum distance'
8
+ tester.cycle
9
+
10
+ dut.pin(:tclk).drive(1)
11
+ dut.pin(:tdi).drive(1)
12
+ dut.pin(:tdo).assert(1)
13
+ dut.pin(:tms).drive(1)
14
+
15
+ cc 'should get a repeat 5 vector'
16
+ tester.cycle repeat: 5
17
+
18
+ tester.digsrc_skip_start :tdi_a if tester.ultraflex?
19
+ tester.digsrc_skip_start :pa if tester.ultraflex?
20
+
21
+ cc 'should get a send microcode and 1 cycle with D'
22
+ tester.cycle overlay: {overlay_str: 'dummy_str', pins: dut.pin(:tdi_a)}
23
+ cc 'should get a cycle with D and no send'
24
+ tester.cycle overlay: {overlay_str: 'dummy_str', pins: dut.pin(:tdi_a), change_data: false}
25
+ cc 'regular cycle with no D or send'
26
+ tester.cycle
27
+
28
+ cc 'cycle with 001 on pa'
29
+ dut.pin(:pa).drive!(1)
30
+ cc 'send microcode followed by DDD on pa'
31
+ dut.pin(:pa).drive(0)
32
+ tester.cycle overlay: {overlay_str: "dummy_str", pins: dut.pin(:pa)}
33
+ cc 'cycle with 001 on pa'
34
+ dut.pin(:pa).drive!(1)
35
+ cc 'send microcode, DDD on pa with repeat 5 (will send 5 sets of data)'
36
+ dut.pin(:pa).drive(0)
37
+ tester.cycle repeat: 5, overlay: {overlay_str: "dummy_str", pins: dut.pin(:pa)}
38
+ cc 'cycle with 001 on pa'
39
+ dut.pin(:pa).drive!(1)
40
+
41
+ end
@@ -13,7 +13,7 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_description: 'Prob
13
13
  import 'test' # import top-level test.rb directly, note that Flow.create options of sub-flow will be ignored!
14
14
 
15
15
  # Test that a reference to a deeply nested test works (mainly for SMT8)
16
- test :on_deep_1, if_failed: :deep_test
16
+ test :on_deep_1, if_failed: :deep_test, test_text: "some_custom_text"
17
17
 
18
18
  pass 1, description: "Good die!", softbin: 1
19
19
  end
@@ -7,4 +7,24 @@ automatically to any supported platform.
7
7
  There are no significant APIs in this category currently, therefore refer to the
8
8
  [Common Pattern API](<%= path "guides/pattern/common" %>) which can fully target the UltraFLEX.
9
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 <code>:digsrc</code> 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
+
10
30
  % 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.45.2
4
+ version: 0.47.0
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-02-24 00:00:00.000000000 Z
11
+ date: 2020-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -466,6 +466,7 @@ files:
466
466
  - pattern/single_overlay_store.rb
467
467
  - pattern/subroutines.rb
468
468
  - pattern/tester_overlay.rb
469
+ - pattern/tester_overlay_no_start.rb
469
470
  - pattern/tester_store.rb
470
471
  - program/_additional_erase.rb
471
472
  - program/_efa_resources.rb
@@ -547,7 +548,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
547
548
  - !ruby/object:Gem::Version
548
549
  version: '0'
549
550
  requirements: []
550
- rubygems_version: 3.0.1
551
+ rubyforge_project:
552
+ rubygems_version: 2.7.6
551
553
  signing_key:
552
554
  specification_version: 4
553
555
  summary: This plugin provides Origen tester models to drive ATE type testers like