origen_testers 0.8.7 → 0.8.8
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/boot.rb +1 -4
- data/config/version.rb +1 -1
- data/lib/origen_testers/igxl_based_tester/ultraflex.rb +17 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +1 -17
- data/lib/origen_testers/interface.rb +4 -4
- data/lib/origen_testers/program_generators.rb +1 -0
- data/lib/origen_testers/test/dut.rb +11 -0
- data/lib/origen_testers/test/interface.rb +503 -0
- data/program/flow_control.rb +6 -1
- data/program/prb1.rb +1 -1
- data/program/prb1_resources.rb +1 -1
- data/program/prb2.rb +1 -1
- data/program/test.rb +1 -1
- data/program/uflex_resources.rb +1 -1
- metadata +3 -7
- data/lib/origen_testers/test/j750_base_interface.rb +0 -145
- data/lib/origen_testers/test/j750_hpt_interface.rb +0 -8
- data/lib/origen_testers/test/j750_interface.rb +0 -8
- data/lib/origen_testers/test/ultraflex_interface.rb +0 -377
- data/lib/origen_testers/test/v93k_interface.rb +0 -97
data/program/flow_control.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Some of the other flows also cover the flow control API and those tests are used
|
4
4
|
# to guarantee that the test ID references work when sub-flows are involved.
|
5
5
|
# This flow provides a full checkout of all flow control methods.
|
6
|
-
Flow.create do
|
6
|
+
Flow.create interface: 'OrigenTesters::Test::Interface' do
|
7
7
|
|
8
8
|
self.resources_filename = 'flow_control'
|
9
9
|
|
@@ -60,6 +60,11 @@ Flow.create do
|
|
60
60
|
func :probe_only_test2
|
61
61
|
end
|
62
62
|
|
63
|
+
log "Test that the block form of if_job can be overridden, prb9 should be removed"
|
64
|
+
if_job [:prb1, :prb2, :prb9] do
|
65
|
+
func :probe_only_test1
|
66
|
+
end
|
67
|
+
|
63
68
|
log "Test that unless_job works"
|
64
69
|
func :warmish_test, unless_job: :fc
|
65
70
|
|
data/program/prb1.rb
CHANGED
data/program/prb1_resources.rb
CHANGED
data/program/prb2.rb
CHANGED
data/program/test.rb
CHANGED
data/program/uflex_resources.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen_testers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -277,12 +277,8 @@ files:
|
|
277
277
|
- lib/origen_testers/test/custom_test_interface.rb
|
278
278
|
- lib/origen_testers/test/dut.rb
|
279
279
|
- lib/origen_testers/test/dut2.rb
|
280
|
-
- lib/origen_testers/test/
|
281
|
-
- lib/origen_testers/test/j750_hpt_interface.rb
|
282
|
-
- lib/origen_testers/test/j750_interface.rb
|
280
|
+
- lib/origen_testers/test/interface.rb
|
283
281
|
- lib/origen_testers/test/nvm.rb
|
284
|
-
- lib/origen_testers/test/ultraflex_interface.rb
|
285
|
-
- lib/origen_testers/test/v93k_interface.rb
|
286
282
|
- lib/origen_testers/timing.rb
|
287
283
|
- lib/origen_testers/vector.rb
|
288
284
|
- lib/origen_testers/vector_based_tester.rb
|
@@ -1,145 +0,0 @@
|
|
1
|
-
module OrigenTesters
|
2
|
-
module Test
|
3
|
-
class J750BaseInterface
|
4
|
-
# Options passed to Flow.create and Library.create will be passed in here, use as
|
5
|
-
# desired to configure your interface
|
6
|
-
def initialize(options = {})
|
7
|
-
end
|
8
|
-
|
9
|
-
def log(msg)
|
10
|
-
flow.logprint(msg)
|
11
|
-
end
|
12
|
-
|
13
|
-
def func(name, options = {})
|
14
|
-
options = {
|
15
|
-
duration: :static
|
16
|
-
}.merge(options)
|
17
|
-
|
18
|
-
block_loop(name, options) do |block, i, group|
|
19
|
-
ins = test_instances.functional(name)
|
20
|
-
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
21
|
-
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
22
|
-
if group
|
23
|
-
pname = "#{name}_b#{i}_pset"
|
24
|
-
patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
|
25
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
26
|
-
ins.pattern = pname
|
27
|
-
flow.test(group, options) if i == 0
|
28
|
-
else
|
29
|
-
pname = "#{name}_pset"
|
30
|
-
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
31
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
32
|
-
ins.pattern = pname
|
33
|
-
if options[:cz_setup]
|
34
|
-
flow.cz(ins, options[:cz_setup], options)
|
35
|
-
else
|
36
|
-
flow.test(ins, options)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def block_loop(name, options)
|
43
|
-
if options[:by_block]
|
44
|
-
test_instances.group do |group|
|
45
|
-
group.name = name
|
46
|
-
$dut.blocks.each_with_index do |block, i|
|
47
|
-
yield block, i, group
|
48
|
-
end
|
49
|
-
end
|
50
|
-
else
|
51
|
-
yield
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def por(options = {})
|
56
|
-
options = {
|
57
|
-
instance_not_available: true
|
58
|
-
}.merge(options)
|
59
|
-
flow.test('por_ins', options)
|
60
|
-
end
|
61
|
-
|
62
|
-
def para(name, options = {})
|
63
|
-
options = {
|
64
|
-
high_voltage: false
|
65
|
-
}.merge(options)
|
66
|
-
if options.delete(:high_voltage)
|
67
|
-
ins = test_instances.bpmu(name)
|
68
|
-
else
|
69
|
-
ins = test_instances.ppmu(name)
|
70
|
-
end
|
71
|
-
ins.dc_category = 'NVM_PARA'
|
72
|
-
flow.test(ins, options)
|
73
|
-
patsets.add("#{name}_pset", pattern: "#{name}.PAT")
|
74
|
-
end
|
75
|
-
|
76
|
-
# OR 2 IDS together into 1 flag
|
77
|
-
def or_ids(options = {})
|
78
|
-
flow.or_flags(options[:id1], options[:id2], options)
|
79
|
-
end
|
80
|
-
|
81
|
-
def nop(options = {})
|
82
|
-
flow.nop options
|
83
|
-
end
|
84
|
-
|
85
|
-
def mto_memory(name, options = {})
|
86
|
-
options = {
|
87
|
-
duration: :static
|
88
|
-
}.merge(options)
|
89
|
-
|
90
|
-
block_loop(name, options) do |block, i, group|
|
91
|
-
ins = test_instances.mto_memory(name)
|
92
|
-
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
93
|
-
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
94
|
-
if group
|
95
|
-
pname = "#{name}_b#{i}_pset"
|
96
|
-
patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
|
97
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
98
|
-
ins.pattern = pname
|
99
|
-
flow.test(group, options) if i == 0
|
100
|
-
else
|
101
|
-
pname = "#{name}_pset"
|
102
|
-
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
103
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
104
|
-
ins.pattern = pname
|
105
|
-
if options[:cz_setup]
|
106
|
-
flow.cz(ins, options[:cz_setup], options)
|
107
|
-
else
|
108
|
-
flow.test(ins, options)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def meas(name, options = {})
|
114
|
-
options = {
|
115
|
-
duration: :static
|
116
|
-
}.merge(options)
|
117
|
-
|
118
|
-
name = "meas_#{name}" unless name.to_s =~ /meas/
|
119
|
-
|
120
|
-
if options[:pins] == :hi_v
|
121
|
-
ins = test_instances.board_pmu(name)
|
122
|
-
elsif options[:pins] == :power
|
123
|
-
ins = test_instances.powersupply(name)
|
124
|
-
else
|
125
|
-
ins = test_instances.pin_pmu(name)
|
126
|
-
end
|
127
|
-
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
128
|
-
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
129
|
-
ins.lo_limit = options[:lo_limit]
|
130
|
-
ins.hi_limit = options[:hi_limit]
|
131
|
-
|
132
|
-
pname = "#{name}_pset"
|
133
|
-
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
134
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
135
|
-
ins.pattern = pname
|
136
|
-
if options[:cz_setup]
|
137
|
-
flow.cz(ins, options[:cz_setup], options)
|
138
|
-
else
|
139
|
-
flow.test(ins, options)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
@@ -1,377 +0,0 @@
|
|
1
|
-
module OrigenTesters
|
2
|
-
module Test
|
3
|
-
class UltraFLEXInterface
|
4
|
-
include OrigenTesters::UltraFLEX::Generator
|
5
|
-
|
6
|
-
# Options passed to Flow.create and Library.create will be passed in here, use as
|
7
|
-
# desired to configure your interface
|
8
|
-
def initialize(options = {})
|
9
|
-
end
|
10
|
-
|
11
|
-
def log(msg)
|
12
|
-
flow.logprint(msg)
|
13
|
-
end
|
14
|
-
|
15
|
-
def func(name, options = {})
|
16
|
-
options = {
|
17
|
-
duration: :static
|
18
|
-
}.merge(options)
|
19
|
-
|
20
|
-
block_loop(name, options) do |block, i, group|
|
21
|
-
ins = test_instances.functional(name)
|
22
|
-
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
23
|
-
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
24
|
-
if group
|
25
|
-
pname = "#{name}_b#{i}_pset"
|
26
|
-
patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
|
27
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
28
|
-
ins.pattern = pname
|
29
|
-
flow.test(group, options) if i == 0
|
30
|
-
else
|
31
|
-
pname = "#{name}_pset"
|
32
|
-
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
33
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
34
|
-
ins.pattern = pname
|
35
|
-
if options[:cz_setup]
|
36
|
-
flow.cz(ins, options[:cz_setup], options)
|
37
|
-
else
|
38
|
-
flow.test(ins, options)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def meas(name, options = {})
|
45
|
-
options = {
|
46
|
-
duration: :static
|
47
|
-
}.merge(options)
|
48
|
-
|
49
|
-
name = "meas_#{name}" unless name.to_s =~ /meas/
|
50
|
-
|
51
|
-
ins = test_instances.functional(name)
|
52
|
-
ins.set_wait_flags(:a) if options[:duration] == :dynamic
|
53
|
-
ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
|
54
|
-
ins.lo_limit = options[:lo_limit]
|
55
|
-
ins.hi_limit = options[:hi_limit]
|
56
|
-
ins.scale = options[:scale]
|
57
|
-
ins.units = options[:units]
|
58
|
-
ins.defer_limits = options[:defer_limits]
|
59
|
-
|
60
|
-
pname = "#{name}_pset"
|
61
|
-
patsets.add(pname, [{ pattern: "#{name}.PAT" },
|
62
|
-
{ pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
|
63
|
-
ins.pattern = pname
|
64
|
-
if options[:cz_setup]
|
65
|
-
flow.cz(ins, options[:cz_setup], options)
|
66
|
-
else
|
67
|
-
flow.test(ins, options)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def block_loop(name, options)
|
72
|
-
if options[:by_block]
|
73
|
-
test_instances.group do |group|
|
74
|
-
group.name = name
|
75
|
-
$dut.blocks.each_with_index do |block, i|
|
76
|
-
yield block, i, group
|
77
|
-
end
|
78
|
-
end
|
79
|
-
else
|
80
|
-
yield
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def por(options = {})
|
85
|
-
options = {
|
86
|
-
instance_not_available: true
|
87
|
-
}.merge(options)
|
88
|
-
flow.test('por_ins', options)
|
89
|
-
end
|
90
|
-
|
91
|
-
def para(name, options = {})
|
92
|
-
print "UltraFLEX Parametric Test not yet supported for UltraFlex!\n"
|
93
|
-
end
|
94
|
-
|
95
|
-
# OR 2 IDS together into 1 flag
|
96
|
-
def or_ids(options = {})
|
97
|
-
flow.or_flags(options[:id1], options[:id2], options)
|
98
|
-
end
|
99
|
-
|
100
|
-
def nop(options = {})
|
101
|
-
flow.nop options
|
102
|
-
end
|
103
|
-
|
104
|
-
def mto_memory(args)
|
105
|
-
# DO NOTHING, NOT YET SUPPORTED IN ULTRAFLEX
|
106
|
-
end
|
107
|
-
|
108
|
-
def bin(number, options = {})
|
109
|
-
end
|
110
|
-
|
111
|
-
# Assign relevant pins for pinmap sheet generation
|
112
|
-
def pinmap(name, options = {})
|
113
|
-
pinmap = pinmaps("#{name}")
|
114
|
-
Origen.top_level.add_pin_group :JTAG, :tdi, :tdo, :tms
|
115
|
-
Origen.top_level.power_pin_groups.keys.each do |grp_key|
|
116
|
-
pinmap.add_power_pin(grp_key, type: 'Power', comment: "# #{grp_key}")
|
117
|
-
end
|
118
|
-
Origen.top_level.virtual_pins.keys.each do |util_pin|
|
119
|
-
upin = Origen.top_level.virtual_pins(util_pin)
|
120
|
-
case upin.type
|
121
|
-
when :virtual_pin
|
122
|
-
pinmap.add_utility_pin(upin.name, type: 'Utility', comment: "# #{util_pin}")
|
123
|
-
when :ate_ch
|
124
|
-
pinmap.add_utility_pin(upin.name, type: 'I/O', comment: "# #{util_pin}")
|
125
|
-
end
|
126
|
-
end
|
127
|
-
Origen.top_level.pin.keys.each do |pkey|
|
128
|
-
pinmap.add_pin(Origen.top_level.pin(pkey).name, type: 'I/O', comment: "# #{pkey}")
|
129
|
-
end
|
130
|
-
Origen.top_level.pin_groups.keys.sort.each do |gkey|
|
131
|
-
# Do not include pins that are aliased to themselves
|
132
|
-
Origen.top_level.pin(gkey).each do |pin|
|
133
|
-
pinmap.add_group_pin(gkey, Origen.top_level.pin(pin.id).name, type: 'I/O', comment: "# #{gkey}")
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
# Assign relevant edges in preparation for edgeset/timeset sheet generation
|
139
|
-
def edge(category, pin, options = {})
|
140
|
-
options = {
|
141
|
-
d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
|
142
|
-
d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
|
143
|
-
d0_edge: '', # time at which the input drive is turned on
|
144
|
-
d1_edge: '', # time of the initial data drive edge
|
145
|
-
d2_edge: '', # time of the return format data drive edge
|
146
|
-
d3_edge: '', # time at which the input drive is turned off
|
147
|
-
c_mode: 'Edge', # output compare mode
|
148
|
-
c1_edge: '', # time of the initial output compare edge
|
149
|
-
c2_edge: '', # time of the final output compare edge (window compare)
|
150
|
-
t_res: 'Machine', # timing resolution (possibly ATE-specific)
|
151
|
-
clk_per: '' # clock period equation - for use with MCG
|
152
|
-
}.merge(options)
|
153
|
-
|
154
|
-
@edge_collection = edges
|
155
|
-
@edge_collection.add(category, pin, options)
|
156
|
-
end
|
157
|
-
|
158
|
-
def edge_collection
|
159
|
-
@edge_collection
|
160
|
-
end
|
161
|
-
|
162
|
-
def edgeset(sheet_name, options = {})
|
163
|
-
options = {
|
164
|
-
edgeset: :es_default,
|
165
|
-
period: 'cycle', # tester cycle period
|
166
|
-
t_mode: 'Machine' # edgeset timing mode (possibly ATE-specific)
|
167
|
-
}.merge(options)
|
168
|
-
edgeset = options.delete(:edgeset)
|
169
|
-
pin = options.delete(:pin)
|
170
|
-
edge = options.delete(:edge)
|
171
|
-
|
172
|
-
@edgeset = edgesets(sheet_name, options)
|
173
|
-
@edgeset.add(edgeset, pin, edge, options)
|
174
|
-
collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
|
175
|
-
end
|
176
|
-
|
177
|
-
def timeset(sheet_name, options = {})
|
178
|
-
options = {
|
179
|
-
timeset: :default,
|
180
|
-
master_ts: :default
|
181
|
-
}.merge(options)
|
182
|
-
timeset = options.delete(:timeset)
|
183
|
-
pin = options.delete(:pin)
|
184
|
-
eset = options.delete(:eset)
|
185
|
-
|
186
|
-
@timeset = timesets(sheet_name, options)
|
187
|
-
@timeset.add(timeset, pin, eset, options)
|
188
|
-
end
|
189
|
-
|
190
|
-
def ac_specset(sheet_name, expression, options = {})
|
191
|
-
options = {
|
192
|
-
specset: :default,
|
193
|
-
nom: { typ: nil }
|
194
|
-
}.merge(options)
|
195
|
-
|
196
|
-
ss = ac_specsets(sheet_name)
|
197
|
-
add_ac_specs(ss, expression, options)
|
198
|
-
end
|
199
|
-
|
200
|
-
# Collects AC Spec object(s) from the given expression and adds them to the given Specset
|
201
|
-
def collect_ac_specs(ssname, edge, options = {})
|
202
|
-
options = {
|
203
|
-
nom: { typ: nil }
|
204
|
-
}.merge(options)
|
205
|
-
|
206
|
-
# Create a Specsets object from the UFlex program generator API
|
207
|
-
ss = ac_specsets(ssname.to_sym)
|
208
|
-
add_ac_specs(ss, edge.clk_per, options)
|
209
|
-
add_ac_specs(ss, edge.d0_edge, options)
|
210
|
-
add_ac_specs(ss, edge.d1_edge, options)
|
211
|
-
add_ac_specs(ss, edge.d2_edge, options)
|
212
|
-
add_ac_specs(ss, edge.d3_edge, options)
|
213
|
-
add_ac_specs(ss, edge.c1_edge, options)
|
214
|
-
add_ac_specs(ss, edge.c2_edge, options)
|
215
|
-
end
|
216
|
-
|
217
|
-
# Adds new AC Spec object(s) to the given Specset
|
218
|
-
def add_ac_specs(ss, expression, options = {})
|
219
|
-
options = {
|
220
|
-
specset: :default
|
221
|
-
}.merge(options)
|
222
|
-
|
223
|
-
return unless expression.is_a? String
|
224
|
-
# collect all variable names within the expression
|
225
|
-
vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
|
226
|
-
vars.each do |var|
|
227
|
-
next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/
|
228
|
-
# The substitutions below are used for backward compatibility
|
229
|
-
next if var =~ /^(d_on|d_data|d_ret|d_off|c_open|c_close)$/
|
230
|
-
next if var =~ /^(nS|uS|mS|S)$/i
|
231
|
-
next if ss.ac_specsets.key?(options[:specset]) && ss.ac_specsets[options[:specset]].include?(var)
|
232
|
-
|
233
|
-
ss.add(var, options)
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
# Assign relevant power supply levels in preparation for levelset sheet generation
|
238
|
-
def pwr_level(category, options = {})
|
239
|
-
options = {
|
240
|
-
vmain: 1.8, # Main supply voltage
|
241
|
-
valt: 1.8, # Alternate supply voltage
|
242
|
-
ifold: 1, # Supply clamp current
|
243
|
-
delay: 0 # Supply power-up delay
|
244
|
-
}.merge(options)
|
245
|
-
|
246
|
-
@level_collection = levels
|
247
|
-
@level_collection.add_power_level(category, options)
|
248
|
-
end
|
249
|
-
|
250
|
-
# Assign relevant single-ended pin levels in preparation for levelset sheet generation
|
251
|
-
def pin_level_se(category, options = {})
|
252
|
-
options = {
|
253
|
-
vil: 0, # Input drive low
|
254
|
-
vih: 1.8, # Input drive high
|
255
|
-
vol: 1.0, # Output compare low
|
256
|
-
voh: 0.8, # Output compare high
|
257
|
-
vcl: -1, # Voltage clamp low
|
258
|
-
vch: 2.5, # Voltage clamp high
|
259
|
-
vt: 0.9, # Termination voltage
|
260
|
-
voutlotyp: 0, #
|
261
|
-
vouthityp: 0, #
|
262
|
-
dmode: 'Largeswing-VT' # Driver mode
|
263
|
-
}.merge(options)
|
264
|
-
|
265
|
-
@level_collection = levels
|
266
|
-
@level_collection.add_se_pin_level(category, options)
|
267
|
-
end
|
268
|
-
|
269
|
-
def level_collection
|
270
|
-
@level_collection
|
271
|
-
end
|
272
|
-
|
273
|
-
def levelset(sheet_name, options = {})
|
274
|
-
pin = options.delete(:pin)
|
275
|
-
level = options.delete(:level)
|
276
|
-
|
277
|
-
@levelset = levelsets(sheet_name)
|
278
|
-
@levelset.add(sheet_name, pin, level, options)
|
279
|
-
collect_dc_specs(@levelset.spec_sheet, level)
|
280
|
-
end
|
281
|
-
|
282
|
-
def dc_specset(sheet_name, expression, options = {})
|
283
|
-
options = {
|
284
|
-
min: { min: nil },
|
285
|
-
nom: { typ: nil },
|
286
|
-
max: { max: nil }
|
287
|
-
}.merge(options)
|
288
|
-
|
289
|
-
ss = dc_specsets(sheet_name.to_sym)
|
290
|
-
add_dc_specs(ss, expression, options)
|
291
|
-
end
|
292
|
-
|
293
|
-
# Collects DC Spec object(s) from the given expression and adds them to the given Specset
|
294
|
-
def collect_dc_specs(ssname, level, options = {})
|
295
|
-
options = {
|
296
|
-
nom: { typ: nil },
|
297
|
-
min: { min: nil },
|
298
|
-
max: { max: nil }
|
299
|
-
}.merge(options)
|
300
|
-
|
301
|
-
# Create a Specsets object from the UFlex program generator API
|
302
|
-
ss = dc_specsets(ssname.to_sym)
|
303
|
-
if level.respond_to?(:vmain)
|
304
|
-
add_dc_specs(ss, level.vmain, options)
|
305
|
-
add_dc_specs(ss, level.valt, options)
|
306
|
-
add_dc_specs(ss, level.ifold, options)
|
307
|
-
elsif level.respond_to?(:vil)
|
308
|
-
add_dc_specs(ss, level.vil, options)
|
309
|
-
add_dc_specs(ss, level.vih, options)
|
310
|
-
add_dc_specs(ss, level.vol, options)
|
311
|
-
add_dc_specs(ss, level.voh, options)
|
312
|
-
add_dc_specs(ss, level.vcl, options)
|
313
|
-
add_dc_specs(ss, level.vch, options)
|
314
|
-
add_dc_specs(ss, level.vt, options)
|
315
|
-
add_dc_specs(ss, level.voutlotyp, options)
|
316
|
-
add_dc_specs(ss, level.vouthityp, options)
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
# Adds new DC Spec object(s) to the given Specset
|
321
|
-
def add_dc_specs(ss, expression, options = {})
|
322
|
-
options = {
|
323
|
-
specset: :default
|
324
|
-
}.merge(options)
|
325
|
-
|
326
|
-
return unless expression.is_a? String
|
327
|
-
vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
|
328
|
-
vars.each do |var|
|
329
|
-
next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i
|
330
|
-
|
331
|
-
ss.add(var, options)
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
|
-
def global_spec(var, options = {})
|
336
|
-
options = {
|
337
|
-
job: nil,
|
338
|
-
value: nil,
|
339
|
-
comment: nil
|
340
|
-
}.merge(options)
|
341
|
-
|
342
|
-
global_specs('SpecsGlobal').add(var, job: options[:job], value: options[:value], comment: options[:comment])
|
343
|
-
end
|
344
|
-
|
345
|
-
def job_def(jname, options = {})
|
346
|
-
options = {
|
347
|
-
pinmap: pinmap_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
348
|
-
instances: test_instance_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
349
|
-
flows: flow_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
350
|
-
ac_specs: ac_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
351
|
-
dc_specs: dc_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
352
|
-
patsets: patset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
353
|
-
patgroups: patgroup_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
|
354
|
-
bintables: [],
|
355
|
-
cz: [],
|
356
|
-
test_procs: [],
|
357
|
-
mix_sig_timing: [],
|
358
|
-
wave_defs: [],
|
359
|
-
psets: [],
|
360
|
-
sigs_port_map: [],
|
361
|
-
fract_bus: [],
|
362
|
-
comment: nil
|
363
|
-
}.merge(options)
|
364
|
-
|
365
|
-
program_jobs('Jobs').add(jname, options)
|
366
|
-
end
|
367
|
-
|
368
|
-
def reference(reference, options = {})
|
369
|
-
options = {
|
370
|
-
comment: nil
|
371
|
-
}.merge(options)
|
372
|
-
|
373
|
-
references('Refs').add(reference, options)
|
374
|
-
end
|
375
|
-
end
|
376
|
-
end
|
377
|
-
end
|