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,35 @@
|
|
1
|
+
<% index_fields_and_values.each_with_index do |(field, value), i| %>
|
2
|
+
<%= indirect_match[i] %> <= '1' when unsigned(<%= field %>) = <%= value %> else '0';
|
3
|
+
<% end %>
|
4
|
+
u_register: entity work.rggen_indirect_register
|
5
|
+
generic map (
|
6
|
+
READABLE => <%= readable? %>,
|
7
|
+
WRITABLE => <%= writable? %>,
|
8
|
+
ADDRESS_WIDTH => <%= address_width %>,
|
9
|
+
OFFSET_ADDRESS => <%= offset_address %>,
|
10
|
+
BUS_WIDTH => <%= bus_width %>,
|
11
|
+
DATA_WIDTH => <%= width %>,
|
12
|
+
VALID_BITS => <%= valid_bits %>,
|
13
|
+
INDIRECT_MATCH_WIDTH => <%= match_width %>
|
14
|
+
)
|
15
|
+
port map (
|
16
|
+
i_clk => <%= clock %>,
|
17
|
+
i_rst_n => <%= reset %>,
|
18
|
+
i_register_valid => <%= register_valid %>,
|
19
|
+
i_register_access => <%= register_access %>,
|
20
|
+
i_register_address => <%= register_address %>,
|
21
|
+
i_register_write_data => <%= register_write_data %>,
|
22
|
+
i_register_strobe => <%= register_strobe %>,
|
23
|
+
o_register_active => <%= register_active %>,
|
24
|
+
o_register_ready => <%= register_ready %>,
|
25
|
+
o_register_status => <%= register_status %>,
|
26
|
+
o_register_read_data => <%= register_read_data %>,
|
27
|
+
o_register_value => <%= register_value %>,
|
28
|
+
i_indirect_match => <%= indirect_match %>,
|
29
|
+
o_bit_field_valid => <%= bit_field_valid %>,
|
30
|
+
o_bit_field_read_mask => <%= bit_field_read_mask %>,
|
31
|
+
o_bit_field_write_mask => <%= bit_field_write_mask %>,
|
32
|
+
o_bit_field_write_data => <%= bit_field_write_data %>,
|
33
|
+
i_bit_field_read_data => <%= bit_field_read_data %>,
|
34
|
+
i_bit_field_value => <%= bit_field_value %>
|
35
|
+
);
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register, :type, :indirect) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
signal :indirect_match, { width: match_width }
|
7
|
+
end
|
8
|
+
|
9
|
+
main_code :register, from_template: true
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def match_width
|
14
|
+
register.index_entries.size
|
15
|
+
end
|
16
|
+
|
17
|
+
def index_fields
|
18
|
+
register
|
19
|
+
.collect_index_fields(register_block.bit_fields)
|
20
|
+
.map(&:value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def index_values
|
24
|
+
loop_variables = register.local_loop_variables
|
25
|
+
register.index_entries.map do |entry|
|
26
|
+
entry.array_index? && loop_variables.shift || entry.value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def index_fields_and_values
|
31
|
+
index_fields.zip(index_values)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register, :vhdl_top) do
|
4
|
+
vhdl do
|
5
|
+
include RgGen::SystemVerilog::RTL::RegisterIndex
|
6
|
+
|
7
|
+
build do
|
8
|
+
unless register.bit_fields.empty?
|
9
|
+
signal :bit_field_valid
|
10
|
+
signal :bit_field_read_mask, width: register.width
|
11
|
+
signal :bit_field_write_mask, width: register.width
|
12
|
+
signal :bit_field_write_data, width: register.width
|
13
|
+
signal :bit_field_read_data, width: register.width
|
14
|
+
signal :bit_field_value, width: register.width
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
main_code :register_file do
|
19
|
+
local_scope("g_#{register.name}") do |scope|
|
20
|
+
scope.loop_size loop_size
|
21
|
+
scope.signals signals
|
22
|
+
scope.body(&method(:body_code))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def loop_size
|
29
|
+
register.array? && local_loop_variables.zip(register.array_size) || nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def signals
|
33
|
+
register.declarations[:signal]
|
34
|
+
end
|
35
|
+
|
36
|
+
def body_code(code)
|
37
|
+
register.generate_code(code, :register, :top_down)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register_block, :protocol) do
|
4
|
+
vhdl do
|
5
|
+
shared_context.feature_registry(registry)
|
6
|
+
|
7
|
+
base_feature do
|
8
|
+
build do
|
9
|
+
generic :address_width, {
|
10
|
+
name: 'ADDRESS_WIDTH', type: :positive, default: local_address_width
|
11
|
+
}
|
12
|
+
generic :pre_decode, {
|
13
|
+
name: 'PRE_DECODE', type: :boolean, default: false
|
14
|
+
}
|
15
|
+
generic :base_address, {
|
16
|
+
name: 'BASE_ADDRESS', default: hex(0, 4)
|
17
|
+
}
|
18
|
+
generic :error_status, {
|
19
|
+
name: 'ERROR_STATUS', type: :boolean, default: false
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def bus_width
|
26
|
+
configuration.bus_width
|
27
|
+
end
|
28
|
+
|
29
|
+
def local_address_width
|
30
|
+
register_block.local_address_width
|
31
|
+
end
|
32
|
+
|
33
|
+
def total_registers
|
34
|
+
register_block.files_and_registers.sum(&:count)
|
35
|
+
end
|
36
|
+
|
37
|
+
def byte_size
|
38
|
+
register_block.byte_size
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
factory do
|
43
|
+
def target_feature_key(configuration, _register_block)
|
44
|
+
configuration.protocol
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
u_adapter: entity work.rggen_apb_adaper
|
2
|
+
generic map (
|
3
|
+
ADDRESS_WIDTH => <%= address_width %>,
|
4
|
+
LOCAL_ADDRESS_WIDTH => <%= local_address_width %>,
|
5
|
+
BUS_WIDTH => <%= bus_width %>,
|
6
|
+
REGISTERS => <%= total_registers %>,
|
7
|
+
PRE_DECODE => <%= pre_decode %>,
|
8
|
+
BASE_ADDRESS => <%= base_address %>,
|
9
|
+
BYTE_SIZE => <%= byte_size %>,
|
10
|
+
ERROR_STATUS => <%= error_status %>
|
11
|
+
)
|
12
|
+
port map (
|
13
|
+
i_clk => <%= register_block.clock %>,
|
14
|
+
i_rst_n => <%= register_block.reset %>,
|
15
|
+
i_psel => <%= psel %>,
|
16
|
+
i_penable => <%= penable %>,
|
17
|
+
i_paddr => <%= paddr %>,
|
18
|
+
i_pprot => <%= pprot %>,
|
19
|
+
i_pwrite => <%= pwrite %>,
|
20
|
+
i_pstrb => <%= pstrb %>,
|
21
|
+
i_pwdata => <%= pwdata %>,
|
22
|
+
o_pready => <%= pready %>,
|
23
|
+
o_prdata => <%= prdata %>,
|
24
|
+
o_pslverr => <%= pslverr %>,
|
25
|
+
o_register_valid => <%= register_block.register_valid %>,
|
26
|
+
o_register_access => <%= register_block.register_access %>,
|
27
|
+
o_register_address => <%= register_block.register_address %>,
|
28
|
+
o_register_write_data => <%= register_block.register_write_data %>,
|
29
|
+
o_register_strobe => <%= register_block.register_strobe %>,
|
30
|
+
i_register_active => <%= register_block.register_active %>,
|
31
|
+
i_register_ready => <%= register_block.register_ready %>,
|
32
|
+
i_register_status => <%= register_block.register_status %>,
|
33
|
+
i_register_read_data => <%= register_block.register_read_data %>
|
34
|
+
);
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
input :psel, { name: 'i_psel' }
|
7
|
+
input :penable, { name: 'i_penable' }
|
8
|
+
input :paddr, { name: 'i_paddr', width: address_width }
|
9
|
+
input :pprot, { name: 'i_pprot', width: 3 }
|
10
|
+
input :pwrite, { name: 'i_pwrite' }
|
11
|
+
input :pstrb, { name: 'i_pstrb', width: bus_width / 8 }
|
12
|
+
input :pwdata, { name: 'i_pwdata', width: bus_width }
|
13
|
+
output :pready, { name: 'o_pready' }
|
14
|
+
output :prdata, { name: 'o_prdata', width: bus_width }
|
15
|
+
output :pslverr, { name: 'o_pslverr' }
|
16
|
+
end
|
17
|
+
|
18
|
+
main_code :register_block, from_template: true
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
u_adapter: entity work.rggen_axi4lite_adapter
|
2
|
+
generic map (
|
3
|
+
ID_WIDTH => <%= id_width %>,
|
4
|
+
ADDRESS_WIDTH => <%= address_width %>,
|
5
|
+
LOCAL_ADDRESS_WIDTH => <%= local_address_width %>,
|
6
|
+
BUS_WIDTH => <%= bus_width %>,
|
7
|
+
REGISTERS => <%= total_registers %>,
|
8
|
+
PRE_DECODE => <%= pre_decode %>,
|
9
|
+
BASE_ADDRESS => <%= base_address %>,
|
10
|
+
BYTE_SIZE => <%= byte_size %>,
|
11
|
+
ERROR_STATUS => <%= error_status %>,
|
12
|
+
WRITE_FIRST => <%= write_first %>
|
13
|
+
)
|
14
|
+
port map (
|
15
|
+
i_clk => <%= register_block.clock %>,
|
16
|
+
i_rst_n => <%= register_block.reset %>,
|
17
|
+
i_awvalid => <%= awvalid %>,
|
18
|
+
o_awready => <%= awready %>,
|
19
|
+
i_awid => <%= awid %>,
|
20
|
+
i_awaddr => <%= awaddr %>,
|
21
|
+
i_awprot => <%= awprot %>,
|
22
|
+
i_wvalid => <%= wvalid %>,
|
23
|
+
o_wready => <%= wready %>,
|
24
|
+
i_wdata => <%= wdata %>,
|
25
|
+
i_wstrb => <%= wstrb %>,
|
26
|
+
o_bvalid => <%= bvalid %>,
|
27
|
+
i_bready => <%= bready %>,
|
28
|
+
o_bid => <%= bid %>,
|
29
|
+
o_bresp => <%= bresp %>,
|
30
|
+
i_arvalid => <%= arvalid %>,
|
31
|
+
o_arready => <%= arready %>,
|
32
|
+
i_arid => <%= arid %>,
|
33
|
+
i_araddr => <%= araddr %>,
|
34
|
+
i_arprot => <%= arprot %>,
|
35
|
+
o_rvalid => <%= rvalid %>,
|
36
|
+
i_rready => <%= rready %>,
|
37
|
+
o_rid => <%= rid %>,
|
38
|
+
o_rdata => <%= rdata %>,
|
39
|
+
o_rresp => <%= rresp %>,
|
40
|
+
o_register_valid => <%= register_block.register_valid %>,
|
41
|
+
o_register_access => <%= register_block.register_access %>,
|
42
|
+
o_register_address => <%= register_block.register_address %>,
|
43
|
+
o_register_write_data => <%= register_block.register_write_data %>,
|
44
|
+
o_register_strobe => <%= register_block.register_strobe %>,
|
45
|
+
i_register_active => <%= register_block.register_active %>,
|
46
|
+
i_register_ready => <%= register_block.register_ready %>,
|
47
|
+
i_register_status => <%= register_block.register_status %>,
|
48
|
+
i_register_read_data => <%= register_block.register_read_data %>
|
49
|
+
);
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
generic :id_width, { name: 'ID_WIDTH', type: :natural, default: 0 }
|
7
|
+
generic :write_first, { name: 'WRITE_FIRST', type: :boolean, default: true }
|
8
|
+
|
9
|
+
input :awvalid, { name: 'i_awvalid' }
|
10
|
+
output :awready, { name: 'o_awready' }
|
11
|
+
input :awid, { name: 'i_awid', width: id_width_value }
|
12
|
+
input :awaddr, { name: 'i_awaddr', width: address_width }
|
13
|
+
input :awprot, { name: 'i_awprot', width: 3 }
|
14
|
+
input :wvalid, { name: 'i_wvalid' }
|
15
|
+
output :wready, { name: 'o_wready' }
|
16
|
+
input :wdata, { name: 'i_wdata', width: bus_width }
|
17
|
+
input :wstrb, { name: 'i_wstrb', width: bus_width / 8 }
|
18
|
+
output :bvalid, { name: 'o_bvalid' }
|
19
|
+
input :bready, { name: 'i_bready' }
|
20
|
+
output :bid, { name: 'o_bid', width: id_width_value }
|
21
|
+
output :bresp, { name: 'o_bresp', width: 2 }
|
22
|
+
input :arvalid, { name: 'i_arvalid' }
|
23
|
+
output :arready, { name: 'o_arready' }
|
24
|
+
input :arid, { name: 'i_arid', width: id_width_value }
|
25
|
+
input :araddr, { name: 'i_araddr', width: address_width }
|
26
|
+
input :arprot, { name: 'i_arprot', width: 3 }
|
27
|
+
output :rvalid, { name: 'o_rvalid' }
|
28
|
+
input :rready, { name: 'i_rready' }
|
29
|
+
output :rid, { name: 'o_rid', width: id_width_value }
|
30
|
+
output :rdata, { name: 'o_rdata', width: bus_width }
|
31
|
+
output :rresp, { name: 'o_rresp', width: 2 }
|
32
|
+
end
|
33
|
+
|
34
|
+
main_code :register_block, from_template: true
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def id_width_value
|
39
|
+
"clip_id_width(#{id_width})"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
library ieee;
|
2
|
+
use ieee.std_logic_1164.all;
|
3
|
+
use ieee.numeric_std.all;
|
4
|
+
|
5
|
+
use work.rggen_rtl.all;
|
6
|
+
|
7
|
+
entity <%= register_block.name %> is
|
8
|
+
generic (
|
9
|
+
<% generic_declarations.each do |declaration| %>
|
10
|
+
<%= declaration %>
|
11
|
+
<% end %>
|
12
|
+
);
|
13
|
+
port (
|
14
|
+
<% port_declarations.each do |declaration| %>
|
15
|
+
<%= declaration %>
|
16
|
+
<% end %>
|
17
|
+
);
|
18
|
+
end <%= register_block.name %>;
|
19
|
+
|
20
|
+
architecture rtl of <%= register_block.name %> is
|
21
|
+
<% signal_declarations.each do |declaration| %>
|
22
|
+
<%= declaration %>;
|
23
|
+
<% end %>
|
24
|
+
begin
|
25
|
+
<%= architecture_body_code.to_s.chomp %>
|
26
|
+
end rtl;
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_block, :vhdl_top) do
|
4
|
+
vhdl do
|
5
|
+
build do
|
6
|
+
input :clock, { name: 'i_clk' }
|
7
|
+
input :reset, { name: 'i_rst_n' }
|
8
|
+
|
9
|
+
signal :register_valid
|
10
|
+
signal :register_access, {
|
11
|
+
width: 2
|
12
|
+
}
|
13
|
+
signal :register_address, {
|
14
|
+
width: address_width
|
15
|
+
}
|
16
|
+
signal :register_write_data, {
|
17
|
+
width: bus_width
|
18
|
+
}
|
19
|
+
signal :register_strobe, {
|
20
|
+
width: bus_width / 8
|
21
|
+
}
|
22
|
+
signal :register_active, {
|
23
|
+
array_size: [total_registers]
|
24
|
+
}
|
25
|
+
signal :register_ready, {
|
26
|
+
array_size: [total_registers]
|
27
|
+
}
|
28
|
+
signal :register_status, {
|
29
|
+
width: 2, array_size: [total_registers]
|
30
|
+
}
|
31
|
+
signal :register_read_data, {
|
32
|
+
width: bus_width, array_size: [total_registers]
|
33
|
+
}
|
34
|
+
signal :register_value, {
|
35
|
+
width: value_width, array_size: [total_registers]
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
write_file '<%= register_block.name %>.vhd' do |file|
|
40
|
+
file.body { process_template }
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def total_registers
|
46
|
+
register_block.files_and_registers.sum(&:count)
|
47
|
+
end
|
48
|
+
|
49
|
+
def address_width
|
50
|
+
register_block.local_address_width
|
51
|
+
end
|
52
|
+
|
53
|
+
def bus_width
|
54
|
+
configuration.bus_width
|
55
|
+
end
|
56
|
+
|
57
|
+
def value_width
|
58
|
+
register_block.registers.map(&:width).max
|
59
|
+
end
|
60
|
+
|
61
|
+
def generic_declarations
|
62
|
+
register_block
|
63
|
+
.declarations[:generic]
|
64
|
+
.yield_self(&method(:add_terminator))
|
65
|
+
end
|
66
|
+
|
67
|
+
def port_declarations
|
68
|
+
register_block
|
69
|
+
.declarations[:port]
|
70
|
+
.yield_self(&method(:sort_port_declarations))
|
71
|
+
.yield_self(&method(:add_terminator))
|
72
|
+
end
|
73
|
+
|
74
|
+
def signal_declarations
|
75
|
+
register_block.declarations[:signal]
|
76
|
+
end
|
77
|
+
|
78
|
+
def architecture_body_code
|
79
|
+
code_block(2) do |code|
|
80
|
+
register_block.generate_code(code, :register_block, :top_down)
|
81
|
+
register_block.generate_code(code, :register_file, :top_down, 1)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def sort_port_declarations(declarations)
|
86
|
+
declarations
|
87
|
+
.partition(&method(:clock_or_reset?))
|
88
|
+
.flatten
|
89
|
+
end
|
90
|
+
|
91
|
+
def clock_or_reset?(declaration)
|
92
|
+
[clock.to_s, reset.to_s]
|
93
|
+
.any? { |port_name| declaration.include?(port_name) }
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_terminator(declarations)
|
97
|
+
declarations.map.with_index do |declaration, i|
|
98
|
+
(i == declarations.size - 1) && declaration ||
|
99
|
+
declaration + semicolon
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|