rggen 0.12.0 → 0.13.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/README.md +13 -2
- data/lib/rggen.rb +0 -1
- data/lib/rggen/default.rb +7 -0
- data/lib/rggen/default_setup_file.rb +1 -2
- data/lib/rggen/version.rb +1 -3
- metadata +25 -81
- data/lib/rggen/built_in.rb +0 -57
- data/lib/rggen/built_in/bit_field/bit_assignment.rb +0 -114
- data/lib/rggen/built_in/bit_field/comment.rb +0 -18
- data/lib/rggen/built_in/bit_field/initial_value.rb +0 -75
- data/lib/rggen/built_in/bit_field/name.rb +0 -41
- data/lib/rggen/built_in/bit_field/reference.rb +0 -139
- data/lib/rggen/built_in/bit_field/sv_rtl_top.rb +0 -89
- data/lib/rggen/built_in/bit_field/type.rb +0 -245
- data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.erb +0 -15
- data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.rb +0 -59
- data/lib/rggen/built_in/bit_field/type/reserved.erb +0 -3
- data/lib/rggen/built_in/bit_field/type/reserved.rb +0 -16
- data/lib/rggen/built_in/bit_field/type/ro.erb +0 -6
- data/lib/rggen/built_in/bit_field/type/ro.rb +0 -31
- data/lib/rggen/built_in/bit_field/type/rof.erb +0 -6
- data/lib/rggen/built_in/bit_field/type/rof.rb +0 -17
- data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.erb +0 -13
- data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.rb +0 -46
- data/lib/rggen/built_in/bit_field/type/rw_wo.erb +0 -9
- data/lib/rggen/built_in/bit_field/type/rw_wo.rb +0 -30
- data/lib/rggen/built_in/bit_field/type/rwc_rwe_rwl.erb +0 -16
- data/lib/rggen/built_in/bit_field/type/rwc_rwe_rwl.rb +0 -92
- data/lib/rggen/built_in/bit_field/type/w0trg_w1trg.erb +0 -9
- data/lib/rggen/built_in/bit_field/type/w0trg_w1trg.rb +0 -29
- data/lib/rggen/built_in/global/address_width.rb +0 -34
- data/lib/rggen/built_in/global/array_port_format.rb +0 -19
- data/lib/rggen/built_in/global/bus_width.rb +0 -35
- data/lib/rggen/built_in/global/fold_sv_interface_port.rb +0 -24
- data/lib/rggen/built_in/register/markdown.erb +0 -11
- data/lib/rggen/built_in/register/markdown.rb +0 -26
- data/lib/rggen/built_in/register/name.rb +0 -36
- data/lib/rggen/built_in/register/offset_address.rb +0 -106
- data/lib/rggen/built_in/register/size.rb +0 -95
- data/lib/rggen/built_in/register/sv_rtl_top.rb +0 -82
- data/lib/rggen/built_in/register/type.rb +0 -344
- data/lib/rggen/built_in/register/type/default_sv_ral.erb +0 -8
- data/lib/rggen/built_in/register/type/default_sv_rtl.erb +0 -15
- data/lib/rggen/built_in/register/type/external.erb +0 -11
- data/lib/rggen/built_in/register/type/external.rb +0 -128
- data/lib/rggen/built_in/register/type/indirect.rb +0 -327
- data/lib/rggen/built_in/register/type/indirect_sv_ral.erb +0 -13
- data/lib/rggen/built_in/register/type/indirect_sv_rtl.erb +0 -17
- data/lib/rggen/built_in/register_block/byte_size.rb +0 -61
- data/lib/rggen/built_in/register_block/markdown.erb +0 -8
- data/lib/rggen/built_in/register_block/markdown.rb +0 -36
- data/lib/rggen/built_in/register_block/name.rb +0 -38
- data/lib/rggen/built_in/register_block/protocol.rb +0 -100
- data/lib/rggen/built_in/register_block/protocol/apb.erb +0 -10
- data/lib/rggen/built_in/register_block/protocol/apb.rb +0 -89
- data/lib/rggen/built_in/register_block/protocol/axi4lite.erb +0 -11
- data/lib/rggen/built_in/register_block/protocol/axi4lite.rb +0 -125
- data/lib/rggen/built_in/register_block/sv_ral_block_model.erb +0 -11
- data/lib/rggen/built_in/register_block/sv_ral_package.rb +0 -65
- data/lib/rggen/built_in/register_block/sv_rtl_macros.erb +0 -9
- data/lib/rggen/built_in/register_block/sv_rtl_top.rb +0 -86
- data/lib/rggen/built_in/version.rb +0 -7
- data/lib/rggen/setup/default.rb +0 -30
- data/sample/block_0.md +0 -155
- data/sample/block_0.rb +0 -90
- data/sample/block_0.sv +0 -678
- data/sample/block_0.xlsx +0 -0
- data/sample/block_0.yml +0 -99
- data/sample/block_0_ral_pkg.sv +0 -184
- data/sample/block_1.md +0 -39
- data/sample/block_1.rb +0 -22
- data/sample/block_1.sv +0 -136
- data/sample/block_1.xlsx +0 -0
- data/sample/block_1.yml +0 -26
- data/sample/block_1_ral_pkg.sv +0 -68
- data/sample/config.json +0 -5
- data/sample/config.yml +0 -3
@@ -1,15 +0,0 @@
|
|
1
|
-
rggen_default_register #(
|
2
|
-
.READABLE (<%= readable %>),
|
3
|
-
.WRITABLE (<%= writable %>),
|
4
|
-
.ADDRESS_WIDTH (<%= address_width %>),
|
5
|
-
.OFFSET_ADDRESS (<%= offset_address %>),
|
6
|
-
.BUS_WIDTH (<%= bus_width %>),
|
7
|
-
.DATA_WIDTH (<%= width %>),
|
8
|
-
.VALID_BITS (<%= valid_bits %>),
|
9
|
-
.REGISTER_INDEX (<%= register_index %>)
|
10
|
-
) u_register (
|
11
|
-
.i_clk (<%= register_block.clock %>),
|
12
|
-
.i_rst_n (<%= register_block.reset %>),
|
13
|
-
.register_if (<%= register_if %>),
|
14
|
-
.bit_field_if (<%= bit_field_if %>)
|
15
|
-
);
|
@@ -1,11 +0,0 @@
|
|
1
|
-
rggen_external_register #(
|
2
|
-
.ADDRESS_WIDTH (<%= address_width %>),
|
3
|
-
.BUS_WIDTH (<%= bus_width %>),
|
4
|
-
.START_ADDRESS (<%= start_address %>),
|
5
|
-
.END_ADDRESS (<%= end_address %>)
|
6
|
-
) u_register (
|
7
|
-
.i_clk (<%= register_block.clock %>),
|
8
|
-
.i_rst_n (<%= register_block.reset %>),
|
9
|
-
.register_if (<%= register_if %>),
|
10
|
-
.bus_if (<%= bus_if %>)
|
11
|
-
);
|
@@ -1,128 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RgGen.define_list_item_feature(:register, :type, :external) do
|
4
|
-
register_map do
|
5
|
-
writable? { true }
|
6
|
-
readable? { true }
|
7
|
-
no_bit_fields
|
8
|
-
|
9
|
-
verify(:component) do
|
10
|
-
error_condition { register.size && register.size.length > 1 }
|
11
|
-
message do
|
12
|
-
'external register type supports single size definition only'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
sv_rtl do
|
18
|
-
build do
|
19
|
-
if configuration.fold_sv_interface_port?
|
20
|
-
interface_port :register_block, :bus_if, {
|
21
|
-
name: "#{register.name}_bus_if",
|
22
|
-
interface_type: 'rggen_bus_if',
|
23
|
-
modport: 'master'
|
24
|
-
}
|
25
|
-
else
|
26
|
-
output :register_block, :valid, {
|
27
|
-
name: "o_#{register.name}_valid",
|
28
|
-
data_type: :logic, width: 1
|
29
|
-
}
|
30
|
-
output :register_block, :address, {
|
31
|
-
name: "o_#{register.name}_address",
|
32
|
-
data_type: :logic, width: address_width
|
33
|
-
}
|
34
|
-
output :register_block, :write, {
|
35
|
-
name: "o_#{register.name}_write",
|
36
|
-
data_type: :logic, width: 1
|
37
|
-
}
|
38
|
-
output :register_block, :write_data, {
|
39
|
-
name: "o_#{register.name}_data",
|
40
|
-
data_type: :logic, width: bus_width
|
41
|
-
}
|
42
|
-
output :register_block, :strobe, {
|
43
|
-
name: "o_#{register.name}_strobe",
|
44
|
-
data_type: :logic, width: byte_width
|
45
|
-
}
|
46
|
-
input :register_block, :ready, {
|
47
|
-
name: "i_#{register.name}_ready",
|
48
|
-
data_type: :logic, width: 1
|
49
|
-
}
|
50
|
-
input :register_block, :status, {
|
51
|
-
name: "i_#{register.name}_status",
|
52
|
-
data_type: :logic, width: 2
|
53
|
-
}
|
54
|
-
input :register_block, :read_data, {
|
55
|
-
name: "i_#{register.name}_data",
|
56
|
-
data_type: :logic, width: bus_width
|
57
|
-
}
|
58
|
-
interface :register, :bus_if, {
|
59
|
-
name: 'bus_if', interface_type: 'rggen_bus_if',
|
60
|
-
parameter_values: [address_width, bus_width],
|
61
|
-
variables: [
|
62
|
-
'valid', 'address', 'write', 'write_data', 'strobe',
|
63
|
-
'ready', 'status', 'read_data'
|
64
|
-
]
|
65
|
-
}
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
main_code :register, from_template: true
|
70
|
-
main_code :register do |code|
|
71
|
-
unless configuration.fold_sv_interface_port?
|
72
|
-
[
|
73
|
-
[valid, bus_if.valid],
|
74
|
-
[address, bus_if.address],
|
75
|
-
[write, bus_if.write],
|
76
|
-
[write_data, bus_if.write_data],
|
77
|
-
[strobe, bus_if.strobe],
|
78
|
-
[bus_if.ready, ready],
|
79
|
-
[bus_if.status, "rggen_status'(#{status})"],
|
80
|
-
[bus_if.read_data, read_data]
|
81
|
-
].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
87
|
-
def address_width
|
88
|
-
register_block.local_address_width
|
89
|
-
end
|
90
|
-
|
91
|
-
def byte_width
|
92
|
-
configuration.byte_width
|
93
|
-
end
|
94
|
-
|
95
|
-
def start_address
|
96
|
-
hex(register.offset_address, address_width)
|
97
|
-
end
|
98
|
-
|
99
|
-
def end_address
|
100
|
-
address = register.offset_address + register.byte_size - 1
|
101
|
-
hex(address, address_width)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
sv_ral do
|
106
|
-
build do
|
107
|
-
parameter :register_block, :model_type, {
|
108
|
-
name: model_name,
|
109
|
-
data_type: 'type',
|
110
|
-
default: 'rggen_ral_block'
|
111
|
-
}
|
112
|
-
parameter :register_block, :integrate_model, {
|
113
|
-
name: "INTEGRATE_#{model_name}",
|
114
|
-
data_type: 'bit',
|
115
|
-
default: 1
|
116
|
-
}
|
117
|
-
end
|
118
|
-
|
119
|
-
model_name { register.name.upcase }
|
120
|
-
|
121
|
-
constructor do
|
122
|
-
macro_call(
|
123
|
-
'rggen_ral_create_block_model',
|
124
|
-
[ral_model, offset_address, 'this', integrate_model]
|
125
|
-
)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
@@ -1,327 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RgGen.define_list_item_feature(:register, :type, :indirect) do
|
4
|
-
register_map do
|
5
|
-
define_helpers do
|
6
|
-
index_verifier = Class.new do
|
7
|
-
def initialize(&block)
|
8
|
-
instance_eval(&block)
|
9
|
-
end
|
10
|
-
|
11
|
-
def error_condition(&block)
|
12
|
-
@error_condition = block
|
13
|
-
end
|
14
|
-
|
15
|
-
def message(&block)
|
16
|
-
@message = block
|
17
|
-
end
|
18
|
-
|
19
|
-
def verify(feature, index)
|
20
|
-
error?(feature, index) && raise_error(feature, index)
|
21
|
-
end
|
22
|
-
|
23
|
-
def error?(feature, index)
|
24
|
-
feature.instance_exec(index, &@error_condition)
|
25
|
-
end
|
26
|
-
|
27
|
-
def raise_error(feature, index)
|
28
|
-
error_message = feature.instance_exec(index, &@message)
|
29
|
-
feature.__send__(:error, error_message)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
define_method(:verify_index) do |&block|
|
34
|
-
index_verifiers << index_verifier.new(&block)
|
35
|
-
end
|
36
|
-
|
37
|
-
def index_verifiers
|
38
|
-
@index_verifiers ||= []
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
define_struct :index_entry, [:name, :value] do
|
43
|
-
def value_index?
|
44
|
-
!array_index?
|
45
|
-
end
|
46
|
-
|
47
|
-
def array_index?
|
48
|
-
value.nil?
|
49
|
-
end
|
50
|
-
|
51
|
-
def distinguishable?(other)
|
52
|
-
name == other.name && value != other.value &&
|
53
|
-
[self, other].all?(&:value_index?)
|
54
|
-
end
|
55
|
-
|
56
|
-
def find_index_field(bit_fields)
|
57
|
-
bit_fields.find { |bit_field| bit_field.full_name == name }
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
property :index_entries
|
62
|
-
property :collect_index_fields do |bit_fields|
|
63
|
-
index_entries.map { |entry| entry.find_index_field(bit_fields) }
|
64
|
-
end
|
65
|
-
|
66
|
-
byte_size { byte_width }
|
67
|
-
support_array_register
|
68
|
-
support_overlapped_address
|
69
|
-
|
70
|
-
input_pattern [
|
71
|
-
/(#{variable_name}\.#{variable_name})/,
|
72
|
-
/(#{variable_name}\.#{variable_name}):(#{integer})?/
|
73
|
-
], match_automatically: false
|
74
|
-
|
75
|
-
build do
|
76
|
-
@index_entries = parse_index_entries
|
77
|
-
end
|
78
|
-
|
79
|
-
verify(:component) do
|
80
|
-
error_condition do
|
81
|
-
register.array? &&
|
82
|
-
register.array_size.length < array_index_fields.length
|
83
|
-
end
|
84
|
-
message { 'too many array indices are given' }
|
85
|
-
end
|
86
|
-
|
87
|
-
verify(:component) do
|
88
|
-
error_condition do
|
89
|
-
register.array? &&
|
90
|
-
register.array_size.length > array_index_fields.length
|
91
|
-
end
|
92
|
-
message { 'less array indices are given' }
|
93
|
-
end
|
94
|
-
|
95
|
-
verify(:all) do
|
96
|
-
check_error do
|
97
|
-
index_entries.each(&method(:verify_indirect_index))
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
verify_index do
|
102
|
-
error_condition do |index|
|
103
|
-
!index_entries.one? { |other| other.name == index.name }
|
104
|
-
end
|
105
|
-
message do |index|
|
106
|
-
"same bit field is used as indirect index more than once: #{index.name}"
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
verify_index do
|
111
|
-
error_condition { |index| !index_field(index) }
|
112
|
-
message do |index|
|
113
|
-
"no such bit field for indirect index is found: #{index.name}"
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
verify_index do
|
118
|
-
error_condition do |index|
|
119
|
-
index_field(index).register.name == register.name
|
120
|
-
end
|
121
|
-
message do |index|
|
122
|
-
"own bit field is not allowed for indirect index: #{index.name}"
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
verify_index do
|
127
|
-
error_condition { |index| index_field(index).register.array? }
|
128
|
-
message do |index|
|
129
|
-
'bit field of array register is not allowed ' \
|
130
|
-
"for indirect index: #{index.name}"
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
verify_index do
|
135
|
-
error_condition { |index| index_field(index).sequential? }
|
136
|
-
message do |index|
|
137
|
-
'sequential bit field is not allowed ' \
|
138
|
-
"for indirect index: #{index.name}"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
verify_index do
|
143
|
-
error_condition { |index| index_field(index).reserved? }
|
144
|
-
message do |index|
|
145
|
-
'reserved bit field is not allowed ' \
|
146
|
-
"for indirect index: #{index.name}"
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
verify_index do
|
151
|
-
error_condition do |index|
|
152
|
-
!index.array_index? &&
|
153
|
-
(index.value > (2**index_field(index).width - 1))
|
154
|
-
end
|
155
|
-
message do |index|
|
156
|
-
'bit width of indirect index is not enough for ' \
|
157
|
-
"index value #{index.value}: #{index.name}"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
verify_index do
|
162
|
-
error_condition do |index|
|
163
|
-
index.array_index? &&
|
164
|
-
(array_index_value(index) > 2**index_field(index).width)
|
165
|
-
end
|
166
|
-
message do |index|
|
167
|
-
'bit width of indirect index is not enough for ' \
|
168
|
-
"array size #{array_index_value(index)}: #{index.name}"
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
verify(:all) do
|
173
|
-
error_condition { !distinguishable? }
|
174
|
-
message { 'cannot be distinguished from other registers' }
|
175
|
-
end
|
176
|
-
|
177
|
-
private
|
178
|
-
|
179
|
-
def parse_index_entries
|
180
|
-
(!options.empty? && options.map(&method(:create_index_entry))) ||
|
181
|
-
(error 'no indirect indices are given')
|
182
|
-
end
|
183
|
-
|
184
|
-
def create_index_entry(value)
|
185
|
-
input_values = split_value(value)
|
186
|
-
if input_values.size == 2
|
187
|
-
index_entry.new(input_values[0], convert_index_value(input_values[1]))
|
188
|
-
elsif input_values.size == 1
|
189
|
-
index_entry.new(input_values[0])
|
190
|
-
else
|
191
|
-
error 'too many arguments for indirect index ' \
|
192
|
-
"are given: #{value.inspect}"
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
def split_value(value)
|
197
|
-
input_value = Array(value)
|
198
|
-
field_name = input_value.first
|
199
|
-
if sting_or_symbol?(field_name) && match_pattern(field_name)
|
200
|
-
[*match_data.captures, *input_value[1..-1]]
|
201
|
-
else
|
202
|
-
error "illegal input value for indirect index: #{value.inspect}"
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
def sting_or_symbol?(value)
|
207
|
-
[String, Symbol].any?(&value.method(:is_a?))
|
208
|
-
end
|
209
|
-
|
210
|
-
def convert_index_value(value)
|
211
|
-
Integer(value)
|
212
|
-
rescue ArgumentError, TypeError
|
213
|
-
error "cannot convert #{value.inspect} into indirect index value"
|
214
|
-
end
|
215
|
-
|
216
|
-
def verify_indirect_index(index)
|
217
|
-
helper.index_verifiers.each { |verifier| verifier.verify(self, index) }
|
218
|
-
end
|
219
|
-
|
220
|
-
def index_field(index)
|
221
|
-
@index_fields ||= {}
|
222
|
-
@index_fields[index.name] ||=
|
223
|
-
index.find_index_field(register_block.bit_fields)
|
224
|
-
end
|
225
|
-
|
226
|
-
def array_index_fields
|
227
|
-
@array_index_fields ||= index_entries.select(&:array_index?)
|
228
|
-
end
|
229
|
-
|
230
|
-
def array_index_value(index)
|
231
|
-
@array_index_values ||=
|
232
|
-
array_index_fields
|
233
|
-
.map.with_index { |entry, i| [entry.name, register.array_size[i]] }
|
234
|
-
.to_h
|
235
|
-
@array_index_values[index.name]
|
236
|
-
end
|
237
|
-
|
238
|
-
def distinguishable?
|
239
|
-
register_block
|
240
|
-
.registers.select { |other| share_same_range?(other) }
|
241
|
-
.all? { |other| distinguishable_indices?(other.index_entries) }
|
242
|
-
end
|
243
|
-
|
244
|
-
def share_same_range?(other)
|
245
|
-
register.name != other.name && register.overlap?(other)
|
246
|
-
end
|
247
|
-
|
248
|
-
def distinguishable_indices?(other_entries)
|
249
|
-
index_entries.any? do |entry|
|
250
|
-
other_entries.any?(&entry.method(:distinguishable?))
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
sv_rtl do
|
256
|
-
build do
|
257
|
-
logic :register, :indirect_index, { width: index_width }
|
258
|
-
end
|
259
|
-
|
260
|
-
main_code :register do |code|
|
261
|
-
code << indirect_index_assignment << nl
|
262
|
-
code << process_template(File.join(__dir__, 'indirect_sv_rtl.erb'))
|
263
|
-
end
|
264
|
-
|
265
|
-
private
|
266
|
-
|
267
|
-
def index_fields
|
268
|
-
@index_fields ||=
|
269
|
-
register.collect_index_fields(register_block.bit_fields)
|
270
|
-
end
|
271
|
-
|
272
|
-
def index_width
|
273
|
-
@index_width ||= index_fields.map(&:width).inject(:+)
|
274
|
-
end
|
275
|
-
|
276
|
-
def index_values
|
277
|
-
loop_variables = register.loop_variables
|
278
|
-
register.index_entries.zip(index_fields).map do |entry, field|
|
279
|
-
if entry.array_index?
|
280
|
-
loop_variables.shift[0, field.width]
|
281
|
-
else
|
282
|
-
hex(entry.value, field.width)
|
283
|
-
end
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
def indirect_index_assignment
|
288
|
-
assign(indirect_index, concat(index_fields.map(&:value)))
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
sv_ral do
|
293
|
-
unmapped
|
294
|
-
offset_address { register.offset_address }
|
295
|
-
|
296
|
-
main_code :ral_package do
|
297
|
-
class_definition(model_name) do |sv_class|
|
298
|
-
sv_class.base 'rggen_ral_indirect_reg'
|
299
|
-
sv_class.variables variables
|
300
|
-
sv_class.body { model_body }
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
private
|
305
|
-
|
306
|
-
def model_body
|
307
|
-
process_template(File.join(__dir__, 'indirect_sv_ral.erb'))
|
308
|
-
end
|
309
|
-
|
310
|
-
def index_properties
|
311
|
-
array_position = -1
|
312
|
-
register.index_entries.zip(index_fields).map do |entry, field|
|
313
|
-
value =
|
314
|
-
if entry.value_index?
|
315
|
-
hex(entry.value, field.width)
|
316
|
-
else
|
317
|
-
"array_index[#{array_position += 1}]"
|
318
|
-
end
|
319
|
-
[*entry.name.split('.'), value]
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
|
-
def index_fields
|
324
|
-
register.collect_index_fields(register_block.bit_fields)
|
325
|
-
end
|
326
|
-
end
|
327
|
-
end
|