rggen 0.4.4 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/c/rggen.h +17 -0
- data/lib/rggen.rb +7 -16
- data/lib/rggen/base/item_factory.rb +2 -0
- data/lib/rggen/builtins.rb +15 -13
- data/lib/rggen/builtins/bit_field/{reserved.rb → types/reserved.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.erb → types/ro.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.rb → types/ro.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.erb → types/rw.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.rb → types/rw.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.erb → types/rwl_rwe.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.rb → types/rwl_rwe.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.erb → types/w0c_w1c.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.rb → types/w0c_w1c.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.erb → types/w0s_w1s.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.rb → types/w0s_w1s.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{wo.rb → types/wo.rb} +0 -0
- data/lib/rggen/builtins/register/address_decoder.erb +9 -9
- data/lib/rggen/builtins/register/address_decoder.rb +24 -24
- data/lib/rggen/builtins/register/array.rb +0 -22
- data/lib/rggen/builtins/register/bus_exporter.rb +10 -2
- data/lib/rggen/builtins/register/indirect_index_configurator.rb +54 -0
- data/lib/rggen/builtins/register/offset_address.rb +21 -15
- data/lib/rggen/builtins/register/read_data.rb +1 -1
- data/lib/rggen/builtins/register/reg_model.rb +5 -5
- data/lib/rggen/builtins/register/sub_block_model.rb +1 -1
- data/lib/rggen/builtins/register/type.rb +207 -0
- data/lib/rggen/builtins/register/types/external.rb +15 -0
- data/lib/rggen/builtins/register/types/indirect.rb +134 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +10 -7
- data/lib/rggen/builtins/register_block/address_struct.rb +56 -0
- data/lib/rggen/builtins/register_block/c_header_file.rb +15 -0
- data/lib/rggen/builtins/register_block/{apb.erb → host_ifs/apb.erb} +0 -0
- data/lib/rggen/builtins/register_block/{apb.rb → host_ifs/apb.rb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.erb → host_ifs/axi4lite.erb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.rb → host_ifs/axi4lite.rb} +0 -0
- data/lib/rggen/builtins/register_block/ral_package.rb +6 -1
- data/lib/rggen/builtins/register_block/response_mux.rb +2 -2
- data/lib/rggen/builtins/register_block/top_module.rb +5 -1
- data/lib/rggen/core_components.rb +25 -0
- data/lib/rggen/core_components/c_header/item.rb +8 -0
- data/lib/rggen/core_components/c_header/setup.rb +19 -0
- data/lib/rggen/core_components/c_utility.rb +19 -0
- data/lib/rggen/core_components/c_utility/data_structure_definition.rb +62 -0
- data/lib/rggen/core_components/c_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/c_utility/variable_declaration.rb +35 -0
- data/lib/rggen/core_components/code_utility.rb +56 -0
- data/lib/rggen/{output_base → core_components/code_utility}/code_block.rb +1 -1
- data/lib/rggen/{output_base → core_components/code_utility}/line.rb +1 -1
- data/lib/rggen/core_components/code_utility/source_file.rb +97 -0
- data/lib/rggen/core_components/erb_engine.rb +15 -0
- data/lib/rggen/core_components/ral/item.rb +2 -1
- data/lib/rggen/core_components/register_map/generic_map.rb +3 -1
- data/lib/rggen/core_components/rtl/item.rb +2 -1
- data/lib/rggen/core_components/verilog_utility.rb +69 -0
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +56 -0
- data/lib/rggen/core_components/verilog_utility/declaration.rb +66 -0
- data/lib/rggen/core_components/verilog_utility/identifier.rb +27 -0
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +71 -0
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +65 -0
- data/lib/rggen/core_components/verilog_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +50 -0
- data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +41 -0
- data/lib/rggen/core_extensions/facets.rb +5 -0
- data/lib/rggen/generator.rb +19 -5
- data/lib/rggen/input_base/item.rb +6 -6
- data/lib/rggen/output_base/code_generator.rb +36 -0
- data/lib/rggen/output_base/component.rb +27 -41
- data/lib/rggen/output_base/file_writer.rb +36 -0
- data/lib/rggen/output_base/item.rb +34 -100
- data/lib/rggen/output_base/template_engine.rb +24 -0
- data/lib/rggen/rggen_home.rb +3 -0
- data/lib/rggen/version.rb +2 -2
- data/ral/rggen_ral_block.svh +1 -1
- data/ral/rggen_ral_indirect_reg.svh +193 -0
- data/ral/rggen_ral_map.svh +20 -20
- data/ral/rggen_ral_pkg.sv +1 -1
- data/rtl/register/rggen_address_decoder.sv +14 -14
- data/sample/sample.csv +21 -22
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample_0.h +17 -0
- data/sample/sample_0.sv +92 -92
- data/sample/sample_0_ral_pkg.sv +8 -5
- data/sample/sample_1.h +9 -0
- data/sample/sample_1.sv +27 -27
- data/sample/sample_1_ral_pkg.sv +3 -0
- data/sample/sample_setup.rb +4 -2
- data/setup/default.rb +4 -2
- metadata +53 -36
- data/lib/rggen/builtins/register/accessibility.rb +0 -23
- data/lib/rggen/builtins/register/external.rb +0 -42
- data/lib/rggen/builtins/register/shadow.rb +0 -130
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +0 -56
- data/lib/rggen/output_base/code_utility.rb +0 -50
- data/lib/rggen/output_base/template_utility.rb +0 -29
- data/lib/rggen/output_base/verilog_utility.rb +0 -69
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +0 -58
- data/lib/rggen/output_base/verilog_utility/declaration.rb +0 -68
- data/lib/rggen/output_base/verilog_utility/identifier.rb +0 -29
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +0 -73
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +0 -67
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +0 -52
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +0 -43
- data/ral/rggen_ral_shadow_reg.svh +0 -193
@@ -4,9 +4,9 @@ simple_item :register, :reg_model do
|
|
4
4
|
|
5
5
|
delegate [:byte_width] => :configuration
|
6
6
|
delegate [:local_address_width] => :register_block
|
7
|
-
delegate [:name, :dimensions, :array?, :
|
7
|
+
delegate [:name, :dimensions, :array?, :type?] => :register
|
8
8
|
|
9
|
-
available? {
|
9
|
+
available? { !type?(:external) }
|
10
10
|
|
11
11
|
build do
|
12
12
|
variable :block_model, :reg_model,
|
@@ -62,7 +62,7 @@ simple_item :register, :reg_model do
|
|
62
62
|
|
63
63
|
def offset_address
|
64
64
|
base = hex(register.start_address, local_address_width)
|
65
|
-
if !array? ||
|
65
|
+
if !array? || type?(:indirect)
|
66
66
|
base
|
67
67
|
else
|
68
68
|
"#{base} + #{byte_width} * #{loop_varibles.first}"
|
@@ -76,7 +76,7 @@ simple_item :register, :reg_model do
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def unmapped
|
79
|
-
(
|
79
|
+
(type?(:indirect) && 1) || 0
|
80
80
|
end
|
81
81
|
|
82
82
|
def hdl_path
|
@@ -97,7 +97,7 @@ simple_item :register, :reg_model do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def base_model
|
100
|
-
(
|
100
|
+
(type?(:indirect) && :rggen_ral_indirect_reg) || :rggen_ral_reg
|
101
101
|
end
|
102
102
|
|
103
103
|
def body_code(code)
|
@@ -0,0 +1,207 @@
|
|
1
|
+
list_item :register, :type do
|
2
|
+
register_map do
|
3
|
+
item_base do
|
4
|
+
define_helpers do
|
5
|
+
def readable?(&evaluator)
|
6
|
+
@readability_evaluator = evaluator
|
7
|
+
end
|
8
|
+
|
9
|
+
def writable?(&evaluator)
|
10
|
+
@writability_evaluator = evaluator
|
11
|
+
end
|
12
|
+
|
13
|
+
{
|
14
|
+
read_write: [true , true ],
|
15
|
+
read_only: [true , false],
|
16
|
+
write_only: [false, true ],
|
17
|
+
reserved: [false, false]
|
18
|
+
}.each do |access_type, accessibility|
|
19
|
+
define_method(access_type) do
|
20
|
+
readable? { accessibility[0] }
|
21
|
+
writable? { accessibility[1] }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def need_options
|
26
|
+
@need_options = true
|
27
|
+
end
|
28
|
+
|
29
|
+
def need_options?
|
30
|
+
@need_options
|
31
|
+
end
|
32
|
+
|
33
|
+
def support_array_register(options = {})
|
34
|
+
@support_array_register = true
|
35
|
+
@array_options = options
|
36
|
+
end
|
37
|
+
|
38
|
+
def support_array_register?
|
39
|
+
@support_array_register
|
40
|
+
end
|
41
|
+
|
42
|
+
def array_options
|
43
|
+
@array_options || {}
|
44
|
+
end
|
45
|
+
|
46
|
+
attr_setter :required_byte_size
|
47
|
+
|
48
|
+
[:amount_of_registers, :data_width, :any_size].each do |width_type|
|
49
|
+
define_method(width_type) { width_type }
|
50
|
+
end
|
51
|
+
|
52
|
+
def need_no_bit_fields
|
53
|
+
@no_bit_fields = true
|
54
|
+
end
|
55
|
+
|
56
|
+
def need_no_bit_fields?
|
57
|
+
@no_bit_fields
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_class_reader :writability_evaluator
|
62
|
+
attr_class_reader :readability_evaluator
|
63
|
+
class_delegator :need_options?
|
64
|
+
class_delegator :support_array_register?
|
65
|
+
class_delegator :array_options
|
66
|
+
class_delegator :required_byte_size
|
67
|
+
class_delegator :need_no_bit_fields?
|
68
|
+
|
69
|
+
field :type
|
70
|
+
|
71
|
+
field :type? do |other|
|
72
|
+
other == type
|
73
|
+
end
|
74
|
+
|
75
|
+
field :readable? do
|
76
|
+
next true if readability_evaluator.nil?
|
77
|
+
instance_exec(&readability_evaluator)
|
78
|
+
end
|
79
|
+
|
80
|
+
field :writable? do
|
81
|
+
next true if writability_evaluator.nil?
|
82
|
+
instance_exec(&writability_evaluator)
|
83
|
+
end
|
84
|
+
|
85
|
+
field :read_only? do
|
86
|
+
readable? && !writable?
|
87
|
+
end
|
88
|
+
|
89
|
+
field :write_only? do
|
90
|
+
!readable? && writable?
|
91
|
+
end
|
92
|
+
|
93
|
+
field :reserved? do
|
94
|
+
!(readable? || writable?)
|
95
|
+
end
|
96
|
+
|
97
|
+
build do |cell|
|
98
|
+
@type = cell.type
|
99
|
+
error 'no options are specified' if need_options? && cell.options.nil?
|
100
|
+
register.need_no_children if need_no_bit_fields?
|
101
|
+
end
|
102
|
+
|
103
|
+
validate do
|
104
|
+
check_array_register_usage
|
105
|
+
check_array_demension
|
106
|
+
check_byte_size
|
107
|
+
end
|
108
|
+
|
109
|
+
def check_array_register_usage
|
110
|
+
return unless register.array?
|
111
|
+
return if support_array_register?
|
112
|
+
error 'array register is not allowed'
|
113
|
+
end
|
114
|
+
|
115
|
+
def check_array_demension
|
116
|
+
return unless register.array?
|
117
|
+
return if register.dimensions.size == 1
|
118
|
+
return if array_options[:support_multiple_dimensions]
|
119
|
+
error 'multiple dimensions array register is not allowed'
|
120
|
+
end
|
121
|
+
|
122
|
+
def check_byte_size
|
123
|
+
return if required_byte_size == :any_size
|
124
|
+
return if register.byte_size == required_byte_size_value
|
125
|
+
error "byte size(#{register.byte_size}) is not matched with " \
|
126
|
+
"required size(#{required_byte_size_value})"
|
127
|
+
end
|
128
|
+
|
129
|
+
def required_byte_size_value
|
130
|
+
return configuration.byte_width if required_byte_size == :data_width
|
131
|
+
register.count * configuration.byte_width
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
default_item do
|
136
|
+
readable? { register.bit_fields.any?(&:readable?) }
|
137
|
+
writable? { register.bit_fields.any?(&:writable?) }
|
138
|
+
support_array_register
|
139
|
+
build { @type = :default }
|
140
|
+
end
|
141
|
+
|
142
|
+
factory do
|
143
|
+
define_struct :cell_value, [:type, :options] do
|
144
|
+
def empty?
|
145
|
+
self.type.nil?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def select_target_item(cell)
|
150
|
+
@target_items.fetch(cell.value.type) do
|
151
|
+
next if cell.value.type == :default
|
152
|
+
error "unknown register type: #{cell.value.type}", cell
|
153
|
+
end unless cell.empty?
|
154
|
+
end
|
155
|
+
|
156
|
+
def convert_cell_value(cell)
|
157
|
+
cell.value =
|
158
|
+
if cell.empty?
|
159
|
+
cell_value.new(nil, nil)
|
160
|
+
else
|
161
|
+
convert(cell.value)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def convert(cell)
|
166
|
+
[:default, *@target_items.keys].find_yield do |t|
|
167
|
+
case cell
|
168
|
+
when /\A#{t}(?::(.+))?\Z/im
|
169
|
+
cell_value.new(t, Regexp.last_match.captures[0])
|
170
|
+
end
|
171
|
+
end || cell_value.new(cell, nil)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
c_header do
|
177
|
+
item_base do
|
178
|
+
define_helpers do
|
179
|
+
def address_struct_member(&body)
|
180
|
+
define_method(:address_struct_member, &body)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
export :address_struct_member
|
185
|
+
|
186
|
+
def data_type
|
187
|
+
"rggen_uint#{configuration.data_width}"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
default_item do
|
192
|
+
delegate [:name, :dimensions] => :register
|
193
|
+
|
194
|
+
address_struct_member do
|
195
|
+
variable_declaration(
|
196
|
+
name: name, data_type: data_type, dimensions: dimensions
|
197
|
+
)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
factory do
|
202
|
+
def select_target_item(_, register)
|
203
|
+
@target_items[register.type]
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
list_item :register, :type, :external do
|
2
|
+
register_map do
|
3
|
+
read_write
|
4
|
+
required_byte_size any_size
|
5
|
+
need_no_bit_fields
|
6
|
+
end
|
7
|
+
|
8
|
+
c_header do
|
9
|
+
delegate [:name, :byte_size] => :register
|
10
|
+
|
11
|
+
address_struct_member do
|
12
|
+
"RGGEN_EXTERNAL_REGISTERS(#{byte_size}, #{name.upcase}) #{name}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
list_item :register, :type, :indirect do
|
2
|
+
register_map do
|
3
|
+
field :indexes
|
4
|
+
|
5
|
+
readable? { register.bit_fields.any?(&:readable?) }
|
6
|
+
writable? { register.bit_fields.any?(&:writable?) }
|
7
|
+
|
8
|
+
need_options
|
9
|
+
support_array_register support_multiple_dimensions: true
|
10
|
+
required_byte_size data_width
|
11
|
+
|
12
|
+
input_pattern %r{(#{variable_name})(?::(#{number}))?}
|
13
|
+
|
14
|
+
define_struct :index_entry, [:name, :value] do
|
15
|
+
def initialize(name, value)
|
16
|
+
self.name = name
|
17
|
+
self.value = value && Integer(value)
|
18
|
+
end
|
19
|
+
|
20
|
+
def ==(other)
|
21
|
+
return false unless name == other.name
|
22
|
+
return true if [value, other.value].any?(&:nil?)
|
23
|
+
value == other.value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
build do |cell|
|
28
|
+
@indexes = parse_indexes(cell.options.strip)
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_indexes(options)
|
32
|
+
options.split(/[,\n]/).map do |entry|
|
33
|
+
if pattern_match(entry)
|
34
|
+
index_entry.new(captures[0], captures[1])
|
35
|
+
else
|
36
|
+
error "invalid value for index: #{options.inspect}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
validate do
|
42
|
+
check_index_entries
|
43
|
+
check_number_of_array_indexes
|
44
|
+
check_array_index_values
|
45
|
+
check_fixed_value_index_values
|
46
|
+
end
|
47
|
+
|
48
|
+
def check_index_entries
|
49
|
+
indexes.each(&method(:check_index_entry))
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_index_entry(entry)
|
53
|
+
[
|
54
|
+
:check_using_same_index_more_than_once,
|
55
|
+
:check_using_non_existing_index,
|
56
|
+
:check_using_own_bit_field_for_index,
|
57
|
+
:check_using_arrayed_bit_field_for_index
|
58
|
+
].each do |checker|
|
59
|
+
send(checker, entry)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def check_using_same_index_more_than_once(entry)
|
64
|
+
return if indexes.one? { |index| index.name == entry.name }
|
65
|
+
error "not use the same index field more than once: #{entry.name}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def check_using_non_existing_index(entry)
|
69
|
+
return unless index_bit_fields[entry.name].nil?
|
70
|
+
error "no such index field: #{entry.name}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def check_using_own_bit_field_for_index(entry)
|
74
|
+
return unless register.bit_fields.find_by(name: entry.name)
|
75
|
+
error "not use own bit field for index field: #{entry.name}"
|
76
|
+
end
|
77
|
+
|
78
|
+
def check_using_arrayed_bit_field_for_index(entry)
|
79
|
+
return unless index_bit_fields[entry.name].register.array?
|
80
|
+
error "not use arrayed bit field for index field: #{entry.name}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def check_number_of_array_indexes
|
84
|
+
return if array_indexes.size == size_of_dimensions
|
85
|
+
error "not match size of array dimensions and number of array indexes"
|
86
|
+
end
|
87
|
+
|
88
|
+
def check_array_index_values
|
89
|
+
array_indexes.each_with_index do |entry, i|
|
90
|
+
next if register.dimensions[i] <= (max_value(entry.name) + 1)
|
91
|
+
error "array size(#{register.dimensions[i]}) is greater than " \
|
92
|
+
"maximum value of #{entry.name}(#{max_value(entry.name)})"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def check_fixed_value_index_values
|
97
|
+
fixed_value_indexes.each_with_index do |entry, i|
|
98
|
+
next if entry.value <= max_value(entry.name)
|
99
|
+
error "index value(#{entry.value}) is greater thatn " \
|
100
|
+
"maximum value of #{entry.name}(#{max_value(entry.name)})"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def index_bit_fields
|
105
|
+
@index_bit_fields ||= Hash.new do |h, name|
|
106
|
+
h[name] = register_block.bit_fields.find_by(
|
107
|
+
name: name, reserved?: false
|
108
|
+
)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def array_indexes
|
113
|
+
indexes.select { |entry| entry.value.nil? }
|
114
|
+
end
|
115
|
+
|
116
|
+
def fixed_value_indexes
|
117
|
+
indexes.select { |entry| entry.value }
|
118
|
+
end
|
119
|
+
|
120
|
+
def size_of_dimensions
|
121
|
+
(register.array? && register.dimensions.size) || 0
|
122
|
+
end
|
123
|
+
|
124
|
+
def max_value(index_name)
|
125
|
+
2**index_bit_fields[index_name].width - 1
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
c_header do
|
130
|
+
address_struct_member do
|
131
|
+
variable_declaration(name: register.name, data_type: data_type)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -11,16 +11,15 @@ simple_item :register, :uniqueness_validator do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def validate_uniqueness(previous_register)
|
14
|
-
|
15
|
-
when overlap_offset_address?(previous_register)
|
14
|
+
if overlap_offset_address?(previous_register)
|
16
15
|
error 'offset address is not unique', error_position(:start_address)
|
17
|
-
|
18
|
-
error '
|
16
|
+
elsif overlap_indirect_indexes?(previous_register)
|
17
|
+
error 'indirect indexes is not unique', error_position(:indexes)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
21
|
def overlap_offset_address?(previous_register)
|
23
|
-
return false if
|
22
|
+
return false if both_register_indirect?(previous_register)
|
24
23
|
overlap_address_range?(register, previous_register)
|
25
24
|
end
|
26
25
|
|
@@ -30,15 +29,19 @@ simple_item :register, :uniqueness_validator do
|
|
30
29
|
lhs_range.overlap?(rhs_range)
|
31
30
|
end
|
32
31
|
|
33
|
-
def
|
32
|
+
def overlap_indirect_indexes?(previous_register)
|
34
33
|
return false unless overlap_address_range?(register, previous_register)
|
35
34
|
return true unless unique_shadw_indexes?(register, previous_register)
|
36
35
|
return true unless unique_shadw_indexes?(previous_register, register)
|
37
36
|
false
|
38
37
|
end
|
39
38
|
|
39
|
+
def both_register_indirect?(previous_register)
|
40
|
+
[register, previous_register].all? { |r| r.type?(:indirect) }
|
41
|
+
end
|
42
|
+
|
40
43
|
def unique_shadw_indexes?(lhs, rhs)
|
41
|
-
lhs.
|
44
|
+
lhs.indexes.any?(&rhs.indexes.method(:exclude?))
|
42
45
|
end
|
43
46
|
|
44
47
|
def error_position(field)
|