Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
63b10db6
Commit
63b10db6
authored
Apr 12, 2017
by
INOUE Yoshio
Browse files
made generate_pucch3x and rx_pucch
parent
38abafed
Changes
2
Show whitespace changes
Inline
Side-by-side
openair1/PHY/LTE_TRANSPORT/defs.h
View file @
63b10db6
...
...
@@ -777,7 +777,8 @@ typedef enum {
pucch_format1b
,
pucch_format2
,
pucch_format2a
,
pucch_format2b
pucch_format2b
,
pucch_format3
// PUCCH format3
}
PUCCH_FMT_t
;
...
...
openair1/PHY/LTE_TRANSPORT/pucch.c
100644 → 100755
View file @
63b10db6
...
...
@@ -115,6 +115,182 @@ int16_t W3_im[3][6] = {{0 ,0 ,0 },
char
pucch_format_string
[
6
][
20
]
=
{
"format 1
\0
"
,
"format 1a
\0
"
,
"format 1b
\0
"
,
"format 2
\0
"
,
"format 2a
\0
"
,
"format 2b
\0
"
};
/* PUCCH format3 >> */
#define D_I 0
#define D_Q 1
#define D_IQDATA 2
#define D_NSLT1SF 2
#define D_NSYM1SLT 7
#define D_NSYM1SF 2*7
#define D_NSC1RB 12
#define D_NRB1PUCCH 2
#define D_NPUCCH_SF5 5
#define D_NPUCCH_SF4 4
uint8_t
chcod_tbl
[
128
][
48
]
=
{
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
},
{
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
},
{
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
},
{
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
},
{
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
},
{
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
},
{
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
},
{
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
},
{
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
},
{
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
},
{
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
},
{
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
},
{
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
},
{
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
},
{
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
},
{
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
},
{
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
},
{
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
},
{
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
},
{
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
{
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
},
{
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
},
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
},
{
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
},
{
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
},
{
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
},
{
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
},
{
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
},
{
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
},
{
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
},
{
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
},
{
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
},
{
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
},
{
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
},
{
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
},
{
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
},
{
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
},
{
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
},
{
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
},
{
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
},
{
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
},
{
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
},
{
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
},
{
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
},
{
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
},
{
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
},
{
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
},
{
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
},
{
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
},
{
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
},
{
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
},
{
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
},
{
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
},
{
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
},
{
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
},
{
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
},
{
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
},
{
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
},
{
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
},
{
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
},
{
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
},
{
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
},
{
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
},
{
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
},
{
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
},
{
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
},
{
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
},
{
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
},
{
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
},
{
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
},
{
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
},
{
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
},
{
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
},
{
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
},
{
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
},
{
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
},
{
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
},
{
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
},
{
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
},
{
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
},
{
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
},
{
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
1
},
{
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
},
{
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
},
{
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
},
{
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
},
{
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
},
{
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
},
{
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
},
{
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
},
{
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
},
{
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
},
{
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
},
{
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
},
{
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
1
},
{
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
},
{
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
},
{
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
},
{
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
},
{
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
1
},
{
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
1
,
0
},
{
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
},
{
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
1
}
};
// W5_TBL
int16_t
W5_fmt3_re
[
5
][
5
]
=
{
{
32767
,
32767
,
32767
,
32767
,
32767
},
{
32767
,
10125
,
-
26509
,
-
26509
,
10125
},
{
32767
,
-
26509
,
10125
,
10125
,
-
26509
},
{
32767
,
-
26509
,
10125
,
10125
,
-
26509
},
{
32767
,
10125
,
-
26509
,
-
26509
,
10125
}
};
int16_t
W5_fmt3_im
[
5
][
5
]
=
{
{
0
,
0
,
0
,
0
,
0
},
{
0
,
31163
,
19259
,
-
19259
,
-
31163
},
{
0
,
19259
,
-
31163
,
31163
,
-
19259
},
{
0
,
-
19259
,
31163
,
-
31163
,
19259
},
{
0
,
-
31163
,
-
19259
,
19259
,
31163
}
};
int16_t
W4_fmt3
[
4
][
4
]
=
{
{
32767
,
32767
,
32767
,
32767
},
{
32767
,
-
32767
,
32767
,
-
32767
},
{
32767
,
32767
,
-
32767
,
-
32767
},
{
32767
,
-
32767
,
-
32767
,
32767
}
};
// W2 TBL
int16_t
W2
[
2
]
=
{
32767
,
32767
};
// e^j*pai*floor (ncs_cell(ns,l)/64)/2
int16_t
RotTBL_re
[
4
]
=
{
32767
,
0
,
-
32767
,
0
};
int16_t
RotTBL_im
[
4
]
=
{
0
,
32767
,
0
,
-
32767
};
//np4_tbl, np5_tbl
uint8_t
Np5_TBL
[
5
]
=
{
0
,
3
,
6
,
8
,
10
};
uint8_t
Np4_TBL
[
4
]
=
{
0
,
3
,
6
,
9
};
// alpha_TBL
int16_t
alphaTBL_re
[
12
]
=
{
32767
,
28377
,
16383
,
0
,
-
16383
,
-
28377
,
-
32767
,
-
28377
,
-
16383
,
0
,
16383
,
28377
};
int16_t
alphaTBL_im
[
12
]
=
{
0
,
16383
,
28377
,
32767
,
28377
,
16383
,
0
,
-
16383
,
-
28377
,
-
32767
,
-
28377
,
-
16383
};
/* PUCCH format3 << */
void
generate_pucch1x
(
int32_t
**
txdataF
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
ncs_cell
[
20
][
7
],
...
...
@@ -660,11 +836,928 @@ void generate_pucch2x(int32_t **txdataF,
}
}
/* PUCCH format3 >> */
/* DFT */
void
pucchfmt3_Dft
(
int16_t
*
x
,
int16_t
*
y
)
{
int16_t
i
,
k
;
int16_t
tmp
[
2
];
int16_t
calctmp
[
D_NSC1RB
*
2
]
=
{
0
};
for
(
i
=
0
;
i
<
D_NSC1RB
;
i
++
)
{
for
(
k
=
0
;
k
<
D_NSC1RB
;
k
++
)
{
tmp
[
0
]
=
alphaTBL_re
[(
12
-
((
i
*
k
)
%
12
))
%
12
];
tmp
[
1
]
=
alphaTBL_im
[(
12
-
((
i
*
k
)
%
12
))
%
12
];
calctmp
[
2
*
i
]
+=
(((
int32_t
)
x
[
2
*
k
]
*
tmp
[
0
]
-
(
int32_t
)
x
[
2
*
k
+
1
]
*
tmp
[
1
])
>>
15
);
calctmp
[
2
*
i
+
1
]
+=
(((
int32_t
)
x
[
2
*
k
+
1
]
*
tmp
[
0
]
+
(
int32_t
)
x
[
2
*
k
]
*
tmp
[
1
])
>>
15
);
}
y
[
2
*
i
]
=
(
int16_t
)(
(
double
)
calctmp
[
2
*
i
]
/
sqrt
(
D_NSC1RB
));
y
[
2
*
i
+
1
]
=
(
int16_t
)((
double
)
calctmp
[
2
*
i
+
1
]
/
sqrt
(
D_NSC1RB
));
}
}
void
generate_pucch3x
(
int32_t
**
txdataF
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
ncs_cell
[
20
][
7
],
PUCCH_FMT_t
fmt
,
PUCCH_CONFIG_DEDICATED
*
pucch_config_dedicated
,
uint16_t
n3_pucch
,
uint8_t
shortened_format
,
uint8_t
*
payload
,
int16_t
amp
,
uint8_t
subframe
,
uint16_t
rnti
)
{
uint32_t
u
,
v
,
n
;
uint16_t
i
,
j
,
re_offset
;
uint32_t
z
[
12
*
14
],
*
zptr
;
uint32_t
y_tilda
[
12
*
14
]
=
{},
*
y_tilda_ptr
;
uint8_t
ns
,
nsymb
,
n_oc
,
n_oc0
,
n_oc1
;
uint8_t
N_UL_symb
=
(
frame_parms
->
Ncp
==
0
)
?
7
:
6
;
uint8_t
m
,
l
;
uint8_t
n_cs
;
int16_t
tmp_re
,
tmp_im
,
W_re
=
0
,
W_im
=
0
;
int32_t
*
txptr
;
uint32_t
symbol_offset
;
uint32_t
u0
=
(
frame_parms
->
Nid_cell
+
frame_parms
->
pusch_config_common
.
ul_ReferenceSignalsPUSCH
.
grouphop
[
subframe
<<
1
])
%
30
;
uint32_t
u1
=
(
frame_parms
->
Nid_cell
+
frame_parms
->
pusch_config_common
.
ul_ReferenceSignalsPUSCH
.
grouphop
[
1
+
(
subframe
<<
1
)])
%
30
;
uint32_t
v0
=
frame_parms
->
pusch_config_common
.
ul_ReferenceSignalsPUSCH
.
seqhop
[
subframe
<<
1
];
uint32_t
v1
=
frame_parms
->
pusch_config_common
.
ul_ReferenceSignalsPUSCH
.
seqhop
[
1
+
(
subframe
<<
1
)];
// variables for channel coding
uint8_t
chcod_tbl_idx
=
0
;
uint8_t
chcod_dt
[
48
]
=
{};
// variables for Scrambling
uint32_t
cinit
=
0
;
uint32_t
x1
;
uint32_t
s
,
s0
,
s1
;
uint8_t
C
[
48
]
=
{};
uint8_t
scr_dt
[
48
]
=
{};
// variables for Modulation
int16_t
d_re
[
24
]
=
{};
int16_t
d_im
[
24
]
=
{};
// variables for orthogonal sequence selection
uint8_t
N_PUCCH_SF0
=
5
;
uint8_t
N_PUCCH_SF1
=
(
shortened_format
==
0
)
?
5
:
4
;
uint8_t
first_slot
=
0
;
int16_t
rot_re
=
0
;
int16_t
rot_im
=
0
;
uint8_t
dt_offset
;
uint8_t
sym_offset
;
int16_t
y_re
[
14
][
12
]
=
{
0
};
int16_t
y_im
[
14
][
12
]
=
{
0
};
// DMRS
uint8_t
alpha_idx
=
0
;
uint8_t
m_alpha_idx
=
0
;
// Channel Coding
for
(
uint8_t
i
=
0
;
i
<
7
;
i
++
)
{
chcod_tbl_idx
+=
(
payload
[
i
]
<<
i
);
}
// Scrambling
cinit
=
(
subframe
+
1
)
*
((
2
*
frame_parms
->
Nid_cell
+
1
)
<<
16
)
+
rnti
;
s0
=
lte_gold_generic
(
&
x1
,
&
cinit
,
1
);
s1
=
lte_gold_generic
(
&
x1
,
&
cinit
,
0
);
for
(
i
=
0
;
i
<
48
;
i
++
)
{
s
=
(
i
<
32
)
?
s0
:
s1
;
j
=
(
i
<
32
)
?
i
:
(
i
-
32
);
C
[
i
]
=
((
s
>>
j
)
&
1
);
}
for
(
i
=
0
;
i
<
48
;
i
++
)
{
scr_dt
[
i
]
=
chcod_tbl
[
chcod_tbl_idx
][
i
]
^
C
[
i
];
}
// Modulation
for
(
uint8_t
i
=
0
;
i
<
48
;
i
+=
2
){
if
(
scr_dt
[
i
]
==
0
&&
scr_dt
[
i
+
1
]
==
0
){
d_re
[
i
>>
1
]
=
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
d_im
[
i
>>
1
]
=
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
}
else
if
(
scr_dt
[
i
]
==
0
&&
scr_dt
[
i
+
1
]
==
1
)
{
d_re
[
i
>>
1
]
=
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
d_im
[
i
>>
1
]
=
-
1
*
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
}
else
if
(
scr_dt
[
i
]
==
1
&&
scr_dt
[
i
+
1
]
==
0
)
{
d_re
[
i
>>
1
]
=
-
1
*
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
d_im
[
i
>>
1
]
=
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
}
else
if
(
scr_dt
[
i
]
==
1
&&
scr_dt
[
i
+
1
]
==
1
)
{
d_re
[
i
>>
1
]
=
-
1
*
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
d_im
[
i
>>
1
]
=
-
1
*
((
ONE_OVER_SQRT2_Q15
*
amp
)
>>
15
);
}
else
{
//***log Modulation Error!
}
}
// Calculate Orthogonal Sequence index
n_oc0
=
n3_pucch
%
N_PUCCH_SF1
;
if
(
N_PUCCH_SF1
==
5
)
{
n_oc1
=
(
3
*
n_oc0
)
%
N_PUCCH_SF1
;
}
else
{
n_oc1
=
n_oc0
%
N_PUCCH_SF1
;
}
y_tilda_ptr
=
y_tilda
;
zptr
=
z
;
// loop over 2 slots
for
(
ns
=
(
subframe
<<
1
),
u
=
u0
,
v
=
v0
;
ns
<
(
2
+
(
subframe
<<
1
));
ns
++
,
u
=
u1
,
v
=
v1
)
{
first_slot
=
(
ns
==
(
subframe
<<
1
))
?
1
:
0
;
//loop over symbols in slot
for
(
l
=
0
;
l
<
N_UL_symb
;
l
++
)
{
rot_re
=
RotTBL_re
[(
uint8_t
)
ncs_cell
[
ns
][
l
]
/
64
]
;
rot_im
=
RotTBL_im
[(
uint8_t
)
ncs_cell
[
ns
][
l
]
/
64
]
;
// Comput W_noc(m) (36.211 p. 19)
if
(
first_slot
==
0
&&
shortened_format
==
1
)
{
// second slot and shortened format
n_oc
=
n_oc1
;
if
(
l
<
1
)
{
// data
W_re
=
W4_fmt3
[
n_oc
][
l
];
W_im
=
0
;
}
else
if
(
l
==
1
)
{
// DMRS
W_re
=
W2
[
0
];
W_im
=
0
;
}
else
if
(
l
>=
2
&&
l
<
5
)
{
// data
W_re
=
W4_fmt3
[
n_oc
][
l
-
1
];
W_im
=
0
;
}
else
if
(
l
==
5
)
{
// DMRS
W_re
=
W2
[
1
];
W_im
=
0
;
}
else
if
((
l
>=
N_UL_symb
-
2
))
{
// data
;
}
else
{
//***log W Select Error!
}
}
else
{
if
(
first_slot
==
1
)
{
// 1st slot or 2nd slot and not shortened
n_oc
=
n_oc0
;
}
else
{
n_oc
=
n_oc1
;
}
if
(
l
<
1
)
{
// data
W_re
=
W5_fmt3_re
[
n_oc
][
l
];
W_im
=
W5_fmt3_im
[
n_oc
][
l
];
}
else
if
(
l
==
1
)
{
// DMRS
W_re
=
W2
[
0
];
W_im
=
0
;
}
else
if
(
l
>=
2
&&
l
<
5
)
{
// data
W_re
=
W5_fmt3_re
[
n_oc
][
l
-
1
];
W_im
=
W5_fmt3_im
[
n_oc
][
l
-
1
];
}
else
if
(
l
==
5
)
{
// DMRS
W_re
=
W2
[
1
];
W_im
=
0
;
}
else
if
((
l
>=
N_UL_symb
-
1
))
{
// data
W_re
=
W5_fmt3_re
[
n_oc
][
l
-
N_UL_symb
+
5
];
W_im
=
W5_fmt3_im
[
n_oc
][
l
-
N_UL_symb
+
5
];
}
else
{
//***log W Select Error!
}
}
// W Selection end
// Compute n_cs (36.211 p. 18)
n_cs
=
ncs_cell
[
ns
][
l
];
if
(
N_PUCCH_SF1
==
5
)
{
alpha_idx
=
(
n_cs
+
Np5_TBL
[
n_oc
])
%
12
;
}
else
{
alpha_idx
=
(
n_cs
+
Np4_TBL
[
n_oc
])
%
12
;
}
// generate pucch data
dt_offset
=
(
first_slot
==
1
)
?
0
:
12
;
sym_offset
=
(
first_slot
==
1
)
?
0
:
7
;
for
(
i
=
0
;
i
<
12
;
i
++
)
{
// Calculate yn(i)
tmp_re
=
(((
int32_t
)
(
W_re
*
rot_re
-
W_im
*
rot_im
))
>>
15
);
tmp_im
=
(((
int32_t
)
(
W_re
*
rot_im
+
W_im
*
rot_re
))
>>
15
);
y_re
[
l
+
sym_offset
][
i
]
=
(((
int32_t
)
(
tmp_re
*
d_re
[
i
+
dt_offset
]
-
tmp_im
*
d_im
[
i
+
dt_offset
]))
>>
15
);
y_im
[
l
+
sym_offset
][
i
]
=
(((
int32_t
)
(
tmp_re
*
d_im
[
i
+
dt_offset
]
+
tmp_im
*
d_re
[
i
+
dt_offset
]))
>>
15
);
// cyclic shift
((
int16_t
*
)
&
y_tilda_ptr
[(
l
+
sym_offset
)
*
12
+
(
i
-
(
ncs_cell
[
ns
][
l
]
%
12
)
+
12
)
%
12
])[
0
]
=
y_re
[
l
+
sym_offset
][
i
];
((
int16_t
*
)
&
y_tilda_ptr
[(
l
+
sym_offset
)
*
12
+
(
i
-
(
ncs_cell
[
ns
][
l
]
%
12
)
+
12
)
%
12
])[
1
]
=
y_im
[
l
+
sym_offset
][
i
];
// DMRS