Class: OrigenTesters::SmartestBasedTester::Base::TestMethod

Inherits:
Object
  • Object
show all
Defined in:
lib/origen_testers/smartest_based_tester/base/test_method.rb

Direct Known Subclasses

V93K::TestMethod

Constant Summary collapse

FORMAT_TYPES =
[:current, :voltage, :time, :string, :integer, :double, :boolean]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ TestMethod

Returns a new instance of TestMethod.


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 25

def initialize(options)
  @type = options[:type]
  @library = options[:library]
  @class_name = options[:methods].delete(:class_name)
  @parameters = {}
  @limits_id = options[:methods].delete(:limits_id) || options[:methods].delete(:limit_id)
  @limits = TestMethods::Limits.new(self)
  @limits.render = false if options[:methods].delete(:render_limits_in_tf) == false
  # Add any methods
  if options[:methods][:methods]
    methods = options[:methods][:methods]
    @finalize = methods[:finalize]
    methods.each do |method_name, function|
      unless method_name == :finalize
        var_name = "@#{method_name}".gsub(/=|\?/, '_')
        instance_variable_set(var_name, function)
        define_singleton_method method_name do |*args|
          instance_variable_get(var_name).call(self, *args)
        end
      end
    end
  end
  # Create attributes corresponding to the test method type represented
  # by this method instance
  options[:methods].each do |attr, type_default|
    unless attr == :limits_type || attr == :aliases || attr == :methods
      clean_attr = clean_attr_name(attr)
      type = type_default[0]
      default = type_default[1]
      allowed = type_default[2]
      @parameters[attr] = type
      aliases = [clean_attr]
      aliases << clean_attr.underscore if clean_attr.underscore != clean_attr
      aliases.each do |alias_|
        define_singleton_method("#{alias_}=") do |v|
          v = v.to_s if v.is_a?(Symbol)
          if allowed
            unless allowed.include?(v)
              fail "Cannot set #{alias_} to #{v}, valid values are: #{allowed.join(', ')}"
            end
          end
          instance_variable_set("@#{clean_attr}", v)
        end
        define_singleton_method(alias_) do
          instance_variable_get("@#{clean_attr}")
        end
      end
      send("#{clean_attr}=", default)
    end
  end
  if options[:methods][:aliases]
    options[:methods][:aliases].each do |alias_, attr|
      clean_attr = clean_attr_name(attr)
      define_singleton_method("#{alias_}=") do |v|
        send("#{clean_attr}=", v)
      end
      define_singleton_method(alias_) do
        send(clean_attr)
      end
    end
  end
  # Finally set any initial values that have been supplied
  options[:attrs].each do |k, v|
    accessor = "#{k}="
    if respond_to?(accessor)
      send(accessor, v)
    else
      accessor = "#{k.to_s.underscore}="
      send(accessor, v) if respond_to?(accessor)
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object


153
154
155
156
157
158
159
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 153

def method_missing(method, *args, &block)
  if limits && limits.respond_to?(method)
    limits.send(method, *args, &block)
  else
    super
  end
end

Instance Attribute Details

#abs_class_nameObject

Returns the value of attribute abs_class_name.


17
18
19
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 17

def abs_class_name
  @abs_class_name
end

#class_nameObject

Returns the value of attribute class_name.


16
17
18
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 16

def class_name
  @class_name
end

#idObject Also known as: name

Returns the value of attribute id.


11
12
13
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 11

def id
  @id
end

#libraryObject (readonly)

Returns the object representing the test method library that the given test method is defined in


9
10
11
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 9

def library
  @library
end

#limitsObject (readonly)

Returns the value of attribute limits.


18
19
20
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 18

def limits
  @limits
end

#limits_idObject Also known as: limit_id

Returns the value of attribute limits_id.


19
20
21
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 19

def limits_id
  @limits_id
end

#parametersObject (readonly)

Returns an hash corresponding to the parameters that the given test method has. The keys are the parameter names and the values are the parameter type.


15
16
17
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 15

def parameters
  @parameters
end

#sub_test_nameObject

Used to store the name of the primary test logged in SMT8


23
24
25
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 23

def sub_test_name
  @sub_test_name
end

#typeObject (readonly)

Returns the value of attribute type.


10
11
12
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 10

def type
  @type
end

Instance Method Details

#finalizeObject


149
150
151
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 149

def finalize
  @finalize
end

#format(attr) ⇒ Object


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 98

def format(attr)
  clean_attr = clean_attr_name(attr)
  val = send(clean_attr)
  if FORMAT_TYPES.include?(parameters[attr])
    type = parameters[attr]
  else
    # The type is based on the value of another attribute
    name = clean_attr_name(parameters[attr])
    if respond_to?(name)
      type = send(name)
    elsif respond_to?(name.sub(/b$/, ''))
      type = inverse_of(send(name.sub(/b$/, '')))
    else
      fail "Unknown attribute type: #{parameters[attr]}"
    end
  end
  case type
  when :current, 'CURR'
    "#{val}[A]"
  when :voltage, 'VOLT'
    "#{val}[V]"
  when :time
    "#{val}[s]"
  when :frequency
    "#{val}[Hz]"
  when :string
    val.to_s
  when :integer, :double
    val
  when :boolean
    # Check for valid values
    if [0, 1, true, false].include?(val)
      # Use true/false for smt8 and 0/1 for smt7
      if [1, true].include?(val)
        tester.smt8? ? true : 1
      else
        tester.smt8? ? false : 0
      end
    else
      fail "Unknown boolean value for attribute #{attr}: #{val}"
    end
  else
    fail "Unknown type for attribute #{attr}: #{type}"
  end
end

#klassObject


144
145
146
147
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 144

def klass
  @abs_class_name ||
    "#{library.klass}.#{@class_name || type.to_s.camelize}"
end

#respond_to?(method) ⇒ Boolean

Returns:

  • (Boolean)

161
162
163
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 161

def respond_to?(method)
  (limits && limits.respond_to?(method)) || super
end

#sorted_parametersObject


165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/origen_testers/smartest_based_tester/base/test_method.rb', line 165

def sorted_parameters
  @parameters.sort_by do |name|
    if name.is_a?(String)
      name
    else
      if name.to_s[0] == '_'
        name.to_s.camelize(:upper)
      else
        name.to_s.camelize(:lower)
      end
    end
  end
end