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,38 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Patsets
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
OUTPUT_POSTFIX = 'patsets'
|
|
8
|
+
|
|
9
|
+
def add(name, options = {})
|
|
10
|
+
p = platform::Patset.new(name, options)
|
|
11
|
+
collection << p
|
|
12
|
+
p
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def finalize(options = {})
|
|
16
|
+
uniq!
|
|
17
|
+
sort!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Present the patsets in the final sheet in alphabetical order
|
|
21
|
+
def sort!
|
|
22
|
+
collection.sort_by!(&:name)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Removes all duplicate patsets
|
|
26
|
+
def uniq!
|
|
27
|
+
uniques = []
|
|
28
|
+
collection.each do |patset|
|
|
29
|
+
unless uniques.any? { |p| p == patset }
|
|
30
|
+
uniques << patset
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
self.collection = uniques
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Patsubr
|
|
5
|
+
attr_accessor :index
|
|
6
|
+
|
|
7
|
+
# Specify multiple patterns by passing an array of attributes
|
|
8
|
+
# as the 2nd argument:
|
|
9
|
+
#
|
|
10
|
+
# Patset.new("mrd1_pset", :pattern => "nvm_mrd1.PAT")
|
|
11
|
+
#
|
|
12
|
+
# Patset.new("mrd1_pset", [{:pattern => "nvm_mrd1.PAT"},
|
|
13
|
+
# {:pattern => "nvm_global_subs.PAT, :start_label => "subr"}
|
|
14
|
+
# ])
|
|
15
|
+
def initialize(name, attrs = {})
|
|
16
|
+
attrs = [attrs] unless attrs.is_a? Array
|
|
17
|
+
attrs.each do |pattrs|
|
|
18
|
+
if pattrs[:pattern]
|
|
19
|
+
pat = Pathname.new(pattrs[:pattern].gsub('\\', '/')).basename('.*').to_s
|
|
20
|
+
Origen.interface.referenced_patterns << pat
|
|
21
|
+
end
|
|
22
|
+
lines << platform::PatsubrPattern.new(name, pattrs)
|
|
23
|
+
end
|
|
24
|
+
self.name = name
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def ==(other_patset)
|
|
28
|
+
self.class == other_patset.class &&
|
|
29
|
+
name.to_s == other_patset.name.to_s &&
|
|
30
|
+
sorted_pattern_files == other_patset.sorted_pattern_files
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def name
|
|
34
|
+
@name
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def name=(n)
|
|
38
|
+
@name = n
|
|
39
|
+
lines.each { |l| l.pattern_set = n }
|
|
40
|
+
n
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns all lines in the pattern set
|
|
44
|
+
def lines
|
|
45
|
+
@lines ||= []
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns all pattern files in the pattern set in alphabetical order
|
|
49
|
+
def sorted_pattern_files
|
|
50
|
+
@lines.map(&:file_name).sort
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Returns the fully formatted pattern set for insertion into a patset sheet
|
|
54
|
+
def to_s
|
|
55
|
+
l = ''
|
|
56
|
+
lines.each do |line|
|
|
57
|
+
l += "#{line}\r\n"
|
|
58
|
+
end
|
|
59
|
+
l.chomp
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def platform
|
|
63
|
+
Origen.interface.platform
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class PatsubrPattern
|
|
5
|
+
ALIASES = {
|
|
6
|
+
pattern: :file_name
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
def self.define
|
|
10
|
+
# Generate accessors for all attributes and their aliases
|
|
11
|
+
self::PATSUBR_ATTRS.each do |attr|
|
|
12
|
+
writer = "#{attr}=".to_sym
|
|
13
|
+
reader = attr.to_sym
|
|
14
|
+
attr_reader attr.to_sym unless method_defined? reader
|
|
15
|
+
attr_writer attr.to_sym unless method_defined? writer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
ALIASES.each do |_alias, val|
|
|
19
|
+
writer = "#{_alias}=".to_sym
|
|
20
|
+
reader = _alias.to_sym
|
|
21
|
+
unless method_defined? writer
|
|
22
|
+
define_method("#{_alias}=") do |v|
|
|
23
|
+
send("#{val}=", v)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
unless method_defined? reader
|
|
27
|
+
define_method("#{_alias}") do
|
|
28
|
+
send(val)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def initialize(patsubr, attrs = {})
|
|
35
|
+
# Set the defaults
|
|
36
|
+
self.class::PATSUBR_DEFAULTS.each do |k, v|
|
|
37
|
+
send("#{k}=", v)
|
|
38
|
+
end
|
|
39
|
+
# Then the values that have been supplied
|
|
40
|
+
self.pattern_subr = patsubr
|
|
41
|
+
attrs.each do |k, v|
|
|
42
|
+
send("#{k}=", v)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def to_s
|
|
47
|
+
l = "\t"
|
|
48
|
+
self.class::PATSUBR_ATTRS.each do |attr|
|
|
49
|
+
l += "#{send(attr)}\t"
|
|
50
|
+
end
|
|
51
|
+
"#{l}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Patsubrs
|
|
5
|
+
include ::OrigenTesters::Generator
|
|
6
|
+
|
|
7
|
+
OUTPUT_POSTFIX = 'patsubrs'
|
|
8
|
+
|
|
9
|
+
def add(name, options = {})
|
|
10
|
+
p = Patsubr.new(name, options)
|
|
11
|
+
collection << p
|
|
12
|
+
p
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def finalize(options = {})
|
|
16
|
+
uniq!
|
|
17
|
+
sort!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Present the patsubrs in the final sheet in alphabetical order
|
|
21
|
+
def sort!
|
|
22
|
+
collection.sort_by!(&:name)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Removes all duplicate patsubrs
|
|
26
|
+
def uniq!
|
|
27
|
+
uniques = []
|
|
28
|
+
collection.each do |patsubr|
|
|
29
|
+
unless uniques.any? { |p| p == patsubr }
|
|
30
|
+
uniques << patsubr
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
self.collection = uniques
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestInstance
|
|
5
|
+
attr_accessor :type, :index, :version, :append_version
|
|
6
|
+
|
|
7
|
+
def self.define
|
|
8
|
+
# Generate accessors for all attributes and their aliases
|
|
9
|
+
attrs.each do |attr|
|
|
10
|
+
writer = "#{attr}=".to_sym
|
|
11
|
+
reader = attr.to_sym
|
|
12
|
+
attr_reader attr.to_sym unless method_defined? reader
|
|
13
|
+
attr_writer attr.to_sym unless method_defined? writer
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Define the common aliases now, the instance type specific ones will
|
|
17
|
+
# be created when the instance type is known
|
|
18
|
+
self::TEST_INSTANCE_ALIASES.each do |_alias, val|
|
|
19
|
+
writer = "#{_alias}=".to_sym
|
|
20
|
+
reader = _alias.to_sym
|
|
21
|
+
unless val.is_a? Hash
|
|
22
|
+
unless method_defined? writer
|
|
23
|
+
define_method("#{_alias}=") do |v|
|
|
24
|
+
send("#{val}=", v)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
unless method_defined? reader
|
|
28
|
+
define_method("#{_alias}") do
|
|
29
|
+
send(val)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.attrs
|
|
37
|
+
@attrs ||= begin
|
|
38
|
+
attrs = self::TEST_INSTANCE_ATTRS.dup
|
|
39
|
+
|
|
40
|
+
self::TEST_INSTANCE_EXTRA_ARGS.times do |i|
|
|
41
|
+
attrs << "arg#{i}"
|
|
42
|
+
end
|
|
43
|
+
attrs << 'comment'
|
|
44
|
+
attrs
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def initialize(name, type, attrs = {})
|
|
49
|
+
@type = type
|
|
50
|
+
@append_version = true
|
|
51
|
+
self.name = name
|
|
52
|
+
# Build the type specific accessors (aliases)
|
|
53
|
+
self.class::TEST_INSTANCE_ALIASES[@type.to_sym].each do |_alias, val|
|
|
54
|
+
define_singleton_method("#{_alias}=") do |v|
|
|
55
|
+
send("#{val}=", v) if self.respond_to?("#{val}=", v)
|
|
56
|
+
end
|
|
57
|
+
define_singleton_method("#{_alias}") do
|
|
58
|
+
send(val) if self.respond_to?(val)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
# Set the defaults
|
|
62
|
+
self.class::TEST_INSTANCE_DEFAULTS[@type.to_sym].each do |k, v|
|
|
63
|
+
send("#{k}=", v) if self.respond_to?("#{k}=", v)
|
|
64
|
+
end
|
|
65
|
+
# Then the values that have been supplied
|
|
66
|
+
attrs.each do |k, v|
|
|
67
|
+
send("#{k}=", v) if self.respond_to?("#{k}=", v)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def ==(other_instance)
|
|
72
|
+
self.class == other_instance.class &&
|
|
73
|
+
unversioned_name.to_s == other_instance.unversioned_name.to_s &&
|
|
74
|
+
self.class.attrs.all? do |attr|
|
|
75
|
+
# Exclude test name, already examined above and don't want to include
|
|
76
|
+
# the version in the comparison
|
|
77
|
+
if attr == 'test_name'
|
|
78
|
+
true
|
|
79
|
+
else
|
|
80
|
+
send(attr) == other_instance.send(attr)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.new_empty(name, attrs = {})
|
|
86
|
+
new(name, :empty, attrs)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.new_functional(name, attrs = {})
|
|
90
|
+
new(name, :functional, attrs)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.new_board_pmu(name, attrs = {})
|
|
94
|
+
new(name, :board_pmu, attrs)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.new_pin_pmu(name, attrs = {})
|
|
98
|
+
new(name, :pin_pmu, attrs)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.new_apmu_powersupply(name, attrs = {})
|
|
102
|
+
new(name, :apmu_powersupply, attrs)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.new_mto_memory(name, attrs = {})
|
|
106
|
+
new(name, :mto_memory, attrs)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Returns the fully formatted test instance for insertion into an instance sheet
|
|
110
|
+
def to_s(override_name = nil)
|
|
111
|
+
l = "\t"
|
|
112
|
+
self.class.attrs.each do |attr|
|
|
113
|
+
if attr == 'test_name' && override_name
|
|
114
|
+
l += "#{override_name}\t"
|
|
115
|
+
else
|
|
116
|
+
l += "#{send(attr)}\t"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
"#{l}"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def name
|
|
123
|
+
if version && @append_version
|
|
124
|
+
"#{@test_name}_v#{version}"
|
|
125
|
+
else
|
|
126
|
+
@test_name.to_s
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
alias_method :test_name, :name
|
|
130
|
+
|
|
131
|
+
def name=(val)
|
|
132
|
+
self.test_name = val
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def unversioned_name
|
|
136
|
+
@test_name.to_s
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Set the cpu wait flags for the given test instance
|
|
140
|
+
# instance.set_wait_flags(:a)
|
|
141
|
+
# instance.set_wait_flags(:a, :c)
|
|
142
|
+
def set_wait_flags(*flags)
|
|
143
|
+
# This method is tester-specific and must be overridden by the child class
|
|
144
|
+
fail 'The #{self.class} class has not defined a set_wait_flags method!'
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Set and enable the pre-charge voltage of a parametric test instance.
|
|
148
|
+
def set_pre_charge(val)
|
|
149
|
+
if val
|
|
150
|
+
self.pre_charge_enable = 1
|
|
151
|
+
self.pre_charge = val
|
|
152
|
+
else
|
|
153
|
+
self.pre_charge_enable = 0
|
|
154
|
+
end
|
|
155
|
+
self
|
|
156
|
+
end
|
|
157
|
+
alias_method :set_precharge, :set_pre_charge
|
|
158
|
+
|
|
159
|
+
# Set and enable the hi limit of a parametric test instance, passing in
|
|
160
|
+
# nil or false as the lim parameter will disable the hi limit.
|
|
161
|
+
def set_hi_limit(lim)
|
|
162
|
+
if lim
|
|
163
|
+
self.hi_lo_limit_valid = hi_lo_limit_valid | 2
|
|
164
|
+
self.hi_limit = lim
|
|
165
|
+
else
|
|
166
|
+
self.hi_lo_limit_valid = hi_lo_limit_valid & 1
|
|
167
|
+
end
|
|
168
|
+
self
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Set and enable the hi limit of a parametric test instance, passing in
|
|
172
|
+
# nil or false as the lim parameter will disable the hi limit.
|
|
173
|
+
def set_lo_limit(lim)
|
|
174
|
+
if lim
|
|
175
|
+
self.hi_lo_limit_valid = hi_lo_limit_valid | 1
|
|
176
|
+
self.lo_limit = lim
|
|
177
|
+
else
|
|
178
|
+
self.hi_lo_limit_valid = hi_lo_limit_valid & 2
|
|
179
|
+
end
|
|
180
|
+
self
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Set the current range of the test instance, the following are valid:
|
|
184
|
+
#
|
|
185
|
+
# Board PMU
|
|
186
|
+
# * 2uA
|
|
187
|
+
# * 20uA
|
|
188
|
+
# * 200uA
|
|
189
|
+
# * 2mA
|
|
190
|
+
# * 20mA
|
|
191
|
+
# * 200mA
|
|
192
|
+
# * :smart
|
|
193
|
+
#
|
|
194
|
+
# Pin PMU
|
|
195
|
+
# * 200nA
|
|
196
|
+
# * 2uA
|
|
197
|
+
# * 20uA
|
|
198
|
+
# * 200uA
|
|
199
|
+
# * 2mA
|
|
200
|
+
# * :auto
|
|
201
|
+
# * :smart
|
|
202
|
+
#
|
|
203
|
+
# Examples
|
|
204
|
+
# instance.set_irange(:smart)
|
|
205
|
+
# instance.set_irange(:ua => 2)
|
|
206
|
+
# instance.set_irange(2.uA) # Same as above
|
|
207
|
+
# instance.set_irange(:ma => 200)
|
|
208
|
+
# instance.set_irange(0.2) # Same as above
|
|
209
|
+
# instance.set_irange(:a => 0.2) # Same as above
|
|
210
|
+
def set_irange(r = nil, options = {})
|
|
211
|
+
r, options = nil, r if r.is_a?(Hash)
|
|
212
|
+
unless r
|
|
213
|
+
if r = options.delete(:na) || options.delete(:nA)
|
|
214
|
+
r = r / 1_000_000_000
|
|
215
|
+
elsif r = options.delete(:ua) || options.delete(:uA)
|
|
216
|
+
r = r / 1_000_000.0
|
|
217
|
+
elsif r = options.delete(:ma) || options.delete(:mA)
|
|
218
|
+
r = r / 1000.0
|
|
219
|
+
elsif r = options.delete(:a) || options.delete(:A)
|
|
220
|
+
else
|
|
221
|
+
fail "Can't determine requested irange!"
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
if @type == :board_pmu
|
|
226
|
+
if r == :smart
|
|
227
|
+
self.irange = 6
|
|
228
|
+
else
|
|
229
|
+
self.irange = case
|
|
230
|
+
when r > 0.02 then 5
|
|
231
|
+
when r > 0.002 then 4
|
|
232
|
+
when r > 0.0002 then 3
|
|
233
|
+
when r > 0.00002 then 2
|
|
234
|
+
when r > 0.000002 then 1
|
|
235
|
+
else 0
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
else # :pin_pmu
|
|
240
|
+
if r == :smart
|
|
241
|
+
self.irange = 5
|
|
242
|
+
elsif r == :auto
|
|
243
|
+
fail 'Auto range not available in FIMV mode!' if self.fimv?
|
|
244
|
+
self.irange = 6
|
|
245
|
+
else
|
|
246
|
+
if fimv?
|
|
247
|
+
self.irange = case
|
|
248
|
+
when r > 0.0002 then 2
|
|
249
|
+
else 4
|
|
250
|
+
end
|
|
251
|
+
else
|
|
252
|
+
self.irange = case
|
|
253
|
+
when r > 0.0002 then 2
|
|
254
|
+
when r > 0.00002 then 4
|
|
255
|
+
when r > 0.000002 then 0
|
|
256
|
+
when r > 0.0000002 then 1
|
|
257
|
+
else 3
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
self
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Set the voltage range of the test instance, the following are valid:
|
|
267
|
+
#
|
|
268
|
+
# Board PMU
|
|
269
|
+
# * 2V
|
|
270
|
+
# * 5V
|
|
271
|
+
# * 10V
|
|
272
|
+
# * 24V
|
|
273
|
+
# * :auto
|
|
274
|
+
# * :smart
|
|
275
|
+
#
|
|
276
|
+
# Examples
|
|
277
|
+
# instance.set_vrange(:auto)
|
|
278
|
+
# instance.set_vrange(:v => 5)
|
|
279
|
+
# instance.set_vrange(5) # Same as above
|
|
280
|
+
def set_vrange(r = nil, options = {})
|
|
281
|
+
r, options = nil, r if r.is_a?(Hash)
|
|
282
|
+
if r == :smart
|
|
283
|
+
self.vrange = 4
|
|
284
|
+
elsif r == :auto
|
|
285
|
+
self.vrange = 5
|
|
286
|
+
elsif !r
|
|
287
|
+
if r = options.delete(:v) || options.delete(:V)
|
|
288
|
+
else
|
|
289
|
+
fail "Can't determine requested vrange!"
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
self.vrange = case
|
|
293
|
+
when r > 10 then 3
|
|
294
|
+
when r > 5 then 2
|
|
295
|
+
when r > 2 then 1
|
|
296
|
+
else 0
|
|
297
|
+
end
|
|
298
|
+
self
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# Set the meaure mode of a parametric test instance, either:
|
|
302
|
+
# * :voltage / :fimv
|
|
303
|
+
# * :current / :fvmi
|
|
304
|
+
def set_measure_mode(mode)
|
|
305
|
+
if mode == :current || mode == :fvmi
|
|
306
|
+
self.measure_mode = 0
|
|
307
|
+
elsif mode == :voltage || mode == :fimv
|
|
308
|
+
self.measure_mode = 1
|
|
309
|
+
else
|
|
310
|
+
fail "Unknown measure mode: #{mode}"
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Returns true if instance configured for force current, measure voltage
|
|
315
|
+
def fimv?
|
|
316
|
+
measure_mode == 1
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
# Returns true if instance configured for force voltage, measure current
|
|
320
|
+
def fvmi?
|
|
321
|
+
measure_mode == 0
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
end
|