rggen 0.12.0 → 0.13.0

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