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

#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

#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



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

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

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



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

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

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



85
86
87
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 85

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

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



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

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

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



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

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

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



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

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

Instance Method Details

#==(other_instance) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 71

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

#nameObject Also known as: test_name



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

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

#name=(val) ⇒ Object



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

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

#set_hi_limit(lim) ⇒ Object

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
167
168
169
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 161

def set_hi_limit(lim)
  if lim
    self.hi_lo_limit_valid = hi_lo_limit_valid | 2
    self.hi_limit = lim
  else
    self.hi_lo_limit_valid = hi_lo_limit_valid & 1
  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


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

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

  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

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.



173
174
175
176
177
178
179
180
181
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 173

def set_lo_limit(lim)
  if lim
    self.hi_lo_limit_valid = hi_lo_limit_valid | 1
    self.lo_limit = lim
  else
    self.hi_lo_limit_valid = hi_lo_limit_valid & 2
  end
  self
end

#set_measure_mode(mode) ⇒ Object

Set the meaure mode of a parametric test instance, either:

  • :voltage / :fimv

  • :current / :fvmi



304
305
306
307
308
309
310
311
312
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 304

def set_measure_mode(mode)
  if mode == :current || mode == :fvmi
    self.measure_mode = 0
  elsif mode == :voltage || mode == :fimv
    self.measure_mode = 1
  else
    fail "Unknown measure mode: #{mode}"
  end
end

#set_pre_charge(val) ⇒ Object Also known as: set_precharge

Set and enable the pre-charge voltage of a parametric test instance.



148
149
150
151
152
153
154
155
156
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 148

def set_pre_charge(val)
  if val
    self.pre_charge_enable = 1
    self.pre_charge = val
  else
    self.pre_charge_enable = 0
  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


280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 280

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)


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

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



110
111
112
113
114
115
116
117
118
119
120
# File 'lib/origen_testers/igxl_based_tester/base/test_instance.rb', line 110

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



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

def unversioned_name
  @test_name.to_s
end