origen_testers 0.6.2 → 0.7.0.pre0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/version.rb +3 -3
- data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +35 -2
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +139 -8
- data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -0
- data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -0
- data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -0
- data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -0
- data/lib/origen_testers/igxl_based_tester/base/timesets.rb +4 -2
- data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +1 -1
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +1 -1
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +16 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +27 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -3
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +149 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -0
- data/lib/origen_testers/origen_ext/generator/flow.rb +8 -1
- data/lib/origen_testers/smartest_based_tester/base.rb +11 -2
- data/lib/origen_testers/test/ultraflex_interface.rb +43 -2
- data/program/uflex_resources.rb +41 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a90943f4feeb9a5fd74e0660e8bbbc068d2b0aa0
|
4
|
+
data.tar.gz: 0d0334819d9b766a4030e712ae4070074262b350
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9813effc8d620fe3b6279b88d6ad0176449cb31712f0cfd4789fbc22005f1ea3f1c86fcd001f988189b2717fe9999c22d1ba462bb157638f1e207bcf881acba6
|
7
|
+
data.tar.gz: 8f480ad0212eb967200d833ea721ed7d002326a6b7a08988b794afe379ee0766c3debdb8061d6844bd910f389675a62916a46526140e360ff2277140662e42a5
|
data/config/version.rb
CHANGED
@@ -6,12 +6,14 @@ module OrigenTesters
|
|
6
6
|
|
7
7
|
attr_accessor :es
|
8
8
|
attr_accessor :es_sheet_pins
|
9
|
+
attr_accessor :ts_basic
|
9
10
|
|
10
11
|
OUTPUT_PREFIX = 'ES'
|
11
12
|
# OUTPUT_POSTFIX = 'ES'
|
12
13
|
|
13
|
-
def initialize # :nodoc:
|
14
|
-
@es
|
14
|
+
def initialize(options = {}) # :nodoc:
|
15
|
+
@es = {}
|
16
|
+
@ts_basic = options[:timeset_basic]
|
15
17
|
end
|
16
18
|
|
17
19
|
def add(esname, pin, edge, options = {})
|
@@ -91,6 +93,37 @@ module OrigenTesters
|
|
91
93
|
data
|
92
94
|
end
|
93
95
|
end
|
96
|
+
|
97
|
+
# Prepare the edge information for TSB file output
|
98
|
+
def format_uflex_edge_tsb(data, line_cnt, options = {})
|
99
|
+
options = {
|
100
|
+
no_disable: false
|
101
|
+
}.merge(options)
|
102
|
+
|
103
|
+
if data !~ /^\s*$/
|
104
|
+
data = data.gsub(/^/, '=')
|
105
|
+
end
|
106
|
+
data = data.gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
107
|
+
|
108
|
+
case data
|
109
|
+
when /_d0_edge|_d_on/
|
110
|
+
data = data.gsub(/_d0_edge|_d_on/, "I#{line_cnt}")
|
111
|
+
when /_d1_edge|_d_data/
|
112
|
+
data = data.gsub(/_d1_edge|_d_data/, "J#{line_cnt}")
|
113
|
+
when /_d2_edge|_dret/
|
114
|
+
data = data.gsub(/_d2_edge|_dret/, "K#{line_cnt}")
|
115
|
+
when /_d3_edge|_d_off/
|
116
|
+
data = data.gsub(/_d3_edge|_d_off/, "L#{line_cnt}")
|
117
|
+
when /_c1_edge|_c_open/
|
118
|
+
data = data.gsub(/_c1_edge|_c_open/, "N#{line_cnt}")
|
119
|
+
when /_c2_edge|_c_close/
|
120
|
+
data = data.gsub(/_c2_edge|_c_close/, "O#{line_cnt}")
|
121
|
+
when /^\s*$/
|
122
|
+
options[:no_disable] ? data = '' : data = 'disable'
|
123
|
+
else
|
124
|
+
data
|
125
|
+
end
|
126
|
+
end
|
94
127
|
end
|
95
128
|
end
|
96
129
|
end
|
@@ -36,6 +36,9 @@ module OrigenTesters
|
|
36
36
|
@@levelsets_filename = nil
|
37
37
|
@@ac_specsets_filename = nil
|
38
38
|
@@dc_specsets_filename = nil
|
39
|
+
@@global_specs_filename = nil
|
40
|
+
@@jobs_filename = nil
|
41
|
+
@@references_filename = nil
|
39
42
|
end
|
40
43
|
|
41
44
|
# @api private
|
@@ -51,6 +54,9 @@ module OrigenTesters
|
|
51
54
|
@@levelset_sheets = nil
|
52
55
|
@@ac_specset_sheets = nil
|
53
56
|
@@dc_specset_sheets = nil
|
57
|
+
@@global_spec_sheets = nil
|
58
|
+
@@job_sheets = nil
|
59
|
+
@@reference_sheets = nil
|
54
60
|
end
|
55
61
|
alias_method :reset_globals, :at_run_start
|
56
62
|
|
@@ -72,6 +78,9 @@ module OrigenTesters
|
|
72
78
|
# levelsets_filename = "common"
|
73
79
|
# ac_specsets_filename = "common"
|
74
80
|
# dc_specsets_filename = "common"
|
81
|
+
# global_specs_filename = "common"
|
82
|
+
# jobs_filename = "common"
|
83
|
+
# references_filename = "common"
|
75
84
|
def resources_filename=(name)
|
76
85
|
self.pinmaps_filename = name
|
77
86
|
self.test_instances_filename = name
|
@@ -82,6 +91,9 @@ module OrigenTesters
|
|
82
91
|
self.levelsets_filename = name
|
83
92
|
self.ac_specsets_filename = name
|
84
93
|
self.dc_specsets_filename = name
|
94
|
+
self.global_specs_filename = name
|
95
|
+
self.jobs_filename = name
|
96
|
+
self.references_filename = name
|
85
97
|
end
|
86
98
|
|
87
99
|
# Set the name of the current pinmap sheet. This does not change
|
@@ -156,6 +168,30 @@ module OrigenTesters
|
|
156
168
|
@@dc_specsets_filename = name
|
157
169
|
end
|
158
170
|
|
171
|
+
# Set the name of the global specs sheet. This does not change
|
172
|
+
# the name of the current sheet, but rather sets the name of the sheet that
|
173
|
+
# will be generated the next time you access patgroups.
|
174
|
+
def global_specs_filename=(name)
|
175
|
+
@global_specs_filename = name
|
176
|
+
@@global_specs_filename = name
|
177
|
+
end
|
178
|
+
|
179
|
+
# Set the name of the jobs sheet. This does not change
|
180
|
+
# the name of the current sheet, but rather sets the name of the sheet that
|
181
|
+
# will be generated the next time you access patgroups.
|
182
|
+
def jobs_filename=(name)
|
183
|
+
@jobs_filename = name
|
184
|
+
@@jobs_filename = name
|
185
|
+
end
|
186
|
+
|
187
|
+
# Set the name of the references sheet. This does not change
|
188
|
+
# the name of the current sheet, but rather sets the name of the sheet that
|
189
|
+
# will be generated the next time you access patgroups.
|
190
|
+
def references_filename=(name)
|
191
|
+
@references_filename = name
|
192
|
+
@@references_filename = name
|
193
|
+
end
|
194
|
+
|
159
195
|
# Returns the name of the current pinmaps sheet
|
160
196
|
def pinmaps_filename
|
161
197
|
@@pinmaps_filename ||= @pinmaps_filename || 'global'
|
@@ -201,6 +237,21 @@ module OrigenTesters
|
|
201
237
|
@@dc_specsets_filename ||= @dc_specsets_filename || 'global'
|
202
238
|
end
|
203
239
|
|
240
|
+
# Returns the name of the current global spec sheet
|
241
|
+
def global_specs_filename
|
242
|
+
@@global_specs_filename ||= @global_specs_filename || 'global'
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns the name of the current job sheet
|
246
|
+
def jobs_filename
|
247
|
+
@@jobs_filename ||= @jobs_filename || 'global'
|
248
|
+
end
|
249
|
+
|
250
|
+
# Returns the name of the current references sheet
|
251
|
+
def references_filename
|
252
|
+
@@references_filename ||= @references_filename || 'global'
|
253
|
+
end
|
254
|
+
|
204
255
|
# Returns a hash containing all pinmap sheets
|
205
256
|
def pinmap_sheets
|
206
257
|
@@pinmap_sheets ||= {}
|
@@ -251,18 +302,43 @@ module OrigenTesters
|
|
251
302
|
@@dc_specset_sheets ||= {}
|
252
303
|
end
|
253
304
|
|
305
|
+
# Returns a hash containing all global spec sheets
|
306
|
+
def global_spec_sheets
|
307
|
+
@@global_spec_sheets ||= {}
|
308
|
+
end
|
309
|
+
|
310
|
+
# Returns a hash containing all job sheets
|
311
|
+
def job_sheets
|
312
|
+
@@job_sheets ||= {}
|
313
|
+
end
|
314
|
+
|
315
|
+
# Returns a hash containing all reference sheets
|
316
|
+
def reference_sheets
|
317
|
+
@@reference_sheets ||= {}
|
318
|
+
end
|
319
|
+
|
254
320
|
# Returns an array containing all sheet generators where a sheet generator is a flow,
|
255
|
-
# test instance, patset, pat group, edgeset, timeset,
|
321
|
+
# test instance, patset, pat group, edgeset, timeset, AC/DC/Global spec, job,
|
322
|
+
# or reference sheet.
|
256
323
|
# All Origen program generators must implement this method
|
257
324
|
def sheet_generators # :nodoc:
|
258
325
|
g = []
|
326
|
+
# Generate all of these sheets verbatim
|
259
327
|
[pinmap_sheets, flow_sheets, test_instance_sheets, patset_sheets,
|
260
|
-
patgroup_sheets,
|
261
|
-
|
328
|
+
patgroup_sheets, levelset_sheets, ac_specset_sheets, dc_specset_sheets,
|
329
|
+
global_spec_sheets, job_sheets, reference_sheets].each do |sheets|
|
262
330
|
sheets.each do |name, sheet|
|
263
331
|
g << sheet
|
264
332
|
end
|
265
333
|
end
|
334
|
+
# Choose whether to generate edgeset/timset or timeset_basic sheets
|
335
|
+
# * Skip edgeset sheet generation when timeset_basic is selected
|
336
|
+
[edgeset_sheets, timeset_sheets].each do |sheets|
|
337
|
+
sheets.each do |name, sheet|
|
338
|
+
next if sheet.class.name =~ /Edgesets$/ && sheet.ts_basic
|
339
|
+
g << sheet
|
340
|
+
end
|
341
|
+
end
|
266
342
|
g
|
267
343
|
end
|
268
344
|
|
@@ -386,25 +462,38 @@ module OrigenTesters
|
|
386
462
|
# Pass in a filename argument to have a specific sheet returned instead.
|
387
463
|
#
|
388
464
|
# If the sheet does not exist yet it will be created.
|
389
|
-
def edgesets(filename = edgesets_filename)
|
465
|
+
def edgesets(filename = edgesets_filename, options = {})
|
466
|
+
options = {
|
467
|
+
timeset_basic: false
|
468
|
+
}.merge(options)
|
469
|
+
|
390
470
|
f = filename.to_sym
|
391
471
|
return edgeset_sheets[f] if edgeset_sheets[f]
|
392
|
-
e = platform::Edgesets.new
|
472
|
+
e = platform::Edgesets.new(options)
|
393
473
|
e.filename = f
|
394
474
|
edgeset_sheets[f] = e
|
395
475
|
end
|
396
476
|
alias_method :edge_sets, :edgesets
|
397
477
|
|
398
|
-
# Returns the current timesets sheet (as defined by the current value of
|
478
|
+
# Returns the current timesets or timesets_basic sheet (as defined by the current value of
|
399
479
|
# timesets_filename).
|
400
480
|
#
|
401
481
|
# Pass in a filename argument to have a specific sheet returned instead.
|
402
482
|
#
|
403
483
|
# If the sheet does not exist yet it will be created.
|
404
|
-
def timesets(filename = timesets_filename)
|
484
|
+
def timesets(filename = timesets_filename, options = {})
|
485
|
+
options = {
|
486
|
+
timeset_basic: false
|
487
|
+
}.merge(options)
|
488
|
+
|
405
489
|
f = filename.to_sym
|
406
490
|
return timeset_sheets[f] if timeset_sheets[f]
|
407
|
-
|
491
|
+
case options[:timeset_basic]
|
492
|
+
when true
|
493
|
+
t = platform::TimesetsBasic.new(options)
|
494
|
+
when false
|
495
|
+
t = platform::Timesets.new(options)
|
496
|
+
end
|
408
497
|
t.filename = f
|
409
498
|
timeset_sheets[f] = t
|
410
499
|
end
|
@@ -463,6 +552,48 @@ module OrigenTesters
|
|
463
552
|
dc_specset_sheets[f] = s
|
464
553
|
end
|
465
554
|
|
555
|
+
# Returns the current global spec sheet (as defined by the current value of
|
556
|
+
# global_specs_filename).
|
557
|
+
#
|
558
|
+
# Pass in a filename argument to have a specific sheet returned instead.
|
559
|
+
#
|
560
|
+
# If the sheet does not exist yet it will be created.
|
561
|
+
def global_specs(filename = global_specs_filename)
|
562
|
+
f = filename.to_sym
|
563
|
+
return global_spec_sheets[f] if global_spec_sheets[f]
|
564
|
+
s = platform::GlobalSpecs.new
|
565
|
+
s.filename = f
|
566
|
+
global_spec_sheets[f] = s
|
567
|
+
end
|
568
|
+
|
569
|
+
# Returns the current job sheet (as defined by the current value of
|
570
|
+
# jobs_filename).
|
571
|
+
#
|
572
|
+
# Pass in a filename argument to have a specific sheet returned instead.
|
573
|
+
#
|
574
|
+
# If the sheet does not exist yet it will be created.
|
575
|
+
def program_jobs(filename = jobs_filename)
|
576
|
+
f = filename.to_sym
|
577
|
+
return job_sheets[f] if job_sheets[f]
|
578
|
+
j = platform::Jobs.new
|
579
|
+
j.filename = f
|
580
|
+
job_sheets[f] = j
|
581
|
+
end
|
582
|
+
|
583
|
+
# Returns the current reference sheet (as defined by the current value of
|
584
|
+
# references_filename).
|
585
|
+
#
|
586
|
+
# Pass in a filename argument to have a specific sheet returned instead.
|
587
|
+
#
|
588
|
+
# If the sheet does not exist yet it will be created.
|
589
|
+
def references(filename = references_filename)
|
590
|
+
f = filename.to_sym
|
591
|
+
return reference_sheets[f] if reference_sheets[f]
|
592
|
+
r = platform::References.new
|
593
|
+
r.filename = f
|
594
|
+
reference_sheets[f] = r
|
595
|
+
end
|
596
|
+
|
466
597
|
private
|
467
598
|
|
468
599
|
# Custom test instance libraries
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class Base
|
4
|
+
class GlobalSpecs
|
5
|
+
include ::OrigenTesters::Generator
|
6
|
+
|
7
|
+
attr_accessor :global_specs
|
8
|
+
|
9
|
+
OUTPUT_PREFIX = 'SpecsGlobal'
|
10
|
+
# OUTPUT_POSTFIX = 'SpecsGlobal'
|
11
|
+
|
12
|
+
def initialize # :nodoc:
|
13
|
+
## Hash Autovivification
|
14
|
+
l = ->(h, k) { h[k] = Hash.new(&l) }
|
15
|
+
@global_specs = Hash.new(&l)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Assigns a global spec value object to the given variable
|
19
|
+
# The attrs hash is expected to defined as follows:
|
20
|
+
# attrs = {
|
21
|
+
# job: nil,
|
22
|
+
# value: 0
|
23
|
+
# }
|
24
|
+
def add(spec, attrs = {})
|
25
|
+
attrs = {
|
26
|
+
job: :nil,
|
27
|
+
value: 0
|
28
|
+
}.merge(attrs)
|
29
|
+
|
30
|
+
@global_specs[spec][attrs.delete(:job)] = attrs
|
31
|
+
end
|
32
|
+
|
33
|
+
# Prepare the spec information for file output
|
34
|
+
def format_uflex_global_spec(data, options = {})
|
35
|
+
options = {
|
36
|
+
spec: nil
|
37
|
+
}.update(options)
|
38
|
+
|
39
|
+
case options[:spec]
|
40
|
+
when /fgb_/i
|
41
|
+
spec_type = 'freq'
|
42
|
+
when /vgb_/i
|
43
|
+
spec_type = 'volt'
|
44
|
+
else
|
45
|
+
spec_type = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
case data
|
49
|
+
when NilClass
|
50
|
+
data_new = 0
|
51
|
+
when Fixnum, Float
|
52
|
+
case
|
53
|
+
when data == 0
|
54
|
+
data_new = data.to_s
|
55
|
+
when data.abs < 1e-6
|
56
|
+
data_new = (data * 1_000_000_000).round(4).to_s + '*nV' if spec_type == 'volt'
|
57
|
+
data_new = data.to_s if spec_type.nil?
|
58
|
+
when data.abs < 1e-3
|
59
|
+
data_new = (data * 1_000_000).round(4).to_s + '*uV' if spec_type == 'volt'
|
60
|
+
data_new = data.to_s if spec_type.nil?
|
61
|
+
when data.abs < 1
|
62
|
+
data_new = (data * 1_000).round(4).to_s + '*mV' if spec_type == 'volt'
|
63
|
+
data_new = data.to_s if spec_type.nil?
|
64
|
+
else
|
65
|
+
data_new = data.to_s + '*V' if spec_type == 'volt'
|
66
|
+
data_new = data.to_s if spec_type.nil?
|
67
|
+
end
|
68
|
+
data_new = data_new.gsub(/^/, '=')
|
69
|
+
when String
|
70
|
+
data_new = data.gsub(/^/, '=').gsub(/(\W)([a-zA-Z])/, '\1_\2')
|
71
|
+
# Remove underscores from unit designations
|
72
|
+
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)(\W)/i, '\1\2\3')
|
73
|
+
data_new.gsub!(/(\W)_(nV|uV|mV|V|nA|uA|mA|A)$/i, '\1\2')
|
74
|
+
else
|
75
|
+
Origen.log.error "Unknown class type (#{data.class}) for spec value: #{data}"
|
76
|
+
fail
|
77
|
+
end
|
78
|
+
data_new
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class Base
|
4
|
+
class Job
|
5
|
+
attr_accessor :name
|
6
|
+
attr_accessor :pinmap
|
7
|
+
attr_accessor :instances
|
8
|
+
attr_accessor :flows
|
9
|
+
attr_accessor :ac_specs
|
10
|
+
attr_accessor :dc_specs
|
11
|
+
attr_accessor :patsets
|
12
|
+
attr_accessor :patgroups
|
13
|
+
attr_accessor :bintables
|
14
|
+
attr_accessor :cz
|
15
|
+
attr_accessor :test_procs
|
16
|
+
attr_accessor :mix_sig_timing
|
17
|
+
attr_accessor :wave_defs
|
18
|
+
attr_accessor :psets
|
19
|
+
attr_accessor :signals
|
20
|
+
attr_accessor :port_map
|
21
|
+
attr_accessor :fract_bus
|
22
|
+
attr_accessor :concurrent_seq
|
23
|
+
attr_accessor :comment
|
24
|
+
|
25
|
+
def initialize(jname, options = {}) # :nodoc:
|
26
|
+
@name = jname
|
27
|
+
options[:pinmap] ? @pinmap = [options[:pinmap]] : @pinmap = []
|
28
|
+
options[:instances] ? @instances = [options[:instances]] : @instances = []
|
29
|
+
options[:flows] ? @flows = [options[:flows]] : @flows = []
|
30
|
+
options[:ac_specs] ? @ac_specs = [options[:ac_specs]] : @ac_specs = []
|
31
|
+
options[:dc_specs] ? @dc_specs = [options[:dc_specs]] : @dc_specs = []
|
32
|
+
options[:patsets] ? @patsets = [options[:patsets]] : @patsets = []
|
33
|
+
options[:patgroups] ? @patgroups = [options[:patgroups]] : @patgroups = []
|
34
|
+
options[:bintables] ? @bintables = [options[:bintables]] : @bintables = []
|
35
|
+
options[:cz] ? @cz = [options[:cz]] : @cz = []
|
36
|
+
options[:test_procs] ? @test_procs = [options[:test_procs]] : @test_procs = []
|
37
|
+
options[:mix_sig_timing] ? @mix_sig_timing = [options[:mix_sig_timing]] : @mix_sig_timing = []
|
38
|
+
options[:wave_defs] ? @wave_defs = [options[:wave_defs]] : @wave_defs = []
|
39
|
+
options[:psets] ? @psets = [options[:psets]] : @psets = []
|
40
|
+
options[:signals] ? @signals = [options[:signals]] : @signals = []
|
41
|
+
options[:port_map] ? @port_map = [options[:port_map]] : @port_map = []
|
42
|
+
options[:fract_bus] ? @fract_bus = [options[:fract_bus]] : @fract_bus = []
|
43
|
+
options[:concurrent_seq] ? @concurrent_seq = [options[:concurrent_seq]] : @concurrent_seq = []
|
44
|
+
options[:comment] ? @comment = options[:instances] : @comment = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# Assigns job information for the given object
|
48
|
+
def add_job_info(jname, options = {})
|
49
|
+
@pinmap.push(options[:pinmap]) if options[:pinmap]
|
50
|
+
@instances.push(options[:instances]) if options[:instances]
|
51
|
+
@flows.push(options[:flows]) if options[:flows]
|
52
|
+
@ac_specs.push(options[:ac_specs]) if options[:ac_specs]
|
53
|
+
@dc_specs.push(options[:dc_specs]) if options[:dc_specs]
|
54
|
+
@patsets.push(options[:patsets]) if options[:patsets]
|
55
|
+
@patgroups.push(options[:patgroups]) if options[:patgroups]
|
56
|
+
@bintables.push(options[:bintables]) if options[:bintables]
|
57
|
+
@cz.push(options[:cz]) if options[:cz]
|
58
|
+
@test_procs.push(options[:test_procs]) if options[:test_procs]
|
59
|
+
@mix_sig_timing.push(options[:mix_sig_timing]) if options[:mix_sig_timing]
|
60
|
+
@wave_defs.push(options[:wave_defs]) if options[:wave_defs]
|
61
|
+
@psets.push(options[:psets]) if options[:psets]
|
62
|
+
@signals.push(options[:signals]) if options[:signals]
|
63
|
+
@port_map.push(options[:port_map]) if options[:port_map]
|
64
|
+
@fract_bus.push(options[:fract_bus]) if options[:fract_bus]
|
65
|
+
@concurrent_seq.push(options[:concurrent_seq]) if options[:concurrent_seq]
|
66
|
+
@comment = options[:instances] if options[:instances]
|
67
|
+
end
|
68
|
+
|
69
|
+
def platform
|
70
|
+
Origen.interface.platform
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class Base
|
4
|
+
class Jobs
|
5
|
+
include ::OrigenTesters::Generator
|
6
|
+
attr_accessor :jobs
|
7
|
+
|
8
|
+
OUTPUT_PREFIX = nil
|
9
|
+
OUTPUT_POSTFIX = nil
|
10
|
+
|
11
|
+
def initialize # :nodoc:
|
12
|
+
@jobs = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(jname, options = {})
|
16
|
+
@jobs.key?(jname) ? @jobs[jname].add_job_info(jname, options) : @jobs[jname] = platform::Job.new(jname, options)
|
17
|
+
@jobs[jname]
|
18
|
+
end
|
19
|
+
|
20
|
+
def finalize(options = {})
|
21
|
+
@jobs.each do |_key, job|
|
22
|
+
job.pinmap = job.pinmap.flatten.uniq
|
23
|
+
job.instances = job.instances.flatten.uniq
|
24
|
+
job.flows = job.flows.flatten.uniq
|
25
|
+
job.ac_specs = job.ac_specs.flatten.uniq
|
26
|
+
job.dc_specs = job.dc_specs.flatten.uniq
|
27
|
+
job.patsets = job.patsets.flatten.uniq
|
28
|
+
job.patgroups = job.patgroups.flatten.uniq
|
29
|
+
job.bintables = job.bintables.flatten.uniq
|
30
|
+
job.cz = job.cz.flatten.uniq
|
31
|
+
job.test_procs = job.test_procs.flatten.uniq
|
32
|
+
job.mix_sig_timing = job.mix_sig_timing.flatten.uniq
|
33
|
+
job.wave_defs = job.wave_defs.flatten.uniq
|
34
|
+
job.psets = job.psets.flatten.uniq
|
35
|
+
job.signals = job.signals.flatten.uniq
|
36
|
+
job.port_map = job.port_map.flatten.uniq
|
37
|
+
job.fract_bus = job.fract_bus.flatten.uniq
|
38
|
+
job.concurrent_seq = job.concurrent_seq.flatten.uniq
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class Base
|
4
|
+
class References
|
5
|
+
include ::OrigenTesters::Generator
|
6
|
+
attr_accessor :references
|
7
|
+
|
8
|
+
OUTPUT_PREFIX = nil
|
9
|
+
OUTPUT_POSTFIX = nil
|
10
|
+
|
11
|
+
def initialize # :nodoc:
|
12
|
+
@references = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(reference, options = {})
|
16
|
+
options = {
|
17
|
+
comment: nil
|
18
|
+
}.merge(options)
|
19
|
+
|
20
|
+
@references << { ref: reference, comment: options[:comment] }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -6,12 +6,14 @@ module OrigenTesters
|
|
6
6
|
|
7
7
|
attr_accessor :ts
|
8
8
|
attr_accessor :ts_sheet_pins
|
9
|
+
attr_accessor :ts_basic
|
9
10
|
|
10
11
|
OUTPUT_PREFIX = 'TS'
|
11
12
|
# OUTPUT_POSTFIX = 'TS'
|
12
13
|
|
13
|
-
def initialize # :nodoc:
|
14
|
-
@ts
|
14
|
+
def initialize(options = {}) # :nodoc:
|
15
|
+
@ts = {}
|
16
|
+
@ts_basic = options[:timeset_basic]
|
15
17
|
end
|
16
18
|
|
17
19
|
def add(tsname, pin, esname, options = {})
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class Base
|
4
|
+
class TimesetsBasic
|
5
|
+
include ::OrigenTesters::Generator
|
6
|
+
|
7
|
+
attr_accessor :ts
|
8
|
+
attr_accessor :ts_sheet_pins
|
9
|
+
attr_accessor :ts_basic
|
10
|
+
|
11
|
+
OUTPUT_PREFIX = 'TSB'
|
12
|
+
# OUTPUT_POSTFIX = 'TS'
|
13
|
+
|
14
|
+
def initialize(options = {}) # :nodoc:
|
15
|
+
@ts = {}
|
16
|
+
@ts_basic = options[:timeset_basic]
|
17
|
+
end
|
18
|
+
|
19
|
+
def add(tsname, pin, esname, options = {})
|
20
|
+
tsname = tsname.to_sym unless tsname.is_a? Symbol
|
21
|
+
pin = pin.to_sym unless pin.is_a? Symbol
|
22
|
+
esname = pin.to_sym unless esname.is_a? Symbol
|
23
|
+
@ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
|
24
|
+
@ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
|
25
|
+
@ts[tsname]
|
26
|
+
end
|
27
|
+
|
28
|
+
def finalize(options = {})
|
29
|
+
end
|
30
|
+
|
31
|
+
# Populate an array of pins based on the pin or pingroup
|
32
|
+
def get_pin_objects(grp)
|
33
|
+
pins = []
|
34
|
+
if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
|
35
|
+
Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
|
36
|
+
pins << Origen.top_level.pin(grp)
|
37
|
+
elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
|
38
|
+
Origen.top_level.pin(grp).each do |pin|
|
39
|
+
pins << pin
|
40
|
+
end
|
41
|
+
else
|
42
|
+
Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
|
43
|
+
end
|
44
|
+
pins
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class UltraFLEX
|
4
|
+
require 'origen_testers/igxl_based_tester/base/global_specs'
|
5
|
+
class GlobalSpecs < Base::GlobalSpecs
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class UltraFLEX
|
4
|
+
require 'origen_testers/igxl_based_tester/base/jobs'
|
5
|
+
class Jobs < Base::Jobs
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class UltraFLEX
|
4
|
+
require 'origen_testers/igxl_based_tester/base/references'
|
5
|
+
class References < Base::References
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= "DTACSpecSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tAC Specs" %>
|
7
7
|
<%= "" %>
|
8
8
|
<%= "\t\t\tSelector\t\t#{specset_names}" %>
|
9
|
-
<%= "\tSymbol\tValue\tName\tVal\t#{categories}" %>
|
9
|
+
<%= "\tSymbol\tValue\tName\tVal\t#{categories}Comment" %>
|
10
10
|
%
|
11
11
|
% # Gather spec selectors
|
12
12
|
% selectors = []
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= "DTDCSpecSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tDC Specs" %>
|
7
7
|
<%= "" %>
|
8
8
|
<%= "\t\t\tSelector\t\t#{specset_names}" %>
|
9
|
-
<%= "\tSymbol\tValue\tName\tVal\t#{categories}" %>
|
9
|
+
<%= "\tSymbol\tValue\tName\tVal\t#{categories}Comment" %>
|
10
10
|
%
|
11
11
|
% # Gather spec selectors
|
12
12
|
% selectors = []
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%= "DTGlobalSpecSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tGlobal Specs" %>
|
2
|
+
<%= "" %>
|
3
|
+
<%= "\tSymbol\tJob\tValue\tComment" %>
|
4
|
+
<%= "\tVcl_default\t\t-1\tDetector clamp voltage low" %>
|
5
|
+
<%= "\tVch_default\t\t6\tDetector clamp voltage high" %>
|
6
|
+
<%= "\tVph_default\t\t5\t" %>
|
7
|
+
%
|
8
|
+
% # Gather spec values per category for each spec/specset
|
9
|
+
% global_specs.sort.each do |next_spec, jobs|
|
10
|
+
% jobs.each do |job, attrs|
|
11
|
+
% value = format_uflex_global_spec(attrs[:value], spec: next_spec)
|
12
|
+
% comnt = attrs[:comment]
|
13
|
+
<%= "\t#{next_spec}\t#{job}\t#{value}\t#{comnt}" %>
|
14
|
+
% end
|
15
|
+
% end
|
16
|
+
%
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= "DTJobListSheet,version=2.5:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tJob List" %>
|
2
|
+
<%= "" %>
|
3
|
+
<%= "\t\tSheet Parameters\t" %>
|
4
|
+
<%= "\tJob Name\tPin Map\tTest Instances\tFlow Table\tAC Specs\tDC Specs\tPattern Sets\tPattern Groups\tBin Table\tCharacterization\tTest Procedures\tMixed Signal Timing\tWave Definitions\tPsets\tSignals\tPort Map\tFractional Bus\tConcurrent Sequence\tComment" %>
|
5
|
+
% @jobs.each do |_key, job|
|
6
|
+
% name = job.name
|
7
|
+
% pinmap = job.pinmap.join(',')
|
8
|
+
% instances = job.instances.join(',')
|
9
|
+
% flows = job.flows.join(',')
|
10
|
+
% ac_specs = job.ac_specs.join(',')
|
11
|
+
% dc_specs = job.dc_specs.join(',')
|
12
|
+
% patsets = job.patsets.join(',')
|
13
|
+
% patgroups = job.patgroups.join(',')
|
14
|
+
% bintables = job.bintables.join(',')
|
15
|
+
% cz = job.cz.join(',')
|
16
|
+
% test_procs = job.test_procs.join(',')
|
17
|
+
% mix_sig_timing = job.mix_sig_timing.join(',')
|
18
|
+
% wave_defs = job.wave_defs.join(',')
|
19
|
+
% psets = job.psets.join(',')
|
20
|
+
% signals = job.signals.join(',')
|
21
|
+
% port_map = job.port_map.join(',')
|
22
|
+
% fract_bus = job.fract_bus.join(',')
|
23
|
+
% concurrent_seq = job.concurrent_seq.join(',')
|
24
|
+
% comment = job.comment
|
25
|
+
<%= "\t#{name}\t#{pinmap}\t#{instances}\t#{flows}\t#{ac_specs}\t#{dc_specs}\t#{patsets}\t#{patgroups}\t#{bintables}\t#{cz}\t#{test_procs}\t#{mix_sig_timing}\t#{wave_defs}\t#{signals}\t#{port_map}\t#{fract_bus}\t#{concurrent_seq}\t#{comment}" %>
|
26
|
+
% end
|
27
|
+
%
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= "DTReferencesSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tReferences" %>
|
2
|
+
<%= "" %>
|
3
|
+
<%= "\tFile Path\tComment\t" %>
|
4
|
+
% @references.each do |reference|
|
5
|
+
% ref = reference[:ref]
|
6
|
+
% comment = reference[:comment]
|
7
|
+
<%= "\t#{ref}\t#{comment}" %>
|
8
|
+
% end
|
9
|
+
%
|
@@ -0,0 +1,149 @@
|
|
1
|
+
% line_cnt = 8
|
2
|
+
% print_hdr = true
|
3
|
+
%
|
4
|
+
% ## Hash Autovivification
|
5
|
+
% l = ->(h, k) { h[k] = Hash.new(&l) }
|
6
|
+
% eset_eqns = Hash.new(&l)
|
7
|
+
% eset_eqns_print = Hash.new(&l)
|
8
|
+
% tset_eqns = Hash.new(&l)
|
9
|
+
% tset_pin_list = []
|
10
|
+
%
|
11
|
+
% # Look up edge information in the corresponding Edgesets sheet
|
12
|
+
% edgesets = Origen.interface.edgeset_sheets[@filename]
|
13
|
+
% @ts_sheet_pins.each do |grp|
|
14
|
+
% if Origen.top_level.has_pin?(grp)
|
15
|
+
% pin_ary = get_pin_objects(grp)
|
16
|
+
% pin_ary.each do |next_pin|
|
17
|
+
% pin_nam = Origen.top_level.pin(next_pin.id).name
|
18
|
+
% found_pin_eqn = false
|
19
|
+
% edgesets.es.keys.each do |eset|
|
20
|
+
% if edgesets.es[eset].pins.key?(pin_nam)
|
21
|
+
% eset_eqns[grp][eset][pin_nam] = edgesets.es[eset].pins[pin_nam]
|
22
|
+
% eset_eqns_print[grp][pin_nam][eset] = edgesets.es[eset].pins[pin_nam]
|
23
|
+
% found_pin_eqn = true
|
24
|
+
% end
|
25
|
+
% end
|
26
|
+
% unless found_pin_eqn
|
27
|
+
% Origen.log.error "GRP #{grp}, PIN #{pin_nam}: Pin timing is not defined in any edgesets"
|
28
|
+
% next
|
29
|
+
% end
|
30
|
+
% end
|
31
|
+
% else
|
32
|
+
% Origen.log.error "Undefined pin/pingroup in pattern header (#{grp})"
|
33
|
+
% end
|
34
|
+
% end
|
35
|
+
%
|
36
|
+
% eset_eqns.keys.each do |grp|
|
37
|
+
% grp_edge_same = true
|
38
|
+
% eset_eqns[grp].keys.each do |eset_key|
|
39
|
+
% grp_edge = nil
|
40
|
+
% pin_ary = get_pin_objects(grp)
|
41
|
+
% pin_ary.each do |next_pin|
|
42
|
+
% pin_nam = Origen.top_level.pin(next_pin.id).name
|
43
|
+
% if eset_eqns[grp][eset_key].key?(pin_nam)
|
44
|
+
% if grp_edge.nil?
|
45
|
+
% grp_edge = eset_eqns[grp][eset_key][pin_nam]
|
46
|
+
% elsif !edgesets.edges_eql?(grp_edge, eset_eqns[grp][eset_key][pin_nam])
|
47
|
+
% grp_edge_same = false
|
48
|
+
% end
|
49
|
+
% else
|
50
|
+
% grp_edge_same = false
|
51
|
+
% end
|
52
|
+
% end
|
53
|
+
% end
|
54
|
+
%
|
55
|
+
% pin_grp_done = false
|
56
|
+
% eset_eqns_print[grp].keys.each do |pin_nam|
|
57
|
+
% pin_grp_done ? break : nil
|
58
|
+
% eset_eqns_print[grp][pin_nam].keys.each do |eset|
|
59
|
+
% clk_per = edgesets.es[eset].pins[pin_nam].clk_per
|
60
|
+
% clk_per = edgesets.format_uflex_edge(clk_per, line_cnt)
|
61
|
+
% if print_hdr
|
62
|
+
% print_hdr = false
|
63
|
+
% tim_mode = edgesets.es[eset].t_mode
|
64
|
+
% end
|
65
|
+
% if grp_edge_same
|
66
|
+
% tset_pin_list.push(grp) unless tset_pin_list.include?(grp)
|
67
|
+
% pin_grp_done = true
|
68
|
+
% else
|
69
|
+
% tset_pin_list.push(pin_nam) unless tset_pin_list.include?(pin_nam)
|
70
|
+
% end
|
71
|
+
% end
|
72
|
+
% end
|
73
|
+
% end
|
74
|
+
%
|
75
|
+
% # Print equations for all pins and pingroups in the pin header
|
76
|
+
% @ts.keys.each do |tset|
|
77
|
+
% t_mode = ''
|
78
|
+
% period = ''
|
79
|
+
% @ts_sheet_pins.each do |grp|
|
80
|
+
% if Origen.top_level.has_pin?(grp)
|
81
|
+
% pin_ary = get_pin_objects(grp)
|
82
|
+
% pin_ary.each do |next_pin|
|
83
|
+
% pin_nam = Origen.top_level.pin(next_pin.id).name
|
84
|
+
% # If the edgeset for this pin is already specified within the timeset- apply it here
|
85
|
+
% if @ts[tset].pins.key?(pin_nam)
|
86
|
+
% tset_eqns[tset][grp][pin_nam] = @ts[tset].pins[pin_nam]
|
87
|
+
% else
|
88
|
+
% Origen.log.error "TSET #{tset}, PIN #{pin_nam}: Pin timing cannot be found"
|
89
|
+
% next
|
90
|
+
% end
|
91
|
+
% end
|
92
|
+
% else
|
93
|
+
% Origen.log.error "Undefined pin/pingroup in pattern header (#{grp})"
|
94
|
+
% end
|
95
|
+
% end
|
96
|
+
% end
|
97
|
+
%
|
98
|
+
% print_hdr = true
|
99
|
+
% tset_eqns.keys.each do |tset_key|
|
100
|
+
% tset_eqns[tset_key].keys.each do |grp|
|
101
|
+
% tset_eqns[tset_key][grp].keys.each do |pin_nam|
|
102
|
+
% eset = @ts[tset_key].pins[pin_nam]
|
103
|
+
% edge = edgesets.es[eset].pins[pin_nam]
|
104
|
+
% data_src = edge.d_src
|
105
|
+
% data_fmt = edge.d_fmt
|
106
|
+
% drv_on = edge.d0_edge
|
107
|
+
% drv_data = edge.d1_edge
|
108
|
+
% drv_ret = edge.d2_edge
|
109
|
+
% drv_off = edge.d3_edge
|
110
|
+
% cmp_mode = edge.c_mode
|
111
|
+
% cmp_open = edge.c1_edge
|
112
|
+
% cmp_close = edge.c2_edge
|
113
|
+
% tim_res = edge.t_res
|
114
|
+
% clk_per = edge.clk_per
|
115
|
+
% drv_on = edgesets.format_uflex_edge_tsb(drv_on, line_cnt)
|
116
|
+
% drv_data = edgesets.format_uflex_edge_tsb(drv_data, line_cnt)
|
117
|
+
% drv_ret = edgesets.format_uflex_edge_tsb(drv_ret, line_cnt)
|
118
|
+
% drv_off = edgesets.format_uflex_edge_tsb(drv_off, line_cnt)
|
119
|
+
% cmp_open = edgesets.format_uflex_edge_tsb(cmp_open, line_cnt)
|
120
|
+
% cmp_close = edgesets.format_uflex_edge_tsb(cmp_close, line_cnt)
|
121
|
+
% clk_per = edgesets.format_uflex_edge_tsb(clk_per, line_cnt, no_disable: true)
|
122
|
+
% clk_per == '' ? setup = 'i/o' : setup = 'clock'
|
123
|
+
%
|
124
|
+
% tset_per = edgesets.es[eset].period
|
125
|
+
% tset_per = edgesets.format_uflex_edge_tsb(tset_per, line_cnt)
|
126
|
+
% if print_hdr
|
127
|
+
% print_hdr = false
|
128
|
+
% tim_mode = @ts[tset_key].t_mode
|
129
|
+
% master_ts = @ts[tset_key].master_ts
|
130
|
+
<%= "DTTimesetBasicSheet,version=2.3:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tTime Sets (Basic)" %>
|
131
|
+
<%= "" %>
|
132
|
+
<%= "\tTiming Mode:\t#{tim_mode}\t\tMaster Timeset Name:\t" %>
|
133
|
+
<%= "\tTime Domain:\t\t\tStrobe Ref Setup Name:" %>
|
134
|
+
<%= "" %>
|
135
|
+
<%= "\t\tCycle\tPin/Group\t\t\tData\t\tDrive\t\t\t\tCompare\t\t\t\tEdge Resolution" %>
|
136
|
+
<%= "\tTime Set\tPeriod\tName\tClock Period\tSetup\tSrc\tFmt\tOn\tData\tReturn\tOff\tMode\tOpen\tClose\tRef Offset\tMode\tComment" %>
|
137
|
+
% end
|
138
|
+
% if tset_pin_list.include?(grp)
|
139
|
+
<%= "\t#{tset_key}\t#{tset_per}\t#{grp}\t#{clk_per}\t#{setup}\t#{data_src}\t#{data_fmt}\t#{drv_on}\t#{drv_data}\t#{drv_ret}\t#{drv_off}\t#{cmp_mode}\t#{cmp_open}\t#{cmp_close}\t\t#{tim_res}\t" %>
|
140
|
+
% line_cnt += 1
|
141
|
+
% break
|
142
|
+
% elsif tset_pin_list.include?(pin_nam)
|
143
|
+
<%= "\t#{tset_key}\t#{tset_per}\t#{pin_nam}\t#{clk_per}\t#{setup}\t#{data_src}\t#{data_fmt}\t#{drv_on}\t#{drv_data}\t#{drv_ret}\t#{drv_off}\t#{cmp_mode}\t#{cmp_open}\t#{cmp_close}\t\t#{tim_res}\t" %>
|
144
|
+
% line_cnt += 1
|
145
|
+
% end
|
146
|
+
% end
|
147
|
+
% end
|
148
|
+
% end
|
149
|
+
%
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module IGXLBasedTester
|
3
|
+
class UltraFLEX
|
4
|
+
require 'origen_testers/igxl_based_tester/base/timesets_basic'
|
5
|
+
class TimesetsBasic < Base::TimesetsBasic
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -13,7 +13,14 @@ module Origen
|
|
13
13
|
# Create a call stack of flows so that we can work out where the nodes
|
14
14
|
# of the ATP AST originated from
|
15
15
|
def create(options = {}, &block)
|
16
|
-
|
16
|
+
# Patch for Windows operation since the path can start with something like "C:/"
|
17
|
+
if caller[0] =~ /(:(\/|\\))/
|
18
|
+
orig_separator = Regexp.last_match(1)
|
19
|
+
file, line = *caller[0].sub(/:(\/|\\)/, '_ORIG_SEPARATOR_').split(':')
|
20
|
+
file = file.sub('_ORIG_SEPARATOR_', orig_separator)
|
21
|
+
else
|
22
|
+
file, line = *caller[0].split(':')
|
23
|
+
end
|
17
24
|
OrigenTesters::Flow.callstack << file
|
18
25
|
flow_comments, comments = *_extract_comments(OrigenTesters::Flow.callstack.last, line.to_i)
|
19
26
|
OrigenTesters::Flow.comment_stack << comments
|
@@ -338,9 +338,18 @@ module OrigenTesters
|
|
338
338
|
}.merge(options)
|
339
339
|
pin_list = ordered_pins.map do |p|
|
340
340
|
if Origen.app.pin_pattern_order.include?(p.id)
|
341
|
-
|
341
|
+
# specified name overrides pin name
|
342
|
+
if (p.is_a?(Origen::Pins::PinCollection) && p.size > 1) || p.id != p.name
|
343
|
+
p.id.to_s # groups or aliases can be lower case
|
344
|
+
else
|
345
|
+
p.id.to_s.upcase # pins must be uppercase
|
346
|
+
end
|
342
347
|
else
|
343
|
-
p.
|
348
|
+
if (p.is_a?(Origen::Pins::PinCollection) && p.size > 1) || p.id != p.name
|
349
|
+
p.name.to_s # groups or aliases can be lower case
|
350
|
+
else
|
351
|
+
p.name.to_s.upcase # pins must be uppercase
|
352
|
+
end
|
344
353
|
end
|
345
354
|
end.join(' ')
|
346
355
|
microcode "FORMAT #{pin_list};"
|
@@ -169,7 +169,7 @@ module OrigenTesters
|
|
169
169
|
pin = options.delete(:pin)
|
170
170
|
edge = options.delete(:edge)
|
171
171
|
|
172
|
-
@edgeset = edgesets(sheet_name)
|
172
|
+
@edgeset = edgesets(sheet_name, options)
|
173
173
|
@edgeset.add(edgeset, pin, edge, options)
|
174
174
|
collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
|
175
175
|
end
|
@@ -183,7 +183,7 @@ module OrigenTesters
|
|
183
183
|
pin = options.delete(:pin)
|
184
184
|
eset = options.delete(:eset)
|
185
185
|
|
186
|
-
@timeset = timesets(sheet_name)
|
186
|
+
@timeset = timesets(sheet_name, options)
|
187
187
|
@timeset.add(timeset, pin, eset, options)
|
188
188
|
end
|
189
189
|
|
@@ -331,6 +331,47 @@ module OrigenTesters
|
|
331
331
|
ss.add(var, options)
|
332
332
|
end
|
333
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
|
334
375
|
end
|
335
376
|
end
|
336
377
|
end
|
data/program/uflex_resources.rb
CHANGED
@@ -93,6 +93,30 @@ Resources.create do
|
|
93
93
|
timeset :func, timeset: :jtag, pin: :tdi, eset: :es_jtag
|
94
94
|
timeset :func, timeset: :jtag, pin: :tdo, eset: :es_jtag
|
95
95
|
|
96
|
+
# Now repeat the timing generation process to create a timeset_basic sheet
|
97
|
+
edgeset :func_tsb, edgeset: :default, pin: :tclk, edge: edge_collection.edges[:default][:default], spec_sheet: :func, es_sheet_pins: timing_sheet_pins, timeset_basic: true
|
98
|
+
edgeset :func_tsb, edgeset: :default, pin: :tms, edge: edge_collection.edges[:default][:default], spec_sheet: :func
|
99
|
+
edgeset :func_tsb, edgeset: :default, pin: :tdi, edge: edge_collection.edges[:default][:default], spec_sheet: :func
|
100
|
+
edgeset :func_tsb, edgeset: :default, pin: :tdo, edge: edge_collection.edges[:default][:default], spec_sheet: :func
|
101
|
+
# * now assign pins some more meaningful timing for JTAG operation...
|
102
|
+
edgeset :func_tsb, edgeset: :es_jtag, pin: :tclk, edge: edge_collection.edges[:clock][:clk], spec_sheet: :func, es_sheet_pins: timing_sheet_pins, timeset_basic: true
|
103
|
+
edgeset :func_tsb, edgeset: :es_jtag, pin: :tms, edge: edge_collection.edges[:input][:default], spec_sheet: :func
|
104
|
+
edgeset :func_tsb, edgeset: :es_jtag, pin: :tdi, edge: edge_collection.edges[:input][:default], spec_sheet: :func
|
105
|
+
edgeset :func_tsb, edgeset: :es_jtag, pin: :tdo, edge: edge_collection.edges[:output][:default], spec_sheet: :func
|
106
|
+
|
107
|
+
# Assign edges to the pins for timeset sheet ':func'
|
108
|
+
# * first a :default timeset
|
109
|
+
# FORMAT: timeset <timset sheet name>, timeset: <timeset>, pin: <pin_name>, eset: <edgeset name>, ts_sheet_pins: <array of pins>
|
110
|
+
timeset :func_tsb, timeset: :default, pin: :tclk, eset: :default, ts_sheet_pins: timing_sheet_pins, timeset_basic: true
|
111
|
+
timeset :func_tsb, timeset: :default, pin: :tms, eset: :default
|
112
|
+
timeset :func_tsb, timeset: :default, pin: :tdi, eset: :default
|
113
|
+
timeset :func_tsb, timeset: :default, pin: :tdo, eset: :default
|
114
|
+
# * now a :jtag timeset
|
115
|
+
timeset :func_tsb, timeset: :jtag, pin: :tclk, eset: :es_jtag, ts_sheet_pins: timing_sheet_pins, timeset_basic: true
|
116
|
+
timeset :func_tsb, timeset: :jtag, pin: :tms, eset: :es_jtag
|
117
|
+
timeset :func_tsb, timeset: :jtag, pin: :tdi, eset: :es_jtag
|
118
|
+
timeset :func_tsb, timeset: :jtag, pin: :tdo, eset: :es_jtag
|
119
|
+
|
96
120
|
# * now define a few more AC specs and values
|
97
121
|
ac_specset :func, 'cycle', specset: :func_100MHz, nom: { min: '9*ns', typ: '10*ns', max: '11*ns' }
|
98
122
|
ac_specset :func, 'cycle', specset: :func_125MHz, nom: { min: '7*ns', typ: '8*ns', max: '9*ns' }
|
@@ -151,9 +175,25 @@ Resources.create do
|
|
151
175
|
levelset :func, pin: :tdi, level: level_collection.pin_group[:pin_type1], spec_sheet: :func
|
152
176
|
levelset :func, pin: :tdo, level: level_collection.pin_group[:pin_type2], spec_sheet: :func
|
153
177
|
|
154
|
-
# * now define a few more
|
178
|
+
# * now define a few more DC specs and values
|
155
179
|
dc_specset :func, 'vdd_main_val', specset: :power_down_levels, min: { min: '0.1*V' }, nom: { typ: '0.2*V' }, max: { max: '0.3*V' }
|
156
180
|
dc_specset :func, 'vdd_alt_val', specset: :power_down_levels, min: { min: '7*V' }, nom: { typ: '8*V' }, max: { max: '9*V' }
|
157
181
|
dc_specset :func, 'current1', specset: :power_up_levels, min: { min: '1*mA' }, nom: { typ: '2*mA' }, max: { max: '3*mA' }
|
158
182
|
dc_specset :func, 'voltage1', specset: :power_up_levels, min: { min: '4*mV' }, nom: { typ: '5*mV' }, max: { max: '6*mV' }
|
183
|
+
|
184
|
+
# Define some global variables that will generate a Globals sheet
|
185
|
+
global_spec :spec1, job: 'FT', value: '17', comment: 'entering spec1'
|
186
|
+
global_spec :spec2, job: 'WT', value: '18', comment: 'entering spec2'
|
187
|
+
global_spec :spec3, job: 'FT1', value: '19', comment: 'entering spec3'
|
188
|
+
global_spec :spec4, job: 'WT1', value: '20', comment: 'entering spec4'
|
189
|
+
|
190
|
+
# Collect all the currently generated sheets and include them in the FT job
|
191
|
+
job_def 'FT'
|
192
|
+
|
193
|
+
# Add a couple additional flow sheets to define the WT job
|
194
|
+
job_def 'WT', flows: ['WT_flow1', 'WT_flow2']
|
195
|
+
|
196
|
+
# Add a couple of files to the references sheet
|
197
|
+
reference '.\inc\file1.xla', comment: 'Block1'
|
198
|
+
reference '.\inc\file2.xla', comment: 'Block2'
|
159
199
|
end
|
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.
|
4
|
+
version: 0.7.0.pre0
|
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-04
|
11
|
+
date: 2016-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -151,6 +151,9 @@ files:
|
|
151
151
|
- lib/origen_testers/igxl_based_tester/base/flow.rb
|
152
152
|
- lib/origen_testers/igxl_based_tester/base/flow_line.rb
|
153
153
|
- lib/origen_testers/igxl_based_tester/base/generator.rb
|
154
|
+
- lib/origen_testers/igxl_based_tester/base/global_specs.rb
|
155
|
+
- lib/origen_testers/igxl_based_tester/base/job.rb
|
156
|
+
- lib/origen_testers/igxl_based_tester/base/jobs.rb
|
154
157
|
- lib/origen_testers/igxl_based_tester/base/level_io_se.rb
|
155
158
|
- lib/origen_testers/igxl_based_tester/base/level_supply.rb
|
156
159
|
- lib/origen_testers/igxl_based_tester/base/levels.rb
|
@@ -164,12 +167,14 @@ files:
|
|
164
167
|
- lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb
|
165
168
|
- lib/origen_testers/igxl_based_tester/base/patsubrs.rb
|
166
169
|
- lib/origen_testers/igxl_based_tester/base/pinmap.rb
|
170
|
+
- lib/origen_testers/igxl_based_tester/base/references.rb
|
167
171
|
- lib/origen_testers/igxl_based_tester/base/test_instance.rb
|
168
172
|
- lib/origen_testers/igxl_based_tester/base/test_instance_group.rb
|
169
173
|
- lib/origen_testers/igxl_based_tester/base/test_instances.rb
|
170
174
|
- lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb
|
171
175
|
- lib/origen_testers/igxl_based_tester/base/timeset.rb
|
172
176
|
- lib/origen_testers/igxl_based_tester/base/timesets.rb
|
177
|
+
- lib/origen_testers/igxl_based_tester/base/timesets_basic.rb
|
173
178
|
- lib/origen_testers/igxl_based_tester/files.rb
|
174
179
|
- lib/origen_testers/igxl_based_tester/j750.rb
|
175
180
|
- lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb
|
@@ -235,6 +240,9 @@ files:
|
|
235
240
|
- lib/origen_testers/igxl_based_tester/ultraflex/flow.rb
|
236
241
|
- lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb
|
237
242
|
- lib/origen_testers/igxl_based_tester/ultraflex/generator.rb
|
243
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb
|
244
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/job.rb
|
245
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb
|
238
246
|
- lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb
|
239
247
|
- lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb
|
240
248
|
- lib/origen_testers/igxl_based_tester/ultraflex/levels.rb
|
@@ -248,22 +256,28 @@ files:
|
|
248
256
|
- lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb
|
249
257
|
- lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb
|
250
258
|
- lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb
|
259
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/references.rb
|
251
260
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb
|
252
261
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb
|
253
262
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb
|
254
263
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb
|
264
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb
|
255
265
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb
|
266
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb
|
256
267
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb
|
257
268
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb
|
258
269
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb
|
259
270
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb
|
260
271
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb
|
272
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb
|
261
273
|
- lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb
|
274
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb
|
262
275
|
- lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb
|
263
276
|
- lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb
|
264
277
|
- lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb
|
265
278
|
- lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb
|
266
279
|
- lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb
|
280
|
+
- lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb
|
267
281
|
- lib/origen_testers/interface.rb
|
268
282
|
- lib/origen_testers/no_interface.rb
|
269
283
|
- lib/origen_testers/origen_ext/application/runner.rb
|
@@ -385,7 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
385
399
|
version: 1.8.11
|
386
400
|
requirements: []
|
387
401
|
rubyforge_project:
|
388
|
-
rubygems_version: 2.
|
402
|
+
rubygems_version: 2.2.2
|
389
403
|
signing_key:
|
390
404
|
specification_version: 4
|
391
405
|
summary: This plugin provides Origen tester models to drive ATE type testers like
|