origen 0.27.0 → 0.28.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.
- checksums.yaml +4 -4
- data/config/version.rb +1 -1
- data/lib/origen.rb +13 -0
- data/lib/origen/application/plugins.rb +3 -0
- data/lib/origen/commands.rb +1 -1
- data/lib/origen/commands/plugin.rb +240 -3
- data/lib/origen/core_ext.rb +1 -0
- data/lib/origen/core_ext/numeric.rb +6 -6
- data/lib/origen/core_ext/string.rb +24 -0
- data/lib/origen/core_ext/symbol.rb +5 -0
- data/lib/origen/model.rb +3 -0
- data/lib/origen/model/exporter.rb +238 -0
- data/lib/origen/parameters.rb +27 -6
- data/lib/origen/pins.rb +4 -0
- data/lib/origen/pins/pin.rb +26 -1
- data/lib/origen/power_domains/power_domain.rb +51 -11
- data/lib/origen/registers.rb +5 -4
- data/lib/origen/registers/bit_collection.rb +9 -4
- data/lib/origen/registers/reg.rb +66 -24
- data/lib/origen/site_config.rb +1 -1
- data/lib/origen/sub_blocks.rb +125 -38
- data/lib/origen/top_level.rb +6 -1
- data/lib/origen/users/user.rb +1 -1
- data/vendor/lib/models/origen/export1.rb +75 -0
- data/vendor/lib/models/origen/export1/block1.rb +13 -0
- data/vendor/lib/models/origen/export1/block1/x.rb +27 -0
- metadata +8 -3
data/lib/origen/registers.rb
CHANGED
@@ -41,6 +41,7 @@ module Origen
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def method_missing(method, *args, &block) # :nodoc:
|
44
|
+
orig_method = method
|
44
45
|
if method[-1] == '!'
|
45
46
|
bang = true
|
46
47
|
method = method.to_s.chop.to_sym
|
@@ -50,11 +51,11 @@ module Origen
|
|
50
51
|
r.sync if bang
|
51
52
|
r
|
52
53
|
else
|
53
|
-
super
|
54
|
+
super(orig_method, *args, &block)
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
def respond_to?(sym) # :nodoc:
|
58
|
+
def respond_to?(sym, include_private = false) # :nodoc:
|
58
59
|
if sym[-1] == '!'
|
59
60
|
r = sym.to_s.chop.to_sym
|
60
61
|
_registers.key?(r) || super(sym)
|
@@ -249,8 +250,8 @@ module Origen
|
|
249
250
|
materialize.send(method, *args, &block)
|
250
251
|
end
|
251
252
|
|
252
|
-
def respond_to?(method)
|
253
|
-
materialize.respond_to?(method)
|
253
|
+
def respond_to?(method, include_private = false)
|
254
|
+
materialize.respond_to?(method, include_private)
|
254
255
|
end
|
255
256
|
|
256
257
|
def materialize
|
@@ -502,13 +502,16 @@ module Origen
|
|
502
502
|
result.to_s
|
503
503
|
end
|
504
504
|
|
505
|
-
# Write the bit value on silicon
|
505
|
+
# Write the bit value on silicon.
|
506
506
|
# This method will update the data value of the bits and then call $top.write_register
|
507
|
-
# passing the
|
507
|
+
# passing the owning register as the first argument.
|
508
508
|
# This method is expected to handle writing the current state of the register to silicon.
|
509
509
|
def write!(value = nil, options = {})
|
510
510
|
value, options = nil, value if value.is_a?(Hash)
|
511
511
|
write(value, options) if value
|
512
|
+
if block_given?
|
513
|
+
yield size == @reg.size ? @reg : self
|
514
|
+
end
|
512
515
|
@reg.request(:write_register, options)
|
513
516
|
self
|
514
517
|
end
|
@@ -521,8 +524,10 @@ module Origen
|
|
521
524
|
# reg(:data).read!(0x5555) # Read register :data, expecting 0x5555
|
522
525
|
def read!(value = nil, options = {})
|
523
526
|
value, options = nil, value if value.is_a?(Hash)
|
524
|
-
read(value, options)
|
525
|
-
|
527
|
+
read(value, options) unless block_given?
|
528
|
+
if block_given?
|
529
|
+
yield size == @reg.size ? @reg : self
|
530
|
+
end
|
526
531
|
@reg.request(:read_register, options)
|
527
532
|
self
|
528
533
|
end
|
data/lib/origen/registers/reg.rb
CHANGED
@@ -126,17 +126,53 @@ module Origen
|
|
126
126
|
@updating_bound_bits
|
127
127
|
end
|
128
128
|
|
129
|
-
def inspect
|
129
|
+
def inspect(options = {})
|
130
|
+
# This fancy_output option is passed in via option hash
|
131
|
+
# Even better, the output could auto-detect 7-bit vs 8-bit terminal output and adjust the parameter, but that's for another day
|
132
|
+
fancy_output = options[:fancy_output].nil? ? true : options[:fancy_output]
|
133
|
+
if fancy_output
|
134
|
+
horiz_double_line = '═'
|
135
|
+
horiz_double_tee_down = '╤'
|
136
|
+
horiz_double_tee_up = '╧'
|
137
|
+
corner_double_up_left = '╒'
|
138
|
+
corner_double_up_right = '╕'
|
139
|
+
horiz_single_line = '─'
|
140
|
+
horiz_single_tee_down = '┬'
|
141
|
+
horiz_single_tee_up = '┴'
|
142
|
+
horiz_single_cross = '┼'
|
143
|
+
horiz_double_cross = '╪'
|
144
|
+
corner_single_down_left = '└'
|
145
|
+
corner_single_down_right = '┘'
|
146
|
+
vert_single_line = '│'
|
147
|
+
vert_single_tee_left = '┤'
|
148
|
+
vert_single_tee_right = '├'
|
149
|
+
else
|
150
|
+
horiz_double_line = '='
|
151
|
+
horiz_double_tee_down = '='
|
152
|
+
horiz_double_tee_up = '='
|
153
|
+
corner_double_up_left = '.'
|
154
|
+
corner_double_up_right = '.'
|
155
|
+
horiz_single_line = '-'
|
156
|
+
horiz_single_tee_down = '-'
|
157
|
+
horiz_single_tee_up = '-'
|
158
|
+
horiz_single_cross = '+'
|
159
|
+
horiz_double_cross = '='
|
160
|
+
corner_single_down_left = '`'
|
161
|
+
corner_single_down_right = '\''
|
162
|
+
vert_single_line = '|'
|
163
|
+
vert_single_tee_left = '<'
|
164
|
+
vert_single_tee_right = '>'
|
165
|
+
end
|
130
166
|
bit_width = 13
|
131
167
|
desc = ["\n0x%X - :#{name}" % address]
|
132
168
|
r = size % 8
|
133
169
|
if r == 0 || (size > 8 && bit_order == :msb0)
|
134
|
-
desc << ('
|
170
|
+
desc << (' ' + corner_double_up_left + ((horiz_double_line * bit_width + horiz_double_tee_down) * 8)).chop + corner_double_up_right
|
135
171
|
else
|
136
172
|
if bit_order == :lsb0
|
137
|
-
desc << ('
|
173
|
+
desc << (' ' + (' ' * (bit_width + 1) * (8 - r)) + corner_double_up_left + ((horiz_double_line * bit_width + horiz_double_tee_down) * r)).chop + corner_double_up_right
|
138
174
|
else
|
139
|
-
desc << ('
|
175
|
+
desc << (' ' + corner_double_up_left + ((horiz_double_line * bit_width + horiz_double_tee_down) * r)).chop + corner_double_up_right
|
140
176
|
end
|
141
177
|
end
|
142
178
|
|
@@ -164,16 +200,16 @@ module Origen
|
|
164
200
|
end
|
165
201
|
if bit_num > size - 1
|
166
202
|
if bit_order == :msb0 && bit_num == size
|
167
|
-
line +=
|
203
|
+
line += vert_single_line
|
168
204
|
line_complete = true
|
169
205
|
else
|
170
|
-
line << ' ' + ''.center(bit_width)
|
206
|
+
line << ' ' + ''.center(bit_width) unless line_complete
|
171
207
|
end
|
172
208
|
else
|
173
|
-
line <<
|
209
|
+
line << vert_single_line + "#{bit_num}".center(bit_width)
|
174
210
|
end
|
175
211
|
end
|
176
|
-
line +=
|
212
|
+
line += vert_single_line unless line_complete
|
177
213
|
desc << line
|
178
214
|
|
179
215
|
# BIT NAME ROW
|
@@ -213,15 +249,15 @@ module Origen
|
|
213
249
|
end
|
214
250
|
width = (bit_width * bit_span) + bit_span - 1
|
215
251
|
if bit_name.length > width
|
216
|
-
line <<
|
252
|
+
line << vert_single_line + "#{bit_name[0..width - 2]}*"
|
217
253
|
else
|
218
|
-
line <<
|
254
|
+
line << vert_single_line + bit_name.center(width)
|
219
255
|
end
|
220
256
|
|
221
257
|
else
|
222
258
|
bit.shift_out_left do |bit|
|
223
259
|
if _index_in_range?(bit.position, max_bit, min_bit)
|
224
|
-
line <<
|
260
|
+
line << vert_single_line + ''.center(bit_width)
|
225
261
|
end
|
226
262
|
end
|
227
263
|
end
|
@@ -237,12 +273,12 @@ module Origen
|
|
237
273
|
else
|
238
274
|
txt = ''
|
239
275
|
end
|
240
|
-
line <<
|
276
|
+
line << vert_single_line + txt.center(bit_width)
|
241
277
|
end
|
242
278
|
end
|
243
279
|
first_done = true
|
244
280
|
end
|
245
|
-
line +=
|
281
|
+
line += vert_single_line
|
246
282
|
desc << line
|
247
283
|
|
248
284
|
# BIT STATE ROW
|
@@ -272,11 +308,11 @@ module Origen
|
|
272
308
|
value += _state_desc(bit)
|
273
309
|
bit_span = _num_bits_in_range(bit, max_bit, min_bit)
|
274
310
|
width = bit_width * bit_span
|
275
|
-
line <<
|
311
|
+
line << vert_single_line + value.center(width + bit_span - 1)
|
276
312
|
else
|
277
313
|
bit.shift_out_left do |bit|
|
278
314
|
if _index_in_range?(bit.position, max_bit, min_bit)
|
279
|
-
line <<
|
315
|
+
line << vert_single_line + ''.center(bit_width)
|
280
316
|
end
|
281
317
|
end
|
282
318
|
end
|
@@ -292,31 +328,37 @@ module Origen
|
|
292
328
|
end
|
293
329
|
end
|
294
330
|
value = "#{val}" + _state_desc(bit)
|
295
|
-
line <<
|
331
|
+
line << vert_single_line + value.center(bit_width)
|
296
332
|
else
|
297
|
-
line <<
|
333
|
+
line << vert_single_line + ''.center(bit_width)
|
298
334
|
end
|
299
335
|
end
|
300
336
|
end
|
301
337
|
first_done = true
|
302
338
|
end
|
303
|
-
line +=
|
339
|
+
line += vert_single_line
|
304
340
|
desc << line
|
305
341
|
|
306
342
|
if size >= 8
|
307
343
|
r = size % 8
|
308
344
|
if byte_index == 0 && r != 0 && bit_order == :lsb0
|
309
|
-
desc << ('
|
345
|
+
desc << (' ' + corner_double_up_left + ((horiz_double_line * bit_width + horiz_double_tee_down) * (8 - r)).chop + horiz_double_cross + (horiz_single_line * (bit_width + 1) * r)).chop + vert_single_tee_left
|
310
346
|
elsif (byte_index == num_bytes - 1) && r != 0 && bit_order == :msb0
|
311
|
-
desc << ('
|
347
|
+
desc << (' ' + corner_single_down_left + ((horiz_single_line * bit_width + horiz_single_tee_up) * r)).chop + corner_single_down_right
|
348
|
+
elsif (byte_index == num_bytes - 2) && r != 0 && bit_order == :msb0
|
349
|
+
desc << ' ' + vert_single_tee_right + ((horiz_single_line * bit_width + horiz_single_cross) * r) + ((horiz_single_line * bit_width + horiz_single_tee_up) * (8 - r)).chop + corner_single_down_right
|
312
350
|
else
|
313
|
-
|
351
|
+
if byte_index == num_bytes - 1
|
352
|
+
desc << (' ' + corner_single_down_left + ((horiz_single_line * bit_width + horiz_single_tee_up) * 8)).chop + corner_single_down_right
|
353
|
+
else
|
354
|
+
desc << (' ' + vert_single_tee_right + ((horiz_single_line * bit_width + horiz_single_cross) * 8)).chop + vert_single_tee_left
|
355
|
+
end
|
314
356
|
end
|
315
357
|
else
|
316
358
|
if bit_order == :lsb0
|
317
|
-
desc << ('
|
359
|
+
desc << (' ' + (' ' * (bit_width + 1) * (8 - size)) + corner_single_down_left + ((horiz_single_line * bit_width + horiz_single_tee_up) * size)).chop + corner_single_down_right
|
318
360
|
else
|
319
|
-
desc << ('
|
361
|
+
desc << (' ' + corner_single_down_left + ((horiz_single_line * bit_width + horiz_single_tee_up) * size)).chop + corner_single_down_right
|
320
362
|
end
|
321
363
|
end
|
322
364
|
end
|
@@ -435,7 +477,7 @@ module Origen
|
|
435
477
|
if line =~ /^\s*#(.*)/
|
436
478
|
desc << Regexp.last_match[1].strip
|
437
479
|
# http://rubular.com/r/D8lg2P5kK1 http://rubular.com/r/XP4ydPV8Fd
|
438
|
-
elsif line =~ /^\s*reg\(?\s*[:"'](\w+)["']?\s*,.*\sdo/ || line =~ /^\s
|
480
|
+
elsif line =~ /^\s*reg\(?\s*[:"'](\w+)["']?\s*,.*\sdo/ || line =~ /^\s*.*add_reg\(?\s*[:"'](\w+)["']?\s*,.*/
|
439
481
|
@current_reg_name = Regexp.last_match[1].to_sym
|
440
482
|
description_lookup[define_file] ||= {}
|
441
483
|
description_lookup[define_file][@current_reg_name] ||= {}
|
data/lib/origen/site_config.rb
CHANGED
data/lib/origen/sub_blocks.rb
CHANGED
@@ -212,7 +212,7 @@ module Origen
|
|
212
212
|
end
|
213
213
|
alias_method :children, :sub_blocks
|
214
214
|
|
215
|
-
# Delete all sub_blocks by
|
215
|
+
# Delete all sub_blocks by emptying the Hash
|
216
216
|
def delete_sub_blocks
|
217
217
|
@sub_blocks = {}
|
218
218
|
end
|
@@ -265,47 +265,22 @@ module Origen
|
|
265
265
|
end
|
266
266
|
a
|
267
267
|
else
|
268
|
-
|
269
|
-
if
|
270
|
-
if
|
271
|
-
|
268
|
+
block = Placeholder.new(self, name, options)
|
269
|
+
if sub_blocks[name]
|
270
|
+
# Allow additional attributes to be added to an existing sub-block if it hasn't
|
271
|
+
# been instantiated yet. This is not supported yet for instantiated sub-blocks since
|
272
|
+
# there are probably a lot more corner-cases to consider, and hopefully no one will
|
273
|
+
# really need this anyway.
|
274
|
+
if sub_blocks[name].is_a?(Placeholder)
|
275
|
+
sub_blocks[name].add_attributes(options)
|
272
276
|
else
|
273
|
-
|
274
|
-
klass = eval(class_name)
|
275
|
-
else
|
276
|
-
if eval("defined? #{self.class}::#{class_name}")
|
277
|
-
klass = eval("#{self.class}::#{class_name}")
|
278
|
-
else
|
279
|
-
puts "Could not find class: #{class_name}"
|
280
|
-
fail 'Unknown sub block class!'
|
281
|
-
end
|
282
|
-
end
|
277
|
+
fail "You have already defined a sub-block named #{name} within class #{self.class}"
|
283
278
|
end
|
284
|
-
else
|
285
|
-
klass = Origen::SubBlock
|
286
|
-
end
|
287
|
-
unless klass.respond_to?(:includes_origen_model)
|
288
|
-
puts 'Any class which is to be instantiated as a sub_block must include Origen::Model,'
|
289
|
-
puts "add this to #{klass}:"
|
290
|
-
puts ''
|
291
|
-
puts ' include Origen::Model'
|
292
|
-
puts ''
|
293
|
-
fail 'Sub block does not include Origen::Model!'
|
294
|
-
end
|
295
|
-
block = klass.new(options.merge(parent: self, name: name))
|
296
|
-
if sub_blocks[name]
|
297
|
-
fail "You have already defined a sub-block named #{name} within class #{self.class}"
|
298
279
|
else
|
299
280
|
sub_blocks[name] = block
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
# raise "Non-unique sub-block name!"
|
304
|
-
else
|
305
|
-
define_singleton_method name do
|
306
|
-
sub_blocks[name]
|
307
|
-
end
|
308
|
-
end
|
281
|
+
end
|
282
|
+
define_singleton_method name do
|
283
|
+
get_sub_block(name)
|
309
284
|
end
|
310
285
|
block
|
311
286
|
end
|
@@ -314,6 +289,116 @@ module Origen
|
|
314
289
|
def namespace
|
315
290
|
self.class.to_s.sub(/::[^:]*$/, '')
|
316
291
|
end
|
292
|
+
|
293
|
+
private
|
294
|
+
|
295
|
+
def get_sub_block(name)
|
296
|
+
sub_blocks[name]
|
297
|
+
end
|
298
|
+
|
299
|
+
def instantiate_sub_block(name, klass, options)
|
300
|
+
return sub_blocks[name] unless sub_blocks[name].is_a?(Placeholder)
|
301
|
+
sub_blocks[name] = klass.new(options.merge(parent: self, name: name))
|
302
|
+
end
|
303
|
+
|
304
|
+
class Placeholder
|
305
|
+
attr_reader :name, :owner, :attributes
|
306
|
+
|
307
|
+
def initialize(owner, name, attributes)
|
308
|
+
@owner = owner
|
309
|
+
@name = name
|
310
|
+
@attributes = attributes
|
311
|
+
end
|
312
|
+
|
313
|
+
def add_attributes(attrs)
|
314
|
+
@attributes = @attributes.merge(attrs)
|
315
|
+
end
|
316
|
+
|
317
|
+
# Make this appear like a sub-block to any application code
|
318
|
+
def is_a?(klass)
|
319
|
+
klass == self.klass || klass == self.class
|
320
|
+
end
|
321
|
+
|
322
|
+
# Make it look like a sub-block in the console to avoid confusion
|
323
|
+
def inspect
|
324
|
+
"<SubBlock: #{name}>"
|
325
|
+
end
|
326
|
+
|
327
|
+
def method_missing(method, *args, &block)
|
328
|
+
materialize.send(method, *args, &block)
|
329
|
+
end
|
330
|
+
|
331
|
+
def respond_to?(method, include_private = false)
|
332
|
+
materialize.respond_to?(method, include_private)
|
333
|
+
end
|
334
|
+
|
335
|
+
def materialize
|
336
|
+
file = attributes.delete(:file)
|
337
|
+
block = owner.send(:instantiate_sub_block, name, klass, attributes)
|
338
|
+
if file
|
339
|
+
require File.join(owner.send(:export_dir), file)
|
340
|
+
block.extend owner.send(:export_module_names_from_path, file).join('::').constantize
|
341
|
+
end
|
342
|
+
block
|
343
|
+
end
|
344
|
+
|
345
|
+
def ==(obj)
|
346
|
+
materialize == obj
|
347
|
+
end
|
348
|
+
|
349
|
+
def !=(obj)
|
350
|
+
materialize != obj
|
351
|
+
end
|
352
|
+
|
353
|
+
def freeze
|
354
|
+
materialize.freeze
|
355
|
+
end
|
356
|
+
|
357
|
+
def clone
|
358
|
+
materialize.clone
|
359
|
+
end
|
360
|
+
|
361
|
+
def dup
|
362
|
+
materialize.dup
|
363
|
+
end
|
364
|
+
|
365
|
+
def to_json(*args)
|
366
|
+
materialize.to_json(*args)
|
367
|
+
end
|
368
|
+
|
369
|
+
def klass
|
370
|
+
@klass ||= begin
|
371
|
+
class_name = attributes.delete(:class_name)
|
372
|
+
if class_name
|
373
|
+
if eval("defined? ::#{owner.namespace}::#{class_name}")
|
374
|
+
klass = eval("::#{owner.namespace}::#{class_name}")
|
375
|
+
else
|
376
|
+
if eval("defined? #{class_name}")
|
377
|
+
klass = eval(class_name)
|
378
|
+
else
|
379
|
+
if eval("defined? #{owner.class}::#{class_name}")
|
380
|
+
klass = eval("#{owner.class}::#{class_name}")
|
381
|
+
else
|
382
|
+
puts "Could not find class: #{class_name}"
|
383
|
+
fail 'Unknown sub block class!'
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
else
|
388
|
+
klass = Origen::SubBlock
|
389
|
+
end
|
390
|
+
unless klass.respond_to?(:includes_origen_model)
|
391
|
+
puts 'Any class which is to be instantiated as a sub_block must include Origen::Model,'
|
392
|
+
puts "add this to #{klass}:"
|
393
|
+
puts ''
|
394
|
+
puts ' include Origen::Model'
|
395
|
+
puts ''
|
396
|
+
fail 'Sub block does not include Origen::Model!'
|
397
|
+
end
|
398
|
+
klass
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
317
402
|
end
|
318
403
|
|
319
404
|
# A simple class that will be instantiated by default when a sub block is
|
@@ -328,6 +413,8 @@ module Origen
|
|
328
413
|
# On first call of a missing method a method is generated to avoid the missing lookup
|
329
414
|
# next time, this should be faster for repeated lookups of the same method, e.g. reg
|
330
415
|
def method_missing(method, *args, &block)
|
416
|
+
super
|
417
|
+
rescue NoMethodError
|
331
418
|
return regs(method) if self.has_reg?(method)
|
332
419
|
return ports(method) if self.has_port?(method)
|
333
420
|
if method.to_s =~ /=$/
|
data/lib/origen/top_level.rb
CHANGED
@@ -63,7 +63,12 @@ module Origen
|
|
63
63
|
#
|
64
64
|
# This allows different pin configurations to be specified by package.
|
65
65
|
def current_package=(val)
|
66
|
-
@current_package_id =
|
66
|
+
@current_package_id = case val
|
67
|
+
when ChipPackage
|
68
|
+
val.id
|
69
|
+
else
|
70
|
+
packages.include?(val) ? val : nil
|
71
|
+
end
|
67
72
|
end
|
68
73
|
alias_method :package=, :current_package=
|
69
74
|
|