xp param N;
xp param STEPS;

sp pool[n=2*N];
sp u[n=N] address(&pool);
sp v[n=N] address(&pool + 2*N);

sp x[n=64] bank(0);
sp y[n=64] bank(0);
sp z[n=64] bank(2);
sp p[n=64];
sp q[n=64];

u16 tsc[1] address(0x7b30);
u16 tsc_control[1] address(0x7b34);
u16 t[n=5];
xp where[n=3];

function smooth(sp src[N], sp dst[N]) {
    sp w0 = 0.5;
    sp w1 = 0.25;
    dst[0] <- src[0];
    dst[N-1] <- src[N-1];
    ∀i in [0, N-2) dst[i+1] <- w0 * src[i+1];
    ∀i in [0, N-2) dst[i+1] <+- w1 * src[i];
    ∀i in [0, N-2) dst[i+1] <+- w1 * src[i+2];
}

main {
    tsc_control[0] <- tsc_control[0] | 4;
    ∀i in [0, 64) x[i] <- 1.5;
    ∀i in [0, 64) y[i] <- 2.0;
    ∀i in [0, 64) z[i] <- 2.0;

    // 1: two buffers in one block
    t[0] <- tsc[0];
    xp s = 0;
    while (s < STEPS) {
        smooth(u, v);
        smooth(v, u);
        s += 2;
    }
    t[1] <- tsc[0];

    // 2: placement and memory banks
    t[2] <- tsc[0];
    ∀i in [0, 64) p[i] <- x[i] * y[i];
    t[3] <- tsc[0];
    ∀i in [0, 64) q[i] <- x[i] * z[i];
    t[4] <- tsc[0];
    where[0] <- x.base;
    where[1] <- y.base;
    where[2] <- z.base;
}
