// Carry-less multiplier generated for N = 16: schoolbook array with a balanced XOR tree per column.
// 256 AND, 225 XOR before synthesis.
// Scoring baseline only: correct at this N, NOT a parametric or proved entry.
module clmul_n #(parameter int N = 16) (
  input  logic [N-1:0]   a, b,
  output logic [2*N-2:0] p
);
  logic [480: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[0] & b[8];
  assign w[9] = a[0] & b[9];
  assign w[10] = a[0] & b[10];
  assign w[11] = a[0] & b[11];
  assign w[12] = a[0] & b[12];
  assign w[13] = a[0] & b[13];
  assign w[14] = a[0] & b[14];
  assign w[15] = a[0] & b[15];
  assign w[16] = a[1] & b[0];
  assign w[17] = a[1] & b[1];
  assign w[18] = a[1] & b[2];
  assign w[19] = a[1] & b[3];
  assign w[20] = a[1] & b[4];
  assign w[21] = a[1] & b[5];
  assign w[22] = a[1] & b[6];
  assign w[23] = a[1] & b[7];
  assign w[24] = a[1] & b[8];
  assign w[25] = a[1] & b[9];
  assign w[26] = a[1] & b[10];
  assign w[27] = a[1] & b[11];
  assign w[28] = a[1] & b[12];
  assign w[29] = a[1] & b[13];
  assign w[30] = a[1] & b[14];
  assign w[31] = a[1] & b[15];
  assign w[32] = a[2] & b[0];
  assign w[33] = a[2] & b[1];
  assign w[34] = a[2] & b[2];
  assign w[35] = a[2] & b[3];
  assign w[36] = a[2] & b[4];
  assign w[37] = a[2] & b[5];
  assign w[38] = a[2] & b[6];
  assign w[39] = a[2] & b[7];
  assign w[40] = a[2] & b[8];
  assign w[41] = a[2] & b[9];
  assign w[42] = a[2] & b[10];
  assign w[43] = a[2] & b[11];
  assign w[44] = a[2] & b[12];
  assign w[45] = a[2] & b[13];
  assign w[46] = a[2] & b[14];
  assign w[47] = a[2] & b[15];
  assign w[48] = a[3] & b[0];
  assign w[49] = a[3] & b[1];
  assign w[50] = a[3] & b[2];
  assign w[51] = a[3] & b[3];
  assign w[52] = a[3] & b[4];
  assign w[53] = a[3] & b[5];
  assign w[54] = a[3] & b[6];
  assign w[55] = a[3] & b[7];
  assign w[56] = a[3] & b[8];
  assign w[57] = a[3] & b[9];
  assign w[58] = a[3] & b[10];
  assign w[59] = a[3] & b[11];
  assign w[60] = a[3] & b[12];
  assign w[61] = a[3] & b[13];
  assign w[62] = a[3] & b[14];
  assign w[63] = a[3] & b[15];
  assign w[64] = a[4] & b[0];
  assign w[65] = a[4] & b[1];
  assign w[66] = a[4] & b[2];
  assign w[67] = a[4] & b[3];
  assign w[68] = a[4] & b[4];
  assign w[69] = a[4] & b[5];
  assign w[70] = a[4] & b[6];
  assign w[71] = a[4] & b[7];
  assign w[72] = a[4] & b[8];
  assign w[73] = a[4] & b[9];
  assign w[74] = a[4] & b[10];
  assign w[75] = a[4] & b[11];
  assign w[76] = a[4] & b[12];
  assign w[77] = a[4] & b[13];
  assign w[78] = a[4] & b[14];
  assign w[79] = a[4] & b[15];
  assign w[80] = a[5] & b[0];
  assign w[81] = a[5] & b[1];
  assign w[82] = a[5] & b[2];
  assign w[83] = a[5] & b[3];
  assign w[84] = a[5] & b[4];
  assign w[85] = a[5] & b[5];
  assign w[86] = a[5] & b[6];
  assign w[87] = a[5] & b[7];
  assign w[88] = a[5] & b[8];
  assign w[89] = a[5] & b[9];
  assign w[90] = a[5] & b[10];
  assign w[91] = a[5] & b[11];
  assign w[92] = a[5] & b[12];
  assign w[93] = a[5] & b[13];
  assign w[94] = a[5] & b[14];
  assign w[95] = a[5] & b[15];
  assign w[96] = a[6] & b[0];
  assign w[97] = a[6] & b[1];
  assign w[98] = a[6] & b[2];
  assign w[99] = a[6] & b[3];
  assign w[100] = a[6] & b[4];
  assign w[101] = a[6] & b[5];
  assign w[102] = a[6] & b[6];
  assign w[103] = a[6] & b[7];
  assign w[104] = a[6] & b[8];
  assign w[105] = a[6] & b[9];
  assign w[106] = a[6] & b[10];
  assign w[107] = a[6] & b[11];
  assign w[108] = a[6] & b[12];
  assign w[109] = a[6] & b[13];
  assign w[110] = a[6] & b[14];
  assign w[111] = a[6] & b[15];
  assign w[112] = a[7] & b[0];
  assign w[113] = a[7] & b[1];
  assign w[114] = a[7] & b[2];
  assign w[115] = a[7] & b[3];
  assign w[116] = a[7] & b[4];
  assign w[117] = a[7] & b[5];
  assign w[118] = a[7] & b[6];
  assign w[119] = a[7] & b[7];
  assign w[120] = a[7] & b[8];
  assign w[121] = a[7] & b[9];
  assign w[122] = a[7] & b[10];
  assign w[123] = a[7] & b[11];
  assign w[124] = a[7] & b[12];
  assign w[125] = a[7] & b[13];
  assign w[126] = a[7] & b[14];
  assign w[127] = a[7] & b[15];
  assign w[128] = a[8] & b[0];
  assign w[129] = a[8] & b[1];
  assign w[130] = a[8] & b[2];
  assign w[131] = a[8] & b[3];
  assign w[132] = a[8] & b[4];
  assign w[133] = a[8] & b[5];
  assign w[134] = a[8] & b[6];
  assign w[135] = a[8] & b[7];
  assign w[136] = a[8] & b[8];
  assign w[137] = a[8] & b[9];
  assign w[138] = a[8] & b[10];
  assign w[139] = a[8] & b[11];
  assign w[140] = a[8] & b[12];
  assign w[141] = a[8] & b[13];
  assign w[142] = a[8] & b[14];
  assign w[143] = a[8] & b[15];
  assign w[144] = a[9] & b[0];
  assign w[145] = a[9] & b[1];
  assign w[146] = a[9] & b[2];
  assign w[147] = a[9] & b[3];
  assign w[148] = a[9] & b[4];
  assign w[149] = a[9] & b[5];
  assign w[150] = a[9] & b[6];
  assign w[151] = a[9] & b[7];
  assign w[152] = a[9] & b[8];
  assign w[153] = a[9] & b[9];
  assign w[154] = a[9] & b[10];
  assign w[155] = a[9] & b[11];
  assign w[156] = a[9] & b[12];
  assign w[157] = a[9] & b[13];
  assign w[158] = a[9] & b[14];
  assign w[159] = a[9] & b[15];
  assign w[160] = a[10] & b[0];
  assign w[161] = a[10] & b[1];
  assign w[162] = a[10] & b[2];
  assign w[163] = a[10] & b[3];
  assign w[164] = a[10] & b[4];
  assign w[165] = a[10] & b[5];
  assign w[166] = a[10] & b[6];
  assign w[167] = a[10] & b[7];
  assign w[168] = a[10] & b[8];
  assign w[169] = a[10] & b[9];
  assign w[170] = a[10] & b[10];
  assign w[171] = a[10] & b[11];
  assign w[172] = a[10] & b[12];
  assign w[173] = a[10] & b[13];
  assign w[174] = a[10] & b[14];
  assign w[175] = a[10] & b[15];
  assign w[176] = a[11] & b[0];
  assign w[177] = a[11] & b[1];
  assign w[178] = a[11] & b[2];
  assign w[179] = a[11] & b[3];
  assign w[180] = a[11] & b[4];
  assign w[181] = a[11] & b[5];
  assign w[182] = a[11] & b[6];
  assign w[183] = a[11] & b[7];
  assign w[184] = a[11] & b[8];
  assign w[185] = a[11] & b[9];
  assign w[186] = a[11] & b[10];
  assign w[187] = a[11] & b[11];
  assign w[188] = a[11] & b[12];
  assign w[189] = a[11] & b[13];
  assign w[190] = a[11] & b[14];
  assign w[191] = a[11] & b[15];
  assign w[192] = a[12] & b[0];
  assign w[193] = a[12] & b[1];
  assign w[194] = a[12] & b[2];
  assign w[195] = a[12] & b[3];
  assign w[196] = a[12] & b[4];
  assign w[197] = a[12] & b[5];
  assign w[198] = a[12] & b[6];
  assign w[199] = a[12] & b[7];
  assign w[200] = a[12] & b[8];
  assign w[201] = a[12] & b[9];
  assign w[202] = a[12] & b[10];
  assign w[203] = a[12] & b[11];
  assign w[204] = a[12] & b[12];
  assign w[205] = a[12] & b[13];
  assign w[206] = a[12] & b[14];
  assign w[207] = a[12] & b[15];
  assign w[208] = a[13] & b[0];
  assign w[209] = a[13] & b[1];
  assign w[210] = a[13] & b[2];
  assign w[211] = a[13] & b[3];
  assign w[212] = a[13] & b[4];
  assign w[213] = a[13] & b[5];
  assign w[214] = a[13] & b[6];
  assign w[215] = a[13] & b[7];
  assign w[216] = a[13] & b[8];
  assign w[217] = a[13] & b[9];
  assign w[218] = a[13] & b[10];
  assign w[219] = a[13] & b[11];
  assign w[220] = a[13] & b[12];
  assign w[221] = a[13] & b[13];
  assign w[222] = a[13] & b[14];
  assign w[223] = a[13] & b[15];
  assign w[224] = a[14] & b[0];
  assign w[225] = a[14] & b[1];
  assign w[226] = a[14] & b[2];
  assign w[227] = a[14] & b[3];
  assign w[228] = a[14] & b[4];
  assign w[229] = a[14] & b[5];
  assign w[230] = a[14] & b[6];
  assign w[231] = a[14] & b[7];
  assign w[232] = a[14] & b[8];
  assign w[233] = a[14] & b[9];
  assign w[234] = a[14] & b[10];
  assign w[235] = a[14] & b[11];
  assign w[236] = a[14] & b[12];
  assign w[237] = a[14] & b[13];
  assign w[238] = a[14] & b[14];
  assign w[239] = a[14] & b[15];
  assign w[240] = a[15] & b[0];
  assign w[241] = a[15] & b[1];
  assign w[242] = a[15] & b[2];
  assign w[243] = a[15] & b[3];
  assign w[244] = a[15] & b[4];
  assign w[245] = a[15] & b[5];
  assign w[246] = a[15] & b[6];
  assign w[247] = a[15] & b[7];
  assign w[248] = a[15] & b[8];
  assign w[249] = a[15] & b[9];
  assign w[250] = a[15] & b[10];
  assign w[251] = a[15] & b[11];
  assign w[252] = a[15] & b[12];
  assign w[253] = a[15] & b[13];
  assign w[254] = a[15] & b[14];
  assign w[255] = a[15] & b[15];
  assign w[256] = w[1] ^ w[16];
  assign w[257] = w[2] ^ w[17];
  assign w[258] = w[257] ^ w[32];
  assign w[259] = w[3] ^ w[18];
  assign w[260] = w[33] ^ w[48];
  assign w[261] = w[259] ^ w[260];
  assign w[262] = w[4] ^ w[19];
  assign w[263] = w[34] ^ w[49];
  assign w[264] = w[262] ^ w[263];
  assign w[265] = w[264] ^ w[64];
  assign w[266] = w[5] ^ w[20];
  assign w[267] = w[35] ^ w[50];
  assign w[268] = w[65] ^ w[80];
  assign w[269] = w[266] ^ w[267];
  assign w[270] = w[269] ^ w[268];
  assign w[271] = w[6] ^ w[21];
  assign w[272] = w[36] ^ w[51];
  assign w[273] = w[66] ^ w[81];
  assign w[274] = w[271] ^ w[272];
  assign w[275] = w[273] ^ w[96];
  assign w[276] = w[274] ^ w[275];
  assign w[277] = w[7] ^ w[22];
  assign w[278] = w[37] ^ w[52];
  assign w[279] = w[67] ^ w[82];
  assign w[280] = w[97] ^ w[112];
  assign w[281] = w[277] ^ w[278];
  assign w[282] = w[279] ^ w[280];
  assign w[283] = w[281] ^ w[282];
  assign w[284] = w[8] ^ w[23];
  assign w[285] = w[38] ^ w[53];
  assign w[286] = w[68] ^ w[83];
  assign w[287] = w[98] ^ w[113];
  assign w[288] = w[284] ^ w[285];
  assign w[289] = w[286] ^ w[287];
  assign w[290] = w[288] ^ w[289];
  assign w[291] = w[290] ^ w[128];
  assign w[292] = w[9] ^ w[24];
  assign w[293] = w[39] ^ w[54];
  assign w[294] = w[69] ^ w[84];
  assign w[295] = w[99] ^ w[114];
  assign w[296] = w[129] ^ w[144];
  assign w[297] = w[292] ^ w[293];
  assign w[298] = w[294] ^ w[295];
  assign w[299] = w[297] ^ w[298];
  assign w[300] = w[299] ^ w[296];
  assign w[301] = w[10] ^ w[25];
  assign w[302] = w[40] ^ w[55];
  assign w[303] = w[70] ^ w[85];
  assign w[304] = w[100] ^ w[115];
  assign w[305] = w[130] ^ w[145];
  assign w[306] = w[301] ^ w[302];
  assign w[307] = w[303] ^ w[304];
  assign w[308] = w[305] ^ w[160];
  assign w[309] = w[306] ^ w[307];
  assign w[310] = w[309] ^ w[308];
  assign w[311] = w[11] ^ w[26];
  assign w[312] = w[41] ^ w[56];
  assign w[313] = w[71] ^ w[86];
  assign w[314] = w[101] ^ w[116];
  assign w[315] = w[131] ^ w[146];
  assign w[316] = w[161] ^ w[176];
  assign w[317] = w[311] ^ w[312];
  assign w[318] = w[313] ^ w[314];
  assign w[319] = w[315] ^ w[316];
  assign w[320] = w[317] ^ w[318];
  assign w[321] = w[320] ^ w[319];
  assign w[322] = w[12] ^ w[27];
  assign w[323] = w[42] ^ w[57];
  assign w[324] = w[72] ^ w[87];
  assign w[325] = w[102] ^ w[117];
  assign w[326] = w[132] ^ w[147];
  assign w[327] = w[162] ^ w[177];
  assign w[328] = w[322] ^ w[323];
  assign w[329] = w[324] ^ w[325];
  assign w[330] = w[326] ^ w[327];
  assign w[331] = w[328] ^ w[329];
  assign w[332] = w[330] ^ w[192];
  assign w[333] = w[331] ^ w[332];
  assign w[334] = w[13] ^ w[28];
  assign w[335] = w[43] ^ w[58];
  assign w[336] = w[73] ^ w[88];
  assign w[337] = w[103] ^ w[118];
  assign w[338] = w[133] ^ w[148];
  assign w[339] = w[163] ^ w[178];
  assign w[340] = w[193] ^ w[208];
  assign w[341] = w[334] ^ w[335];
  assign w[342] = w[336] ^ w[337];
  assign w[343] = w[338] ^ w[339];
  assign w[344] = w[341] ^ w[342];
  assign w[345] = w[343] ^ w[340];
  assign w[346] = w[344] ^ w[345];
  assign w[347] = w[14] ^ w[29];
  assign w[348] = w[44] ^ w[59];
  assign w[349] = w[74] ^ w[89];
  assign w[350] = w[104] ^ w[119];
  assign w[351] = w[134] ^ w[149];
  assign w[352] = w[164] ^ w[179];
  assign w[353] = w[194] ^ w[209];
  assign w[354] = w[347] ^ w[348];
  assign w[355] = w[349] ^ w[350];
  assign w[356] = w[351] ^ w[352];
  assign w[357] = w[353] ^ w[224];
  assign w[358] = w[354] ^ w[355];
  assign w[359] = w[356] ^ w[357];
  assign w[360] = w[358] ^ w[359];
  assign w[361] = w[15] ^ w[30];
  assign w[362] = w[45] ^ w[60];
  assign w[363] = w[75] ^ w[90];
  assign w[364] = w[105] ^ w[120];
  assign w[365] = w[135] ^ w[150];
  assign w[366] = w[165] ^ w[180];
  assign w[367] = w[195] ^ w[210];
  assign w[368] = w[225] ^ w[240];
  assign w[369] = w[361] ^ w[362];
  assign w[370] = w[363] ^ w[364];
  assign w[371] = w[365] ^ w[366];
  assign w[372] = w[367] ^ w[368];
  assign w[373] = w[369] ^ w[370];
  assign w[374] = w[371] ^ w[372];
  assign w[375] = w[373] ^ w[374];
  assign w[376] = w[31] ^ w[46];
  assign w[377] = w[61] ^ w[76];
  assign w[378] = w[91] ^ w[106];
  assign w[379] = w[121] ^ w[136];
  assign w[380] = w[151] ^ w[166];
  assign w[381] = w[181] ^ w[196];
  assign w[382] = w[211] ^ w[226];
  assign w[383] = w[376] ^ w[377];
  assign w[384] = w[378] ^ w[379];
  assign w[385] = w[380] ^ w[381];
  assign w[386] = w[382] ^ w[241];
  assign w[387] = w[383] ^ w[384];
  assign w[388] = w[385] ^ w[386];
  assign w[389] = w[387] ^ w[388];
  assign w[390] = w[47] ^ w[62];
  assign w[391] = w[77] ^ w[92];
  assign w[392] = w[107] ^ w[122];
  assign w[393] = w[137] ^ w[152];
  assign w[394] = w[167] ^ w[182];
  assign w[395] = w[197] ^ w[212];
  assign w[396] = w[227] ^ w[242];
  assign w[397] = w[390] ^ w[391];
  assign w[398] = w[392] ^ w[393];
  assign w[399] = w[394] ^ w[395];
  assign w[400] = w[397] ^ w[398];
  assign w[401] = w[399] ^ w[396];
  assign w[402] = w[400] ^ w[401];
  assign w[403] = w[63] ^ w[78];
  assign w[404] = w[93] ^ w[108];
  assign w[405] = w[123] ^ w[138];
  assign w[406] = w[153] ^ w[168];
  assign w[407] = w[183] ^ w[198];
  assign w[408] = w[213] ^ w[228];
  assign w[409] = w[403] ^ w[404];
  assign w[410] = w[405] ^ w[406];
  assign w[411] = w[407] ^ w[408];
  assign w[412] = w[409] ^ w[410];
  assign w[413] = w[411] ^ w[243];
  assign w[414] = w[412] ^ w[413];
  assign w[415] = w[79] ^ w[94];
  assign w[416] = w[109] ^ w[124];
  assign w[417] = w[139] ^ w[154];
  assign w[418] = w[169] ^ w[184];
  assign w[419] = w[199] ^ w[214];
  assign w[420] = w[229] ^ w[244];
  assign w[421] = w[415] ^ w[416];
  assign w[422] = w[417] ^ w[418];
  assign w[423] = w[419] ^ w[420];
  assign w[424] = w[421] ^ w[422];
  assign w[425] = w[424] ^ w[423];
  assign w[426] = w[95] ^ w[110];
  assign w[427] = w[125] ^ w[140];
  assign w[428] = w[155] ^ w[170];
  assign w[429] = w[185] ^ w[200];
  assign w[430] = w[215] ^ w[230];
  assign w[431] = w[426] ^ w[427];
  assign w[432] = w[428] ^ w[429];
  assign w[433] = w[430] ^ w[245];
  assign w[434] = w[431] ^ w[432];
  assign w[435] = w[434] ^ w[433];
  assign w[436] = w[111] ^ w[126];
  assign w[437] = w[141] ^ w[156];
  assign w[438] = w[171] ^ w[186];
  assign w[439] = w[201] ^ w[216];
  assign w[440] = w[231] ^ w[246];
  assign w[441] = w[436] ^ w[437];
  assign w[442] = w[438] ^ w[439];
  assign w[443] = w[441] ^ w[442];
  assign w[444] = w[443] ^ w[440];
  assign w[445] = w[127] ^ w[142];
  assign w[446] = w[157] ^ w[172];
  assign w[447] = w[187] ^ w[202];
  assign w[448] = w[217] ^ w[232];
  assign w[449] = w[445] ^ w[446];
  assign w[450] = w[447] ^ w[448];
  assign w[451] = w[449] ^ w[450];
  assign w[452] = w[451] ^ w[247];
  assign w[453] = w[143] ^ w[158];
  assign w[454] = w[173] ^ w[188];
  assign w[455] = w[203] ^ w[218];
  assign w[456] = w[233] ^ w[248];
  assign w[457] = w[453] ^ w[454];
  assign w[458] = w[455] ^ w[456];
  assign w[459] = w[457] ^ w[458];
  assign w[460] = w[159] ^ w[174];
  assign w[461] = w[189] ^ w[204];
  assign w[462] = w[219] ^ w[234];
  assign w[463] = w[460] ^ w[461];
  assign w[464] = w[462] ^ w[249];
  assign w[465] = w[463] ^ w[464];
  assign w[466] = w[175] ^ w[190];
  assign w[467] = w[205] ^ w[220];
  assign w[468] = w[235] ^ w[250];
  assign w[469] = w[466] ^ w[467];
  assign w[470] = w[469] ^ w[468];
  assign w[471] = w[191] ^ w[206];
  assign w[472] = w[221] ^ w[236];
  assign w[473] = w[471] ^ w[472];
  assign w[474] = w[473] ^ w[251];
  assign w[475] = w[207] ^ w[222];
  assign w[476] = w[237] ^ w[252];
  assign w[477] = w[475] ^ w[476];
  assign w[478] = w[223] ^ w[238];
  assign w[479] = w[478] ^ w[253];
  assign w[480] = w[239] ^ w[254];
  assign p[0] = w[0];
  assign p[1] = w[256];
  assign p[2] = w[258];
  assign p[3] = w[261];
  assign p[4] = w[265];
  assign p[5] = w[270];
  assign p[6] = w[276];
  assign p[7] = w[283];
  assign p[8] = w[291];
  assign p[9] = w[300];
  assign p[10] = w[310];
  assign p[11] = w[321];
  assign p[12] = w[333];
  assign p[13] = w[346];
  assign p[14] = w[360];
  assign p[15] = w[375];
  assign p[16] = w[389];
  assign p[17] = w[402];
  assign p[18] = w[414];
  assign p[19] = w[425];
  assign p[20] = w[435];
  assign p[21] = w[444];
  assign p[22] = w[452];
  assign p[23] = w[459];
  assign p[24] = w[465];
  assign p[25] = w[470];
  assign p[26] = w[474];
  assign p[27] = w[477];
  assign p[28] = w[479];
  assign p[29] = w[480];
  assign p[30] = w[255];
endmodule
