Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
H
HDL
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RTSD
HDL
Commits
58e360b0
Commit
58e360b0
authored
Apr 18, 2016
by
Reinier van der Walle
Browse files
Options
Downloads
Patches
Plain Diff
added alignment
parent
2f53a5ae
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
applications/compaan/designs/compaan_unb1_10g_bg_db/src/vhdl/compaan_unb1_10g_bg_db.vhd
+71
-91
71 additions, 91 deletions
...ompaan_unb1_10g_bg_db/src/vhdl/compaan_unb1_10g_bg_db.vhd
with
71 additions
and
91 deletions
applications/compaan/designs/compaan_unb1_10g_bg_db/src/vhdl/compaan_unb1_10g_bg_db.vhd
+
71
−
91
View file @
58e360b0
...
@@ -112,7 +112,7 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
...
@@ -112,7 +112,7 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
CONSTANT
c_use_1GbE
:
BOOLEAN
:
=
TRUE
;
CONSTANT
c_use_1GbE
:
BOOLEAN
:
=
TRUE
;
CONSTANT
c_nof_streams
:
NATURAL
:
=
1
;
CONSTANT
c_nof_streams
:
NATURAL
:
=
1
;
CONSTANT
c_nof_10GbE_streams
:
NATURAL
:
=
c_nof_streams
;
CONSTANT
c_nof_10GbE_streams
:
NATURAL
:
=
c_nof_streams
;
CONSTANT
c_nof_bsn_mon_streams
:
NATURAL
:
=
4
;
CONSTANT
c_nof_bsn_mon_streams
:
NATURAL
:
=
5
;
CONSTANT
c_data_w
:
NATURAL
:
=
64
;
-- c_tech_tse_data_w;
CONSTANT
c_data_w
:
NATURAL
:
=
64
;
-- c_tech_tse_data_w;
...
@@ -133,14 +133,16 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
...
@@ -133,14 +133,16 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
-- dp_offload_tx
-- dp_offload_tx
-- . IP total length : 2948 (UDP total lenth) + 20 (Ip header length) = 2968
-- . IP total length : 2948 (UDP total lenth) + 20 (Ip header length) = 2968
-- . UDP total length: 8 (UDP header) + 20 (usr header) + 2920 (payload bytes) = 2948 -- 1488
-- . UDP total length: 8 (UDP header) + 20 (usr header) + 2920 (payload bytes) = 2948 -- 1488
CONSTANT
c_nof_hdr_fields
:
NATURAL
:
=
3
+
12
+
4
+
9
;
-- Total header bits = 512
CONSTANT
c_ip_length
:
NATURAL
:
=
2970
;
CONSTANT
c_udp_length
:
NATURAL
:
=
2950
;
CONSTANT
c_nof_hdr_fields
:
NATURAL
:
=
3
+
12
+
4
+
9
+
1
;
-- Total header bits = 512
CONSTANT
c_hdr_field_arr
:
t_common_field_arr
(
c_nof_hdr_fields
-1
DOWNTO
0
)
:
=
(
(
field_name_pad
(
"eth_dst_mac"
),
" "
,
48
,
field_default
(
0
)
),
CONSTANT
c_hdr_field_arr
:
t_common_field_arr
(
c_nof_hdr_fields
-1
DOWNTO
0
)
:
=
(
(
field_name_pad
(
"eth_dst_mac"
),
" "
,
48
,
field_default
(
0
)
),
(
field_name_pad
(
"eth_src_mac"
),
" "
,
48
,
field_default
(
0
)
),
(
field_name_pad
(
"eth_src_mac"
),
" "
,
48
,
field_default
(
0
)
),
(
field_name_pad
(
"eth_type"
),
" "
,
16
,
field_default
(
x"0800"
)
),
(
field_name_pad
(
"eth_type"
),
" "
,
16
,
field_default
(
x"0800"
)
),
(
field_name_pad
(
"ip_version"
),
" "
,
4
,
field_default
(
4
)
),
(
field_name_pad
(
"ip_version"
),
" "
,
4
,
field_default
(
4
)
),
(
field_name_pad
(
"ip_header_length"
),
" "
,
4
,
field_default
(
5
)
),
(
field_name_pad
(
"ip_header_length"
),
" "
,
4
,
field_default
(
5
)
),
(
field_name_pad
(
"ip_services"
),
" "
,
8
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_services"
),
" "
,
8
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_total_length"
),
" "
,
16
,
field_default
(
2968
)
),
--1508) ),
(
field_name_pad
(
"ip_total_length"
),
" "
,
16
,
field_default
(
c_ip_length
)
),
--1508) ),
(
field_name_pad
(
"ip_identification"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_identification"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_flags"
),
" "
,
3
,
field_default
(
2
)
),
(
field_name_pad
(
"ip_flags"
),
" "
,
3
,
field_default
(
2
)
),
(
field_name_pad
(
"ip_fragment_offset"
),
" "
,
13
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_fragment_offset"
),
" "
,
13
,
field_default
(
0
)
),
...
@@ -151,7 +153,7 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
...
@@ -151,7 +153,7 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
(
field_name_pad
(
"ip_dst_addr"
),
" "
,
32
,
field_default
(
0
)
),
(
field_name_pad
(
"ip_dst_addr"
),
" "
,
32
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_src_port"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_src_port"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_dst_port"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_dst_port"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_total_length"
),
" "
,
16
,
field_default
(
2948
)
),
--1488) ),
(
field_name_pad
(
"udp_total_length"
),
" "
,
16
,
field_default
(
c_udp_length
)
),
--1488) ),
(
field_name_pad
(
"udp_checksum"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"udp_checksum"
),
" "
,
16
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_sync"
),
" "
,
1
,
field_default
(
1
)
),
(
field_name_pad
(
"usr_sync"
),
" "
,
1
,
field_default
(
1
)
),
(
field_name_pad
(
"usr_bsn"
),
" "
,
60
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_bsn"
),
" "
,
60
,
field_default
(
0
)
),
...
@@ -161,16 +163,23 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
...
@@ -161,16 +163,23 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
(
field_name_pad
(
"usr_hdr_field_3"
),
" "
,
33
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_3"
),
" "
,
33
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_4"
),
" "
,
5
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_4"
),
" "
,
5
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_5"
),
" "
,
8
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_5"
),
" "
,
8
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_field_6"
),
" "
,
27
,
field_default
(
0
)
)
);
(
field_name_pad
(
"usr_hdr_field_6"
),
" "
,
27
,
field_default
(
0
)
),
(
field_name_pad
(
"usr_hdr_word_align"
),
" "
,
16
,
field_default
(
0
)
)
);
CONSTANT
c_hdr_field_ovr_init
:
STD_LOGIC_VECTOR
(
c_nof_hdr_fields
-1
DOWNTO
0
)
:
=
"111"
&
"111111111111"
&
"0011"
&
"101111111"
;
--CONSTANT c_hdr_field_arr : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := c_hdr_field_rx_offload_arr(c_nof_hdr_fields-1 DOWNTO 0);
CONSTANT
c_hdr_field_ovr_init
:
STD_LOGIC_VECTOR
(
c_nof_hdr_fields
-1
DOWNTO
0
)
:
=
"111"
&
"111111111111"
&
"0011"
&
"101111111"
&
"0"
;
CONSTANT
c_fifo_size
:
NATURAL
:
=
2
*
c_bg_block_size
;
CONSTANT
c_fifo_size
:
NATURAL
:
=
2
*
c_bg_block_size
;
CONSTANT
c_use_jumbo_frames
:
BOOLEAN
:
=
FALSE
;
CONSTANT
c_use_jumbo_frames
:
BOOLEAN
:
=
FALSE
;
CONSTANT
c_def_1GbE_block_size
:
NATURAL
:
=
c_bg_block_size
;
CONSTANT
c_def_1GbE_block_size
:
NATURAL
:
=
c_bg_block_size
;
CONSTANT
c_max_frame_len
:
NATURAL
:
=
sel_a_b
(
c_use_jumbo_frames
,
9018
,
2968
);
CONSTANT
c_max_frame_len
:
NATURAL
:
=
sel_a_b
(
c_use_jumbo_frames
,
9018
,
c_ip_length
);
CONSTANT
c_max_frame_nof_words
:
NATURAL
:
=
(
c_max_frame_len
*
c_byte_w
)
/
c_data_w
;
CONSTANT
c_max_frame_nof_words
:
NATURAL
:
=
(
c_max_frame_len
*
c_byte_w
)
/
c_data_w
;
CONSTANT
c_nof_header_words
:
NATURAL
:
=
field_slv_len
(
c_hdr_field_arr
)
/
c_data_w
;
CONSTANT
c_nof_header_words
:
NATURAL
:
=
field_slv_len
(
c_hdr_field_arr
)
/
c_data_w
;
CONSTANT
c_nof_header_bytes
:
NATURAL
:
=
field_slv_len
(
c_hdr_field_arr
)
/
c_byte_w
;
CONSTANT
c_nof_header_bytes
:
NATURAL
:
=
field_slv_len
(
c_hdr_field_arr
)
/
c_byte_w
;
...
@@ -270,21 +279,12 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
...
@@ -270,21 +279,12 @@ ARCHITECTURE str OF compaan_unb1_10g_bg_db IS
SIGNAL
dp_offload_tx_src_out_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_tx_src_out_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_tx_src_in_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_tx_src_in_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_fifo_fill_src_out_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_fifo_fill_src_in_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_snk_out_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_snk_out_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_src_out_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_src_out_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_offload_rx_src_in_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
c_dp_siso_rdy
);
SIGNAL
dp_offload_rx_src_in_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
c_dp_siso_rdy
);
SIGNAL
dp_fifo_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
dp_fifo_snk_out_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
c_dp_siso_rdy
);
SIGNAL
diag_data_buf_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
diag_data_buf_snk_out_arr
:
t_dp_siso_arr
(
c_nof_streams
-1
DOWNTO
0
);
SIGNAL
bsn_monitor_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_bsn_mon_streams
-1
DOWNTO
0
);
SIGNAL
bsn_monitor_snk_in_arr
:
t_dp_sosi_arr
(
c_nof_bsn_mon_streams
-1
DOWNTO
0
);
SIGNAL
bsn_monitor_snk_out_arr
:
t_dp_siso_arr
(
c_nof_bsn_mon_streams
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
c_dp_siso_rdy
);
SIGNAL
bsn_monitor_snk_out_arr
:
t_dp_siso_arr
(
c_nof_bsn_mon_streams
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
c_dp_siso_rdy
);
...
@@ -402,8 +402,8 @@ BEGIN
...
@@ -402,8 +402,8 @@ BEGIN
src_in_arr
=>
dp_offload_rx_snk_out_arr
,
src_in_arr
=>
dp_offload_rx_snk_out_arr
,
-- Data to be send by 10G
-- Data to be send by 10G
snk_out_arr
=>
dp_
fifo_fill
_src_in_arr
,
snk_out_arr
=>
dp_
offload_tx
_src_in_arr
,
snk_in_arr
=>
dp_
fifo_fill
_src_out_arr
,
snk_in_arr
=>
dp_
offload_tx
_src_out_arr
,
-- Serial XAUI IO
-- Serial XAUI IO
xaui_tx_arr
=>
xaui_tx_arr
,
xaui_tx_arr
=>
xaui_tx_arr
,
...
@@ -453,8 +453,8 @@ BEGIN
...
@@ -453,8 +453,8 @@ BEGIN
rst
=>
dp_rst
,
rst
=>
dp_rst
,
clk
=>
dp_clk
,
clk
=>
dp_clk
,
-- ST sink (BG)
-- ST sink (BG)
snk_out
=>
dp_fifo_snk_out
_arr
(
i
),
snk_out
=>
block_gen_src_in
_arr
(
i
),
snk_in
=>
dp_fifo_snk_in
_arr
(
i
),
snk_in
=>
block_gen_src_out
_arr
(
i
),
-- ST source (tx_offload)
-- ST source (tx_offload)
src_in
=>
dp_offload_tx_snk_out_arr
(
i
),
src_in
=>
dp_offload_tx_snk_out_arr
(
i
),
src_out
=>
dp_offload_tx_snk_in_arr
(
i
)
src_out
=>
dp_offload_tx_snk_in_arr
(
i
)
...
@@ -500,20 +500,6 @@ BEGIN
...
@@ -500,20 +500,6 @@ BEGIN
hdr_fields_in_arr
=>
hdr_fields_in_arr
hdr_fields_in_arr
=>
hdr_fields_in_arr
);
);
u_dp_fifo_fill
:
ENTITY
dp_lib
.
dp_fifo_fill
GENERIC
MAP
(
g_data_w
=>
c_data_w
,
g_fifo_fill
=>
c_bg_block_size
+
16
,
g_fifo_size
=>
c_bg_block_size
+
16
+
10
)
PORT
MAP
(
rst
=>
dp_rst
,
clk
=>
dp_clk
,
snk_in
=>
dp_offload_tx_src_out_arr
(
0
),
snk_out
=>
dp_offload_tx_src_in_arr
(
0
),
src_in
=>
dp_fifo_fill_src_in_arr
(
0
),
src_out
=>
dp_fifo_fill_src_out_arr
(
0
)
);
gen_hdr_in_fields
:
FOR
i
IN
0
TO
c_nof_streams
-1
GENERATE
gen_hdr_in_fields
:
FOR
i
IN
0
TO
c_nof_streams
-1
GENERATE
-- dst = src
-- dst = src
...
@@ -529,18 +515,9 @@ BEGIN
...
@@ -529,18 +515,9 @@ BEGIN
hdr_fields_in_arr
(
i
)(
field_hi
(
c_hdr_field_arr
,
"usr_sync"
)
DOWNTO
field_lo
(
c_hdr_field_arr
,
"usr_sync"
))
<=
slv
(
block_gen_src_out_arr
(
i
)
.
sync
);
hdr_fields_in_arr
(
i
)(
field_hi
(
c_hdr_field_arr
,
"usr_sync"
)
DOWNTO
field_lo
(
c_hdr_field_arr
,
"usr_sync"
))
<=
slv
(
block_gen_src_out_arr
(
i
)
.
sync
);
hdr_fields_in_arr
(
i
)(
field_hi
(
c_hdr_field_arr
,
"usr_bsn"
)
DOWNTO
field_lo
(
c_hdr_field_arr
,
"usr_bsn"
))
<=
block_gen_src_out_arr
(
i
)
.
bsn
(
59
DOWNTO
0
);
hdr_fields_in_arr
(
i
)(
field_hi
(
c_hdr_field_arr
,
"usr_bsn"
)
DOWNTO
field_lo
(
c_hdr_field_arr
,
"usr_bsn"
))
<=
block_gen_src_out_arr
(
i
)
.
bsn
(
59
DOWNTO
0
);
END
GENERATE
;
-----------------------------------------------------------------------------
hdr_fields_in_arr
(
i
)(
field_hi
(
c_hdr_field_arr
,
"usr_hdr_word_align"
)
DOWNTO
field_lo
(
c_hdr_field_arr
,
"usr_hdr_word_align"
))
<=
TO_UVEC
(
0
,
16
);
-- Connect BG and DB to dp_offload
END
GENERATE
;
-----------------------------------------------------------------------------
-- BG --> Tx
dp_fifo_snk_in_arr
<=
block_gen_src_out_arr
;
block_gen_src_in_arr
<=
dp_fifo_snk_out_arr
;
-- Rx --> DB
diag_data_buf_snk_in_arr
<=
dp_offload_rx_src_out_arr
;
dp_offload_rx_src_in_arr
<=
diag_data_buf_snk_out_arr
;
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- RX: dp_offload_rx
-- RX: dp_offload_rx
...
@@ -596,16 +573,19 @@ BEGIN
...
@@ -596,16 +573,19 @@ BEGIN
bsn_monitor_snk_in_arr
(
0
)
<=
dp_offload_tx_snk_in_arr
(
0
);
bsn_monitor_snk_in_arr
(
0
)
<=
dp_offload_tx_snk_in_arr
(
0
);
bsn_monitor_snk_out_arr
(
0
)
<=
dp_offload_tx_snk_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
0
)
<=
dp_offload_tx_snk_out_arr
(
0
);
bsn_monitor_snk_in_arr
(
1
)
<=
dp_
fifo_fill
_src_out_arr
(
0
);
bsn_monitor_snk_in_arr
(
1
)
<=
dp_
offload_tx
_src_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
1
)
<=
dp_
fifo_fill
_src_in_arr
(
0
);
bsn_monitor_snk_out_arr
(
1
)
<=
dp_
offload_tx
_src_in_arr
(
0
);
bsn_monitor_snk_in_arr
(
2
)
<=
dp_offload_rx_snk_in_arr
(
0
);
bsn_monitor_snk_in_arr
(
2
)
<=
dp_offload_rx_snk_in_arr
(
0
);
bsn_monitor_snk_out_arr
(
2
)
<=
dp_offload_rx_snk_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
2
)
<=
dp_offload_rx_snk_out_arr
(
0
);
bsn_monitor_snk_in_arr
(
3
)
<=
diag_data_buf_snk_in_arr
(
0
);
bsn_monitor_snk_in_arr
(
3
)
<=
dp_offload_rx_src_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
3
)
<=
diag_data_buf_snk_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
3
)
<=
dp_offload_rx_src_in_arr
(
0
);
bsn_monitor_snk_in_arr
(
4
)
<=
block_gen_src_out_arr
(
0
);
bsn_monitor_snk_out_arr
(
4
)
<=
block_gen_src_in_arr
(
0
);
d
iag_data_buf_snk_out
_arr
<=
(
OTHERS
=>
c_dp_siso_rdy
);
d
p_offload_rx_src_in
_arr
<=
(
OTHERS
=>
c_dp_siso_rdy
);
u_diag_data_buffer
:
ENTITY
diag_lib
.
mms_diag_data_buffer
u_diag_data_buffer
:
ENTITY
diag_lib
.
mms_diag_data_buffer
GENERIC
MAP
(
GENERIC
MAP
(
...
@@ -625,8 +605,8 @@ BEGIN
...
@@ -625,8 +605,8 @@ BEGIN
reg_data_buf_mosi
=>
reg_diag_data_buffer_mosi
,
reg_data_buf_mosi
=>
reg_diag_data_buffer_mosi
,
reg_data_buf_miso
=>
reg_diag_data_buffer_miso
,
reg_data_buf_miso
=>
reg_diag_data_buffer_miso
,
in_sync
=>
d
iag_data_buf_snk_in
_arr
(
0
)
.
sync
,
in_sync
=>
d
p_offload_rx_src_out
_arr
(
0
)
.
sync
,
in_sosi_arr
=>
d
iag_data_buf_snk_in
_arr
in_sosi_arr
=>
d
p_offload_rx_src_out
_arr
);
);
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment