rggen-systemverilog 0.11.1 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -8
- data/lib/rggen/systemverilog.rb +3 -47
- data/lib/rggen/systemverilog/common.rb +44 -0
- data/lib/rggen/systemverilog/common/component.rb +25 -0
- data/lib/rggen/systemverilog/common/factories.rb +13 -0
- data/lib/rggen/systemverilog/common/feature.rb +78 -0
- data/lib/rggen/systemverilog/common/utility.rb +95 -0
- data/lib/rggen/systemverilog/common/utility/class_definition.rb +45 -0
- data/lib/rggen/systemverilog/common/utility/data_object.rb +131 -0
- data/lib/rggen/systemverilog/common/utility/function_definition.rb +47 -0
- data/lib/rggen/systemverilog/common/utility/identifier.rb +114 -0
- data/lib/rggen/systemverilog/common/utility/interface_instance.rb +57 -0
- data/lib/rggen/systemverilog/common/utility/interface_port.rb +51 -0
- data/lib/rggen/systemverilog/common/utility/local_scope.rb +64 -0
- data/lib/rggen/systemverilog/common/utility/module_definition.rb +76 -0
- data/lib/rggen/systemverilog/common/utility/package_definition.rb +61 -0
- data/lib/rggen/systemverilog/common/utility/source_file.rb +16 -0
- data/lib/rggen/systemverilog/common/utility/structure_definition.rb +39 -0
- data/lib/rggen/systemverilog/ral.rb +38 -0
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +83 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +5 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/rwc_rwe_rwl.rb +23 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/w0trg_w1trg.rb +7 -0
- data/lib/rggen/systemverilog/ral/feature.rb +26 -0
- data/lib/rggen/systemverilog/ral/register/type.rb +154 -0
- data/lib/rggen/systemverilog/ral/register/type/default.erb +8 -0
- data/lib/rggen/systemverilog/ral/register/type/external.rb +27 -0
- data/lib/rggen/systemverilog/ral/register/type/indirect.erb +13 -0
- data/lib/rggen/systemverilog/ral/register/type/indirect.rb +35 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +11 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +65 -0
- data/lib/rggen/systemverilog/ral/setup.rb +7 -0
- data/lib/rggen/systemverilog/rtl.rb +50 -0
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +89 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type.rb +62 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +15 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +59 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +3 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +7 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +6 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +22 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +6 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.rb +7 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +13 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +32 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.erb +9 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +14 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.erb +16 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.rb +61 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.erb +9 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +20 -0
- data/lib/rggen/systemverilog/rtl/feature.rb +48 -0
- data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +19 -0
- data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +24 -0
- data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +82 -0
- data/lib/rggen/systemverilog/rtl/register/type.rb +65 -0
- data/lib/rggen/systemverilog/rtl/register/type/default.erb +15 -0
- data/lib/rggen/systemverilog/rtl/register/type/external.erb +11 -0
- data/lib/rggen/systemverilog/rtl/register/type/external.rb +91 -0
- data/lib/rggen/systemverilog/rtl/register/type/indirect.erb +17 -0
- data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +40 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +100 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +10 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +89 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +11 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +125 -0
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_macros.erb +9 -0
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +86 -0
- data/lib/rggen/systemverilog/rtl/setup.rb +13 -0
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +70 -20
- data/lib/rggen/systemverilog/component.rb +0 -23
- data/lib/rggen/systemverilog/factories.rb +0 -11
- data/lib/rggen/systemverilog/feature.rb +0 -76
- data/lib/rggen/systemverilog/feature_ral.rb +0 -24
- data/lib/rggen/systemverilog/feature_rtl.rb +0 -46
- data/lib/rggen/systemverilog/utility.rb +0 -93
- data/lib/rggen/systemverilog/utility/class_definition.rb +0 -43
- data/lib/rggen/systemverilog/utility/data_object.rb +0 -129
- data/lib/rggen/systemverilog/utility/function_definition.rb +0 -45
- data/lib/rggen/systemverilog/utility/identifier.rb +0 -112
- data/lib/rggen/systemverilog/utility/interface_instance.rb +0 -55
- data/lib/rggen/systemverilog/utility/interface_port.rb +0 -49
- data/lib/rggen/systemverilog/utility/local_scope.rb +0 -62
- data/lib/rggen/systemverilog/utility/module_definition.rb +0 -74
- data/lib/rggen/systemverilog/utility/package_definition.rb +0 -59
- data/lib/rggen/systemverilog/utility/source_file.rb +0 -14
- data/lib/rggen/systemverilog/utility/structure_definition.rb +0 -37
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= module_name %> #(
|
2
|
+
<% if [:w0s, :w1s].include?(bit_field.type) %>
|
3
|
+
.SET_VALUE (<%= set_value %>),
|
4
|
+
<% end %>
|
5
|
+
.WIDTH (<%= width %>),
|
6
|
+
.INITIAL_VALUE (<%= initial_value %>)
|
7
|
+
) u_bit_field (
|
8
|
+
.i_clk (<%= register_block.clock %>),
|
9
|
+
.i_rst_n (<%= register_block.reset %>),
|
10
|
+
.bit_field_if (<%= bit_field_if %>),
|
11
|
+
.i_clear (<%= clear[loop_variables] %>),
|
12
|
+
.o_value (<%= value_out[loop_variables] %>)
|
13
|
+
);
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
input :register_block, :clear, {
|
7
|
+
name: "i_#{full_name}_clear", data_type: :logic, width: width,
|
8
|
+
array_size: array_size, array_format: array_port_format
|
9
|
+
}
|
10
|
+
output :register_block, :value_out, {
|
11
|
+
name: "o_#{full_name}", data_type: :logic, width: width,
|
12
|
+
array_size: array_size, array_format: array_port_format
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
main_code :bit_field, from_template: true
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def module_name
|
21
|
+
if bit_field.type == :rs
|
22
|
+
'rggen_bit_field_rs'
|
23
|
+
else
|
24
|
+
'rggen_bit_field_w01s'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_value
|
29
|
+
bin({ w0s: 0, w1s: 1 }[bit_field.type], 1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
rggen_bit_field_<%= bit_field.type %> #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>)
|
4
|
+
) u_bit_field (
|
5
|
+
.i_clk (<%= register_block.clock %>),
|
6
|
+
.i_rst_n (<%= register_block.reset %>),
|
7
|
+
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
.o_value (<%= value_out[loop_variables] %>)
|
9
|
+
);
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rw, :wo]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
output :register_block, :value_out, {
|
7
|
+
name: "o_#{full_name}", data_type: :logic, width: width,
|
8
|
+
array_size: array_size, array_format: array_port_format
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
main_code :bit_field, from_template: true
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
rggen_bit_field_<%= bit_field.type %> #(
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>)
|
4
|
+
) u_bit_field (
|
5
|
+
.i_clk (<%= register_block.clock %>),
|
6
|
+
.i_rst_n (<%= register_block.reset %>),
|
7
|
+
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
<% if bit_field.type == :rwc %>
|
9
|
+
.i_clear (<%= control_signal %>),
|
10
|
+
<% elsif bit_field.type == :rwe %>
|
11
|
+
.i_enable (<%= control_signal %>),
|
12
|
+
<% else %>
|
13
|
+
.i_lock (<%= control_signal %>),
|
14
|
+
<% end %>
|
15
|
+
.o_value (<%= value_out[loop_variables] %>)
|
16
|
+
);
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rwc, :rwe, :rwl]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
if clear_port?
|
7
|
+
input :register_block, :clear, {
|
8
|
+
name: "i_#{full_name}_clear", data_type: :logic, width: 1,
|
9
|
+
array_size: array_size, array_format: array_port_format
|
10
|
+
}
|
11
|
+
end
|
12
|
+
if enable_port?
|
13
|
+
input :register_block, :enable, {
|
14
|
+
name: "i_#{full_name}_enable", data_type: :logic, width: 1,
|
15
|
+
array_size: array_size, array_format: array_port_format
|
16
|
+
}
|
17
|
+
end
|
18
|
+
if lock_port?
|
19
|
+
input :register_block, :lock, {
|
20
|
+
name: "i_#{full_name}_lock", data_type: :logic, width: 1,
|
21
|
+
array_size: array_size, array_format: array_port_format
|
22
|
+
}
|
23
|
+
end
|
24
|
+
output :register_block, :value_out, {
|
25
|
+
name: "o_#{full_name}", data_type: :logic, width: width,
|
26
|
+
array_size: array_size, array_format: array_port_format
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
main_code :bit_field, from_template: true
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def clear_port?
|
35
|
+
bit_field.type == :rwc && !bit_field.reference?
|
36
|
+
end
|
37
|
+
|
38
|
+
def enable_port?
|
39
|
+
bit_field.type == :rwe && !bit_field.reference?
|
40
|
+
end
|
41
|
+
|
42
|
+
def lock_port?
|
43
|
+
bit_field.type == :rwl && !bit_field.reference?
|
44
|
+
end
|
45
|
+
|
46
|
+
def control_signal
|
47
|
+
reference_bit_field || control_port[loop_variables]
|
48
|
+
end
|
49
|
+
|
50
|
+
def control_port
|
51
|
+
case bit_field.type
|
52
|
+
when :rwc
|
53
|
+
clear
|
54
|
+
when :rwe
|
55
|
+
enable
|
56
|
+
when :rwl
|
57
|
+
lock
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
rggen_bit_field_w01trg #(
|
2
|
+
.TRIGGER_VALUE (<%= trigger_value %>),
|
3
|
+
.WIDTH (<%= width %>)
|
4
|
+
) u_bit_field (
|
5
|
+
.i_clk (<%= register_block.clock %>),
|
6
|
+
.i_rst_n (<%= register_block.reset %>),
|
7
|
+
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
.o_trigger (<%= trigger[loop_variables] %>)
|
9
|
+
);
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
output :register_block, :trigger, {
|
7
|
+
name: "o_#{full_name}_trigger", data_type: :logic, width: width,
|
8
|
+
array_size: array_size, array_format: array_port_format
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
main_code :bit_field, from_template: true
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def trigger_value
|
17
|
+
bin({ w0trg: 0, w1trg: 1 }[bit_field.type], 1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module SystemVerilog
|
5
|
+
module RTL
|
6
|
+
class Feature < Common::Feature
|
7
|
+
private
|
8
|
+
|
9
|
+
def create_variable(data_type, attributes, block)
|
10
|
+
DataObject.new(
|
11
|
+
:variable, attributes.merge(data_type: data_type), &block
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_interface(_, attributes, block)
|
16
|
+
InterfaceInstance.new(attributes, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_argument(direction, attributes, block)
|
20
|
+
DataObject.new(
|
21
|
+
:argument, attributes.merge(direction: direction), &block
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_interface_port(_, attributes, block)
|
26
|
+
InterfacePort.new(attributes, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_parameter(_, attributes, block)
|
30
|
+
DataObject.new(
|
31
|
+
:parameter, attributes.merge(parameter_type: :parameter), &block
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
[
|
36
|
+
[:logic, :create_variable, :variable],
|
37
|
+
[:interface, :create_interface, :variable],
|
38
|
+
[:input, :create_argument, :port],
|
39
|
+
[:output, :create_argument, :port],
|
40
|
+
[:interface_port, :create_interface_port, :port],
|
41
|
+
[:parameter, :create_parameter, :parameter]
|
42
|
+
].each do |entity, creation_method, declaration_type|
|
43
|
+
define_entity(entity, creation_method, declaration_type)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:global, :array_port_format) do
|
4
|
+
configuration do
|
5
|
+
property :array_port_format, default: :packed
|
6
|
+
|
7
|
+
input_pattern /(packed|unpacked|serialized)/i
|
8
|
+
ignore_empty_value false
|
9
|
+
|
10
|
+
build do |value|
|
11
|
+
@array_port_format =
|
12
|
+
if pattern_matched?
|
13
|
+
match_data[1].downcase.to_sym
|
14
|
+
else
|
15
|
+
error "illegal input value for array port format: #{value.inspect}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:global, :fold_sv_interface_port) do
|
4
|
+
configuration do
|
5
|
+
property :fold_sv_interface_port?, default: true
|
6
|
+
|
7
|
+
input_pattern [
|
8
|
+
/true|on|yes/i, /false|off|no/i
|
9
|
+
], match_automatically: false
|
10
|
+
|
11
|
+
ignore_empty_value false
|
12
|
+
|
13
|
+
build do |value|
|
14
|
+
@fold_sv_interface_port =
|
15
|
+
if [true, false].include?(value)
|
16
|
+
value
|
17
|
+
elsif match_pattern(value)
|
18
|
+
[true, false][match_index]
|
19
|
+
else
|
20
|
+
error "cannot convert #{value.inspect} into boolean"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register, :sv_rtl_top) do
|
4
|
+
sv_rtl do
|
5
|
+
export :index
|
6
|
+
export :local_index
|
7
|
+
export :loop_variables
|
8
|
+
|
9
|
+
pre_build do
|
10
|
+
@base_index =
|
11
|
+
register_block.registers.map(&:count).inject(0, :+)
|
12
|
+
end
|
13
|
+
|
14
|
+
build do
|
15
|
+
if register.bit_fields?
|
16
|
+
interface :register, :bit_field_if, {
|
17
|
+
name: 'bit_field_if',
|
18
|
+
interface_type: 'rggen_bit_field_if',
|
19
|
+
parameter_values: [register.width]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
main_code :register_block do
|
25
|
+
local_scope("g_#{register.name}") do |scope|
|
26
|
+
scope.top_scope
|
27
|
+
scope.loop_size loop_size
|
28
|
+
scope.variables variables
|
29
|
+
scope.body(&method(:body_code))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def index(offset = nil)
|
34
|
+
operands =
|
35
|
+
register.array? ? [@base_index, offset || local_index] : [@base_index]
|
36
|
+
if operands.all? { |operand| operand.is_a?(Integer) }
|
37
|
+
operands.inject(:+)
|
38
|
+
else
|
39
|
+
operands.join('+')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def local_index
|
44
|
+
(register.array? || nil) &&
|
45
|
+
loop_variables
|
46
|
+
.zip(local_index_coefficients)
|
47
|
+
.map { |v, c| [c, v].compact.join('*') }
|
48
|
+
.join('+')
|
49
|
+
end
|
50
|
+
|
51
|
+
def loop_variables
|
52
|
+
(register.array? || nil) &&
|
53
|
+
register.array_size.map.with_index(1) do |_size, i|
|
54
|
+
create_identifier(loop_index(i))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def local_index_coefficients
|
61
|
+
coefficients = []
|
62
|
+
register.array_size.reverse.inject(1) do |total, size|
|
63
|
+
coefficients.unshift(coefficients.size.zero? ? nil : total)
|
64
|
+
total * size
|
65
|
+
end
|
66
|
+
coefficients
|
67
|
+
end
|
68
|
+
|
69
|
+
def loop_size
|
70
|
+
(register.array? || nil) &&
|
71
|
+
loop_variables.zip(register.array_size).to_h
|
72
|
+
end
|
73
|
+
|
74
|
+
def variables
|
75
|
+
register.declarations(:register, :variable)
|
76
|
+
end
|
77
|
+
|
78
|
+
def body_code(code)
|
79
|
+
register.generate_code(:register, :top_down, code)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register, :type) do
|
4
|
+
sv_rtl do
|
5
|
+
base_feature do
|
6
|
+
private
|
7
|
+
|
8
|
+
def readable
|
9
|
+
register.readable? && 1 || 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def writable
|
13
|
+
register.writable? && 1 || 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def bus_width
|
17
|
+
configuration.bus_width
|
18
|
+
end
|
19
|
+
|
20
|
+
def address_width
|
21
|
+
register_block.local_address_width
|
22
|
+
end
|
23
|
+
|
24
|
+
def offset_address
|
25
|
+
hex(register.offset_address, address_width)
|
26
|
+
end
|
27
|
+
|
28
|
+
def width
|
29
|
+
register.width
|
30
|
+
end
|
31
|
+
|
32
|
+
def valid_bits
|
33
|
+
bits = register.bit_fields.map(&:bit_map).inject(:|)
|
34
|
+
hex(bits, register.width)
|
35
|
+
end
|
36
|
+
|
37
|
+
def register_index
|
38
|
+
register.local_index || 0
|
39
|
+
end
|
40
|
+
|
41
|
+
def register_if
|
42
|
+
register_block.register_if[register.index]
|
43
|
+
end
|
44
|
+
|
45
|
+
def bit_field_if
|
46
|
+
register.bit_field_if
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
default_feature do
|
51
|
+
template_path = File.join(__dir__, 'type', 'default.erb')
|
52
|
+
main_code :register, from_template: template_path
|
53
|
+
end
|
54
|
+
|
55
|
+
factory do
|
56
|
+
def select_feature(_configuration, register)
|
57
|
+
target_features[register.type] ||
|
58
|
+
unless register.type == :default
|
59
|
+
error "code generator for #{register.type} register type " \
|
60
|
+
'is not implemented'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|