rggen-default-register-map 0.27.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e1b5c8952df6d5cf956a991019f222ff1fa5789316a37b2f82b0c204fe7a30a
4
- data.tar.gz: a2740678c7e416b435f294652fafa074b7a4090656f9c52ba8487a9866a6362c
3
+ metadata.gz: 9fac466f73de34a7e0a0575920f09cf424d4712b8a17a6b787d580d7252dac6f
4
+ data.tar.gz: 0fd170d8deb150dfd7d6fe8cd15f357b9e5781f32649bd709c53d7a1b1d76d45
5
5
  SHA512:
6
- metadata.gz: 4b562f3dda473595d8b96ab350da36654e5c75a78cd56afb25dfc4b0a45666dbf77185aa85261938cda985d72b7878b346c7b5331c8e837155a2310ebba83c0d
7
- data.tar.gz: '09288fa36647791243feb903e3752350b66197111ac960223be51e7766af0be2848fbcd086a2035e600dce2af8ea399940e528d9ed743bd8b739a05dd2b19601'
6
+ metadata.gz: c3872a9705e22a74c0c0e2ed45a09ffdf3e8e2e96ed6ca84c179636de0227f09560b2f266fde6450f2121524ba10fa830efa311560bf94469b05c33431f28e74
7
+ data.tar.gz: 9afaa664572a6c282027e15f382bb81f3d7b0413506c9c0d02d31b71bfae37b051532b388948666e87da97d6f3a18b013d4bcf2846845d2bea584dc26a59c958
@@ -85,7 +85,7 @@ RgGen.define_simple_feature(:bit_field, :bit_assignment) do
85
85
  end
86
86
 
87
87
  def preprocess(value)
88
- if value.is_a?(Hash)
88
+ if hash?(value)
89
89
  value
90
90
  elsif match_pattern(value)
91
91
  split_match_data(match_data)
@@ -154,7 +154,7 @@ RgGen.define_simple_feature(:bit_field, :bit_assignment) do
154
154
  end
155
155
 
156
156
  def calc_bit_position(index, base)
157
- if index.is_a?(Integer)
157
+ if integer?(index)
158
158
  base + step * index
159
159
  else
160
160
  "#{base}+#{step}*#{index}"
@@ -5,17 +5,17 @@ RgGen.define_simple_feature(:bit_field, :initial_value) do
5
5
  property :initial_value
6
6
  property :initial_values
7
7
  property :initial_value?, forward_to: :initial_value_set?
8
- property :fixed_initial_value?, forward_to: :fixed?
9
- property :initial_value_array?, forward_to: :array?
8
+ property :fixed_initial_value?, forward_to: :fixed_format?
9
+ property :initial_value_array?, forward_to: :array_format?
10
10
 
11
11
  input_pattern [{ parameterized: /default:(#{integer})/,
12
12
  array: /#{integer}(?:[,\n]#{integer})+/ }]
13
13
 
14
14
  build do |value|
15
15
  @input_format =
16
- if value.is_a?(Hash) || match_index == :parameterized
16
+ if hash?(value) || match_index == :parameterized
17
17
  :parameterized
18
- elsif value.is_a?(Array) || match_index == :array
18
+ elsif array?(value) || match_index == :array
19
19
  :array
20
20
  else
21
21
  :single
@@ -34,7 +34,7 @@ RgGen.define_simple_feature(:bit_field, :initial_value) do
34
34
  end
35
35
 
36
36
  verify(:component) do
37
- error_condition { settings[:require] && !initial_value? }
37
+ error_condition { need_initial_value? && !initial_value? }
38
38
  message { 'no initial value is given' }
39
39
  end
40
40
 
@@ -112,11 +112,11 @@ RgGen.define_simple_feature(:bit_field, :initial_value) do
112
112
  end
113
113
  end
114
114
 
115
- def array?
115
+ def array_format?
116
116
  initial_value_format == :array
117
117
  end
118
118
 
119
- def fixed?
119
+ def fixed_format?
120
120
  [:array, :single].include?(@input_format)
121
121
  end
122
122
 
@@ -169,6 +169,13 @@ RgGen.define_simple_feature(:bit_field, :initial_value) do
169
169
  (bit_field.settings && bit_field.settings[:initial_value]) || {}
170
170
  end
171
171
 
172
+ def need_initial_value?
173
+ case settings[:require]
174
+ when Proc then instance_exec(&settings[:require])
175
+ else settings[:require]
176
+ end
177
+ end
178
+
172
179
  def min_initial_value
173
180
  bit_field.width == 1 ? 0 : -(2**(bit_field.width - 1))
174
181
  end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :custom) do
4
+ register_map do
5
+ property :sw_read, body: -> { option_value(:sw_read) }
6
+ property :sw_write, body: -> { option_value(:sw_write) }
7
+ property :sw_write_once?, body: -> { option_value(:sw_write_once) }
8
+ property :hw_write?, body: -> { option_value(:hw_write) }
9
+ property :hw_set?, body: -> { option_value(:hw_set) }
10
+ property :hw_clear?, body: -> { option_value(:hw_clear) }
11
+ property :sw_update?, forward_to: :update_by_sw?
12
+ property :hw_update?, forward_to: :update_by_hw?
13
+ property :read_trigger?, body: -> { option_value(:read_trigger) }
14
+ property :write_trigger?, body: -> { option_value(:write_trigger) }
15
+
16
+ readable? { bit_field.sw_read != :none }
17
+ writable? { bit_field.sw_write != :none }
18
+ volatile? { !bit_field.sw_update? && bit_field.readable? || bit_field.hw_update? }
19
+ initial_value require: -> { bit_field.sw_update? || bit_field.hw_update? }
20
+
21
+ input_pattern [
22
+ true => truthy_pattern, false => falsey_pattern,
23
+ sw_common: /(none|default|set|clear)/i,
24
+ sw_write: /(set_[01]|clear_[01]|toggle_[01])/i
25
+ ], match_automatically: false
26
+
27
+ build do |_, options|
28
+ @options = parse_options(options)
29
+ end
30
+
31
+ verify(:component) do
32
+ error_condition { sw_write_once? && !writable? }
33
+ message { 'cannot enable sw_write_once option for unwritable bit field' }
34
+ end
35
+
36
+ verify(:component) do
37
+ error_condition { hw_write? && reserved? }
38
+ message { 'cannot enable hw_write option for reserved bit field' }
39
+ end
40
+
41
+ verify(:component) do
42
+ error_condition { hw_set? && reserved? }
43
+ message { 'cannot enable hw_set option for reserved bit field' }
44
+ end
45
+
46
+ verify(:component) do
47
+ error_condition { hw_clear? && reserved? }
48
+ message { 'cannot enable hw_clear option for reserved bit field' }
49
+ end
50
+
51
+ verify(:component) do
52
+ error_condition { read_trigger? && !readable? }
53
+ message { 'cannot enable read_trigger option for unreadable bit field' }
54
+ end
55
+
56
+ verify(:component) do
57
+ error_condition { write_trigger? && !writable? }
58
+ message { 'cannot enable write_trigger option for unwritable bit field' }
59
+ end
60
+
61
+ printable(:type) do
62
+ options =
63
+ [:sw_read, :sw_write, :sw_write_once, :hw_write, :hw_set, :hw_clear]
64
+ .map { |o| "#{o}: #{option_value(o)}" }
65
+ [type, *options]
66
+ end
67
+
68
+ private
69
+
70
+ def option_value(name)
71
+ default_value =
72
+ if boolean_option?(name)
73
+ false
74
+ else
75
+ :default
76
+ end
77
+ @options.fetch(name, default_value)
78
+ end
79
+
80
+ def update_by_sw?
81
+ [:set, :clear].include?(sw_read) || sw_write != :none
82
+ end
83
+
84
+ def update_by_hw?
85
+ hw_write? || hw_set? || hw_clear?
86
+ end
87
+
88
+ def parse_options(options)
89
+ merge_options(options)
90
+ .each_with_object({}) do |(key, value), option_hash|
91
+ option_name = convert_to_option_name(key)
92
+ option_hash[option_name] = parse_option(option_name, key, value)
93
+ end
94
+ end
95
+
96
+ def merge_options(options)
97
+ options.each_with_object({}) do |option, merged_options|
98
+ option_hash = hash?(option) && option || [option].to_h
99
+ merged_options.update(option_hash)
100
+ end
101
+ rescue ArgumentError, TypeError
102
+ error "invalid options are given: #{options.inspect}"
103
+ end
104
+
105
+ def convert_to_option_name(key)
106
+ return key unless string?(key) || symbol?(key)
107
+ key.to_sym.downcase
108
+ end
109
+
110
+ def parse_option(option_name, key, value)
111
+ case option_name
112
+ when :sw_read
113
+ parse_value_option(:sw_read, [:sw_common], value)
114
+ when :sw_write
115
+ parse_value_option(:sw_write, [:sw_common, :sw_write], value)
116
+ when method(:boolean_option?)
117
+ parse_boolean_option(option_name, value)
118
+ else
119
+ error "unknown option is given: #{key.inspect}"
120
+ end
121
+ end
122
+
123
+ def parse_value_option(option_name, allowed_patterns, value)
124
+ match_data, match_index = match_pattern(value)
125
+
126
+ if match_data && allowed_patterns.include?(match_index)
127
+ match_data.captures.first.downcase.to_sym
128
+ else
129
+ error "invalid value for #{option_name} option: #{value.inspect}"
130
+ end
131
+ end
132
+
133
+ def boolean_option?(option_name)
134
+ [
135
+ :sw_write_once, :hw_write, :hw_set, :hw_clear,
136
+ :read_trigger, :write_trigger
137
+ ].include?(option_name)
138
+ end
139
+
140
+ def parse_boolean_option(option_name, value)
141
+ boolean_value = convert_to_boolean_value(value)
142
+
143
+ if [true, false].include?(boolean_value)
144
+ boolean_value
145
+ else
146
+ error "invalid value for #{option_name} option: #{value.inspect}"
147
+ end
148
+ end
149
+
150
+ def convert_to_boolean_value(value)
151
+ _, boolean_value =
152
+ case value
153
+ when true then [nil, true]
154
+ when false then [nil, false]
155
+ else match_pattern(value)
156
+ end
157
+ boolean_value
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rol) do
4
+ register_map do
5
+ read_only
6
+ initial_value require: true
7
+ reference use: true, width: 1
8
+ end
9
+ end
@@ -5,43 +5,35 @@ RgGen.define_list_feature(:bit_field, :type) do
5
5
  base_feature do
6
6
  define_helpers do
7
7
  def read_write
8
- @readable = true
9
- @writable = true
8
+ accessibility[:read] = -> { true }
9
+ accessibility[:write] = -> { true }
10
10
  end
11
11
 
12
12
  def read_only
13
- @readable = true
14
- @writable = false
13
+ accessibility[:read] = -> { true }
14
+ accessibility[:write] = -> { false }
15
15
  end
16
16
 
17
17
  def write_only
18
- @readable = false
19
- @writable = true
18
+ accessibility[:read] = -> { false }
19
+ accessibility[:write] = -> { true }
20
20
  end
21
21
 
22
22
  def reserved
23
- @readable = false
24
- @writable = false
23
+ accessibility[:read] = -> { false }
24
+ accessibility[:write] = -> { false }
25
25
  end
26
26
 
27
- def readable?
28
- @readable.nil? || @readable
27
+ def readable?(&block)
28
+ accessibility[:read] = block
29
29
  end
30
30
 
31
- def writable?
32
- @writable.nil? || @writable
31
+ def writable?(&block)
32
+ accessibility[:write] = block
33
33
  end
34
34
 
35
- def read_only?
36
- readable? && !writable?
37
- end
38
-
39
- def write_only?
40
- writable? && !readable?
41
- end
42
-
43
- def reserved?
44
- !(readable? || writable?)
35
+ def accessibility
36
+ @accessibility ||= {}
45
37
  end
46
38
 
47
39
  def volatile
@@ -73,26 +65,33 @@ RgGen.define_list_feature(:bit_field, :type) do
73
65
 
74
66
  property :type
75
67
  property :settings, forward_to_helper: true
76
- property :readable?, forward_to_helper: true
77
- property :writable?, forward_to_helper: true
78
- property :read_only?, forward_to_helper: true
79
- property :write_only?, forward_to_helper: true
80
- property :reserved?, forward_to_helper: true
81
- property :volatile?, initial: -> { volatility }
82
-
83
- build { |value| @type = value }
68
+ property :readable?, body: -> { accessibility(:read) }
69
+ property :writable?, body: -> { accessibility(:write) }
70
+ property :read_only?, body: -> { readable? && !writable? }
71
+ property :write_only?, body: -> { !readable? && writable? }
72
+ property :reserved?, body: -> { !readable? && !writable? }
73
+ property :volatile?, body: -> { volatility }
84
74
 
85
75
  build do |value|
86
76
  @type = value
87
- helper.reserved? && bit_field.document_only
77
+ end
78
+
79
+ post_build do
80
+ reserved? && bit_field.document_only
88
81
  end
89
82
 
90
83
  printable :type
91
84
 
92
85
  private
93
86
 
87
+ def accessibility(access)
88
+ body = helper.accessibility[access]
89
+ body.nil? || instance_exec(&body)
90
+ end
91
+
94
92
  def volatility
95
- helper.volatility.nil? || instance_exec(&helper.volatility)
93
+ body = helper.volatility
94
+ body.nil? || instance_exec(&body)
96
95
  end
97
96
  end
98
97
 
@@ -109,13 +108,15 @@ RgGen.define_list_feature(:bit_field, :type) do
109
108
  end
110
109
 
111
110
  factory do
111
+ allow_options
112
+
112
113
  convert_value do |value|
113
114
  types = target_features.keys
114
115
  types.find(&value.to_sym.method(:casecmp?)) || value
115
116
  end
116
117
 
117
118
  def target_feature_key(cell)
118
- cell.value
119
+ cell
119
120
  end
120
121
  end
121
122
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
 
8
8
  build do |value|
9
9
  @comment =
10
- (value.is_a?(Array) && value.join("\n") || value.to_s).chomp
10
+ (array?(value) && value.join("\n") || value.to_s).chomp
11
11
  end
12
12
 
13
13
  printable :comment do
@@ -4,17 +4,17 @@ RgGen.define_simple_feature(:global, :enable_wide_register) do
4
4
  configuration do
5
5
  property :enable_wide_register?, default: false
6
6
 
7
- input_pattern [/true|on|yes/i, /false|off|no/i],
7
+ input_pattern [true => truthy_pattern, false => falsey_pattern],
8
8
  match_automatically: false
9
9
 
10
10
  ignore_empty_value false
11
11
 
12
12
  build do |value|
13
13
  @enable_wide_register =
14
- if [true, false].include?(value)
15
- value
14
+ if [true, false].any? { |boolean| value == boolean }
15
+ value.value
16
16
  elsif match_pattern(value)
17
- [true, false][match_index]
17
+ match_index
18
18
  else
19
19
  error "cannot convert #{value.inspect} into boolean"
20
20
  end
@@ -21,7 +21,7 @@ RgGen.define_simple_feature(:register, :offset_address) do
21
21
  verify(:feature) do
22
22
  error_condition { (offset_address % byte_width).nonzero? }
23
23
  message do
24
- "offset address is not aligned with bus width(#{bus_width}): "\
24
+ "offset address is not aligned with bus width(#{bus_width}): " \
25
25
  "0x#{offset_address.to_s(16)}"
26
26
  end
27
27
  end
@@ -39,7 +39,7 @@ RgGen.define_simple_feature(:register, :size) do
39
39
 
40
40
  def parse_values(values)
41
41
  Array(
42
- values.is_a?(String) && parse_string_values(values) || values
42
+ string?(values) && parse_string_values(values) || values
43
43
  ).map(&method(:convert_value))
44
44
  end
45
45
 
@@ -43,13 +43,11 @@ RgGen.define_list_item_feature(:register, :type, :indirect) do
43
43
  support_shared_address
44
44
  support_array_register
45
45
 
46
- input_pattern [
47
- /(#{variable_name}(?:\.#{variable_name})*)/,
48
- /(#{variable_name}(?:\.#{variable_name})*):(#{integer})/
49
- ], match_automatically: false
46
+ input_pattern /(#{variable_name}(?:\.#{variable_name})*)/,
47
+ match_automatically: false
50
48
 
51
- build do
52
- @index_entries = parse_index_entries
49
+ build do |_type, options|
50
+ @index_entries = parse_index_entries(options)
53
51
  end
54
52
 
55
53
  verify(:component) do
@@ -173,35 +171,36 @@ RgGen.define_list_item_feature(:register, :type, :indirect) do
173
171
 
174
172
  private
175
173
 
176
- def parse_index_entries
177
- (!options.empty? && options.map(&method(:create_index_entry))) ||
178
- (error 'no indirect indices are given')
174
+ def parse_index_entries(options)
175
+ error 'no indirect indices are given' if options.empty?
176
+ options.map { |option| create_index_entry(option) }
179
177
  end
180
178
 
181
- def create_index_entry(value)
182
- input_values = split_value(value)
183
- case input_values.size
184
- when 2
185
- index_entry.new(input_values[0], convert_index_value(input_values[1]))
186
- when 1
187
- index_entry.new(input_values[0])
188
- else
189
- error "too many arguments for indirect index are given: #{value.inspect}"
190
- end
179
+ def create_index_entry(option)
180
+ entry = array?(option) && option || [option]
181
+
182
+ field_name, index_value =
183
+ case entry.size
184
+ when 2 then [check_field_name(entry[0]), convert_index_value(entry[1])]
185
+ when 1 then [check_field_name(entry[0])]
186
+ when 0 then error 'no indirect index is given'
187
+ else error "too many arguments for indirect index are given: #{entry.inspect}"
188
+ end
189
+
190
+ index_entry.new(field_name, index_value)
191
191
  end
192
192
 
193
- def split_value(value)
194
- input_value = Array(value)
195
- field_name = input_value.first
196
- if sting_or_symbol?(field_name) && match_pattern(field_name)
197
- [*match_data.captures, *input_value[1..]]
198
- else
199
- error "illegal input value for indirect index: #{value.inspect}"
200
- end
193
+ def check_field_name(field_name)
194
+ return field_name if match_field_name?(field_name)
195
+ error "illegal input value for indirect index: #{field_name.inspect}"
196
+ end
197
+
198
+ def match_field_name?(field_name)
199
+ (string?(field_name) || symbol?(field_name)) && match_pattern(field_name)
201
200
  end
202
201
 
203
202
  def sting_or_symbol?(value)
204
- [String, Symbol].any?(&value.method(:is_a?))
203
+ string?(value) || symbol?(value)
205
204
  end
206
205
 
207
206
  def convert_index_value(value)
@@ -43,9 +43,8 @@ RgGen.define_list_feature(:register, :type) do
43
43
  property :reserved?, initial: -> { !(writable? || readable?) }
44
44
  property :settings, forward_to_helper: true
45
45
 
46
- build do |value|
47
- @type = value[:type]
48
- @options = value[:options]
46
+ build do |type, _option|
47
+ @type = type
49
48
  helper.need_bit_fields? || register.need_no_children
50
49
  end
51
50
 
@@ -64,8 +63,6 @@ RgGen.define_list_feature(:register, :type) do
64
63
 
65
64
  private
66
65
 
67
- attr_reader :options
68
-
69
66
  def writability
70
67
  block = helper.writability || -> { register.bit_fields.any?(&:writable?) }
71
68
  instance_exec(&block)
@@ -87,38 +84,21 @@ RgGen.define_list_feature(:register, :type) do
87
84
  end
88
85
 
89
86
  factory do
87
+ allow_options
88
+
90
89
  convert_value do |value|
91
- type, options = split_input_value(value)
92
- { type: find_type(type), options: Array(options) }
90
+ find_type(value)
93
91
  end
94
92
 
95
- def target_feature_key(cell)
96
- (!cell.empty_value? && cell.value[:type]) || nil
93
+ def target_feature_key(value)
94
+ (!value.empty_value? && value) || nil
97
95
  end
98
96
 
99
97
  private
100
98
 
101
- def split_input_value(value)
102
- if value.is_a?(String)
103
- split_string_value(value)
104
- else
105
- input_value = Array(value)
106
- [input_value[0], input_value[1..]]
107
- end
108
- end
109
-
110
- def split_string_value(value)
111
- type, options = split_string(value, ':', 2)
112
- [type, split_string(options, /[,\n]/, 0)]
113
- end
114
-
115
- def split_string(value, separator, limit)
116
- value&.split(separator, limit)&.map(&:strip)
117
- end
118
-
119
- def find_type(type)
99
+ def find_type(value)
120
100
  types = target_features.keys
121
- types.find(&type.to_sym.method(:casecmp?)) || type
101
+ types.find(&value.to_sym.method(:casecmp?)) || value
122
102
  end
123
103
  end
124
104
  end
@@ -15,7 +15,7 @@ RgGen.define_simple_feature(:register_file, :size) do
15
15
 
16
16
  build do |values|
17
17
  @size =
18
- (values.is_a?(String) && parse_string_value(values) || Array(values))
18
+ (string?(values) && parse_string_value(values) || Array(values))
19
19
  .map(&method(:convert_value))
20
20
  end
21
21
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module DefaultRegisterMap
5
- VERSION = '0.27.0'
5
+ VERSION = '0.28.0'
6
6
  end
7
7
  end
@@ -27,10 +27,12 @@ RgGen.setup_plugin :'rggen-default-register-map' do |plugin|
27
27
  'default_register_map/bit_field/name',
28
28
  'default_register_map/bit_field/bit_assignment',
29
29
  'default_register_map/bit_field/type',
30
+ 'default_register_map/bit_field/type/custom',
30
31
  'default_register_map/bit_field/type/rc',
31
32
  'default_register_map/bit_field/type/reserved',
32
33
  'default_register_map/bit_field/type/ro_rotrg',
33
34
  'default_register_map/bit_field/type/rof',
35
+ 'default_register_map/bit_field/type/rol',
34
36
  'default_register_map/bit_field/type/row0trg_row1trg',
35
37
  'default_register_map/bit_field/type/rowo_rowotrg',
36
38
  'default_register_map/bit_field/type/rs',
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.27.0
4
+ version: 0.28.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: 2022-07-05 00:00:00.000000000 Z
11
+ date: 2022-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -41,10 +41,12 @@ files:
41
41
  - lib/rggen/default_register_map/bit_field/name.rb
42
42
  - lib/rggen/default_register_map/bit_field/reference.rb
43
43
  - lib/rggen/default_register_map/bit_field/type.rb
44
+ - lib/rggen/default_register_map/bit_field/type/custom.rb
44
45
  - lib/rggen/default_register_map/bit_field/type/rc.rb
45
46
  - lib/rggen/default_register_map/bit_field/type/reserved.rb
46
47
  - lib/rggen/default_register_map/bit_field/type/ro_rotrg.rb
47
48
  - lib/rggen/default_register_map/bit_field/type/rof.rb
49
+ - lib/rggen/default_register_map/bit_field/type/rol.rb
48
50
  - lib/rggen/default_register_map/bit_field/type/row0trg_row1trg.rb
49
51
  - lib/rggen/default_register_map/bit_field/type/rowo_rowotrg.rb
50
52
  - lib/rggen/default_register_map/bit_field/type/rs.rb
@@ -104,8 +106,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  - !ruby/object:Gem::Version
105
107
  version: '0'
106
108
  requirements: []
107
- rubygems_version: 3.3.3
109
+ rubygems_version: 3.3.7
108
110
  signing_key:
109
111
  specification_version: 4
110
- summary: rggen-default-register-map-0.27.0
112
+ summary: rggen-default-register-map-0.28.0
111
113
  test_files: []