Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
b063c431
Commit
b063c431
authored
Sep 13, 2018
by
Hongzhi Wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nr ue adding dlsch_modulation
parent
debde9f2
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2565 additions
and
47 deletions
+2565
-47
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-0
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+2532
-0
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+17
-34
openair1/PHY/phy_extern_nr_ue.h
openair1/PHY/phy_extern_nr_ue.h
+3
-1
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+12
-12
No files found.
cmake_targets/CMakeLists.txt
View file @
b063c431
...
@@ -1324,6 +1324,7 @@ set(PHY_SRC_UE
...
@@ -1324,6 +1324,7 @@ set(PHY_SRC_UE
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dmrs_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dmrs_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_pbch.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_pbch.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dci_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dci_nr.c
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
0 → 100644
View file @
b063c431
This source diff could not be displayed because it is too large. You can
view the blob
instead.
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
b063c431
...
@@ -708,7 +708,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
...
@@ -708,7 +708,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param high_speed_flag
@param high_speed_flag
@param frame_parms Pointer to frame descriptor
@param frame_parms Pointer to frame descriptor
*/
*/
uint16_t
dlsch_extract_rbs_single
(
int32_t
**
rxdataF
,
/*uint16_t nr_
dlsch_extract_rbs_single(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
int32_t **dl_ch_estimates_ext,
...
@@ -718,6 +718,20 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
...
@@ -718,6 +718,20 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
uint8_t symbol,
uint8_t symbol,
uint8_t subframe,
uint8_t subframe,
uint32_t high_speed_flag,
uint32_t high_speed_flag,
NR_DL_FRAME_PARMS *frame_parms);*/
unsigned
short
nr_dlsch_extract_rbs_single
(
int
**
rxdataF
,
int
**
dl_ch_estimates
,
int
**
rxdataF_ext
,
int
**
dl_ch_estimates_ext
,
unsigned
short
pmi
,
unsigned
char
*
pmi_ext
,
unsigned
int
*
rb_alloc
,
unsigned
char
symbol
,
unsigned
short
start_rb
,
unsigned
short
nb_pdsch_rb
,
unsigned
char
nr_tti_rx
,
uint32_t
high_speed_flag
,
NR_DL_FRAME_PARMS
*
frame_parms
);
NR_DL_FRAME_PARMS
*
frame_parms
);
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
...
@@ -953,7 +967,7 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
...
@@ -953,7 +967,7 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
uint8_t
pilots_flag
,
uint8_t
pilots_flag
,
uint16_t
nb_rb
);
uint16_t
nb_rb
);
void
dlsch_scale_channel
(
int32_t
**
dl_ch_estimates_ext
,
void
nr_
dlsch_scale_channel
(
int32_t
**
dl_ch_estimates_ext
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_UE_DLSCH_t
**
dlsch_ue
,
NR_UE_DLSCH_t
**
dlsch_ue
,
uint8_t
symbol_mod
,
uint8_t
symbol_mod
,
...
@@ -1385,37 +1399,6 @@ uint32_t ulsch_encoding(uint8_t *a,
...
@@ -1385,37 +1399,6 @@ uint32_t ulsch_encoding(uint8_t *a,
uint8_t
control_only_flag
,
uint8_t
control_only_flag
,
uint8_t
Nbundled
);
uint8_t
Nbundled
);
/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
@param phy_vars_ue Pointer to UE variables
@param proc Pointer to RXN_TXNp4 proc
@param subframe Subframe of received PDCCH/PHICH
@param eNB_id Index of eNB
*/
void
rx_phich
(
PHY_VARS_NR_UE
*
phy_vars_ue
,
UE_nr_rxtx_proc_t
*
proc
,
uint8_t
subframe
,
uint8_t
eNB_id
);
/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH subframe (Table 8.3.-1 from 36.213).
@param frame_parms Pointer to DL frame configuration parameters
@param subframe Subframe of received/transmitted PHICH
@returns subframe of PUSCH transmission
*/
uint8_t
phich_subframe2_pusch_subframe
(
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
);
/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH frame (Table 8.3.-1 from 36.213).
@param frame_parms Pointer to DL frame configuration parameters
@param frame Frame of received/transmitted PHICH
@param subframe Subframe of received/transmitted PHICH
@returns frame of PUSCH transmission
*/
int
phich_frame2_pusch_frame
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
int
subframe
);
void
print_CQI
(
void
*
o
,
UCI_format_t
uci_format
,
uint8_t
eNB_id
,
int
N_RB_DL
);
void
print_CQI
(
void
*
o
,
UCI_format_t
uci_format
,
uint8_t
eNB_id
,
int
N_RB_DL
);
void
fill_CQI
(
NR_UE_ULSCH_t
*
ulsch
,
PHY_NR_MEASUREMENTS
*
meas
,
uint8_t
eNB_id
,
uint8_t
harq_pid
,
int
N_RB_DL
,
rnti_t
rnti
,
uint8_t
trans_mode
,
double
sinr_eff
);
void
fill_CQI
(
NR_UE_ULSCH_t
*
ulsch
,
PHY_NR_MEASUREMENTS
*
meas
,
uint8_t
eNB_id
,
uint8_t
harq_pid
,
int
N_RB_DL
,
rnti_t
rnti
,
uint8_t
trans_mode
,
double
sinr_eff
);
...
...
openair1/PHY/phy_extern_nr_ue.h
View file @
b063c431
...
@@ -32,7 +32,9 @@ extern char fmageren_name2[512];
...
@@ -32,7 +32,9 @@ extern char fmageren_name2[512];
extern
unsigned
int
RX_DMA_BUFFER
[
4
][
NB_ANTENNAS_RX
];
extern
unsigned
int
RX_DMA_BUFFER
[
4
][
NB_ANTENNAS_RX
];
extern
unsigned
int
TX_DMA_BUFFER
[
4
][
NB_ANTENNAS_TX
];
extern
unsigned
int
TX_DMA_BUFFER
[
4
][
NB_ANTENNAS_TX
];
#include "PHY/LTE_TRANSPORT/transport_extern.h"
//#include "PHY/LTE_TRANSPORT/transport_extern.h"
extern
short
conjugate
[
8
],
conjugate2
[
8
];
extern
int
number_of_cards
;
extern
int
number_of_cards
;
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
b063c431
...
@@ -4018,7 +4018,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t
...
@@ -4018,7 +4018,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
}*/
}*/
void
ue_pdsch_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
eNB_id
,
PDSCH_t
pdsch
,
NR_UE_DLSCH_t
*
dlsch0
,
NR_UE_DLSCH_t
*
dlsch1
,
int
s0
,
int
s1
,
int
abstraction_flag
)
{
void
nr_
ue_pdsch_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
eNB_id
,
PDSCH_t
pdsch
,
NR_UE_DLSCH_t
*
dlsch0
,
NR_UE_DLSCH_t
*
dlsch1
,
int
s0
,
int
s1
,
int
abstraction_flag
)
{
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
int
m
;
int
m
;
...
@@ -4078,7 +4078,7 @@ void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id
...
@@ -4078,7 +4078,7 @@ void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id
start_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
ue
->
current_thread_id
[
nr_tti_rx
]][
slot
]);
start_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
ue
->
current_thread_id
[
nr_tti_rx
]][
slot
]);
#endif
#endif
// process DLSCH received in first slot
// process DLSCH received in first slot
rx_pdsch
(
ue
,
nr_
rx_pdsch
(
ue
,
pdsch
,
pdsch
,
eNB_id
,
eNB_id
,
eNB_id_i
,
eNB_id_i
,
...
@@ -5597,7 +5597,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5597,7 +5597,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#endif
#endif
#endif
#endif
#if 0
//
#if 0
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
//to update from pdsch config
//to update from pdsch config
nr_gold_pdsch
(
ue
,
0
,
0
,
1
);
nr_gold_pdsch
(
ue
,
0
,
0
,
1
);
...
@@ -5616,7 +5616,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5616,7 +5616,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for C-RNTI
// do procedures for C-RNTI
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
active
==
1
)
{
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
PDSCH
,
PDSCH
,
...
@@ -5633,7 +5633,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5633,7 +5633,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
SI_PDSCH
,
SI_PDSCH
,
...
@@ -5648,7 +5648,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5648,7 +5648,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
P_PDSCH
,
P_PDSCH
,
...
@@ -5663,7 +5663,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5663,7 +5663,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for RA-RNTI
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
RA_PDSCH
,
RA_PDSCH
,
...
@@ -5740,7 +5740,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5740,7 +5740,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#if UE_TIMING_TRACE
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
pdsch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
start_meas
(
&
ue
->
pdsch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
#endif
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
PDSCH
,
PDSCH
,
...
@@ -5805,7 +5805,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5805,7 +5805,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
SI_PDSCH
,
SI_PDSCH
,
...
@@ -5829,7 +5829,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5829,7 +5829,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for P-RNTI
// do procedures for P-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
P_PDSCH
,
P_PDSCH
,
...
@@ -5852,7 +5852,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5852,7 +5852,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
}
}
// do procedures for RA-RNTI
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
RA_PDSCH
,
RA_PDSCH
,
...
@@ -5936,7 +5936,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5936,7 +5936,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#endif
#endif
#endif
#endif
#endif //pdsch
//
#endif //pdsch
LOG_D
(
PHY
,
" ****** end RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
LOG_D
(
PHY
,
" ****** end RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
return
(
0
);
return
(
0
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment