libosmocore
0.12.0
Osmocom core library
|
Go to the documentation of this file.
29 #ifndef __always_inline
30 #define __always_inline inline __attribute__((always_inline))
52 #define SSE_BUTTERFLY(M0, M1, M2, M3, M4) \
54 M3 = _mm_adds_epi16(M0, M2); \
55 M4 = _mm_subs_epi16(M1, M2); \
56 M0 = _mm_subs_epi16(M0, M2); \
57 M1 = _mm_adds_epi16(M1, M2); \
58 M2 = _mm_max_epi16(M3, M4); \
59 M3 = _mm_or_si128(_mm_cmpgt_epi16(M3, M4), _mm_cmpeq_epi16(M3, M4)); \
60 M4 = _mm_max_epi16(M0, M1); \
61 M1 = _mm_or_si128(_mm_cmpgt_epi16(M0, M1), _mm_cmpeq_epi16(M0, M1)); \
78 #define _I8_SHUFFLE_MASK 15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0
80 #define SSE_DEINTERLEAVE_K5(M0, M1, M2, M3) \
82 M2 = _mm_set_epi8(_I8_SHUFFLE_MASK); \
83 M0 = _mm_shuffle_epi8(M0, M2); \
84 M1 = _mm_shuffle_epi8(M1, M2); \
85 M2 = _mm_unpacklo_epi64(M0, M1); \
86 M3 = _mm_unpackhi_epi64(M0, M1); \
103 #define SSE_DEINTERLEAVE_K7(M0, M1, M2, M3, M4, M5, M6, M7, \
104 M8, M9, M10, M11, M12, M13, M14, M15) \
106 M8 = _mm_set_epi8(_I8_SHUFFLE_MASK); \
107 M0 = _mm_shuffle_epi8(M0, M8); \
108 M1 = _mm_shuffle_epi8(M1, M8); \
109 M2 = _mm_shuffle_epi8(M2, M8); \
110 M3 = _mm_shuffle_epi8(M3, M8); \
111 M4 = _mm_shuffle_epi8(M4, M8); \
112 M5 = _mm_shuffle_epi8(M5, M8); \
113 M6 = _mm_shuffle_epi8(M6, M8); \
114 M7 = _mm_shuffle_epi8(M7, M8); \
115 M8 = _mm_unpacklo_epi64(M0, M1); \
116 M9 = _mm_unpackhi_epi64(M0, M1); \
117 M10 = _mm_unpacklo_epi64(M2, M3); \
118 M11 = _mm_unpackhi_epi64(M2, M3); \
119 M12 = _mm_unpacklo_epi64(M4, M5); \
120 M13 = _mm_unpackhi_epi64(M4, M5); \
121 M14 = _mm_unpacklo_epi64(M6, M7); \
122 M15 = _mm_unpackhi_epi64(M6, M7); \
135 #define SSE_BRANCH_METRIC_N2(M0, M1, M2, M3, M4, M6, M7) \
137 M0 = _mm_sign_epi16(M4, M0); \
138 M1 = _mm_sign_epi16(M4, M1); \
139 M2 = _mm_sign_epi16(M4, M2); \
140 M3 = _mm_sign_epi16(M4, M3); \
141 M6 = _mm_hadds_epi16(M0, M1); \
142 M7 = _mm_hadds_epi16(M2, M3); \
157 #define SSE_BRANCH_METRIC_N4(M0, M1, M2, M3, M4, M5) \
159 M0 = _mm_sign_epi16(M4, M0); \
160 M1 = _mm_sign_epi16(M4, M1); \
161 M2 = _mm_sign_epi16(M4, M2); \
162 M3 = _mm_sign_epi16(M4, M3); \
163 M0 = _mm_hadds_epi16(M0, M1); \
164 M1 = _mm_hadds_epi16(M2, M3); \
165 M5 = _mm_hadds_epi16(M0, M1); \
181 #if defined(HAVE_SSE4_1) || defined(HAVE_SSE41)
182 #define SSE_MINPOS(M0, M1) \
184 if (sse41_supported) { \
185 M0 = _mm_minpos_epu16(M0); \
187 M1 = _mm_shuffle_epi32(M0, _MM_SHUFFLE(0, 0, 3, 2)); \
188 M0 = _mm_min_epi16(M0, M1); \
189 M1 = _mm_shufflelo_epi16(M0, _MM_SHUFFLE(0, 0, 3, 2)); \
190 M0 = _mm_min_epi16(M0, M1); \
191 M1 = _mm_shufflelo_epi16(M0, _MM_SHUFFLE(0, 0, 0, 1)); \
192 M0 = _mm_min_epi16(M0, M1); \
196 #define SSE_MINPOS(M0, M1) \
198 M1 = _mm_shuffle_epi32(M0, _MM_SHUFFLE(0, 0, 3, 2)); \
199 M0 = _mm_min_epi16(M0, M1); \
200 M1 = _mm_shufflelo_epi16(M0, _MM_SHUFFLE(0, 0, 3, 2)); \
201 M0 = _mm_min_epi16(M0, M1); \
202 M1 = _mm_shufflelo_epi16(M0, _MM_SHUFFLE(0, 0, 0, 1)); \
203 M0 = _mm_min_epi16(M0, M1); \
219 #define SSE_NORMALIZE_K5(M0, M1, M2, M3) \
221 M2 = _mm_min_epi16(M0, M1); \
224 M0 = _mm_subs_epi16(M0, M2); \
225 M1 = _mm_subs_epi16(M1, M2); \
239 #define SSE_NORMALIZE_K7(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11) \
241 M8 = _mm_min_epi16(M0, M1); \
242 M9 = _mm_min_epi16(M2, M3); \
243 M10 = _mm_min_epi16(M4, M5); \
244 M11 = _mm_min_epi16(M6, M7); \
245 M8 = _mm_min_epi16(M8, M9); \
246 M10 = _mm_min_epi16(M10, M11); \
247 M8 = _mm_min_epi16(M8, M10); \
250 M0 = _mm_subs_epi16(M0, M8); \
251 M1 = _mm_subs_epi16(M1, M8); \
252 M2 = _mm_subs_epi16(M2, M8); \
253 M3 = _mm_subs_epi16(M3, M8); \
254 M4 = _mm_subs_epi16(M4, M8); \
255 M5 = _mm_subs_epi16(M5, M8); \
256 M6 = _mm_subs_epi16(M6, M8); \
257 M7 = _mm_subs_epi16(M7, M8); \
267 const int16_t *out, int16_t *sums, int16_t *
paths,
int norm)
269 __m128i m0, m1, m2, m3, m4, m5, m6;
272 m2 = _mm_castpd_si128(_mm_loaddup_pd((
double const *) val));
275 m0 = _mm_load_si128((__m128i *) &out[0]);
276 m1 = _mm_load_si128((__m128i *) &out[8]);
279 m0 = _mm_sign_epi16(m2, m0);
280 m1 = _mm_sign_epi16(m2, m1);
281 m2 = _mm_hadds_epi16(m0, m1);
284 m0 = _mm_load_si128((__m128i *) &sums[0]);
285 m1 = _mm_load_si128((__m128i *) &sums[8]);
295 _mm_store_si128((__m128i *) &sums[0], m2);
296 _mm_store_si128((__m128i *) &sums[8], m6);
297 _mm_store_si128((__m128i *) &
paths[0], m5);
298 _mm_store_si128((__m128i *) &
paths[8], m4);
309 const int16_t *out, int16_t *sums, int16_t *
paths,
int norm)
311 __m128i m0, m1, m2, m3, m4, m5, m6;
314 m4 = _mm_castpd_si128(_mm_loaddup_pd((
double const *) val));
317 m0 = _mm_load_si128((__m128i *) &out[0]);
318 m1 = _mm_load_si128((__m128i *) &out[8]);
319 m2 = _mm_load_si128((__m128i *) &out[16]);
320 m3 = _mm_load_si128((__m128i *) &out[24]);
325 m0 = _mm_load_si128((__m128i *) &sums[0]);
326 m1 = _mm_load_si128((__m128i *) &sums[8]);
336 _mm_store_si128((__m128i *) &sums[0], m2);
337 _mm_store_si128((__m128i *) &sums[8], m6);
338 _mm_store_si128((__m128i *) &
paths[0], m5);
339 _mm_store_si128((__m128i *) &
paths[8], m4);
349 const int16_t *out, int16_t *sums, int16_t *
paths,
int norm)
351 __m128i m0, m1, m2, m3, m4, m5, m6, m7, m8,
352 m9, m10, m11, m12, m13, m14, m15;
355 m0 = _mm_load_si128((__m128i *) &sums[0]);
356 m1 = _mm_load_si128((__m128i *) &sums[8]);
357 m2 = _mm_load_si128((__m128i *) &sums[16]);
358 m3 = _mm_load_si128((__m128i *) &sums[24]);
359 m4 = _mm_load_si128((__m128i *) &sums[32]);
360 m5 = _mm_load_si128((__m128i *) &sums[40]);
361 m6 = _mm_load_si128((__m128i *) &sums[48]);
362 m7 = _mm_load_si128((__m128i *) &sums[56]);
366 m8, m9, m10, m11, m12, m13, m14, m15)
369 m7 = _mm_castpd_si128(_mm_loaddup_pd((
double const *) val));
372 m0 = _mm_load_si128((__m128i *) &out[0]);
373 m1 = _mm_load_si128((__m128i *) &out[8]);
374 m2 = _mm_load_si128((__m128i *) &out[16]);
375 m3 = _mm_load_si128((__m128i *) &out[24]);
379 m0 = _mm_load_si128((__m128i *) &out[32]);
380 m1 = _mm_load_si128((__m128i *) &out[40]);
381 m2 = _mm_load_si128((__m128i *) &out[48]);
382 m3 = _mm_load_si128((__m128i *) &out[56]);
390 _mm_store_si128((__m128i *) &
paths[0], m0);
391 _mm_store_si128((__m128i *) &
paths[8], m2);
392 _mm_store_si128((__m128i *) &
paths[32], m9);
393 _mm_store_si128((__m128i *) &
paths[40], m11);
399 _mm_store_si128((__m128i *) &
paths[16], m0);
400 _mm_store_si128((__m128i *) &
paths[24], m9);
401 _mm_store_si128((__m128i *) &
paths[48], m13);
402 _mm_store_si128((__m128i *) &
paths[56], m15);
406 m7, m11, m0, m8, m9, m10)
408 _mm_store_si128((__m128i *) &sums[0], m4);
409 _mm_store_si128((__m128i *) &sums[8], m5);
410 _mm_store_si128((__m128i *) &sums[16], m6);
411 _mm_store_si128((__m128i *) &sums[24], m7);
412 _mm_store_si128((__m128i *) &sums[32], m1);
413 _mm_store_si128((__m128i *) &sums[40], m3);
414 _mm_store_si128((__m128i *) &sums[48], m2);
415 _mm_store_si128((__m128i *) &sums[56], m11);
424 const int16_t *out, int16_t *sums, int16_t *
paths,
int norm)
426 __m128i m0, m1, m2, m3, m4, m5, m6, m7;
427 __m128i m8, m9, m10, m11, m12, m13, m14, m15;
430 m0 = _mm_load_si128((__m128i *) &sums[0]);
431 m1 = _mm_load_si128((__m128i *) &sums[8]);
432 m2 = _mm_load_si128((__m128i *) &sums[16]);
433 m3 = _mm_load_si128((__m128i *) &sums[24]);
434 m4 = _mm_load_si128((__m128i *) &sums[32]);
435 m5 = _mm_load_si128((__m128i *) &sums[40]);
436 m6 = _mm_load_si128((__m128i *) &sums[48]);
437 m7 = _mm_load_si128((__m128i *) &sums[56]);
441 m8, m9, m10, m11, m12, m13, m14, m15)
444 m7 = _mm_castpd_si128(_mm_loaddup_pd((
double const *) val));
447 m0 = _mm_load_si128((__m128i *) &out[0]);
448 m1 = _mm_load_si128((__m128i *) &out[8]);
449 m2 = _mm_load_si128((__m128i *) &out[16]);
450 m3 = _mm_load_si128((__m128i *) &out[24]);
454 m0 = _mm_load_si128((__m128i *) &out[32]);
455 m1 = _mm_load_si128((__m128i *) &out[40]);
456 m2 = _mm_load_si128((__m128i *) &out[48]);
457 m3 = _mm_load_si128((__m128i *) &out[56]);
461 m0 = _mm_load_si128((__m128i *) &out[64]);
462 m1 = _mm_load_si128((__m128i *) &out[72]);
463 m2 = _mm_load_si128((__m128i *) &out[80]);
464 m3 = _mm_load_si128((__m128i *) &out[88]);
468 m0 = _mm_load_si128((__m128i *) &out[96]);
469 m1 = _mm_load_si128((__m128i *) &out[104]);
470 m2 = _mm_load_si128((__m128i *) &out[112]);
471 m3 = _mm_load_si128((__m128i *) &out[120]);
479 _mm_store_si128((__m128i *) &
paths[0], m0);
480 _mm_store_si128((__m128i *) &
paths[8], m2);
481 _mm_store_si128((__m128i *) &
paths[32], m9);
482 _mm_store_si128((__m128i *) &
paths[40], m11);
488 _mm_store_si128((__m128i *) &
paths[16], m0);
489 _mm_store_si128((__m128i *) &
paths[24], m9);
490 _mm_store_si128((__m128i *) &
paths[48], m13);
491 _mm_store_si128((__m128i *) &
paths[56], m15);
495 m7, m11, m0, m8, m9, m10)
497 _mm_store_si128((__m128i *) &sums[0], m4);
498 _mm_store_si128((__m128i *) &sums[8], m5);
499 _mm_store_si128((__m128i *) &sums[16], m6);
500 _mm_store_si128((__m128i *) &sums[24], m7);
501 _mm_store_si128((__m128i *) &sums[32], m1);
502 _mm_store_si128((__m128i *) &sums[40], m3);
503 _mm_store_si128((__m128i *) &sums[48], m2);
504 _mm_store_si128((__m128i *) &sums[56], m11);
uint8_t * state_history
state history [len][n_states]
Definition: conv.h:117
int i_idx
Next input bit index.
Definition: conv.h:82
int num_states
Definition: conv_acc.c:148
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
uint64_t bitvec_read_field(struct bitvec *bv, unsigned int *read_index, unsigned int len)
read part of the vector
Definition: bitvec.c:485
int p_idx
puncture index
Definition: conv.h:113
uint8_t * data
pointer to data array
Definition: bitvec.h:49
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:258
int n
Definition: conv_acc.c:164
struct log_target * osmo_stderr_target
the default logging target, logging to stderr
Definition: application.c:85
#define SSE_BUTTERFLY(M0, M1, M2, M3, M4)
Definition: conv_acc_sse_impl.h:52
void log_add_target(struct log_target *target)
Register a new log target with the logging core.
Definition: logging.c:567
int p_idx
Current puncture index.
Definition: conv.h:83
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:334
int bitvec_get_bit_high(struct bitvec *bv)
get the next bit (low/high) inside a bitvec
Definition: bitvec.c:192
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
enum osmo_conv_term term
Termination type.
Definition: conv.h:57
unsigned int * ae_next
next accumulated error (tmp in scan)
Definition: conv.h:116
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:153
static void _osmo_backtrace(int use_printf, int subsys, int level)
Definition: backtrace.c:36
int osmo_t4_encode(struct bitvec *bv)
encode bit vector in-place using T4 encoding Assumes MSB first encoding.
Definition: bitcomp.c:316
static __always_inline void _sse_metrics_k7_n4(const int16_t *val, const int16_t *out, int16_t *sums, int16_t *paths, int norm)
Definition: conv_acc_sse_impl.h:423
static void _traceback(struct vdecoder *dec, unsigned state, uint8_t *out, int len)
Definition: conv_acc.c:438
static int depuncture(const int8_t *in, const int *punc, int8_t *out, int len)
Definition: conv_acc.c:588
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
uint8_t state
Current state.
Definition: conv.h:84
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:87
unsigned int bitvec_pack(const struct bitvec *bv, uint8_t *buffer)
Export a bit vector to a buffer.
Definition: bitvec.c:436
@ ZERO
A zero (0) bit.
Definition: bitvec.h:39
int osmo_init_logging2(void *ctx, const struct log_info *log_info)
Definition: application.c:120
int bitvec_set_bit(struct bitvec *bv, enum bit_value bit)
set the next bit inside a bitvec
Definition: bitvec.c:179
char subsys[16]
logging sub-system
Definition: gsmtap.h:9
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:314
static int vdec_init(struct vdecoder *dec, const struct osmo_conv_code *code)
Definition: conv_acc.c:517
void bitvec_free(struct bitvec *bv)
Free a bit vector (release its memory)
Definition: bitvec.c:426
void osmo_conv_encode_init(struct osmo_conv_encoder *encoder, const struct osmo_conv_code *code)
Initialize a convolutional encoder.
Definition: conv.c:86
int len
Definition: conv_acc.c:166
void osmo_conv_decode_reset(struct osmo_conv_decoder *decoder, int start_state)
Definition: conv.c:274
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:208
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
int len
Max o_idx (excl.
Definition: conv.h:110
unsigned int data_len
length of data array in bytes
Definition: bitvec.h:48
bit_value
A single GSM bit.
Definition: bitvec.h:38
convolutional encoder state
Definition: conv.h:80
#define BIT2NRZ(REG, N)
Definition: conv_acc.c:33
Logging configuration, passed to log_init.
Definition: logging.h:197
int osmo_conv_decode_get_output(struct osmo_conv_decoder *decoder, ubit_t *output, int has_flush, int end_state)
Definition: conv.c:531
struct log_target * log_target_create_stderr(void)
Create the STDERR log target.
Definition: logging.c:792
static unsigned bitswap6(unsigned v)
Definition: conv_acc.c:221
#define SSE_ALIGN
Definition: conv_acc_sse_avx.c:38
int osmo_conv_decode_acc(const struct osmo_conv_code *code, const sbit_t *input, ubit_t *output)
Definition: conv_acc.c:690
const uint8_t * next_term_state
Flush termination state
Definition: conv.h:63
int intrvl
Definition: conv_acc.c:168
static unsigned bitswap2(unsigned v)
Definition: conv_acc.c:198
int o_idx
output index
Definition: conv.h:112
int recursive
Definition: conv_acc.c:167
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
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:212
#define SSE_DEINTERLEAVE_K7(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15)
Definition: conv_acc_sse_impl.h:103
__attribute__((visibility("hidden")))
Include common SSE implementation.
Definition: conv_acc_sse.c:68
const struct osmo_conv_code * code
for which code?
Definition: conv.h:106
static int gen_state_info(uint8_t *val, unsigned reg, int16_t *output, const struct osmo_conv_code *code)
Definition: conv_acc.c:271
void osmo_revbytebits_buf(uint8_t *buf, int len)
reverse bit-order of each byte in a buffer
Definition: bits.c:286
int osmo_daemonize(void)
Turn the current process into a background daemon.
Definition: application.c:143
unsigned int * ae
accumulated error
Definition: conv.h:115
void bitvec_shiftl(struct bitvec *bv, unsigned n)
Shifts bitvec to the left, n MSB bits lost.
Definition: bitvec.c:646
struct vtrellis trellis
Definition: conv_acc.c:169
static void forward_traverse(struct vdecoder *dec, const int8_t *seq)
Definition: conv_acc.c:610
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:608
#define SSE_NORMALIZE_K7(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11)
Definition: conv_acc_sse_impl.h:239
int8_t sbit_t
soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] deco...
Definition: bits.h:21
int log_targets_reopen(void)
close and re-open all log files (for log file rotation)
Definition: logging.c:908
void osmo_init_ignore_signals(void)
Ignore SIGPIPE, SIGALRM, SIGHUP and SIGIO.
Definition: application.c:93
uint8_t level
logging level
Definition: gsmtap.h:6
static uint16_t osmo_load16be(const void *p)
load unaligned 16-bit integer (big-endian encoding)
Definition: bit16gen.h:89
#define NUM_STATES(K)
Definition: conv_acc.c:34
int16_t ** paths
Definition: conv_acc.c:170
const uint8_t(* next_output)[2]
Next output array.
Definition: conv.h:59
structure representing a logging target
Definition: logging.h:232
static __always_inline void _sse_metrics_k5_n4(const int16_t *val, const int16_t *out, int16_t *sums, int16_t *paths, int norm)
Definition: conv_acc_sse_impl.h:308
void(* metric_func)(const int8_t *, const int16_t *, int16_t *, int16_t *, int)
Definition: conv_acc.c:172
static __always_inline void _sse_metrics_k7_n2(const int16_t *val, const int16_t *out, int16_t *sums, int16_t *paths, int norm)
Definition: conv_acc_sse_impl.h:348
int16_t * outputs
Definition: conv_acc.c:150
static int traceback(struct vdecoder *dec, uint8_t *out, int term, int len)
Definition: conv_acc.c:468
static unsigned bitswap4(unsigned v)
Definition: conv_acc.c:209
convolutional decoder state
Definition: conv.h:105
void osmo_conv_encode_load_state(struct osmo_conv_encoder *encoder, const ubit_t *input)
Definition: conv.c:94
__attribute__((visibility("hidden")))
Definition: conv_acc.c:50
void osmo_panic(const char *fmt,...) __attribute__((noreturn))
Terminate the current program with a panic.
Definition: panic.c:75
static int init_complete
Definition: conv_acc.c:48
@ CONV_TERM_TAIL_BITING
Tail biting.
Definition: conv.h:43
#define SSE_BRANCH_METRIC_N2(M0, M1, M2, M3, M4, M6, M7)
Definition: conv_acc_sse_impl.h:135
int osmo_conv_get_output_length(const struct osmo_conv_code *code, int len)
Definition: conv.c:54
#define SSE_BRANCH_METRIC_N4(M0, M1, M2, M3, M4, M5)
Definition: conv_acc_sse_impl.h:157
uint32_t osmo_bit_reversal(uint32_t x, enum osmo_br_mode k)
generalized bit reversal function
Definition: bits.c:239
static unsigned bitswap3(unsigned v)
Definition: conv_acc.c:203
static int gen_recursive_state_info(uint8_t *val, unsigned reg, int16_t *output, const struct osmo_conv_code *code)
Definition: conv_acc.c:328
int osmo_conv_encode_flush(struct osmo_conv_encoder *encoder, ubit_t *output)
Definition: conv.c:166
static int t4_rle(struct bitvec *bv, unsigned len, bool b)
Make-up codes for a given length.
Definition: bitcomp.c:230
static int conv_code_recursive(const struct osmo_conv_code *code)
Definition: conv_acc.c:177
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:688
int osmo_conv_decode_scan(struct osmo_conv_decoder *decoder, const sbit_t *input, int n)
Definition: conv.c:325
uint32_t osmo_revbytebits_32(uint32_t x)
reverse the bit-order in each byte of a dword
Definition: bits.c:256
#define SSE_ALIGN
Definition: conv_acc_sse.c:37
int16_t * sums
Definition: conv_acc.c:149
int osmo_init_logging(const struct log_info *log_info)
Initialize the osmocom logging framework.
Definition: application.c:115
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:227
void osmo_conv_decode_rewind(struct osmo_conv_decoder *decoder)
Definition: conv.c:295
uint8_t pbit_t
packed bits (8 bits in a byte).
Definition: bits.h:30
static unsigned gen_output(struct vstate *state, int val, const struct osmo_conv_code *code)
Definition: conv_acc.c:254
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:296
static const unsigned t4_term[2][64]
Definition: bitcomp.c:43
uint32_t osmo_revbytebits_8(uint8_t x)
reverse the bit order in a byte
Definition: bits.c:271
uint32_t pid
process ID
Definition: gsmtap.h:5
void osmo_sbit2ubit(ubit_t *out, const sbit_t *in, unsigned int num_bits)
convert soft bits to unpacked bits
Definition: bits.c:133
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:628
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:607
static void osmo_conv_init(void)
Definition: conv_acc.c:647
int osmo_conv_decode_flush(struct osmo_conv_decoder *decoder, const sbit_t *input)
Definition: conv.c:426
int bitvec_write_field(struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len)
write into the vector
Definition: bitvec.c:509
struct bitvec * bitvec_alloc(unsigned int size, TALLOC_CTX *bvctx)
Allocate a bit vector.
Definition: bitvec.c:407
static void _traceback_rec(struct vdecoder *dec, unsigned state, uint8_t *out, int len)
Definition: conv_acc.c:451
structure describing a bit vector
Definition: bitvec.h:46
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:542
#define SSE_NORMALIZE_K5(M0, M1, M2, M3)
Definition: conv_acc_sse_impl.h:219
static const unsigned t4_make_up[2][15]
Definition: bitcomp.c:188
static uint32_t osmo_load32be(const void *p)
load unaligned 32-bit integer (big-endian encoding)
Definition: bit32gen.h:89
static unsigned leading_bits(uint8_t x, bool b)
Definition: bitvec.c:556
void bitvec_shiftl(struct bitvec *bv, unsigned int n)
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
A one (1) bit.
Definition: bitvec.h:40
const uint8_t(* next_state)[2]
Next state array
Definition: conv.h:60
const struct osmo_conv_code * code
for which code?
Definition: conv.h:81
void osmo_generate_backtrace(void)
Generate and print a call back-trace.
Definition: backtrace.c:67
@ CONV_TERM_FLUSH
Flush encoder state.
Definition: conv.h:41
int K
Constraint length.
Definition: conv.h:54
void osmo_conv_decode_init(struct osmo_conv_decoder *decoder, const struct osmo_conv_code *code, int len, int start_state)
Definition: conv.c:246
__attribute__((visibility("hidden")))
Definition: conv_acc_generic.c:134
int osmo_conv_get_input_length(const struct osmo_conv_code *code, int len)
Definition: conv.c:48
const int * puncture
Punctured bits indexes.
Definition: conv.h:65
static unsigned int bytenum_from_bitnum(unsigned int bitnum)
Definition: bitvec.c:51
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:370
uint8_t ubit_t
unpacked bit (0 or 1): 1 bit per byte
Definition: bits.h:24
#define ARRAY_SIZE(x)
Determine number of elements in an array of static size.
Definition: utils.h:14
static uint8_t bitval2mask(enum bit_value bit, uint8_t bitnum)
Definition: bitvec.c:59
int N
Inverse of code rate.
Definition: conv.h:53
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
const uint8_t * next_term_output
Flush termination output.
Definition: conv.h:62
static int generate_trellis(struct vdecoder *dec, const struct osmo_conv_code *code)
Definition: conv_acc.c:385
static void osmo_store16be(uint16_t x, void *p)
store unaligned 16-bit integer (big-endian encoding)
Definition: bit16gen.h:102
osmo_br_mode
bit-reversal mode for osmo_bit_reversal()
Definition: bits.h:93
int k
Definition: conv_acc.c:165
uint8_t * vals
Definition: conv_acc.c:151
static void free_trellis(struct vtrellis *trellis)
Definition: conv_acc.c:369
#define __always_inline
Definition: conv_acc_sse_impl.h:30
void bitvec_zero(struct bitvec *bv)
force bit vector to all 0 and current bit to the beginnig of the vector
Definition: bitvec.c:578
static void osmo_store32be(uint32_t x, void *p)
store unaligned 32-bit integer (big-endian encoding)
Definition: bit32gen.h:102
static const unsigned t4_term_length[2][64]
Definition: bitcomp.c:178
@ H
A CSN.1 "H" bit.
Definition: bitvec.h:42
static void vdec_deinit(struct vdecoder *dec)
Definition: conv_acc.c:500
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:589
void int log_init(const struct log_info *inf, void *talloc_ctx)
Initialize the Osmocom logging core.
Definition: logging.c:1075
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:109
#define LOGP(ss, level, fmt, args...)
Log a new message through the Osmocom logging framework.
Definition: logging.h:46
int osmo_conv_encode_raw(struct osmo_conv_encoder *encoder, const ubit_t *input, ubit_t *output, int n)
Definition: conv.c:137
int bitvec_spare_padding(struct bitvec *bv, unsigned int up_to_bit)
pad all remaining bits up to num_bits
Definition: bitvec.c:303
char bit_value_to_char(enum bit_value v)
convert enum to corresponding character
Definition: bitvec.c:527
static unsigned vstate_lshift(unsigned reg, int k, int val)
Definition: conv_acc.c:183
unsigned int cur_bit
cursor to the next unused bit
Definition: bitvec.h:47
int len
Definition: conv.h:55
void osmo_ubit2sbit(sbit_t *out, const ubit_t *in, unsigned int num_bits)
convert unpacked bits to soft bits
Definition: bits.c:121
static unsigned bitswap(unsigned v, unsigned n)
Definition: conv_acc.c:227
Definition: conv_acc.c:163
void osmo_log_backtrace(int subsys, int level)
Generate and log a call back-trace.
Definition: backtrace.c:79
static int _conv_encode_do_output(struct osmo_conv_encoder *encoder, uint8_t out, ubit_t *output)
Definition: conv.c:107
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
int n_states
number of states
Definition: conv.h:108
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:251
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
int bitvec_get_uint(struct bitvec *bv, unsigned int num_bits)
get multiple bits (based on numeric value) from current pos
Definition: bitvec.c:271
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
#define SSE_DEINTERLEAVE_K5(M0, M1, M2, M3)
Definition: conv_acc_sse_impl.h:80
static void sighup_hdlr(int signal)
Definition: application.c:87
static __always_inline void _sse_metrics_k5_n2(const int16_t *val, const int16_t *out, int16_t *sums, int16_t *paths, int norm)
Definition: conv_acc_sse_impl.h:266
#define MAX_AE
Definition: conv.c:238
__attribute__((visibility("hidden")))
Include common SSE implementation.
Definition: conv_acc_sse_avx.c:68
static unsigned bitswap5(unsigned v)
Definition: conv_acc.c:215
void log_set_all_filter(struct log_target *target, int)
Enable the LOG_FLT_ALL log filter.
Definition: logging.c:615
void osmo_conv_decode_deinit(struct osmo_conv_decoder *decoder)
Definition: conv.c:315
structure describing a given convolutional code
Definition: conv.h:52
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:291
#define INIT_POINTERS(simd)
Definition: conv_acc.c:36
int bitvec_unhex(struct bitvec *bv, const char *src)
read hexadecimap string into a bit vector
Definition: bitvec.c:463
Definition: conv_acc.c:147
unsigned int bitvec_unpack(struct bitvec *bv, const uint8_t *buffer)
Copy buffer of unpacked bits into bit vector.
Definition: bitvec.c:449
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:132
static const unsigned t4_make_up_length[2][15]
Definition: bitcomp.c:183
@ L
A CSN.1 "L" bit.
Definition: bitvec.h:41
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