// Carry-less multiplier generated for N = 8: schoolbook array with a balanced XOR tree per column.
// 64 AND, 49 XOR before synthesis.
// Scoring baseline only: correct at this N, NOT a parametric or proved entry.
module clmul_n #(parameter int N = 8) (
  input  logic [N-1:0]   a, b,
  output logic [2*N-2:0] p
);
  logic [112:0] w;
  assign w[0] = a[0] & b[0];
  assign w[1] = a[0] & b[1];
  assign w[2] = a[0] & b[2];
  assign w[3] = a[0] & b[3];
  assign w[4] = a[0] & b[4];
  assign w[5] = a[0] & b[5];
  assign w[6] = a[0] & b[6];
  assign w[7] = a[0] & b[7];
  assign w[8] = a[1] & b[0];
  assign w[9] = a[1] & b[1];
  assign w[10] = a[1] & b[2];
  assign w[11] = a[1] & b[3];
  assign w[12] = a[1] & b[4];
  assign w[13] = a[1] & b[5];
  assign w[14] = a[1] & b[6];
  assign w[15] = a[1] & b[7];
  assign w[16] = a[2] & b[0];
  assign w[17] = a[2] & b[1];
  assign w[18] = a[2] & b[2];
  assign w[19] = a[2] & b[3];
  assign w[20] = a[2] & b[4];
  assign w[21] = a[2] & b[5];
  assign w[22] = a[2] & b[6];
  assign w[23] = a[2] & b[7];
  assign w[24] = a[3] & b[0];
  assign w[25] = a[3] & b[1];
  assign w[26] = a[3] & b[2];
  assign w[27] = a[3] & b[3];
  assign w[28] = a[3] & b[4];
  assign w[29] = a[3] & b[5];
  assign w[30] = a[3] & b[6];
  assign w[31] = a[3] & b[7];
  assign w[32] = a[4] & b[0];
  assign w[33] = a[4] & b[1];
  assign w[34] = a[4] & b[2];
  assign w[35] = a[4] & b[3];
  assign w[36] = a[4] & b[4];
  assign w[37] = a[4] & b[5];
  assign w[38] = a[4] & b[6];
  assign w[39] = a[4] & b[7];
  assign w[40] = a[5] & b[0];
  assign w[41] = a[5] & b[1];
  assign w[42] = a[5] & b[2];
  assign w[43] = a[5] & b[3];
  assign w[44] = a[5] & b[4];
  assign w[45] = a[5] & b[5];
  assign w[46] = a[5] & b[6];
  assign w[47] = a[5] & b[7];
  assign w[48] = a[6] & b[0];
  assign w[49] = a[6] & b[1];
  assign w[50] = a[6] & b[2];
  assign w[51] = a[6] & b[3];
  assign w[52] = a[6] & b[4];
  assign w[53] = a[6] & b[5];
  assign w[54] = a[6] & b[6];
  assign w[55] = a[6] & b[7];
  assign w[56] = a[7] & b[0];
  assign w[57] = a[7] & b[1];
  assign w[58] = a[7] & b[2];
  assign w[59] = a[7] & b[3];
  assign w[60] = a[7] & b[4];
  assign w[61] = a[7] & b[5];
  assign w[62] = a[7] & b[6];
  assign w[63] = a[7] & b[7];
  assign w[64] = w[1] ^ w[8];
  assign w[65] = w[2] ^ w[9];
  assign w[66] = w[65] ^ w[16];
  assign w[67] = w[3] ^ w[10];
  assign w[68] = w[17] ^ w[24];
  assign w[69] = w[67] ^ w[68];
  assign w[70] = w[4] ^ w[11];
  assign w[71] = w[18] ^ w[25];
  assign w[72] = w[70] ^ w[71];
  assign w[73] = w[72] ^ w[32];
  assign w[74] = w[5] ^ w[12];
  assign w[75] = w[19] ^ w[26];
  assign w[76] = w[33] ^ w[40];
  assign w[77] = w[74] ^ w[75];
  assign w[78] = w[77] ^ w[76];
  assign w[79] = w[6] ^ w[13];
  assign w[80] = w[20] ^ w[27];
  assign w[81] = w[34] ^ w[41];
  assign w[82] = w[79] ^ w[80];
  assign w[83] = w[81] ^ w[48];
  assign w[84] = w[82] ^ w[83];
  assign w[85] = w[7] ^ w[14];
  assign w[86] = w[21] ^ w[28];
  assign w[87] = w[35] ^ w[42];
  assign w[88] = w[49] ^ w[56];
  assign w[89] = w[85] ^ w[86];
  assign w[90] = w[87] ^ w[88];
  assign w[91] = w[89] ^ w[90];
  assign w[92] = w[15] ^ w[22];
  assign w[93] = w[29] ^ w[36];
  assign w[94] = w[43] ^ w[50];
  assign w[95] = w[92] ^ w[93];
  assign w[96] = w[94] ^ w[57];
  assign w[97] = w[95] ^ w[96];
  assign w[98] = w[23] ^ w[30];
  assign w[99] = w[37] ^ w[44];
  assign w[100] = w[51] ^ w[58];
  assign w[101] = w[98] ^ w[99];
  assign w[102] = w[101] ^ w[100];
  assign w[103] = w[31] ^ w[38];
  assign w[104] = w[45] ^ w[52];
  assign w[105] = w[103] ^ w[104];
  assign w[106] = w[105] ^ w[59];
  assign w[107] = w[39] ^ w[46];
  assign w[108] = w[53] ^ w[60];
  assign w[109] = w[107] ^ w[108];
  assign w[110] = w[47] ^ w[54];
  assign w[111] = w[110] ^ w[61];
  assign w[112] = w[55] ^ w[62];
  assign p[0] = w[0];
  assign p[1] = w[64];
  assign p[2] = w[66];
  assign p[3] = w[69];
  assign p[4] = w[73];
  assign p[5] = w[78];
  assign p[6] = w[84];
  assign p[7] = w[91];
  assign p[8] = w[97];
  assign p[9] = w[102];
  assign p[10] = w[106];
  assign p[11] = w[109];
  assign p[12] = w[111];
  assign p[13] = w[112];
  assign p[14] = w[63];
endmodule
