// basecase_mul.v - NTT-domain degree-1 polynomial multiplication
//
// Computes pointwise product of two degree-1 NTT-domain polynomials:
//   c0 = (a0*b0 + a1*b1*zeta) mod Q
//   c1 = (a0*b1 + a1*b0) mod Q
//
// Uses three barrett_mul instances for modular multiplications
// and pure combinational modular addition for the final sums.
//
// All inputs/outputs are 12-bit values in [0, Q-1] where Q = 3329.

module basecase_mul (
    input  [11:0] a0, a1,   // first polynomial: degree-0 and degree-1 coeffs
    input  [11:0] b0, b1,   // second polynomial: degree-0 and degree-1 coeffs
    input  [11:0] zeta,     // precomputed twiddle factor (zeta^2 * 17 mod Q)
    output [11:0] c0, c1    // result polynomial coefficients
);

    localparam Q = 3329;

    // Barrett modular multiplication outputs
    wire [11:0] t1;         // a0 * b0 mod Q
    wire [11:0] t2;         // a1 * b1 mod Q
    wire [11:0] t3;         // a1 * b0 mod Q
    wire [11:0] t4;         // a0 * b1 mod Q
    wire [11:0] t2_zeta;    // (a1 * b1) * zeta mod Q

    // Four Barrett multiplications for the scalar products
    barrett_mul u_mul1 (.a(a0), .b(b0), .product(t1));
    barrett_mul u_mul2 (.a(a1), .b(b1), .product(t2));
    barrett_mul u_mul3 (.a(a1), .b(b0), .product(t3));
    barrett_mul u_mul4 (.a(a0), .b(b1), .product(t4));

    // Multiply t2 by zeta for the zeta term in c0
    barrett_mul u_mul_zeta (.a(t2), .b(zeta), .product(t2_zeta));

    // Combinational modular addition: each sum is in [0, 2Q-1)
    // Subtract Q once if >= Q
    wire [12:0] sum_c0 = {1'b0, t1} + {1'b0, t2_zeta};
    wire [12:0] sum_c1 = {1'b0, t3} + {1'b0, t4};

    assign c0 = (sum_c0 >= Q) ? sum_c0[11:0] - Q[11:0] : sum_c0[11:0];
    assign c1 = (sum_c1 >= Q) ? sum_c1[11:0] - Q[11:0] : sum_c1[11:0];

endmodule
