origen_testers 0.6.2 → 0.7.0.pre0
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/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
|