PUCCH carries control information and nothing else, so the question is never how much user data fits. It is what the UE has to say and how many bits that turns into. The answer changes completely depending on which kind of control information is in the payload.
That is why one small block diagram opens this page and four sections follow it. The block is the same in every case. What goes into it, and what comes out, is not.
- Channel Coding Processing for PUCCH
- Channel Coding for HARQ ACK/NACK only
- Channel Coding for CSI Only
- Channel Coding for CSI + HARQ ACK/NACK
- Reference
Channel Coding Processing for PUCCH
Most of the details in this page is based on 36.212 5.2.3 Uplink Control Information on PUCCH. The process in block diagram seems to be simple as shown below. But you will see very complicated procedure in terms of how a( ) vector (a bit array) is composed of and how the a( ) vector is converted to b( ) vector.
< 36.212 >

36.212 Figure 5.2.3-1. The whole of UCI coding as the specification draws it. A and B are not fixed and they are not always equal, and the drawing says nothing about either.
- One box, one input vector and one output vector. The input is a0 to aA-1 and the output is b0 to bB-1.
- Nothing in the drawing says what A is, what B is, or whether they match. Each of the sections below answers those three questions for one kind of payload.
- The relationship is the whole story. HARQ-ACK alone leaves the length untouched, CSI alone forces it to 20, and the two together add.
PUCCH carries three kinds of uplink control information, and this page covers two of them. 36.212 gives HARQ-ACK its own clause at 5.2.3.1 and channel quality information its own at 5.2.3.3. The scheduling request has a third clause at 5.2.3.2, and it does not appear on this page.
The box hides the interesting part : Figure 5.2.3-1 is identical for every payload, so the drawing tells you nothing about the bit count.A and B are the two numbers to track : every section below is really an answer to what A can be and what B becomes.Three UCI types share the channel : HARQ-ACK, CSI and the scheduling request, each with its own clause in 36.212.
Channel Coding for HARQ ACK/NACK only
This is the simplest case in the whole of 36.212 clause 5.2.3, and it is simple for one reason. The payload is already one or two bits long, so there is nothing worth compressing and no room to add redundancy inside the payload itself.
This is for PUCCH carrying only HARQ ACK/NACK data like PUCCH Format1a.
The details of this section is based on 36.212 5.2.3.1 Channel Coding for UCI HARQ-ACK. Followings are several points that you have to remember for basic understanding.
- a( ) is a bit array which is made up of 0 and 1.
- 1 indicates HARQ ACK, 0 indicate HARQ NACK
- In TM 1,2,5,6,7 which are all single codeword transmission, HARQ ACK/NACK for each cell maps to each bit in the a( ) array.
- In TM which are two codeword transmission, HARQ ACK/NACK for each cell to two consecutive bits in the a( ) array.
In this case, the number of bit for a() and b() are same, meaning the number of bits does not change during the channel coding process.
That equality is worth stating plainly, because it means no block code runs here at all. The bits pass through the box in Figure 5.2.3-1 unchanged, and whatever protection they get comes from the PUCCH format around them rather than from coding.
The contrast with the next section is the sharpest on the page. CSI alone is forced to exactly 20 bits however short the input is, while HARQ-ACK alone is left at one or two. Two payloads on the same physical channel, and the coding treats them in opposite ways.
B equals A here and nowhere else : the HARQ-ACK case is the only one on this page where the output length matches the input.No block code means no coding gain : the reliability comes from the PUCCH format and its repetition across slots, not from the bits themselves.Transmission mode decides A : one bit per cell for single codeword modes, and two consecutive bits per cell for two codeword modes.
Channel Coding for CSI Only
This applies to the PUCCH that carries only CSI data. PUCCH format 2 (without ACK/NACK). In this case, the number of bits for a() varies depending on what kind of CSI data it carries, but the number for bits for b() is always same (20 bits). It means the bit length gets increased to 20 bits by channel coding process regardless of the size of the input (size of a() ).
< a(0), a(1), ...., a(A-1) > are determined by several different tables as shown below. As you see, the number of bits (A) varies depending on transmission mode, number of antenna ports, Rank, CQI type.
Table 5.2.3.3.1-1: UCI fields for channel quality information feedback for wideband CQI reports(transmission mode 1, transmission mode 2, transmission mode 3, transmission mode 7,transmission mode 8 configured without PMI/RI reporting, transmission mode 9 configured without PMI/RI reporting or configured with 1 antenna port, and transmission mode 10 configured without PMI/RI reporting or configured with 1 antenna port).
![]()
36.212 Table 5.2.3.3.1-1. The smallest report there is. One field, four bits, and no dependence on antenna ports or rank at all.
Table 5.2.3.3.1-2: UCI fields for channel quality information feedback for wideband CQI reports (transmission mode 4, transmission mode 5, transmission mode 6 and transmission mode 8 configured with PMI/RI reporting).

36.212 Table 5.2.3.3.1-2. Once PMI and RI reporting is configured, the report gains two fields and the widths start to depend on rank.
- Wide-band CQI stays at 4 in every column. It is the one field that never changes width anywhere in this family of tables.
- Spatial differential CQI is 0 at rank 1 and 3 above it. A second codeword only exists when there is a second layer, so at rank 1 there is nothing to differentiate.
- Precoding matrix indication is the field that moves with the antenna count: 2 and 1 for two ports, then 4 and 4 for four.
Table 5.2.3.3.1-2A: UCI fields for transmission of wideband CQI and precoding information (i2) for transmission mode 9 configured with PMI/RI reporting and transmission mode 10 configured with PMI/RI reporting

36.212 Table 5.2.3.3.1-2A. The same three fields carried out to 8 antenna ports, where the precoding field stops being a PMI and becomes i2.
- The last row changes meaning with the port count. It is a wide-band PMI for 2 or 4 antenna ports and i2 for 8, which the row label says explicitly.
- Across the 8 port columns that field reads 4, 4, 3 and 0. It disappears entirely above rank 4, because there is no second precoding index left to send.
- Spatial differential CQI follows the same rank 1 rule as before, reading 0 at rank 1 in all three port counts.
Table 5.2.3.3.1-2B: UCI fields for transmission of wideband CQI and precoding information (i1, i2) for transmission mode 9 configured with PMI/RI reporting with 8 antenna ports and transmission mode 10 configured with PMI/RI reporting with 8 antenna ports

36.212 Table 5.2.3.3.1-2B. Eight antenna ports with i1 and i2 reported separately, and the widest report on the page.
- This is the only table that splits the precoding index into two rows, i1 and Wide-band i2, rather than carrying one combined field.
- i1 reads 3, 3, 1, 1, 2, 2, 2, 0 across ranks 1 to 8, and Wide-band i2 reads 1, 1, 3, 3, 0, 0, 0, 0. Both fall to 0 at rank 8.
- Adding a column gives the total. At rank 2 it is 4 + 3 + 3 + 1, which is 11 bits, and that is the largest A this page produces.
Table 5.2.3.3.1-3: UCI fields for rank indication feedback for wideband reports (transmission mode 3, transmission mode 4, transmission mode 8 configured with PMI/RI reporting, transmission mode 9 configured with PMI/RI reporting with 2/4/8 antenna ports, and transmission mode 10 configured with PMI/RI reporting with 2/4/8 antenna ports).

36.212 Table 5.2.3.3.1-3. Rank on its own, reported separately from CQI, and never wider than 3 bits.
- The width follows the maximum layer count rather than the port count. Two ports need 1 bit, four ports need 1 or 2, and eight ports need up to 3.
- Three bits covers eight possible ranks, which is the arithmetic you would expect and a useful check that the row is read correctly.
Table 5.2.3.3.1-3A: UCI fields for joint report of RI and i1 (transmission mode 9 configured with PMI/RI reporting with 2/4/8 antenna ports and transmission mode 10 configured with PMI/RI reporting with 2/4/8 antenna ports)

36.212 Table 5.2.3.3.1-3A. Rank and i1 reported together, which is why the 8 port columns give one number across both rows rather than two.
- For 2 and 4 antenna ports the i1 row reads a dash. There is no joint report to make, so the widths match Table 5.2.3.3.1-3 exactly.
- The 8 port columns read 4, 5 and 5, and those cells span both rows. The number is the joint total for rank and i1 together, not a rank width.
- Comparing this with Table 5.2.3.3.1-3 shows the cost of the joint report: 3 bits becomes 5 at eight ports with eight layers.
Regardless of A (the size of a( )), the size of b( ) become always 20. The way by which b( ) is generated from a( ) based on following algorithm.

36.212 clause 5.2.3.3. Each output bit is one modulo 2 sum across the whole input, which is why a short input still fills all 20 output bits.
- The sum runs over n from 0 to A-1, so every output bit bi depends on every input bit that is set.
- The index i runs from 0 to B-1, and B is 20 here. The equation is evaluated 20 times, once per output bit.
- Nothing in the equation depends on A except the length of the sum. That is the mechanism behind the fixed 20 bit output.
In this case, B is always 20 and M(i,n) is defined by the following table.

36.212 Table 5.2.3.3-1. Thirteen basis columns and twenty rows, so the code is (20, A) with A allowed up to 13.
- The columns run Mi,0 to Mi,12, which is thirteen basis sequences and therefore the largest A the code accepts.
- The rows run i = 0 to 19, and that 20 is the B in every CSI case on this page.
- The widest report in the tables above is 11 bits, so the code is never used to its full width here.
- PUSCH uses a different code for the same job. Its basis table is 5.2.2.6.4-1, a (32, O) code with eleven columns and thirty two rows, so the two channels do not share this machinery.
One limit of scope is worth noting before the worked example. All six field tables above are titled for wideband CQI reports, and they come from 36.212 clause 5.2.3.3.1. UE-selected sub-band reports have their own clause at 5.2.3.3.2 with a separate family of tables, and this page does not cover them.
For example, if you have a() = {1,1,0,1}, it will get encoded to 20 bits output as highlighted in red below.
|
Input Bits : a( ) ==> |
1 |
1 |
0 |
1 |
|||||||
|
Multiplication ==> |
x |
x |
x |
x |
|||||||
|
i |
M i,0 |
M i,1 |
M i,2 |
M i,3 |
M i,0 |
M i,1 |
M i,2 |
M i,3 |
b() |
||
|
0 |
1 |
1 |
0 |
0 |
= |
1 |
1 |
0 |
0 |
= |
0 |
|
1 |
1 |
1 |
1 |
0 |
= |
1 |
1 |
0 |
0 |
= |
0 |
|
2 |
1 |
0 |
0 |
1 |
= |
1 |
0 |
0 |
1 |
= |
0 |
|
3 |
1 |
0 |
1 |
1 |
= |
1 |
0 |
0 |
1 |
= |
0 |
|
4 |
1 |
1 |
1 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
5 |
1 |
1 |
0 |
0 |
= |
1 |
1 |
0 |
0 |
= |
0 |
|
6 |
1 |
0 |
1 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
|
7 |
1 |
0 |
0 |
1 |
= |
1 |
0 |
0 |
1 |
= |
0 |
|
8 |
1 |
1 |
0 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
9 |
1 |
1 |
1 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
10 |
1 |
0 |
1 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
|
11 |
1 |
0 |
1 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
|
12 |
1 |
1 |
0 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
13 |
1 |
1 |
0 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
14 |
1 |
0 |
0 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
|
15 |
1 |
0 |
0 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
|
16 |
1 |
1 |
1 |
0 |
= |
1 |
1 |
0 |
0 |
= |
0 |
|
17 |
1 |
1 |
0 |
1 |
= |
1 |
1 |
0 |
1 |
= |
1 |
|
18 |
1 |
0 |
0 |
1 |
= |
1 |
0 |
0 |
1 |
= |
0 |
|
19 |
1 |
0 |
0 |
0 |
= |
1 |
0 |
0 |
0 |
= |
1 |
B is 20 whatever A is : a 4 bit wideband CQI and an 11 bit rank and precoding report both leave the coder as 20 bits.Wide-band CQI is always 4 bits : every other field in these tables moves with rank or antenna port count, and that one does not.Rank 1 removes the differential field : spatial differential CQI reads 0 at rank 1 throughout, because there is no second codeword to compare against.The code has headroom : thirteen basis columns against a widest report of eleven bits.
Channel Coding for CSI + HARQ ACK/NACK
The last case is the one where both payloads travel together, and the interesting question is whether they are coded together as well. They are not. Each keeps the treatment it would have had on its own, and the two results are placed side by side.
This applies to PUCCH that carry both CSI data and ACK/NACK data.
Simply put, first generate b'( ) array for CSI and b'( ) is multiplexed by a''( ) for ACK/NACK. (See 36.212 5.2.3.4 for details).
In short, the CSI part of the input will get encoded to 20 bits and ACK/NACK bit length remain same. So the resulting bit length became (20 + ACK/NACK bit length).
That addition is the whole result, and it carries one consequence worth stating. The ACK/NACK bits are never passed through the (20, A) code, so they arrive with exactly the protection the earlier section described and no more.
So the asymmetry of the first two sections survives into the third. The CSI half is spread across 20 bits by the basis sequences, while the ACK/NACK half rides alongside it unchanged. One payload, two coding regimes, decided by which half of a( ) a bit belongs to.
The two halves are multiplexed, not jointly coded : CSI is encoded first and the ACK/NACK bits are placed beside the result.The output length is additive : 20 bits from the CSI half plus the unchanged ACK/NACK length, so it is 21 or 22 in practice.The ACK/NACK gains nothing from the block code : its reliability still comes from the PUCCH format rather than from the basis sequences.
Reference
- TS 36.212 v19.3.0 (Release 19) - E-UTRA Multiplexing and channel coding. Clause 5.2.3 Uplink control information on PUCCH, and the 5.2.3.3.1 table family.