§ Coverage
1/*2 * sc_lut.c -- implementation. Blocks are tagged with the low-level3 * requirement they satisfy; see requirements/sc_lut.md.4 */5#include "sc_lut.h"6#include "sc_sat.h"786sc_status_t sc_lut_valid(const sc_lut_t *lut)9{106 sc_status_t status = SC_OK;11126 if ((lut == NULL) || (lut->x == NULL) || (lut->y == NULL))condition outcomes covered 6/613 {143 status = SC_ERR_NULL; /* LLR-LUT-8 */15 }163 else if (lut->n < 2u)condition outcomes covered 2/217 {181 status = SC_ERR_PARAM; /* LLR-LUT-9 */19 }20 else21 {22 uint32_t i;237 for (i = 0u; (i + 1u) < lut->n; i++) /* LLR-LUT-10 */condition outcomes covered 2/224 {255 if (lut->x[i + 1u] <= lut->x[i])condition outcomes covered 2/226 {271 status = SC_ERR_PARAM; /* not strictly increasing */28 }29 }30 }31326 return status;33}343514int32_t sc_lut_eval(const sc_lut_t *lut, int32_t x)36{37 int32_t result;383914 if (lut == NULL)condition outcomes covered 2/240 {411 result = 0; /* LLR-LUT-7 */42 }4313 else if (x <= lut->x[0])condition outcomes covered 2/244 {452 result = lut->y[0]; /* LLR-LUT-1: clamp low */46 }47 else48 {4911 uint32_t i = 0u;505127 while ((i + 1u) < lut->n) /* LLR-LUT-3: find segment */condition outcomes covered 2/252 {5325 if (x < lut->x[i + 1u])condition outcomes covered 2/254 {559 break;56 }5716 i++;58 }596011 if ((i + 1u) >= lut->n)condition outcomes covered 2/261 {622 result = lut->y[lut->n - 1u]; /* LLR-LUT-2: clamp high */63 }64 else65 {669 int64_t span = (int64_t)lut->x[i + 1u] - (int64_t)lut->x[i]; /* > 0 */679 int64_t step = (int64_t)lut->y[i + 1u] - (int64_t)lut->y[i]; /* LLR-LUT-4 */689 int64_t offset = (step * ((int64_t)x - (int64_t)lut->x[i])) / span; /* LLR-LUT-5 */69709 result = sc_sat_add_i32(lut->y[i], (int32_t)offset); /* LLR-LUT-6 */71 }72 }737414 return result;75}