origen 0.27.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|