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.
- checksums.yaml +4 -4
- data/config/shared_commands.rb +6 -0
- data/config/version.rb +2 -2
- data/lib/commands/run.rb +44 -0
- data/lib/origen_testers.rb +19 -1
- data/lib/origen_testers/flow.rb +382 -0
- data/lib/origen_testers/generator.rb +32 -29
- data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
- data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
- data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
- data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
- data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
- data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
- data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
- data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
- data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
- data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
- data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
- data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
- data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
- data/lib/origen_testers/interface.rb +41 -6
- data/lib/origen_testers/no_interface.rb +7 -0
- data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
- data/lib/origen_testers/origen_ext/generator.rb +37 -0
- data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
- data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
- data/lib/origen_testers/program_generators.rb +0 -1
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
- data/lib/origen_testers/test/dut.rb +5 -0
- data/lib/origen_testers/test/j750_base_interface.rb +0 -3
- data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
- data/lib/origen_testers/test/v93k_interface.rb +5 -23
- data/program/components/_temp.rb +6 -0
- data/program/flow_control.rb +190 -62
- data/program/prb1.rb +13 -50
- data/program/prb2.rb +0 -16
- data/program/test.rb +12 -3
- data/program/uflex_resources.rb +159 -0
- metadata +66 -16
- data/lib/origen_testers/doc.rb +0 -224
- data/lib/origen_testers/doc/generator.rb +0 -124
- data/lib/origen_testers/doc/generator/flow.rb +0 -69
- data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
- data/lib/origen_testers/doc/generator/test.rb +0 -66
- data/lib/origen_testers/doc/generator/test_group.rb +0 -64
- data/lib/origen_testers/doc/generator/tests.rb +0 -45
- data/lib/origen_testers/doc/model.rb +0 -160
- data/lib/origen_testers/generator/flow_control_api.rb +0 -611
- data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
- 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
|
-
%
|
|
8
|
-
<%=
|
|
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
|