Class: OrigenTesters::IGXLBasedTester::Base::TestInstance

Inherits:
Object
  • Object
show all
Defined in:
lib/origen_testers/igxl_based_tester/base/test_instance.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, type, attrs = {}) ⇒ TestInstance

Returns a new instance of TestInstance.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 48

def initialize(name, type, attrs = {})
  @type = type
  @append_version = true
  self.name = name
  # Build the type specific accessors (aliases)
  self.class::TEST_INSTANCE_ALIASES[@type.to_sym].each do |_alias, val|
    define_singleton_method("#{_alias}=") do |v|
      send("#{val}=", v) if self.respond_to?("#{val}=", v)
    end
    define_singleton_method("#{_alias}") do
      send(val) if self.respond_to?(val)
    end
  end
  # Set the defaults
  self.class::TEST_INSTANCE_DEFAULTS[@type.to_sym].each do |k, v|
    send("#{k}=", v) if self.respond_to?("#{k}=", v)
  end
  # Then the values that have been supplied
  attrs.each do |k, v|
    send("#{k}=", v) if self.respond_to?("#{k}=", v)
  end
end

Instance Attribute Details

#append_versionObject

Returns the value of attribute append_version.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def append_version
  @append_version
end

#finalizeObject

Returns the value of attribute finalize.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def finalize
  @finalize
end

#indexObject

Returns the value of attribute index.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def index
  @index
end

#metaObject

Returns the value of attribute meta.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def meta
  @meta
end

#typeObject

Returns the value of attribute type.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def type
  @type
end

#versionObject

Returns the value of attribute version.



5
6
7
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 5

def version
  @version
end

Class Method Details

.attrsObject



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 36

def self.attrs
  @attrs ||= begin
    attrs = self::TEST_INSTANCE_ATTRS.dup

    self::TEST_INSTANCE_EXTRA_ARGS.times do |i|
      attrs << "arg#{i}"
    end
    attrs << 'comment'
    attrs
  end
end

.defineObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 7

def self.define
  # Generate accessors for all attributes and their aliases
  attrs.each do |attr|
    writer = "#{attr}=".to_sym
    reader = attr.to_sym
    attr_reader attr.to_sym unless method_defined? reader
    attr_writer attr.to_sym unless method_defined? writer
  end

  # Define the common aliases now, the instance type specific ones will
  # be created when the instance type is known
  self::TEST_INSTANCE_ALIASES.each do |_alias, val|
    writer = "#{_alias}=".to_sym
    reader = _alias.to_sym
    unless val.is_a? Hash
      unless method_defined? writer
        define_method("#{_alias}=") do |v|
          send("#{val}=", v)
        end
      end
      unless method_defined? reader
        define_method("#{_alias}") do
          send(val)
        end
      end
    end
  end
end

.new_apmu_powersupply(name, attrs = {}) ⇒ Object



105
106
107
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 105

def self.new_apmu_powersupply(name, attrs = {})
  new(name, :apmu_powersupply, attrs)
end

.new_board_pmu(name, attrs = {}) ⇒ Object



97
98
99
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 97

def self.new_board_pmu(name, attrs = {})
  new(name, :board_pmu, attrs)
end

.new_dcvi_powersupply(name, attrs = {}) ⇒ Object



113
114
115
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 113

def self.new_dcvi_powersupply(name, attrs = {})
  new(name, :dcvi_powersupply, attrs)
end

.new_empty(name, attrs = {}) ⇒ Object



89
90
91
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 89

def self.new_empty(name, attrs = {})
  new(name, :empty, attrs)
end

.new_functional(name, attrs = {}) ⇒ Object



93
94
95
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 93

def self.new_functional(name, attrs = {})
  new(name, :functional, attrs)
end

.new_mto_memory(name, attrs = {}) ⇒ Object



117
118
119
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 117

def self.new_mto_memory(name, attrs = {})
  new(name, :mto_memory, attrs)
end

.new_pin_pmu(name, attrs = {}) ⇒ Object



101
102
103
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 101

def self.new_pin_pmu(name, attrs = {})
  new(name, :pin_pmu, attrs)
end

.new_powersupply(name, attrs = {}) ⇒ Object



109
110
111
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 109

def self.new_powersupply(name, attrs = {})
  new(name, :powersupply, attrs)
end

Instance Method Details

#==(other_instance) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 75

def ==(other_instance)
  self.class == other_instance.class &&
    unversioned_name.to_s == other_instance.unversioned_name.to_s &&
    self.class.attrs.all? do |attr|
      # Exclude test name, already examined above and don't want to include
      # the version in the comparison
      if attr == 'test_name'
        true
      else
        send(attr) == other_instance.send(attr)
      end
    end
end

#fimv?Boolean

Returns true if instance configured for force current, measure voltage

Returns:

  • (Boolean)


315
316
317
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 315

def fimv?
  measure_mode == 1
end

#fvmi?Boolean

Returns true if instance configured for force voltage, measure current

Returns:

  • (Boolean)


320
321
322
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 320

def fvmi?
  measure_mode == 0
end

#inspectObject



71
72
73
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 71

def inspect
  "<TestInstance: #{name}, Type: #{type}>"
end

#nameObject Also known as: test_name



134
135
136
137
138
139
140
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 134

def name
  if version && @append_version
    "#{@test_name}_v#{version}"
  else
    @test_name.to_s
  end
end

#name=(val) ⇒ Object



143
144
145
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 143

def name=(val)
  self.test_name = val
end

#set_hi_limit(lim) ⇒ Object Also known as: hi_limit=

Set and enable the hi limit of a parametric test instance, passing in nil or false as the lim parameter will disable the hi limit.



161
162
163
164
165
166
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 161

def set_hi_limit(lim)
  if lim
    self.hi_limit = lim
  end
  self
end

#set_irange(r = nil, options = {}) ⇒ Object

Set the current range of the test instance, the following are valid:

Board PMU

  • 2uA

  • 20uA

  • 200uA

  • 2mA

  • 20mA

  • 200mA

  • :smart

Pin PMU

  • 200nA

  • 2uA

  • 20uA

  • 200uA

  • 2mA

  • :auto

  • :smart

Examples

instance.set_irange(:smart)
instance.set_irange(:ua => 2)
instance.set_irange(2.uA) # Same as above
instance.set_irange(:ma => 200)
instance.set_irange(0.2) # Same as above
instance.set_irange(:a => 0.2) # Same as above


206
207
208
209
210
211
212
213
214
215
216
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 206

def set_irange(r = nil, options = {})
  r, options = nil, r if r.is_a?(Hash)
  unless r
    if r = options.delete(:na) || options.delete(:nA)
      r = r / 1_000_000_000
    elsif r = options.delete(:ua) || options.delete(:uA)
      r = r / 1_000_000.0
    elsif r = options.delete(:ma) || options.delete(:mA)
      r = r / 1000.0
    elsif r = options.delete(:a) || options.delete(:A)
    else
      fail "Can't determine requested irange!"
    end
  end

  if @type == :board_pmu
    if r == :smart
      self.irange = 6
    else
      self.irange = case
        when r > 0.02 then 5
        when r > 0.002 then 4
        when r > 0.0002 then 3
        when r > 0.00002 then 2
        when r > 0.000002 then 1
        else 0
        end
    end

  elsif @type == :powersupply
    if r == :smart
      self.irange = 6
    elsif r == :auto
      self.irange = 5
    else
      self.irange = case
        when r > 0.25 then 4       # between 250mA - 1A
        when r > 0.1 then 7       # between 100mA - 250mA
        when r > 0.01 then 0     # between 10mA - 100mA
        when r > 0.0005 then 1    # between 500ua - 10mA
        when r > 0.00005 then 2   # between 50ua - 500u
        when r > 0.000005 then 3  # between 5u - 50u
        else 8
      end
    end

  else # :pin_pmu
    if r == :smart
      self.irange = 5
    elsif r == :auto
      fail 'Auto range not available in FIMV mode!' if self.fimv?
      self.irange = 6
    else
      if fimv?
        self.irange = case
          when r > 0.0002 then 2
          else 4
          end
      else
        self.irange = case
          when r > 0.0002 then 2
          when r > 0.00002 then 4
          when r > 0.000002 then 0
          when r > 0.0000002 then 1
          else 3
          end
      end
    end
  end

  self
end

#set_lo_limit(lim) ⇒ Object Also known as: lo_limit=

Set and enable the hi limit of a parametric test instance, passing in nil or false as the lim parameter will disable the hi limit.



171
172
173
174
175
176
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 171

def set_lo_limit(lim)
  if lim
    self.lo_limit = lim
  end
  self
end

#set_vrange(r = nil, options = {}) ⇒ Object

Set the voltage range of the test instance, the following are valid:

Board PMU

  • 2V

  • 5V

  • 10V

  • 24V

  • :auto

  • :smart

Examples

instance.set_vrange(:auto)
instance.set_vrange(:v => 5)
instance.set_vrange(5) # Same as above


293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 293

def set_vrange(r = nil, options = {})
  r, options = nil, r if r.is_a?(Hash)
  if r == :smart
    self.vrange = 4
  elsif r == :auto
    self.vrange = 5
  elsif !r
    if r = options.delete(:v) || options.delete(:V)
    else
      fail "Can't determine requested vrange!"
    end
  end
  self.vrange = case
    when r > 10 then 3
    when r > 5 then 2
    when r > 2 then 1
    else 0
    end
  self
end

#set_wait_flags(*flags) ⇒ Object

Set the cpu wait flags for the given test instance

instance.set_wait_flags(:a)
instance.set_wait_flags(:a, :c)


154
155
156
157
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 154

def set_wait_flags(*flags)
  # This method is tester-specific and must be overridden by the child class
  fail 'The #{self.class} class has not defined a set_wait_flags method!'
end

#to_s(override_name = nil) ⇒ Object

Returns the fully formatted test instance for insertion into an instance sheet



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 122

def to_s(override_name = nil)
  l = "\t"
  self.class.attrs.each do |attr|
    if attr == 'test_name' && override_name
      l += "#{override_name}\t"
    else
      l += "#{send(attr)}\t"
    end
  end
  "#{l}"
end

#unversioned_nameObject



147
148
149
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 147

def unversioned_name
  @test_name.to_s
end