origen_testers 0.45.2 → 0.47.0

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