origen_testers 0.5.7 → 0.6.0

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/config/shared_commands.rb +6 -0
  3. data/config/version.rb +2 -2
  4. data/lib/commands/run.rb +44 -0
  5. data/lib/origen_testers.rb +19 -1
  6. data/lib/origen_testers/flow.rb +382 -0
  7. data/lib/origen_testers/generator.rb +32 -29
  8. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
  9. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
  10. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
  11. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
  12. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
  13. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
  14. data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
  15. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
  16. data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
  17. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
  18. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
  19. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
  20. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
  21. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
  22. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
  23. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
  24. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
  25. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
  26. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
  27. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
  28. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
  29. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
  30. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
  31. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
  32. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
  33. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
  34. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
  35. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
  36. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
  37. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
  39. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
  40. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
  41. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
  42. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
  43. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
  44. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
  45. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
  46. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
  47. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
  48. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
  49. data/lib/origen_testers/interface.rb +41 -6
  50. data/lib/origen_testers/no_interface.rb +7 -0
  51. data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
  52. data/lib/origen_testers/origen_ext/generator.rb +37 -0
  53. data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
  54. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
  55. data/lib/origen_testers/program_generators.rb +0 -1
  56. data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
  57. data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
  58. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
  59. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
  60. data/lib/origen_testers/test/dut.rb +5 -0
  61. data/lib/origen_testers/test/j750_base_interface.rb +0 -3
  62. data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
  63. data/lib/origen_testers/test/v93k_interface.rb +5 -23
  64. data/program/components/_temp.rb +6 -0
  65. data/program/flow_control.rb +190 -62
  66. data/program/prb1.rb +13 -50
  67. data/program/prb2.rb +0 -16
  68. data/program/test.rb +12 -3
  69. data/program/uflex_resources.rb +159 -0
  70. metadata +66 -16
  71. data/lib/origen_testers/doc.rb +0 -224
  72. data/lib/origen_testers/doc/generator.rb +0 -124
  73. data/lib/origen_testers/doc/generator/flow.rb +0 -69
  74. data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
  75. data/lib/origen_testers/doc/generator/test.rb +0 -66
  76. data/lib/origen_testers/doc/generator/test_group.rb +0 -64
  77. data/lib/origen_testers/doc/generator/tests.rb +0 -45
  78. data/lib/origen_testers/doc/model.rb +0 -160
  79. data/lib/origen_testers/generator/flow_control_api.rb +0 -611
  80. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
  81. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +0 -9
@@ -1,476 +0,0 @@
1
- module OrigenTesters
2
- module SmartestBasedTester
3
- class Base
4
- class FlowNode
5
- attr_accessor :type, :id, :rendered, :parent, :deleted
6
- alias_method :rendered?, :rendered
7
- alias_method :deleted?, :deleted
8
- attr_reader :flow
9
-
10
- TYPES = [:run, :run_and_branch, :print, :print_to_datalog, :good_bin, :bad_bin, :group,
11
- :assign_value, :if_then
12
- ]
13
-
14
- ATTRS = {
15
- good_bin: {
16
- soft_bin: nil,
17
- soft_bin_desc: nil,
18
- bin: nil,
19
- bin_desc: nil,
20
- bin_type: :good,
21
- reprobe: false,
22
- color: :green,
23
- overon: true
24
- },
25
- bad_bin: {
26
- soft_bin: nil,
27
- soft_bin_desc: 'fail',
28
- bin: nil,
29
- bin_desc: nil,
30
- bin_type: :bad,
31
- reprobe: false,
32
- color: :red,
33
- overon: true
34
- },
35
- run: {
36
- nodes: [],
37
- else_nodes: [],
38
- test_suite: nil,
39
- id: nil
40
- },
41
- run_and_branch: {
42
- nodes: [],
43
- else_nodes: [],
44
- test_suite: nil,
45
- id: nil
46
- },
47
- if_then: {
48
- condition: nil,
49
- nodes: [],
50
- else_nodes: []
51
- },
52
- print: {
53
- value: nil
54
- },
55
- print_to_datalog: {
56
- value: nil
57
- },
58
- group: {
59
- name: nil,
60
- nodes: [],
61
- comment: nil,
62
- bypass: nil
63
- },
64
- assign_value: {
65
- variable: nil,
66
- value: nil
67
- }
68
- }
69
-
70
- ALIASES = {
71
- good_bin: {
72
- sbin: :soft_bin,
73
- softbin: :soft_bin
74
- },
75
- bad_bin: {
76
- sbin: :soft_bin,
77
- softbin: :soft_bin
78
- }
79
- }
80
-
81
- def parent
82
- @parent || flow.collection
83
- end
84
-
85
- # Call this instead of FlowNode.new, this will return a dedicated object for the given
86
- # type if one exists, otherwise it will instantiate a generic FlowNode object
87
- def self.create(flow, type, attrs = {})
88
- unless TYPES.include?(type)
89
- fail "Uknown flow node type :#{type}, valid types are #{TYPES.map { |t| ':' + t.to_s }.join(', ')}"
90
- end
91
- attrs[:_flow] = flow
92
- attrs[:called_internally] = true
93
- FlowNode.new(type, attrs)
94
- end
95
-
96
- def initialize(type, attrs = {})
97
- unless attrs.delete(:called_internally)
98
- fail "Don't use FlowNode.new, use FlowNode.create instead"
99
- end
100
- @flow = attrs.delete(:_flow)
101
- ATTRS[type].each do |attr, default|
102
- define_singleton_method("#{attr}=") do |v|
103
- instance_variable_set("@#{attr}", v)
104
- end
105
- define_singleton_method("#{attr}") do
106
- instance_variable_get("@#{attr}")
107
- end
108
- send("#{attr}=", default.respond_to?(:each) ? default.dup : default)
109
- end
110
- if ALIASES[type]
111
- ALIASES[type].each do |alias_, attr|
112
- define_singleton_method("#{alias_}=") do |v|
113
- send("#{attr}=", v)
114
- end
115
- define_singleton_method("#{alias_}") do
116
- send(attr)
117
- end
118
- end
119
- end
120
- @type = type
121
- attrs.each do |k, v|
122
- send("#{k}=", v) if respond_to?("#{k}=")
123
- end
124
- end
125
-
126
- def inspect
127
- "<#{self.class}:#{object_id} type: #{type}>"
128
- end
129
-
130
- # This module implements the flow control API for the V93K
131
- module FlowControlAPI
132
- def enable
133
- @enable
134
- end
135
-
136
- def enable=(val)
137
- @enable = val
138
- end
139
- alias_method :if_enable=, :enable=
140
- alias_method :if_enabled=, :enable=
141
- alias_method :enabled=, :enable=
142
-
143
- def unless_enable
144
- @unless_enable
145
- end
146
-
147
- def unless_enable=(val)
148
- @unless_enable = val
149
- end
150
- alias_method :unless_enabled=, :unless_enable=
151
-
152
- def if_jobs
153
- @if_jobs ||= []
154
- end
155
-
156
- def unless_jobs
157
- @unless_jobs ||= []
158
- end
159
-
160
- def if_job=(jobs)
161
- [jobs].flatten.compact.each do |job|
162
- job = job.to_s.upcase
163
- if_jobs << job unless if_jobs.include?(job)
164
- end
165
- end
166
- alias_method :if_jobs=, :if_job=
167
- alias_method :add_if_jobs, :if_job=
168
- alias_method :add_if_job, :if_job=
169
-
170
- def unless_job=(jobs)
171
- [jobs].flatten.compact.each do |job|
172
- job = job.to_s.upcase
173
- job.gsub!('!', '')
174
- unless_jobs << job unless unless_jobs.include?(job)
175
- end
176
- end
177
- alias_method :unless_jobs=, :unless_job=
178
- alias_method :add_unless_jobs, :unless_job=
179
- alias_method :add_unless_job, :unless_job=
180
-
181
- # Run the test only if the given flow variable is true
182
- def flag_true=(var)
183
- c = "@#{var.to_s.upcase} == 1"
184
- if type == :if_then && condition == :skip
185
- self.condition = c
186
- self
187
- else
188
- node = FlowNode.create(flow, :if_then)
189
- node.parent = parent
190
- node.condition = c
191
- node.nodes << self
192
- # Replace self in the main flow with the conditional node (which includes self
193
- # in its parent collection)
194
- parent[parent.index(self)] = node
195
- flow.replace_relationship_dependent(self, node)
196
- end
197
- end
198
-
199
- # Run the test unless the given flow variable is true
200
- def flag_clear=(var)
201
- c = "@#{var.to_s.upcase} != 1"
202
- if type == :if_then && condition == :skip
203
- self.condition = c
204
- self
205
- else
206
- node = FlowNode.create(flow, :if_then)
207
- node.parent = parent
208
- node.condition = c
209
- node.nodes << self
210
- # Replace self in the main flow with the conditional node (which includes self
211
- # in its parent collection)
212
- parent[parent.index(self)] = node
213
- flow.replace_relationship_dependent(self, node)
214
- end
215
- end
216
-
217
- def continue_on_fail
218
- if group? || if_then?
219
- nodes.reject! do |n|
220
- if n.bin?
221
- n.deleted = true
222
- parent.delete(n)
223
- true
224
- end
225
- end
226
- nodes.each { |n| n.continue_on_fail if n.test? || n.if_then? }
227
- if if_then?
228
- else_nodes.reject! do |n|
229
- if n.bin?
230
- n.deleted = true
231
- parent.delete(n)
232
- true
233
- end
234
- end
235
- else_nodes.each { |n| n.continue_on_fail if n.test? || n.if_then? }
236
- end
237
- else
238
- else_nodes.reject! do |n|
239
- if n.bin?
240
- n.deleted = true
241
- parent.delete(n)
242
- true
243
- end
244
- end
245
- end
246
- end
247
-
248
- def set_flag_on_fail(id = self.id)
249
- var = "#{id}_FAILED"
250
- if group?
251
- nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
252
- elsif if_then?
253
- nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
254
- else_nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
255
- else
256
- @fail_flags_set ||= []
257
- unless @fail_flags_set.include?(var)
258
- flow.flow_control_variables << var
259
- else_nodes << flow.assign_value(var, 1)
260
- @fail_flags_set << var
261
- end
262
- end
263
- var
264
- end
265
-
266
- def set_flag_on_pass(id = self.id)
267
- var = "#{id}_PASSED"
268
- if group?
269
- nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
270
- elsif if_then?
271
- nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
272
- else_nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
273
- else
274
- @pass_flags_set ||= []
275
- unless @pass_flags_set.include?(var)
276
- flow.flow_control_variables << var
277
- nodes << flow.assign_value(var, 1)
278
- @pass_flags_set << var
279
- end
280
- end
281
- var
282
- end
283
-
284
- def set_flag_on_ran(id = self.id)
285
- var = "#{id}_RAN"
286
- if group?
287
- nodes.each { |n| n.set_flag_on_ran(id) if n.test? }
288
- else
289
- @ran_flags_set ||= []
290
- unless @ran_flags_set.include?(var)
291
- flow.flow_control_variables << var
292
- nodes << flow.assign_value(var, 1)
293
- else_nodes << flow.assign_value(var, 1)
294
- @ran_flags_set << var
295
- end
296
- end
297
- var
298
- end
299
-
300
- def run_if_all_passed(parent)
301
- end
302
-
303
- def run_if_any_passed(parent)
304
- end
305
-
306
- def run_if_all_failed(parent)
307
- end
308
-
309
- def run_if_any_failed(parent)
310
- end
311
- end
312
- include FlowControlAPI
313
-
314
- def empty?
315
- return false if type == :run
316
- if respond_to?(:nodes)
317
- nodes.each { |n| return false unless n.deleted? || n.rendered? || n.empty? }
318
- if respond_to?(:else_nodes)
319
- else_nodes.each { |n| return false unless n.deleted? || n.rendered? || n.empty? }
320
- end
321
- true
322
- end
323
- end
324
-
325
- def lines(options = {})
326
- return [] if empty?
327
- # Convert Run nodes to Run and Branch as required
328
- if type == :run && (!nodes.empty? || !else_nodes.empty?)
329
- self.type = :run_and_branch
330
- end
331
- case type
332
- when :good_bin, :bad_bin
333
- l = ["stop_bin \"#{soft_bin || bin}\", \"#{soft_bin_desc}\", , #{bin_type}, #{reprobe ? 'reprobe' : 'noreprobe'}, #{color}, #{bin}, #{overon ? 'over_on' : 'not_over_on'};"]
334
- when :print
335
- l = ["print(\"#{value}\");"]
336
- when :print_to_datalog
337
- l = ["print_dl(\"#{value}\");"]
338
- when :run
339
- l = ["run(#{test_suite.name});"]
340
- when :run_and_branch
341
- l = [
342
- "run_and_branch(#{test_suite.name})",
343
- 'then',
344
- '{'
345
- ]
346
- nodes.each do |node|
347
- l << node.lines(indent: 3) unless node.rendered
348
- node.rendered = true
349
- end
350
- l += [
351
- '}',
352
- 'else',
353
- '{'
354
- ]
355
- else_nodes.each do |node|
356
- l << node.lines(indent: 3) unless node.rendered
357
- node.rendered = true
358
- end
359
- l << '}'
360
- l.flatten!
361
-
362
- when :if_then
363
- c = condition == :skip ? '1' : condition
364
- l = [
365
- "if #{c} then",
366
- '{'
367
- ]
368
- nodes.each do |node|
369
- l << node.lines(indent: 3) unless node.rendered
370
- node.rendered = true
371
- end
372
- l += [
373
- '}',
374
- 'else',
375
- '{'
376
- ]
377
- else_nodes.each do |node|
378
- l << node.lines(indent: 3) unless node.rendered
379
- node.rendered = true
380
- end
381
- l << '}'
382
- l.flatten!
383
-
384
- when :group
385
- l = ['{']
386
- nodes.each do |node|
387
- l << node.lines(indent: 3) unless node.rendered
388
- node.rendered = true
389
- end
390
- l << "}, #{bypass ? 'groupbypass, ' : ''}open,\"#{name}\", \"#{comment}\""
391
- l.flatten!
392
- when :assign_value
393
- l = ["@#{variable.to_s.upcase} = #{value};"]
394
- else
395
- fail "Don't know how to render: #{type}"
396
- end
397
- if options[:indent]
398
- l.map! { |line| (' ' * options[:indent]) + line }
399
- end
400
- l
401
- end
402
-
403
- def finalize(options = {})
404
- case type
405
- when :good_bin, :bad_bin
406
- if bin && bin_desc
407
- flow.hardware_bin_descriptions[bin] = bin_desc
408
- end
409
- end
410
-
411
- # Implement job/enable branches
412
- unless if_jobs.empty?
413
- condition = if_jobs.map { |j| "@JOB == \"#{j}\"" }.join(' or ')
414
- node = FlowNode.create(flow, :if_then)
415
- node.parent = parent
416
- node.condition = condition
417
- node.nodes << self
418
- parent[parent.index(self)] = node
419
- self.parent = node.nodes
420
- end
421
- unless unless_jobs.empty?
422
- condition = unless_jobs.map { |j| "@JOB != \"#{j}\"" }.join(' and ')
423
- node = FlowNode.create(flow, :if_then)
424
- node.parent = parent
425
- node.condition = condition
426
- node.nodes << self
427
- parent[parent.index(self)] = node
428
- self.parent = node.nodes
429
- end
430
- if enable
431
- condition = "@#{enable.to_s.upcase} == 1"
432
- node = FlowNode.create(flow, :if_then)
433
- node.parent = parent
434
- node.condition = condition
435
- node.nodes << self
436
- parent[parent.index(self)] = node
437
- self.parent = node.nodes
438
- end
439
- if unless_enable
440
- condition = "@#{unless_enable.to_s.upcase} == 1"
441
- node = FlowNode.create(flow, :if_then)
442
- node.parent = parent
443
- node.condition = condition
444
- node.else_nodes << self
445
- parent[parent.index(self)] = node
446
- self.parent = node.else_nodes
447
- end
448
- end
449
-
450
- def group?
451
- type == :group
452
- end
453
-
454
- def test?
455
- [:run, :run_and_branch].include?(@type)
456
- end
457
-
458
- def if_then?
459
- type == :if_then
460
- end
461
-
462
- def bin?
463
- [:stop_bin, :bad_bin].include?(@type)
464
- end
465
-
466
- def self.platform
467
- Origen.interface.platform
468
- end
469
-
470
- def platform
471
- self.class.platform
472
- end
473
- end
474
- end
475
- end
476
- end