Module: OrigenTesters::Interface
- Extended by:
- ActiveSupport::Concern
- Includes:
- ATP::FlowAPI
- Included in:
- ProgramGenerators
- Defined in:
- lib/origen_testers/interface.rb
Overview
Include this module in any class you define as a test interface
Defined Under Namespace
Modules: ClassMethods Classes: PatternArray
Class Method Summary collapse
Instance Method Summary collapse
- #add_description!(options) ⇒ Object
-
#add_flow_enable ⇒ Object
Returns whether the tester has been configured to wrap top-level flow modules with an enable or not.
-
#add_flow_enable=(value) ⇒ Object
Set to :enabled to have the current flow wrapped by an enable flow variable that is enabled by default (top-level flow has to disable modules it doesn’t want).
- #add_meta!(options) ⇒ Object
- #all_pattern_references ⇒ Object
-
#app_identifier ⇒ Object
This identifier will be used to make labels and other references unique to the current application.
-
#atp ⇒ Object
Returns the abstract test program model for the current flow.
-
#clean_referenced_patterns ⇒ Object
Remove duplicates and file extensions from the referenced pattern lists.
- #clear_pattern_references ⇒ Object private
- #clear_top_level_flow ⇒ Object
- #close(options = {}) ⇒ Object
-
#comment(text) ⇒ Object
Add a comment line into the buffer.
- #comments ⇒ Object
-
#compile(file, options = {}) ⇒ Object
Compile a template file.
-
#consume_comments ⇒ Object
Returns the buffered description comments and clears the buffer.
-
#context_changed?(options = {}) ⇒ Boolean
Returns true if the test flow context (as supplied in the given options) has changed vs.
-
#context_or_parameter_changed?(*params) ⇒ Boolean
Convenience method, equivalent of calling (context_changed? || parameter_changed?).
-
#descriptions ⇒ Object
A storage Hash that all generators can push comment descriptions into when generating.
- #discard_comments ⇒ Object
- #discard_top_level_flow ⇒ Object
- #flow_generator ⇒ Object
- #generating_sub_program? ⇒ Boolean
-
#identity_map ⇒ Object
:nodoc:.
- #import(file, options = {}) ⇒ Object
- #merge_pattern_references(references) ⇒ Object private
- #on_program_completion(options = {}) ⇒ Object
-
#parameter_changed?(*params) ⇒ Boolean
Returns true if the value of the given parameter within the given options is different vs.
- #pattern_references(name = pattern_references_name) ⇒ Object
- #pattern_references_name ⇒ Object
- #pattern_references_name=(name) ⇒ Object
- #platform ⇒ Object
-
#record_pattern_reference(name, options = {}) ⇒ Object
A secondary pattern is one where the pattern has been created by Origen as an output from generating another pattern (a primary pattern).
-
#referenced_patterns ⇒ Object
deprecated
Deprecated.
Use record_pattern_reference instead
- #render(file, options = {}) ⇒ Object
-
#resources_mode ⇒ Object
(also: #with_resources_mode)
Any tests generated within the given block will be generated in resources mode.
- #resources_mode? ⇒ Boolean
- #set_top_level_flow ⇒ Object
- #test(name, options = {}) ⇒ Object
- #top_level_flow ⇒ Object (also: #top_level_flow_filename)
-
#unique_test_names ⇒ Object
Returns the value defined on if/how to make test names unique within a flow.
-
#unique_test_names=(val) ⇒ Object
Set the value of unique_test_names.
- #write? ⇒ Boolean
- #write_files(options = {}) ⇒ Object
Methods included from ATP::FlowAPI
#atp=, #hi_limit, #limit, #lo_limit, #loop
Class Method Details
.resources_mode? ⇒ Boolean
33 34 35 |
# File 'lib/origen_testers/interface.rb', line 33 def self.resources_mode? !!@resources_mode end |
.with_resources_mode ⇒ Object
26 27 28 29 30 31 |
# File 'lib/origen_testers/interface.rb', line 26 def self.with_resources_mode orig = @resources_mode @resources_mode = true yield @resources_mode = orig end |
.write=(val) ⇒ Object
37 38 39 |
# File 'lib/origen_testers/interface.rb', line 37 def self.write=(val) @write = val end |
.write? ⇒ Boolean
41 42 43 |
# File 'lib/origen_testers/interface.rb', line 41 def self.write? !!@write end |
Instance Method Details
#add_description!(options) ⇒ Object
184 185 186 |
# File 'lib/origen_testers/interface.rb', line 184 def add_description!() flow.send(:add_description!, ) end |
#add_flow_enable ⇒ Object
Returns whether the tester has been configured to wrap top-level flow modules with an enable or not.
Returns nil if not.
Returns :enabled if the enable is configured to be on by default, or :disabled if it is configured to be off by default.
107 108 109 |
# File 'lib/origen_testers/interface.rb', line 107 def add_flow_enable @add_flow_enable end |
#add_flow_enable=(value) ⇒ Object
Set to :enabled to have the current flow wrapped by an enable flow variable that is enabled by default (top-level flow has to disable modules it doesn’t want).
Set to :disabled to have the opposite, where the top-level flow has to enable all modules.
Set to nil to have no wrapping. While this is the default, setting this to nil will override any setting of the attribute of the same name that has been set at tester-level by the target.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/origen_testers/interface.rb', line 120 def add_flow_enable=(value) return unless flow.respond_to?(:add_flow_enable=) if value if value == :enable || value == :enabled flow.add_flow_enable = :enabled elsif value == :disable || value == :disabled flow.add_flow_enable = :disabled else fail "Unknown add_flow_enable value, #{value}, must be :enabled or :disabled" end else flow.add_flow_enable = nil end end |
#add_meta!(options) ⇒ Object
180 181 182 |
# File 'lib/origen_testers/interface.rb', line 180 def () flow.send(:add_meta!, ) end |
#all_pattern_references ⇒ Object
277 278 279 280 |
# File 'lib/origen_testers/interface.rb', line 277 def all_pattern_references pattern_references @@pattern_references end |
#app_identifier ⇒ Object
This identifier will be used to make labels and other references unique to the current application. This will help to avoid name duplication if a program is comprised of many modules generated by Origen.
Override in the application interface to customize, by default the identifier will be Origen.config.initials
141 142 143 |
# File 'lib/origen_testers/interface.rb', line 141 def app_identifier Origen.config.initials || 'Anon App' end |
#atp ⇒ Object
Returns the abstract test program model for the current flow
54 55 56 |
# File 'lib/origen_testers/interface.rb', line 54 def atp flow.model end |
#clean_referenced_patterns ⇒ Object
Remove duplicates and file extensions from the referenced pattern lists
305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/origen_testers/interface.rb', line 305 def clean_referenced_patterns refs = [:referenced_patterns] # refs << :referenced_subroutine_patterns if Origen.tester.v93k? refs.each do |ref| var = send(ref) var = var.uniq.map do |pat| pat = pat.sub(/\..*/, '') pat unless pat =~ /_part\d+$/ end.uniq.compact singleton_class.class_variable_set("@@#{ref}", var) end end |
#clear_pattern_references ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
250 251 252 |
# File 'lib/origen_testers/interface.rb', line 250 def clear_pattern_references @@pattern_references = nil end |
#clear_top_level_flow ⇒ Object
355 356 357 |
# File 'lib/origen_testers/interface.rb', line 355 def clear_top_level_flow @@top_level_flow = nil end |
#close(options = {}) ⇒ Object
145 146 147 148 149 |
# File 'lib/origen_testers/interface.rb', line 145 def close( = {}) sheet_generators.each do |generator| generator.close() end end |
#comment(text) ⇒ Object
Add a comment line into the buffer
319 320 321 |
# File 'lib/origen_testers/interface.rb', line 319 def comment(text) comments << text end |
#comments ⇒ Object
323 324 325 |
# File 'lib/origen_testers/interface.rb', line 323 def comments @@comments ||= [] end |
#compile(file, options = {}) ⇒ Object
Compile a template file
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/origen_testers/interface.rb', line 152 def compile(file, = {}) return unless write? # Any options passed in from an interface will be passed to the compiler and to # the templates being compiled [:initial_options] = Origen.file_handler.preserve_state do begin file = Origen.file_handler.clean_path_to_template(file) Origen.generator.compile_file_or_directory(file, ) rescue file = Origen.file_handler.clean_path_to(file) Origen.generator.compile_file_or_directory(file, ) end end end |
#consume_comments ⇒ Object
Returns the buffered description comments and clears the buffer
332 333 334 335 336 |
# File 'lib/origen_testers/interface.rb', line 332 def consume_comments c = comments discard_comments c end |
#context_changed?(options = {}) ⇒ Boolean
Returns true if the test flow context (as supplied in the given options) has changed vs. that applied to the previous test. Flow context means enabled words, job, if_failed/passed, etc.
65 66 67 |
# File 'lib/origen_testers/interface.rb', line 65 def context_changed?( = {}) flow.context_changed?() end |
#context_or_parameter_changed?(*params) ⇒ Boolean
Convenience method, equivalent of calling (context_changed? || parameter_changed?)
85 86 87 88 |
# File 'lib/origen_testers/interface.rb', line 85 def context_or_parameter_changed?(*params) = params.last.is_a?(Hash) ? params.pop : {} context_changed?() || parameter_changed?(*params, ) end |
#descriptions ⇒ Object
A storage Hash that all generators can push comment descriptions into when generating. At the end of a generation run this will contain all descriptions for all flows that were just created.
Access via Origen.interface.descriptions
365 366 367 |
# File 'lib/origen_testers/interface.rb', line 365 def descriptions @@descriptions ||= Parser::DescriptionLookup.new end |
#discard_comments ⇒ Object
327 328 329 |
# File 'lib/origen_testers/interface.rb', line 327 def discard_comments @@comments = nil end |
#discard_top_level_flow ⇒ Object
343 344 345 |
# File 'lib/origen_testers/interface.rb', line 343 def discard_top_level_flow @@top_level_flow = nil end |
#flow_generator ⇒ Object
347 348 349 |
# File 'lib/origen_testers/interface.rb', line 347 def flow_generator flow end |
#generating_sub_program? ⇒ Boolean
49 50 51 |
# File 'lib/origen_testers/interface.rb', line 49 def (defined? @@generating_sub_program) ? @@generating_sub_program : false end |
#identity_map ⇒ Object
:nodoc:
383 384 385 |
# File 'lib/origen_testers/interface.rb', line 383 def identity_map # :nodoc: @@identity_map ||= ::OrigenTesters::Generator::IdentityMap.new end |
#import(file, options = {}) ⇒ Object
168 169 170 171 172 173 174 |
# File 'lib/origen_testers/interface.rb', line 168 def import(file, = {}) # Attach the import request to the first generator, when it imports # it any generated resources will automatically find their way to the # correct generator/collection generator = flow || sheet_generators.first generator.import(file, ) end |
#merge_pattern_references(references) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
255 256 257 258 259 |
# File 'lib/origen_testers/interface.rb', line 255 def merge_pattern_references(references) references.each do |name, values| pattern_references(name)[:main][:all].push(*values[:main][:all]) end end |
#on_program_completion(options = {}) ⇒ Object
199 200 201 202 203 |
# File 'lib/origen_testers/interface.rb', line 199 def on_program_completion( = {}) reset_globals @@pattern_references = {} @@referenced_patterns = nil end |
#parameter_changed?(*params) ⇒ Boolean
Returns true if the value of the given parameter within the given options is different vs. the last test
if parameter_changed?(:vdd, :vddc, )
# execute code if the vdd level has changed
end
74 75 76 77 78 79 80 81 82 |
# File 'lib/origen_testers/interface.rb', line 74 def parameter_changed?(*params) = params.last.is_a?(Hash) ? params.pop : {} last = flow.instance_variable_get(:@_last_parameters_) if last params.any? { |p| [p] != last[p] } else false end end |
#pattern_references(name = pattern_references_name) ⇒ Object
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
# File 'lib/origen_testers/interface.rb', line 261 def pattern_references(name = pattern_references_name) @@pattern_references ||= {} @@pattern_references[name] ||= { main: { all: [], origen: [], ate: [] }, subroutine: { all: [], origen: [], ate: [] } } end |
#pattern_references_name ⇒ Object
286 287 288 |
# File 'lib/origen_testers/interface.rb', line 286 def pattern_references_name @pattern_references_name || 'global' end |
#pattern_references_name=(name) ⇒ Object
282 283 284 |
# File 'lib/origen_testers/interface.rb', line 282 def pattern_references_name=(name) @pattern_references_name = name end |
#platform ⇒ Object
387 388 389 390 391 392 393 394 395 |
# File 'lib/origen_testers/interface.rb', line 387 def platform # This branch to support the ProgramGenerators module where the generator # is included into an interface instance and not the class if singleton_class.const_defined? :PLATFORM singleton_class::PLATFORM else self.class::PLATFORM end end |
#record_pattern_reference(name, options = {}) ⇒ Object
A secondary pattern is one where the pattern has been created by Origen as an output from generating another pattern (a primary pattern). For example, on V93K anytime a tester handshake is done, the pattern will be split into separate components, such as meas_bgap.avc (the primary pattern) and meas_bgap_part1.avc (a secondary pattern).
Any such secondary pattern references should be pushed to this array, rather than the referenced_patterns array. By using the dedicated secondary array, the pattern will not appear in the referenced.list file so that Origen is not asked to generate it (since it will be created naturally from the primary pattern reference). However if the ATE requires a reference to the pattern (e.g. the V93K pattern master file), then it will be included in the relevant ATE files.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/origen_testers/interface.rb', line 217 def record_pattern_reference(name, = {}) if name.is_a?(String) || name.is_a?(Symbol) name = name.to_s else fail "Pattern name must be a string or a symbol, not a #{name.class}" end # Help out the user and force any multi-part patterns to :ate type unless [:type] if name.sub(/\..*/, '') =~ /part\d+$/ [:type] = :ate end end unless [:type] == :origen # Inform the current generator that it has a new pattern reference to handle if respond_to?(:pattern_reference_recorded) pattern_reference_recorded(name, ) end end base = [:subroutine] ? pattern_references[:subroutine] : pattern_references[:main] case [:type] when :origen base[:origen] << name when :ate base[:ate] << name when nil base[:all] << name else fail "Unknown pattern reference type, #{[:type]}, valid values are :origen or :ate" end nil end |
#referenced_patterns ⇒ Object
Use record_pattern_reference instead
All generators should push to this array whenever they reference a pattern so that it is captured in the pattern list, e.g.
Origen.interface.referenced_patterns << pattern
If the ATE platform also has a pattern list, e.g. the pattern master file on V93K, then this will also be updated. Duplicates will be automatically eliminated, so no duplicate checking should be performed on the application side.
300 301 302 |
# File 'lib/origen_testers/interface.rb', line 300 def referenced_patterns @@referenced_patterns ||= PatternArray.new end |
#render(file, options = {}) ⇒ Object
176 177 178 |
# File 'lib/origen_testers/interface.rb', line 176 def render(file, = {}) flow.render(file, ) end |
#resources_mode ⇒ Object Also known as: with_resources_mode
Any tests generated within the given block will be generated in resources mode. Generally this means that all resources for a given test will be generated but flow entries will be inhibited.
372 373 374 375 376 |
# File 'lib/origen_testers/interface.rb', line 372 def resources_mode OrigenTesters::Interface.with_resources_mode do yield end end |
#resources_mode? ⇒ Boolean
379 380 381 |
# File 'lib/origen_testers/interface.rb', line 379 def resources_mode? OrigenTesters::Interface.resources_mode? end |
#set_top_level_flow ⇒ Object
351 352 353 |
# File 'lib/origen_testers/interface.rb', line 351 def set_top_level_flow @@top_level_flow = flow_generator.output_file end |
#test(name, options = {}) ⇒ Object
45 46 47 |
# File 'lib/origen_testers/interface.rb', line 45 def test(name, = {}) flow.test(name, ) end |
#top_level_flow ⇒ Object Also known as: top_level_flow_filename
338 339 340 |
# File 'lib/origen_testers/interface.rb', line 338 def top_level_flow @@top_level_flow ||= nil end |
#unique_test_names ⇒ Object
Returns the value defined on if/how to make test names unique within a flow
91 92 93 |
# File 'lib/origen_testers/interface.rb', line 91 def unique_test_names @unique_test_names end |
#unique_test_names=(val) ⇒ Object
Set the value of unique_test_names
96 97 98 |
# File 'lib/origen_testers/interface.rb', line 96 def unique_test_names=(val) @unique_test_names = val end |
#write? ⇒ Boolean
58 59 60 |
# File 'lib/origen_testers/interface.rb', line 58 def write? OrigenTesters::Interface.write? end |
#write_files(options = {}) ⇒ Object
188 189 190 191 192 193 194 195 196 197 |
# File 'lib/origen_testers/interface.rb', line 188 def write_files( = {}) sheet_generators.each do |generator| generator.finalize() end sheet_generators.each do |generator| generator.write_to_file() if generator.to_be_written? end clean_referenced_patterns flow.save_program end |