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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -2
  3. data/lib/rggen.rb +0 -1
  4. data/lib/rggen/default.rb +7 -0
  5. data/lib/rggen/default_setup_file.rb +1 -2
  6. data/lib/rggen/version.rb +1 -3
  7. metadata +25 -81
  8. data/lib/rggen/built_in.rb +0 -57
  9. data/lib/rggen/built_in/bit_field/bit_assignment.rb +0 -114
  10. data/lib/rggen/built_in/bit_field/comment.rb +0 -18
  11. data/lib/rggen/built_in/bit_field/initial_value.rb +0 -75
  12. data/lib/rggen/built_in/bit_field/name.rb +0 -41
  13. data/lib/rggen/built_in/bit_field/reference.rb +0 -139
  14. data/lib/rggen/built_in/bit_field/sv_rtl_top.rb +0 -89
  15. data/lib/rggen/built_in/bit_field/type.rb +0 -245
  16. data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.erb +0 -15
  17. data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.rb +0 -59
  18. data/lib/rggen/built_in/bit_field/type/reserved.erb +0 -3
  19. data/lib/rggen/built_in/bit_field/type/reserved.rb +0 -16
  20. data/lib/rggen/built_in/bit_field/type/ro.erb +0 -6
  21. data/lib/rggen/built_in/bit_field/type/ro.rb +0 -31
  22. data/lib/rggen/built_in/bit_field/type/rof.erb +0 -6
  23. data/lib/rggen/built_in/bit_field/type/rof.rb +0 -17
  24. data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.erb +0 -13
  25. data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.rb +0 -46
  26. data/lib/rggen/built_in/bit_field/type/rw_wo.erb +0 -9
  27. data/lib/rggen/built_in/bit_field/type/rw_wo.rb +0 -30
  28. data/lib/rggen/built_in/bit_field/type/rwc_rwe_rwl.erb +0 -16
  29. data/lib/rggen/built_in/bit_field/type/rwc_rwe_rwl.rb +0 -92
  30. data/lib/rggen/built_in/bit_field/type/w0trg_w1trg.erb +0 -9
  31. data/lib/rggen/built_in/bit_field/type/w0trg_w1trg.rb +0 -29
  32. data/lib/rggen/built_in/global/address_width.rb +0 -34
  33. data/lib/rggen/built_in/global/array_port_format.rb +0 -19
  34. data/lib/rggen/built_in/global/bus_width.rb +0 -35
  35. data/lib/rggen/built_in/global/fold_sv_interface_port.rb +0 -24
  36. data/lib/rggen/built_in/register/markdown.erb +0 -11
  37. data/lib/rggen/built_in/register/markdown.rb +0 -26
  38. data/lib/rggen/built_in/register/name.rb +0 -36
  39. data/lib/rggen/built_in/register/offset_address.rb +0 -106
  40. data/lib/rggen/built_in/register/size.rb +0 -95
  41. data/lib/rggen/built_in/register/sv_rtl_top.rb +0 -82
  42. data/lib/rggen/built_in/register/type.rb +0 -344
  43. data/lib/rggen/built_in/register/type/default_sv_ral.erb +0 -8
  44. data/lib/rggen/built_in/register/type/default_sv_rtl.erb +0 -15
  45. data/lib/rggen/built_in/register/type/external.erb +0 -11
  46. data/lib/rggen/built_in/register/type/external.rb +0 -128
  47. data/lib/rggen/built_in/register/type/indirect.rb +0 -327
  48. data/lib/rggen/built_in/register/type/indirect_sv_ral.erb +0 -13
  49. data/lib/rggen/built_in/register/type/indirect_sv_rtl.erb +0 -17
  50. data/lib/rggen/built_in/register_block/byte_size.rb +0 -61
  51. data/lib/rggen/built_in/register_block/markdown.erb +0 -8
  52. data/lib/rggen/built_in/register_block/markdown.rb +0 -36
  53. data/lib/rggen/built_in/register_block/name.rb +0 -38
  54. data/lib/rggen/built_in/register_block/protocol.rb +0 -100
  55. data/lib/rggen/built_in/register_block/protocol/apb.erb +0 -10
  56. data/lib/rggen/built_in/register_block/protocol/apb.rb +0 -89
  57. data/lib/rggen/built_in/register_block/protocol/axi4lite.erb +0 -11
  58. data/lib/rggen/built_in/register_block/protocol/axi4lite.rb +0 -125
  59. data/lib/rggen/built_in/register_block/sv_ral_block_model.erb +0 -11
  60. data/lib/rggen/built_in/register_block/sv_ral_package.rb +0 -65
  61. data/lib/rggen/built_in/register_block/sv_rtl_macros.erb +0 -9
  62. data/lib/rggen/built_in/register_block/sv_rtl_top.rb +0 -86
  63. data/lib/rggen/built_in/version.rb +0 -7
  64. data/lib/rggen/setup/default.rb +0 -30
  65. data/sample/block_0.md +0 -155
  66. data/sample/block_0.rb +0 -90
  67. data/sample/block_0.sv +0 -678
  68. data/sample/block_0.xlsx +0 -0
  69. data/sample/block_0.yml +0 -99
  70. data/sample/block_0_ral_pkg.sv +0 -184
  71. data/sample/block_1.md +0 -39
  72. data/sample/block_1.rb +0 -22
  73. data/sample/block_1.sv +0 -136
  74. data/sample/block_1.xlsx +0 -0
  75. data/sample/block_1.yml +0 -26
  76. data/sample/block_1_ral_pkg.sv +0 -68
  77. data/sample/config.json +0 -5
  78. data/sample/config.yml +0 -3
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:global, :array_port_format) do
4
- configuration do
5
- property :array_port_format, default: :packed
6
-
7
- input_pattern /(packed|unpacked|serialized)/i
8
- ignore_empty_value false
9
-
10
- build do |value|
11
- @array_port_format =
12
- if pattern_matched?
13
- match_data[1].downcase.to_sym
14
- else
15
- error "illegal input value for array port format: #{value.inspect}"
16
- end
17
- end
18
- end
19
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:global, :bus_width) do
4
- configuration do
5
- property :bus_width, default: 32
6
- property :byte_width, body: -> { bus_width / 8 }
7
-
8
- build do |value|
9
- @bus_width =
10
- begin
11
- Integer(value)
12
- rescue ArgumentError, TypeError
13
- error "cannot convert #{value.inspect} into bus width"
14
- end
15
- end
16
-
17
- verify(:feature) do
18
- error_condition { bus_width < 8 }
19
- message { "input bus width is less than 8: #{bus_width}" }
20
- end
21
-
22
- verify(:feature) do
23
- error_condition { !power_of_2?(bus_width) }
24
- message { "input bus width is not power of 2: #{bus_width}" }
25
- end
26
-
27
- printable :bus_width
28
-
29
- private
30
-
31
- def power_of_2?(value)
32
- value.positive? && (value & value.pred).zero?
33
- end
34
- end
35
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:global, :fold_sv_interface_port) do
4
- configuration do
5
- property :fold_sv_interface_port?, default: true
6
-
7
- input_pattern [
8
- /true|on|yes/i, /false|off|no/i
9
- ], match_automatically: false
10
-
11
- ignore_empty_value false
12
-
13
- build do |value|
14
- @fold_sv_interface_port =
15
- if [true, false].include?(value)
16
- value
17
- elsif match_pattern(value)
18
- [true, false][match_index]
19
- else
20
- error "cannot convert #{value.inspect} into boolean"
21
- end
22
- end
23
- end
24
- end
@@ -1,11 +0,0 @@
1
-
2
- ### <%= anchor(anchor_id) %><%= register.name %>
3
-
4
- <% register.printables.each do |name, printable| %>
5
- * <%= name %>
6
- * <%= printable || 'NA' %>
7
- <% end %>
8
- <% if register.bit_fields? %>
9
-
10
- <%= bit_field_table %>
11
- <% end%>
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:register, :markdown) do
4
- markdown do
5
- export def anchor_id
6
- [register_block.anchor_id, register.name].join('-')
7
- end
8
-
9
- main_code :markdown, from_template: true
10
-
11
- private
12
-
13
- def bit_field_table
14
- column_names = bit_field_printables.first.keys
15
- rows =
16
- bit_field_printables
17
- .map(&:values)
18
- .map { |row| row.map { |cell| Array(cell).join("\n") } }
19
- table(column_names, rows)
20
- end
21
-
22
- def bit_field_printables
23
- @bit_field_printables ||= register.bit_fields.map(&:printables)
24
- end
25
- end
26
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:register, :name) do
4
- register_map do
5
- property :name
6
-
7
- input_pattern variable_name
8
-
9
- build do |value|
10
- @name =
11
- if pattern_matched?
12
- match_data.to_s
13
- else
14
- error "illegal input value for register name: #{value.inspect}"
15
- end
16
- end
17
-
18
- verify(:feature) do
19
- error_condition { !name }
20
- message { 'no register name is given' }
21
- end
22
-
23
- verify(:feature) do
24
- error_condition { duplicated_name? }
25
- message { "duplicated register name: #{name}" }
26
- end
27
-
28
- printable :name
29
-
30
- private
31
-
32
- def duplicated_name?
33
- register_block.registers.any? { |register| register.name == name }
34
- end
35
- end
36
- end
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:register, :offset_address) do
4
- register_map do
5
- property :offset_address
6
- property :address_range, body: -> { start_address..end_address }
7
- property :overlap?, forward_to: :overlap_address_range?
8
-
9
- build do |value|
10
- @offset_address =
11
- begin
12
- Integer(value)
13
- rescue ArgumentError, TypeError
14
- error "cannot convert #{value.inspect} into offset address"
15
- end
16
- end
17
-
18
- verify(:feature) do
19
- error_condition { !offset_address }
20
- message { 'no offset address is given' }
21
- end
22
-
23
- verify(:feature) do
24
- error_condition { offset_address.negative? }
25
- message { "offset address is less than 0: #{offset_address}" }
26
- end
27
-
28
- verify(:feature) do
29
- error_condition { (offset_address % byte_width).positive? }
30
- message do
31
- "offset address is not aligned with bus width(#{bus_width}): "\
32
- "0x#{offset_address.to_s(16)}"
33
- end
34
- end
35
-
36
- verify(:component) do
37
- error_condition { end_address > register_block.byte_size }
38
- message do
39
- 'offset address range exceeds byte size of register block' \
40
- "(#{register_block.byte_size}): " \
41
- "0x#{start_address.to_s(16)}-0x#{end_address.to_s(16)}"
42
- end
43
- end
44
-
45
- verify(:component) do
46
- error_condition do
47
- register_block.registers.any? do |register|
48
- overlap_address_range?(register) &&
49
- support_unique_range_only?(register)
50
- end
51
- end
52
- message do
53
- 'offset address range overlaps with other offset address range: ' \
54
- "0x#{start_address.to_s(16)}-0x#{end_address.to_s(16)}"
55
- end
56
- end
57
-
58
- printable(:offset_address) do
59
- [start_address, end_address]
60
- .map(&method(:printable_address)).join(' - ')
61
- end
62
-
63
- private
64
-
65
- def bus_width
66
- configuration.bus_width
67
- end
68
-
69
- def byte_width
70
- configuration.byte_width
71
- end
72
-
73
- def start_address
74
- offset_address
75
- end
76
-
77
- def end_address
78
- start_address + register.byte_size - 1
79
- end
80
-
81
- def overlap_address_range?(other_register)
82
- overlap_range?(other_register) && match_access?(other_register)
83
- end
84
-
85
- def overlap_range?(other_register)
86
- own = address_range
87
- other = other_register.address_range
88
- own.include?(other.first) || other.include?(own.first)
89
- end
90
-
91
- def match_access?(other_register)
92
- (register.writable? && other_register.writable?) ||
93
- (register.readable? && other_register.readable?)
94
- end
95
-
96
- def support_unique_range_only?(other_register)
97
- !(register.settings[:support_overlapped_address] &&
98
- register.match_type?(other_register))
99
- end
100
-
101
- def printable_address(address)
102
- print_width = (register_block.local_address_width + 3) / 4
103
- format('0x%0*x', print_width, address)
104
- end
105
- end
106
- end
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:register, :size) do
4
- register_map do
5
- property :size
6
- property :width, body: -> { @width ||= calc_width }
7
- property :byte_width, body: -> { width / 8 }
8
- property :byte_size, body: -> { @byte_size ||= calc_byte_size }
9
- property :array?, forward_to: :array_register?
10
- property :array_size, forward_to: :array_registers
11
- property :count, body: -> { @count ||= calc_count }
12
-
13
- input_pattern [
14
- /(#{integer}(:?,#{integer})*)/,
15
- /\[(#{integer}(:?,#{integer})*)\]/
16
- ], match_automatically: false
17
-
18
- build do |values|
19
- @size = parse_values(values)
20
- end
21
-
22
- verify(:feature) do
23
- error_condition { size && !size.all?(&:positive?) }
24
- message do
25
- "non positive value(s) are not allowed for register size: #{size}"
26
- end
27
- end
28
-
29
- printable(:array_size) do
30
- (array_register? || nil) && "[#{array_registers.join(', ')}]"
31
- end
32
-
33
- private
34
-
35
- def parse_values(values)
36
- Array(
37
- values.is_a?(String) && parse_string_values(values) || values
38
- ).map(&method(:convert_value))
39
- end
40
-
41
- def parse_string_values(values)
42
- if match_pattern(values)
43
- split_match_data(match_data)
44
- else
45
- error "illegal input value for register size: #{values.inspect}"
46
- end
47
- end
48
-
49
- def split_match_data(match_data)
50
- match_data.captures.first.split(',')
51
- end
52
-
53
- def convert_value(value)
54
- Integer(value)
55
- rescue ArgumentError, TypeError
56
- error "cannot convert #{value.inspect} into register size"
57
- end
58
-
59
- def calc_width
60
- bus_width = configuration.bus_width
61
- if register.bit_fields.empty?
62
- bus_width
63
- else
64
- ((max_msb + bus_width) / bus_width) * bus_width
65
- end
66
- end
67
-
68
- def max_msb
69
- register
70
- .bit_fields
71
- .map { |bit_field| bit_field.msb((bit_field.sequence_size || 1) - 1) }
72
- .max
73
- end
74
-
75
- def calc_byte_size
76
- if register.settings[:byte_size]
77
- instance_exec(&register.settings[:byte_size])
78
- else
79
- Array(@size).reduce(1, :*) * byte_width
80
- end
81
- end
82
-
83
- def array_register?
84
- register.settings[:support_array] && !@size.nil? || false
85
- end
86
-
87
- def array_registers
88
- array_register? && @size || nil
89
- end
90
-
91
- def calc_count
92
- Array(array_registers).reduce(1, :*)
93
- end
94
- end
95
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_simple_feature(:register, :sv_rtl_top) do
4
- sv_rtl do
5
- export :index
6
- export :local_index
7
- export :loop_variables
8
-
9
- pre_build do
10
- @base_index =
11
- register_block.registers.map(&:count).inject(0, :+)
12
- end
13
-
14
- build do
15
- if register.bit_fields?
16
- interface :register, :bit_field_if, {
17
- name: 'bit_field_if',
18
- interface_type: 'rggen_bit_field_if',
19
- parameter_values: [register.width]
20
- }
21
- end
22
- end
23
-
24
- main_code :register_block do
25
- local_scope("g_#{register.name}") do |scope|
26
- scope.top_scope
27
- scope.loop_size loop_size
28
- scope.variables variables
29
- scope.body(&method(:body_code))
30
- end
31
- end
32
-
33
- def index(offset = nil)
34
- operands =
35
- register.array? ? [@base_index, offset || local_index] : [@base_index]
36
- if operands.all? { |operand| operand.is_a?(Integer) }
37
- operands.inject(:+)
38
- else
39
- operands.join('+')
40
- end
41
- end
42
-
43
- def local_index
44
- (register.array? || nil) &&
45
- loop_variables
46
- .zip(local_index_coefficients)
47
- .map { |v, c| [c, v].compact.join('*') }
48
- .join('+')
49
- end
50
-
51
- def loop_variables
52
- (register.array? || nil) &&
53
- register.array_size.map.with_index(1) do |_size, i|
54
- create_identifier(loop_index(i))
55
- end
56
- end
57
-
58
- private
59
-
60
- def local_index_coefficients
61
- coefficients = []
62
- register.array_size.reverse.inject(1) do |total, size|
63
- coefficients.unshift(coefficients.size.zero? ? nil : total)
64
- total * size
65
- end
66
- coefficients
67
- end
68
-
69
- def loop_size
70
- (register.array? || nil) &&
71
- loop_variables.zip(register.array_size).to_h
72
- end
73
-
74
- def variables
75
- register.declarations(:register, :variable)
76
- end
77
-
78
- def body_code(code)
79
- register.generate_code(:register, :top_down, code)
80
- end
81
- end
82
- end
@@ -1,344 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RgGen.define_list_feature(:register, :type) do
4
- register_map do
5
- base_feature do
6
- define_helpers do
7
- def writable?(&block)
8
- @writability = block
9
- end
10
-
11
- def readable?(&block)
12
- @readability = block
13
- end
14
-
15
- attr_reader :writability
16
- attr_reader :readability
17
-
18
- def no_bit_fields
19
- @no_bit_fields = true
20
- end
21
-
22
- def need_bit_fields?
23
- !@no_bit_fields
24
- end
25
-
26
- def settings
27
- @settings ||= {}
28
- end
29
-
30
- def support_array_register
31
- settings[:support_array] = true
32
- end
33
-
34
- def byte_size(&block)
35
- settings[:byte_size] = block
36
- end
37
-
38
- def support_overlapped_address
39
- settings[:support_overlapped_address] = true
40
- end
41
- end
42
-
43
- property :type, body: -> { @type || :default }
44
- property :match_type?, body: ->(register) { register.type == type }
45
- property :writable?, forward_to: :writability
46
- property :readable?, forward_to: :readability
47
- property :settings, forward_to_helper: true
48
-
49
- build do |value|
50
- @type = value[:type]
51
- @options = value[:options]
52
- helper.need_bit_fields? || register.need_no_children
53
- end
54
-
55
- verify(:component) do
56
- error_condition do
57
- helper.need_bit_fields? && register.bit_fields.empty?
58
- end
59
- message { 'no bit fields are given' }
60
- end
61
-
62
- private
63
-
64
- attr_reader :options
65
-
66
- def writability
67
- if @writability.nil?
68
- block = helper.writability || default_writability
69
- @writability = instance_exec(&block)
70
- end
71
- @writability
72
- end
73
-
74
- def default_writability
75
- -> { register.bit_fields.any?(&:writable?) }
76
- end
77
-
78
- def readability
79
- if @readability.nil?
80
- block = helper.readability || default_readability
81
- @readability = instance_exec(&block)
82
- end
83
- @readability
84
- end
85
-
86
- def default_readability
87
- lambda do
88
- block = ->(bit_field) { bit_field.readable? || bit_field.reserved? }
89
- register.bit_fields.any?(&block)
90
- end
91
- end
92
- end
93
-
94
- default_feature do
95
- support_array_register
96
-
97
- verify(:feature) do
98
- error_condition { @type }
99
- message { "unknown register type: #{@type.inspect}" }
100
- end
101
- end
102
-
103
- factory do
104
- convert_value do |value|
105
- type, options = split_input_value(value)
106
- { type: find_type(type), options: Array(options) }
107
- end
108
-
109
- def select_feature(cell)
110
- if cell.empty_value?
111
- target_feature
112
- else
113
- target_features[cell.value[:type]]
114
- end
115
- end
116
-
117
- private
118
-
119
- def split_input_value(value)
120
- if value.is_a?(String)
121
- split_string_value(value)
122
- else
123
- input_value = Array(value)
124
- [input_value[0], input_value[1..-1]]
125
- end
126
- end
127
-
128
- def split_string_value(value)
129
- type, options = split_string(value, ':', 2)
130
- [type, split_string(options, /[,\n]/, 0)]
131
- end
132
-
133
- def split_string(value, separator, limit)
134
- value&.split(separator, limit)&.map(&:strip)
135
- end
136
-
137
- def find_type(type)
138
- types = target_features.keys
139
- types.find(&type.to_sym.method(:casecmp?)) || type
140
- end
141
- end
142
- end
143
-
144
- sv_rtl do
145
- base_feature do
146
- private
147
-
148
- def readable
149
- register.readable? && 1 || 0
150
- end
151
-
152
- def writable
153
- register.writable? && 1 || 0
154
- end
155
-
156
- def bus_width
157
- configuration.bus_width
158
- end
159
-
160
- def address_width
161
- register_block.local_address_width
162
- end
163
-
164
- def offset_address
165
- hex(register.offset_address, address_width)
166
- end
167
-
168
- def width
169
- register.width
170
- end
171
-
172
- def valid_bits
173
- bits = register.bit_fields.map(&:bit_map).inject(:|)
174
- hex(bits, register.width)
175
- end
176
-
177
- def register_index
178
- register.local_index || 0
179
- end
180
-
181
- def register_if
182
- register_block.register_if[register.index]
183
- end
184
-
185
- def bit_field_if
186
- register.bit_field_if
187
- end
188
- end
189
-
190
- default_feature do
191
- template_path = File.join(__dir__, 'type', 'default_sv_rtl.erb')
192
- main_code :register, from_template: template_path
193
- end
194
-
195
- factory do
196
- def select_feature(_configuration, register)
197
- target_features[register.type]
198
- end
199
- end
200
- end
201
-
202
- sv_ral do
203
- base_feature do
204
- define_helpers do
205
- def model_name(&body)
206
- @model_name = body if block_given?
207
- @model_name
208
- end
209
-
210
- def offset_address(&body)
211
- @offset_address = body if block_given?
212
- @offset_address
213
- end
214
-
215
- def unmapped
216
- @unmapped = true
217
- end
218
-
219
- def unmapped?
220
- !@unmapped.nil?
221
- end
222
-
223
- def constructor(&body)
224
- @constructor = body if block_given?
225
- @constructor
226
- end
227
- end
228
-
229
- export :constructors
230
-
231
- build do
232
- variable :register_block, :ral_model, {
233
- name: register.name,
234
- data_type: model_name,
235
- array_size: register.array_size,
236
- random: true
237
- }
238
- end
239
-
240
- def constructors
241
- (array_index_list || [nil]).map.with_index do |array_index, i|
242
- constructor_code(array_index, i)
243
- end
244
- end
245
-
246
- private
247
-
248
- def model_name
249
- if helper.model_name
250
- instance_eval(&helper.model_name)
251
- else
252
- "#{register.name}_reg_model"
253
- end
254
- end
255
-
256
- def array_index_list
257
- (register.array? || nil) &&
258
- begin
259
- index_table = register.array_size.map { |size| (0...size).to_a }
260
- index_table[0].product(*index_table[1..-1])
261
- end
262
- end
263
-
264
- def constructor_code(array_index, index)
265
- if helper.constructor
266
- instance_exec(array_index, index, &helper.constructor)
267
- else
268
- macro_call(
269
- :rggen_ral_create_reg_model, arguments(array_index, index)
270
- )
271
- end
272
- end
273
-
274
- def arguments(array_index, index)
275
- [
276
- ral_model[array_index], array(array_index), offset_address(index),
277
- access_rights, unmapped, hdl_path(array_index)
278
- ]
279
- end
280
-
281
- def offset_address(index = 0)
282
- address =
283
- if helper.offset_address
284
- instance_exec(index, &helper.offset_address)
285
- else
286
- register.offset_address + register.byte_width * index
287
- end
288
- hex(address, register_block.local_address_width)
289
- end
290
-
291
- def access_rights
292
- if register.writable? && register.readable?
293
- 'RW'
294
- elsif register.writable?
295
- 'WO'
296
- else
297
- 'RO'
298
- end
299
- end
300
-
301
- def unmapped
302
- helper.unmapped? && 1 || 0
303
- end
304
-
305
- def hdl_path(array_index)
306
- [
307
- "g_#{register.name}",
308
- *Array(array_index).map { |i| "g[#{i}]" },
309
- 'u_register'
310
- ].join('.')
311
- end
312
-
313
- def variables
314
- register.declarations(:register, :variable)
315
- end
316
-
317
- def field_model_constructors
318
- register.bit_fields.flat_map(&:constructors)
319
- end
320
- end
321
-
322
- default_feature do
323
- main_code :ral_package do
324
- class_definition(model_name) do |sv_class|
325
- sv_class.base 'rggen_ral_reg'
326
- sv_class.variables variables
327
- sv_class.body { model_body }
328
- end
329
- end
330
-
331
- private
332
-
333
- def model_body
334
- process_template(File.join(__dir__, 'type', 'default_sv_ral.erb'))
335
- end
336
- end
337
-
338
- factory do
339
- def select_feature(_configuration, register)
340
- target_features[register.type]
341
- end
342
- end
343
- end
344
- end