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

Methods included from ATP::FlowAPI

#atp=, #hi_limit, #limit, #lo_limit, #loop

Class Method Details

.resources_mode?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/origen_testers/interface.rb', line 33

def self.resources_mode?
  !!@resources_mode
end

.with_resources_modeObject



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

Returns:

  • (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!(options)
  flow.send(:add_description!, options)
end

#add_flow_enableObject

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 add_meta!(options)
  flow.send(:add_meta!, options)
end

#all_pattern_referencesObject



277
278
279
280
# File 'lib/origen_testers/interface.rb', line 277

def all_pattern_references
  pattern_references
  @@pattern_references
end

#app_identifierObject

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

#atpObject

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_patternsObject

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_referencesObject

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_flowObject



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(options = {})
  sheet_generators.each do |generator|
    generator.close(options)
  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

#commentsObject



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, options = {})
  return unless write?
  # Any options passed in from an interface will be passed to the compiler and to
  # the templates being compiled
  options[:initial_options] = options
  Origen.file_handler.preserve_state do
    begin
      file = Origen.file_handler.clean_path_to_template(file)
      Origen.generator.compile_file_or_directory(file, options)
    rescue
      file = Origen.file_handler.clean_path_to(file)
      Origen.generator.compile_file_or_directory(file, options)
    end
  end
end

#consume_commentsObject

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.

Returns:

  • (Boolean)


65
66
67
# File 'lib/origen_testers/interface.rb', line 65

def context_changed?(options = {})
  flow.context_changed?(options)
end

#context_or_parameter_changed?(*params) ⇒ Boolean

Convenience method, equivalent of calling (context_changed? || parameter_changed?)

Returns:

  • (Boolean)


85
86
87
88
# File 'lib/origen_testers/interface.rb', line 85

def context_or_parameter_changed?(*params)
  options = params.last.is_a?(Hash) ? params.pop : {}
  context_changed?(options) || parameter_changed?(*params, options)
end

#descriptionsObject

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_commentsObject



327
328
329
# File 'lib/origen_testers/interface.rb', line 327

def discard_comments
  @@comments = nil
end

#discard_top_level_flowObject



343
344
345
# File 'lib/origen_testers/interface.rb', line 343

def discard_top_level_flow
  @@top_level_flow = nil
end

#flow_generatorObject



347
348
349
# File 'lib/origen_testers/interface.rb', line 347

def flow_generator
  flow
end

#generating_sub_program?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/origen_testers/interface.rb', line 49

def generating_sub_program?
  (defined? @@generating_sub_program) ? @@generating_sub_program : false
end

#identity_mapObject

: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, options = {})
  # 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, options)
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(options = {})
  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, options)
  # execute code if the vdd level has changed
end

Returns:

  • (Boolean)


74
75
76
77
78
79
80
81
82
# File 'lib/origen_testers/interface.rb', line 74

def parameter_changed?(*params)
  options = params.last.is_a?(Hash) ? params.pop : {}
  last = flow.instance_variable_get(:@_last_parameters_)
  if last
    params.any? { |p| options[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_nameObject



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

#platformObject



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, options = {})
  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 options[:type]
    if name.sub(/\..*/, '') =~ /part\d+$/
      options[:type] = :ate
    end
  end
  unless options[: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, options)
    end
  end
  base = options[:subroutine] ? pattern_references[:subroutine] : pattern_references[:main]
  case options[:type]
  when :origen
    base[:origen] << name
  when :ate
    base[:ate] << name
  when nil
    base[:all] << name
  else
    fail "Unknown pattern reference type, #{options[:type]}, valid values are :origen or :ate"
  end
  nil
end

#referenced_patternsObject

Deprecated.

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, options = {})
  flow.render(file, options)
end

#resources_modeObject 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

Returns:

  • (Boolean)


379
380
381
# File 'lib/origen_testers/interface.rb', line 379

def resources_mode?
  OrigenTesters::Interface.resources_mode?
end

#set_top_level_flowObject



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, options = {})
  flow.test(name, options)
end

#top_level_flowObject 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_namesObject

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

Returns:

  • (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(options = {})
  sheet_generators.each do |generator|
    generator.finalize(options)
  end
  sheet_generators.each do |generator|
    generator.write_to_file(options) if generator.to_be_written?
  end
  clean_referenced_patterns
  flow.save_program
end