origen 0.2.6 → 0.3.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/bin/origen +3 -1
  3. data/config/boot.rb +1 -7
  4. data/config/commands.rb +0 -1
  5. data/config/version.rb +2 -2
  6. data/lib/c99/{j750_interface.rb → ate_interface.rb} +3 -11
  7. data/lib/c99/doc_interface.rb +1 -1
  8. data/lib/origen.rb +9 -30
  9. data/lib/origen/application.rb +10 -8
  10. data/lib/origen/application/configuration.rb +13 -26
  11. data/lib/origen/application/plugins.rb +122 -0
  12. data/lib/origen/application/plugins_manager.rb +16 -254
  13. data/lib/origen/application/release.rb +2 -2
  14. data/lib/origen/application/runner.rb +2 -4
  15. data/lib/origen/chips.rb +0 -0
  16. data/lib/origen/chips/chip.rb +0 -0
  17. data/lib/origen/chips/design_entry.rb +0 -0
  18. data/lib/origen/chips/doc_entry.rb +0 -0
  19. data/lib/origen/chips/note.rb +0 -0
  20. data/lib/origen/commands.rb +4 -44
  21. data/lib/origen/commands/compile.rb +1 -2
  22. data/lib/origen/commands/generate.rb +1 -1
  23. data/lib/origen/commands/interactive.rb +1 -2
  24. data/lib/origen/commands/plugin.rb +49 -56
  25. data/lib/origen/commands/program.rb +1 -1
  26. data/lib/origen/commands/rc.rb +2 -2
  27. data/lib/origen/commands/version.rb +2 -17
  28. data/lib/origen/commands_global.rb +3 -0
  29. data/lib/origen/file_handler.rb +10 -10
  30. data/lib/origen/generator.rb +1 -1
  31. data/lib/origen/generator/job.rb +1 -1
  32. data/lib/origen/generator/pattern.rb +2 -2
  33. data/lib/origen/generator/pattern_finder.rb +10 -9
  34. data/lib/origen/pins/pin.rb +0 -0
  35. data/lib/origen/regression_manager.rb +0 -0
  36. data/lib/origen/remote_manager.rb +2 -8
  37. data/lib/origen/revision_control/design_sync.rb +0 -0
  38. data/lib/origen/revision_control/git.rb +0 -0
  39. data/lib/origen/specs.rb +0 -0
  40. data/lib/origen/specs/checkers.rb +0 -0
  41. data/lib/origen/specs/creation_info.rb +0 -0
  42. data/lib/origen/specs/exhibit.rb +0 -0
  43. data/lib/origen/specs/spec.rb +0 -0
  44. data/lib/origen/utility.rb +0 -1
  45. data/lib/origen/utility/diff.rb +0 -0
  46. metadata +42 -119
  47. data/lib/origen/import_manager.rb +0 -596
  48. data/lib/origen/nvm.rb +0 -6
  49. data/lib/origen/nvm/block_array.rb +0 -72
  50. data/lib/origen/tester.rb +0 -56
  51. data/lib/origen/tester/api.rb +0 -277
  52. data/lib/origen/tester/bdm/bdm.rb +0 -25
  53. data/lib/origen/tester/doc/doc.rb +0 -226
  54. data/lib/origen/tester/doc/generator.rb +0 -126
  55. data/lib/origen/tester/doc/generator/flow.rb +0 -71
  56. data/lib/origen/tester/doc/generator/flow_line.rb +0 -203
  57. data/lib/origen/tester/doc/generator/test.rb +0 -68
  58. data/lib/origen/tester/doc/generator/test_group.rb +0 -66
  59. data/lib/origen/tester/doc/generator/tests.rb +0 -47
  60. data/lib/origen/tester/doc/model.rb +0 -162
  61. data/lib/origen/tester/generator.rb +0 -271
  62. data/lib/origen/tester/generator/flow_control_api.rb +0 -606
  63. data/lib/origen/tester/generator/identity_map.rb +0 -25
  64. data/lib/origen/tester/generator/placeholder.rb +0 -13
  65. data/lib/origen/tester/generator/test_numberer.rb +0 -25
  66. data/lib/origen/tester/interface.rb +0 -154
  67. data/lib/origen/tester/j750/files.rb +0 -45
  68. data/lib/origen/tester/j750/generator.rb +0 -203
  69. data/lib/origen/tester/j750/generator/flow.rb +0 -123
  70. data/lib/origen/tester/j750/generator/flow_line.rb +0 -288
  71. data/lib/origen/tester/j750/generator/patgroup.rb +0 -111
  72. data/lib/origen/tester/j750/generator/patgroups.rb +0 -41
  73. data/lib/origen/tester/j750/generator/patset.rb +0 -111
  74. data/lib/origen/tester/j750/generator/patsets.rb +0 -41
  75. data/lib/origen/tester/j750/generator/templates/flow.txt.erb +0 -9
  76. data/lib/origen/tester/j750/generator/templates/instances.txt.erb +0 -16
  77. data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +0 -8
  78. data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +0 -10
  79. data/lib/origen/tester/j750/generator/test_instance.rb +0 -846
  80. data/lib/origen/tester/j750/generator/test_instance_group.rb +0 -60
  81. data/lib/origen/tester/j750/generator/test_instances.rb +0 -182
  82. data/lib/origen/tester/j750/j750.rb +0 -845
  83. data/lib/origen/tester/j750/j750_hpt.rb +0 -35
  84. data/lib/origen/tester/j750/parser.rb +0 -104
  85. data/lib/origen/tester/j750/parser/ac_spec.rb +0 -11
  86. data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
  87. data/lib/origen/tester/j750/parser/dc_spec.rb +0 -36
  88. data/lib/origen/tester/j750/parser/dc_specs.rb +0 -50
  89. data/lib/origen/tester/j750/parser/descriptions.rb +0 -340
  90. data/lib/origen/tester/j750/parser/flow.rb +0 -111
  91. data/lib/origen/tester/j750/parser/flow_line.rb +0 -207
  92. data/lib/origen/tester/j750/parser/flows.rb +0 -23
  93. data/lib/origen/tester/j750/parser/pattern_set.rb +0 -94
  94. data/lib/origen/tester/j750/parser/pattern_sets.rb +0 -33
  95. data/lib/origen/tester/j750/parser/test_instance.rb +0 -322
  96. data/lib/origen/tester/j750/parser/test_instances.rb +0 -26
  97. data/lib/origen/tester/j750/parser/timeset.rb +0 -15
  98. data/lib/origen/tester/j750/parser/timesets.rb +0 -0
  99. data/lib/origen/tester/jlink/jlink.rb +0 -33
  100. data/lib/origen/tester/parser.rb +0 -24
  101. data/lib/origen/tester/parser/description_lookup.rb +0 -64
  102. data/lib/origen/tester/parser/searchable_array.rb +0 -32
  103. data/lib/origen/tester/parser/searchable_hash.rb +0 -32
  104. data/lib/origen/tester/time.rb +0 -338
  105. data/lib/origen/tester/timing.rb +0 -253
  106. data/lib/origen/tester/ultraflex/files.rb +0 -45
  107. data/lib/origen/tester/ultraflex/generator.rb +0 -200
  108. data/lib/origen/tester/ultraflex/generator/flow.rb +0 -119
  109. data/lib/origen/tester/ultraflex/generator/flow_line.rb +0 -269
  110. data/lib/origen/tester/ultraflex/generator/patgroup.rb +0 -111
  111. data/lib/origen/tester/ultraflex/generator/patgroups.rb +0 -41
  112. data/lib/origen/tester/ultraflex/generator/patset.rb +0 -111
  113. data/lib/origen/tester/ultraflex/generator/patsets.rb +0 -41
  114. data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +0 -9
  115. data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +0 -16
  116. data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +0 -8
  117. data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +0 -10
  118. data/lib/origen/tester/ultraflex/generator/test_instance.rb +0 -622
  119. data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +0 -60
  120. data/lib/origen/tester/ultraflex/generator/test_instances.rb +0 -174
  121. data/lib/origen/tester/ultraflex/parser.rb +0 -104
  122. data/lib/origen/tester/ultraflex/parser/ac_spec.rb +0 -11
  123. data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
  124. data/lib/origen/tester/ultraflex/parser/dc_spec.rb +0 -36
  125. data/lib/origen/tester/ultraflex/parser/dc_specs.rb +0 -50
  126. data/lib/origen/tester/ultraflex/parser/descriptions.rb +0 -342
  127. data/lib/origen/tester/ultraflex/parser/flow.rb +0 -111
  128. data/lib/origen/tester/ultraflex/parser/flow_line.rb +0 -207
  129. data/lib/origen/tester/ultraflex/parser/flows.rb +0 -23
  130. data/lib/origen/tester/ultraflex/parser/pattern_set.rb +0 -94
  131. data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +0 -33
  132. data/lib/origen/tester/ultraflex/parser/test_instance.rb +0 -262
  133. data/lib/origen/tester/ultraflex/parser/test_instances.rb +0 -26
  134. data/lib/origen/tester/ultraflex/parser/timeset.rb +0 -15
  135. data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
  136. data/lib/origen/tester/ultraflex/ultraflex.rb +0 -759
  137. data/lib/origen/tester/v93k/generator.rb +0 -80
  138. data/lib/origen/tester/v93k/generator/flow.rb +0 -63
  139. data/lib/origen/tester/v93k/generator/flow_node.rb +0 -17
  140. data/lib/origen/tester/v93k/generator/flow_node/print.rb +0 -10
  141. data/lib/origen/tester/v93k/generator/pattern.rb +0 -16
  142. data/lib/origen/tester/v93k/generator/pattern_master.rb +0 -54
  143. data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +0 -6
  144. data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +0 -11
  145. data/lib/origen/tester/v93k/generator/templates/template.flow.erb +0 -121
  146. data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +0 -9
  147. data/lib/origen/tester/v93k/generator/test_function.rb +0 -103
  148. data/lib/origen/tester/v93k/generator/test_functions.rb +0 -79
  149. data/lib/origen/tester/v93k/generator/test_method.rb +0 -46
  150. data/lib/origen/tester/v93k/generator/test_methods.rb +0 -75
  151. data/lib/origen/tester/v93k/generator/test_suite.rb +0 -54
  152. data/lib/origen/tester/v93k/generator/test_suites.rb +0 -65
  153. data/lib/origen/tester/v93k/v93k.rb +0 -420
  154. data/lib/origen/tester/vector.rb +0 -86
  155. data/lib/origen/tester/vector_generator.rb +0 -637
  156. data/lib/origen/tester/vector_pipeline.rb +0 -150
  157. data/lib/origen/utility/design_sync.rb +0 -494
  158. data/lib/origen/version_checker.rb +0 -117
@@ -1,32 +0,0 @@
1
- module Origen
2
- module Tester
3
- module Parser
4
- class SearchableArray < ::Array
5
- def where(conditions)
6
- exact = conditions.delete(:exact)
7
- results = SearchableArray.new
8
- each do |item|
9
- if conditions.all? do |attr, val|
10
- if val.is_a?(Array)
11
- if exact
12
- val.any? { |v| item.send(attr).to_s == v.to_s }
13
- else
14
- val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
15
- end
16
- else
17
- if exact
18
- item.send(attr).to_s == val.to_s
19
- else
20
- item.send(attr).to_s =~ /#{val.to_s}/
21
- end
22
- end
23
- end
24
- results << item
25
- end
26
- end
27
- results
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,32 +0,0 @@
1
- module Origen
2
- module Tester
3
- module Parser
4
- class SearchableHash < ::Hash
5
- def where(conditions)
6
- exact = conditions.delete(:exact)
7
- results = SearchableArray.new
8
- each do |_key, item|
9
- if conditions.all? do |attr, val|
10
- if val.is_a?(Array)
11
- if exact
12
- val.any? { |v| item.send(attr).to_s == v.to_s }
13
- else
14
- val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
15
- end
16
- else
17
- if exact
18
- item.send(attr).to_s == val.to_s
19
- else
20
- item.send(attr).to_s =~ /#{val.to_s}/
21
- end
22
- end
23
- end
24
- results << item
25
- end
26
- end
27
- results
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,338 +0,0 @@
1
- module Origen
2
- module Tester
3
- # Class for handling test time analysis - implements the functionality
4
- # exposed via the 'origen time' command
5
- class Time
6
- require 'yaml'
7
-
8
- TT_LIB_DIR = "#{Origen.root}/config/test_time/lib"
9
- TT_FLOW_DIR = "#{Origen.root}/config/test_time/flow"
10
- DEFAULT_LIBRARY = "#{TT_LIB_DIR}/default.yaml"
11
- DEFAULT_FLOW = "#{TT_FLOW_DIR}/default.yaml"
12
-
13
- # If any new embedded hashes are added to this a default of {} must also be added
14
- # to the sanitize method
15
- TEST_META_DATA = { 'rule' => nil,
16
- 'reference' => { 'rule_result' => nil,
17
- 'time' => nil,
18
- 'target' => nil
19
- }
20
- }
21
-
22
- def stats
23
- @stats ||= { imported: 0, rules_assigned: 0, reference_rules_evaluated: 0 }
24
- end
25
-
26
- def clear_stats
27
- @stats = nil
28
- end
29
-
30
- # Import a flow, this can be from either a datalog or an execution time
31
- def import_test_flow(file, options = {})
32
- clear_stats
33
- @options = options
34
- if Origen.tester.respond_to?('read_test_times')
35
- tests = Origen.tester.read_test_times(file, options)
36
- flow = []
37
- merge_indexed_tests(tests) do |name, _attrs|
38
- if import?(name)
39
- Origen.log.info "imported... #{name}"
40
- flow << name
41
- end
42
- end
43
- puts ''
44
- puts 'Import complete!'
45
- puts ''
46
- export_flow(flow, options)
47
- else
48
- error 'Sorry, no test time import method is defined for the current tester'
49
- end
50
- end
51
-
52
- def import_test_time(file, options = {})
53
- clear_stats
54
- @options = options
55
- if Origen.tester.respond_to?('read_test_times')
56
- tests = Origen.tester.read_test_times(file, options)
57
- total = extract_total_time(tests)
58
- flow = []
59
- library = {}
60
- imported = 0.0
61
- merge_indexed_tests(tests) do |name, attrs|
62
- attrs = sanitize(attrs)
63
-
64
- if import?(name)
65
- Origen.log.info "importing... #{name}"
66
- flow << name
67
- if library[name]
68
- library[name] = merge(library[name], attrs)
69
- else
70
- library[name] = populate(name, attrs)
71
- stats[:imported] += 1
72
- end
73
- imported += attrs['reference']['time']
74
- # puts name
75
- end
76
- end
77
- puts ''
78
- puts 'Import complete!'
79
- puts ''
80
- puts 'Some stats...'
81
- puts ''
82
- puts "Tests imported: #{stats[:imported]}"
83
- puts "Rules assigned: #{stats[:rules_assigned]}"
84
- puts "Ref rules calculated: #{stats[:reference_rules_evaluated]}"
85
- puts ''
86
- puts 'Total time: ' + total.round(6).to_s + 's'
87
- puts 'Total filtered time: ' + imported.round(6).to_s + 's'
88
- if stats[:imported] == stats[:rules_assigned]
89
- puts 'Forecasted: ' + calculate_time(flow, library, options.merge(silent: true)).to_s + 's'
90
- else
91
- puts 'Forecasted: SOME TESTS HAVE NO RULES ASSIGNED!'
92
- end
93
- puts ''
94
- export_library(library, options)
95
- else
96
- error 'Sorry, no test time import method is defined for the current tester'
97
- end
98
- end
99
-
100
- def forecast_test_time(options = {})
101
- clear_stats
102
- @options = options
103
- time = 0.0
104
- flow = import_flow(input_flow_file(options))
105
- library = import_library(input_library_file(options))['tests']
106
- calculate_time(flow, library, options)
107
- end
108
-
109
- def output_library_file(options = {})
110
- if options[:ref_name]
111
- "#{TT_LIB_DIR}/#{options[:ref_name]}.yaml"
112
- else
113
- DEFAULT_LIBRARY
114
- end
115
- end
116
-
117
- def input_library_file(options = {})
118
- output_library_file(options)
119
- end
120
-
121
- def output_flow_file(options = {})
122
- if options[:ref_name]
123
- "#{TT_FLOW_DIR}/#{options[:ref_name]}.yaml"
124
- else
125
- DEFAULT_FLOW
126
- end
127
- end
128
-
129
- def input_flow_file(options = {})
130
- output_flow_file(options)
131
- end
132
-
133
- # Force the imported test data from the tester into a YAML compliant form
134
- def sanitize(attrs)
135
- # Force all keys to strings...
136
- attrs.keys.each do |key|
137
- begin
138
- attrs[key.to_s] = attrs.delete(key)
139
- rescue
140
- # No problem
141
- end
142
- end
143
- attrs['reference'] ||= {}
144
- # attrs["opportunity"] ||= {}
145
- if attrs['time']
146
- attrs['reference']['time'] = attrs.delete('time')
147
- end
148
- deep_merge(TEST_META_DATA, attrs)
149
- end
150
-
151
- # Populate the attributes based on user specified rules
152
- def populate(name, attrs, options = {})
153
- if rules
154
- r = rules.assign(name, attrs, options)
155
- if r
156
- stats[:rules_assigned] += 1
157
- attrs['rule'] = r
158
- else
159
- warn "No rule assigned to: #{name}"
160
- attrs.delete('rule')
161
- end
162
- r = rules.evaluate(name, attrs, options)
163
- if r
164
- stats[:reference_rules_evaluated] += 1
165
- attrs['reference']['rule_result'] = r
166
- else
167
- warn "No reference rule result assigned to: #{name}"
168
- attrs['reference'].delete('rule_result')
169
- end
170
- end
171
- attrs['reference']['target'] = Origen.target.name
172
- attrs
173
- end
174
-
175
- def export_library(lib, options = {})
176
- tests = {}
177
- lib.each do |name, attrs|
178
- tests[name] = attrs
179
- end
180
- Origen.file_handler.open_for_write(output_library_file(options)) do |f|
181
- f.puts YAML.dump('tests' => tests)
182
- end
183
- puts "Test library exported to: #{Origen.file_handler.relative_path_to(output_library_file(options))}"
184
- end
185
-
186
- def import_library(lib, _options = {})
187
- YAML.load(File.open(lib))
188
- end
189
-
190
- def export_flow(flow, options = {})
191
- Origen.file_handler.open_for_write(output_flow_file(options)) do |f|
192
- f.puts YAML.dump(flow)
193
- end
194
- puts "Test flow exported to: #{Origen.file_handler.relative_path_to(output_flow_file(options))}"
195
- end
196
-
197
- def import_flow(flow, _options = {})
198
- YAML.load(File.open(flow))
199
- end
200
-
201
- # Deep merge two hashes, the first one should be the defaults, the second one will override any
202
- # items from the defaults
203
- def deep_merge(hash1, hash2)
204
- hash1.merge(hash2) do |_key, oldval, newval|
205
- oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
206
- newval = newval.to_hash if newval.respond_to?(:to_hash)
207
- oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? deep_merge(oldval, newval) : newval
208
- end
209
- end
210
-
211
- # Merge two sets of attributes for the same test, generally this means that the time will
212
- # be averaged and all other attributes will remain the same
213
- def merge(t1, t2)
214
- t1['reference']['time'] = (t1['reference']['time'] + t2['reference']['time']) / 2
215
- t1
216
- end
217
-
218
- # Calculate the time for the given flow, using times from the given library
219
- def calculate_time(flow, library, options = {})
220
- options = {
221
- silent: false,
222
- summary: false
223
- }.merge(options)
224
- unless options[:silent] || options[:summary]
225
- Origen.log.info 'Test'.ljust(60) + 'Rule'.ljust(40) +
226
- library.first[1]['reference']['target'].ljust(30) + Origen.target.name
227
- orig = 0
228
- end
229
- forecasted = flow.reduce(0.0) do |sum, test|
230
- if library[test]['include'] == false || library[test]['exclude'] == true
231
- sum
232
- else
233
- orig += library[test]['reference']['time'] unless options[:silent] || options[:summary]
234
- forecast = rules.forecast(test, library[test], options)
235
- unless options[:silent] || options[:summary]
236
- Origen.log.info test.ljust(60) + library[test]['rule'].to_s.ljust(40) +
237
- "#{library[test]['reference']['time'].round(6)}".ljust(30) +
238
- "#{forecast.round(6)}"
239
- end
240
- sum + forecast
241
- end
242
- end
243
- if options[:silent]
244
- forecasted.round(6)
245
- elsif options[:summary]
246
- Origen.log.info Origen.target.name.ljust(50) + "#{forecasted.round(6)}"
247
- else
248
- Origen.log.info ''
249
- Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '---------------'
250
- Origen.log.info ''.ljust(100) + "#{orig.round(6)}".ljust(30) + "#{forecasted.round(6)}"
251
- Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '==============='
252
- Origen.log.info ''
253
- end
254
- end
255
-
256
- def extract_total_time(tests)
257
- tests.reduce(0.0) { |sum, test| sum + test[:time] }
258
- end
259
-
260
- # This combines the test time from indexed tests and removes the :index and :group keys from all tests.
261
- #
262
- # If it is an indexed test then a single hash will be returned containing the total time and the key:
263
- # {:indexed => true}.
264
- def merge_indexed_tests(tests)
265
- ix_counter = false
266
- ix_group = false
267
- ix_test = false
268
- ix_total = false
269
-
270
- tests.each do |t|
271
- i = t.delete(:index)
272
- g = t.delete(:group)
273
- process = true
274
- if ix_counter
275
- if ix_test == t[:name]
276
- process = false
277
- warning "Incomplete index data from test: #{ix_test}" if i != ix_counter + 1
278
- ix_counter = i
279
- ix_total += t[:time]
280
- # If the last test in the index
281
- if i == ix_group
282
- yield(ix_test, { time: ix_total, indexed: true })
283
- ix_counter = false
284
- end
285
- else
286
- warning "Incomplete index data from test: #{ix_test}"
287
- yield(ix_test, { time: ix_total, indexed: true })
288
- ix_counter = false
289
- end
290
- end
291
- # Don't combine this with the above via an else, it is required to be separate to generate the
292
- # next entry in the case where an index group was incomplete
293
- if process
294
- if i
295
- # Ignore tests with an invalid index and a very short time, these occur from tests which
296
- # are in the flow, but have not been executed in this run
297
- unless i != 1 && t[:time] < 0.0001
298
- ix_counter = i
299
- ix_group = g
300
- ix_test = t[:name]
301
- ix_total = t[:time]
302
- warning "Incomplete index data from test: #{t[:name]}" if ix_counter != 1
303
- end
304
- else
305
- yield t.delete(:name), t
306
- end
307
- end
308
- end
309
- end
310
-
311
- def import?(test)
312
- if filter
313
- filter.import?(test)
314
- else
315
- true
316
- end
317
- end
318
-
319
- def filter
320
- return @filter if defined?(@filter)
321
- if defined?(TestTimeFilter)
322
- @filter = TestTimeFilter.new
323
- else
324
- @filter = false
325
- end
326
- end
327
-
328
- def rules
329
- return @rules if defined?(@rules)
330
- if defined?(TestTimeRules)
331
- @rules = TestTimeRules.new
332
- else
333
- @rules = false
334
- end
335
- end
336
- end
337
- end
338
- end
@@ -1,253 +0,0 @@
1
- module Origen
2
- module Tester
3
- module Timing
4
- class Timeset
5
- attr_accessor :name, :period_in_ns
6
-
7
- def initialize(attrs = {})
8
- attrs.each do |name, value|
9
- send("#{name}=", value)
10
- end
11
- end
12
- end
13
-
14
- # Set the timeset for the next vectors, this will remain in place until the next
15
- # time this is called.
16
- #
17
- # $tester.set_timeset("bist_25mhz", 40)
18
- #
19
- # This method also accepts a block in which case the contained vectors will generate
20
- # with the supplied timeset and subsequent vectors will return to the previous timeset
21
- # automatically.
22
- #
23
- # $tester.set_timeset("bist_25mhz", 40) do
24
- # $tester.cycle
25
- # end
26
- #
27
- # The arguments can also be supplied as a single array, or not at all. In the latter case
28
- # the existing timeset will simply be preserved. This is useful if you have timesets that
29
- # can be conditionally set based on the target.
30
- #
31
- # # Target 1
32
- # $soc.readout_timeset = ["readout", 120]
33
- # # Target 2
34
- # $soc.readout_timeset = false
35
- #
36
- # # This code is compatible with both targets, in the first case the timeset will switch
37
- # # over, in the second case the existing timeset will be preserved.
38
- # $tester.set_timeset($soc.readout_timeset) do
39
- # $tester.cycle
40
- # end
41
- def set_timeset(timeset, period_in_ns = nil)
42
- if timeset.is_a?(Array)
43
- timeset, period_in_ns = timeset[0], timeset[1]
44
- end
45
- timeset ||= @timeset
46
- unless timeset.is_a?(Timeset)
47
- fail 'You must supply a period_in_ns argument to set_timeset' unless period_in_ns
48
- timeset = Timeset.new(name: timeset.to_s.chomp, period_in_ns: period_in_ns)
49
- end
50
- called_timesets << timeset unless called_timesets.map(&:name).include?(timeset.name)
51
- if block_given?
52
- original = @timeset
53
- timeset_changed(timeset)
54
- @timeset = timeset
55
- yield
56
- timeset_changed(original)
57
- @timeset = original
58
- else
59
- timeset_changed(timeset)
60
- @timeset = timeset
61
- end
62
- end
63
-
64
- def timeset_changed(timeset)
65
- if last_vector && last_vector.timeset != timeset
66
- change = { old: last_vector.timeset, new: timeset }
67
- # Suppress any duplicate calls
68
- if !@_last_timeset_change ||
69
- (@_last_timeset_change[:new] != change[:new] &&
70
- @_last_timeset_change[:old] != change[:old])
71
- before_timeset_change(change)
72
- end
73
- @_last_timeset_change = change
74
- end
75
- end
76
-
77
- def before_timeset_change(_options = {})
78
- end
79
-
80
- # Cause the pattern to wait.
81
- # The following options are available to help you specify the time to wait:
82
- # * :cycles - delays specified in raw cycles, the test model is responsible for translating this into a sequence of valid repeat statements
83
- # * :time_in_ns - time specified in nano-seconds
84
- # * :time_in_us - time specified in micro-seconds
85
- # * :time_in_ms - time specified in milli-seconds
86
- # * :time_in_s - time specified in seconds
87
- # If more than one option is supplied they will get added together to give a final
88
- # delay time expressed in cycles.
89
- # ==== Examples
90
- # $tester.wait(:cycles => 100, :time_in_ns => 200) # Wait for 100 cycles + 200ns
91
- # This method can also be used to trigger a match loop in which case the supplied time
92
- # becomes the time out for the match. See the J750#match method for full details of the
93
- # available options.
94
- # $tester.wait(:match => true, :state => :high, :pin => $top.pin(:done), :time_in_ms => 500)
95
- def wait(options = {})
96
- options = {
97
- cycles: 0,
98
- time_in_cycles: 0,
99
- time_in_us: 0,
100
- time_in_ns: 0,
101
- time_in_ms: 0,
102
- time_in_s: 0,
103
- match: false, # Set to true to invoke a match loop where the supplied delay
104
- # will become the timeout duration
105
- }.merge(options)
106
-
107
- cycles = 0
108
- cycles += options[:cycles] + options[:time_in_cycles]
109
- cycles += s_to_cycles(options[:time_in_s])
110
- cycles += ms_to_cycles(options[:time_in_ms])
111
- cycles += us_to_cycles(options[:time_in_us])
112
- cycles += ns_to_cycles(options[:time_in_ns])
113
-
114
- time = cycles * current_period_in_ns # Total delay in ns
115
- case
116
- when time < 1000 # When less than 1us
117
- cc "Wait for #{'a maximum of ' if options[:match]}#{time}ns"
118
- when time < 1_000_000 # When less than 1ms
119
- cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1000).round(1)}us" # Display delay in us
120
- when time < 1_000_000_000 # When less than 1s
121
- cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1_000_000).round(1)}ms"
122
- else
123
- cc "Wait for #{'a maximum of ' if options[:match]}%.2fs" % (time.to_f / 1_000_000_000)
124
- end
125
-
126
- if cycles > 0 # Allow this function to be called with 0 in which case it will just return
127
- if options[:match]
128
- if block_given?
129
- match_block(cycles, options) { yield }
130
- else
131
- match(options[:pin], options[:state], cycles, options)
132
- end
133
- else
134
- delay(cycles)
135
- end
136
- end
137
- end
138
-
139
- # @api private
140
- # This should not be called directly, call via tester#wait
141
- def delay(cycles, options = {})
142
- (cycles / max_repeat_loop).times do
143
- if block_given?
144
- yield options.merge(repeat: max_repeat_loop)
145
- else
146
- cycle(options.merge(repeat: max_repeat_loop))
147
- end
148
- end
149
- if block_given?
150
- yield options.merge(repeat: (cycles % max_repeat_loop))
151
- else
152
- cycle(options.merge(repeat: (cycles % max_repeat_loop)))
153
- end
154
- end
155
-
156
- def max_repeat_loop
157
- @max_repeat_loop || 65_535
158
- end
159
-
160
- def s_to_cycles(time) # :nodoc:
161
- ((time.to_f) * 1000 * 1000 * 1000 / current_period_in_ns).to_int
162
- end
163
-
164
- def ms_to_cycles(time) # :nodoc:
165
- ((time.to_f) * 1000 * 1000 / current_period_in_ns).to_int
166
- end
167
-
168
- def us_to_cycles(time) # :nodoc:
169
- ((time.to_f * 1000) / current_period_in_ns).to_int
170
- end
171
-
172
- def ns_to_cycles(time) # :nodoc:
173
- (time.to_f / current_period_in_ns).to_int
174
- end
175
-
176
- def cycles_to_us(cycles) # :nodoc:
177
- ((cycles.to_f * current_period_in_ns) / (1000)).ceil
178
- end
179
-
180
- def cycles_to_ms(cycles) # :nodoc:
181
- ((cycles.to_f * current_period_in_ns) / (1000 * 1000)).ceil
182
- end
183
-
184
- # Cycles to tenths of a second
185
- def cycles_to_ts(cycles) # :nodoc:
186
- ((cycles.to_f * current_period_in_ns) / (1000 * 1000 * 100)).ceil
187
- end
188
-
189
- def called_timesets
190
- @called_timesets ||= []
191
- end
192
-
193
- def current_period_in_ns
194
- if @timeset
195
- @timeset.period_in_ns
196
- else
197
- fail 'No timeset has been specified yet!'
198
- end
199
- end
200
- alias_method :current_period, :current_period_in_ns
201
- alias_method :period, :current_period_in_ns
202
-
203
- def current_timeset
204
- @timeset
205
- end
206
- alias_method :timeset, :current_timeset
207
-
208
- # Convert the supplied number of cycles to a time, based on the SoC defined cycle period
209
- def cycles_to_time(cycles) # :nodoc:
210
- (cycles * current_period_in_ns).to_f / 1_000_000_000
211
- end
212
-
213
- # This function can be used to generate a clock or some other repeating function
214
- # that spans accross a range of vectors.
215
- # The period of each cycle and the duration of the sequence are supplied via the following
216
- # options:
217
- # * :period_in_cycles
218
- # * :period_in_ns
219
- # * :period_in_us
220
- # * :period_in_ms
221
- # * :duration_in_cycles
222
- # * :duration_in_ns
223
- # * :duration_in_us
224
- # * :duration_in_ms
225
- # If multiple definitions for either option are supplied then they will be added
226
- # together.
227
- # ==== Example
228
- # # Supply a clock pulse on :pinA for 100ms
229
- # $tester.count(:period_in_cycles => 10, :duration_in_ms => 100) do
230
- # $top.pin(:pinA).drive!(1)
231
- # $top.pin(:pinA).drive!(0)
232
- # end
233
- def count(options = {})
234
- options = { period_in_cycles: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0,
235
- duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0
236
- }.merge(options)
237
-
238
- period_cycles = options[:period_in_cycles] + ms_to_cycles(options[:period_in_ms]) +
239
- us_to_cycles(options[:period_in_us]) + ns_to_cycles(options[:period_in_ns])
240
-
241
- duration_cycles = options[:duration_in_cycles] + ms_to_cycles(options[:duration_in_ms]) +
242
- us_to_cycles(options[:duration_in_us]) + ns_to_cycles(options[:duration_in_ns])
243
-
244
- total = 0
245
- while total < duration_cycles
246
- wait(time_in_cycles: period_cycles)
247
- yield # Return control back to caller
248
- total += period_cycles
249
- end
250
- end
251
- end
252
- end
253
- end