rggen-default-register-map 0.28.0 → 0.29.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: 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: []