rggen-default-register-map 0.16.0 → 0.21.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/LICENSE +1 -1
- data/README.md +3 -3
- data/lib/rggen/default_register_map.rb +7 -4
- data/lib/rggen/default_register_map/bit_field/bit_assignment.rb +32 -10
- data/lib/rggen/default_register_map/bit_field/initial_value.rb +144 -26
- data/lib/rggen/default_register_map/bit_field/name.rb +10 -11
- data/lib/rggen/default_register_map/bit_field/reference.rb +53 -24
- data/lib/rggen/default_register_map/bit_field/type/{rw.rb → rw_w1.rb} +1 -1
- data/lib/rggen/default_register_map/bit_field/type/rwe_rwl.rb +17 -0
- data/lib/rggen/default_register_map/bit_field/type/{wo.rb → wo_wo1.rb} +1 -1
- data/lib/rggen/default_register_map/common/comment.rb +18 -0
- data/lib/rggen/default_register_map/register/name.rb +23 -8
- data/lib/rggen/default_register_map/register/offset_address.rb +53 -32
- data/lib/rggen/default_register_map/register/size.rb +7 -11
- data/lib/rggen/default_register_map/register/type.rb +2 -6
- data/lib/rggen/default_register_map/register/type/external.rb +11 -0
- data/lib/rggen/default_register_map/register/type/indirect.rb +27 -40
- data/lib/rggen/default_register_map/register_block/name.rb +4 -9
- data/lib/rggen/default_register_map/register_file/name.rb +53 -0
- data/lib/rggen/default_register_map/register_file/offset_address.rb +107 -0
- data/lib/rggen/default_register_map/register_file/size.rb +60 -0
- data/lib/rggen/default_register_map/setup.rb +10 -3
- data/lib/rggen/default_register_map/version.rb +1 -1
- metadata +11 -8
- data/lib/rggen/default_register_map/bit_field/comment.rb +0 -18
@@ -7,12 +7,9 @@ RgGen.define_simple_feature(:register_block, :name) do
|
|
7
7
|
input_pattern variable_name
|
8
8
|
|
9
9
|
build do |value|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
else
|
14
|
-
error "illegal input value for register block name: #{value.inspect}"
|
15
|
-
end
|
10
|
+
pattern_matched? ||
|
11
|
+
(error "illegal input value for register block name: #{value.inspect}")
|
12
|
+
@name = match_data.to_s
|
16
13
|
end
|
17
14
|
|
18
15
|
verify(:feature) do
|
@@ -30,9 +27,7 @@ RgGen.define_simple_feature(:register_block, :name) do
|
|
30
27
|
private
|
31
28
|
|
32
29
|
def duplicated_name?
|
33
|
-
|
34
|
-
.register_blocks
|
35
|
-
.any? { |register_block| register_block.name == name }
|
30
|
+
register_blocks.any? { |register_block| register_block.name == name }
|
36
31
|
end
|
37
32
|
end
|
38
33
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_file, :name) do
|
4
|
+
register_map do
|
5
|
+
property :name
|
6
|
+
property :full_name, forward_to: :get_full_name
|
7
|
+
|
8
|
+
input_pattern variable_name
|
9
|
+
|
10
|
+
build do |value|
|
11
|
+
pattern_matched? ||
|
12
|
+
(error "illegal input value for register file name: #{value.inspect}")
|
13
|
+
@name = match_data.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
verify(:feature) do
|
17
|
+
error_condition { !name }
|
18
|
+
message { 'no register file name is given' }
|
19
|
+
end
|
20
|
+
|
21
|
+
verify(:feature) do
|
22
|
+
error_condition { duplicated_name? }
|
23
|
+
message { "duplicated register file name: #{name}" }
|
24
|
+
end
|
25
|
+
|
26
|
+
printable(:name) do
|
27
|
+
array_name
|
28
|
+
end
|
29
|
+
|
30
|
+
printable(:layer_name) do
|
31
|
+
[
|
32
|
+
register_file(:upper)&.printables&.fetch(:layer_name),
|
33
|
+
array_name
|
34
|
+
].compact.join('.')
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def get_full_name(separator = '.')
|
40
|
+
[*register_file(:upper)&.full_name(separator), name].join(separator)
|
41
|
+
end
|
42
|
+
|
43
|
+
def duplicated_name?
|
44
|
+
files_and_registers
|
45
|
+
.any? { |file_or_register| file_or_register.name == name }
|
46
|
+
end
|
47
|
+
|
48
|
+
def array_name
|
49
|
+
RgGen::Core::Utility::CodeUtility
|
50
|
+
.array_name(name, register_file.array_size)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_file, :offset_address) do
|
4
|
+
register_map do
|
5
|
+
property :offset_address, initial: -> { defalt_offset_address }
|
6
|
+
property :expanded_offset_addresses, forward_to: :expand_addresses
|
7
|
+
property :address_range, initial: -> { start_address..end_address }
|
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.negative? }
|
20
|
+
message { "offset address is less than 0: #{offset_address}" }
|
21
|
+
end
|
22
|
+
|
23
|
+
verify(:feature) do
|
24
|
+
error_condition { (offset_address % byte_width).nonzero? }
|
25
|
+
message do
|
26
|
+
"offset address is not aligned with bus width(#{bus_width}): " \
|
27
|
+
"0x#{offset_address.to_s(16)}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
verify(:component) do
|
32
|
+
error_condition do
|
33
|
+
register_file.parent.register_block? &&
|
34
|
+
end_address > register_block.byte_size
|
35
|
+
end
|
36
|
+
message do
|
37
|
+
'offset address range exceeds byte size of register block' \
|
38
|
+
"(#{register_block.byte_size}): " \
|
39
|
+
"0x#{start_address.to_s(16)}-0x#{end_address.to_s(16)}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
verify(:component) do
|
44
|
+
error_condition do
|
45
|
+
files_and_registers.any?(&method(:overlap_address_range?))
|
46
|
+
end
|
47
|
+
message do
|
48
|
+
'offset address range overlaps with other offset address range: ' \
|
49
|
+
"0x#{start_address(true).to_s(16)}-0x#{end_address(true).to_s(16)}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
printable(:offset_address) do
|
54
|
+
expand_addresses.map(&method(:format_address))
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def defalt_offset_address
|
60
|
+
register_file.component_index.zero? && 0 ||
|
61
|
+
(previous_component.offset_address + previous_component.byte_size)
|
62
|
+
end
|
63
|
+
|
64
|
+
def previous_component
|
65
|
+
index = register_file.component_index - 1
|
66
|
+
block_or_file.files_and_registers[index]
|
67
|
+
end
|
68
|
+
|
69
|
+
def start_address(full = false)
|
70
|
+
full && expand_addresses.first || offset_address
|
71
|
+
end
|
72
|
+
|
73
|
+
def end_address(full = false)
|
74
|
+
start_address(full) + register_file.byte_size - 1
|
75
|
+
end
|
76
|
+
|
77
|
+
def expand_addresses
|
78
|
+
uppser_addresses = register_file(:upper)&.expanded_offset_addresses || [0]
|
79
|
+
uppser_addresses.product(expand_local_addresses).map(&:sum)
|
80
|
+
end
|
81
|
+
|
82
|
+
def expand_local_addresses
|
83
|
+
Array.new(register_file.array_size&.inject(:*) || 1) do |i|
|
84
|
+
offset_address + register_file.byte_size(false) * i
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def overlap_address_range?(other)
|
89
|
+
self_range = address_range
|
90
|
+
other_range = other.address_range
|
91
|
+
self_range.include?(other_range.first) || other_range.include?(self_range.first)
|
92
|
+
end
|
93
|
+
|
94
|
+
def bus_width
|
95
|
+
configuration.bus_width
|
96
|
+
end
|
97
|
+
|
98
|
+
def byte_width
|
99
|
+
configuration.byte_width
|
100
|
+
end
|
101
|
+
|
102
|
+
def format_address(address)
|
103
|
+
print_width = (register_block.local_address_width.to_f / 4.0).ceil
|
104
|
+
format('0x%0*x', print_width, address)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_file, :size) do
|
4
|
+
register_map do
|
5
|
+
property :size
|
6
|
+
property :byte_size, forward_to: :calc_byte_size
|
7
|
+
property :array?, body: -> { !@size.nil? }
|
8
|
+
property :array_size, forward_to: :size
|
9
|
+
property :count, forward_to: :calc_count
|
10
|
+
|
11
|
+
input_pattern [
|
12
|
+
/(#{integer}(:?,#{integer})*)/,
|
13
|
+
/\[(#{integer}(:?,#{integer})*)\]/
|
14
|
+
], match_automatically: false
|
15
|
+
|
16
|
+
build do |values|
|
17
|
+
@size =
|
18
|
+
(values.is_a?(String) && parse_string_value(values) || Array(values))
|
19
|
+
.map(&method(:convert_value))
|
20
|
+
end
|
21
|
+
|
22
|
+
verify(:feature) do
|
23
|
+
error_condition { array? && !size.all?(&:positive?) }
|
24
|
+
message do
|
25
|
+
"non positive value(s) are not allowed for register file size: #{size}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def parse_string_value(value)
|
32
|
+
match_pattern(value) && match_data.captures.first.split(',') ||
|
33
|
+
(error "illegal input value for register file size: #{value.inspect}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def convert_value(value)
|
37
|
+
Integer(value)
|
38
|
+
rescue ArgumentError, TypeError
|
39
|
+
error "cannot convert #{value.inspect} into register file size"
|
40
|
+
end
|
41
|
+
|
42
|
+
def calc_byte_size(whole_size = true)
|
43
|
+
(whole_size ? total_entries : 1) * entry_byte_size
|
44
|
+
end
|
45
|
+
|
46
|
+
def entry_byte_size
|
47
|
+
register_file.files_and_registers
|
48
|
+
.map { |r| r.offset_address + r.byte_size }.max
|
49
|
+
end
|
50
|
+
|
51
|
+
def calc_count(whole_count = true)
|
52
|
+
(whole_count ? total_entries : 1) *
|
53
|
+
register_file.files_and_registers.sum(&:count)
|
54
|
+
end
|
55
|
+
|
56
|
+
def total_entries
|
57
|
+
size&.inject(:*) || 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -4,8 +4,15 @@ require 'rggen/default_register_map'
|
|
4
4
|
|
5
5
|
RgGen.setup :'rggen-defualt-register-map', RgGen::DefaultRegisterMap do |builder|
|
6
6
|
builder.enable :global, [:bus_width, :address_width]
|
7
|
-
builder.enable :register_block, [
|
8
|
-
|
7
|
+
builder.enable :register_block, [
|
8
|
+
:name, :byte_size, :comment
|
9
|
+
]
|
10
|
+
builder.enable :register_file, [
|
11
|
+
:name, :offset_address, :size, :comment
|
12
|
+
]
|
13
|
+
builder.enable :register, [
|
14
|
+
:name, :offset_address, :size, :type, :comment
|
15
|
+
]
|
9
16
|
builder.enable :register, :type, [:external, :indirect]
|
10
17
|
builder.enable :bit_field, [
|
11
18
|
:name, :bit_assignment, :type, :initial_value, :reference, :comment
|
@@ -14,6 +21,6 @@ RgGen.setup :'rggen-defualt-register-map', RgGen::DefaultRegisterMap do |builder
|
|
14
21
|
:rc, :reserved, :ro, :rof, :rs,
|
15
22
|
:rw, :rwc, :rwe, :rwl, :rws,
|
16
23
|
:w0c, :w0crs, :w0s, :w0src, :w0trg,
|
17
|
-
:w1c, :w1crs, :w1s, :w1src, :w1trg, :wo
|
24
|
+
:w1, :w1c, :w1crs, :w1s, :w1src, :w1trg, :wo, :wo1
|
18
25
|
]
|
19
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rggen-default-register-map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taichi Ishitani
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -36,7 +36,6 @@ files:
|
|
36
36
|
- README.md
|
37
37
|
- lib/rggen/default_register_map.rb
|
38
38
|
- lib/rggen/default_register_map/bit_field/bit_assignment.rb
|
39
|
-
- lib/rggen/default_register_map/bit_field/comment.rb
|
40
39
|
- lib/rggen/default_register_map/bit_field/initial_value.rb
|
41
40
|
- lib/rggen/default_register_map/bit_field/name.rb
|
42
41
|
- lib/rggen/default_register_map/bit_field/reference.rb
|
@@ -46,14 +45,15 @@ files:
|
|
46
45
|
- lib/rggen/default_register_map/bit_field/type/ro.rb
|
47
46
|
- lib/rggen/default_register_map/bit_field/type/rof.rb
|
48
47
|
- lib/rggen/default_register_map/bit_field/type/rs.rb
|
49
|
-
- lib/rggen/default_register_map/bit_field/type/
|
48
|
+
- lib/rggen/default_register_map/bit_field/type/rw_w1.rb
|
50
49
|
- lib/rggen/default_register_map/bit_field/type/rwc_rws.rb
|
51
50
|
- lib/rggen/default_register_map/bit_field/type/rwe_rwl.rb
|
52
51
|
- lib/rggen/default_register_map/bit_field/type/w0c_w1c.rb
|
53
52
|
- lib/rggen/default_register_map/bit_field/type/w0crs_w1crs_w0src_w1src.rb
|
54
53
|
- lib/rggen/default_register_map/bit_field/type/w0s_w1s.rb
|
55
54
|
- lib/rggen/default_register_map/bit_field/type/w0trg_w1trg.rb
|
56
|
-
- lib/rggen/default_register_map/bit_field/type/
|
55
|
+
- lib/rggen/default_register_map/bit_field/type/wo_wo1.rb
|
56
|
+
- lib/rggen/default_register_map/common/comment.rb
|
57
57
|
- lib/rggen/default_register_map/global/address_width.rb
|
58
58
|
- lib/rggen/default_register_map/global/bus_width.rb
|
59
59
|
- lib/rggen/default_register_map/register/name.rb
|
@@ -64,6 +64,9 @@ files:
|
|
64
64
|
- lib/rggen/default_register_map/register/type/indirect.rb
|
65
65
|
- lib/rggen/default_register_map/register_block/byte_size.rb
|
66
66
|
- lib/rggen/default_register_map/register_block/name.rb
|
67
|
+
- lib/rggen/default_register_map/register_file/name.rb
|
68
|
+
- lib/rggen/default_register_map/register_file/offset_address.rb
|
69
|
+
- lib/rggen/default_register_map/register_file/size.rb
|
67
70
|
- lib/rggen/default_register_map/setup.rb
|
68
71
|
- lib/rggen/default_register_map/version.rb
|
69
72
|
homepage: https://github.com/rggen/rggen-default-register-map
|
@@ -82,15 +85,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
85
|
requirements:
|
83
86
|
- - ">="
|
84
87
|
- !ruby/object:Gem::Version
|
85
|
-
version: '2.
|
88
|
+
version: '2.4'
|
86
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
90
|
requirements:
|
88
91
|
- - ">="
|
89
92
|
- !ruby/object:Gem::Version
|
90
93
|
version: '0'
|
91
94
|
requirements: []
|
92
|
-
rubygems_version: 3.
|
95
|
+
rubygems_version: 3.1.2
|
93
96
|
signing_key:
|
94
97
|
specification_version: 4
|
95
|
-
summary: rggen-default-register-map-0.
|
98
|
+
summary: rggen-default-register-map-0.21.0
|
96
99
|
test_files: []
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RgGen.define_simple_feature(:bit_field, :comment) do
|
4
|
-
register_map do
|
5
|
-
property :comment, body: -> { @comment ||= '' }
|
6
|
-
|
7
|
-
build do |value|
|
8
|
-
@comment =
|
9
|
-
if value.is_a?(Array)
|
10
|
-
value.join("\n")
|
11
|
-
else
|
12
|
-
value.to_s
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
printable :comment
|
17
|
-
end
|
18
|
-
end
|