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,123 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
module Generator
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
autoload :Placeholder, 'origen_testers/generator/placeholder'
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
include Interface # adds the interface helpers/Origen hook-up
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# This is just to give all interfaces an initialize that takes
|
|
14
|
+
# one argument. The super is important for cases where this module
|
|
15
|
+
# is included late via Testers::ProgramGenerators
|
|
16
|
+
def initialize(options = {})
|
|
17
|
+
super
|
|
18
|
+
@initialized = true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_tml(name, methods)
|
|
22
|
+
custom_tmls[name] = methods
|
|
23
|
+
end
|
|
24
|
+
alias_method :add_test_method_library, :add_tml
|
|
25
|
+
|
|
26
|
+
# @api private
|
|
27
|
+
def at_flow_start
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @api private
|
|
31
|
+
def at_run_start
|
|
32
|
+
flow.at_run_start
|
|
33
|
+
@@flow_sheets = nil
|
|
34
|
+
end
|
|
35
|
+
alias_method :reset_globals, :at_run_start
|
|
36
|
+
|
|
37
|
+
def resources_filename=(name)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def flow(filename = Origen.file_handler.current_file.basename('.rb').to_s)
|
|
41
|
+
f = filename.to_sym
|
|
42
|
+
if Origen.interface.resources_mode?
|
|
43
|
+
f = f.to_s.sub(/_resources?/, '').to_sym
|
|
44
|
+
end
|
|
45
|
+
return flow_sheets[f] if flow_sheets[f] # will return flow if already existing
|
|
46
|
+
p = platform::Flow.new
|
|
47
|
+
p.inhibit_output if Origen.interface.resources_mode?
|
|
48
|
+
p.filename = f
|
|
49
|
+
p.test_suites ||= platform::TestSuites.new(p)
|
|
50
|
+
p.test_methods ||= platform::TestMethods.new(p)
|
|
51
|
+
p.pattern_master ||= platform::PatternMaster.new(p)
|
|
52
|
+
flow_sheets[f] = p
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns a top-level pattern master file which will contain all patterns from
|
|
56
|
+
# all flows. Additionally each flow has its own pattern master file containing
|
|
57
|
+
# only the patterns for the specific flow.
|
|
58
|
+
def pattern_master
|
|
59
|
+
@pattern_master ||= begin
|
|
60
|
+
m = platform::PatternMaster.new(manually_register: true)
|
|
61
|
+
name = 'complete.pmfl'
|
|
62
|
+
name = "#{Origen.config.program_prefix}_#{name}" if Origen.config.program_prefix
|
|
63
|
+
m.filename = name
|
|
64
|
+
m
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Generates a pattern compiler configuration file (.aiv) to compile all
|
|
69
|
+
# patterns referenced in all flows.
|
|
70
|
+
def pattern_compiler
|
|
71
|
+
@pattern_compiler ||= begin
|
|
72
|
+
m = platform::PatternCompiler.new(manually_register: true)
|
|
73
|
+
name = 'complete.aiv'
|
|
74
|
+
name = "#{Origen.config.program_prefix}_#{name}" if Origen.config.program_prefix
|
|
75
|
+
m.filename = name
|
|
76
|
+
m
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_suites
|
|
81
|
+
flow.test_suites
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_methods
|
|
85
|
+
flow.test_methods
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def flow_sheets
|
|
89
|
+
@@flow_sheets ||= {}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Returns an array containing all sheet generators.
|
|
93
|
+
# All Origen program generators must implement this method
|
|
94
|
+
def sheet_generators # :nodoc:
|
|
95
|
+
g = []
|
|
96
|
+
flow_sheets.each do |_name, sheet|
|
|
97
|
+
g << sheet
|
|
98
|
+
g << sheet.pattern_master
|
|
99
|
+
end
|
|
100
|
+
g << pattern_master if pattern_master
|
|
101
|
+
g << pattern_compiler unless referenced_subroutine_patterns.empty? && referenced_patterns.empty?
|
|
102
|
+
g
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Returns an array containing all flow sheet generators.
|
|
106
|
+
# All Origen program generators must implement this method
|
|
107
|
+
def flow_generators
|
|
108
|
+
g = []
|
|
109
|
+
flow_sheets.each do |_name, sheet|
|
|
110
|
+
g << sheet
|
|
111
|
+
end
|
|
112
|
+
g
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def custom_tmls
|
|
118
|
+
@custom_tmls ||= {}
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
module OrigenTesters
|
|
3
|
+
module SmartestBasedTester
|
|
4
|
+
class Base
|
|
5
|
+
class PatternCompiler
|
|
6
|
+
include OrigenTesters::Generator
|
|
7
|
+
|
|
8
|
+
attr_accessor :filename
|
|
9
|
+
|
|
10
|
+
def initialize(flow = nil)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def subroutines
|
|
14
|
+
Origen.interface.referenced_subroutine_patterns
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def patterns
|
|
18
|
+
Origen.interface.referenced_patterns
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
module OrigenTesters
|
|
3
|
+
module SmartestBasedTester
|
|
4
|
+
class Base
|
|
5
|
+
class PatternMaster
|
|
6
|
+
include OrigenTesters::Generator
|
|
7
|
+
|
|
8
|
+
attr_reader :flow, :paths
|
|
9
|
+
attr_accessor :filename
|
|
10
|
+
|
|
11
|
+
def initialize(flow = nil)
|
|
12
|
+
@flow = flow
|
|
13
|
+
@paths = {}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def filename
|
|
17
|
+
@filename || flow.filename.sub('.flow', '.pmfl')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def subdirectory
|
|
21
|
+
'vectors'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def add(name, options = {})
|
|
25
|
+
name, subdir = extract_subdir(name, options)
|
|
26
|
+
name += '.binl.gz' unless name =~ /binl.gz$/
|
|
27
|
+
Origen.interface.referenced_patterns << name
|
|
28
|
+
paths[subdir] ||= []
|
|
29
|
+
# Just add it, duplicates will be removed at render time
|
|
30
|
+
paths[subdir] << name unless paths[subdir].include?(name)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def extract_subdir(name, options = {})
|
|
36
|
+
p = Pathname.new(name.to_s)
|
|
37
|
+
name = p.basename.to_s
|
|
38
|
+
subdir = p.dirname.to_s
|
|
39
|
+
# if subdir == '.'
|
|
40
|
+
# # In future may support setting a default subdir via the interface
|
|
41
|
+
# end
|
|
42
|
+
[name, subdir]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestMethod
|
|
5
|
+
FORMAT_TYPES = [:current, :voltage, :time, :string, :integer]
|
|
6
|
+
|
|
7
|
+
# Returns the object representing the test method library that the
|
|
8
|
+
# given test method is defined in
|
|
9
|
+
attr_reader :library
|
|
10
|
+
attr_reader :type
|
|
11
|
+
attr_reader :id
|
|
12
|
+
alias_method :name, :id
|
|
13
|
+
# Returns an hash corresponding to the parameters that the given test method has.
|
|
14
|
+
# The keys are the parameter names and the values are the parameter type.
|
|
15
|
+
attr_reader :parameters
|
|
16
|
+
attr_accessor :class_name
|
|
17
|
+
attr_accessor :abs_class_name
|
|
18
|
+
|
|
19
|
+
def initialize(options)
|
|
20
|
+
@type = options[:type]
|
|
21
|
+
@library = options[:library]
|
|
22
|
+
@class_name = options[:methods].delete(:class_name)
|
|
23
|
+
@parameters = {}
|
|
24
|
+
# Add limits by default
|
|
25
|
+
define_singleton_method('limits') do
|
|
26
|
+
@limits
|
|
27
|
+
end
|
|
28
|
+
@limits = TestMethods::Limits.new(self)
|
|
29
|
+
# Add any methods
|
|
30
|
+
if options[:methods][:methods]
|
|
31
|
+
methods = options[:methods][:methods]
|
|
32
|
+
@finalize = methods.delete(:finalize)
|
|
33
|
+
methods.each do |method_name, function|
|
|
34
|
+
var_name = "@#{method_name}".gsub(/=|\?/, '_')
|
|
35
|
+
instance_variable_set(var_name, function)
|
|
36
|
+
define_singleton_method method_name do |*args|
|
|
37
|
+
instance_variable_get(var_name).call(self, *args)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
# Create attributes corresponding to the test method type represented
|
|
42
|
+
# by this method instance
|
|
43
|
+
options[:methods].each do |attr, type_default|
|
|
44
|
+
unless attr == :limits_type || attr == :aliases || attr == :methods
|
|
45
|
+
clean_attr = clean_attr_name(attr)
|
|
46
|
+
type = type_default[0]
|
|
47
|
+
default = type_default[1]
|
|
48
|
+
allowed = type_default[2]
|
|
49
|
+
@parameters[attr] = type
|
|
50
|
+
aliases = [clean_attr]
|
|
51
|
+
aliases << clean_attr.underscore if clean_attr.underscore != clean_attr
|
|
52
|
+
aliases.each do |alias_|
|
|
53
|
+
define_singleton_method("#{alias_}=") do |v|
|
|
54
|
+
if allowed
|
|
55
|
+
unless allowed.include?(v)
|
|
56
|
+
fail "Cannot set #{alias_} to #{v}, valid values are: #{allowed.join(', ')}"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
instance_variable_set("@#{clean_attr}", v)
|
|
60
|
+
end
|
|
61
|
+
define_singleton_method(alias_) do
|
|
62
|
+
instance_variable_get("@#{clean_attr}")
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
send("#{clean_attr}=", default)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
if options[:methods][:aliases]
|
|
69
|
+
options[:methods][:aliases].each do |alias_, attr|
|
|
70
|
+
clean_attr = clean_attr_name(attr)
|
|
71
|
+
define_singleton_method("#{alias_}=") do |v|
|
|
72
|
+
send("#{clean_attr}=", v)
|
|
73
|
+
end
|
|
74
|
+
define_singleton_method(alias_) do
|
|
75
|
+
send(clean_attr)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
# Finally set any initial values that have been supplied
|
|
80
|
+
options[:attrs].each do |k, v|
|
|
81
|
+
send("#{k}=", v) if respond_to?("#{k}=")
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def format(attr)
|
|
86
|
+
clean_attr = clean_attr_name(attr)
|
|
87
|
+
val = send(clean_attr)
|
|
88
|
+
if FORMAT_TYPES.include?(parameters[attr])
|
|
89
|
+
type = parameters[attr]
|
|
90
|
+
else
|
|
91
|
+
# The type is based on the value of another attribute
|
|
92
|
+
type = send(clean_attr_name(parameters[attr]))
|
|
93
|
+
end
|
|
94
|
+
case type
|
|
95
|
+
when :current, 'CURR'
|
|
96
|
+
"#{val}[A]"
|
|
97
|
+
when :voltage, 'VOLT'
|
|
98
|
+
"#{val}[V]"
|
|
99
|
+
when :time
|
|
100
|
+
"#{val}[s]"
|
|
101
|
+
when :frequency
|
|
102
|
+
"#{val}[Hz]"
|
|
103
|
+
when :string, :integer
|
|
104
|
+
val.to_s
|
|
105
|
+
else
|
|
106
|
+
fail "Unknown type for attribute #{attr}: #{type}"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def klass
|
|
111
|
+
@abs_class_name ||
|
|
112
|
+
"#{library.klass}.#{@class_name || type.to_s.camelize}"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def finalize
|
|
116
|
+
@finalize
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def method_missing(method, *args, &block)
|
|
120
|
+
if limits && limits.respond_to?(method)
|
|
121
|
+
limits.send(method, *args, &block)
|
|
122
|
+
else
|
|
123
|
+
super
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def respond_to?(method)
|
|
128
|
+
(limits && limits.respond_to?(method)) || super
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
private
|
|
132
|
+
|
|
133
|
+
def clean_attr_name(name)
|
|
134
|
+
name.to_s.gsub(/\.|-/, '_')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def id=(val)
|
|
138
|
+
@id = val
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestMethods
|
|
5
|
+
# Origen::Tester::Generator not included since test methods do not have their
|
|
6
|
+
# own top-level sheet, they will be incorporated within the flow sheet
|
|
7
|
+
|
|
8
|
+
require 'origen_testers/smartest_based_tester/base/test_methods/base_tml'
|
|
9
|
+
require 'origen_testers/smartest_based_tester/base/test_methods/limits'
|
|
10
|
+
autoload :AcTml, 'origen_testers/smartest_based_tester/base/test_methods/ac_tml'
|
|
11
|
+
autoload :DcTml, 'origen_testers/smartest_based_tester/base/test_methods/dc_tml'
|
|
12
|
+
autoload :CustomTml, 'origen_testers/smartest_based_tester/base/test_methods/custom_tml'
|
|
13
|
+
|
|
14
|
+
attr_accessor :flow, :collection
|
|
15
|
+
|
|
16
|
+
def initialize(flow)
|
|
17
|
+
@flow = flow
|
|
18
|
+
@collection = []
|
|
19
|
+
@ix = 0
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def filename
|
|
23
|
+
flow.filename
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add(test_method, options = {})
|
|
27
|
+
collection << test_method
|
|
28
|
+
test_method.send 'id=', "tm_#{collection.size}"
|
|
29
|
+
test_method
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def [](ix)
|
|
33
|
+
collection[ix]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns the AC test method library
|
|
37
|
+
def ac_tml
|
|
38
|
+
@ac_tml ||= AcTml.new(self)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns the DC test method library
|
|
42
|
+
def dc_tml
|
|
43
|
+
@dc_tml ||= DcTml.new(self)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Creates an accessor for custom test method libraries the first time they are called
|
|
47
|
+
def method_missing(method, *args, &block)
|
|
48
|
+
custom_tmls = Origen.interface.send(:custom_tmls)
|
|
49
|
+
if custom_tmls[method]
|
|
50
|
+
tml = CustomTml.new(self, custom_tmls[method])
|
|
51
|
+
instance_variable_set "@#{method}", tml
|
|
52
|
+
define_singleton_method method do
|
|
53
|
+
instance_variable_get("@#{method}")
|
|
54
|
+
end
|
|
55
|
+
send(method)
|
|
56
|
+
else
|
|
57
|
+
super
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def respond_to?(method)
|
|
62
|
+
!!Origen.interface.send(:custom_tmls)[method] || super
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def finalize
|
|
66
|
+
collection.each do |method|
|
|
67
|
+
method.finalize.call(method) if method.finalize
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class TestMethods
|
|
5
|
+
class AcTml < BaseTml
|
|
6
|
+
TEST_METHODS = {
|
|
7
|
+
frequency_by_digital_capture: {
|
|
8
|
+
class_name: 'Frequency_byDigitalCapture',
|
|
9
|
+
vector_variable_name: [:string, ''],
|
|
10
|
+
algorithm: [:string, 'FFT', %w(FFT LinearFit)],
|
|
11
|
+
sample_period: [:time, 0],
|
|
12
|
+
target_frequency: [:frequency, 0],
|
|
13
|
+
output: [:string, 'None', %w(None ReportUI ShowFailOnly)],
|
|
14
|
+
test_name: [:string, 'passFrequency_MHz']
|
|
15
|
+
},
|
|
16
|
+
functional_test: {
|
|
17
|
+
test_name: [:string, 'Functional'],
|
|
18
|
+
output: [:string, 'None', %w(None ReportUI ShowFailOnly)]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
def ac_test
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def klass
|
|
27
|
+
'ac_tml.AcTest'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|