rggen-vhdl 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/LICENSE +21 -0
- data/README.md +74 -0
- data/lib/rggen/vhdl.rb +50 -0
- data/lib/rggen/vhdl/bit_field/type.rb +85 -0
- data/lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.erb +27 -0
- data/lib/rggen/vhdl/bit_field/type/rc_w0c_w1c_wc_woc.rb +51 -0
- data/lib/rggen/vhdl/bit_field/type/ro.erb +24 -0
- data/lib/rggen/vhdl/bit_field/type/ro.rb +21 -0
- data/lib/rggen/vhdl/bit_field/type/rof.erb +24 -0
- data/lib/rggen/vhdl/bit_field/type/rof.rb +7 -0
- data/lib/rggen/vhdl/bit_field/type/rs_w0s_w1s_ws_wos.erb +27 -0
- data/lib/rggen/vhdl/bit_field/type/rs_w0s_w1s_ws_wos.rb +42 -0
- data/lib/rggen/vhdl/bit_field/type/rw_w1_wo_wo1.erb +26 -0
- data/lib/rggen/vhdl/bit_field/type/rw_w1_wo_wo1.rb +23 -0
- data/lib/rggen/vhdl/bit_field/type/rwc.erb +25 -0
- data/lib/rggen/vhdl/bit_field/type/rwc.rb +24 -0
- data/lib/rggen/vhdl/bit_field/type/rwe_rwl.erb +25 -0
- data/lib/rggen/vhdl/bit_field/type/rwe_rwl.rb +33 -0
- data/lib/rggen/vhdl/bit_field/type/rws.erb +24 -0
- data/lib/rggen/vhdl/bit_field/type/rws.rb +27 -0
- data/lib/rggen/vhdl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +26 -0
- data/lib/rggen/vhdl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +36 -0
- data/lib/rggen/vhdl/bit_field/type/w0t_w1t.erb +25 -0
- data/lib/rggen/vhdl/bit_field/type/w0t_w1t.rb +22 -0
- data/lib/rggen/vhdl/bit_field/type/w0trg_w1trg.erb +17 -0
- data/lib/rggen/vhdl/bit_field/type/w0trg_w1trg.rb +19 -0
- data/lib/rggen/vhdl/bit_field/type/wrc_wrs.erb +25 -0
- data/lib/rggen/vhdl/bit_field/type/wrc_wrs.rb +22 -0
- data/lib/rggen/vhdl/bit_field/vhdl_top.rb +93 -0
- data/lib/rggen/vhdl/component.rb +7 -0
- data/lib/rggen/vhdl/factories.rb +11 -0
- data/lib/rggen/vhdl/feature.rb +31 -0
- data/lib/rggen/vhdl/register/default.erb +29 -0
- data/lib/rggen/vhdl/register/type.rb +109 -0
- data/lib/rggen/vhdl/register/type/default.erb +31 -0
- data/lib/rggen/vhdl/register/type/external.erb +29 -0
- data/lib/rggen/vhdl/register/type/external.rb +44 -0
- data/lib/rggen/vhdl/register/type/indirect.erb +35 -0
- data/lib/rggen/vhdl/register/type/indirect.rb +34 -0
- data/lib/rggen/vhdl/register/vhdl_top.rb +40 -0
- data/lib/rggen/vhdl/register_block/protocol.rb +48 -0
- data/lib/rggen/vhdl/register_block/protocol/apb.erb +34 -0
- data/lib/rggen/vhdl/register_block/protocol/apb.rb +20 -0
- data/lib/rggen/vhdl/register_block/protocol/axi4lite.erb +49 -0
- data/lib/rggen/vhdl/register_block/protocol/axi4lite.rb +42 -0
- data/lib/rggen/vhdl/register_block/vhdl_top.erb +26 -0
- data/lib/rggen/vhdl/register_block/vhdl_top.rb +103 -0
- data/lib/rggen/vhdl/register_file/vhdl_top.rb +25 -0
- data/lib/rggen/vhdl/setup.rb +11 -0
- data/lib/rggen/vhdl/utility.rb +28 -0
- data/lib/rggen/vhdl/utility/data_object.rb +91 -0
- data/lib/rggen/vhdl/utility/identifier.rb +38 -0
- data/lib/rggen/vhdl/utility/local_scope.rb +66 -0
- data/lib/rggen/vhdl/version.rb +7 -0
- metadata +130 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
u_bit_field: entity work.rggen_bit_field_w01trg
|
2
|
+
generic map (
|
3
|
+
WRITE_ONE_TRIGGER => <%= write_one_trigger? %>,
|
4
|
+
WIDTH => <%= width %>
|
5
|
+
)
|
6
|
+
port map (
|
7
|
+
i_clk => i_clk,
|
8
|
+
i_rst_n => i_rst_n,
|
9
|
+
i_sw_valid => <%= bit_field_valid %>,
|
10
|
+
i_sw_read_mask => <%= bit_field_read_mask %>,
|
11
|
+
i_sw_write_enable => "1",
|
12
|
+
i_sw_write_mask => <%= bit_field_write_mask %>,
|
13
|
+
i_sw_write_data => <%= bit_field_write_data %>,
|
14
|
+
o_sw_read_data => <%= bit_field_read_data %>,
|
15
|
+
o_sw_value => <%= bit_field_value %>,
|
16
|
+
o_trigger => <%= trigger[loop_variables] %>
|
17
|
+
);
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
output :trigger, {
|
7
|
+
name: "o_#{full_name}_trigger", width: width, array_size: array_size
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
main_code :bit_field, from_template: true
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def write_one_trigger?
|
16
|
+
bit_field.type == :w1trg
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
u_bit_field: entity work.rggen_bit_field
|
2
|
+
generic map (
|
3
|
+
WIDTH => <%= width %>,
|
4
|
+
INITIAL_VALUE => <%= initial_value %>,
|
5
|
+
SW_READ_ACTION => <%= read_action %>
|
6
|
+
)
|
7
|
+
port map (
|
8
|
+
i_clk => <%= clock %>,
|
9
|
+
i_rst_n => <%= reset %>,
|
10
|
+
i_sw_valid => <%= bit_field_valid %>,
|
11
|
+
i_sw_read_mask => <%= bit_field_read_mask %>,
|
12
|
+
i_sw_write_enable => "1",
|
13
|
+
i_sw_write_mask => <%= bit_field_write_mask %>,
|
14
|
+
i_sw_write_data => <%= bit_field_write_data %>,
|
15
|
+
o_sw_read_data => <%= bit_field_read_data %>,
|
16
|
+
o_sw_value => <%= bit_field_value %>,
|
17
|
+
i_hw_write_enable => "0",
|
18
|
+
i_hw_write_data => (others => '0'),
|
19
|
+
i_hw_set => (others => '0'),
|
20
|
+
i_hw_clear => (others => '0'),
|
21
|
+
i_value => (others => '0'),
|
22
|
+
i_mask => (others => '1'),
|
23
|
+
o_value => <%= value_out[loop_variables] %>,
|
24
|
+
o_value_unmasked => open
|
25
|
+
);
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
output :value_out, {
|
7
|
+
name: "o_#{full_name}", width: width, array_size: array_size
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
main_code :bit_field, from_template: true
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def read_action
|
16
|
+
{
|
17
|
+
wrc: 'RGGEN_READ_CLEAR',
|
18
|
+
wrs: 'RGGEN_READ_SET'
|
19
|
+
}[bit_field.type]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:bit_field, :vhdl_top) do
|
4
|
+
vhdl do
|
5
|
+
include RgGen::SystemVerilog::RTL::BitFieldIndex
|
6
|
+
|
7
|
+
export :initial_value
|
8
|
+
export :value
|
9
|
+
|
10
|
+
build do
|
11
|
+
if parameterized_initial_value?
|
12
|
+
generic :initial_value, {
|
13
|
+
name: initial_value_name, width: initial_value_width,
|
14
|
+
default: default_initial_value
|
15
|
+
}
|
16
|
+
else
|
17
|
+
define_accessor_for_initial_value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
main_code :register do
|
22
|
+
local_scope("g_#{bit_field.name}") do |scope|
|
23
|
+
scope.loop_size loop_size
|
24
|
+
scope.body(&method(:body_code))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def value(offsets = nil, width = nil)
|
29
|
+
value_lsb = bit_field.lsb(offsets&.last || local_index)
|
30
|
+
value_width = width || bit_field.width
|
31
|
+
register_value(offsets&.slice(0..-2), value_lsb, value_width)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def parameterized_initial_value?
|
37
|
+
bit_field.initial_value? && !bit_field.fixed_initial_value?
|
38
|
+
end
|
39
|
+
|
40
|
+
def initial_value_name
|
41
|
+
"#{bit_field.full_name('_')}_initial_value".upcase
|
42
|
+
end
|
43
|
+
|
44
|
+
def initial_value_width
|
45
|
+
width = bit_field.width
|
46
|
+
repeat_size = bit_field.sequence_size || 1
|
47
|
+
width * repeat_size
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_initial_value
|
51
|
+
width = bit_field.width
|
52
|
+
repeat_size = bit_field.sequence_size || 1
|
53
|
+
value = initial_value_rhs_default
|
54
|
+
"repeat(#{value}, #{width}, #{repeat_size})"
|
55
|
+
end
|
56
|
+
|
57
|
+
def define_accessor_for_initial_value
|
58
|
+
define_singleton_method(:initial_value) do
|
59
|
+
if bit_field.initial_value_array?
|
60
|
+
array_initial_value_rhs
|
61
|
+
elsif bit_field.initial_value?
|
62
|
+
initial_value_rhs_default
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def initial_value_rhs_default
|
68
|
+
hex(bit_field.register_map.initial_value, bit_field.width)
|
69
|
+
end
|
70
|
+
|
71
|
+
def array_initial_value_rhs
|
72
|
+
value =
|
73
|
+
bit_field.initial_values
|
74
|
+
.map.with_index { |v, i| v << bit_field.width * i }
|
75
|
+
.inject(:|)
|
76
|
+
hex(value, bit_field.sequence_size * bit_field.width)
|
77
|
+
end
|
78
|
+
|
79
|
+
def register_value(offsets, lsb, width)
|
80
|
+
index = register.index(offsets || register.local_indices)
|
81
|
+
register_block.register_value[[index], lsb, width]
|
82
|
+
end
|
83
|
+
|
84
|
+
def loop_size
|
85
|
+
loop_variable = local_index
|
86
|
+
loop_variable && { loop_variable => bit_field.sequence_size }
|
87
|
+
end
|
88
|
+
|
89
|
+
def body_code(code)
|
90
|
+
bit_field.generate_code(code, :bit_field, :top_down)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module VHDL
|
5
|
+
class Feature < SystemVerilog::Common::Feature
|
6
|
+
include Utility
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def create_signal(_, attributes, &block)
|
11
|
+
DataObject.new(:signal, attributes, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_port(direction, attributes, &block)
|
15
|
+
attributes =
|
16
|
+
attributes
|
17
|
+
.merge(direction: { input: :in, output: :out}[direction])
|
18
|
+
DataObject.new(:port, attributes, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_generic(_, attributes, &block)
|
22
|
+
DataObject.new(:generic, attributes, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
define_entity :signal, :create_signal, :signal, -> { component }
|
26
|
+
define_entity :input, :create_port, :port, -> { register_block }
|
27
|
+
define_entity :output, :create_port, :port, -> { register_block }
|
28
|
+
define_entity :generic, :create_generic, :generic, -> { register_block }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
rggen_default_register #(
|
2
|
+
.READABLE (<%= readable %>),
|
3
|
+
.WRITABLE (<%= writable %>),
|
4
|
+
.ADDRESS_WIDTH (<%= address_width %>),
|
5
|
+
.OFFSET_ADDRESS (<%= offset_address %>),
|
6
|
+
.BUS_WIDTH (<%= bus_width %>),
|
7
|
+
.DATA_WIDTH (<%= width %>),
|
8
|
+
.VALID_BITS (<%= valid_bits %>),
|
9
|
+
.REGISTER_INDEX (<%= register_index %>)
|
10
|
+
) u_register (
|
11
|
+
.i_clk (<%= clock %>),
|
12
|
+
.i_rst_n (<%= reset %>),
|
13
|
+
.i_register_valid (<%= register_valid %>),
|
14
|
+
.i_register_access (<%= register_access %>),
|
15
|
+
.i_register_address (<%= register_address %>),
|
16
|
+
.i_register_write_data (<%= register_write_data %>),
|
17
|
+
.i_register_strobe (<%= register_strobe %>),
|
18
|
+
.o_register_active (<%= register_active %>),
|
19
|
+
.o_register_ready (<%= register_ready %>),
|
20
|
+
.o_register_status (<%= register_status %>),
|
21
|
+
.o_register_read_data (<%= register_read_data %>),
|
22
|
+
.o_register_value (<%= register_value %>),
|
23
|
+
.o_bit_field_valid (<%= bit_field_valid %>),
|
24
|
+
.o_bit_field_read_mask (<%= bit_field_read_mask %>),
|
25
|
+
.o_bit_field_write_mask (<%= bit_field_write_mask %>),
|
26
|
+
.o_bit_field_write_data (<%= bit_field_write_data %>),
|
27
|
+
.i_bit_field_read_data (<%= bit_field_read_data %>),
|
28
|
+
.i_bit_field_value (<%= bit_field_value %>)
|
29
|
+
);
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register, :type) do
|
4
|
+
vhdl do
|
5
|
+
base_feature do
|
6
|
+
include RgGen::SystemVerilog::RTL::RegisterType
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def readable?
|
11
|
+
register.readable?
|
12
|
+
end
|
13
|
+
|
14
|
+
def writable?
|
15
|
+
register.writable?
|
16
|
+
end
|
17
|
+
|
18
|
+
def clock
|
19
|
+
register_block.clock
|
20
|
+
end
|
21
|
+
|
22
|
+
def reset
|
23
|
+
register_block.reset
|
24
|
+
end
|
25
|
+
|
26
|
+
def register_valid
|
27
|
+
register_block.register_valid
|
28
|
+
end
|
29
|
+
|
30
|
+
def register_access
|
31
|
+
register_block.register_access
|
32
|
+
end
|
33
|
+
|
34
|
+
def register_address
|
35
|
+
register_block.register_address
|
36
|
+
end
|
37
|
+
|
38
|
+
def register_write_data
|
39
|
+
register_block.register_write_data
|
40
|
+
end
|
41
|
+
|
42
|
+
def register_strobe
|
43
|
+
register_block.register_strobe
|
44
|
+
end
|
45
|
+
|
46
|
+
def register_active
|
47
|
+
register_block.register_active[[register.index]]
|
48
|
+
end
|
49
|
+
|
50
|
+
def register_ready
|
51
|
+
register_block.register_ready[[register.index]]
|
52
|
+
end
|
53
|
+
|
54
|
+
def register_status
|
55
|
+
register_block.register_status[[register.index]]
|
56
|
+
end
|
57
|
+
|
58
|
+
def register_read_data
|
59
|
+
register_block.register_read_data[[register.index]]
|
60
|
+
end
|
61
|
+
|
62
|
+
def register_value
|
63
|
+
register_block.register_value[[register.index], 0, width]
|
64
|
+
end
|
65
|
+
|
66
|
+
def bit_field_valid
|
67
|
+
register.bit_field_valid
|
68
|
+
end
|
69
|
+
|
70
|
+
def bit_field_read_mask
|
71
|
+
register.bit_field_read_mask
|
72
|
+
end
|
73
|
+
|
74
|
+
def bit_field_write_mask
|
75
|
+
register.bit_field_write_mask
|
76
|
+
end
|
77
|
+
|
78
|
+
def bit_field_write_data
|
79
|
+
register.bit_field_write_data
|
80
|
+
end
|
81
|
+
|
82
|
+
def bit_field_read_data
|
83
|
+
register.bit_field_read_data
|
84
|
+
end
|
85
|
+
|
86
|
+
def bit_field_value
|
87
|
+
register.bit_field_value
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
default_feature do
|
92
|
+
main_code :register, from_template: File.join(__dir__, 'type', 'default.erb')
|
93
|
+
end
|
94
|
+
|
95
|
+
factory do
|
96
|
+
def target_feature_key(_configuration, register)
|
97
|
+
type = register.type
|
98
|
+
valid_type?(type) && type ||
|
99
|
+
(error "code generator for #{type} register type is not implemented")
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def valid_type?(type)
|
105
|
+
target_features.key?(type) || type == :default
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
u_register: entity work.rggen_default_register
|
2
|
+
generic map (
|
3
|
+
READABLE => <%= readable? %>,
|
4
|
+
WRITABLE => <%= writable? %>,
|
5
|
+
ADDRESS_WIDTH => <%= address_width %>,
|
6
|
+
OFFSET_ADDRESS => <%= offset_address %>,
|
7
|
+
BUS_WIDTH => <%= bus_width %>,
|
8
|
+
DATA_WIDTH => <%= width %>,
|
9
|
+
VALID_BITS => <%= valid_bits %>,
|
10
|
+
REGISTER_INDEX => <%= register_index %>
|
11
|
+
)
|
12
|
+
port map (
|
13
|
+
i_clk => <%= clock %>,
|
14
|
+
i_rst_n => <%= reset %>,
|
15
|
+
i_register_valid => <%= register_valid %>,
|
16
|
+
i_register_access => <%= register_access %>,
|
17
|
+
i_register_address => <%= register_address %>,
|
18
|
+
i_register_write_data => <%= register_write_data %>,
|
19
|
+
i_register_strobe => <%= register_strobe %>,
|
20
|
+
o_register_active => <%= register_active %>,
|
21
|
+
o_register_ready => <%= register_ready %>,
|
22
|
+
o_register_status => <%= register_status %>,
|
23
|
+
o_register_read_data => <%= register_read_data %>,
|
24
|
+
o_register_value => <%= register_value %>,
|
25
|
+
o_bit_field_valid => <%= bit_field_valid %>,
|
26
|
+
o_bit_field_read_mask => <%= bit_field_read_mask %>,
|
27
|
+
o_bit_field_write_mask => <%= bit_field_write_mask %>,
|
28
|
+
o_bit_field_write_data => <%= bit_field_write_data %>,
|
29
|
+
i_bit_field_read_data => <%= bit_field_read_data %>,
|
30
|
+
i_bit_field_value => <%= bit_field_value %>
|
31
|
+
);
|
@@ -0,0 +1,29 @@
|
|
1
|
+
u_register: entity work.rggen_external_register
|
2
|
+
generic map (
|
3
|
+
ADDRESS_WIDTH => <%= address_width %>,
|
4
|
+
BUS_WIDTH => <%= bus_width %>,
|
5
|
+
START_ADDRESS => <%= start_address %>,
|
6
|
+
BYTE_SIZE => <%= byte_size %>
|
7
|
+
)
|
8
|
+
port map (
|
9
|
+
i_clk => <%= clock %>,
|
10
|
+
i_rst_n => <%= reset %>,
|
11
|
+
i_register_valid => <%= register_valid %>,
|
12
|
+
i_register_access => <%= register_access %>,
|
13
|
+
i_register_address => <%= register_address %>,
|
14
|
+
i_register_write_data => <%= register_write_data %>,
|
15
|
+
i_register_strobe => <%= register_strobe %>,
|
16
|
+
o_register_active => <%= register_active %>,
|
17
|
+
o_register_ready => <%= register_ready %>,
|
18
|
+
o_register_status => <%= register_status %>,
|
19
|
+
o_register_read_data => <%= register_read_data %>,
|
20
|
+
o_register_value => <%= register_value %>,
|
21
|
+
o_external_valid => <%= external_valid %>,
|
22
|
+
o_external_access => <%= external_access %>,
|
23
|
+
o_external_address => <%= external_address %>,
|
24
|
+
o_external_data => <%= external_write_data %>,
|
25
|
+
o_external_strobe => <%= external_strobe %>,
|
26
|
+
i_external_ready => <%= external_ready %>,
|
27
|
+
i_external_status => <%= external_status %>,
|
28
|
+
i_external_data => <%= external_read_data %>
|
29
|
+
);
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register, :type, :external) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
output :external_valid, {
|
7
|
+
name: "o_#{register.name}_valid"
|
8
|
+
}
|
9
|
+
output :external_access, {
|
10
|
+
name: "o_#{register.name}_access", width: 2
|
11
|
+
}
|
12
|
+
output :external_address, {
|
13
|
+
name: "o_#{register.name}_address", width: address_width
|
14
|
+
}
|
15
|
+
output :external_write_data, {
|
16
|
+
name: "o_#{register.name}_data", width: bus_width
|
17
|
+
}
|
18
|
+
output :external_strobe, {
|
19
|
+
name: "o_#{register.name}_strobe", width: bus_width / 8
|
20
|
+
}
|
21
|
+
input :external_ready, {
|
22
|
+
name: "i_#{register.name}_ready"
|
23
|
+
}
|
24
|
+
input :external_status, {
|
25
|
+
name: "i_#{register.name}_status", width: 2
|
26
|
+
}
|
27
|
+
input :external_read_data, {
|
28
|
+
name: "i_#{register.name}_data", width: bus_width
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
main_code :register, from_template: true
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def start_address
|
37
|
+
hex(register.offset_address, address_width)
|
38
|
+
end
|
39
|
+
|
40
|
+
def byte_size
|
41
|
+
register.byte_size
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|