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,86 +0,0 @@
1
- module Origen
2
- module Tester
3
- # A simple class to model a vector
4
- class Vector
5
- attr_accessor :repeat, :microcode, :timeset, :pin_vals,
6
- :number, :cycle_number, :dont_compress,
7
- :comments
8
-
9
- def initialize(attrs = {})
10
- attrs.each do |attribute, value|
11
- send("#{attribute}=", value)
12
- end
13
- end
14
-
15
- def comments
16
- @comments ||= []
17
- end
18
-
19
- def update(attrs = {})
20
- attrs.each do |attribute, value|
21
- send("#{attribute}=", value)
22
- end
23
- end
24
-
25
- # Updates the pin values to reflect the value currently held by the given pin
26
- def update_pin_val(pin)
27
- vals = pin_vals.split(' ')
28
- if pin.belongs_to_a_pin_group? && !pin.is_a?(Origen::Pins::PinCollection)
29
- port = nil
30
- pin.groups.each { |i| port = i[1] if port.nil? && Origen.tester.ordered_pins.include?(i[1]) } # see if group is included in ordered pins
31
- if port
32
- ix = Origen.tester.ordered_pins.index(port) # find index of port
33
- i = port.index(pin)
34
- else
35
- ix = Origen.tester.ordered_pins.index(pin)
36
- i = 0
37
- end
38
- else
39
- ix = Origen.tester.ordered_pins.index(pin)
40
- i = 0
41
- end
42
-
43
- if Origen.pin_bank.pin_groups.keys.include? pin.id
44
- val = pin.map { |p| Origen.tester.format_pin_state(p) }.join('')
45
- vals[ix] = val
46
- else
47
- val = Origen.tester.format_pin_state(pin)
48
- vals[ix][i] = val
49
- end
50
-
51
- self.pin_vals = vals.join(' ')
52
- end
53
-
54
- def ordered_pins
55
- Origen.app.pin_map.sort_by { |_id, pin| pin.order }.map { |_id, pin| pin }
56
- end
57
-
58
- def microcode=(val)
59
- if has_microcode? && @microcode != val
60
- fail "Trying to assign microcode: #{val}, but vector already has microcode: #{@microcode}"
61
- else
62
- @microcode = val
63
- end
64
- end
65
-
66
- # Since repeat 0 is non-intuitive every vector implicitly has a repeat of 1
67
- def repeat
68
- @repeat || 1
69
- end
70
-
71
- def has_microcode?
72
- @microcode && !@microcode.empty?
73
- end
74
-
75
- def ==(obj)
76
- if obj.is_a?(Vector)
77
- self.has_microcode? == obj.has_microcode? &&
78
- timeset == obj.timeset &&
79
- pin_vals == obj.pin_vals
80
- else
81
- super obj
82
- end
83
- end
84
- end
85
- end
86
- end
@@ -1,637 +0,0 @@
1
- require 'active_support/concern'
2
- module Origen
3
- module Tester
4
- module VectorGenerator
5
- extend ActiveSupport::Concern
6
-
7
- require 'erb'
8
-
9
- included do
10
- attr_accessor :compress
11
- attr_accessor :expand_repeats
12
- end
13
-
14
- def vector_group_size
15
- @vector_group_size || 1
16
- end
17
-
18
- def vector_group_size=(number)
19
- if number > 1 && number.odd?
20
- fail 'Only even numbers can be supplied for the vector_group_size!'
21
- end
22
- # Each pattern should run with its own tester instance, but just in case
23
- @pipeline = nil
24
- @vector_group_size = number
25
- end
26
-
27
- def with_vector_group_size(number)
28
- orig = vector_group_size
29
- self.vector_group_size = number
30
- yield
31
- self.vector_group_size = orig
32
- end
33
-
34
- # Returns an array of pin IDs that are currently inhibited (will not
35
- # be included when vectors are generated)
36
- def inhibited_pins
37
- @inhibited_pins ||= []
38
- end
39
-
40
- # init vector count when first accessed, otherwise return value
41
- def vec_count
42
- @vec_count ||= 0
43
- end
44
-
45
- # increment vector count
46
- def inc_vec_count(num = 1)
47
- vec_count if @vec_count.nil? # define if not already
48
- @vec_count = @vec_count + num
49
- end
50
-
51
- # decrement vector count
52
- def dec_vec_count(num = 1)
53
- vec_count if @vec_count.nil? # define if not already
54
- @vec_count = @vec_count - num
55
- end
56
-
57
- # init cycle count when first accessed, otherwise return value
58
- def cycle_count
59
- @cycle_count ||= 0
60
- end
61
-
62
- # increment cycle count
63
- def inc_cycle_count(num = 1)
64
- cycle_count if @cycle_count.nil? # define if not already
65
- @cycle_count = @cycle_count + num
66
- end
67
-
68
- # reset_cycle_count
69
- def reset_cycle_count(num = 0)
70
- cycle_count if @cycle_count.nil? # define if not already
71
- @cycle_count = num
72
- end
73
-
74
- # Call to prevent the given pins from appearing in the generated vectors.
75
- #
76
- # This is a convenient way to inhibit something like a J750 mux pin from
77
- # appearing in the patterns when generating the pattern for a different
78
- # platform.
79
- #
80
- # When used this
81
- # method must be called before the first vector is generated - it will not be retrospectively
82
- # applied to existing vectors.
83
- def inhibit_pin(*pins)
84
- pins.each do |pin|
85
- inhibited_pins << pin
86
- end
87
- inhibited_pins.uniq!
88
- inhibited_pins.compact!
89
- inhibited_pins
90
- end
91
- alias_method :inhibit_pins, :inhibit_pin
92
-
93
- # Render content directly into a pattern, any options will be passed to the template
94
- def render(template, options = {})
95
- # Record the current file, this can be used to resolve any relative path
96
- # references in the file about to be compiled
97
- Origen.file_handler.current_file = template
98
- # Ran into crosstalk problems when rendering ERB templates recursively, setting eoutvar based
99
- # on the name of the file will causes each template to be rendered into its own 'bank'.
100
- # Not sure why the final gsub is needed but seems to fail to parse correctly otherwise.
101
- eoutvar = Pathname.new(template).basename('.*').basename('.*').to_s.gsub('-', '_')
102
- # Make the file name available to the template
103
- Origen.generator.compiler.options[:file] = template
104
- options.each { |k, v| Origen.generator.compiler.options[k] = v }
105
- code = Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result)
106
- code.strip!
107
- push_microcode code
108
- end
109
-
110
- # If the tester defines a method named template this method will compile
111
- # whatever template file is returned by that method.
112
- #
113
- # This method is called automatically after the body section of a Pattern.create
114
- # operation has completed.
115
- def render_template
116
- _render(:template)
117
- end
118
-
119
- # Same as the render method, except the template method should be called body_template.
120
- def render_body
121
- _render(:body_template)
122
- end
123
-
124
- # If the tester defines a method named footer_template this method will compile
125
- # whatever template file is returned by that method.
126
- #
127
- # This method is called automatically during the footer section of a Pattern.create
128
- # operation.
129
- def render_footer
130
- _render(:footer_template)
131
- end
132
-
133
- # If the tester defines a method named header_template this method will compile
134
- # whatever template file is returned by that method.
135
- #
136
- # This method is called automatically during the header section of a Pattern.create
137
- # operation.
138
- def render_header
139
- _render(:header_template)
140
- end
141
-
142
- def _render(method) # :nodoc:
143
- if self.respond_to?(method)
144
- template = send(method)
145
- # Record the current file, this can be used to resolve any relative path
146
- # references in the file about to be compiled
147
- Origen.file_handler.current_file = template
148
- # Ran into crosstalk problems when rendering ERB templates recursively, setting eoutvar based
149
- # on the name of the file will causes each template to be rendered into its own 'bank'.
150
- # Not sure why the final gsub is needed but seems to fail to parse correctly otherwise.
151
- eoutvar = Pathname.new(template).basename('.*').basename('.*').to_s.gsub('-', '_')
152
- # Make the file name available to the template
153
- Origen.generator.compiler.options[:file] = template
154
- push_microcode Origen.generator.compiler.insert(ERB.new(File.read(template.to_s), 0, Origen.config.erb_trim_mode, eoutvar).result)
155
- end
156
- end
157
-
158
- def stage
159
- Origen.generator.stage
160
- end
161
-
162
- def push_comment(msg)
163
- # Comments are stored verbatim for now, can't see much use for a dedicated comment object
164
- stage.store msg unless @inhibit_comments
165
- end
166
-
167
- def push_microcode(code, options = {})
168
- unless @inhibit_vectors
169
- if options[:offset] && options[:offset] != 0
170
- stage.insert_from_end code, options[:offset]
171
- else
172
- stage.store code
173
- end
174
- end
175
- end
176
- alias_method :microcode, :push_microcode
177
-
178
- def last_vector(offset = 0)
179
- stage.last_vector(offset)
180
- end
181
-
182
- def last_object(offset = 0)
183
- stage.last_object(offset)
184
- end
185
-
186
- # Allows the attributes for the next vector to be setup prior
187
- # to generating it.
188
- #
189
- # A block can be optionally supplied to act as a clean up method,
190
- # that is the block will be saved and executed after the next
191
- # cycle has been generated.
192
- #
193
- # See the V93K store_next_cycle method for an example of using
194
- # this.
195
- def preset_next_vector(attrs = {}, &block)
196
- @preset_next_vector = attrs
197
- @preset_next_vector_cleanup = block
198
- end
199
-
200
- # Called by every $tester.cycle command to push a vector to the stage object
201
- def push_vector(attrs = {})
202
- attrs = {
203
- dont_compress: @dont_compress
204
- }.merge(attrs)
205
- unless @inhibit_vectors
206
- if @preset_next_vector
207
- attrs = @preset_next_vector.merge(attrs) do |key, preset, current|
208
- if preset && current && current != ''
209
- fail "Value for #{key} set by preset_next_vector clashed with the next vector!"
210
- else
211
- preset || current
212
- end
213
- end
214
- @preset_next_vector = nil
215
- end
216
- stage.store Vector.new(attrs)
217
- inc_vec_count
218
- inc_cycle_count(attrs[:repeat] || 1)
219
- if @preset_next_vector_cleanup
220
- @preset_next_vector_cleanup.call
221
- @preset_next_vector_cleanup = nil
222
- end
223
- end
224
- end
225
- alias_method :vector, :push_vector
226
-
227
- def update_vector(attrs = {})
228
- unless @inhibit_vectors
229
- offset = (attrs.delete(:offset) || 0).abs
230
- stage.last_vector(offset).update(attrs)
231
- end
232
- end
233
-
234
- def update_vector_pin_val(pin, options = {})
235
- unless @inhibit_vectors
236
- offset = (options.delete(:offset) || 0).abs
237
- stage.last_vector(offset).update_pin_val(pin)
238
- end
239
- end
240
-
241
- # Adds the given microcode to the last vector if possible. If not possible (meaning the
242
- # vector already contains microcode) then a new cycle will be added with the given
243
- # microcode.
244
- def add_microcode_to_last_or_cycle(code)
245
- cycle if !stage.last_vector || stage.last_vector.has_microcode?
246
- stage.last_vector.update(microcode: code)
247
- end
248
-
249
- # Final pass of a generator vector array which returns lines suitable for writing to the
250
- # output file. This gives the tester model a chance to concatenate repeats and any other
251
- # last optimization/formatting changes it wishes to make.
252
- #
253
- # At this point vector array contains a combination of non-vector lines and uncompressed
254
- # Vector objects (vector lines)
255
- #
256
- def format(vector_array, section)
257
- # Go through vector_array and print out both
258
- # vectors and non-vectors to pattern (via 'yield line')
259
- vector_array.each do |vec|
260
- # These may eventually be merged to the same method, but splitting for now
261
- # so that multi mode development can proceed without upsetting single mode
262
- if vector_group_size > 1
263
- multi_mode_optimize(vec, section: section) do |line|
264
- yield line
265
- end
266
- else
267
- optimize(vec, section: section) do |line|
268
- yield line
269
- end
270
- end
271
- end
272
- # now flush buffer if there is still a vector
273
- if vector_group_size > 1
274
- pipeline.empty do |vector|
275
- expand_vector(vector) do |line|
276
- yield line
277
- end
278
- end
279
- else
280
- if @buffered_vector
281
- expand_vector(@buffered_vector) do |line|
282
- yield line
283
- end
284
- @buffered_vector = nil
285
- end
286
- end
287
- end
288
-
289
- # Tester models can overwrite this if they wish to inject any additional pattern lines
290
- # at final pattern dump time
291
- def before_write_pattern_line(line)
292
- [line]
293
- end
294
-
295
- def pipeline
296
- @pipeline ||= VectorPipeline.new(vector_group_size)
297
- end
298
-
299
- def multi_mode_optimize(vec, _options = {})
300
- pipeline << vec
301
- pipeline.flush do |vector|
302
- expand_vector(vector) do |line|
303
- yield line
304
- end
305
- end
306
- end
307
-
308
- def optimize(vec, options = {})
309
- options = { section: false
310
- }.merge(options)
311
-
312
- # Flush the buffer if this vector is not compressible or if it doesn't
313
- # match the existing buffer (to get ready for new vector)
314
- if @buffered_vector && (!(compressable_vector?(vec) && vec == @buffered_vector) ||
315
- @buffered_vector.repeat == @max_repeat_loop)
316
- expand_vector(@buffered_vector) do |line|
317
- # if last vector in pattern then pad if insufficient vectors
318
- if options[:section] == :footer && (@min_pattern_vectors) && (vec_count < @min_pattern_vectors)
319
- yield "#{comment_char} PADDING VECTORS ADDED TO MEET MIN #{@min_pattern_vectors} FOR PATTERN"
320
- (@min_pattern_vectors - vec_count + 1).times do
321
- yield line
322
- end
323
- inc_vec_count(@min_pattern_vectors - vec_count)
324
- else
325
- yield line
326
- end
327
- end
328
- @buffered_vector = nil
329
- end
330
- if compressable_vector?(vec)
331
- # The new vector has already been identified as equal to the buffer
332
- # so just increment vector if buffered already, otherwise it is the
333
- # first encounter with this vector and create buffer with it
334
- if @buffered_vector
335
- # simply increment repeat count
336
- @buffered_vector.repeat += vec.repeat
337
- # decrement vector count only once with each added repeat
338
- dec_vec_count(1)
339
- # if new repeat exceeds @max_repeat_loop
340
- if @buffered_vector.repeat > @max_repeat_loop
341
- delay(@buffered_vector.repeat) do |options|
342
- @buffered_vector.repeat = options[:repeat]
343
- if options[:repeat] == @max_repeat_loop
344
- expand_vector(@buffered_vector) do |line|
345
- yield line
346
- end
347
- end
348
- end
349
- end
350
- else
351
- # not buffered vector, set buffer to vector
352
- @buffered_vector = vec
353
- end
354
- else
355
- # not compressible
356
- expand_vector(vec) do |line|
357
- yield line
358
- end
359
- end
360
- end
361
- alias_method :buffer, :optimize
362
-
363
- def dont_compress
364
- if block_given?
365
- orig = @dont_compress
366
- @dont_compress = true
367
- yield
368
- @dont_compress = orig
369
- else
370
- @dont_compress
371
- end
372
- end
373
-
374
- def dont_compress=(val)
375
- @dont_compress = val
376
- end
377
-
378
- def compressable_vector?(vec)
379
- !!(compress && vec.is_a?(Vector) && !vec.has_microcode? &&
380
- vec.pin_vals && !vec.dont_compress)
381
- end
382
-
383
- # expands (uncompresses to pattern) vector if desired or leaves it as is
384
- # allows for tracking and formatting of vector
385
- # if comment then return without modification
386
- def expand_vector(vec)
387
- if vec.is_a?(Vector)
388
- if expand_repeats
389
- vec.repeat.times do
390
- vec.repeat = 1
391
- yield track_and_format_vector(vec)
392
- end
393
- else
394
- yield track_and_format_vector(vec)
395
- end
396
- else
397
- yield vec # Return comments without modification
398
- end
399
- end
400
-
401
- # Update tracking info (stats object) and allow for
402
- # any additional formatting via format_vector
403
- # method if overridden
404
- def track_and_format_vector(vec)
405
- unless vec.timeset
406
- puts 'No timeset defined!'
407
- puts 'Add one to your top level startup method or target like this:'
408
- puts '$tester.set_timeset("nvmbist", 40) # Where 40 is the period in ns'
409
- exit 1
410
- end
411
- stats = Origen.app.stats
412
- stats.add_vector
413
- if vector_group_size > 1 && vec.repeat > 1
414
- stats.add_cycle(1)
415
- stats.add_cycle((vec.repeat - 1) * vector_group_size)
416
- stats.add_time_in_ns(vec.timeset.period_in_ns)
417
- stats.add_time_in_ns((vec.repeat - 1) * vector_group_size * vec.timeset.period_in_ns)
418
- else
419
- stats.add_cycle(vec.repeat)
420
- stats.add_time_in_ns(vec.repeat * vec.timeset.period_in_ns)
421
- end
422
- format_vector(vec)
423
- end
424
-
425
- def format_vector(_vec)
426
- end
427
-
428
- def pingroup_map
429
- Origen.app.pingroup_map
430
- end
431
-
432
- # Cache the pin ordering for later use since all vectors should be formatted the same
433
- def ordered_pins_cache(options = {})
434
- @ordered_pins_cache ||= ordered_pins(options)
435
- end
436
-
437
- def ordered_pins(options = {})
438
- options = {
439
- include_inhibited_pins: false,
440
- include_pingroups: true
441
- }.merge(options)
442
-
443
- result = nil
444
-
445
- Origen.profile 'Working out pin pattern order' do
446
- pinorder = Origen.app.pin_pattern_order.dup
447
- pinexclude = Origen.app.pin_pattern_exclude.dup
448
-
449
- if Origen.app.pin_pattern_order.last.is_a?(Hash)
450
- options.merge!(pinorder.pop)
451
- end
452
- if Origen.app.pin_pattern_exclude.last.is_a?(Hash)
453
- options.merge!(pinexclude.pop)
454
- end
455
-
456
- ordered_pins = []
457
-
458
- # Create a copy of all pins and groups to be output, pins/groups will be delete from here as
459
- # they are output, so that at the end of the user defined pin order what is left in here can
460
- # either be discarded or output at the end
461
- pins = Origen.pin_bank.pins.dup
462
- pingroups = Origen.pin_bank.pin_groups.dup
463
-
464
- if pinorder && pinorder.size > 0
465
- pinorder.each do |id|
466
- # If the ID refers to a pin group
467
- if group = Origen.pin_bank.pin_groups[id]
468
- # If the group has still to be output just do that now
469
- if pingroups.include? group.id
470
- ordered_pins << group
471
- # Now delete the group from the list of groups still to be output and all of its pins
472
- # from the list pins still to be output
473
- group.each do |pin|
474
- pins.delete(pin.id)
475
- pin.groups.each do |name, _group|
476
- pingroups.delete(name)
477
- end
478
- end
479
- pingroups.delete(group.id)
480
- # To get here the some of the pins in the group have already been output which is preventing
481
- # output of the complete group at this point, in that case output any of its pins that have
482
- # still to go
483
- else
484
- group.each do |pin|
485
- if pins.include? pin.id
486
- ordered_pins << pin
487
- pin.groups.each do |name, _group|
488
- pingroups.delete(name)
489
- end
490
- end
491
- end
492
- end
493
- # this is a pin
494
- else
495
- pin = Origen.pin_bank.find(id)
496
- fail "Undefined pin (#{id}) added to pin_pattern_order" unless pin
497
- ordered_pins << pin
498
- pin.groups.each do |name, _group|
499
- pingroups.delete(name)
500
- end
501
- pin.name = id
502
- pins.delete(pin.id)
503
- end
504
- end
505
- end
506
-
507
- if pinexclude && pinexclude.size > 0
508
- pinexclude.each do |id|
509
- if group = Origen.pin_bank.pin_groups[id]
510
- # see if group is already in ordered_pins
511
- fail "Pin group #{id} is defined both in pin_pattern_order and pin_pattern_exclude" unless pingroups.include? id
512
- # this is a pin group, delete all pins in group
513
- pingroups.delete(id)
514
- group.each do |pin|
515
- fail "Pin (#{pin.name}) in group (#{group.id}) is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id
516
- pins.delete(pin.id)
517
- end
518
- else # this is a pin, delete the pin
519
- pin = Origen.pin_bank.find(id)
520
- fail "Undefined pin (#{id}) added to pin_pattern_exclude" unless pin
521
- fail "Pin #{pin.name} is defined both in pin_pattern_order and pin_pattern_exclude" unless pins.include? pin.id
522
- pin.name = id
523
- pins.delete(pin.id)
524
- pin.groups.each do |name, _group|
525
- pingroups.delete(name)
526
- end
527
- end
528
- end
529
- end
530
-
531
- unless options[:only]
532
- # all the rest of the pins to the end of the pattern order
533
- pins.each do |_id, pin|
534
- # check for port
535
- if pin.belongs_to_a_pin_group?
536
- # Are any of this pin's groups still waiting to be output? pingroups at this point contains
537
- # those groups which have not been rendered yet
538
- group = pingroups.find do |_id, group|
539
- pin.groups.any? { |_pid, pgroup| group == pgroup }
540
- end
541
- if group
542
- ordered_pins << group[1]
543
- group[1].each { |pin| pins.delete(pin.id) }
544
- else
545
- ordered_pins << pin
546
- end
547
- else
548
- ordered_pins << pin
549
- end
550
- end
551
- end
552
-
553
- result = ordered_pins.map do |pin|
554
- if options[:include_inhibited_pins]
555
- pin
556
- else
557
- inhibited_pins.include?(pin) ? nil : pin
558
- end
559
- end
560
- result = result.compact
561
- end
562
- result
563
- end
564
-
565
- def current_pin_vals
566
- ordered_pins_cache.map(&:to_vector).join(' ')
567
- end
568
-
569
- def get_pingroup(pin)
570
- pingroup_map.each do |id, pins|
571
- return id if pins.include? pin
572
- end
573
- nil
574
- end
575
-
576
- def update_pin_from_formatted_state(pin, state)
577
- if state == @repeat_previous || state == '-'
578
- pin.repeat_previous = true
579
- elsif state == @drive_very_hi_state || state == '2'
580
- pin.drive_very_hi
581
- elsif state == @drive_hi_state || state == '1'
582
- pin.drive_hi
583
- elsif state == @drive_lo_state || state == '0'
584
- pin.drive_lo
585
- elsif state == @expect_hi_state || state == 'H'
586
- pin.expect_hi
587
- elsif state == @expect_lo_state || state == 'L'
588
- pin.expect_lo
589
- elsif state == @expect_mid_state || state == 'M'
590
- pin.expect_mid
591
- elsif state == @drive_mem_state || state == 'D'
592
- pin.drive_mem
593
- elsif state == @expect_mem_state || state == 'E'
594
- pin.expect_mem
595
- elsif state == @capture_state || state == 'C'
596
- pin.capture
597
- elsif state == @dont_care_state || state == 'X'
598
- pin.dont_care
599
- else
600
- fail "Unknown pin state: #{state}"
601
- end
602
- end
603
-
604
- def format_pin_state(pin)
605
- if pin.repeat_previous? && @support_repeat_previous
606
- @repeat_previous || '-'
607
- elsif pin.driving?
608
- if pin.value == 1
609
- if pin.high_voltage?
610
- @drive_very_hi_state || '2'
611
- else
612
- @drive_hi_state || '1'
613
- end
614
- else
615
- @drive_lo_state || '0'
616
- end
617
- elsif pin.comparing_midband?
618
- @expect_mid_state || 'M'
619
- elsif pin.comparing?
620
- if pin.value == 1
621
- @expect_hi_state || 'H'
622
- else
623
- @expect_lo_state || 'L'
624
- end
625
- elsif pin.driving_mem?
626
- @drive_mem_state || 'D'
627
- elsif pin.comparing_mem?
628
- @expect_mem_state || 'E'
629
- elsif pin.to_be_captured?
630
- @capture_state || 'C'
631
- else
632
- @dont_care_state || 'X'
633
- end
634
- end
635
- end
636
- end
637
- end