origen_testers 0.5.7 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/config/shared_commands.rb +6 -0
  3. data/config/version.rb +2 -2
  4. data/lib/commands/run.rb +44 -0
  5. data/lib/origen_testers.rb +19 -1
  6. data/lib/origen_testers/flow.rb +382 -0
  7. data/lib/origen_testers/generator.rb +32 -29
  8. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
  9. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
  10. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
  11. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
  12. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
  13. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
  14. data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
  15. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
  16. data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
  17. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
  18. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
  19. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
  20. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
  21. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
  22. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
  23. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
  24. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
  25. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
  26. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
  27. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
  28. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
  29. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
  30. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
  31. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
  32. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
  33. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
  34. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
  35. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
  36. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
  37. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
  39. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
  40. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
  41. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
  42. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
  43. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
  44. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
  45. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
  46. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
  47. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
  48. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
  49. data/lib/origen_testers/interface.rb +41 -6
  50. data/lib/origen_testers/no_interface.rb +7 -0
  51. data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
  52. data/lib/origen_testers/origen_ext/generator.rb +37 -0
  53. data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
  54. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
  55. data/lib/origen_testers/program_generators.rb +0 -1
  56. data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
  57. data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
  58. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
  59. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
  60. data/lib/origen_testers/test/dut.rb +5 -0
  61. data/lib/origen_testers/test/j750_base_interface.rb +0 -3
  62. data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
  63. data/lib/origen_testers/test/v93k_interface.rb +5 -23
  64. data/program/components/_temp.rb +6 -0
  65. data/program/flow_control.rb +190 -62
  66. data/program/prb1.rb +13 -50
  67. data/program/prb2.rb +0 -16
  68. data/program/test.rb +12 -3
  69. data/program/uflex_resources.rb +159 -0
  70. metadata +66 -16
  71. data/lib/origen_testers/doc.rb +0 -224
  72. data/lib/origen_testers/doc/generator.rb +0 -124
  73. data/lib/origen_testers/doc/generator/flow.rb +0 -69
  74. data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
  75. data/lib/origen_testers/doc/generator/test.rb +0 -66
  76. data/lib/origen_testers/doc/generator/test_group.rb +0 -64
  77. data/lib/origen_testers/doc/generator/tests.rb +0 -45
  78. data/lib/origen_testers/doc/model.rb +0 -160
  79. data/lib/origen_testers/generator/flow_control_api.rb +0 -611
  80. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
  81. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +0 -9
@@ -0,0 +1,39 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class SupplyLevel
5
+ attr_accessor :vmain, :valt # Supply level information
6
+ attr_accessor :ifold # Clamp current information
7
+ attr_accessor :delay # Supply power-up delay
8
+
9
+ def initialize(options = {}) # :nodoc:
10
+ options = {
11
+ vmain: 1.8, # Main supply voltage
12
+ valt: 1.8, # Alternate supply voltage
13
+ ifold: 1, # Supply clamp current
14
+ delay: 0 # Supply power-up delay
15
+ }.merge(options)
16
+ @vmain = options[:vmain]
17
+ @valt = options[:valt]
18
+ @ifold = options[:ifold]
19
+ @delay = options[:delay]
20
+ end
21
+
22
+ def ==(level)
23
+ if level.is_a? PinLevelSingle
24
+ vmain == level.vmain &&
25
+ valt == level.valt &&
26
+ ifold == level.ifold &&
27
+ delay == level.delay
28
+ else
29
+ super
30
+ end
31
+ end
32
+
33
+ def platform
34
+ Origen.interface.platform
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Levels
5
+ include ::OrigenTesters::Generator
6
+
7
+ # If levels are defined for a power group then this will return the level object
8
+ attr_accessor :pwr_group
9
+ # If levels are defined for a pin group then this will return the level object
10
+ attr_accessor :pin_group
11
+
12
+ def initialize(options = {}) # :nodoc:
13
+ @pwr_group = Hash.new { |h, k| h[k] = {} }
14
+ @pin_group = Hash.new { |h, k| h[k] = {} }
15
+ end
16
+
17
+ # Defines a new Power Level category for the given pin/group
18
+ def add_power_level(cat, options = {})
19
+ cat = cat.to_sym unless cat.is_a? Symbol
20
+ pwr_group[cat] = platform::SupplyLevel.new(options)
21
+ end
22
+
23
+ # Defines a new Single-Ended Pin Level category for the given pin/group
24
+ def add_se_pin_level(cat, options = {})
25
+ cat = cat.to_sym unless cat.is_a? Symbol
26
+ pin_group[cat] = platform::PinLevelSingle.new(options)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,109 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Levelset
5
+ include ::OrigenTesters::Generator
6
+
7
+ attr_accessor :pins
8
+ attr_accessor :spec_sheet
9
+ attr_accessor :ls_sheet_pins
10
+
11
+ # Levelset name
12
+ attr_accessor :name
13
+
14
+ OUTPUT_PREFIX = 'LV'
15
+ # OUTPUT_POSTFIX = 'LV'
16
+
17
+ def initialize(options = {}) # :nodoc:
18
+ @pins = {}
19
+ end
20
+
21
+ # rubocop:disable Metrics/ParameterLists
22
+
23
+ # Adds a pin level to the given levelset
24
+ def add(lsname, pin, level, options = {})
25
+ options = {
26
+ spec_sheet: 'default' # defines which specset sheet to put variables in (e.g. func, scan) when generating specset files
27
+ }.merge(options)
28
+ lsname = lsname.to_sym unless lsname.is_a? Symbol
29
+ pin = pin.to_sym unless pin.is_a? Symbol
30
+
31
+ add_level(pin, level)
32
+ @name = lsname
33
+ @spec_sheet = options[:spec_sheet]
34
+ @ls_sheet_pins = options[:ls_sheet_pins] unless @ls_sheet_pins
35
+ end
36
+
37
+ # Assigns a level object to the given pin for this levelset
38
+ def add_level(pin, level)
39
+ if @pins.key?(pin)
40
+ Origen.log.error "Pin #{pin} already exists in levelset"
41
+ else
42
+ @pins[pin] = level
43
+ end
44
+ end
45
+
46
+ def finalize(options = {})
47
+ end
48
+
49
+ # Populate an array of pins based on the pin or pingroup
50
+ def get_pin_objects(grp)
51
+ pins = []
52
+ if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
53
+ Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
54
+ pins << Origen.top_level.pin(grp)
55
+ elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
56
+ Origen.top_level.pin(grp).each do |pin|
57
+ pins << pin
58
+ end
59
+ else
60
+ Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
61
+ end
62
+ pins
63
+ end
64
+
65
+ # Equality check to compare full contents of 2 level objects
66
+ def levels_eql?(level1, level2)
67
+ level1 == level2
68
+ end
69
+
70
+ # Globally modify text within the level object
71
+ def gsub_levels!(level, old_val, new_val)
72
+ # determine if object is a power level (conatins :vmain) or a SE pin level (:vil)
73
+ if level.respond_to?(:vmain)
74
+ level.vmain = level.vmain.gsub(/#{Regexp.escape(old_val)}/, new_val)
75
+ level.valt = level.valt.gsub(/#{Regexp.escape(old_val)}/, new_val)
76
+ level.ifold = level.ifold.gsub(/#{Regexp.escape(old_val)}/, new_val)
77
+ # level.delay = level.delay.gsub(/#{Regexp.escape(old_val)}/, new_val)
78
+ elsif level.respond_to?(:vil)
79
+ level.vil = level.vil.gsub(/#{Regexp.escape(old_val)}/, new_val)
80
+ level.vih = level.vih.gsub(/#{Regexp.escape(old_val)}/, new_val)
81
+ level.vol = level.vol.gsub(/#{Regexp.escape(old_val)}/, new_val)
82
+ level.voh = level.voh.gsub(/#{Regexp.escape(old_val)}/, new_val)
83
+ level.vcl = level.vcl.gsub(/#{Regexp.escape(old_val)}/, new_val)
84
+ level.vch = level.vch.gsub(/#{Regexp.escape(old_val)}/, new_val)
85
+ level.vt = level.vt.gsub(/#{Regexp.escape(old_val)}/, new_val)
86
+ level.voutlotyp = level.voutlotyp.gsub(/#{Regexp.escape(old_val)}/, new_val)
87
+ level.vouthityp = level.vouthityp.gsub(/#{Regexp.escape(old_val)}/, new_val)
88
+ level.dmode = level.dmode.gsub(/#{Regexp.escape(old_val)}/, new_val)
89
+ end
90
+ end
91
+
92
+ def format_uflex_level(data, options = {})
93
+ options = {
94
+ }.merge(options)
95
+
96
+ if data !~ /^\s*$/
97
+ data = data.gsub(/^/, '=')
98
+ end
99
+ data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
100
+ data = data.gsub(/(\*\s*)_([kmun]{0,1}[AVs]{1})/, '\1\2')
101
+ end
102
+
103
+ def platform
104
+ Origen.interface.platform
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,93 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Pinmap
5
+ include ::OrigenTesters::Generator
6
+
7
+ attr_accessor :pins
8
+ attr_accessor :pin_groups
9
+ attr_accessor :power_pins
10
+ attr_accessor :utility_pins
11
+
12
+ PIN_TYPES = ['I/O', 'I', 'O']
13
+ PWR_TYPES = ['Power']
14
+ UTL_TYPES = ['Utility', 'I/O', 'I', 'O']
15
+
16
+ def initialize # :nodoc:
17
+ @pins = {}
18
+ @pin_groups = Hash.new { |h, k| h[k] = {} }
19
+ @power_pins = {}
20
+ @utility_pins = {}
21
+ end
22
+
23
+ def add_pin(pin_name, attrs = {})
24
+ attrs = {
25
+ type: 'I/O',
26
+ comment: ''
27
+ }.merge(attrs)
28
+ pin_name = pin_name.to_sym unless pin_name.is_a? Symbol
29
+ if PIN_TYPES.include? attrs[:type]
30
+ type = attrs[:type]
31
+ else
32
+ Origen.log.error "Pinmap individual pin type '#{attrs[:type]}' must be set to one of the following: #{PIN_TYPES.join(', ')} for pin '#{pin_name}'"
33
+ fail
34
+ end
35
+ @pins[pin_name] = { type: type, comment: attrs[:comment] }
36
+ end
37
+
38
+ def add_group_pin(grp_name, pin_name, attrs = {})
39
+ attrs = {
40
+ type: 'I/O',
41
+ comment: ''
42
+ }.merge(attrs)
43
+ grp_name = grp_name.to_sym unless grp_name.is_a? Symbol
44
+ pin_name = pin_name.to_sym unless pin_name.is_a? Symbol
45
+ if PIN_TYPES.include? attrs[:type]
46
+ type = attrs[:type]
47
+ else
48
+ Origen.log.error "Pinmap group pin type '#{attrs[:type]}' must be set to one of the following: #{PIN_TYPES.join(', ')} for pin '#{pin_name}'"
49
+ fail
50
+ end
51
+ @pin_groups[grp_name][pin_name] = { type: attrs[:type], comment: attrs[:comment] }
52
+ end
53
+
54
+ def add_power_pin(pin_name, attrs = {})
55
+ attrs = {
56
+ type: 'Power',
57
+ comment: ''
58
+ }.merge(attrs)
59
+ pin_name = pin_name.to_sym unless pin_name.is_a? Symbol
60
+ if PWR_TYPES.include? attrs[:type]
61
+ type = attrs[:type]
62
+ else
63
+ Origen.log.error "Pinmap powerpin type '#{attrs[:type]}' must be set to one of the following: #{PWR_TYPES.join(', ')} for pin '#{pin_name}'"
64
+ fail
65
+ end
66
+ @power_pins[pin_name] = { type: attrs[:type], comment: attrs[:comment] }
67
+ end
68
+
69
+ def add_utility_pin(pin_name, attrs = {})
70
+ attrs = {
71
+ type: 'Utility',
72
+ comment: ''
73
+ }.merge(attrs)
74
+ pin_name = pin_name.to_sym unless pin_name.is_a? Symbol
75
+ if UTL_TYPES.include? attrs[:type]
76
+ type = attrs[:type]
77
+ else
78
+ Origen.log.error "Pinmap utility pin type '#{attrs[:type]}' must be set to one of the following: #{UTL_TYPES.join(', ')} for pin '#{pin_name}'"
79
+ fail
80
+ end
81
+ @utility_pins[pin_name] = { type: attrs[:type], comment: attrs[:comment] }
82
+ end
83
+
84
+ def finalize(options = {})
85
+ end
86
+
87
+ def platform
88
+ Origen.interface.platform
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -2,7 +2,7 @@ module OrigenTesters
2
2
  module IGXLBasedTester
3
3
  class Base
4
4
  class TestInstance
5
- attr_accessor :type, :index, :version, :append_version, :finalize
5
+ attr_accessor :type, :index, :version, :append_version, :finalize, :meta
6
6
 
7
7
  def self.define
8
8
  # Generate accessors for all attributes and their aliases
@@ -46,6 +46,7 @@ module OrigenTesters
46
46
  end
47
47
 
48
48
  def initialize(name, type, attrs = {})
49
+ @meta = {}
49
50
  @type = type
50
51
  @append_version = true
51
52
  self.name = name
@@ -68,6 +69,35 @@ module OrigenTesters
68
69
  end
69
70
  end
70
71
 
72
+ # Returns a hash containing key meta data about the test instance, this is
73
+ # intended to be used in documentation
74
+ def to_meta
75
+ m = { 'Test' => name,
76
+ 'Type' => type
77
+ }
78
+ if type == :functional
79
+ m['Pattern'] = pattern
80
+ elsif type == :board_pmu || type == :pin_pmu
81
+ m['Measure'] = fvmi? ? 'current' : 'voltage'
82
+ if hi_lo_limit_valid & 2 != 0
83
+ m['Hi'] = hi_limit
84
+ end
85
+ if hi_lo_limit_valid & 1 != 0
86
+ m['Lo'] = lo_limit
87
+ end
88
+ if force_cond
89
+ m['Force'] = force_cond
90
+ end
91
+ end
92
+ m['DC'] = "#{dc_category} (#{dc_selector})"
93
+ m['AC'] = "#{ac_category} (#{ac_selector})"
94
+ m.merge(@meta)
95
+ end
96
+
97
+ def inspect
98
+ "<TestInstance: #{name}, Type: #{type}>"
99
+ end
100
+
71
101
  def ==(other_instance)
72
102
  self.class == other_instance.class &&
73
103
  unversioned_name.to_s == other_instance.unversioned_name.to_s &&
@@ -167,6 +197,7 @@ module OrigenTesters
167
197
  end
168
198
  self
169
199
  end
200
+ alias_method :hi_limit=, :set_hi_limit
170
201
 
171
202
  # Set and enable the hi limit of a parametric test instance, passing in
172
203
  # nil or false as the lim parameter will disable the hi limit.
@@ -179,6 +210,7 @@ module OrigenTesters
179
210
  end
180
211
  self
181
212
  end
213
+ alias_method :lo_limit=, :set_lo_limit
182
214
 
183
215
  # Set the current range of the test instance, the following are valid:
184
216
  #
@@ -0,0 +1,37 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Timeset
5
+ attr_accessor :master_ts, :t_mode # Timeset information
6
+ attr_accessor :pins
7
+ attr_accessor :name
8
+
9
+ # Specify timeset information by providing a pin and its associated edge timing
10
+ def initialize(name, pin, edge, attrs = {}) # :nodoc:
11
+ attrs = {
12
+ master_ts: '', # master timeset name
13
+ t_mode: '' # timing mode (possibly ATE-specific)
14
+ }.merge(attrs)
15
+ @master_ts = attrs[:master_ts]
16
+ @t_mode = attrs[:t_mode]
17
+ @pins = { pin => edge }
18
+ self.name = name
19
+ end
20
+
21
+ # Assigns a timing edge object to the given pin for this timeset
22
+ def add_edge(pin, edge)
23
+ if @pins.key?(pin)
24
+ Origen.log.error "Pin #{pin} already exists in timeset"
25
+ fail
26
+ else
27
+ @pins[pin] = edge
28
+ end
29
+ end
30
+
31
+ def platform
32
+ Origen.interface.platform
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Timesets
5
+ include ::OrigenTesters::Generator
6
+
7
+ attr_accessor :ts
8
+ attr_accessor :ts_sheet_pins
9
+
10
+ OUTPUT_PREFIX = 'TS'
11
+ # OUTPUT_POSTFIX = 'TS'
12
+
13
+ def initialize # :nodoc:
14
+ @ts = {}
15
+ end
16
+
17
+ def add(tsname, pin, esname, options = {})
18
+ tsname = tsname.to_sym unless tsname.is_a? Symbol
19
+ pin = pin.to_sym unless pin.is_a? Symbol
20
+ esname = pin.to_sym unless esname.is_a? Symbol
21
+ @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
22
+ @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
23
+ @ts[tsname]
24
+ end
25
+
26
+ def finalize(options = {})
27
+ end
28
+
29
+ # Populate an array of pins based on the pin or pingroup
30
+ def get_pin_objects(grp)
31
+ pins = []
32
+ if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
33
+ Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
34
+ pins << Origen.top_level.pin(grp)
35
+ elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
36
+ Origen.top_level.pin(grp).each do |pin|
37
+ pins << pin
38
+ end
39
+ else
40
+ Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
41
+ end
42
+ pins
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -4,6 +4,6 @@ DFF 1.1 Flow Table
4
4
  Gate Command Bin Number Sort Number Flag Group Device Debug
5
5
  Label Enable Job Part Env Opcode Parameter TName TNum Pass Fail Pass Fail Result Pass Fail State Specifier Sense Condition Name Sense Condition Name Assume Sites Comment
6
6
  % end
7
- % collection.each do |test|
8
- <%= test %>
7
+ % format.each do |line|
8
+ <%= line %>
9
9
  % end
@@ -0,0 +1,10 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/ac_specsets'
5
+ class ACSpecsets < Base::ACSpecsets
6
+ TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb"
7
+ end
8
+ end
9
+ end
10
+ end