rggen-default-register-map 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +74 -0
  3. data/LICENSE +21 -0
  4. data/README.md +45 -0
  5. data/lib/rggen/default_register_map.rb +46 -0
  6. data/lib/rggen/default_register_map/bit_field/bit_assignment.rb +122 -0
  7. data/lib/rggen/default_register_map/bit_field/comment.rb +18 -0
  8. data/lib/rggen/default_register_map/bit_field/initial_value.rb +75 -0
  9. data/lib/rggen/default_register_map/bit_field/name.rb +37 -0
  10. data/lib/rggen/default_register_map/bit_field/reference.rb +142 -0
  11. data/lib/rggen/default_register_map/bit_field/type.rb +117 -0
  12. data/lib/rggen/default_register_map/bit_field/type/rc.rb +9 -0
  13. data/lib/rggen/default_register_map/bit_field/type/reserved.rb +8 -0
  14. data/lib/rggen/default_register_map/bit_field/type/ro.rb +8 -0
  15. data/lib/rggen/default_register_map/bit_field/type/rof.rb +9 -0
  16. data/lib/rggen/default_register_map/bit_field/type/rs.rb +8 -0
  17. data/lib/rggen/default_register_map/bit_field/type/rw.rb +9 -0
  18. data/lib/rggen/default_register_map/bit_field/type/rwc.rb +9 -0
  19. data/lib/rggen/default_register_map/bit_field/type/rwe_rwl.rb +10 -0
  20. data/lib/rggen/default_register_map/bit_field/type/w0c_w1c.rb +9 -0
  21. data/lib/rggen/default_register_map/bit_field/type/w0s_w1s.rb +8 -0
  22. data/lib/rggen/default_register_map/bit_field/type/w0trg_w1trg.rb +8 -0
  23. data/lib/rggen/default_register_map/bit_field/type/wo.rb +9 -0
  24. data/lib/rggen/default_register_map/global/address_width.rb +34 -0
  25. data/lib/rggen/default_register_map/global/bus_width.rb +35 -0
  26. data/lib/rggen/default_register_map/register/name.rb +36 -0
  27. data/lib/rggen/default_register_map/register/offset_address.rb +106 -0
  28. data/lib/rggen/default_register_map/register/size.rb +95 -0
  29. data/lib/rggen/default_register_map/register/type.rb +135 -0
  30. data/lib/rggen/default_register_map/register/type/external.rb +16 -0
  31. data/lib/rggen/default_register_map/register/type/indirect.rb +256 -0
  32. data/lib/rggen/default_register_map/register_block/byte_size.rb +61 -0
  33. data/lib/rggen/default_register_map/register_block/name.rb +38 -0
  34. data/lib/rggen/default_register_map/setup.rb +18 -0
  35. data/lib/rggen/default_register_map/version.rb +7 -0
  36. 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,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rc) do
4
+ register_map do
5
+ read_only
6
+ reference use: true
7
+ initial_value require: true
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :reserved) do
4
+ register_map do
5
+ reserved
6
+ non_volatile
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :ro) do
4
+ register_map do
5
+ read_only
6
+ reference use: true
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rof) do
4
+ register_map do
5
+ read_only
6
+ non_volatile
7
+ initial_value require: true
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rs) do
4
+ register_map do
5
+ read_only
6
+ initial_value require: true
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rw) do
4
+ register_map do
5
+ read_write
6
+ non_volatile
7
+ initial_value require: true
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
4
+ register_map do
5
+ read_write
6
+ initial_value require: true
7
+ reference use: true, width: 1
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
4
+ register_map do
5
+ read_write
6
+ volatile? { !bit_field.reference? }
7
+ initial_value require: true
8
+ reference use: true, width: 1
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0c, :w1c]) do
4
+ register_map do
5
+ read_write
6
+ reference use: true
7
+ initial_value require: true
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0s, :w1s]) do
4
+ register_map do
5
+ read_write
6
+ initial_value require: true
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
4
+ register_map do
5
+ write_only
6
+ non_volatile
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :wo) do
4
+ register_map do
5
+ write_only
6
+ non_volatile
7
+ initial_value require: true
8
+ end
9
+ 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