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.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +3 -3
  4. data/lib/rggen/default_register_map.rb +7 -4
  5. data/lib/rggen/default_register_map/bit_field/bit_assignment.rb +32 -10
  6. data/lib/rggen/default_register_map/bit_field/initial_value.rb +144 -26
  7. data/lib/rggen/default_register_map/bit_field/name.rb +10 -11
  8. data/lib/rggen/default_register_map/bit_field/reference.rb +53 -24
  9. data/lib/rggen/default_register_map/bit_field/type/{rw.rb → rw_w1.rb} +1 -1
  10. data/lib/rggen/default_register_map/bit_field/type/rwe_rwl.rb +17 -0
  11. data/lib/rggen/default_register_map/bit_field/type/{wo.rb → wo_wo1.rb} +1 -1
  12. data/lib/rggen/default_register_map/common/comment.rb +18 -0
  13. data/lib/rggen/default_register_map/register/name.rb +23 -8
  14. data/lib/rggen/default_register_map/register/offset_address.rb +53 -32
  15. data/lib/rggen/default_register_map/register/size.rb +7 -11
  16. data/lib/rggen/default_register_map/register/type.rb +2 -6
  17. data/lib/rggen/default_register_map/register/type/external.rb +11 -0
  18. data/lib/rggen/default_register_map/register/type/indirect.rb +27 -40
  19. data/lib/rggen/default_register_map/register_block/name.rb +4 -9
  20. data/lib/rggen/default_register_map/register_file/name.rb +53 -0
  21. data/lib/rggen/default_register_map/register_file/offset_address.rb +107 -0
  22. data/lib/rggen/default_register_map/register_file/size.rb +60 -0
  23. data/lib/rggen/default_register_map/setup.rb +10 -3
  24. data/lib/rggen/default_register_map/version.rb +1 -1
  25. metadata +11 -8
  26. 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
- @name =
11
- if pattern_matched?
12
- match_data.to_s
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
- register_map
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, [:name, :byte_size]
8
- builder.enable :register, [:name, :offset_address, :size, :type]
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module DefaultRegisterMap
5
- VERSION = '0.16.0'
5
+ VERSION = '0.21.0'
6
6
  end
7
7
  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.16.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: 2019-10-01 00:00:00.000000000 Z
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/rw.rb
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/wo.rb
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.3'
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.0.3
95
+ rubygems_version: 3.1.2
93
96
  signing_key:
94
97
  specification_version: 4
95
- summary: rggen-default-register-map-0.16.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