origen 0.60.7 → 0.60.8
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/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
- 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/pins/pin.rb
CHANGED
|
@@ -30,7 +30,7 @@ module Origen
|
|
|
30
30
|
attr_accessor :invert
|
|
31
31
|
# Attribute used to generate vectors where the pin state is assigned the
|
|
32
32
|
# repeat_previous opcode, used by Tester#repeat_previous
|
|
33
|
-
|
|
33
|
+
attr_reader :repeat_previous
|
|
34
34
|
attr_reader :owner
|
|
35
35
|
attr_reader :size
|
|
36
36
|
# Returns a hash containing the aliases associated with the given pin
|
|
@@ -41,15 +41,15 @@ module Origen
|
|
|
41
41
|
attr_accessor :supply
|
|
42
42
|
attr_accessor :supply_str
|
|
43
43
|
# Boolean on whether pin is open drain
|
|
44
|
-
|
|
44
|
+
attr_reader :open_drain
|
|
45
45
|
# Boolean on whether pin has external pull-up
|
|
46
|
-
|
|
46
|
+
attr_reader :ext_pullup
|
|
47
47
|
# Boolean on whether pin has external pull-down
|
|
48
|
-
|
|
48
|
+
attr_reader :ext_pulldown
|
|
49
49
|
# Pin type, either :analog or :digital
|
|
50
|
-
|
|
50
|
+
attr_reader :type
|
|
51
51
|
# Pin RTL name
|
|
52
|
-
|
|
52
|
+
attr_writer :rtl_name
|
|
53
53
|
# Value to be forced on the pin, e.g. during simulation
|
|
54
54
|
attr_accessor :force
|
|
55
55
|
|
|
@@ -694,7 +694,7 @@ module Origen
|
|
|
694
694
|
# If val is a data bit extract the value of it
|
|
695
695
|
val = val.respond_to?(:data) ? val.data : val
|
|
696
696
|
# Assume driving/asserting a nil value means 0
|
|
697
|
-
val
|
|
697
|
+
val ||= 0
|
|
698
698
|
if !val.x_or_z? && val > 1
|
|
699
699
|
fail "Attempt to set a value of #{val} on pin #{name}"
|
|
700
700
|
end
|
|
@@ -1047,6 +1047,7 @@ module Origen
|
|
|
1047
1047
|
|
|
1048
1048
|
def toggle_clock
|
|
1049
1049
|
fail "ERROR: Clock on #{@owner.name} not running." unless is_a_running_clock?
|
|
1050
|
+
|
|
1050
1051
|
@clock.toggle
|
|
1051
1052
|
end
|
|
1052
1053
|
|
|
@@ -1090,11 +1091,12 @@ module Origen
|
|
|
1090
1091
|
end
|
|
1091
1092
|
end
|
|
1092
1093
|
|
|
1093
|
-
def index?(context: nil)
|
|
1094
|
-
!!index(
|
|
1094
|
+
def index?(options = { context: nil })
|
|
1095
|
+
!!index(options).nil?
|
|
1095
1096
|
end
|
|
1096
1097
|
|
|
1097
|
-
def index(context: nil)
|
|
1098
|
+
def index(options = { context: nil })
|
|
1099
|
+
context = options[:context]
|
|
1098
1100
|
if context.is_a?(Symbol)
|
|
1099
1101
|
# Context pin group provided
|
|
1100
1102
|
group = groups[context].instance_variable_get(:@store)
|
|
@@ -1114,7 +1116,8 @@ module Origen
|
|
|
1114
1116
|
end
|
|
1115
1117
|
end
|
|
1116
1118
|
|
|
1117
|
-
def mask(context: nil)
|
|
1119
|
+
def mask(options = { context: nil })
|
|
1120
|
+
context = options[:context]
|
|
1118
1121
|
index = context.is_a?(Integer) ? context : self.index(context: context)
|
|
1119
1122
|
|
|
1120
1123
|
if index.nil? && context.nil?
|
|
@@ -1130,7 +1133,10 @@ module Origen
|
|
|
1130
1133
|
alias_method :set_mask, :mask
|
|
1131
1134
|
alias_method :smask, :mask
|
|
1132
1135
|
|
|
1133
|
-
def clear_mask(context: nil, size: nil)
|
|
1136
|
+
def clear_mask(options = { context: nil, size: nil })
|
|
1137
|
+
context = options[:context]
|
|
1138
|
+
size = options[:size]
|
|
1139
|
+
|
|
1134
1140
|
index = context.is_a?(Integer) ? context : self.index(context: context)
|
|
1135
1141
|
|
|
1136
1142
|
if index.nil? && context.nil?
|
data/lib/origen/pins/pin_bank.rb
CHANGED
|
@@ -33,6 +33,7 @@ module Origen
|
|
|
33
33
|
if bank[pin.id]
|
|
34
34
|
fail "A pin with id #{pin.id} already exists!"
|
|
35
35
|
end
|
|
36
|
+
|
|
36
37
|
all_ids << pin.id
|
|
37
38
|
bank[pin.id] = pin
|
|
38
39
|
# If ends in a number
|
|
@@ -248,6 +249,7 @@ module Origen
|
|
|
248
249
|
# First delete the pin from any of the pin groups it resides
|
|
249
250
|
Origen.pin_bank.pin_groups.each do |_name, grp|
|
|
250
251
|
next unless grp.store.include?(pin)
|
|
252
|
+
|
|
251
253
|
grp.delete(pin)
|
|
252
254
|
end
|
|
253
255
|
# Now delete the pin from the pin bank
|
|
@@ -391,6 +393,7 @@ module Origen
|
|
|
391
393
|
if pins.size > 1
|
|
392
394
|
fail "Mutliple pins with the alias #{id} have been found in the current scope!"
|
|
393
395
|
end
|
|
396
|
+
|
|
394
397
|
pins.first
|
|
395
398
|
end
|
|
396
399
|
end
|
|
@@ -85,10 +85,10 @@ module Origen
|
|
|
85
85
|
|
|
86
86
|
def update_tester_period_local
|
|
87
87
|
if Origen.tester.current_period_in_ns == @tester_period_in_ns
|
|
88
|
-
|
|
88
|
+
false
|
|
89
89
|
else
|
|
90
90
|
@tester_period_in_ns = Origen.tester.current_period_in_ns
|
|
91
|
-
|
|
91
|
+
true
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
|
|
@@ -127,6 +127,7 @@ module Origen
|
|
|
127
127
|
|
|
128
128
|
return @clock_period_in_ns if p.empty?
|
|
129
129
|
fail "[Pin Clock] ERROR: Multiple unit declarations for #{@owner.name}.clock" if p.size > 1
|
|
130
|
+
|
|
130
131
|
p[0].to_int
|
|
131
132
|
end
|
|
132
133
|
|
|
@@ -62,6 +62,7 @@ module Origen
|
|
|
62
62
|
# pin_group.to_vector # => "LLLLLLLL"
|
|
63
63
|
def to_vector
|
|
64
64
|
return @vector_formatted_value if @vector_formatted_value
|
|
65
|
+
|
|
65
66
|
vals = map(&:to_vector)
|
|
66
67
|
vals.reverse! if endian == :little
|
|
67
68
|
@vector_formatted_value = vals.join('')
|
|
@@ -90,6 +91,7 @@ module Origen
|
|
|
90
91
|
unless val.size == size
|
|
91
92
|
fail 'When setting vector_formatted_value on a pin group you must supply values for all pins!'
|
|
92
93
|
end
|
|
94
|
+
|
|
93
95
|
val.split(//).reverse.each_with_index do |val, i|
|
|
94
96
|
myself[i].vector_formatted_value = val
|
|
95
97
|
end
|
|
@@ -507,6 +509,7 @@ pins(:some_group).map(&:id).sort
|
|
|
507
509
|
|
|
508
510
|
def clean_value(val)
|
|
509
511
|
return val if val.respond_to?(:contains_bits?)
|
|
512
|
+
|
|
510
513
|
val = val.data if val.respond_to?('data')
|
|
511
514
|
if val.is_a?(String) || val.is_a?(Symbol)
|
|
512
515
|
Origen::Value.new(val)
|
|
@@ -99,11 +99,13 @@ module Origen
|
|
|
99
99
|
unless valid.include?(data)
|
|
100
100
|
fail "Uknown data value #{data}, only these are valid: #{valid.join(', ')}"
|
|
101
101
|
end
|
|
102
|
+
|
|
102
103
|
yield data
|
|
103
104
|
end
|
|
104
105
|
|
|
105
106
|
def calc
|
|
106
107
|
return @calc if @calc
|
|
108
|
+
|
|
107
109
|
require 'dentaku'
|
|
108
110
|
@calc = Dentaku::Calculator.new
|
|
109
111
|
end
|
|
@@ -122,6 +124,7 @@ module Origen
|
|
|
122
124
|
unless options[:at]
|
|
123
125
|
fail 'When defining a wave event you must supply the time via the option :at'
|
|
124
126
|
end
|
|
127
|
+
|
|
125
128
|
t = options[:at]
|
|
126
129
|
|
|
127
130
|
if t.is_a?(String)
|
|
@@ -129,10 +132,12 @@ module Origen
|
|
|
129
132
|
unless d.empty?
|
|
130
133
|
fail "Wave time formulas can only include the variable 'period' (or 'period_in_ns'), this variable is not allowed: #{d}"
|
|
131
134
|
end
|
|
135
|
+
|
|
132
136
|
t = t.gsub('period_in_ns', 'period')
|
|
133
137
|
unless calc.evaluate(t, period: 100)
|
|
134
138
|
fail "There appears to be an error in the formula: #{t}"
|
|
135
139
|
end
|
|
140
|
+
|
|
136
141
|
yield t
|
|
137
142
|
return
|
|
138
143
|
elsif t.is_a?(Numeric)
|
data/lib/origen/pins.rb
CHANGED
|
@@ -693,7 +693,13 @@ If you meant to define the virtual_pin_group then use the add_virtual_pin_group
|
|
|
693
693
|
end
|
|
694
694
|
alias_method :virtual_pin_group, :virtual_pin_groups
|
|
695
695
|
|
|
696
|
-
def all_pin_ids(
|
|
696
|
+
def all_pin_ids(*options)
|
|
697
|
+
type = nil
|
|
698
|
+
if options.first.is_a?(Hash)
|
|
699
|
+
options = options.first
|
|
700
|
+
type = options[:type]
|
|
701
|
+
end
|
|
702
|
+
|
|
697
703
|
case type
|
|
698
704
|
when :power_pin, :power_pins
|
|
699
705
|
dut.pins(power_pin: true).map { |n, p| [n, *p.aliases.keys] }.flatten.map { |n| [n, dut.power_pin(n)] }.to_h
|
data/lib/origen/ports.rb
CHANGED
|
@@ -2,7 +2,7 @@ module Origen
|
|
|
2
2
|
module Ports
|
|
3
3
|
autoload :Port, 'origen/ports/port'
|
|
4
4
|
autoload :Section, 'origen/ports/section'
|
|
5
|
-
autoload :BitCollection,
|
|
5
|
+
autoload :BitCollection, 'origen/ports/bit_collection'
|
|
6
6
|
autoload :PortCollection, 'origen/ports/port_collection'
|
|
7
7
|
|
|
8
8
|
def add_port(name, options = {})
|
|
@@ -3,7 +3,8 @@ module Origen
|
|
|
3
3
|
module PowerDomains
|
|
4
4
|
class PowerDomain
|
|
5
5
|
include Origen::Specs
|
|
6
|
-
attr_accessor :id, :description, :
|
|
6
|
+
attr_accessor :id, :description, :min, :max
|
|
7
|
+
attr_writer :maximum_voltage_rating, :nominal_voltage, :unit_voltage_range
|
|
7
8
|
|
|
8
9
|
# Generic Power Domain Name
|
|
9
10
|
# This is the power supply that can be blocked off to multiple power supplies
|
|
@@ -38,6 +39,7 @@ module Origen
|
|
|
38
39
|
(block.arity < 1 ? (instance_eval(&block)) : block.call(self)) if block_given?
|
|
39
40
|
@unit_voltage_range = :fixed if @unit_voltage_range.nil?
|
|
40
41
|
fail unless attrs_ok?
|
|
42
|
+
|
|
41
43
|
create_dut_spec unless @min.nil? || @max.nil?
|
|
42
44
|
end
|
|
43
45
|
|
|
@@ -110,7 +112,7 @@ module Origen
|
|
|
110
112
|
|
|
111
113
|
# Checks for a pin type, returns nil if it is not found
|
|
112
114
|
def pin_type(pin)
|
|
113
|
-
if
|
|
115
|
+
if has_pin?(pin) == false
|
|
114
116
|
nil
|
|
115
117
|
else
|
|
116
118
|
[:signal, :ground, :power].each do |pintype|
|
|
@@ -152,6 +154,7 @@ module Origen
|
|
|
152
154
|
# This will need rework once the class has spec limits added
|
|
153
155
|
def setpoint_ok?(val = nil)
|
|
154
156
|
return true if maximum_voltage_rating.nil?
|
|
157
|
+
|
|
155
158
|
compare_val = val.nil? ? setpoint : val
|
|
156
159
|
if compare_val.nil?
|
|
157
160
|
false
|
|
@@ -14,6 +14,7 @@ module Origen
|
|
|
14
14
|
attr_getter = attr.to_s[/\@(\S+)/, 1].to_sym
|
|
15
15
|
attr_val = domain.send attr_getter
|
|
16
16
|
next unless [String, Numeric, Float, Integer, Symbol, Range].include? attr_val.class
|
|
17
|
+
|
|
17
18
|
headers << attr_getter unless headers.include?(attr_getter)
|
|
18
19
|
str = case attr_val
|
|
19
20
|
when Range
|
|
@@ -22,7 +23,7 @@ module Origen
|
|
|
22
23
|
"#{start_voltage}\.\.#{end_voltage}"
|
|
23
24
|
else
|
|
24
25
|
attr_val.to_s
|
|
25
|
-
|
|
26
|
+
end
|
|
26
27
|
curr_longest = [attr_getter, str].max_by(&:length).size + 2 # Add 2 for the whitespace
|
|
27
28
|
if colhash[attr].nil? || (colhash[attr] < curr_longest)
|
|
28
29
|
colhash[attr] = curr_longest
|
data/lib/origen/registers/bit.rb
CHANGED
|
@@ -32,14 +32,14 @@ module Origen
|
|
|
32
32
|
w1crs: { implemented: false, base: 'read-write', write: 'oneToClear', read: 'set', writable: true, readable: true, w1c: true, set_only: false, clr_only: false, description: "Write '1' to clear and set-on-read" },
|
|
33
33
|
w0src: { implemented: false, base: 'read-write', write: 'zeroToSet', read: 'clear', writable: true, readable: true, w1c: false, set_only: false, clr_only: false, description: "Write '0' to set and clear-on-read" },
|
|
34
34
|
w0crs: { implemented: false, base: 'read-write', write: 'zeroToClear', read: 'set', writable: true, readable: true, w1c: false, set_only: false, clr_only: false, description: "Write '0' to clear and set-on-read" },
|
|
35
|
-
wo: { implemented: false, base: 'write-only',
|
|
36
|
-
woc: { implemented: false, base: 'write-only',
|
|
37
|
-
worz: { implemented: false, base: 'write-only',
|
|
38
|
-
wos: { implemented: false, base: 'write-only',
|
|
39
|
-
w1: { implemented: false, base: 'read-writeOnce', write: nil,
|
|
40
|
-
wo1: { implemented: false, base: 'writeOnce',
|
|
41
|
-
dc: { implemented: false, base: 'read-write',
|
|
42
|
-
rowz: { implemented: false, base: 'read-only',
|
|
35
|
+
wo: { implemented: false, base: 'write-only', write: nil, read: nil, writable: true, readable: false, w1c: false, set_only: false, clr_only: false, description: 'Write-only' },
|
|
36
|
+
woc: { implemented: false, base: 'write-only', write: 'clear', read: nil, writable: true, readable: false, w1c: false, set_only: false, clr_only: true, description: "When written sets the field to '0'. Read undeterministic" },
|
|
37
|
+
worz: { implemented: false, base: 'write-only', write: nil, read: nil, writable: true, readable: false, w1c: false, set_only: false, clr_only: false, description: 'Write-only, Reads zero' },
|
|
38
|
+
wos: { implemented: false, base: 'write-only', write: 'set', read: nil, writable: true, readable: false, w1c: false, set_only: true, clr_only: false, description: "When written sets all bits to '1'. Read undeterministic" },
|
|
39
|
+
w1: { implemented: false, base: 'read-writeOnce', write: nil, read: nil, writable: true, readable: true, w1c: false, set_only: false, clr_only: false, description: 'Write-once. Next time onwards, write is ignored. Read returns the value' },
|
|
40
|
+
wo1: { implemented: false, base: 'writeOnce', write: nil, read: nil, writable: true, readable: false, w1c: false, set_only: false, clr_only: false, description: 'Write-once. Next time onwards, write is ignored. Read is undeterministic' },
|
|
41
|
+
dc: { implemented: false, base: 'read-write', write: nil, read: nil, writable: true, readable: true, w1c: false, set_only: false, clr_only: false, description: 'RW but no check' },
|
|
42
|
+
rowz: { implemented: false, base: 'read-only', write: nil, read: 'clear', writable: false, readable: true, w1c: false, set_only: false, clr_only: false, description: 'Read-only, value is cleared on read' }
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
# Returns the Reg object that owns the bit
|
|
@@ -100,7 +100,7 @@ module Origen
|
|
|
100
100
|
# Can be set to indicate that the current state of the bit is unknown, e.g. after reading X from a simulation
|
|
101
101
|
attr_accessor :unknown
|
|
102
102
|
|
|
103
|
-
def initialize(owner, position, options = {})
|
|
103
|
+
def initialize(owner, position, options = {})
|
|
104
104
|
options = {
|
|
105
105
|
start: false, # whether bit starts a state machine so be careful
|
|
106
106
|
read_data_matches_write: true,
|
|
@@ -109,7 +109,7 @@ module Origen
|
|
|
109
109
|
store: false,
|
|
110
110
|
sticky_overlay: true,
|
|
111
111
|
sticky_store: false,
|
|
112
|
-
nvm_dep: false
|
|
112
|
+
nvm_dep: false # whether is an NVM dependent bit
|
|
113
113
|
}.merge(options)
|
|
114
114
|
@owner = owner
|
|
115
115
|
@position = position
|
|
@@ -141,7 +141,7 @@ module Origen
|
|
|
141
141
|
readable: true, # whether bit is readable
|
|
142
142
|
clr_only: false, # whether bit is clear only
|
|
143
143
|
set_only: false, # whether bit is set only
|
|
144
|
-
w1c: false
|
|
144
|
+
w1c: false # whether bit is w1c (when written to 1 immediately becomes 0)
|
|
145
145
|
}.merge(options)
|
|
146
146
|
@readable = options.delete(:readable)
|
|
147
147
|
@writable = options.delete(:writable)
|
|
@@ -240,7 +240,8 @@ module Origen
|
|
|
240
240
|
def default_bit_metadata
|
|
241
241
|
if owner
|
|
242
242
|
Origen::Registers.default_bit_metadata.merge(
|
|
243
|
-
Origen::Registers.bit_metadata[owner.owner.class] || {}
|
|
243
|
+
Origen::Registers.bit_metadata[owner.owner.class] || {}
|
|
244
|
+
)
|
|
244
245
|
else
|
|
245
246
|
Origen::Registers.default_bit_metadata
|
|
246
247
|
end
|
|
@@ -336,11 +337,14 @@ module Origen
|
|
|
336
337
|
self
|
|
337
338
|
end
|
|
338
339
|
|
|
340
|
+
# rubocop:disable Lint/DuplicateMethods
|
|
341
|
+
|
|
339
342
|
# Set the overlay attribute to the supplied value
|
|
340
343
|
def overlay(value)
|
|
341
344
|
@overlay = value
|
|
342
345
|
self
|
|
343
346
|
end
|
|
347
|
+
# rubocop:enable Lint/DuplicateMethods
|
|
344
348
|
|
|
345
349
|
# Returns the overlay attribute
|
|
346
350
|
def overlay_str
|
|
@@ -411,7 +415,7 @@ module Origen
|
|
|
411
415
|
# Returns the value you would need to write to the register to put the given
|
|
412
416
|
# value in this bit
|
|
413
417
|
def setting(value)
|
|
414
|
-
value = value & 1
|
|
418
|
+
value = value & 1 # As this bit can only hold one bit of data force it
|
|
415
419
|
value << @position
|
|
416
420
|
end
|
|
417
421
|
|
|
@@ -495,7 +499,7 @@ module Origen
|
|
|
495
499
|
return true
|
|
496
500
|
end
|
|
497
501
|
end
|
|
498
|
-
|
|
502
|
+
false
|
|
499
503
|
else
|
|
500
504
|
feature == name
|
|
501
505
|
end
|
|
@@ -538,7 +542,7 @@ module Origen
|
|
|
538
542
|
break # break if feature not found and return false
|
|
539
543
|
end
|
|
540
544
|
end # iterated through all features in array
|
|
541
|
-
|
|
545
|
+
value
|
|
542
546
|
else # if feature.class != Array
|
|
543
547
|
loop do
|
|
544
548
|
if current_owner.respond_to?(:owner)
|
|
@@ -561,10 +565,10 @@ module Origen
|
|
|
561
565
|
value = true
|
|
562
566
|
end
|
|
563
567
|
end
|
|
564
|
-
|
|
568
|
+
value
|
|
565
569
|
end
|
|
566
570
|
else
|
|
567
|
-
|
|
571
|
+
true
|
|
568
572
|
end
|
|
569
573
|
end
|
|
570
574
|
end
|
|
@@ -88,6 +88,7 @@ module Origen
|
|
|
88
88
|
# end
|
|
89
89
|
def [](*indexes)
|
|
90
90
|
return self if indexes.empty?
|
|
91
|
+
|
|
91
92
|
b = BitCollection.new(parent, name)
|
|
92
93
|
expand_and_order(*indexes).each do |i|
|
|
93
94
|
b << fetch(i)
|
|
@@ -261,6 +262,7 @@ module Origen
|
|
|
261
262
|
if any? { |b| b.access != val }
|
|
262
263
|
fail 'Not all bits the collection have the same access value!'
|
|
263
264
|
end
|
|
265
|
+
|
|
264
266
|
val
|
|
265
267
|
end
|
|
266
268
|
|
|
@@ -334,6 +336,7 @@ module Origen
|
|
|
334
336
|
data = 0
|
|
335
337
|
shift_out_with_index do |bit, i|
|
|
336
338
|
return undefined if bit.is_a?(Origen::UndefinedClass)
|
|
339
|
+
|
|
337
340
|
data |= bit.data << i
|
|
338
341
|
end
|
|
339
342
|
data
|
|
@@ -352,16 +355,20 @@ module Origen
|
|
|
352
355
|
data = 0
|
|
353
356
|
reverse_shift_out_with_index do |bit, i|
|
|
354
357
|
return undefined if bit.is_a?(Origen::UndefinedClass)
|
|
358
|
+
|
|
355
359
|
data |= bit.data << i
|
|
356
360
|
end
|
|
357
361
|
data
|
|
358
362
|
end
|
|
359
363
|
alias_method :reverse_data, :data_reverse
|
|
360
364
|
|
|
365
|
+
# rubocop:disable Lint/DuplicateMethods
|
|
366
|
+
|
|
361
367
|
# Supports reg.bit[0] and bitcollection.bit[0]
|
|
362
368
|
def bit
|
|
363
369
|
self
|
|
364
370
|
end
|
|
371
|
+
# rubocop:enable Lint/DuplicateMethods
|
|
365
372
|
|
|
366
373
|
# Returns true if the collection contains all bits in the register
|
|
367
374
|
def whole_reg?
|
|
@@ -647,8 +654,8 @@ module Origen
|
|
|
647
654
|
|
|
648
655
|
# Sets the store flag on all bits that already have the overlay flag set
|
|
649
656
|
def store_overlay_bits(options = {})
|
|
650
|
-
|
|
651
|
-
|
|
657
|
+
# Pass in an array of any overlays that are to be excluded from store
|
|
658
|
+
options = { exclude: [] }.merge(options)
|
|
652
659
|
each do |bit|
|
|
653
660
|
bit.store if bit.has_overlay? && !options[:exclude].include?(bit.overlay_str)
|
|
654
661
|
end
|
|
@@ -768,6 +775,7 @@ module Origen
|
|
|
768
775
|
data = 0
|
|
769
776
|
shift_out_with_index do |bit, i|
|
|
770
777
|
return bit.reset_data if bit.reset_data.is_a?(Symbol)
|
|
778
|
+
|
|
771
779
|
data |= bit.reset_data << i
|
|
772
780
|
end
|
|
773
781
|
data
|
|
@@ -799,15 +807,16 @@ module Origen
|
|
|
799
807
|
feature.delete(nil) if feature.include?(nil)
|
|
800
808
|
if !feature.empty?
|
|
801
809
|
if feature.size == 1
|
|
802
|
-
|
|
810
|
+
feature[0]
|
|
803
811
|
else
|
|
804
|
-
|
|
812
|
+
feature.uniq
|
|
805
813
|
end
|
|
806
814
|
else
|
|
807
815
|
if Origen.config.strict_errors
|
|
808
816
|
fail 'No feature found'
|
|
809
817
|
end
|
|
810
|
-
|
|
818
|
+
|
|
819
|
+
nil
|
|
811
820
|
end
|
|
812
821
|
end
|
|
813
822
|
alias_method :features, :feature
|
|
@@ -995,7 +1004,7 @@ module Origen
|
|
|
995
1004
|
Regexp.new(regex) =~ regval
|
|
996
1005
|
|
|
997
1006
|
nibbles = []
|
|
998
|
-
size_in_nibbles.times do |n|
|
|
1007
|
+
size_in_nibbles.times do |n| # now grouped by nibble
|
|
999
1008
|
nibbles << Regexp.last_match[n + 1]
|
|
1000
1009
|
end
|
|
1001
1010
|
|