origen_testers 0.4.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 +7 -0
- data/config/application.rb +140 -0
- data/config/commands.rb +73 -0
- data/config/development.rb +12 -0
- data/config/environment.rb +1 -0
- data/config/shared_commands.rb +47 -0
- data/config/users.rb +18 -0
- data/config/version.rb +8 -0
- data/lib/commands/build.rb +69 -0
- data/lib/origen_testers.rb +23 -0
- data/lib/origen_testers/api.rb +258 -0
- data/lib/origen_testers/basic_test_setups.rb +105 -0
- data/lib/origen_testers/callback_handlers.rb +58 -0
- data/lib/origen_testers/generator.rb +279 -0
- data/lib/origen_testers/generator/flow_control_api.rb +611 -0
- data/lib/origen_testers/generator/identity_map.rb +23 -0
- data/lib/origen_testers/generator/placeholder.rb +11 -0
- data/lib/origen_testers/generator/test_numberer.rb +23 -0
- data/lib/origen_testers/igxl_based_tester.rb +12 -0
- data/lib/origen_testers/igxl_based_tester/base.rb +641 -0
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +171 -0
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +322 -0
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +217 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -0
- data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -0
- data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +326 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +58 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +179 -0
- data/lib/origen_testers/igxl_based_tester/files.rb +43 -0
- data/lib/origen_testers/igxl_based_tester/j750.rb +248 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +16 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +8 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +547 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +515 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/parser.rb +102 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -0
- data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -0
- data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +341 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -0
- data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -0
- data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex.rb +477 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +16 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +270 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -0
- data/lib/origen_testers/interface.rb +183 -0
- data/lib/origen_testers/parser.rb +22 -0
- data/lib/origen_testers/parser/description_lookup.rb +62 -0
- data/lib/origen_testers/parser/searchable_array.rb +30 -0
- data/lib/origen_testers/parser/searchable_hash.rb +30 -0
- data/lib/origen_testers/pattern_compilers.rb +116 -0
- data/lib/origen_testers/pattern_compilers/assembler.rb +88 -0
- data/lib/origen_testers/pattern_compilers/job.rb +96 -0
- data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -0
- data/lib/origen_testers/program_generators.rb +55 -0
- data/lib/origen_testers/smartest_based_tester.rb +8 -0
- data/lib/origen_testers/smartest_based_tester/base.rb +411 -0
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +188 -0
- data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +476 -0
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +123 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +23 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +47 -0
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +143 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +43 -0
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +166 -0
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -0
- data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +169 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +201 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -0
- data/lib/origen_testers/test/basic_interface.rb +17 -0
- data/lib/origen_testers/test/block.rb +21 -0
- data/lib/origen_testers/test/dut.rb +184 -0
- data/lib/origen_testers/test/dut2.rb +76 -0
- data/lib/origen_testers/test/j750_base_interface.rb +119 -0
- data/lib/origen_testers/test/j750_hpt_interface.rb +8 -0
- data/lib/origen_testers/test/j750_interface.rb +8 -0
- data/lib/origen_testers/test/nvm.rb +94 -0
- data/lib/origen_testers/test/ultraflex_interface.rb +110 -0
- data/lib/origen_testers/test/v93k_interface.rb +115 -0
- data/lib/origen_testers/timing.rb +362 -0
- data/lib/origen_testers/vector.rb +203 -0
- data/lib/origen_testers/vector_based_tester.rb +42 -0
- data/lib/origen_testers/vector_generator.rb +623 -0
- data/lib/origen_testers/vector_pipeline.rb +288 -0
- data/pattern/dc_instr.rb +7 -0
- data/pattern/delay.rb +7 -0
- data/pattern/mem_test.rb +8 -0
- data/pattern/multi_vector.rb +117 -0
- data/pattern/multi_vector_plus1.rb +125 -0
- data/pattern/nvm/j750/add_late_pins.rb +3 -0
- data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -0
- data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -0
- data/pattern/nvm/j750/j750_halt.rb +159 -0
- data/pattern/nvm/j750/j750_workout.rb +202 -0
- data/pattern/nvm/j750/timing.rb +73 -0
- data/pattern/nvm/v93k/v93k_workout.rb +136 -0
- data/pattern/read_write_reg.rb +58 -0
- data/pattern/reset.rb +4 -0
- data/pattern/subroutines.rb +38 -0
- data/program/_additional_erase.rb +7 -0
- data/program/_efa_resources.rb +7 -0
- data/program/_erase.rb +25 -0
- data/program/_erase_vfy.rb +5 -0
- data/program/_iv_resources.rb +10 -0
- data/program/basic_interface.rb +5 -0
- data/program/components/_prb2_main.rb +6 -0
- data/program/flow_control.rb +164 -0
- data/program/prb1.rb +226 -0
- data/program/prb1_resources.rb +28 -0
- data/program/prb2.rb +40 -0
- data/program/test.rb +20 -0
- data/templates/example.txt.erb +53 -0
- data/templates/j750/_vt_flow.txt.erb +8 -0
- data/templates/j750/_vt_instances.txt.erb +4 -0
- data/templates/j750/program_sheet.txt.erb +9 -0
- data/templates/manifest/v93k.yaml.erb +22 -0
- data/templates/web/index.md.erb +51 -0
- data/templates/web/layouts/_basic.html.erb +15 -0
- data/templates/web/partials/_navbar.html.erb +22 -0
- data/templates/web/release_notes.md.erb +5 -0
- metadata +332 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestInstanceGroup
|
|
5
|
+
attr_accessor :name, :version, :append_version
|
|
6
|
+
|
|
7
|
+
include Enumerable
|
|
8
|
+
|
|
9
|
+
def initialize(name, options = {})
|
|
10
|
+
@name = name
|
|
11
|
+
@store = []
|
|
12
|
+
@append_version = true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def name
|
|
16
|
+
if unversioned_name
|
|
17
|
+
if version && @append_version
|
|
18
|
+
"#{unversioned_name}_v#{version}"
|
|
19
|
+
else
|
|
20
|
+
unversioned_name.to_s
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def unversioned_name
|
|
26
|
+
if @name
|
|
27
|
+
if @name =~ /grp$/
|
|
28
|
+
@name
|
|
29
|
+
else
|
|
30
|
+
"#{@name}_grp"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def <<(instance)
|
|
36
|
+
@store << instance
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def size
|
|
40
|
+
@store.size
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def each
|
|
44
|
+
@store.each { |ins| yield ins }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def ==(other_instance_group)
|
|
48
|
+
self.class == other_instance_group.class &&
|
|
49
|
+
unversioned_name.to_s == other_instance_group.unversioned_name.to_s &&
|
|
50
|
+
size == other_instance_group.size &&
|
|
51
|
+
self.all? do |ins|
|
|
52
|
+
other_instance_group.any? { |other_ins| ins == other_ins }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestInstances
|
|
5
|
+
include OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
OUTPUT_POSTFIX = 'instances'
|
|
8
|
+
|
|
9
|
+
class IndexedString < ::String
|
|
10
|
+
attr_accessor :index
|
|
11
|
+
|
|
12
|
+
def name
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add(name, type, options = {})
|
|
18
|
+
options = {
|
|
19
|
+
test_instance_class: platform::TestInstance
|
|
20
|
+
}.merge(options)
|
|
21
|
+
ins = options.delete(:test_instance_class).new(name, type, options)
|
|
22
|
+
if @current_group
|
|
23
|
+
@current_group << ins
|
|
24
|
+
else
|
|
25
|
+
collection << ins
|
|
26
|
+
end
|
|
27
|
+
c = Origen.interface.consume_comments
|
|
28
|
+
Origen.interface.descriptions.add_for_test_definition(name, c)
|
|
29
|
+
ins
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# IG-XL doesn't have a formal instance group type and instead declares them anonymously
|
|
33
|
+
# whenever test instances of the same name appear consecutively in the test instance sheet.
|
|
34
|
+
# However when it comes to generating a test program life becomes much easier if we have
|
|
35
|
+
# a way to explicitly declare instances as part of a group - this makes duplicate tracking
|
|
36
|
+
# and sorting of the test instance sheet much easier.
|
|
37
|
+
#
|
|
38
|
+
# Use this method to generate instance groups via a block. Within the block you should
|
|
39
|
+
# generate instances as normal and they will automatically be assigned to the current group.
|
|
40
|
+
# Note that the name of the instances generated within the group is discarded and replaced
|
|
41
|
+
# with the name of the group. Origen automatically appends "grp" to this name to highlight
|
|
42
|
+
# instances that were generated as part of the group.
|
|
43
|
+
#
|
|
44
|
+
# test_instances.group("erase_all_blocks") do |group|
|
|
45
|
+
# # Generate instances here as normal
|
|
46
|
+
# test_instances.functional("erase_blk0")
|
|
47
|
+
# test_instances.functional("erase_blk1")
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# The group object is passed into the block but usually you should not need to interact
|
|
51
|
+
# with this directly except maybe to set the name if it is not yet established at the point
|
|
52
|
+
# where the group is initiated:
|
|
53
|
+
#
|
|
54
|
+
# test_instances.group do |group|
|
|
55
|
+
# # Generate instances here as normal
|
|
56
|
+
# group.name = "group_blah"
|
|
57
|
+
# end
|
|
58
|
+
#
|
|
59
|
+
# A common way to generate groups is to create a helper method in your application which
|
|
60
|
+
# is responsible for creating groups as required:
|
|
61
|
+
#
|
|
62
|
+
# def group_wrapper(name, options)
|
|
63
|
+
# if options[:by_block]
|
|
64
|
+
# test_instances.group(name) do |group|
|
|
65
|
+
# yield group
|
|
66
|
+
# end
|
|
67
|
+
# else
|
|
68
|
+
# yield
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
71
|
+
#
|
|
72
|
+
# In that case the group argument becomes quite useful for branching based on whether you
|
|
73
|
+
# are generating a group or standalone instances:
|
|
74
|
+
#
|
|
75
|
+
# group_wrapper(name, options) do |group|
|
|
76
|
+
# if group
|
|
77
|
+
# # Generate group instances
|
|
78
|
+
# else
|
|
79
|
+
# # Generate standalone instances
|
|
80
|
+
# end
|
|
81
|
+
# end
|
|
82
|
+
def group(name = nil, options = {})
|
|
83
|
+
name, options = nil, name if name.is_a?(Hash)
|
|
84
|
+
@current_group = platform::TestInstanceGroup.new(name, options)
|
|
85
|
+
collection << @current_group
|
|
86
|
+
yield @current_group
|
|
87
|
+
@current_group = nil
|
|
88
|
+
end
|
|
89
|
+
alias_method :add_group, :group
|
|
90
|
+
|
|
91
|
+
def finalize(options = {}) # :nodoc:
|
|
92
|
+
uniq!
|
|
93
|
+
sort!
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def uniq! # :nodoc:
|
|
97
|
+
uniques = []
|
|
98
|
+
versions = {}
|
|
99
|
+
multi_version_tests = {}
|
|
100
|
+
collection.each do |instance|
|
|
101
|
+
# If a uniquely named instance is found add it, otherwise update the version
|
|
102
|
+
# of the current instance to match that of the existing instance that it duplicates
|
|
103
|
+
unless uniques.any? do |i|
|
|
104
|
+
if i == instance
|
|
105
|
+
instance.version = i.version
|
|
106
|
+
true
|
|
107
|
+
else
|
|
108
|
+
false
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
if instance.respond_to?(:version=)
|
|
112
|
+
versions[instance.unversioned_name] ||= 0
|
|
113
|
+
versions[instance.unversioned_name] += 1
|
|
114
|
+
if versions[instance.unversioned_name] > 1
|
|
115
|
+
multi_version_tests[instance.unversioned_name] = true
|
|
116
|
+
end
|
|
117
|
+
instance.version = versions[instance.unversioned_name]
|
|
118
|
+
end
|
|
119
|
+
uniques << instance
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
# This final loop disables the version identifier for tests that have only a single version,
|
|
123
|
+
# this makes it clearer when multiple versions exist - whenever you see a v1 you know there
|
|
124
|
+
# is at least a v2 also.
|
|
125
|
+
collection.map! do |instance|
|
|
126
|
+
if instance.respond_to?(:version=)
|
|
127
|
+
unless multi_version_tests[instance.unversioned_name]
|
|
128
|
+
instance.append_version = false
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
instance
|
|
132
|
+
end
|
|
133
|
+
self.collection = uniques
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def sort! # :nodoc:
|
|
137
|
+
# Present the instances in the final sheet in alphabetical order
|
|
138
|
+
collection.map!.with_index do |ins, i|
|
|
139
|
+
if ins.is_a?(String) # Can happen if content has been rendered in from a template
|
|
140
|
+
ins = IndexedString.new(ins)
|
|
141
|
+
end
|
|
142
|
+
ins
|
|
143
|
+
end
|
|
144
|
+
collection.sort! { |a, b| [a.name.to_s] <=> [b.name.to_s] }
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def bpmu(name, options = {})
|
|
148
|
+
add(name, :board_pmu, options)
|
|
149
|
+
end
|
|
150
|
+
alias_method :board_pmu, :bpmu
|
|
151
|
+
|
|
152
|
+
def ppmu(name, options = {})
|
|
153
|
+
add(name, :pin_pmu, options)
|
|
154
|
+
end
|
|
155
|
+
alias_method :pin_pmu, :ppmu
|
|
156
|
+
|
|
157
|
+
def functional(name, options = {})
|
|
158
|
+
add(name, :functional, options)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def empty(name, options = {})
|
|
162
|
+
add(name, :empty, options)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def other(name, options = {})
|
|
166
|
+
add(name, :other, options)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def apmu_powersupply(name, options = {})
|
|
170
|
+
add(name, :apmu_powersupply, options)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def mto_memory(name, options = {})
|
|
174
|
+
add(name, :mto_memory, options)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
# Methods for handling all J750 file parsing, e.g. datalogs,
|
|
4
|
+
# test time profiles, etc.
|
|
5
|
+
module Files
|
|
6
|
+
# Reads all lines from a J750 detailed execution time file, returning the lines
|
|
7
|
+
# as an array like this:
|
|
8
|
+
#
|
|
9
|
+
# [
|
|
10
|
+
# {:name => "power_cycle", :index => 1, :group => 3, :time => 0.00461},
|
|
11
|
+
# {:name => "power_cycle", :index => 2, :group => 3, :time => 0.00481},
|
|
12
|
+
# {:name => "power_cycle", :index => 3, :group => 3, :time => 0.00438},
|
|
13
|
+
# {:name => "nvm_mass_erase", :index => nil, :group => nil, :time => 0.19863},
|
|
14
|
+
# ]
|
|
15
|
+
def read_test_times(file, options = {})
|
|
16
|
+
tests = []
|
|
17
|
+
File.readlines(file).each do |line|
|
|
18
|
+
unless line.strip.empty? || line =~ /Entire Job/
|
|
19
|
+
# http://rubular.com/r/vZOcqovTsf
|
|
20
|
+
if line =~ /(\w+) ?(\(.*?\))? \d\d\d\d (\d+\.\d+).*/
|
|
21
|
+
t = { name: Regexp.last_match[1], time: Regexp.last_match[3].to_f.round(6) }
|
|
22
|
+
# If an indexed test
|
|
23
|
+
if Regexp.last_match[2]
|
|
24
|
+
str = Regexp.last_match[2].gsub('(', '').gsub(')', '')
|
|
25
|
+
fields = str.split('/')
|
|
26
|
+
i = fields[0].to_i
|
|
27
|
+
g = fields[1].to_i
|
|
28
|
+
t[:index] = i
|
|
29
|
+
t[:group] = g
|
|
30
|
+
|
|
31
|
+
else
|
|
32
|
+
t[:index] = nil
|
|
33
|
+
t[:group] = nil
|
|
34
|
+
end
|
|
35
|
+
tests << t
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
tests
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
# Tester model to generate .atp patterns for the Teradyne J750
|
|
4
|
+
#
|
|
5
|
+
# == Basic Usage
|
|
6
|
+
# $tester = Testers::J750.new
|
|
7
|
+
# $tester.cycle # Generate a vector
|
|
8
|
+
#
|
|
9
|
+
# Many more methods exist to generate J750 specific micro-code, see below for
|
|
10
|
+
# details.
|
|
11
|
+
#
|
|
12
|
+
# Also note that this class inherits from the base Tester class and so all methods
|
|
13
|
+
# described there are also available.
|
|
14
|
+
class J750 < Base
|
|
15
|
+
require 'origen_testers/igxl_based_tester/j750/generator.rb'
|
|
16
|
+
|
|
17
|
+
attr_accessor :use_hv_pin
|
|
18
|
+
attr_accessor :software_version
|
|
19
|
+
|
|
20
|
+
def self.hpt_mode
|
|
21
|
+
@@hpt_mode
|
|
22
|
+
end
|
|
23
|
+
def self.hpt_mode?
|
|
24
|
+
@@hpt_mode
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns a new J750 instance, normally there would only ever be one of these
|
|
28
|
+
# assigned to the global variable such as $tester by your target.
|
|
29
|
+
def initialize
|
|
30
|
+
super
|
|
31
|
+
@pipeline_depth = 34 # for extended mode is vectors, for normal mode is vector pairs (54 for J750Ex)
|
|
32
|
+
@use_hv_pin = false # allows to use high voltage for a pin for all patterns
|
|
33
|
+
@software_version = '3.50.40'
|
|
34
|
+
@name = 'j750'
|
|
35
|
+
@@hpt_mode = false
|
|
36
|
+
@opcode_mode = :extended
|
|
37
|
+
@loop_bits_max = 16 # maximum loop bit length
|
|
38
|
+
|
|
39
|
+
@flags = %w(cpuA cpuB cpuC cpuD)
|
|
40
|
+
@microcode[:enable] = 'enable'
|
|
41
|
+
@microcode[:set_flag] = 'set_cpu'
|
|
42
|
+
@microcode[:mask_vector] = 'ign ifc icc'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def pattern_header(options = {})
|
|
46
|
+
super(options) do |pin_list|
|
|
47
|
+
microcode "vector ($tset, #{pin_list})"
|
|
48
|
+
microcode '{'
|
|
49
|
+
unless options[:subroutine_pat]
|
|
50
|
+
microcode 'start_label pattern_st:'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def pattern_footer(options = {})
|
|
56
|
+
super(options)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Generates a match loop based on vector condition passed in via block
|
|
60
|
+
#
|
|
61
|
+
# This method is not really intended to be called directly, rather you should call
|
|
62
|
+
# via Tester#wait:
|
|
63
|
+
# e.g. $tester.wait(:match => true) do
|
|
64
|
+
# reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
|
|
65
|
+
# end
|
|
66
|
+
#
|
|
67
|
+
# The timeout should be provided in cycles, however when called via the wait method the
|
|
68
|
+
# time-based helpers (time_in_us, etc) will be converted to cycles for you.
|
|
69
|
+
#
|
|
70
|
+
# The following options are available to tailor the match loop behavior, defaults in
|
|
71
|
+
# parenthesis:
|
|
72
|
+
# * :check_for_fails (false) - Flushes the pipeline and handshakes with the tester (passing readcode 100) prior to the match (to allow binout of fails encountered before the match)
|
|
73
|
+
# * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
|
|
74
|
+
# * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
|
|
75
|
+
# * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop
|
|
76
|
+
# * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
|
|
77
|
+
# * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
|
|
78
|
+
# * :global_loops (false) - whether match loop loops should use global labels
|
|
79
|
+
# * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
|
|
80
|
+
# at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
|
|
81
|
+
# ==== Examples
|
|
82
|
+
# $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
|
|
83
|
+
# <vectors>
|
|
84
|
+
# end
|
|
85
|
+
def match_block(timeout, options = {}, &block)
|
|
86
|
+
options = {
|
|
87
|
+
check_for_fails: false,
|
|
88
|
+
on_timeout_goto: false,
|
|
89
|
+
on_block_match_goto: false,
|
|
90
|
+
multiple_entries: false,
|
|
91
|
+
force_fail_on_timeout: true,
|
|
92
|
+
global_loops: false,
|
|
93
|
+
manual_stop: false,
|
|
94
|
+
clr_fail_post_match: false
|
|
95
|
+
}.merge(options)
|
|
96
|
+
|
|
97
|
+
unless block_given?
|
|
98
|
+
fail 'ERROR: block not passed to match_block!'
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Create BlockArgs objects in order to receive multiple blocks
|
|
102
|
+
match_conditions = Origen::Utility::BlockArgs.new
|
|
103
|
+
fail_conditions = Origen::Utility::BlockArgs.new
|
|
104
|
+
|
|
105
|
+
# yield object to calling routine to get populated with blocks
|
|
106
|
+
if block.arity > 0
|
|
107
|
+
yield match_conditions, fail_conditions
|
|
108
|
+
else
|
|
109
|
+
# for backwards compatibility with Origen core call to match_block
|
|
110
|
+
match_conditions.add(&block)
|
|
111
|
+
fail_conditions.add(&block)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Flush the pipeline first and then pass control to the program to bin out any failures
|
|
115
|
+
# prior to entering the match loop
|
|
116
|
+
if options[:check_for_fails]
|
|
117
|
+
if options[:multiple_entries]
|
|
118
|
+
@match_entries.times do |i|
|
|
119
|
+
microcode "global subr match_done_#{i}:"
|
|
120
|
+
set_code(i + 100)
|
|
121
|
+
cycle(microcode: 'jump call_tester') unless i == @match_entries - 1
|
|
122
|
+
end
|
|
123
|
+
microcode 'call_tester:'
|
|
124
|
+
else
|
|
125
|
+
set_code(100)
|
|
126
|
+
end
|
|
127
|
+
cc 'Wait for any prior failures to propagate through the pipeline'
|
|
128
|
+
cycle(microcode: 'pipe_minus 1')
|
|
129
|
+
cc 'Now handshake with the tester to bin out and parts that have failed before they got here'
|
|
130
|
+
handshake(manual_stop: options[:manual_stop])
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Now do the main match loop
|
|
134
|
+
cc 'Start the match loop'
|
|
135
|
+
|
|
136
|
+
global_opt = (options[:global_loops]) ? 'global ' : ''
|
|
137
|
+
microcode "#{global_opt}match_outer_loop_#{@unique_counter}:"
|
|
138
|
+
cycle # (:microcode => "loopB #{outer_loop_count} ign ifc icc")
|
|
139
|
+
set_loopb_vector = last_vector
|
|
140
|
+
|
|
141
|
+
microcode "#{global_opt}match_inner_loop_#{@unique_counter}:"
|
|
142
|
+
cycle # (:microcode => "loopA #{inner_loop_count} ign ifc icc")
|
|
143
|
+
set_loopa_vector = last_vector
|
|
144
|
+
|
|
145
|
+
# count cycles in match loop block passed to help with meeting
|
|
146
|
+
# desired timeout value (have to back assign microcodes above)
|
|
147
|
+
prematch_cycle_count = cycle_count
|
|
148
|
+
match_conditions.each_with_index do |condition, i|
|
|
149
|
+
mask_fails(true)
|
|
150
|
+
condition.call # match condition
|
|
151
|
+
mask_fails(false)
|
|
152
|
+
cc ' Wait for the result to propagate through the pipeline'
|
|
153
|
+
cycle(microcode: 'pipe_minus 1 ign ifc icc')
|
|
154
|
+
inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
|
|
155
|
+
cc "Branch if block condition #{i} met"
|
|
156
|
+
cycle(microcode: "if (pass) jump block_#{i}_matched_#{@unique_counter} icc ifc")
|
|
157
|
+
cycle(microcode: 'clr_flag (fail) icc')
|
|
158
|
+
end
|
|
159
|
+
match_conditions_cycle_count = cycle_count - prematch_cycle_count
|
|
160
|
+
cc "Match loop cycle count = #{match_conditions_cycle_count}"
|
|
161
|
+
|
|
162
|
+
# reduce timeout requested by match loop cycle count
|
|
163
|
+
timeout = (timeout.to_f / match_conditions_cycle_count).ceil
|
|
164
|
+
|
|
165
|
+
# Calculate the loop counts for the 2 loops to appropriately hit the timeout requested
|
|
166
|
+
loop_value = timeout.to_f.floor
|
|
167
|
+
|
|
168
|
+
if loop_value < (2**@loop_bits_max)
|
|
169
|
+
# small value, only need to use one loop
|
|
170
|
+
outer_loop_count = 1
|
|
171
|
+
inner_loop_count = loop_value
|
|
172
|
+
elsif loop_value < (2**(2 * @loop_bits_max))
|
|
173
|
+
# 2 nested loops required
|
|
174
|
+
inner_loop_count = 2**@loop_bits_max - 1
|
|
175
|
+
outer_loop_count = (loop_value.to_f / inner_loop_count).ceil
|
|
176
|
+
else
|
|
177
|
+
abort 'ERROR: timeout value too large in tester match method!'
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# retroactively set loop counter values for timeout based on cycles in match loop condition
|
|
181
|
+
set_loopb_vector.microcode = "loopB #{outer_loop_count} ign ifc icc"
|
|
182
|
+
set_loopa_vector.microcode = "loopA #{inner_loop_count} ign ifc icc"
|
|
183
|
+
|
|
184
|
+
cc 'Loop back around if time remaining'
|
|
185
|
+
cycle(microcode: "end_loopA match_inner_loop_#{@unique_counter} icc")
|
|
186
|
+
cycle(microcode: "end_loopB match_outer_loop_#{@unique_counter} icc")
|
|
187
|
+
|
|
188
|
+
if options[:force_fail_on_timeout]
|
|
189
|
+
cc 'To get here something has gone wrong, check block again to force a pattern failure'
|
|
190
|
+
fail_conditions.each(&:call)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
if options[:on_timeout_goto]
|
|
194
|
+
cycle(microcode: "jump #{options[:on_timeout_goto]} icc")
|
|
195
|
+
else
|
|
196
|
+
cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
|
|
197
|
+
# cycle(:microcode => 'halt')
|
|
198
|
+
end
|
|
199
|
+
match_conditions.each_with_index do |condition, i|
|
|
200
|
+
microcode "block_#{i}_matched_#{@unique_counter}:"
|
|
201
|
+
cycle(microcode: 'pop_loop icc')
|
|
202
|
+
end
|
|
203
|
+
if options[:clr_fail_post_match]
|
|
204
|
+
cycle(microcode: 'clr_fail')
|
|
205
|
+
end
|
|
206
|
+
if options[:on_block_match_goto]
|
|
207
|
+
cycle(microcode: "jump #{options[:on_block_match_goto]}")
|
|
208
|
+
end
|
|
209
|
+
microcode "match_loop_end_#{@unique_counter}:"
|
|
210
|
+
if options[:clr_fail_post_match]
|
|
211
|
+
cycle(microcode: 'clr_fail')
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
215
|
+
# handshake is called in the same pattern
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Handshake with the tester.
|
|
219
|
+
#
|
|
220
|
+
# Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
|
|
221
|
+
# pass in a read code to pass information to the tester.
|
|
222
|
+
#
|
|
223
|
+
# ==== Examples
|
|
224
|
+
# $tester.handshake # Pass control to the tester for a measurement
|
|
225
|
+
# $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
|
|
226
|
+
def handshake(options = {})
|
|
227
|
+
options = {
|
|
228
|
+
readcode: false,
|
|
229
|
+
manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
|
|
230
|
+
}.merge(options)
|
|
231
|
+
if options[:readcode]
|
|
232
|
+
set_code(options[:readcode])
|
|
233
|
+
end
|
|
234
|
+
if options[:manual_stop]
|
|
235
|
+
cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
|
|
236
|
+
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
|
|
237
|
+
cycle(microcode: "loop_here_#{@unique_counter}: if (flag) jump loop_here_#{@unique_counter}")
|
|
238
|
+
else
|
|
239
|
+
cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
|
|
240
|
+
cycle(microcode: "loop_here_#{@unique_counter}: if (#{@flags[0]}) jump loop_here_#{@unique_counter}")
|
|
241
|
+
end
|
|
242
|
+
@unique_counter += 1 # Increment so a different label will be applied if another
|
|
243
|
+
# handshake is called in the same pattern
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
J750 = IGXLBasedTester::J750
|
|
248
|
+
end
|