rggen-default-register-map 0.28.0 → 0.29.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9fac466f73de34a7e0a0575920f09cf424d4712b8a17a6b787d580d7252dac6f
4
- data.tar.gz: 0fd170d8deb150dfd7d6fe8cd15f357b9e5781f32649bd709c53d7a1b1d76d45
3
+ metadata.gz: a715cb1298469ed180728f9252c8a82bc879a156b427f08b7f5f0ead4881a79d
4
+ data.tar.gz: eebb8fdf95cc6727a48145089812049540b3bd900c78a91e9dd55d8844a9e9a1
5
5
  SHA512:
6
- metadata.gz: c3872a9705e22a74c0c0e2ed45a09ffdf3e8e2e96ed6ca84c179636de0227f09560b2f266fde6450f2121524ba10fa830efa311560bf94469b05c33431f28e74
7
- data.tar.gz: 9afaa664572a6c282027e15f382bb81f3d7b0413506c9c0d02d31b71bfae37b051532b388948666e87da97d6f3a18b013d4bcf2846845d2bea584dc26a59c958
6
+ metadata.gz: b4b816a40f826f0545c84040ed25d33b808de5dacbba83ccd75fe813183b8789767c7ea450f846ac780256850e7c20ef4780a23d5d37b28489e3e0003a544452
7
+ data.tar.gz: b9a9949aea2259f9cb66f4d9bb123a92ff9e6dc9513ea8b9074e72f3121ddb6f260128cc9612fda20595694f6cc12fc77c0ccfa513f8e439f22b2e8099ddd3ed
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2022 Taichi Ishitani
3
+ Copyright (c) 2019-2023 Taichi Ishitani
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -39,7 +39,7 @@ Feedbacks, bug reports, questions and etc. are wellcome! You can post them by us
39
39
 
40
40
  ## Copyright & License
41
41
 
42
- Copyright © 2019-2022 Taichi Ishitani. RgGen::DefaultRegisterMap is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
42
+ Copyright © 2019-2023 Taichi Ishitani. RgGen::DefaultRegisterMap is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
43
43
 
44
44
  ## Code of Conduct
45
45
 
@@ -23,7 +23,7 @@ RgGen.define_simple_feature(:bit_field, :bit_assignment) do
23
23
  property :sequential?, body: -> { !@sequence_size.nil? }
24
24
  property :bit_map, initial: -> { calc_bit_map }
25
25
 
26
- input_pattern /#{integer}(?::#{integer}){0,3}/,
26
+ input_pattern /#{integer}(?::#{integer})*/,
27
27
  match_automatically: false
28
28
 
29
29
  build do |value|
@@ -87,13 +87,21 @@ RgGen.define_simple_feature(:bit_field, :bit_assignment) do
87
87
  def preprocess(value)
88
88
  if hash?(value)
89
89
  value
90
- elsif match_pattern(value)
90
+ elsif match_bit_assignment?(value)
91
91
  split_match_data(match_data)
92
92
  else
93
93
  error "illegal input value for bit assignment: #{value.inspect}"
94
94
  end
95
95
  end
96
96
 
97
+ # workaround for ruby 3.2 bug
98
+ # see:
99
+ # * https://bugs.ruby-lang.org/issues/19273
100
+ # * https://github.com/rggen/rggen/issues/129#issuecomment-1366666885
101
+ def match_bit_assignment?(value)
102
+ match_pattern(value) && value.count(':') <= 3
103
+ end
104
+
97
105
  def split_match_data(match_data)
98
106
  match_data
99
107
  .to_s
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_feature(:bit_field, :labels) do
4
+ register_map do
5
+ feature do
6
+ property :labels, initial: -> { [] }
7
+
8
+ input_pattern variable_name, match_automatically: false
9
+
10
+ define_struct :label_entry, [:name, :value, :comment] do
11
+ def to_s
12
+ to_h
13
+ .compact
14
+ .map { |k, v| "#{k}: #{v}" }
15
+ .join(' ')
16
+ end
17
+ end
18
+
19
+ build do |values|
20
+ values.each { |label| labels << parse_label(label) }
21
+ end
22
+
23
+ define_helpers do
24
+ def verify_label_value(&body)
25
+ label_value_verifiers << create_verifier(&body)
26
+ end
27
+
28
+ def label_value_verifiers
29
+ @label_value_verifiers ||= []
30
+ end
31
+ end
32
+
33
+ verify(:component) do
34
+ check_error do
35
+ labels.each do |label|
36
+ helper.label_value_verifiers.each do |verifier|
37
+ verifier.verify(self, label.value)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ verify_label_value do
44
+ error_condition { |value| value < min_label_value }
45
+ message do |value|
46
+ 'input label value is less than minimum label value: ' \
47
+ "label value #{value} minimum label value #{min_label_value}"
48
+ end
49
+ end
50
+
51
+ verify_label_value do
52
+ error_condition { |value| value > max_label_value }
53
+ message do |value|
54
+ 'input label value is greater than maximum label value: ' \
55
+ "label value #{value} maximum label value #{max_label_value}"
56
+ end
57
+ end
58
+
59
+ printable :labels
60
+
61
+ private
62
+
63
+ def parse_label(label)
64
+ label_values = [
65
+ parse_name(label), parse_value(label), fetch_label(label, :comment)
66
+ ]
67
+ label_entry.new(*label_values)
68
+ end
69
+
70
+ def parse_name(label)
71
+ label_value = fetch_label(label, :name) { error 'no label name is given' }
72
+ name = match_name(label_value)
73
+ unique_name?(name) && name ||
74
+ (error "duplicated label name: #{name}", label_value)
75
+ end
76
+
77
+ def match_name(name)
78
+ match_data, = match_pattern(name)
79
+ match_data&.to_s ||
80
+ (error "illegal input value for label name: #{name.inspect}", name)
81
+ end
82
+
83
+ def unique_name?(name)
84
+ labels.none? { |label| label.name == name }
85
+ end
86
+
87
+ def parse_value(label)
88
+ label_value = fetch_label(label, :value) { error 'no label value is given' }
89
+ value = convert_label_value(label_value)
90
+ unique_value?(value) && value ||
91
+ (error "duplicated label value: #{value}", label_value)
92
+ end
93
+
94
+ def convert_label_value(value)
95
+ Integer(value)
96
+ rescue ArgumentError, TypeError
97
+ error "cannot convert #{value.inspect} into label value", value
98
+ end
99
+
100
+ def unique_value?(value)
101
+ labels.none? { |label| label.value == value }
102
+ end
103
+
104
+ def fetch_label(label, key, &ifnone)
105
+ match_key =
106
+ [key.to_sym, key.to_s]
107
+ .find { |k| label.key?(k) }
108
+ (match_key || ifnone&.call) && label[match_key]
109
+ end
110
+
111
+ def min_label_value
112
+ bit_field.width == 1 ? 0 : -(2**(bit_field.width - 1))
113
+ end
114
+
115
+ def max_label_value
116
+ 2**bit_field.width - 1
117
+ end
118
+ end
119
+
120
+ factory do
121
+ value_format :hash_list
122
+ end
123
+ end
124
+ end
@@ -108,7 +108,7 @@ RgGen.define_list_feature(:bit_field, :type) do
108
108
  end
109
109
 
110
110
  factory do
111
- allow_options
111
+ value_format :value_with_options
112
112
 
113
113
  convert_value do |value|
114
114
  types = target_features.keys
@@ -75,9 +75,8 @@ RgGen.define_simple_feature(:register, :offset_address) do
75
75
  end
76
76
 
77
77
  def expand_local_addresses
78
- Array.new(shared_address? && 1 || register.count) do |i|
79
- offset_address + register.byte_width * i
80
- end
78
+ width = shared_address? && 0 || register.byte_width
79
+ Array.new(register.count) { |i| offset_address + width * i }
81
80
  end
82
81
 
83
82
  def previous_component
@@ -77,24 +77,46 @@ RgGen.define_simple_feature(:register, :size) do
77
77
  .max
78
78
  end
79
79
 
80
- def calc_byte_size(whole_size = true)
81
- if !whole_size || register.settings[:support_shared_address]
82
- byte_width
83
- else
84
- Array(@size).reduce(1, :*) * byte_width
85
- end
80
+ def calc_byte_size(whole_size = true, hierarchical: false)
81
+ return byte_width unless whole_size
82
+
83
+ include_register = !register.settings[:support_shared_address]
84
+ collect_size(hierarchical, include_register, false).reduce(1, :*) * byte_width
86
85
  end
87
86
 
88
- def array_register?
87
+ def array_register?(hierarchical: false)
88
+ return true if hierarchical && register_files.any?(&:array?)
89
89
  register.settings[:support_array] && !@size.nil? || false
90
90
  end
91
91
 
92
- def array_registers
93
- array_register? && @size || nil
92
+ def array_registers(hierarchical: false)
93
+ size = collect_size(hierarchical, true, true)
94
+ !size.empty? && size || nil
94
95
  end
95
96
 
96
97
  def calc_count(whole_count = true)
97
- whole_count ? (@count ||= Array(array_registers).reduce(1, :*)) : 1
98
+ if whole_count
99
+ @count ||= collect_size(false, true, true).reduce(1, :*)
100
+ else
101
+ 1
102
+ end
103
+ end
104
+
105
+ def collect_size(inculde_register_file, include_register, array_only)
106
+ size = []
107
+ collect_register_file_size(size, inculde_register_file)
108
+ collect_register_size(size, include_register, array_only)
109
+ size.compact
110
+ end
111
+
112
+ def collect_register_file_size(size, inculde_register_file)
113
+ inculde_register_file &&
114
+ size.concat(register_files.flat_map(&:array_size))
115
+ end
116
+
117
+ def collect_register_size(size, include_register, array_only)
118
+ @size && include_register && (!array_only || array_register?) &&
119
+ size.concat(@size)
98
120
  end
99
121
  end
100
122
  end
@@ -84,7 +84,7 @@ RgGen.define_list_feature(:register, :type) do
84
84
  end
85
85
 
86
86
  factory do
87
- allow_options
87
+ value_format :value_with_options
88
88
 
89
89
  convert_value do |value|
90
90
  find_type(value)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module DefaultRegisterMap
5
- VERSION = '0.28.0'
5
+ VERSION = '0.29.0'
6
6
  end
7
7
  end
@@ -50,6 +50,7 @@ RgGen.setup_plugin :'rggen-default-register-map' do |plugin|
50
50
  'default_register_map/bit_field/type/wos',
51
51
  'default_register_map/bit_field/initial_value',
52
52
  'default_register_map/bit_field/reference',
53
+ 'default_register_map/bit_field/labels',
53
54
  'default_register_map/bit_field/comment'
54
55
  ]
55
56
  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.28.0
4
+ version: 0.29.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-10-10 00:00:00.000000000 Z
11
+ date: 2023-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,7 @@ files:
38
38
  - lib/rggen/default_register_map/bit_field/bit_assignment.rb
39
39
  - lib/rggen/default_register_map/bit_field/comment.rb
40
40
  - lib/rggen/default_register_map/bit_field/initial_value.rb
41
+ - lib/rggen/default_register_map/bit_field/labels.rb
41
42
  - lib/rggen/default_register_map/bit_field/name.rb
42
43
  - lib/rggen/default_register_map/bit_field/reference.rb
43
44
  - lib/rggen/default_register_map/bit_field/type.rb
@@ -99,15 +100,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
100
  requirements:
100
101
  - - ">="
101
102
  - !ruby/object:Gem::Version
102
- version: '2.6'
103
+ version: '2.7'
103
104
  required_rubygems_version: !ruby/object:Gem::Requirement
104
105
  requirements:
105
106
  - - ">="
106
107
  - !ruby/object:Gem::Version
107
108
  version: '0'
108
109
  requirements: []
109
- rubygems_version: 3.3.7
110
+ rubygems_version: 3.4.1
110
111
  signing_key:
111
112
  specification_version: 4
112
- summary: rggen-default-register-map-0.28.0
113
+ summary: rggen-default-register-map-0.29.0
113
114
  test_files: []