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 +4 -4
- data/config/version.rb +2 -2
- data/lib/origen_testers/atp/flow.rb +4 -0
- data/lib/origen_testers/igxl_based_tester/base.rb +14 -0
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +1 -1
- data/lib/origen_testers/smartest_based_tester/base/limits_file.rb +7 -3
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +2 -2
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +7 -1
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +18 -7
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +1 -1
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +1 -0
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +16 -12
- data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +10 -6
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +0 -1
- data/pattern/tester_overlay_no_start.rb +41 -0
- data/program/prb1.rb +1 -1
- data/templates/origen_guides/pattern/ultraflex.md.erb +20 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df7294cf891812cfb78d98b161891a459391abb07841eb66d14929185385df22
|
4
|
+
data.tar.gz: 2d0bfcc2c6862a2f10abc60136dbba9099f6f1ae0deeecb099b4700d34d95121
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c42eacdbe39b6eb35eddf8dcbeb08e49eab49bca4425c20f2c0474c8b5f977fdbeec9ed5b799001f7b8b7f5e6e87fc3293e3ac9c0ecc7012bc8eea8b7d86183b
|
7
|
+
data.tar.gz: f17d9f4f1c7bdb90e58a0f2e6791e406bbf5b80b8ec8b5986a0e2e49e3e5d4145167c81a39773e560fbb8c8392a5b2dbbcf88efc52940e77301c6b4341a88a3a
|
data/config/version.rb
CHANGED
@@ -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
|
-
|
256
|
-
|
257
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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',
|
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)]
|
@@ -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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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
|
7
|
-
%
|
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
|
-
%
|
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
|
19
|
-
%
|
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
|
-
%
|
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
|
data/program/prb1.rb
CHANGED
@@ -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.
|
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-
|
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
|
-
|
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
|