libosmocore  1.5.1
Osmocom core library
conv_acc_neon_impl.h
Go to the documentation of this file.
1 
4 /*
5  * (C) 2020 by sysmocom - s.f.m.c. GmbH
6  * Author: Eric Wild
7  *
8  * All Rights Reserved
9  *
10  * SPDX-License-Identifier: GPL-2.0+
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License along
23  * with this program; if not, write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25  */
26 
27 /* Some distributions (notably Alpine Linux) for some strange reason
28  * don't have this #define */
29 #ifndef __always_inline
30 #define __always_inline inline __attribute__((always_inline))
31 #endif
32 
33 #define NEON_BUTTERFLY(M0,M1,M2,M3,M4) \
34 { \
35  M3 = vqaddq_s16(M0, M2); \
36  M4 = vqsubq_s16(M1, M2); \
37  M0 = vqsubq_s16(M0, M2); \
38  M1 = vqaddq_s16(M1, M2); \
39  M2 = vmaxq_s16(M3, M4); \
40  M3 = vreinterpretq_s16_u16(vcgtq_s16(M3, M4)); \
41  M4 = vmaxq_s16(M0, M1); \
42  M1 = vreinterpretq_s16_u16(vcgtq_s16(M0, M1)); \
43 }
44 
45 #define NEON_DEINTERLEAVE_K5(M0,M1,M2,M3) \
46 { \
47  int16x8x2_t tmp; \
48  tmp = vuzpq_s16(M0, M1); \
49  M2 = tmp.val[0]; \
50  M3 = tmp.val[1]; \
51 }
52 
53 #define NEON_DEINTERLEAVE_K7(M0,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15) \
54 { \
55  int16x8x2_t tmp; \
56  tmp = vuzpq_s16(M0, M1); \
57  M8 = tmp.val[0]; M9 = tmp.val[1]; \
58  tmp = vuzpq_s16(M2, M3); \
59  M10 = tmp.val[0]; M11 = tmp.val[1]; \
60  tmp = vuzpq_s16(M4, M5); \
61  M12 = tmp.val[0]; M13 = tmp.val[1]; \
62  tmp = vuzpq_s16(M6, M7); \
63  M14 = tmp.val[0]; M15 = tmp.val[1]; \
64 }
65 
66 #define NEON_BRANCH_METRIC_N2(M0,M1,M2,M3,M4,M6,M7) \
67 { \
68  M0 = vmulq_s16(M4, M0); \
69  M1 = vmulq_s16(M4, M1); \
70  M2 = vmulq_s16(M4, M2); \
71  M3 = vmulq_s16(M4, M3); \
72  M6 = vcombine_s16(vpadd_s16(vget_low_s16(M0), vget_high_s16(M0)), vpadd_s16(vget_low_s16(M1), vget_high_s16(M1))); \
73  M7 = vcombine_s16(vpadd_s16(vget_low_s16(M2), vget_high_s16(M2)), vpadd_s16(vget_low_s16(M3), vget_high_s16(M3))); \
74 }
75 
76 #define NEON_BRANCH_METRIC_N4(M0,M1,M2,M3,M4,M5) \
77 { \
78  M0 = vmulq_s16(M4, M0); \
79  M1 = vmulq_s16(M4, M1); \
80  M2 = vmulq_s16(M4, M2); \
81  M3 = vmulq_s16(M4, M3); \
82  int16x4_t t1 = vpadd_s16(vpadd_s16(vget_low_s16(M0), vget_high_s16(M0)), vpadd_s16(vget_low_s16(M1), vget_high_s16(M1))); \
83  int16x4_t t2 = vpadd_s16(vpadd_s16(vget_low_s16(M2), vget_high_s16(M2)), vpadd_s16(vget_low_s16(M3), vget_high_s16(M3))); \
84  M5 = vcombine_s16(t1, t2); \
85 }
86 
87 #define NEON_NORMALIZE_K5(M0,M1,M2,M3) \
88 { \
89  M2 = vminq_s16(M0, M1); \
90  int16x4_t t = vpmin_s16(vget_low_s16(M2), vget_high_s16(M2)); \
91  t = vpmin_s16(t, t); \
92  t = vpmin_s16(t, t); \
93  M2 = vdupq_lane_s16(t, 0); \
94  M0 = vqsubq_s16(M0, M2); \
95  M1 = vqsubq_s16(M1, M2); \
96 }
97 
98 #define NEON_NORMALIZE_K7(M0,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11) \
99 { \
100  M8 = vminq_s16(M0, M1); \
101  M9 = vminq_s16(M2, M3); \
102  M10 = vminq_s16(M4, M5); \
103  M11 = vminq_s16(M6, M7); \
104  M8 = vminq_s16(M8, M9); \
105  M10 = vminq_s16(M10, M11); \
106  M8 = vminq_s16(M8, M10); \
107  int16x4_t t = vpmin_s16(vget_low_s16(M8), vget_high_s16(M8)); \
108  t = vpmin_s16(t, t); \
109  t = vpmin_s16(t, t); \
110  M8 = vdupq_lane_s16(t, 0); \
111  M0 = vqsubq_s16(M0, M8); \
112  M1 = vqsubq_s16(M1, M8); \
113  M2 = vqsubq_s16(M2, M8); \
114  M3 = vqsubq_s16(M3, M8); \
115  M4 = vqsubq_s16(M4, M8); \
116  M5 = vqsubq_s16(M5, M8); \
117  M6 = vqsubq_s16(M6, M8); \
118  M7 = vqsubq_s16(M7, M8); \
119 }
120 
121 __always_inline void _neon_metrics_k5_n2(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths,
122  int norm)
123 {
124  int16_t *__restrict out = __builtin_assume_aligned(outa, 8);
125  int16_t *__restrict sums = __builtin_assume_aligned(sumsa, 8);
126  int16x8_t m0, m1, m2, m3, m4, m5, m6;
127  int16x4_t input;
128 
129  /* (BMU) Load and expand 8-bit input out to 16-bits */
130  input = vld1_s16(val);
131  m2 = vcombine_s16(input, input);
132 
133  /* (BMU) Load and compute branch metrics */
134  m0 = vld1q_s16(&out[0]);
135  m1 = vld1q_s16(&out[8]);
136 
137  m0 = vmulq_s16(m2, m0);
138  m1 = vmulq_s16(m2, m1);
139  m2 = vcombine_s16(vpadd_s16(vget_low_s16(m0), vget_high_s16(m0)),
140  vpadd_s16(vget_low_s16(m1), vget_high_s16(m1)));
141 
142  /* (PMU) Load accumulated path matrics */
143  m0 = vld1q_s16(&sums[0]);
144  m1 = vld1q_s16(&sums[8]);
145 
146  NEON_DEINTERLEAVE_K5(m0, m1, m3, m4)
147 
148  /* (PMU) Butterflies: 0-7 */
149  NEON_BUTTERFLY(m3, m4, m2, m5, m6)
150 
151  if (norm)
152  NEON_NORMALIZE_K5(m2, m6, m0, m1)
153 
154  vst1q_s16(&sums[0], m2);
155  vst1q_s16(&sums[8], m6);
156  vst1q_s16(&paths[0], m5);
157  vst1q_s16(&paths[8], m4);
158 }
159 
160 __always_inline void _neon_metrics_k5_n4(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths,
161  int norm)
162 {
163  int16_t *__restrict out = __builtin_assume_aligned(outa, 8);
164  int16_t *__restrict sums = __builtin_assume_aligned(sumsa, 8);
165  int16x8_t m0, m1, m2, m3, m4, m5, m6;
166  int16x4_t input;
167 
168  /* (BMU) Load and expand 8-bit input out to 16-bits */
169  input = vld1_s16(val);
170  m4 = vcombine_s16(input, input);
171 
172  /* (BMU) Load and compute branch metrics */
173  m0 = vld1q_s16(&out[0]);
174  m1 = vld1q_s16(&out[8]);
175  m2 = vld1q_s16(&out[16]);
176  m3 = vld1q_s16(&out[24]);
177 
178  NEON_BRANCH_METRIC_N4(m0, m1, m2, m3, m4, m2)
179 
180  /* (PMU) Load accumulated path matrics */
181  m0 = vld1q_s16(&sums[0]);
182  m1 = vld1q_s16(&sums[8]);
183 
184  NEON_DEINTERLEAVE_K5(m0, m1, m3, m4)
185 
186  /* (PMU) Butterflies: 0-7 */
187  NEON_BUTTERFLY(m3, m4, m2, m5, m6)
188 
189  if (norm)
190  NEON_NORMALIZE_K5(m2, m6, m0, m1)
191 
192  vst1q_s16(&sums[0], m2);
193  vst1q_s16(&sums[8], m6);
194  vst1q_s16(&paths[0], m5);
195  vst1q_s16(&paths[8], m4);
196 }
197 
198 __always_inline static void _neon_metrics_k7_n2(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths,
199  int norm)
200 {
201  int16_t *__restrict out = __builtin_assume_aligned(outa, 8);
202  int16_t *__restrict sums = __builtin_assume_aligned(sumsa, 8);
203  int16x8_t m0, m1, m2, m3, m4, m5, m6, m7;
204  int16x8_t m8, m9, m10, m11, m12, m13, m14, m15;
205  int16x4_t input;
206 
207  /* (PMU) Load accumulated path matrics */
208  m0 = vld1q_s16(&sums[0]);
209  m1 = vld1q_s16(&sums[8]);
210  m2 = vld1q_s16(&sums[16]);
211  m3 = vld1q_s16(&sums[24]);
212  m4 = vld1q_s16(&sums[32]);
213  m5 = vld1q_s16(&sums[40]);
214  m6 = vld1q_s16(&sums[48]);
215  m7 = vld1q_s16(&sums[56]);
216 
217  /* (PMU) Deinterleave into even and odd packed registers */
218  NEON_DEINTERLEAVE_K7(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15)
219 
220  /* (BMU) Load and expand 8-bit input out to 16-bits */
221  input = vld1_s16(val);
222  m7 = vcombine_s16(input, input);
223 
224  /* (BMU) Load and compute branch metrics */
225  m0 = vld1q_s16(&out[0]);
226  m1 = vld1q_s16(&out[8]);
227  m2 = vld1q_s16(&out[16]);
228  m3 = vld1q_s16(&out[24]);
229 
230  NEON_BRANCH_METRIC_N2(m0, m1, m2, m3, m7, m4, m5)
231 
232  m0 = vld1q_s16(&out[32]);
233  m1 = vld1q_s16(&out[40]);
234  m2 = vld1q_s16(&out[48]);
235  m3 = vld1q_s16(&out[56]);
236 
237  NEON_BRANCH_METRIC_N2(m0, m1, m2, m3, m7, m6, m7)
238 
239  /* (PMU) Butterflies: 0-15 */
240  NEON_BUTTERFLY(m8, m9, m4, m0, m1)
241  NEON_BUTTERFLY(m10, m11, m5, m2, m3)
242 
243  vst1q_s16(&paths[0], m0);
244  vst1q_s16(&paths[8], m2);
245  vst1q_s16(&paths[32], m9);
246  vst1q_s16(&paths[40], m11);
247 
248  /* (PMU) Butterflies: 17-31 */
249  NEON_BUTTERFLY(m12, m13, m6, m0, m2)
250  NEON_BUTTERFLY(m14, m15, m7, m9, m11)
251 
252  vst1q_s16(&paths[16], m0);
253  vst1q_s16(&paths[24], m9);
254  vst1q_s16(&paths[48], m13);
255  vst1q_s16(&paths[56], m15);
256 
257  if (norm)
258  NEON_NORMALIZE_K7(m4, m1, m5, m3, m6, m2, m7, m11, m0, m8, m9, m10)
259 
260  vst1q_s16(&sums[0], m4);
261  vst1q_s16(&sums[8], m5);
262  vst1q_s16(&sums[16], m6);
263  vst1q_s16(&sums[24], m7);
264  vst1q_s16(&sums[32], m1);
265  vst1q_s16(&sums[40], m3);
266  vst1q_s16(&sums[48], m2);
267  vst1q_s16(&sums[56], m11);
268 }
269 
270 __always_inline static void _neon_metrics_k7_n4(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths,
271  int norm)
272 {
273  int16_t *__restrict out = __builtin_assume_aligned(outa, 8);
274  int16_t *__restrict sums = __builtin_assume_aligned(sumsa, 8);
275  int16x8_t m0, m1, m2, m3, m4, m5, m6, m7;
276  int16x8_t m8, m9, m10, m11, m12, m13, m14, m15;
277  int16x4_t input;
278 
279  /* (PMU) Load accumulated path matrics */
280  m0 = vld1q_s16(&sums[0]);
281  m1 = vld1q_s16(&sums[8]);
282  m2 = vld1q_s16(&sums[16]);
283  m3 = vld1q_s16(&sums[24]);
284  m4 = vld1q_s16(&sums[32]);
285  m5 = vld1q_s16(&sums[40]);
286  m6 = vld1q_s16(&sums[48]);
287  m7 = vld1q_s16(&sums[56]);
288 
289  /* (PMU) Deinterleave into even and odd packed registers */
290  NEON_DEINTERLEAVE_K7(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15)
291 
292  /* (BMU) Load and expand 8-bit input out to 16-bits */
293  input = vld1_s16(val);
294  m7 = vcombine_s16(input, input);
295 
296  /* (BMU) Load and compute branch metrics */
297  m0 = vld1q_s16(&out[0]);
298  m1 = vld1q_s16(&out[8]);
299  m2 = vld1q_s16(&out[16]);
300  m3 = vld1q_s16(&out[24]);
301 
302  NEON_BRANCH_METRIC_N4(m0, m1, m2, m3, m7, m4)
303 
304  m0 = vld1q_s16(&out[32]);
305  m1 = vld1q_s16(&out[40]);
306  m2 = vld1q_s16(&out[48]);
307  m3 = vld1q_s16(&out[56]);
308 
309  NEON_BRANCH_METRIC_N4(m0, m1, m2, m3, m7, m5)
310 
311  m0 = vld1q_s16(&out[64]);
312  m1 = vld1q_s16(&out[72]);
313  m2 = vld1q_s16(&out[80]);
314  m3 = vld1q_s16(&out[88]);
315 
316  NEON_BRANCH_METRIC_N4(m0, m1, m2, m3, m7, m6)
317 
318  m0 = vld1q_s16(&out[96]);
319  m1 = vld1q_s16(&out[104]);
320  m2 = vld1q_s16(&out[112]);
321  m3 = vld1q_s16(&out[120]);
322 
323  NEON_BRANCH_METRIC_N4(m0, m1, m2, m3, m7, m7)
324 
325  /* (PMU) Butterflies: 0-15 */
326  NEON_BUTTERFLY(m8, m9, m4, m0, m1)
327  NEON_BUTTERFLY(m10, m11, m5, m2, m3)
328 
329  vst1q_s16(&paths[0], m0);
330  vst1q_s16(&paths[8], m2);
331  vst1q_s16(&paths[32], m9);
332  vst1q_s16(&paths[40], m11);
333 
334  /* (PMU) Butterflies: 17-31 */
335  NEON_BUTTERFLY(m12, m13, m6, m0, m2)
336  NEON_BUTTERFLY(m14, m15, m7, m9, m11)
337 
338  vst1q_s16(&paths[16], m0);
339  vst1q_s16(&paths[24], m9);
340  vst1q_s16(&paths[48], m13);
341  vst1q_s16(&paths[56], m15);
342 
343  if (norm)
344  NEON_NORMALIZE_K7(m4, m1, m5, m3, m6, m2, m7, m11, m0, m8, m9, m10)
345 
346  vst1q_s16(&sums[0], m4);
347  vst1q_s16(&sums[8], m5);
348  vst1q_s16(&sums[16], m6);
349  vst1q_s16(&sums[24], m7);
350  vst1q_s16(&sums[32], m1);
351  vst1q_s16(&sums[40], m3);
352  vst1q_s16(&sums[48], m2);
353  vst1q_s16(&sums[56], m11);
354 }
osmo_conv_decoder::state_history
uint8_t * state_history
state history [len][n_states]
Definition: conv.h:117
osmo_conv_encoder::i_idx
int i_idx
Next input bit index.
Definition: conv.h:82
vtrellis::num_states
int num_states
Definition: conv_acc.c:168
acs_butterfly
static void acs_butterfly(int state, int num_states, int16_t metric, int16_t *sum, int16_t *new_sum, int16_t *path)
Definition: conv_acc_generic.c:36
bitvec_read_field
uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned int len)
read part of the vector
Definition: bitvec.c:477
osmo_conv_decoder::p_idx
int p_idx
puncture index
Definition: conv.h:113
bitvec::data
uint8_t * data
pointer to data array
Definition: bitvec.h:49
bitvec_get_int16_msb
int16_t bitvec_get_int16_msb(const struct bitvec *bv, unsigned int num_bits)
get multiple bits (num_bits) from beginning of vector (MSB side)
Definition: bitvec.c:252
vdecoder::n
int n
Definition: conv_acc.c:184
osmo_stderr_target
struct log_target * osmo_stderr_target
the default logging target, logging to stderr
Definition: application.c:85
log_add_target
void log_add_target(struct log_target *target)
Register a new log target with the logging core.
Definition: logging.c:705
osmo_conv_encoder::p_idx
int p_idx
Current puncture index.
Definition: conv.h:83
bitvec_get_bytes
int bitvec_get_bytes(struct bitvec *bv, uint8_t *bytes, unsigned int count)
get multiple bytes from current pos Assumes MSB first encoding.
Definition: bitvec.c:328
bitvec_get_bit_high
int bitvec_get_bit_high(struct bitvec *bv)
get the next bit (low/high) inside a bitvec
Definition: bitvec.c:186
osmo_ubit2pbit
int osmo_ubit2pbit(pbit_t *out, const ubit_t *in, unsigned int num_bits)
convert unpacked bits to packed bits, return length in bytes
Definition: bits.c:45
osmo_conv_code::term
enum osmo_conv_term term
Termination type.
Definition: conv.h:57
osmo_conv_decoder::ae_next
unsigned int * ae_next
next accumulated error (tmp in scan)
Definition: conv.h:116
bitvec_set_bit_pos
int bitvec_set_bit_pos(struct bitvec *bv, unsigned int bitnum, enum bit_value bit)
set a bit at given position in a bit vector
Definition: bitvec.c:147
_osmo_backtrace
static void _osmo_backtrace(int use_printf, int subsys, int level)
Definition: backtrace.c:36
osmo_t4_encode
int osmo_t4_encode(struct bitvec *bv)
encode bit vector in-place using T4 encoding Assumes MSB first encoding.
Definition: bitcomp.c:316
_traceback
static void _traceback(struct vdecoder *dec, unsigned state, uint8_t *out, int len)
Definition: conv_acc.c:458
depuncture
static int depuncture(const int8_t *in, const int *punc, int8_t *out, int len)
Definition: conv_acc.c:614
osmo_pbit2ubit
int osmo_pbit2ubit(ubit_t *out, const pbit_t *in, unsigned int num_bits)
convert packed bits to unpacked bits, return length in bytes
Definition: bits.c:146
osmo_conv_encoder::state
uint8_t state
Current state.
Definition: conv.h:84
bitvec_get_bit_pos
enum bit_value bitvec_get_bit_pos(const struct bitvec *bv, unsigned int bitnr)
check if the bit is 0 or 1 for a given position inside a bitvec
Definition: bitvec.c:81
len
static size_t len(const char *str)
bitvec_pack
unsigned int bitvec_pack(const struct bitvec *bv, uint8_t *buffer)
Export a bit vector to a buffer.
Definition: bitvec.c:432
ZERO
@ ZERO
A zero (0) bit.
Definition: bitvec.h:39
osmo_init_logging2
int osmo_init_logging2(void *ctx, const struct log_info *log_info)
Definition: application.c:120
n
write Write running configuration to or terminal n Write configuration to the copy running config startup Copy configuration n Copy running config to n Copy running config to startup write Write running configuration to or terminal n Write to terminal n
OSMO_ASSERT
#define OSMO_ASSERT(exp)
Helper macro to terminate when an assertion fails.
Definition: utils.h:104
bitcomp.h
conv.h
bitvec_set_bit
int bitvec_set_bit(struct bitvec *bv, enum bit_value bit)
set the next bit inside a bitvec
Definition: bitvec.c:173
subsys
char subsys[16]
logging sub-system
Definition: gsmtap.h:9
bitvec_find_bit_pos
int bitvec_find_bit_pos(const struct bitvec *bv, unsigned int n, enum bit_value val)
find first bit set in bit vector
Definition: bitvec.c:308
vdec_init
static int vdec_init(struct vdecoder *dec, const struct osmo_conv_code *code)
Definition: conv_acc.c:537
bitvec_free
void bitvec_free(struct bitvec *bv)
Free a bit vector (release its memory)
Definition: bitvec.c:420
osmo_conv_encode_init
void osmo_conv_encode_init(struct osmo_conv_encoder *encoder, const struct osmo_conv_code *code)
Initialize a convolutional encoder.
Definition: conv.c:87
vdecoder::len
int len
Definition: conv_acc.c:186
osmo_conv_decode_reset
void osmo_conv_decode_reset(struct osmo_conv_decoder *decoder, int start_state)
Definition: conv.c:276
NEON_BUTTERFLY
#define NEON_BUTTERFLY(M0, M1, M2, M3, M4)
Definition: conv_acc_neon_impl.h:33
bitvec_set_bits
int bitvec_set_bits(struct bitvec *bv, const enum bit_value *bits, unsigned int count)
set multiple bits (based on array of bitvals) at current pos
Definition: bitvec.c:202
osmo_nibble_shift_left_unal
void osmo_nibble_shift_left_unal(uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
Shift unaligned input to octet-aligned output.
Definition: bits.c:100
NEON_DEINTERLEAVE_K5
#define NEON_DEINTERLEAVE_K5(M0, M1, M2, M3)
Definition: conv_acc_neon_impl.h:45
osmo_conv_decoder::len
int len
Max o_idx (excl.
Definition: conv.h:110
bitvec::data_len
unsigned int data_len
length of data array in bytes
Definition: bitvec.h:48
bit_value
bit_value
A single GSM bit.
Definition: bitvec.h:38
osmo_conv_encoder
convolutional encoder state
Definition: conv.h:80
BIT2NRZ
#define BIT2NRZ(REG, N)
Definition: conv_acc.c:33
log_info
Logging configuration, passed to log_init.
Definition: logging.h:225
osmo_conv_decode_get_output
int osmo_conv_decode_get_output(struct osmo_conv_decoder *decoder, ubit_t *output, int has_flush, int end_state)
Definition: conv.c:533
osmo_ctx_init
int osmo_ctx_init(const char *id)
Definition: context.c:31
log_target_create_stderr
struct log_target * log_target_create_stderr(void)
Create the STDERR log target.
Definition: logging.c:951
bitswap6
static unsigned bitswap6(unsigned v)
Definition: conv_acc.c:241
_neon_metrics_k5_n4
__always_inline void _neon_metrics_k5_n4(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths, int norm)
Definition: conv_acc_neon_impl.h:160
osmo_conv_decode_acc
int osmo_conv_decode_acc(const struct osmo_conv_code *code, const sbit_t *input, ubit_t *output)
Definition: conv_acc.c:718
osmo_conv_code::next_term_state
const uint8_t * next_term_state
Flush termination state
Definition: conv.h:63
vdecoder::intrvl
int intrvl
Definition: conv_acc.c:188
bitswap2
static unsigned bitswap2(unsigned v)
Definition: conv_acc.c:218
osmo_conv_decoder::o_idx
int o_idx
output index
Definition: conv.h:112
vdecoder::recursive
int recursive
Definition: conv_acc.c:187
gen_branch_metrics_n4
static void gen_branch_metrics_n4(int num_states, const int8_t *seq, const int16_t *out, int16_t *metrics)
Definition: conv_acc_generic.c:94
sse41_supported
int sse41_supported
osmo_conv_encode
int osmo_conv_encode(const struct osmo_conv_code *code, const ubit_t *input, ubit_t *output)
All-in-one convolutional encoding function.
Definition: conv.c:214
osmo_conv_decoder::code
const struct osmo_conv_code * code
for which code?
Definition: conv.h:106
gen_state_info
static int gen_state_info(uint8_t *val, unsigned reg, int16_t *output, const struct osmo_conv_code *code)
Definition: conv_acc.c:291
NEON_BRANCH_METRIC_N4
#define NEON_BRANCH_METRIC_N4(M0, M1, M2, M3, M4, M5)
Definition: conv_acc_neon_impl.h:76
osmo_revbytebits_buf
void osmo_revbytebits_buf(uint8_t *buf, int len)
reverse bit-order of each byte in a buffer
Definition: bits.c:309
osmo_daemonize
int osmo_daemonize(void)
Turn the current process into a background daemon.
Definition: application.c:143
osmo_conv_decoder::ae
unsigned int * ae
accumulated error
Definition: conv.h:115
bitvec_shiftl
void bitvec_shiftl(struct bitvec *bv, unsigned n)
Shifts bitvec to the left, n MSB bits lost.
Definition: bitvec.c:638
vdecoder::trellis
struct vtrellis trellis
Definition: conv_acc.c:189
forward_traverse
static void forward_traverse(struct vdecoder *dec, const int8_t *seq)
Definition: conv_acc.c:636
bitvec_rl_curbit
unsigned bitvec_rl_curbit(struct bitvec *bv, bool b, int max_bits)
Return number (bits) of uninterrupted bit run in vector starting from the current bit.
Definition: bitvec.c:600
sbit_t
int8_t sbit_t
soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] deco...
Definition: bits.h:21
log_targets_reopen
int log_targets_reopen(void)
close and re-open all log files (for log file rotation)
Definition: logging.c:1075
osmo_init_ignore_signals
void osmo_init_ignore_signals(void)
Ignore SIGPIPE, SIGALRM, SIGHUP and SIGIO.
Definition: application.c:93
level
uint8_t level
logging level
Definition: gsmtap.h:6
NEON_ALIGN
#define NEON_ALIGN
Definition: conv_acc_neon.c:37
bits.h
osmo_load16be
static uint16_t osmo_load16be(const void *p)
load unaligned 16-bit integer (big-endian encoding)
Definition: bit16gen.h:112
NUM_STATES
#define NUM_STATES(K)
Definition: conv_acc.c:34
vdecoder::paths
int16_t ** paths
Definition: conv_acc.c:190
osmo_conv_code::next_output
const uint8_t(* next_output)[2]
Next output array.
Definition: conv.h:59
__always_inline
#define __always_inline
Definition: conv_acc_neon_impl.h:30
log_target
structure representing a logging target
Definition: logging.h:267
__attribute__
__attribute__((visibility("hidden")))
Definition: conv_acc_neon.c:46
vdecoder::metric_func
void(* metric_func)(const int8_t *, const int16_t *, int16_t *, int16_t *, int)
Definition: conv_acc.c:192
osmo_talloc_contexts
per-thread talloc contexts.
Definition: talloc.h:10
vtrellis::outputs
int16_t * outputs
Definition: conv_acc.c:170
traceback
static int traceback(struct vdecoder *dec, uint8_t *out, int term, int len)
Definition: conv_acc.c:488
NEON_BRANCH_METRIC_N2
#define NEON_BRANCH_METRIC_N2(M0, M1, M2, M3, M4, M6, M7)
Definition: conv_acc_neon_impl.h:66
utils.h
bitswap4
static unsigned bitswap4(unsigned v)
Definition: conv_acc.c:229
osmo_conv_decoder
convolutional decoder state
Definition: conv.h:105
osmo_conv_encode_load_state
void osmo_conv_encode_load_state(struct osmo_conv_encoder *encoder, const ubit_t *input)
Definition: conv.c:96
__attribute__
__attribute__((visibility("hidden")))
Definition: conv_acc.c:50
osmo_panic
void osmo_panic(const char *fmt,...) __attribute__((noreturn))
Terminate the current program with a panic.
Definition: panic.c:75
init_complete
static int init_complete
Definition: conv_acc.c:48
CONV_TERM_TAIL_BITING
@ CONV_TERM_TAIL_BITING
Tail biting.
Definition: conv.h:43
__attribute__
static __attribute__((constructor))
Definition: context.c:47
conv_acc_neon_impl.h
osmo_conv_get_output_length
int osmo_conv_get_output_length(const struct osmo_conv_code *code, int len)
Definition: conv.c:55
flip_table
static const uint8_t flip_table[256]
Definition: bits.c:239
_neon_metrics_k7_n2
static __always_inline void _neon_metrics_k7_n2(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths, int norm)
Definition: conv_acc_neon_impl.h:198
osmo_bit_reversal
uint32_t osmo_bit_reversal(uint32_t x, enum osmo_br_mode k)
generalized bit reversal function
Definition: bits.c:268
bitswap3
static unsigned bitswap3(unsigned v)
Definition: conv_acc.c:223
gen_recursive_state_info
static int gen_recursive_state_info(uint8_t *val, unsigned reg, int16_t *output, const struct osmo_conv_code *code)
Definition: conv_acc.c:348
osmo_conv_encode_flush
int osmo_conv_encode_flush(struct osmo_conv_encoder *encoder, ubit_t *output)
Definition: conv.c:168
t4_rle
static int t4_rle(struct bitvec *bv, unsigned len, bool b)
Make-up codes for a given length.
Definition: bitcomp.c:230
conv_code_recursive
static int conv_code_recursive(const struct osmo_conv_code *code)
Definition: conv_acc.c:197
bitvec_add_array
unsigned int bitvec_add_array(struct bitvec *bv, const uint32_t *array, unsigned int array_len, bool dry_run, unsigned int num_bits)
Add given array to bitvec.
Definition: bitvec.c:680
osmo_conv_decode_scan
int osmo_conv_decode_scan(struct osmo_conv_decoder *decoder, const sbit_t *input, int n)
Definition: conv.c:327
osmo_revbytebits_32
uint32_t osmo_revbytebits_32(uint32_t x)
reverse the bit-order in each byte of a dword
Definition: bits.c:285
vtrellis::sums
int16_t * sums
Definition: conv_acc.c:169
osmo_init_logging
int osmo_init_logging(const struct log_info *log_info)
Initialize the osmocom logging framework.
Definition: application.c:115
bitvec_set_u64
int bitvec_set_u64(struct bitvec *bv, uint64_t v, uint8_t num_bits, bool use_lh)
set multiple bits (based on numeric value) at current pos.
Definition: bitvec.c:221
NEON_NORMALIZE_K5
#define NEON_NORMALIZE_K5(M0, M1, M2, M3)
Definition: conv_acc_neon_impl.h:87
osmo_conv_decode_rewind
void osmo_conv_decode_rewind(struct osmo_conv_decoder *decoder)
Definition: conv.c:297
_neon_metrics_k5_n2
__always_inline void _neon_metrics_k5_n2(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths, int norm)
Definition: conv_acc_neon_impl.h:121
buffer
pbit_t
uint8_t pbit_t
packed bits (8 bits in a byte).
Definition: bits.h:30
gen_output
static unsigned gen_output(struct vstate *state, int val, const struct osmo_conv_code *code)
Definition: conv_acc.c:274
gen_recursive_output
static unsigned gen_recursive_output(struct vstate *state, uint8_t *val, unsigned reg, const struct osmo_conv_code *code, int pos)
Definition: conv_acc.c:316
t4_term
static const unsigned t4_term[2][64]
Definition: bitcomp.c:43
osmo_revbytebits_8
uint32_t osmo_revbytebits_8(uint8_t x)
reverse the bit order in a byte
Definition: bits.c:298
pid
uint32_t pid
process ID
Definition: gsmtap.h:5
osmo_sbit2ubit
void osmo_sbit2ubit(ubit_t *out, const sbit_t *in, unsigned int num_bits)
convert soft bits to unpacked bits
Definition: bits.c:133
talloc.h
if
if(vty->type==VTY_SHELL_SERV)
conv_decode
static int conv_decode(struct vdecoder *dec, const int8_t *seq, const int *punc, uint8_t *out, int len, int term)
Definition: conv_acc.c:654
signal.h
c
struct abis_rsl_common_hdr c
osmo_conv_decode
int osmo_conv_decode(const struct osmo_conv_code *code, const sbit_t *input, ubit_t *output)
All-in-one convolutional decoding function.
Definition: conv.c:609
l
int gsm48_generate_mid_from_tmsi *(uint8_t *buf, uint32_t tmsi) OSMO_DEPRECATED_OUTSIDE("Instead u l))
osmo_hexparse
int osmo_hexparse(const char *str, uint8_t *b, int max_len)
Parse a string containing hexadecimal digits.
Definition: utils.c:244
osmo_conv_init
static void osmo_conv_init(void)
Definition: conv_acc.c:673
osmo_conv_decode_flush
int osmo_conv_decode_flush(struct osmo_conv_decoder *decoder, const sbit_t *input)
Definition: conv.c:428
bitvec_write_field
int bitvec_write_field(struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len)
write into the vector
Definition: bitvec.c:501
bitvec_alloc
struct bitvec * bitvec_alloc(unsigned int size, TALLOC_CTX *bvctx)
Allocate a bit vector.
Definition: bitvec.c:401
_traceback_rec
static void _traceback_rec(struct vdecoder *dec, unsigned state, uint8_t *out, int len)
Definition: conv_acc.c:471
bitvec
structure describing a bit vector
Definition: bitvec.h:46
bitvec_to_string_r
void bitvec_to_string_r(const struct bitvec *bv, char *str)
prints bit vector to provided string It's caller's responsibility to ensure that we won't shoot him i...
Definition: bitvec.c:534
t4_make_up
static const unsigned t4_make_up[2][15]
Definition: bitcomp.c:188
osmo_talloc_contexts::global
void * global
global per-thread talloc context.
Definition: talloc.h:12
leading_bits
static unsigned leading_bits(uint8_t x, bool b)
Definition: bitvec.c:548
bitvec_shiftl
void bitvec_shiftl(struct bitvec *bv, unsigned int n)
gen_branch_metrics_n2
static void gen_branch_metrics_n2(int num_states, const int8_t *seq, const int16_t *out, int16_t *metrics)
Definition: conv_acc_generic.c:69
ONE
@ ONE
A one (1) bit.
Definition: bitvec.h:40
osmo_conv_code::next_state
const uint8_t(* next_state)[2]
Next state array
Definition: conv.h:60
osmo_conv_encoder::code
const struct osmo_conv_code * code
for which code?
Definition: conv.h:81
osmo_generate_backtrace
void osmo_generate_backtrace(void)
Generate and print a call back-trace.
Definition: backtrace.c:67
CONV_TERM_FLUSH
@ CONV_TERM_FLUSH
Flush encoder state.
Definition: conv.h:41
osmo_conv_code::K
int K
Constraint length.
Definition: conv.h:54
osmo_conv_decode_init
void osmo_conv_decode_init(struct osmo_conv_decoder *decoder, const struct osmo_conv_code *code, int len, int start_state)
Definition: conv.c:248
__attribute__
__attribute__((visibility("hidden")))
Definition: conv_acc_generic.c:134
osmo_conv_get_input_length
int osmo_conv_get_input_length(const struct osmo_conv_code *code, int len)
Definition: conv.c:49
osmo_conv_code::puncture
const int * puncture
Punctured bits indexes.
Definition: conv.h:65
bytenum_from_bitnum
static unsigned int bytenum_from_bitnum(unsigned int bitnum)
Definition: bitvec.c:52
bitvec_set_bytes
int bitvec_set_bytes(struct bitvec *bv, const uint8_t *bytes, unsigned int count)
set multiple bytes at current pos Assumes MSB first encoding.
Definition: bitvec.c:364
ubit_t
uint8_t ubit_t
unpacked bit (0 or 1): 1 bit per byte
Definition: bits.h:24
ARRAY_SIZE
#define ARRAY_SIZE(x)
Determine number of elements in an array of static size.
Definition: utils.h:19
bitval2mask
static uint8_t bitval2mask(enum bit_value bit, uint8_t bitnum)
Definition: bitvec.c:60
osmo_conv_code::N
int N
Inverse of code rate.
Definition: conv.h:53
gen_path_metrics
static void gen_path_metrics(int num_states, int16_t *sums, int16_t *metrics, int16_t *paths, int norm)
Definition: conv_acc_generic.c:108
osmo_conv_code::next_term_output
const uint8_t * next_term_output
Flush termination output.
Definition: conv.h:62
generate_trellis
static int generate_trellis(struct vdecoder *dec, const struct osmo_conv_code *code)
Definition: conv_acc.c:405
osmo_store16be
static void osmo_store16be(uint16_t x, void *p)
store unaligned 16-bit integer (big-endian encoding)
Definition: bit16gen.h:125
osmo_br_mode
osmo_br_mode
bit-reversal mode for osmo_bit_reversal()
Definition: bits.h:93
vdecoder::k
int k
Definition: conv_acc.c:185
vtrellis::vals
uint8_t * vals
Definition: conv_acc.c:171
logging.h
free_trellis
static void free_trellis(struct vtrellis *trellis)
Definition: conv_acc.c:389
bitvec_zero
void bitvec_zero(struct bitvec *bv)
force bit vector to all 0 and current bit to the beginnig of the vector
Definition: bitvec.c:570
t4_term_length
static const unsigned t4_term_length[2][64]
Definition: bitcomp.c:178
H
@ H
A CSN.1 "H" bit.
Definition: bitvec.h:42
vdec_deinit
static void vdec_deinit(struct vdecoder *dec)
Definition: conv_acc.c:520
panic.h
bitvec.h
bitvec_rl
unsigned bitvec_rl(const struct bitvec *bv, bool b)
Return number (bits) of uninterrupted bit run in vector starting from the MSB.
Definition: bitvec.c:581
log_init
void int log_init(const struct log_info *inf, void *talloc_ctx)
Initialize the Osmocom logging core.
Definition: logging.c:1105
bitvec_get_bit_pos_high
enum bit_value bitvec_get_bit_pos_high(const struct bitvec *bv, unsigned int bitnr)
check if the bit is L or H for a given position inside a bitvec
Definition: bitvec.c:103
LOGP
#define LOGP(ss, level, fmt, args...)
Log a new message through the Osmocom logging framework.
Definition: logging.h:43
osmo_conv_encode_raw
int osmo_conv_encode_raw(struct osmo_conv_encoder *encoder, const ubit_t *input, ubit_t *output, int n)
Definition: conv.c:139
bitvec_spare_padding
int bitvec_spare_padding(struct bitvec *bv, unsigned int up_to_bit)
pad all remaining bits up to a given bit number
Definition: bitvec.c:297
bit_value_to_char
char bit_value_to_char(enum bit_value v)
convert enum to corresponding character
Definition: bitvec.c:519
vstate_lshift
static unsigned vstate_lshift(unsigned reg, int k, int val)
Definition: conv_acc.c:203
bitvec::cur_bit
unsigned int cur_bit
cursor to the next unused bit
Definition: bitvec.h:47
osmo_conv_code::len
int len
Definition: conv.h:55
osmo_ubit2sbit
void osmo_ubit2sbit(sbit_t *out, const ubit_t *in, unsigned int num_bits)
convert unpacked bits to soft bits
Definition: bits.c:121
bitswap
static unsigned bitswap(unsigned v, unsigned n)
Definition: conv_acc.c:247
vdecoder
Definition: conv_acc.c:183
osmo_log_backtrace
void osmo_log_backtrace(int subsys, int level)
Generate and log a call back-trace.
Definition: backtrace.c:79
NEON_DEINTERLEAVE_K7
#define NEON_DEINTERLEAVE_K7(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15)
Definition: conv_acc_neon_impl.h:53
osmo_talloc_contexts::select
void * select
volatile select-dispatch context.
Definition: talloc.h:19
_conv_encode_do_output
static int _conv_encode_do_output(struct osmo_conv_encoder *encoder, uint8_t out, ubit_t *output)
Definition: conv.c:109
gen_branch_metrics_n3
static void gen_branch_metrics_n3(int num_states, const int8_t *seq, const int16_t *out, int16_t *metrics)
Definition: conv_acc_generic.c:81
osmo_conv_decoder::n_states
int n_states
number of states
Definition: conv.h:108
bitvec_set_uint
int bitvec_set_uint(struct bitvec *bv, unsigned int in, unsigned int count)
set multiple bits (based on numeric value) at current pos.
Definition: bitvec.c:245
k
uint8_t k[OSMO_A5_MAX_KEY_LEN_BYTES]
osmo_pbit2ubit_ext
int osmo_pbit2ubit_ext(ubit_t *out, unsigned int out_ofs, const pbit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
convert packed bits to unpacked bits (extended options)
Definition: bits.c:216
bitvec_get_uint
int bitvec_get_uint(struct bitvec *bv, unsigned int num_bits)
get multiple bits (based on numeric value) from current pos
Definition: bitvec.c:265
osmo_ubit2pbit_ext
int osmo_ubit2pbit_ext(pbit_t *out, unsigned int out_ofs, const ubit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
convert unpacked bits to packed bits (extended options)
Definition: bits.c:191
sighup_hdlr
static void sighup_hdlr(int signal)
Definition: application.c:87
MAX_AE
#define MAX_AE
Definition: conv.c:240
_neon_metrics_k7_n4
static __always_inline void _neon_metrics_k7_n4(const int16_t *val, const int16_t *outa, int16_t *sumsa, int16_t *paths, int norm)
Definition: conv_acc_neon_impl.h:270
bitswap5
static unsigned bitswap5(unsigned v)
Definition: conv_acc.c:235
log_set_all_filter
void log_set_all_filter(struct log_target *target, int)
Enable the LOG_FLT_ALL log filter.
Definition: logging.c:753
osmo_conv_decode_deinit
void osmo_conv_decode_deinit(struct osmo_conv_decoder *decoder)
Definition: conv.c:317
osmo_conv_code
structure describing a given convolutional code
Definition: conv.h:52
bitvec_fill
int bitvec_fill(struct bitvec *bv, unsigned int num_bits, enum bit_value fill)
fill num_bits with \fill starting from the current position
Definition: bitvec.c:285
INIT_POINTERS
#define INIT_POINTERS(simd)
Definition: conv_acc.c:36
NEON_NORMALIZE_K7
#define NEON_NORMALIZE_K7(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11)
Definition: conv_acc_neon_impl.h:98
bitvec_unhex
int bitvec_unhex(struct bitvec *bv, const char *src)
read hexadecimap string into a bit vector
Definition: bitvec.c:459
vtrellis
Definition: conv_acc.c:167
bitvec_unpack
unsigned int bitvec_unpack(struct bitvec *bv, const uint8_t *buffer)
Copy buffer of unpacked bits into bit vector.
Definition: bitvec.c:445
application.h
osmo_ctx
__thread struct osmo_talloc_contexts * osmo_ctx
Definition: context.c:29
bitvec_get_nth_set_bit
unsigned int bitvec_get_nth_set_bit(const struct bitvec *bv, unsigned int n)
get the Nth set bit inside the bit vector
Definition: bitvec.c:126
t4_make_up_length
static const unsigned t4_make_up_length[2][15]
Definition: bitcomp.c:183
L
@ L
A CSN.1 "L" bit.
Definition: bitvec.h:41
osmo_nibble_shift_right
void osmo_nibble_shift_right(uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
Shift unaligned input to octet-aligned output.
Definition: bits.c:73