origen 0.60.7 → 0.60.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/rubocop/easy.yml +4875 -308
- data/config/rubocop/strict.yml +4875 -308
- data/config/version.rb +1 -1
- data/lib/origen/application/configuration.rb +6 -3
- data/lib/origen/application/deployer.rb +4 -4
- data/lib/origen/application/environment.rb +4 -2
- data/lib/origen/application/lsf.rb +23 -4
- data/lib/origen/application/lsf_manager.rb +48 -52
- data/lib/origen/application/plugins.rb +7 -7
- data/lib/origen/application/release.rb +5 -3
- data/lib/origen/application/runner.rb +5 -6
- data/lib/origen/application/statistics.rb +1 -0
- data/lib/origen/application/target.rb +9 -6
- data/lib/origen/application/version_tracker.rb +4 -5
- data/lib/origen/application/workspace_manager.rb +5 -2
- data/lib/origen/application.rb +9 -9
- data/lib/origen/boot/api.rb +3 -0
- data/lib/origen/boot/app.rb +28 -30
- data/lib/origen/boot.rb +1 -0
- data/lib/origen/bugs.rb +2 -2
- data/lib/origen/chip_mode.rb +7 -4
- data/lib/origen/chip_package.rb +50 -53
- data/lib/origen/chips/chip.rb +8 -4
- data/lib/origen/chips.rb +16 -12
- data/lib/origen/client.rb +1 -0
- data/lib/origen/clocks/clock.rb +8 -7
- data/lib/origen/clocks/clocks_collection.rb +2 -1
- data/lib/origen/code_generators/actions.rb +1 -1
- data/lib/origen/code_generators/base.rb +1 -1
- data/lib/origen/code_generators.rb +3 -0
- data/lib/origen/commands/archive.rb +1 -1
- data/lib/origen/commands/compile.rb +2 -2
- data/lib/origen/commands/fetch.rb +1 -1
- data/lib/origen/commands/generate.rb +3 -3
- data/lib/origen/commands/interactive.rb +6 -7
- data/lib/origen/commands/lint.rb +1 -1
- data/lib/origen/commands/lsf.rb +2 -2
- data/lib/origen/commands/new.rb +1 -1
- data/lib/origen/commands/plugin.rb +2 -2
- data/lib/origen/commands/program.rb +3 -3
- data/lib/origen/commands/rc.rb +4 -4
- data/lib/origen/commands/save.rb +1 -1
- data/lib/origen/commands/time.rb +4 -6
- data/lib/origen/commands/web.rb +5 -2
- data/lib/origen/commands.rb +1 -1
- data/lib/origen/componentable.rb +1 -0
- data/lib/origen/controller.rb +11 -13
- data/lib/origen/core_ext/array.rb +2 -1
- data/lib/origen/core_ext/enumerable.rb +4 -2
- data/lib/origen/core_ext/hash.rb +5 -6
- data/lib/origen/core_ext/integer.rb +2 -4
- data/lib/origen/core_ext/object.rb +2 -2
- data/lib/origen/core_ext/option_parser/optparse.rb +1 -1
- data/lib/origen/core_ext/string.rb +8 -8
- data/lib/origen/database/key_value_store.rb +12 -14
- data/lib/origen/database/key_value_stores.rb +1 -0
- data/lib/origen/errata/hw_erratum.rb +1 -1
- data/lib/origen/errata.rb +7 -8
- data/lib/origen/features/feature.rb +1 -0
- data/lib/origen/features.rb +4 -6
- data/lib/origen/file_handler.rb +8 -7
- data/lib/origen/fuses/fuse_field.rb +2 -2
- data/lib/origen/generator/compiler.rb +2 -4
- data/lib/origen/generator/job.rb +3 -2
- data/lib/origen/generator/pattern.rb +3 -3
- data/lib/origen/generator/pattern_finder.rb +6 -5
- data/lib/origen/generator/pattern_sequence.rb +3 -0
- data/lib/origen/generator/renderer.rb +3 -4
- data/lib/origen/generator/resources.rb +1 -1
- data/lib/origen/generator/stage.rb +3 -0
- data/lib/origen/limits/limit.rb +14 -11
- data/lib/origen/limits/limit_set.rb +2 -1
- data/lib/origen/loader.rb +4 -2
- data/lib/origen/log.rb +3 -2
- data/lib/origen/memory.rb +1 -0
- data/lib/origen/model.rb +10 -4
- data/lib/origen/models.rb +2 -2
- data/lib/origen/netlist/list.rb +1 -0
- data/lib/origen/netlist.rb +5 -7
- data/lib/origen/org_file/interceptor.rb +1 -1
- data/lib/origen/org_file.rb +4 -1
- data/lib/origen/parameters/set.rb +1 -0
- data/lib/origen/parameters.rb +3 -1
- data/lib/origen/pins/pin.rb +18 -12
- data/lib/origen/pins/pin_bank.rb +3 -0
- data/lib/origen/pins/pin_clock.rb +3 -2
- data/lib/origen/pins/pin_collection.rb +3 -0
- data/lib/origen/pins/timing/wave.rb +5 -0
- data/lib/origen/pins.rb +7 -1
- data/lib/origen/ports.rb +1 -1
- data/lib/origen/power_domains/power_domain.rb +5 -2
- data/lib/origen/power_domains/power_domains_collection.rb +2 -1
- data/lib/origen/registers/bit.rb +21 -17
- data/lib/origen/registers/bit_collection.rb +15 -6
- data/lib/origen/registers/reg.rb +34 -28
- data/lib/origen/registers.rb +25 -24
- data/lib/origen/remote_manager.rb +3 -2
- data/lib/origen/revision_control/base.rb +1 -4
- data/lib/origen/revision_control/design_sync.rb +10 -10
- data/lib/origen/revision_control/git.rb +4 -2
- data/lib/origen/site_config/config.rb +3 -1
- data/lib/origen/site_config.rb +3 -0
- data/lib/origen/specs/checkers.rb +12 -8
- data/lib/origen/specs/doc_resource.rb +3 -4
- data/lib/origen/specs/spec.rb +5 -1
- data/lib/origen/specs/version_history.rb +1 -1
- data/lib/origen/specs.rb +52 -37
- data/lib/origen/sub_blocks.rb +20 -14
- data/lib/origen/top_level.rb +2 -1
- data/lib/origen/users/user.rb +4 -5
- data/lib/origen/utility/csv_data.rb +6 -4
- data/lib/origen/utility/diff.rb +9 -9
- data/lib/origen/utility/file_diff.rb +4 -0
- data/lib/origen/utility/input_capture.rb +6 -6
- data/lib/origen/utility/mailer.rb +8 -11
- data/lib/origen/utility/time_and_date.rb +1 -2
- data/lib/origen/utility.rb +2 -2
- data/lib/origen/value.rb +2 -1
- data/lib/origen/version_string.rb +33 -41
- data/lib/origen.rb +62 -64
- data/origen_app_generators/origen_app_generators.gemspec +1 -1
- data/origen_site_config.yml +2 -0
- metadata +9 -27
- data/config/rubocop/easy_disabled.yml +0 -275
- data/config/rubocop/easy_enabled.yml +0 -727
- data/config/rubocop/strict_disabled.yml +0 -251
- data/config/rubocop/strict_enabled.yml +0 -751
data/lib/origen/specs.rb
CHANGED
@@ -14,7 +14,7 @@ module Origen
|
|
14
14
|
require 'origen/specs/checkers'
|
15
15
|
include Checkers
|
16
16
|
|
17
|
-
|
17
|
+
attr_writer :_specs, :_notes, :_exhibits, :_doc_resources, :_overrides, :_power_supplies, :_mode_selects, :_version_history, :_creation_info, :_spec_features, :_documentation
|
18
18
|
|
19
19
|
# Detailed description for the ip block
|
20
20
|
attr_accessor :description
|
@@ -53,15 +53,15 @@ module Origen
|
|
53
53
|
}.update(options || {})
|
54
54
|
_specs
|
55
55
|
if s.nil?
|
56
|
-
|
56
|
+
show_specs(options)
|
57
57
|
elsif s.is_a? Hash
|
58
58
|
# no spec was passed but some option was passed
|
59
59
|
options.update(s)
|
60
|
-
|
60
|
+
show_specs(options)
|
61
61
|
else
|
62
62
|
# a spec was passed
|
63
63
|
options[:spec] = s
|
64
|
-
|
64
|
+
show_specs(options)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -69,14 +69,16 @@ module Origen
|
|
69
69
|
def spec(name, type = nil, mode = nil, &block)
|
70
70
|
return specs(name, type) unless block_given?
|
71
71
|
fail 'A type argument is required when defining a spec!' unless type
|
72
|
+
|
72
73
|
_specs
|
73
74
|
name = name_audit(name)
|
74
75
|
fail 'Specification names must be of SPEC_TYPES Symbol or String and cannot start with a number' if name.nil?
|
75
76
|
fail "Spec type must be one of #{SPEC_TYPES.join(', ')}" unless SPEC_TYPES.include? type
|
77
|
+
|
76
78
|
type = type
|
77
79
|
mode = get_mode if mode.nil?
|
78
80
|
owner_name = ''
|
79
|
-
if
|
81
|
+
if respond_to?(:name) && send(:name)
|
80
82
|
owner_name = self.name.to_s.downcase.to_sym
|
81
83
|
elsif self == Origen.top_level
|
82
84
|
owner_name = self.class.to_s.split('::').last.downcase.to_sym
|
@@ -91,6 +93,7 @@ module Origen
|
|
91
93
|
# This is a fatal error.
|
92
94
|
fail "Spec already exists for name: #{name}, type: #{type}, mode: #{mode} for object #{self}"
|
93
95
|
end
|
96
|
+
|
94
97
|
@_specs[name][mode][type][spec_placeholder.sub_type] = spec_placeholder
|
95
98
|
end
|
96
99
|
|
@@ -107,9 +110,9 @@ module Origen
|
|
107
110
|
creating_spec: false
|
108
111
|
}.update(options)
|
109
112
|
if @_specs.nil? || @_specs == {}
|
110
|
-
|
113
|
+
false
|
111
114
|
else
|
112
|
-
|
115
|
+
!!show_specs(options)
|
113
116
|
end
|
114
117
|
end
|
115
118
|
|
@@ -228,6 +231,7 @@ module Origen
|
|
228
231
|
}.update(options)
|
229
232
|
return nil if @_notes.nil?
|
230
233
|
return nil if @_notes.empty?
|
234
|
+
|
231
235
|
# Empty 2-D Hash to be used for notes found based on id and type
|
232
236
|
notes_found = Hash.new do |h, k|
|
233
237
|
# h is the id portion of the hash
|
@@ -243,11 +247,11 @@ module Origen
|
|
243
247
|
end
|
244
248
|
end
|
245
249
|
if notes_found.empty?
|
246
|
-
|
250
|
+
nil
|
247
251
|
elsif notes_found.size == 1
|
248
252
|
notes_found.values.first.values.first
|
249
253
|
else
|
250
|
-
|
254
|
+
notes_found
|
251
255
|
end
|
252
256
|
end
|
253
257
|
|
@@ -259,6 +263,7 @@ module Origen
|
|
259
263
|
return @_spec_features if options[:id].nil? && options[:device].nil?
|
260
264
|
return nil if @_spec_features.nil?
|
261
265
|
return nil if @_spec_features.empty?
|
266
|
+
|
262
267
|
features_found = Hash.new do |h, k|
|
263
268
|
h[k] = {}
|
264
269
|
end
|
@@ -268,11 +273,11 @@ module Origen
|
|
268
273
|
end
|
269
274
|
end
|
270
275
|
if features_found.empty?
|
271
|
-
|
276
|
+
nil
|
272
277
|
elsif features_found.size == 1
|
273
278
|
features_found.values.first.values.first
|
274
279
|
else
|
275
|
-
|
280
|
+
features_found
|
276
281
|
end
|
277
282
|
end
|
278
283
|
|
@@ -284,6 +289,7 @@ module Origen
|
|
284
289
|
}.update(options)
|
285
290
|
return nil if @_exhibits.nil?
|
286
291
|
return nil if @_exhibits.empty?
|
292
|
+
|
287
293
|
ex_found = Hash.new do |h, k|
|
288
294
|
h[k] = Hash.new do |hh, kk|
|
289
295
|
hh[kk] = {}
|
@@ -297,9 +303,9 @@ module Origen
|
|
297
303
|
end
|
298
304
|
end
|
299
305
|
if ex_found.empty?
|
300
|
-
|
306
|
+
nil
|
301
307
|
else
|
302
|
-
|
308
|
+
ex_found
|
303
309
|
end
|
304
310
|
end
|
305
311
|
|
@@ -312,6 +318,7 @@ module Origen
|
|
312
318
|
}.update(options)
|
313
319
|
return nil if @_doc_resources.nil?
|
314
320
|
return nil if @_doc_resources.empty?
|
321
|
+
|
315
322
|
dr_found = Hash.new do |h, k|
|
316
323
|
h[k] = Hash.new do |hh, kk|
|
317
324
|
hh[kk] = Hash.new do |hhh, kkk|
|
@@ -329,9 +336,9 @@ module Origen
|
|
329
336
|
end
|
330
337
|
end
|
331
338
|
if dr_found.empty?
|
332
|
-
|
339
|
+
nil
|
333
340
|
else
|
334
|
-
|
341
|
+
dr_found
|
335
342
|
end
|
336
343
|
end
|
337
344
|
|
@@ -347,6 +354,7 @@ module Origen
|
|
347
354
|
}.update(options)
|
348
355
|
return nil if @_documentation.nil?
|
349
356
|
return nil if @_documentation.empty?
|
357
|
+
|
350
358
|
doc_found = Hash.new do |h, k|
|
351
359
|
h[k] = Hash.new do |hh, kk|
|
352
360
|
hh[kk] = Hash.new do |hhh, kkk|
|
@@ -376,9 +384,9 @@ module Origen
|
|
376
384
|
end
|
377
385
|
end
|
378
386
|
if doc_found.empty?
|
379
|
-
|
387
|
+
nil
|
380
388
|
else
|
381
|
-
|
389
|
+
doc_found
|
382
390
|
end
|
383
391
|
end
|
384
392
|
|
@@ -392,6 +400,7 @@ module Origen
|
|
392
400
|
}.update(options)
|
393
401
|
return nil if @_overrides.nil?
|
394
402
|
return nil if @_overrides.empty?
|
403
|
+
|
395
404
|
overrides_found = Hash.new do |h, k|
|
396
405
|
h[k] = Hash.new do |hh, kk|
|
397
406
|
hh[kk] = Hash.new do |hhh, kkk|
|
@@ -413,9 +422,9 @@ module Origen
|
|
413
422
|
end
|
414
423
|
end
|
415
424
|
if overrides_found.empty?
|
416
|
-
|
425
|
+
nil
|
417
426
|
else
|
418
|
-
|
427
|
+
overrides_found
|
419
428
|
end
|
420
429
|
end
|
421
430
|
|
@@ -426,7 +435,8 @@ module Origen
|
|
426
435
|
}.update(options)
|
427
436
|
return nil if @_mode_selects.nil?
|
428
437
|
return nil if @_mode_selects.empty?
|
429
|
-
|
438
|
+
|
439
|
+
modes_found = Hash.new do |h, k|
|
430
440
|
h[k] = {}
|
431
441
|
end
|
432
442
|
filter_hash(@_mode_selects, options[:block]).each do |block, hash|
|
@@ -435,9 +445,9 @@ module Origen
|
|
435
445
|
end
|
436
446
|
end
|
437
447
|
if modes_found.empty?
|
438
|
-
|
448
|
+
nil
|
439
449
|
else
|
440
|
-
|
450
|
+
modes_found
|
441
451
|
end
|
442
452
|
end
|
443
453
|
|
@@ -446,20 +456,21 @@ module Origen
|
|
446
456
|
gen: nil,
|
447
457
|
act: nil
|
448
458
|
}.update(options)
|
449
|
-
ps_found = Hash.new do|h, k|
|
459
|
+
ps_found = Hash.new do |h, k|
|
450
460
|
h[k] = {}
|
451
461
|
end
|
452
462
|
return nil if @_power_supplies.nil?
|
453
463
|
return nil if @_power_supplies.empty?
|
464
|
+
|
454
465
|
filter_hash(@_power_supplies, options[:gen]).each do |gen, hash|
|
455
466
|
filter_hash(hash, options[:act]).each do |act, sel|
|
456
467
|
ps_found[gen][act] = sel
|
457
468
|
end
|
458
469
|
end
|
459
470
|
if ps_found.empty?
|
460
|
-
|
471
|
+
nil
|
461
472
|
else
|
462
|
-
|
473
|
+
ps_found
|
463
474
|
end
|
464
475
|
end
|
465
476
|
|
@@ -476,6 +487,7 @@ module Origen
|
|
476
487
|
end
|
477
488
|
return nil if @_version_history.nil?
|
478
489
|
return nil if @_version_history.empty?
|
490
|
+
|
479
491
|
filter_hash(@_version_history, options[:date]).each do |date, hash|
|
480
492
|
filter_hash(hash, options[:author]).each do |author, hash1|
|
481
493
|
filter_hash(hash1, options[:label]).each do |label, ver|
|
@@ -484,9 +496,9 @@ module Origen
|
|
484
496
|
end
|
485
497
|
end
|
486
498
|
if vh_found.empty?
|
487
|
-
|
499
|
+
nil
|
488
500
|
else
|
489
|
-
|
501
|
+
vh_found
|
490
502
|
end
|
491
503
|
end
|
492
504
|
|
@@ -644,6 +656,7 @@ module Origen
|
|
644
656
|
# Return a hash based on the filter provided
|
645
657
|
def filter_hash(hash, filter, debug = false)
|
646
658
|
fail 'Hash argument is not a Hash!' unless hash.is_a? Hash
|
659
|
+
|
647
660
|
filtered_hash = {}
|
648
661
|
select_logic = case filter
|
649
662
|
when String then 'k.nil? ? false : k[Regexp.new(filter)] && k.length == filter.length'
|
@@ -653,8 +666,7 @@ module Origen
|
|
653
666
|
'k == filter'
|
654
667
|
when NilClass then true # Return all specs if a filter is set to nil (i.e. user doesn't care about this filter)
|
655
668
|
else true
|
656
|
-
|
657
|
-
# rubocop:disable UnusedBlockArgument
|
669
|
+
end
|
658
670
|
filtered_hash = hash.select do |k, v|
|
659
671
|
# binding.pry if filter == 'SubSection A'
|
660
672
|
[TrueClass, FalseClass].include?(select_logic.class) ? select_logic : eval(select_logic)
|
@@ -711,14 +723,14 @@ module Origen
|
|
711
723
|
end
|
712
724
|
end
|
713
725
|
Origen.log.debug "Returning no specs for options #{options}"
|
714
|
-
|
726
|
+
nil
|
715
727
|
elsif specs_to_be_shown.size == 1
|
716
728
|
print_to_console(specs_to_be_shown) if options[:verbose] == true
|
717
729
|
Origen.log.debug "returning one spec #{specs_to_be_shown.first.name}"
|
718
|
-
|
730
|
+
specs_to_be_shown.first
|
719
731
|
else
|
720
732
|
Origen.log.debug "returning an array of specs during initial search: #{specs_to_be_shown}"
|
721
|
-
|
733
|
+
specs_to_be_shown
|
722
734
|
end
|
723
735
|
end
|
724
736
|
|
@@ -727,18 +739,18 @@ module Origen
|
|
727
739
|
whitespace_padding = 3
|
728
740
|
table = []
|
729
741
|
attrs_to_be_shown = {
|
730
|
-
name: SpecTableAttr.new('Name',
|
731
|
-
symbol: SpecTableAttr.new('Symbol',
|
742
|
+
name: SpecTableAttr.new('Name', true, 'Name'.length + whitespace_padding),
|
743
|
+
symbol: SpecTableAttr.new('Symbol', false, 'Symbol'.length + whitespace_padding),
|
732
744
|
mode: SpecTableAttr.new('Mode', true, 'Mode'.length + whitespace_padding),
|
733
745
|
type: SpecTableAttr.new('Type', true, 'Type'.length + whitespace_padding),
|
734
|
-
sub_type: SpecTableAttr.new('Sub-Type',
|
746
|
+
sub_type: SpecTableAttr.new('Sub-Type', false, 'Sub-Type'.length + whitespace_padding),
|
735
747
|
# spec SpecTableAttribute :description is called parameter in the spec table output to match historical docs
|
736
748
|
description: SpecTableAttr.new('Parameter', false, 'Parameter'.length + whitespace_padding),
|
737
749
|
min: SpecTableAttr.new('Min', false, 'Min'.length + whitespace_padding),
|
738
750
|
typ: SpecTableAttr.new('Typ', false, 'Typ'.length + whitespace_padding),
|
739
751
|
max: SpecTableAttr.new('Max', false, 'Max'.length + whitespace_padding),
|
740
|
-
unit: SpecTableAttr.new('Unit',
|
741
|
-
audience: SpecTableAttr.new('Audience',
|
752
|
+
unit: SpecTableAttr.new('Unit', false, 'Unit'.length + whitespace_padding),
|
753
|
+
audience: SpecTableAttr.new('Audience', false, 'Audience'.length + whitespace_padding)
|
742
754
|
# notes: SpecTableAttr.new('Notes', false, 'Notes'.length + whitespace_padding)
|
743
755
|
}
|
744
756
|
# Calculate the padding needed in the spec table for the longest attr of all specs
|
@@ -747,6 +759,7 @@ module Origen
|
|
747
759
|
unless spec.send(attr_name).nil?
|
748
760
|
if spec.send(attr_name).class == Origen::Specs::Spec::Limit
|
749
761
|
next if spec.send(attr_name).value.nil?
|
762
|
+
|
750
763
|
current_padding = spec.send(attr_name).value.to_s.length + whitespace_padding
|
751
764
|
else
|
752
765
|
current_padding = spec.send(attr_name).to_s.length + whitespace_padding
|
@@ -760,6 +773,7 @@ module Origen
|
|
760
773
|
header = ''
|
761
774
|
attrs_to_be_shown.each do |_attr_name, attr_struct|
|
762
775
|
next if attr_struct.show == false
|
776
|
+
|
763
777
|
header += "| #{attr_struct.table_text}".ljust(attr_struct.padding)
|
764
778
|
end
|
765
779
|
header += '|'
|
@@ -775,6 +789,7 @@ module Origen
|
|
775
789
|
data = ''
|
776
790
|
attrs_to_be_shown.each do |attr_name, attr_struct|
|
777
791
|
next if attr_struct.show == false
|
792
|
+
|
778
793
|
if spec.send(attr_name).class == Origen::Specs::Spec::Limit
|
779
794
|
data += "| #{spec.send(attr_name).value}".ljust(attr_struct.padding)
|
780
795
|
else
|
data/lib/origen/sub_blocks.rb
CHANGED
@@ -17,7 +17,7 @@ module Origen
|
|
17
17
|
# address API, but will accept any of these
|
18
18
|
@reg_base_address = options.delete(:reg_base_address) ||
|
19
19
|
options.delete(:base_address) || options.delete(:base) || 0
|
20
|
-
if options[:_instance]
|
20
|
+
if options[:_instance] # to be deprecated as part of multi-instance removal below
|
21
21
|
if @reg_base_address.is_a?(Array)
|
22
22
|
@reg_base_address = @reg_base_address[options[:_instance]]
|
23
23
|
elsif options[:base_address_step]
|
@@ -179,6 +179,7 @@ module Origen
|
|
179
179
|
|
180
180
|
def path(options = {})
|
181
181
|
return abs_path if abs_path
|
182
|
+
|
182
183
|
if is_a?(Origen::Registers::BitCollection)
|
183
184
|
# Special case where path relative to the register has been requested
|
184
185
|
if options[:relative_to] == parent
|
@@ -264,9 +265,7 @@ module Origen
|
|
264
265
|
# Note that this returns an array instead of a hash since there could be naming collisions in the
|
265
266
|
# hash keys
|
266
267
|
def all_sub_blocks
|
267
|
-
@all_sub_blocks ||=
|
268
|
-
(sub_blocks_array + sub_blocks_array.map(&:all_sub_blocks)).flatten
|
269
|
-
end
|
268
|
+
@all_sub_blocks ||= (sub_blocks_array + sub_blocks_array.map(&:all_sub_blocks)).flatten
|
270
269
|
end
|
271
270
|
|
272
271
|
# Returns true if the given sub block owns at least one register
|
@@ -301,7 +300,7 @@ module Origen
|
|
301
300
|
# permit creating multiple instances of a particular sub_block class
|
302
301
|
# can pass array for base_address, which will be processed above
|
303
302
|
Origen.deprecate 'instances: option to sub_block is deprecated, use sub_block_groups instead'
|
304
|
-
group_name = name =~ /s$/ ? name : "#{name}s"
|
303
|
+
group_name = name =~ /s$/ ? name : "#{name}s" # take care if name already with 's' is passed
|
305
304
|
unless respond_to?(group_name)
|
306
305
|
sub_block_groups group_name do
|
307
306
|
i.times do |j|
|
@@ -341,6 +340,7 @@ module Origen
|
|
341
340
|
skip_require_files = options[:skip_require_files] || %w(attributes parameters pins registers sub_blocks timesets)
|
342
341
|
Dir.glob("#{block_dir}/*.rb").each do |file|
|
343
342
|
next if skip_require_files.include?(Pathname.new(file).basename('.rb').to_s)
|
343
|
+
|
344
344
|
require file
|
345
345
|
end
|
346
346
|
end
|
@@ -362,7 +362,7 @@ module Origen
|
|
362
362
|
else
|
363
363
|
sub_blocks[name] = block
|
364
364
|
end
|
365
|
-
unless @current_group.nil?
|
365
|
+
unless @current_group.nil? # a group is currently open, store sub_block id only
|
366
366
|
@current_group << name
|
367
367
|
end
|
368
368
|
if options.key?(:lazy)
|
@@ -417,14 +417,14 @@ module Origen
|
|
417
417
|
if options[:class_name]
|
418
418
|
b = Object.const_get(options[:class_name]).new
|
419
419
|
else
|
420
|
-
b = []
|
420
|
+
b = [] # Will use Array if no class defined
|
421
421
|
end
|
422
422
|
# Add sub_blocks to group
|
423
423
|
my_group.each do |group_id|
|
424
424
|
b << send(group_id)
|
425
425
|
end
|
426
426
|
sub_block_groups[id] = b
|
427
|
-
@current_group = nil
|
427
|
+
@current_group = nil # close group
|
428
428
|
end
|
429
429
|
alias_method :sub_blocks_group, :sub_block_group
|
430
430
|
|
@@ -442,18 +442,18 @@ module Origen
|
|
442
442
|
current_namespace = remaining_namespace.shift
|
443
443
|
if current_namespace
|
444
444
|
if current_path.join(current_namespace).exist?
|
445
|
-
|
445
|
+
_find_block_dir(options, current_path.join(current_namespace), remaining_namespace)
|
446
446
|
elsif current_path.join("derivatives/#{current_namespace}").exist?
|
447
|
-
|
447
|
+
_find_block_dir(options, current_path.join("derivatives/#{current_namespace}"), remaining_namespace)
|
448
448
|
elsif current_path.join("sub_blocks/#{current_namespace}").exist?
|
449
|
-
|
449
|
+
_find_block_dir(options, current_path.join("sub_blocks/#{current_namespace}"), remaining_namespace)
|
450
450
|
else
|
451
451
|
Origen.log.error "Could not find block dir for namespace #{options[:class_name]}!"
|
452
452
|
fail
|
453
453
|
end
|
454
454
|
else
|
455
455
|
if current_path.join('model.rb').exist?
|
456
|
-
|
456
|
+
current_path.to_s
|
457
457
|
else
|
458
458
|
Origen.log.error "Could not find block dir for namespace #{options[:class_name]}!"
|
459
459
|
fail
|
@@ -463,6 +463,7 @@ module Origen
|
|
463
463
|
|
464
464
|
def instantiate_sub_block(name, klass, options)
|
465
465
|
return sub_blocks[name] unless sub_blocks[name].is_a?(Placeholder)
|
466
|
+
|
466
467
|
sub_blocks[name] = klass.new(options.merge(parent: self, name: name))
|
467
468
|
end
|
468
469
|
|
@@ -491,6 +492,7 @@ module Origen
|
|
491
492
|
# looking up and loaded by the autoload system straight away, especially if the sub-block
|
492
493
|
# has been specified to lazy load
|
493
494
|
return false if klass == Hash || klass == Array
|
495
|
+
|
494
496
|
klass == self.klass || klass == Placeholder
|
495
497
|
end
|
496
498
|
|
@@ -557,16 +559,19 @@ module Origen
|
|
557
559
|
klass = eval(tmp_class)
|
558
560
|
rescue NameError => e
|
559
561
|
raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/
|
562
|
+
|
560
563
|
begin
|
561
564
|
tmp_class = "::#{class_name}"
|
562
565
|
klass = eval(tmp_class)
|
563
566
|
rescue NameError => e
|
564
567
|
raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/
|
568
|
+
|
565
569
|
begin
|
566
570
|
tmp_class = "#{owner.class}::#{class_name}"
|
567
571
|
klass = eval(tmp_class)
|
568
572
|
rescue NameError => e
|
569
573
|
raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/
|
574
|
+
|
570
575
|
puts "Could not find class: #{class_name}"
|
571
576
|
raise 'Unknown sub block class!'
|
572
577
|
end
|
@@ -609,8 +614,9 @@ module Origen
|
|
609
614
|
def method_missing(method, *args, &block)
|
610
615
|
super
|
611
616
|
rescue NoMethodError
|
612
|
-
return regs(method) if
|
613
|
-
return ports(method) if
|
617
|
+
return regs(method) if has_reg?(method)
|
618
|
+
return ports(method) if has_port?(method)
|
619
|
+
|
614
620
|
if method.to_s =~ /=$/
|
615
621
|
define_singleton_method(method) do |val|
|
616
622
|
instance_variable_set("@#{method.to_s.sub('=', '')}", val)
|
data/lib/origen/top_level.rb
CHANGED
@@ -79,7 +79,7 @@ module Origen
|
|
79
79
|
val.id
|
80
80
|
else
|
81
81
|
packages.include?(val) ? val : nil
|
82
|
-
|
82
|
+
end
|
83
83
|
end
|
84
84
|
alias_method :package=, :current_package=
|
85
85
|
|
@@ -88,6 +88,7 @@ module Origen
|
|
88
88
|
def current_package(_options = {})
|
89
89
|
if @current_package_id
|
90
90
|
return _packages[@current_package_id] if _packages[@current_package_id]
|
91
|
+
|
91
92
|
fail "The package #{@current_package_id} of #{self.class} has not been defined!"
|
92
93
|
end
|
93
94
|
end
|
data/lib/origen/users/user.rb
CHANGED
@@ -87,11 +87,10 @@ module Origen
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
else
|
90
|
-
@email ||=
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
90
|
+
@email ||= if Origen.site_config.email_domain
|
91
|
+
"#{id}@#{Origen.site_config.email_domain}"
|
92
|
+
end
|
93
|
+
|
95
94
|
end
|
96
95
|
end
|
97
96
|
|
@@ -34,7 +34,7 @@ module Origen
|
|
34
34
|
# end
|
35
35
|
def parse(options = {})
|
36
36
|
csv_data = extract_csv_data(options)
|
37
|
-
if block_given?
|
37
|
+
if block_given? # doesn't do much at this point
|
38
38
|
csv_data.each do |dataset|
|
39
39
|
yield dataset
|
40
40
|
end
|
@@ -69,9 +69,11 @@ module Origen
|
|
69
69
|
|
70
70
|
# Returns an array containing all data from given CSV file
|
71
71
|
def extract_csv_data(options = {}) # :nodoc:
|
72
|
-
|
73
|
-
|
72
|
+
# rubocop:disable Layout/MultilineHashBraceLayout
|
73
|
+
options = { field_names_only: false, # whether to obtain field names only
|
74
|
+
comment_char: '#' # ignore lines that start with comment character
|
74
75
|
}.merge(options)
|
76
|
+
# rubocop:enable Layout/MultilineHashBraceLayout
|
75
77
|
|
76
78
|
field_names = []
|
77
79
|
field_values = []
|
@@ -87,7 +89,7 @@ module Origen
|
|
87
89
|
end
|
88
90
|
if line_no == 1 # Field names
|
89
91
|
field_names = line.split(',')
|
90
|
-
else
|
92
|
+
else # Field values
|
91
93
|
field_values = line.split(',')
|
92
94
|
if field_names.length != field_values.length
|
93
95
|
abort "ERROR! Invalid number of fields (#{field_values.length}) in CVS file on line # #{line_no}. Should be #{field_names.length}.\n"
|
data/lib/origen/utility/diff.rb
CHANGED
@@ -48,14 +48,14 @@ module Origen
|
|
48
48
|
lines_remaining = true
|
49
49
|
|
50
50
|
while lines_remaining
|
51
|
-
a = get_next_line_a(content_a)
|
51
|
+
a = get_next_line_a(content_a) # Get the next vectors
|
52
52
|
b = get_next_line_b(content_b)
|
53
53
|
if !a && !b # If both patterns finished
|
54
54
|
lines_remaining = false
|
55
55
|
elsif !a || !b # If only 1 pattern finished
|
56
56
|
lines_remaining = false
|
57
|
-
changes = true unless @suspend_diff
|
58
|
-
elsif a != b
|
57
|
+
changes = true unless @suspend_diff # There are extra vectors in one of the patterns
|
58
|
+
elsif a != b # If the vectors don't match
|
59
59
|
changes = true unless @suspend_diff
|
60
60
|
end
|
61
61
|
if @resume_diff # resume checking diffs for subsequent lines
|
@@ -112,8 +112,8 @@ module Origen
|
|
112
112
|
end
|
113
113
|
# This rescue is a crude way to guard against non-ASCII files that find
|
114
114
|
# their way in here
|
115
|
-
|
116
|
-
|
115
|
+
rescue
|
116
|
+
line
|
117
117
|
end
|
118
118
|
else
|
119
119
|
line.strip
|
@@ -144,10 +144,10 @@ module Origen
|
|
144
144
|
else
|
145
145
|
matched = true
|
146
146
|
end
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
147
|
+
# This rescue is a crude way to guard against non-ASCII files that find
|
148
|
+
# there way in here
|
149
|
+
rescue
|
150
|
+
matched = true
|
151
151
|
end
|
152
152
|
end
|
153
153
|
ix
|
@@ -25,9 +25,11 @@ module Origen
|
|
25
25
|
class OutputFile < Array
|
26
26
|
class Line < String
|
27
27
|
attr_accessor :type, :original_number
|
28
|
+
|
28
29
|
def initialize(type, input_file)
|
29
30
|
self.type = type
|
30
31
|
return unless input_file
|
32
|
+
|
31
33
|
replace(input_file.current_line)
|
32
34
|
self.original_number = input_file.pointer + 1
|
33
35
|
input_file.advance_pointer!
|
@@ -59,6 +61,7 @@ module Origen
|
|
59
61
|
class Processor
|
60
62
|
attr_accessor :source, :target
|
61
63
|
attr_accessor :source_output, :target_output
|
64
|
+
|
62
65
|
def initialize(source_file_name, target_file_name)
|
63
66
|
self.source = InputFile.new
|
64
67
|
self.target = InputFile.new
|
@@ -125,6 +128,7 @@ module Origen
|
|
125
128
|
module Formatter
|
126
129
|
class Base
|
127
130
|
attr_accessor :source_output, :target_output, :file
|
131
|
+
|
128
132
|
def initialize(processed_diff, output_file_name)
|
129
133
|
self.source_output = processed_diff.source_output
|
130
134
|
self.target_output = processed_diff.target_output
|
@@ -5,14 +5,16 @@ module Origen
|
|
5
5
|
# Gets text input from the user
|
6
6
|
# Supply an optional default value in the event that the user enters nothing
|
7
7
|
def get_text(options = {})
|
8
|
+
# rubocop:disable Layout/MultilineHashBraceLayout
|
8
9
|
options = { default: false,
|
9
|
-
single: false,
|
10
|
+
single: false, # Set if only a single line entry is expected
|
10
11
|
confirm: false,
|
11
|
-
accept: false,
|
12
|
+
accept: false, # Supply and array of entries you are willing to accept
|
12
13
|
case_sensitive: false, # If accept values are supplied they will be treated as case
|
13
14
|
# in-sensitive by default
|
14
|
-
wrap: true
|
15
|
+
wrap: true # Automatically split long lines
|
15
16
|
}.merge(options)
|
17
|
+
# rubocop:enable Layout/MultilineHashBraceLayout
|
16
18
|
if options[:confirm]
|
17
19
|
puts "Type 'yes' or 'no' to confirm or 'quit' to abort."
|
18
20
|
elsif options[:accept]
|
@@ -65,9 +67,7 @@ module Origen
|
|
65
67
|
end
|
66
68
|
if confirm == 'yes' || confirm == 'y'
|
67
69
|
if options[:confirm] == :return_boolean
|
68
|
-
|
69
|
-
else
|
70
|
-
return
|
70
|
+
true
|
71
71
|
end
|
72
72
|
else
|
73
73
|
get_text(options)
|
@@ -18,8 +18,7 @@ module Origen
|
|
18
18
|
domain: (Origen.site_config.email_domain || ''),
|
19
19
|
|
20
20
|
auth_user: (Origen.site_config.email_auth_user || current_user.email),
|
21
|
-
auth_password: (Origen.site_config.email_auth_password || current_user.password)
|
22
|
-
}.merge(options)
|
21
|
+
auth_password: (Origen.site_config.email_auth_password || current_user.password) }.merge(options)
|
23
22
|
|
24
23
|
# Force to an array
|
25
24
|
to = options[:to].respond_to?('each') ? options[:to] : [options[:to]]
|
@@ -52,15 +51,13 @@ END_OF_MESSAGE
|
|
52
51
|
smtp = Net::SMTP.new(options[:server], options[:port])
|
53
52
|
smtp.enable_starttls if options[:authentication] != :none
|
54
53
|
|
55
|
-
opts =
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
54
|
+
opts = if options[:authentication] == :none
|
55
|
+
# Trying to add username and password if there's no authentication will actually be rejected by
|
56
|
+
# the server.
|
57
|
+
[options[:domain]]
|
58
|
+
else
|
59
|
+
[options[:domain], options[:auth_user], options[:auth_password], options[:authentication]]
|
60
|
+
end
|
64
61
|
|
65
62
|
smtp.start(*opts) do |m|
|
66
63
|
m.send_message(msg, options[:from], addr)
|