rggen-default-register-map 0.13.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 +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/LICENSE +21 -0
- data/README.md +45 -0
- data/lib/rggen/default_register_map.rb +46 -0
- data/lib/rggen/default_register_map/bit_field/bit_assignment.rb +122 -0
- data/lib/rggen/default_register_map/bit_field/comment.rb +18 -0
- data/lib/rggen/default_register_map/bit_field/initial_value.rb +75 -0
- data/lib/rggen/default_register_map/bit_field/name.rb +37 -0
- data/lib/rggen/default_register_map/bit_field/reference.rb +142 -0
- data/lib/rggen/default_register_map/bit_field/type.rb +117 -0
- data/lib/rggen/default_register_map/bit_field/type/rc.rb +9 -0
- data/lib/rggen/default_register_map/bit_field/type/reserved.rb +8 -0
- data/lib/rggen/default_register_map/bit_field/type/ro.rb +8 -0
- data/lib/rggen/default_register_map/bit_field/type/rof.rb +9 -0
- data/lib/rggen/default_register_map/bit_field/type/rs.rb +8 -0
- data/lib/rggen/default_register_map/bit_field/type/rw.rb +9 -0
- data/lib/rggen/default_register_map/bit_field/type/rwc.rb +9 -0
- data/lib/rggen/default_register_map/bit_field/type/rwe_rwl.rb +10 -0
- data/lib/rggen/default_register_map/bit_field/type/w0c_w1c.rb +9 -0
- data/lib/rggen/default_register_map/bit_field/type/w0s_w1s.rb +8 -0
- data/lib/rggen/default_register_map/bit_field/type/w0trg_w1trg.rb +8 -0
- data/lib/rggen/default_register_map/bit_field/type/wo.rb +9 -0
- data/lib/rggen/default_register_map/global/address_width.rb +34 -0
- data/lib/rggen/default_register_map/global/bus_width.rb +35 -0
- data/lib/rggen/default_register_map/register/name.rb +36 -0
- data/lib/rggen/default_register_map/register/offset_address.rb +106 -0
- data/lib/rggen/default_register_map/register/size.rb +95 -0
- data/lib/rggen/default_register_map/register/type.rb +135 -0
- data/lib/rggen/default_register_map/register/type/external.rb +16 -0
- data/lib/rggen/default_register_map/register/type/indirect.rb +256 -0
- data/lib/rggen/default_register_map/register_block/byte_size.rb +61 -0
- data/lib/rggen/default_register_map/register_block/name.rb +38 -0
- data/lib/rggen/default_register_map/setup.rb +18 -0
- data/lib/rggen/default_register_map/version.rb +7 -0
- metadata +95 -0
@@ -0,0 +1,142 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:bit_field, :reference) do
|
4
|
+
register_map do
|
5
|
+
property :reference, initial: -> { reference_bit_field }, verify: :all
|
6
|
+
property :reference?, body: -> { use_reference? && !no_reference? }
|
7
|
+
property :reference_width, forward_to: :required_width
|
8
|
+
property :find_reference, forward_to: :find_reference_bit_field
|
9
|
+
|
10
|
+
input_pattern [
|
11
|
+
/(#{variable_name})\.(#{variable_name})/,
|
12
|
+
/(#{variable_name})/
|
13
|
+
]
|
14
|
+
|
15
|
+
build do |value|
|
16
|
+
@input_reference =
|
17
|
+
if pattern_matched?
|
18
|
+
match_data[1..2].compact.join('.')
|
19
|
+
else
|
20
|
+
error "illegal input value for reference: #{value.inspect}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
verify(:component) do
|
25
|
+
error_condition { require_reference? && no_reference? }
|
26
|
+
message { 'no reference bit field is given' }
|
27
|
+
end
|
28
|
+
|
29
|
+
verify(:component) do
|
30
|
+
error_condition { reference? && @input_reference == bit_field.full_name }
|
31
|
+
message { "self reference: #{@input_reference}" }
|
32
|
+
end
|
33
|
+
|
34
|
+
verify(:all) do
|
35
|
+
error_condition { reference? && !reference_bit_field }
|
36
|
+
message { "no such bit field found: #{@input_reference}" }
|
37
|
+
end
|
38
|
+
|
39
|
+
verify(:all) do
|
40
|
+
error_condition do
|
41
|
+
reference? && !register.array? && reference_bit_field.register.array?
|
42
|
+
end
|
43
|
+
message do
|
44
|
+
'bit field of array register is not allowed for ' \
|
45
|
+
"reference bit field: #{@input_reference}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
verify(:all) do
|
50
|
+
error_condition { reference? && !match_array_size? }
|
51
|
+
message do
|
52
|
+
'array size is not matched: ' \
|
53
|
+
"own #{register.array_size} " \
|
54
|
+
"reference #{reference_bit_field.register.array_size}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
verify(:all) do
|
59
|
+
error_condition do
|
60
|
+
reference? && !bit_field.sequential? && reference_bit_field.sequential?
|
61
|
+
end
|
62
|
+
message do
|
63
|
+
'sequential bit field is not allowed for ' \
|
64
|
+
"reference bit field: #{@input_reference}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
verify(:all) do
|
69
|
+
error_condition { reference? && !match_sequence_size? }
|
70
|
+
message do
|
71
|
+
'sequence size is not matched: ' \
|
72
|
+
"own #{bit_field.sequence_size} " \
|
73
|
+
"reference #{reference_bit_field.sequence_size}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
verify(:all) do
|
78
|
+
error_condition { reference? && reference_bit_field.reserved? }
|
79
|
+
message { "refer to reserved bit field: #{@input_reference}" }
|
80
|
+
end
|
81
|
+
|
82
|
+
verify(:all) do
|
83
|
+
error_condition { reference? && !match_width? }
|
84
|
+
message do
|
85
|
+
"#{required_width} bits reference bit field is required: " \
|
86
|
+
"#{reference_bit_field.width} bit(s) width"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def settings
|
93
|
+
@settings ||=
|
94
|
+
(bit_field.settings && bit_field.settings[:reference]) || {}
|
95
|
+
end
|
96
|
+
|
97
|
+
def use_reference?
|
98
|
+
settings.fetch(:use, false)
|
99
|
+
end
|
100
|
+
|
101
|
+
def require_reference?
|
102
|
+
use_reference? && settings[:require]
|
103
|
+
end
|
104
|
+
|
105
|
+
def no_reference?
|
106
|
+
@input_reference.nil?
|
107
|
+
end
|
108
|
+
|
109
|
+
def reference_bit_field
|
110
|
+
(reference? || nil) &&
|
111
|
+
(@reference_bit_field ||= lookup_reference)
|
112
|
+
end
|
113
|
+
|
114
|
+
def find_reference_bit_field(bit_fields)
|
115
|
+
(reference? || nil) &&
|
116
|
+
bit_fields
|
117
|
+
.find { |bit_field| bit_field.full_name == @input_reference }
|
118
|
+
end
|
119
|
+
|
120
|
+
def lookup_reference
|
121
|
+
find_reference_bit_field(register_block.bit_fields)
|
122
|
+
end
|
123
|
+
|
124
|
+
def match_array_size?
|
125
|
+
!(register.array? && reference_bit_field.register.array?) ||
|
126
|
+
register.array_size == reference_bit_field.register.array_size
|
127
|
+
end
|
128
|
+
|
129
|
+
def match_sequence_size?
|
130
|
+
!(bit_field.sequential? && reference_bit_field.sequential?) ||
|
131
|
+
bit_field.sequence_size == reference_bit_field.sequence_size
|
132
|
+
end
|
133
|
+
|
134
|
+
def required_width
|
135
|
+
settings[:width] || bit_field.width
|
136
|
+
end
|
137
|
+
|
138
|
+
def match_width?
|
139
|
+
reference_bit_field.width >= required_width
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:bit_field, :type) do
|
4
|
+
register_map do
|
5
|
+
base_feature do
|
6
|
+
define_helpers do
|
7
|
+
def read_write
|
8
|
+
@readable = true
|
9
|
+
@writable = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def read_only
|
13
|
+
@readable = true
|
14
|
+
@writable = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def write_only
|
18
|
+
@readable = false
|
19
|
+
@writable = true
|
20
|
+
end
|
21
|
+
|
22
|
+
def reserved
|
23
|
+
@readable = false
|
24
|
+
@writable = false
|
25
|
+
end
|
26
|
+
|
27
|
+
def readable?
|
28
|
+
@readable.nil? || @readable
|
29
|
+
end
|
30
|
+
|
31
|
+
def writable?
|
32
|
+
@writable.nil? || @writable
|
33
|
+
end
|
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?)
|
45
|
+
end
|
46
|
+
|
47
|
+
def volatile
|
48
|
+
@volatility = -> { true }
|
49
|
+
end
|
50
|
+
|
51
|
+
def non_volatile
|
52
|
+
@volatility = -> { false }
|
53
|
+
end
|
54
|
+
|
55
|
+
def volatile?(&block)
|
56
|
+
@volatility = block
|
57
|
+
end
|
58
|
+
|
59
|
+
attr_reader :volatility
|
60
|
+
|
61
|
+
def settings
|
62
|
+
@settings ||= {}
|
63
|
+
end
|
64
|
+
|
65
|
+
def initial_value(**setting)
|
66
|
+
settings[:initial_value] = setting
|
67
|
+
end
|
68
|
+
|
69
|
+
def reference(**setting)
|
70
|
+
settings[:reference] = setting
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
property :type
|
75
|
+
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 }
|
84
|
+
|
85
|
+
printable :type
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def volatility
|
90
|
+
helper.volatility.nil? || instance_exec(&helper.volatility)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
default_feature do
|
95
|
+
verify(:feature) do
|
96
|
+
error_condition { !type }
|
97
|
+
message { 'no bit field type is given' }
|
98
|
+
end
|
99
|
+
|
100
|
+
verify(:feature) do
|
101
|
+
error_condition { type }
|
102
|
+
message { "unknown bit field type: #{type.inspect}" }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
factory do
|
107
|
+
convert_value do |value|
|
108
|
+
types = target_features.keys
|
109
|
+
types.find(&value.to_sym.method(:casecmp?)) || value
|
110
|
+
end
|
111
|
+
|
112
|
+
def select_feature(cell)
|
113
|
+
target_features[cell.value]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:global, :address_width) do
|
4
|
+
configuration do
|
5
|
+
property :address_width, default: 32
|
6
|
+
|
7
|
+
build do |value|
|
8
|
+
@address_width =
|
9
|
+
begin
|
10
|
+
Integer(value)
|
11
|
+
rescue ArgumentError, TypeError
|
12
|
+
error "cannot convert #{value.inspect} into address width"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
verify(:component) do
|
17
|
+
error_condition { address_width < min_address_width }
|
18
|
+
message do
|
19
|
+
'input address width is less than minimum address width: ' \
|
20
|
+
"address width #{address_width} " \
|
21
|
+
"minimum address width #{min_address_width}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
printable :address_width
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def min_address_width
|
30
|
+
byte_width = configuration.byte_width
|
31
|
+
byte_width == 1 ? 1 : (byte_width - 1).bit_length
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:global, :bus_width) do
|
4
|
+
configuration do
|
5
|
+
property :bus_width, default: 32
|
6
|
+
property :byte_width, initial: -> { bus_width / 8 }
|
7
|
+
|
8
|
+
build do |value|
|
9
|
+
@bus_width =
|
10
|
+
begin
|
11
|
+
Integer(value)
|
12
|
+
rescue ArgumentError, TypeError
|
13
|
+
error "cannot convert #{value.inspect} into bus width"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
verify(:feature) do
|
18
|
+
error_condition { bus_width < 8 }
|
19
|
+
message { "input bus width is less than 8: #{bus_width}" }
|
20
|
+
end
|
21
|
+
|
22
|
+
verify(:feature) do
|
23
|
+
error_condition { !power_of_2?(bus_width) }
|
24
|
+
message { "input bus width is not power of 2: #{bus_width}" }
|
25
|
+
end
|
26
|
+
|
27
|
+
printable :bus_width
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def power_of_2?(value)
|
32
|
+
value.positive? && (value & value.pred).zero?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|