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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/config/version.rb +3 -3
  3. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +35 -2
  4. data/lib/origen_testers/igxl_based_tester/base/generator.rb +139 -8
  5. data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -0
  6. data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -0
  7. data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -0
  8. data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -0
  9. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +4 -2
  10. data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -0
  11. data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -0
  12. data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -0
  13. data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -0
  14. data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -0
  15. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +1 -1
  16. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +1 -1
  17. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +16 -0
  18. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +27 -0
  19. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +9 -0
  20. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -3
  21. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +149 -0
  22. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -0
  23. data/lib/origen_testers/origen_ext/generator/flow.rb +8 -1
  24. data/lib/origen_testers/smartest_based_tester/base.rb +11 -2
  25. data/lib/origen_testers/test/ultraflex_interface.rb +43 -2
  26. data/program/uflex_resources.rb +41 -1
  27. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0524bd3b9dcda3774bc4706e48424c78916dbb12
4
- data.tar.gz: 69936620a27996baa2f35b6b29b146bba5600887
3
+ metadata.gz: a90943f4feeb9a5fd74e0660e8bbbc068d2b0aa0
4
+ data.tar.gz: 0d0334819d9b766a4030e712ae4070074262b350
5
5
  SHA512:
6
- metadata.gz: 31739d766e3a770470d3e161fe5199878ebdbdf128dcac921a691c1ad3eefdd2be492e6f51fa84ec244a41c679d36e0351c8e04f105036d9f24a536406c6b607
7
- data.tar.gz: 02d4488626b3833b946edf4c0302ad06432115c02eb40d7648058c48e9107ab7e07c008a5c2555376d6ab81300bbf25b3e0d70ab76210eac44d5d7f9f140db8f
6
+ metadata.gz: 9813effc8d620fe3b6279b88d6ad0176449cb31712f0cfd4789fbc22005f1ea3f1c86fcd001f988189b2717fe9999c22d1ba462bb157638f1e207bcf881acba6
7
+ data.tar.gz: 8f480ad0212eb967200d833ea721ed7d002326a6b7a08988b794afe379ee0766c3debdb8061d6844bd910f389675a62916a46526140e360ff2277140662e42a5
data/config/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module OrigenTesters
2
2
  MAJOR = 0
3
- MINOR = 6
4
- BUGFIX = 2
5
- DEV = nil
3
+ MINOR = 7
4
+ BUGFIX = 0
5
+ DEV = 0
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
8
  end
@@ -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, or AC/DC specset sheet.
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, edgeset_sheets, timeset_sheets, levelset_sheets,
261
- ac_specset_sheets, dc_specset_sheets].each do |sheets|
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
- t = platform::Timesets.new
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,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/job'
5
+ class Job < Base::Job
6
+ end
7
+ end
8
+ end
9
+ 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
+ %
@@ -8,9 +8,6 @@
8
8
  % tset_eqns = Hash.new(&l)
9
9
  % tset_pin_list = []
10
10
  %
11
- % # binding.pry
12
- %
13
- %
14
11
  % # Look up edge information in the corresponding Edgesets sheet
15
12
  % edgesets = Origen.interface.edgeset_sheets[@filename]
16
13
  % @ts_sheet_pins.each do |grp|
@@ -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
- file, line = *caller[0].split(':')
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
- p.id.to_s.upcase # specified name overrides pin name
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.name.to_s.upcase
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
@@ -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 AC specs and values
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.6.2
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-08 00:00:00.000000000 Z
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.6.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