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.
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