rggen-default-register-map 0.16.0 → 0.21.0

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