cera 0.5.2

Rust-native LLM inference engine
Documentation
#include <metal_stdlib>
#include <metal_math>
#include <metal_texture>
using namespace metal;

#line 83 "cera/src/backend/shaders/slang/power_spec.slang"
struct KernelContext_0
{
    packed_uint4 device* par_buf_0;
    float device* frames_buf_0;
    float device* twiddle_buf_0;
    float device* power_buf_0;
};


#line 56
[[kernel]] void power_spec(uint3 gid_0 [[thread_position_in_grid]], packed_uint4 device* par_buf_1 [[buffer(3)]], float device* frames_buf_1 [[buffer(0)]], float device* twiddle_buf_1 [[buffer(1)]], float device* power_buf_1 [[buffer(2)]])
{

#line 56
    thread KernelContext_0 kernelContext_0;

#line 56
    (&kernelContext_0)->par_buf_0 = par_buf_1;

#line 56
    (&kernelContext_0)->frames_buf_0 = frames_buf_1;

#line 56
    (&kernelContext_0)->twiddle_buf_0 = twiddle_buf_1;

#line 56
    (&kernelContext_0)->power_buf_0 = power_buf_1;

    uint n_fft_0 = (uint4(*(par_buf_1+int(0))) ).y;
    uint n_bins_0 = (uint4(*(par_buf_1+int(0))) ).z;


    uint idx_0 = gid_0.x;
    if(idx_0 >= ((uint4(*(par_buf_1+int(0))) ).x * n_bins_0))
    {

#line 64
        return;
    }

    uint t_0 = idx_0 / n_bins_0;
    uint _S1 = idx_0 - t_0 * n_bins_0;
    uint _S2 = t_0 * n_fft_0;

#line 69
    uint n_0 = 0U;

#line 69
    uint m_0 = 0U;

#line 69
    float re_0 = 0.0f;

#line 69
    float im_0 = 0.0f;

#line 74
    for(;;)
    {

#line 74
        if(n_0 < n_fft_0)
        {
        }
        else
        {

#line 74
            break;
        }

#line 75
        float x_0 = (&kernelContext_0)->frames_buf_0[_S2 + n_0];
        uint _S3 = 2U * m_0;

#line 76
        float re_1 = re_0 + x_0 * (&kernelContext_0)->twiddle_buf_0[_S3];
        float im_1 = im_0 + x_0 * (&kernelContext_0)->twiddle_buf_0[_S3 + 1U];
        uint m_1 = m_0 + _S1;
        if(m_1 >= n_fft_0)
        {

#line 79
            m_0 = m_1 - n_fft_0;

#line 79
        }
        else
        {

#line 79
            m_0 = m_1;

#line 79
        }

#line 74
        n_0 = n_0 + 1U;

#line 74
        re_0 = re_1;

#line 74
        im_0 = im_1;

#line 74
    }

#line 83
    *((&kernelContext_0)->power_buf_0+idx_0) = re_0 * re_0 + im_0 * im_0;
    return;
}