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_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


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

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)

311
312
313
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 311

def fimv?
  measure_mode == 1
end

#fvmi?Boolean

Returns true if instance configured for force voltage, measure current

Returns:

  • (Boolean)

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

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


130
131
132
133
134
135
136
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 130

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

#name=(val) ⇒ Object


139
140
141
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 139

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.


157
158
159
160
161
162
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 157

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

202
203
204
205
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
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 202

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.


167
168
169
170
171
172
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 167

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

289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 289

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)

150
151
152
153
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 150

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


118
119
120
121
122
123
124
125
126
127
128
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 118

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


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

def unversioned_name
  @test_name.to_s
end