diff --git a/.gitignore b/.gitignore index 1b06c860b1..658ebb6f80 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ results.xml # Ignore .fud2 cache .fud2/ +.fud2-*/ !cider-dap/calyxDebug/package.json diff --git a/interp/cider2-tests/benchmarks/ntt-32.expect b/interp/cider2-tests/benchmarks/ntt-32.expect new file mode 100644 index 0000000000..f714ab326b --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-32.expect @@ -0,0 +1,70 @@ +{ + "a": [ + 14, + 50, + 49, + 58, + 48, + 6, + 75, + 69, + 20, + 94, + 65, + 58, + 62, + 9, + 18, + 46, + 29, + 5, + 40, + 40, + 30, + 87, + 90, + 7, + 10, + 12, + 70, + 32, + 74, + 70, + 30, + 14 + ], + "phis": [ + 1, + 28, + 8, + 30, + 64, + 46, + 27, + 77, + 22, + 34, + 79, + 78, + 50, + 42, + 12, + 45, + 96, + 69, + 89, + 67, + 33, + 51, + 70, + 20, + 75, + 63, + 18, + 19, + 47, + 55, + 85, + 52 + ] +} diff --git a/interp/cider2-tests/benchmarks/ntt-32.futil b/interp/cider2-tests/benchmarks/ntt-32.futil new file mode 100644 index 0000000000..0a7f831149 --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-32.futil @@ -0,0 +1,3427 @@ +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+ +// | a | Stage 0 | Stage 1 | Stage 2 | Stage 3 | Stage 4 | +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+ +// | 0 | a[0] + a[16] * phis[1] | a[0] + a[8] * phis[2] | a[0] + a[4] * phis[4] | a[0] + a[2] * phis[8] | a[0] + a[1] * phis[16] | +// | 1 | a[1] + a[17] * phis[1] | a[1] + a[9] * phis[2] | a[1] + a[5] * phis[4] | a[1] + a[3] * phis[8] | a[0] - a[1] * phis[16] | +// | 2 | a[2] + a[18] * phis[1] | a[2] + a[10] * phis[2] | a[2] + a[6] * phis[4] | a[0] - a[2] * phis[8] | a[2] + a[3] * phis[17] | +// | 3 | a[3] + a[19] * phis[1] | a[3] + a[11] * phis[2] | a[3] + a[7] * phis[4] | a[1] - a[3] * phis[8] | a[2] - a[3] * phis[17] | +// | 4 | a[4] + a[20] * phis[1] | a[4] + a[12] * phis[2] | a[0] - a[4] * phis[4] | a[4] + a[6] * phis[9] | a[4] + a[5] * phis[18] | +// | 5 | a[5] + a[21] * phis[1] | a[5] + a[13] * phis[2] | a[1] - a[5] * phis[4] | a[5] + a[7] * phis[9] | a[4] - a[5] * phis[18] | +// | 6 | a[6] + a[22] * phis[1] | a[6] + a[14] * phis[2] | a[2] - a[6] * phis[4] | a[4] - a[6] * phis[9] | a[6] + a[7] * phis[19] | +// | 7 | a[7] + a[23] * phis[1] | a[7] + a[15] * phis[2] | a[3] - a[7] * phis[4] | a[5] - a[7] * phis[9] | a[6] - a[7] * phis[19] | +// | 8 | a[8] + a[24] * phis[1] | a[0] - a[8] * phis[2] | a[8] + a[12] * phis[5] | a[8] + a[10] * phis[10] | a[8] + a[9] * phis[20] | +// | 9 | a[9] + a[25] * phis[1] | a[1] - a[9] * phis[2] | a[9] + a[13] * phis[5] | a[9] + a[11] * phis[10] | a[8] - a[9] * phis[20] | +// | 10 | a[10] + a[26] * phis[1] | a[2] - a[10] * phis[2] | a[10] + a[14] * phis[5] | a[8] - a[10] * phis[10] | a[10] + a[11] * phis[21] | +// | 11 | a[11] + a[27] * phis[1] | a[3] - a[11] * phis[2] | a[11] + a[15] * phis[5] | a[9] - a[11] * phis[10] | a[10] - a[11] * phis[21] | +// | 12 | a[12] + a[28] * phis[1] | a[4] - a[12] * phis[2] | a[8] - a[12] * phis[5] | a[12] + a[14] * phis[11] | a[12] + a[13] * phis[22] | +// | 13 | a[13] + a[29] * phis[1] | a[5] - a[13] * phis[2] | a[9] - a[13] * phis[5] | a[13] + a[15] * phis[11] | a[12] - a[13] * phis[22] | +// | 14 | a[14] + a[30] * phis[1] | a[6] - a[14] * phis[2] | a[10] - a[14] * phis[5] | a[12] - a[14] * phis[11] | a[14] + a[15] * phis[23] | +// | 15 | a[15] + a[31] * phis[1] | a[7] - a[15] * phis[2] | a[11] - a[15] * phis[5] | a[13] - a[15] * phis[11] | a[14] - a[15] * phis[23] | +// | 16 | a[0] - a[16] * phis[1] | a[16] + a[24] * phis[3] | a[16] + a[20] * phis[6] | a[16] + a[18] * phis[12] | a[16] + a[17] * phis[24] | +// | 17 | a[1] - a[17] * phis[1] | a[17] + a[25] * phis[3] | a[17] + a[21] * phis[6] | a[17] + a[19] * phis[12] | a[16] - a[17] * phis[24] | +// | 18 | a[2] - a[18] * phis[1] | a[18] + a[26] * phis[3] | a[18] + a[22] * phis[6] | a[16] - a[18] * phis[12] | a[18] + a[19] * phis[25] | +// | 19 | a[3] - a[19] * phis[1] | a[19] + a[27] * phis[3] | a[19] + a[23] * phis[6] | a[17] - a[19] * phis[12] | a[18] - a[19] * phis[25] | +// | 20 | a[4] - a[20] * phis[1] | a[20] + a[28] * phis[3] | a[16] - a[20] * phis[6] | a[20] + a[22] * phis[13] | a[20] + a[21] * phis[26] | +// | 21 | a[5] - a[21] * phis[1] | a[21] + a[29] * phis[3] | a[17] - a[21] * phis[6] | a[21] + a[23] * phis[13] | a[20] - a[21] * phis[26] | +// | 22 | a[6] - a[22] * phis[1] | a[22] + a[30] * phis[3] | a[18] - a[22] * phis[6] | a[20] - a[22] * phis[13] | a[22] + a[23] * phis[27] | +// | 23 | a[7] - a[23] * phis[1] | a[23] + a[31] * phis[3] | a[19] - a[23] * phis[6] | a[21] - a[23] * phis[13] | a[22] - a[23] * phis[27] | +// | 24 | a[8] - a[24] * phis[1] | a[16] - a[24] * phis[3] | a[24] + a[28] * phis[7] | a[24] + a[26] * phis[14] | a[24] + a[25] * phis[28] | +// | 25 | a[9] - a[25] * phis[1] | a[17] - a[25] * phis[3] | a[25] + a[29] * phis[7] | a[25] + a[27] * phis[14] | a[24] - a[25] * phis[28] | +// | 26 | a[10] - a[26] * phis[1] | a[18] - a[26] * phis[3] | a[26] + a[30] * phis[7] | a[24] - a[26] * phis[14] | a[26] + a[27] * phis[29] | +// | 27 | a[11] - a[27] * phis[1] | a[19] - a[27] * phis[3] | a[27] + a[31] * phis[7] | a[25] - a[27] * phis[14] | a[26] - a[27] * phis[29] | +// | 28 | a[12] - a[28] * phis[1] | a[20] - a[28] * phis[3] | a[24] - a[28] * phis[7] | a[28] + a[30] * phis[15] | a[28] + a[29] * phis[30] | +// | 29 | a[13] - a[29] * phis[1] | a[21] - a[29] * phis[3] | a[25] - a[29] * phis[7] | a[29] + a[31] * phis[15] | a[28] - a[29] * phis[30] | +// | 30 | a[14] - a[30] * phis[1] | a[22] - a[30] * phis[3] | a[26] - a[30] * phis[7] | a[28] - a[30] * phis[15] | a[30] + a[31] * phis[31] | +// | 31 | a[15] - a[31] * phis[1] | a[23] - a[31] * phis[3] | a[27] - a[31] * phis[7] | a[29] - a[31] * phis[15] | a[30] - a[31] * phis[31] | +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+ +import "primitives/core.futil"; +import "primitives/binary_operators.futil"; +import "primitives/memories/comb.futil"; +component main() -> () { + cells { + @external(1) a = comb_mem_d1(32, 32, 6); + @external(1) phis = comb_mem_d1(32, 32, 6); + r0 = std_reg(32); + r1 = std_reg(32); + r2 = std_reg(32); + r3 = std_reg(32); + r4 = std_reg(32); + r5 = std_reg(32); + r6 = std_reg(32); + r7 = std_reg(32); + r8 = std_reg(32); + r9 = std_reg(32); + r10 = std_reg(32); + r11 = std_reg(32); + r12 = std_reg(32); + r13 = std_reg(32); + r14 = std_reg(32); + r15 = std_reg(32); + r16 = std_reg(32); + r17 = std_reg(32); + r18 = std_reg(32); + r19 = std_reg(32); + r20 = std_reg(32); + r21 = std_reg(32); + r22 = std_reg(32); + r23 = std_reg(32); + r24 = std_reg(32); + r25 = std_reg(32); + r26 = std_reg(32); + r27 = std_reg(32); + r28 = std_reg(32); + r29 = std_reg(32); + r30 = std_reg(32); + r31 = std_reg(32); + A0 = std_reg(32); + A1 = std_reg(32); + A2 = std_reg(32); + A3 = std_reg(32); + A4 = std_reg(32); + A5 = std_reg(32); + A6 = std_reg(32); + A7 = std_reg(32); + A8 = std_reg(32); + A9 = std_reg(32); + A10 = std_reg(32); + A11 = std_reg(32); + A12 = std_reg(32); + A13 = std_reg(32); + A14 = std_reg(32); + A15 = std_reg(32); + A16 = std_reg(32); + A17 = std_reg(32); + A18 = std_reg(32); + A19 = std_reg(32); + A20 = std_reg(32); + A21 = std_reg(32); + A22 = std_reg(32); + A23 = std_reg(32); + A24 = std_reg(32); + A25 = std_reg(32); + A26 = std_reg(32); + A27 = std_reg(32); + A28 = std_reg(32); + A29 = std_reg(32); + A30 = std_reg(32); + A31 = std_reg(32); + mul0 = std_reg(32); + mul1 = std_reg(32); + mul2 = std_reg(32); + mul3 = std_reg(32); + mul4 = std_reg(32); + mul5 = std_reg(32); + mul6 = std_reg(32); + mul7 = std_reg(32); + mul8 = std_reg(32); + mul9 = std_reg(32); + mul10 = std_reg(32); + mul11 = std_reg(32); + mul12 = std_reg(32); + mul13 = std_reg(32); + mul14 = std_reg(32); + mul15 = std_reg(32); + phi0 = std_reg(32); + phi1 = std_reg(32); + phi2 = std_reg(32); + phi3 = std_reg(32); + phi4 = std_reg(32); + phi5 = std_reg(32); + phi6 = std_reg(32); + phi7 = std_reg(32); + phi8 = std_reg(32); + phi9 = std_reg(32); + phi10 = std_reg(32); + phi11 = std_reg(32); + phi12 = std_reg(32); + phi13 = std_reg(32); + phi14 = std_reg(32); + phi15 = std_reg(32); + phi16 = std_reg(32); + phi17 = std_reg(32); + phi18 = std_reg(32); + phi19 = std_reg(32); + phi20 = std_reg(32); + phi21 = std_reg(32); + phi22 = std_reg(32); + phi23 = std_reg(32); + phi24 = std_reg(32); + phi25 = std_reg(32); + phi26 = std_reg(32); + phi27 = std_reg(32); + phi28 = std_reg(32); + phi29 = std_reg(32); + phi30 = std_reg(32); + phi31 = std_reg(32); + mod_pipe0 = std_sdiv_pipe(32); + mod_pipe1 = std_sdiv_pipe(32); + mod_pipe2 = std_sdiv_pipe(32); + mod_pipe3 = std_sdiv_pipe(32); + mod_pipe4 = std_sdiv_pipe(32); + mod_pipe5 = std_sdiv_pipe(32); + mod_pipe6 = std_sdiv_pipe(32); + mod_pipe7 = std_sdiv_pipe(32); + mod_pipe8 = std_sdiv_pipe(32); + mod_pipe9 = std_sdiv_pipe(32); + mod_pipe10 = std_sdiv_pipe(32); + mod_pipe11 = std_sdiv_pipe(32); + mod_pipe12 = std_sdiv_pipe(32); + mod_pipe13 = std_sdiv_pipe(32); + mod_pipe14 = std_sdiv_pipe(32); + mod_pipe15 = std_sdiv_pipe(32); + mod_pipe16 = std_sdiv_pipe(32); + mod_pipe17 = std_sdiv_pipe(32); + mod_pipe18 = std_sdiv_pipe(32); + mod_pipe19 = std_sdiv_pipe(32); + mod_pipe20 = std_sdiv_pipe(32); + mod_pipe21 = std_sdiv_pipe(32); + mod_pipe22 = std_sdiv_pipe(32); + mod_pipe23 = std_sdiv_pipe(32); + mod_pipe24 = std_sdiv_pipe(32); + mod_pipe25 = std_sdiv_pipe(32); + mod_pipe26 = std_sdiv_pipe(32); + mod_pipe27 = std_sdiv_pipe(32); + mod_pipe28 = std_sdiv_pipe(32); + mod_pipe29 = std_sdiv_pipe(32); + mod_pipe30 = std_sdiv_pipe(32); + mod_pipe31 = std_sdiv_pipe(32); + mult_pipe0 = std_smult_pipe(32); + mult_pipe1 = std_smult_pipe(32); + mult_pipe2 = std_smult_pipe(32); + mult_pipe3 = std_smult_pipe(32); + mult_pipe4 = std_smult_pipe(32); + mult_pipe5 = std_smult_pipe(32); + mult_pipe6 = std_smult_pipe(32); + mult_pipe7 = std_smult_pipe(32); + mult_pipe8 = std_smult_pipe(32); + mult_pipe9 = std_smult_pipe(32); + mult_pipe10 = std_smult_pipe(32); + mult_pipe11 = std_smult_pipe(32); + mult_pipe12 = std_smult_pipe(32); + mult_pipe13 = std_smult_pipe(32); + mult_pipe14 = std_smult_pipe(32); + mult_pipe15 = std_smult_pipe(32); + add0 = std_sadd(32); + add1 = std_sadd(32); + add2 = std_sadd(32); + add3 = std_sadd(32); + add4 = std_sadd(32); + add5 = std_sadd(32); + add6 = std_sadd(32); + add7 = std_sadd(32); + add8 = std_sadd(32); + add9 = std_sadd(32); + add10 = std_sadd(32); + add11 = std_sadd(32); + add12 = std_sadd(32); + add13 = std_sadd(32); + add14 = std_sadd(32); + add15 = std_sadd(32); + sub0 = std_ssub(32); + sub1 = std_ssub(32); + sub2 = std_ssub(32); + sub3 = std_ssub(32); + sub4 = std_ssub(32); + sub5 = std_ssub(32); + sub6 = std_ssub(32); + sub7 = std_ssub(32); + sub8 = std_ssub(32); + sub9 = std_ssub(32); + sub10 = std_ssub(32); + sub11 = std_ssub(32); + sub12 = std_ssub(32); + sub13 = std_ssub(32); + sub14 = std_ssub(32); + sub15 = std_ssub(32); + } + wires { + group preamble_0 { + a.addr0 = 6'd0; + phis.addr0 = 6'd0; + r0.write_en = 1'd1; + r0.in = a.read_data; + phi0.write_en = 1'd1; + phi0.in = phis.read_data; + preamble_0[done] = r0.done & phi0.done ? 1'd1; + } + group preamble_1 { + a.addr0 = 6'd1; + phis.addr0 = 6'd1; + r1.write_en = 1'd1; + r1.in = a.read_data; + phi1.write_en = 1'd1; + phi1.in = phis.read_data; + preamble_1[done] = r1.done & phi1.done ? 1'd1; + } + group preamble_2 { + a.addr0 = 6'd2; + phis.addr0 = 6'd2; + r2.write_en = 1'd1; + r2.in = a.read_data; + phi2.write_en = 1'd1; + phi2.in = phis.read_data; + preamble_2[done] = r2.done & phi2.done ? 1'd1; + } + group preamble_3 { + a.addr0 = 6'd3; + phis.addr0 = 6'd3; + r3.write_en = 1'd1; + r3.in = a.read_data; + phi3.write_en = 1'd1; + phi3.in = phis.read_data; + preamble_3[done] = r3.done & phi3.done ? 1'd1; + } + group preamble_4 { + a.addr0 = 6'd4; + phis.addr0 = 6'd4; + r4.write_en = 1'd1; + r4.in = a.read_data; + phi4.write_en = 1'd1; + phi4.in = phis.read_data; + preamble_4[done] = r4.done & phi4.done ? 1'd1; + } + group preamble_5 { + a.addr0 = 6'd5; + phis.addr0 = 6'd5; + r5.write_en = 1'd1; + r5.in = a.read_data; + phi5.write_en = 1'd1; + phi5.in = phis.read_data; + preamble_5[done] = r5.done & phi5.done ? 1'd1; + } + group preamble_6 { + a.addr0 = 6'd6; + phis.addr0 = 6'd6; + r6.write_en = 1'd1; + r6.in = a.read_data; + phi6.write_en = 1'd1; + phi6.in = phis.read_data; + preamble_6[done] = r6.done & phi6.done ? 1'd1; + } + group preamble_7 { + a.addr0 = 6'd7; + phis.addr0 = 6'd7; + r7.write_en = 1'd1; + r7.in = a.read_data; + phi7.write_en = 1'd1; + phi7.in = phis.read_data; + preamble_7[done] = r7.done & phi7.done ? 1'd1; + } + group preamble_8 { + a.addr0 = 6'd8; + phis.addr0 = 6'd8; + r8.write_en = 1'd1; + r8.in = a.read_data; + phi8.write_en = 1'd1; + phi8.in = phis.read_data; + preamble_8[done] = r8.done & phi8.done ? 1'd1; + } + group preamble_9 { + a.addr0 = 6'd9; + phis.addr0 = 6'd9; + r9.write_en = 1'd1; + r9.in = a.read_data; + phi9.write_en = 1'd1; + phi9.in = phis.read_data; + preamble_9[done] = r9.done & phi9.done ? 1'd1; + } + group preamble_10 { + a.addr0 = 6'd10; + phis.addr0 = 6'd10; + r10.write_en = 1'd1; + r10.in = a.read_data; + phi10.write_en = 1'd1; + phi10.in = phis.read_data; + preamble_10[done] = r10.done & phi10.done ? 1'd1; + } + group preamble_11 { + a.addr0 = 6'd11; + phis.addr0 = 6'd11; + r11.write_en = 1'd1; + r11.in = a.read_data; + phi11.write_en = 1'd1; + phi11.in = phis.read_data; + preamble_11[done] = r11.done & phi11.done ? 1'd1; + } + group preamble_12 { + a.addr0 = 6'd12; + phis.addr0 = 6'd12; + r12.write_en = 1'd1; + r12.in = a.read_data; + phi12.write_en = 1'd1; + phi12.in = phis.read_data; + preamble_12[done] = r12.done & phi12.done ? 1'd1; + } + group preamble_13 { + a.addr0 = 6'd13; + phis.addr0 = 6'd13; + r13.write_en = 1'd1; + r13.in = a.read_data; + phi13.write_en = 1'd1; + phi13.in = phis.read_data; + preamble_13[done] = r13.done & phi13.done ? 1'd1; + } + group preamble_14 { + a.addr0 = 6'd14; + phis.addr0 = 6'd14; + r14.write_en = 1'd1; + r14.in = a.read_data; + phi14.write_en = 1'd1; + phi14.in = phis.read_data; + preamble_14[done] = r14.done & phi14.done ? 1'd1; + } + group preamble_15 { + a.addr0 = 6'd15; + phis.addr0 = 6'd15; + r15.write_en = 1'd1; + r15.in = a.read_data; + phi15.write_en = 1'd1; + phi15.in = phis.read_data; + preamble_15[done] = r15.done & phi15.done ? 1'd1; + } + group preamble_16 { + a.addr0 = 6'd16; + phis.addr0 = 6'd16; + r16.write_en = 1'd1; + r16.in = a.read_data; + phi16.write_en = 1'd1; + phi16.in = phis.read_data; + preamble_16[done] = r16.done & phi16.done ? 1'd1; + } + group preamble_17 { + a.addr0 = 6'd17; + phis.addr0 = 6'd17; + r17.write_en = 1'd1; + r17.in = a.read_data; + phi17.write_en = 1'd1; + phi17.in = phis.read_data; + preamble_17[done] = r17.done & phi17.done ? 1'd1; + } + group preamble_18 { + a.addr0 = 6'd18; + phis.addr0 = 6'd18; + r18.write_en = 1'd1; + r18.in = a.read_data; + phi18.write_en = 1'd1; + phi18.in = phis.read_data; + preamble_18[done] = r18.done & phi18.done ? 1'd1; + } + group preamble_19 { + a.addr0 = 6'd19; + phis.addr0 = 6'd19; + r19.write_en = 1'd1; + r19.in = a.read_data; + phi19.write_en = 1'd1; + phi19.in = phis.read_data; + preamble_19[done] = r19.done & phi19.done ? 1'd1; + } + group preamble_20 { + a.addr0 = 6'd20; + phis.addr0 = 6'd20; + r20.write_en = 1'd1; + r20.in = a.read_data; + phi20.write_en = 1'd1; + phi20.in = phis.read_data; + preamble_20[done] = r20.done & phi20.done ? 1'd1; + } + group preamble_21 { + a.addr0 = 6'd21; + phis.addr0 = 6'd21; + r21.write_en = 1'd1; + r21.in = a.read_data; + phi21.write_en = 1'd1; + phi21.in = phis.read_data; + preamble_21[done] = r21.done & phi21.done ? 1'd1; + } + group preamble_22 { + a.addr0 = 6'd22; + phis.addr0 = 6'd22; + r22.write_en = 1'd1; + r22.in = a.read_data; + phi22.write_en = 1'd1; + phi22.in = phis.read_data; + preamble_22[done] = r22.done & phi22.done ? 1'd1; + } + group preamble_23 { + a.addr0 = 6'd23; + phis.addr0 = 6'd23; + r23.write_en = 1'd1; + r23.in = a.read_data; + phi23.write_en = 1'd1; + phi23.in = phis.read_data; + preamble_23[done] = r23.done & phi23.done ? 1'd1; + } + group preamble_24 { + a.addr0 = 6'd24; + phis.addr0 = 6'd24; + r24.write_en = 1'd1; + r24.in = a.read_data; + phi24.write_en = 1'd1; + phi24.in = phis.read_data; + preamble_24[done] = r24.done & phi24.done ? 1'd1; + } + group preamble_25 { + a.addr0 = 6'd25; + phis.addr0 = 6'd25; + r25.write_en = 1'd1; + r25.in = a.read_data; + phi25.write_en = 1'd1; + phi25.in = phis.read_data; + preamble_25[done] = r25.done & phi25.done ? 1'd1; + } + group preamble_26 { + a.addr0 = 6'd26; + phis.addr0 = 6'd26; + r26.write_en = 1'd1; + r26.in = a.read_data; + phi26.write_en = 1'd1; + phi26.in = phis.read_data; + preamble_26[done] = r26.done & phi26.done ? 1'd1; + } + group preamble_27 { + a.addr0 = 6'd27; + phis.addr0 = 6'd27; + r27.write_en = 1'd1; + r27.in = a.read_data; + phi27.write_en = 1'd1; + phi27.in = phis.read_data; + preamble_27[done] = r27.done & phi27.done ? 1'd1; + } + group preamble_28 { + a.addr0 = 6'd28; + phis.addr0 = 6'd28; + r28.write_en = 1'd1; + r28.in = a.read_data; + phi28.write_en = 1'd1; + phi28.in = phis.read_data; + preamble_28[done] = r28.done & phi28.done ? 1'd1; + } + group preamble_29 { + a.addr0 = 6'd29; + phis.addr0 = 6'd29; + r29.write_en = 1'd1; + r29.in = a.read_data; + phi29.write_en = 1'd1; + phi29.in = phis.read_data; + preamble_29[done] = r29.done & phi29.done ? 1'd1; + } + group preamble_30 { + a.addr0 = 6'd30; + phis.addr0 = 6'd30; + r30.write_en = 1'd1; + r30.in = a.read_data; + phi30.write_en = 1'd1; + phi30.in = phis.read_data; + preamble_30[done] = r30.done & phi30.done ? 1'd1; + } + group preamble_31 { + a.addr0 = 6'd31; + phis.addr0 = 6'd31; + r31.write_en = 1'd1; + r31.in = a.read_data; + phi31.write_en = 1'd1; + phi31.in = phis.read_data; + preamble_31[done] = r31.done & phi31.done ? 1'd1; + } + group precursor_0 { + r0.in = A0.out; + r0.write_en = 1'd1; + precursor_0[done] = r0.done; + } + group precursor_1 { + r1.in = A1.out; + r1.write_en = 1'd1; + precursor_1[done] = r1.done; + } + group precursor_2 { + r2.in = A2.out; + r2.write_en = 1'd1; + precursor_2[done] = r2.done; + } + group precursor_3 { + r3.in = A3.out; + r3.write_en = 1'd1; + precursor_3[done] = r3.done; + } + group precursor_4 { + r4.in = A4.out; + r4.write_en = 1'd1; + precursor_4[done] = r4.done; + } + group precursor_5 { + r5.in = A5.out; + r5.write_en = 1'd1; + precursor_5[done] = r5.done; + } + group precursor_6 { + r6.in = A6.out; + r6.write_en = 1'd1; + precursor_6[done] = r6.done; + } + group precursor_7 { + r7.in = A7.out; + r7.write_en = 1'd1; + precursor_7[done] = r7.done; + } + group precursor_8 { + r8.in = A8.out; + r8.write_en = 1'd1; + precursor_8[done] = r8.done; + } + group precursor_9 { + r9.in = A9.out; + r9.write_en = 1'd1; + precursor_9[done] = r9.done; + } + group precursor_10 { + r10.in = A10.out; + r10.write_en = 1'd1; + precursor_10[done] = r10.done; + } + group precursor_11 { + r11.in = A11.out; + r11.write_en = 1'd1; + precursor_11[done] = r11.done; + } + group precursor_12 { + r12.in = A12.out; + r12.write_en = 1'd1; + precursor_12[done] = r12.done; + } + group precursor_13 { + r13.in = A13.out; + r13.write_en = 1'd1; + precursor_13[done] = r13.done; + } + group precursor_14 { + r14.in = A14.out; + r14.write_en = 1'd1; + precursor_14[done] = r14.done; + } + group precursor_15 { + r15.in = A15.out; + r15.write_en = 1'd1; + precursor_15[done] = r15.done; + } + group precursor_16 { + r16.in = A16.out; + r16.write_en = 1'd1; + precursor_16[done] = r16.done; + } + group precursor_17 { + r17.in = A17.out; + r17.write_en = 1'd1; + precursor_17[done] = r17.done; + } + group precursor_18 { + r18.in = A18.out; + r18.write_en = 1'd1; + precursor_18[done] = r18.done; + } + group precursor_19 { + r19.in = A19.out; + r19.write_en = 1'd1; + precursor_19[done] = r19.done; + } + group precursor_20 { + r20.in = A20.out; + r20.write_en = 1'd1; + precursor_20[done] = r20.done; + } + group precursor_21 { + r21.in = A21.out; + r21.write_en = 1'd1; + precursor_21[done] = r21.done; + } + group precursor_22 { + r22.in = A22.out; + r22.write_en = 1'd1; + precursor_22[done] = r22.done; + } + group precursor_23 { + r23.in = A23.out; + r23.write_en = 1'd1; + precursor_23[done] = r23.done; + } + group precursor_24 { + r24.in = A24.out; + r24.write_en = 1'd1; + precursor_24[done] = r24.done; + } + group precursor_25 { + r25.in = A25.out; + r25.write_en = 1'd1; + precursor_25[done] = r25.done; + } + group precursor_26 { + r26.in = A26.out; + r26.write_en = 1'd1; + precursor_26[done] = r26.done; + } + group precursor_27 { + r27.in = A27.out; + r27.write_en = 1'd1; + precursor_27[done] = r27.done; + } + group precursor_28 { + r28.in = A28.out; + r28.write_en = 1'd1; + precursor_28[done] = r28.done; + } + group precursor_29 { + r29.in = A29.out; + r29.write_en = 1'd1; + precursor_29[done] = r29.done; + } + group precursor_30 { + r30.in = A30.out; + r30.write_en = 1'd1; + precursor_30[done] = r30.done; + } + group precursor_31 { + r31.in = A31.out; + r31.write_en = 1'd1; + precursor_31[done] = r31.done; + } + group s0_mul0 { + mult_pipe0.left = phi1.out; + mult_pipe0.right = r16.out; + mult_pipe0.go = 1'd1; + s0_mul0[done] = mult_pipe0.done; + } + group s0_mul1 { + mult_pipe1.left = phi1.out; + mult_pipe1.right = r17.out; + mult_pipe1.go = 1'd1; + s0_mul1[done] = mult_pipe1.done; + } + group s0_mul2 { + mult_pipe2.left = phi1.out; + mult_pipe2.right = r18.out; + mult_pipe2.go = 1'd1; + s0_mul2[done] = mult_pipe2.done; + } + group s0_mul3 { + mult_pipe3.left = phi1.out; + mult_pipe3.right = r19.out; + mult_pipe3.go = 1'd1; + s0_mul3[done] = mult_pipe3.done; + } + group s0_mul4 { + mult_pipe4.left = phi1.out; + mult_pipe4.right = r20.out; + mult_pipe4.go = 1'd1; + s0_mul4[done] = mult_pipe4.done; + } + group s0_mul5 { + mult_pipe5.left = phi1.out; + mult_pipe5.right = r21.out; + mult_pipe5.go = 1'd1; + s0_mul5[done] = mult_pipe5.done; + } + group s0_mul6 { + mult_pipe6.left = phi1.out; + mult_pipe6.right = r22.out; + mult_pipe6.go = 1'd1; + s0_mul6[done] = mult_pipe6.done; + } + group s0_mul7 { + mult_pipe7.left = phi1.out; + mult_pipe7.right = r23.out; + mult_pipe7.go = 1'd1; + s0_mul7[done] = mult_pipe7.done; + } + group s0_mul8 { + mult_pipe8.left = phi1.out; + mult_pipe8.right = r24.out; + mult_pipe8.go = 1'd1; + s0_mul8[done] = mult_pipe8.done; + } + group s0_mul9 { + mult_pipe9.left = phi1.out; + mult_pipe9.right = r25.out; + mult_pipe9.go = 1'd1; + s0_mul9[done] = mult_pipe9.done; + } + group s0_mul10 { + mult_pipe10.left = phi1.out; + mult_pipe10.right = r26.out; + mult_pipe10.go = 1'd1; + s0_mul10[done] = mult_pipe10.done; + } + group s0_mul11 { + mult_pipe11.left = phi1.out; + mult_pipe11.right = r27.out; + mult_pipe11.go = 1'd1; + s0_mul11[done] = mult_pipe11.done; + } + group s0_mul12 { + mult_pipe12.left = phi1.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s0_mul12[done] = mult_pipe12.done; + } + group s0_mul13 { + mult_pipe13.left = phi1.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s0_mul13[done] = mult_pipe13.done; + } + group s0_mul14 { + mult_pipe14.left = phi1.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s0_mul14[done] = mult_pipe14.done; + } + group s0_mul15 { + mult_pipe15.left = phi1.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s0_mul15[done] = mult_pipe15.done; + } + group s1_mul0 { + mult_pipe0.left = phi2.out; + mult_pipe0.right = r8.out; + mult_pipe0.go = 1'd1; + s1_mul0[done] = mult_pipe0.done; + } + group s1_mul1 { + mult_pipe1.left = phi2.out; + mult_pipe1.right = r9.out; + mult_pipe1.go = 1'd1; + s1_mul1[done] = mult_pipe1.done; + } + group s1_mul2 { + mult_pipe2.left = phi2.out; + mult_pipe2.right = r10.out; + mult_pipe2.go = 1'd1; + s1_mul2[done] = mult_pipe2.done; + } + group s1_mul3 { + mult_pipe3.left = phi2.out; + mult_pipe3.right = r11.out; + mult_pipe3.go = 1'd1; + s1_mul3[done] = mult_pipe3.done; + } + group s1_mul4 { + mult_pipe4.left = phi2.out; + mult_pipe4.right = r12.out; + mult_pipe4.go = 1'd1; + s1_mul4[done] = mult_pipe4.done; + } + group s1_mul5 { + mult_pipe5.left = phi2.out; + mult_pipe5.right = r13.out; + mult_pipe5.go = 1'd1; + s1_mul5[done] = mult_pipe5.done; + } + group s1_mul6 { + mult_pipe6.left = phi2.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s1_mul6[done] = mult_pipe6.done; + } + group s1_mul7 { + mult_pipe7.left = phi2.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s1_mul7[done] = mult_pipe7.done; + } + group s1_mul8 { + mult_pipe8.left = phi3.out; + mult_pipe8.right = r24.out; + mult_pipe8.go = 1'd1; + s1_mul8[done] = mult_pipe8.done; + } + group s1_mul9 { + mult_pipe9.left = phi3.out; + mult_pipe9.right = r25.out; + mult_pipe9.go = 1'd1; + s1_mul9[done] = mult_pipe9.done; + } + group s1_mul10 { + mult_pipe10.left = phi3.out; + mult_pipe10.right = r26.out; + mult_pipe10.go = 1'd1; + s1_mul10[done] = mult_pipe10.done; + } + group s1_mul11 { + mult_pipe11.left = phi3.out; + mult_pipe11.right = r27.out; + mult_pipe11.go = 1'd1; + s1_mul11[done] = mult_pipe11.done; + } + group s1_mul12 { + mult_pipe12.left = phi3.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s1_mul12[done] = mult_pipe12.done; + } + group s1_mul13 { + mult_pipe13.left = phi3.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s1_mul13[done] = mult_pipe13.done; + } + group s1_mul14 { + mult_pipe14.left = phi3.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s1_mul14[done] = mult_pipe14.done; + } + group s1_mul15 { + mult_pipe15.left = phi3.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s1_mul15[done] = mult_pipe15.done; + } + group s2_mul0 { + mult_pipe0.left = phi4.out; + mult_pipe0.right = r4.out; + mult_pipe0.go = 1'd1; + s2_mul0[done] = mult_pipe0.done; + } + group s2_mul1 { + mult_pipe1.left = phi4.out; + mult_pipe1.right = r5.out; + mult_pipe1.go = 1'd1; + s2_mul1[done] = mult_pipe1.done; + } + group s2_mul2 { + mult_pipe2.left = phi4.out; + mult_pipe2.right = r6.out; + mult_pipe2.go = 1'd1; + s2_mul2[done] = mult_pipe2.done; + } + group s2_mul3 { + mult_pipe3.left = phi4.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s2_mul3[done] = mult_pipe3.done; + } + group s2_mul4 { + mult_pipe4.left = phi5.out; + mult_pipe4.right = r12.out; + mult_pipe4.go = 1'd1; + s2_mul4[done] = mult_pipe4.done; + } + group s2_mul5 { + mult_pipe5.left = phi5.out; + mult_pipe5.right = r13.out; + mult_pipe5.go = 1'd1; + s2_mul5[done] = mult_pipe5.done; + } + group s2_mul6 { + mult_pipe6.left = phi5.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s2_mul6[done] = mult_pipe6.done; + } + group s2_mul7 { + mult_pipe7.left = phi5.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s2_mul7[done] = mult_pipe7.done; + } + group s2_mul8 { + mult_pipe8.left = phi6.out; + mult_pipe8.right = r20.out; + mult_pipe8.go = 1'd1; + s2_mul8[done] = mult_pipe8.done; + } + group s2_mul9 { + mult_pipe9.left = phi6.out; + mult_pipe9.right = r21.out; + mult_pipe9.go = 1'd1; + s2_mul9[done] = mult_pipe9.done; + } + group s2_mul10 { + mult_pipe10.left = phi6.out; + mult_pipe10.right = r22.out; + mult_pipe10.go = 1'd1; + s2_mul10[done] = mult_pipe10.done; + } + group s2_mul11 { + mult_pipe11.left = phi6.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s2_mul11[done] = mult_pipe11.done; + } + group s2_mul12 { + mult_pipe12.left = phi7.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s2_mul12[done] = mult_pipe12.done; + } + group s2_mul13 { + mult_pipe13.left = phi7.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s2_mul13[done] = mult_pipe13.done; + } + group s2_mul14 { + mult_pipe14.left = phi7.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s2_mul14[done] = mult_pipe14.done; + } + group s2_mul15 { + mult_pipe15.left = phi7.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s2_mul15[done] = mult_pipe15.done; + } + group s3_mul0 { + mult_pipe0.left = phi8.out; + mult_pipe0.right = r2.out; + mult_pipe0.go = 1'd1; + s3_mul0[done] = mult_pipe0.done; + } + group s3_mul1 { + mult_pipe1.left = phi8.out; + mult_pipe1.right = r3.out; + mult_pipe1.go = 1'd1; + s3_mul1[done] = mult_pipe1.done; + } + group s3_mul2 { + mult_pipe2.left = phi9.out; + mult_pipe2.right = r6.out; + mult_pipe2.go = 1'd1; + s3_mul2[done] = mult_pipe2.done; + } + group s3_mul3 { + mult_pipe3.left = phi9.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s3_mul3[done] = mult_pipe3.done; + } + group s3_mul4 { + mult_pipe4.left = phi10.out; + mult_pipe4.right = r10.out; + mult_pipe4.go = 1'd1; + s3_mul4[done] = mult_pipe4.done; + } + group s3_mul5 { + mult_pipe5.left = phi10.out; + mult_pipe5.right = r11.out; + mult_pipe5.go = 1'd1; + s3_mul5[done] = mult_pipe5.done; + } + group s3_mul6 { + mult_pipe6.left = phi11.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s3_mul6[done] = mult_pipe6.done; + } + group s3_mul7 { + mult_pipe7.left = phi11.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s3_mul7[done] = mult_pipe7.done; + } + group s3_mul8 { + mult_pipe8.left = phi12.out; + mult_pipe8.right = r18.out; + mult_pipe8.go = 1'd1; + s3_mul8[done] = mult_pipe8.done; + } + group s3_mul9 { + mult_pipe9.left = phi12.out; + mult_pipe9.right = r19.out; + mult_pipe9.go = 1'd1; + s3_mul9[done] = mult_pipe9.done; + } + group s3_mul10 { + mult_pipe10.left = phi13.out; + mult_pipe10.right = r22.out; + mult_pipe10.go = 1'd1; + s3_mul10[done] = mult_pipe10.done; + } + group s3_mul11 { + mult_pipe11.left = phi13.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s3_mul11[done] = mult_pipe11.done; + } + group s3_mul12 { + mult_pipe12.left = phi14.out; + mult_pipe12.right = r26.out; + mult_pipe12.go = 1'd1; + s3_mul12[done] = mult_pipe12.done; + } + group s3_mul13 { + mult_pipe13.left = phi14.out; + mult_pipe13.right = r27.out; + mult_pipe13.go = 1'd1; + s3_mul13[done] = mult_pipe13.done; + } + group s3_mul14 { + mult_pipe14.left = phi15.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s3_mul14[done] = mult_pipe14.done; + } + group s3_mul15 { + mult_pipe15.left = phi15.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s3_mul15[done] = mult_pipe15.done; + } + group s4_mul0 { + mult_pipe0.left = phi16.out; + mult_pipe0.right = r1.out; + mult_pipe0.go = 1'd1; + s4_mul0[done] = mult_pipe0.done; + } + group s4_mul1 { + mult_pipe1.left = phi17.out; + mult_pipe1.right = r3.out; + mult_pipe1.go = 1'd1; + s4_mul1[done] = mult_pipe1.done; + } + group s4_mul2 { + mult_pipe2.left = phi18.out; + mult_pipe2.right = r5.out; + mult_pipe2.go = 1'd1; + s4_mul2[done] = mult_pipe2.done; + } + group s4_mul3 { + mult_pipe3.left = phi19.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s4_mul3[done] = mult_pipe3.done; + } + group s4_mul4 { + mult_pipe4.left = phi20.out; + mult_pipe4.right = r9.out; + mult_pipe4.go = 1'd1; + s4_mul4[done] = mult_pipe4.done; + } + group s4_mul5 { + mult_pipe5.left = phi21.out; + mult_pipe5.right = r11.out; + mult_pipe5.go = 1'd1; + s4_mul5[done] = mult_pipe5.done; + } + group s4_mul6 { + mult_pipe6.left = phi22.out; + mult_pipe6.right = r13.out; + mult_pipe6.go = 1'd1; + s4_mul6[done] = mult_pipe6.done; + } + group s4_mul7 { + mult_pipe7.left = phi23.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s4_mul7[done] = mult_pipe7.done; + } + group s4_mul8 { + mult_pipe8.left = phi24.out; + mult_pipe8.right = r17.out; + mult_pipe8.go = 1'd1; + s4_mul8[done] = mult_pipe8.done; + } + group s4_mul9 { + mult_pipe9.left = phi25.out; + mult_pipe9.right = r19.out; + mult_pipe9.go = 1'd1; + s4_mul9[done] = mult_pipe9.done; + } + group s4_mul10 { + mult_pipe10.left = phi26.out; + mult_pipe10.right = r21.out; + mult_pipe10.go = 1'd1; + s4_mul10[done] = mult_pipe10.done; + } + group s4_mul11 { + mult_pipe11.left = phi27.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s4_mul11[done] = mult_pipe11.done; + } + group s4_mul12 { + mult_pipe12.left = phi28.out; + mult_pipe12.right = r25.out; + mult_pipe12.go = 1'd1; + s4_mul12[done] = mult_pipe12.done; + } + group s4_mul13 { + mult_pipe13.left = phi29.out; + mult_pipe13.right = r27.out; + mult_pipe13.go = 1'd1; + s4_mul13[done] = mult_pipe13.done; + } + group s4_mul14 { + mult_pipe14.left = phi30.out; + mult_pipe14.right = r29.out; + mult_pipe14.go = 1'd1; + s4_mul14[done] = mult_pipe14.done; + } + group s4_mul15 { + mult_pipe15.left = phi31.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s4_mul15[done] = mult_pipe15.done; + } + group s0_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd97; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s0_r0_op_mod[done] = A0.done; + } + group s0_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd97; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s0_r1_op_mod[done] = A1.done; + } + group s0_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd97; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s0_r2_op_mod[done] = A2.done; + } + group s0_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd97; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s0_r3_op_mod[done] = A3.done; + } + group s0_r4_op_mod { + add4.left = r4.out; + add4.right = mult_pipe4.out; + mod_pipe4.left = add4.out; + mod_pipe4.right = 32'd97; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s0_r4_op_mod[done] = A4.done; + } + group s0_r5_op_mod { + add5.left = r5.out; + add5.right = mult_pipe5.out; + mod_pipe5.left = add5.out; + mod_pipe5.right = 32'd97; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s0_r5_op_mod[done] = A5.done; + } + group s0_r6_op_mod { + add6.left = r6.out; + add6.right = mult_pipe6.out; + mod_pipe6.left = add6.out; + mod_pipe6.right = 32'd97; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s0_r6_op_mod[done] = A6.done; + } + group s0_r7_op_mod { + add7.left = r7.out; + add7.right = mult_pipe7.out; + mod_pipe7.left = add7.out; + mod_pipe7.right = 32'd97; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s0_r7_op_mod[done] = A7.done; + } + group s0_r8_op_mod { + add8.left = r8.out; + add8.right = mult_pipe8.out; + mod_pipe8.left = add8.out; + mod_pipe8.right = 32'd97; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s0_r8_op_mod[done] = A8.done; + } + group s0_r9_op_mod { + add9.left = r9.out; + add9.right = mult_pipe9.out; + mod_pipe9.left = add9.out; + mod_pipe9.right = 32'd97; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s0_r9_op_mod[done] = A9.done; + } + group s0_r10_op_mod { + add10.left = r10.out; + add10.right = mult_pipe10.out; + mod_pipe10.left = add10.out; + mod_pipe10.right = 32'd97; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s0_r10_op_mod[done] = A10.done; + } + group s0_r11_op_mod { + add11.left = r11.out; + add11.right = mult_pipe11.out; + mod_pipe11.left = add11.out; + mod_pipe11.right = 32'd97; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s0_r11_op_mod[done] = A11.done; + } + group s0_r12_op_mod { + add12.left = r12.out; + add12.right = mult_pipe12.out; + mod_pipe12.left = add12.out; + mod_pipe12.right = 32'd97; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s0_r12_op_mod[done] = A12.done; + } + group s0_r13_op_mod { + add13.left = r13.out; + add13.right = mult_pipe13.out; + mod_pipe13.left = add13.out; + mod_pipe13.right = 32'd97; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s0_r13_op_mod[done] = A13.done; + } + group s0_r14_op_mod { + add14.left = r14.out; + add14.right = mult_pipe14.out; + mod_pipe14.left = add14.out; + mod_pipe14.right = 32'd97; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s0_r14_op_mod[done] = A14.done; + } + group s0_r15_op_mod { + add15.left = r15.out; + add15.right = mult_pipe15.out; + mod_pipe15.left = add15.out; + mod_pipe15.right = 32'd97; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s0_r15_op_mod[done] = A15.done; + } + group s0_r16_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe16.left = sub0.out; + mod_pipe16.right = 32'd97; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s0_r16_op_mod[done] = A16.done; + } + group s0_r17_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe17.left = sub1.out; + mod_pipe17.right = 32'd97; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s0_r17_op_mod[done] = A17.done; + } + group s0_r18_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe18.left = sub2.out; + mod_pipe18.right = 32'd97; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s0_r18_op_mod[done] = A18.done; + } + group s0_r19_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe19.left = sub3.out; + mod_pipe19.right = 32'd97; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s0_r19_op_mod[done] = A19.done; + } + group s0_r20_op_mod { + sub4.left = r4.out; + sub4.right = mult_pipe4.out; + mod_pipe20.left = sub4.out; + mod_pipe20.right = 32'd97; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s0_r20_op_mod[done] = A20.done; + } + group s0_r21_op_mod { + sub5.left = r5.out; + sub5.right = mult_pipe5.out; + mod_pipe21.left = sub5.out; + mod_pipe21.right = 32'd97; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s0_r21_op_mod[done] = A21.done; + } + group s0_r22_op_mod { + sub6.left = r6.out; + sub6.right = mult_pipe6.out; + mod_pipe22.left = sub6.out; + mod_pipe22.right = 32'd97; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s0_r22_op_mod[done] = A22.done; + } + group s0_r23_op_mod { + sub7.left = r7.out; + sub7.right = mult_pipe7.out; + mod_pipe23.left = sub7.out; + mod_pipe23.right = 32'd97; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s0_r23_op_mod[done] = A23.done; + } + group s0_r24_op_mod { + sub8.left = r8.out; + sub8.right = mult_pipe8.out; + mod_pipe24.left = sub8.out; + mod_pipe24.right = 32'd97; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s0_r24_op_mod[done] = A24.done; + } + group s0_r25_op_mod { + sub9.left = r9.out; + sub9.right = mult_pipe9.out; + mod_pipe25.left = sub9.out; + mod_pipe25.right = 32'd97; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s0_r25_op_mod[done] = A25.done; + } + group s0_r26_op_mod { + sub10.left = r10.out; + sub10.right = mult_pipe10.out; + mod_pipe26.left = sub10.out; + mod_pipe26.right = 32'd97; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s0_r26_op_mod[done] = A26.done; + } + group s0_r27_op_mod { + sub11.left = r11.out; + sub11.right = mult_pipe11.out; + mod_pipe27.left = sub11.out; + mod_pipe27.right = 32'd97; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s0_r27_op_mod[done] = A27.done; + } + group s0_r28_op_mod { + sub12.left = r12.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd97; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s0_r28_op_mod[done] = A28.done; + } + group s0_r29_op_mod { + sub13.left = r13.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd97; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s0_r29_op_mod[done] = A29.done; + } + group s0_r30_op_mod { + sub14.left = r14.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd97; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s0_r30_op_mod[done] = A30.done; + } + group s0_r31_op_mod { + sub15.left = r15.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd97; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s0_r31_op_mod[done] = A31.done; + } + group s1_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd97; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s1_r0_op_mod[done] = A0.done; + } + group s1_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd97; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s1_r1_op_mod[done] = A1.done; + } + group s1_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd97; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s1_r2_op_mod[done] = A2.done; + } + group s1_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd97; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s1_r3_op_mod[done] = A3.done; + } + group s1_r4_op_mod { + add4.left = r4.out; + add4.right = mult_pipe4.out; + mod_pipe4.left = add4.out; + mod_pipe4.right = 32'd97; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s1_r4_op_mod[done] = A4.done; + } + group s1_r5_op_mod { + add5.left = r5.out; + add5.right = mult_pipe5.out; + mod_pipe5.left = add5.out; + mod_pipe5.right = 32'd97; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s1_r5_op_mod[done] = A5.done; + } + group s1_r6_op_mod { + add6.left = r6.out; + add6.right = mult_pipe6.out; + mod_pipe6.left = add6.out; + mod_pipe6.right = 32'd97; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s1_r6_op_mod[done] = A6.done; + } + group s1_r7_op_mod { + add7.left = r7.out; + add7.right = mult_pipe7.out; + mod_pipe7.left = add7.out; + mod_pipe7.right = 32'd97; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s1_r7_op_mod[done] = A7.done; + } + group s1_r8_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe8.left = sub0.out; + mod_pipe8.right = 32'd97; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s1_r8_op_mod[done] = A8.done; + } + group s1_r9_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe9.left = sub1.out; + mod_pipe9.right = 32'd97; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s1_r9_op_mod[done] = A9.done; + } + group s1_r10_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe10.left = sub2.out; + mod_pipe10.right = 32'd97; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s1_r10_op_mod[done] = A10.done; + } + group s1_r11_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe11.left = sub3.out; + mod_pipe11.right = 32'd97; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s1_r11_op_mod[done] = A11.done; + } + group s1_r12_op_mod { + sub4.left = r4.out; + sub4.right = mult_pipe4.out; + mod_pipe12.left = sub4.out; + mod_pipe12.right = 32'd97; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s1_r12_op_mod[done] = A12.done; + } + group s1_r13_op_mod { + sub5.left = r5.out; + sub5.right = mult_pipe5.out; + mod_pipe13.left = sub5.out; + mod_pipe13.right = 32'd97; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s1_r13_op_mod[done] = A13.done; + } + group s1_r14_op_mod { + sub6.left = r6.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd97; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s1_r14_op_mod[done] = A14.done; + } + group s1_r15_op_mod { + sub7.left = r7.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd97; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s1_r15_op_mod[done] = A15.done; + } + group s1_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd97; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s1_r16_op_mod[done] = A16.done; + } + group s1_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd97; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s1_r17_op_mod[done] = A17.done; + } + group s1_r18_op_mod { + add10.left = r18.out; + add10.right = mult_pipe10.out; + mod_pipe18.left = add10.out; + mod_pipe18.right = 32'd97; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s1_r18_op_mod[done] = A18.done; + } + group s1_r19_op_mod { + add11.left = r19.out; + add11.right = mult_pipe11.out; + mod_pipe19.left = add11.out; + mod_pipe19.right = 32'd97; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s1_r19_op_mod[done] = A19.done; + } + group s1_r20_op_mod { + add12.left = r20.out; + add12.right = mult_pipe12.out; + mod_pipe20.left = add12.out; + mod_pipe20.right = 32'd97; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s1_r20_op_mod[done] = A20.done; + } + group s1_r21_op_mod { + add13.left = r21.out; + add13.right = mult_pipe13.out; + mod_pipe21.left = add13.out; + mod_pipe21.right = 32'd97; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s1_r21_op_mod[done] = A21.done; + } + group s1_r22_op_mod { + add14.left = r22.out; + add14.right = mult_pipe14.out; + mod_pipe22.left = add14.out; + mod_pipe22.right = 32'd97; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s1_r22_op_mod[done] = A22.done; + } + group s1_r23_op_mod { + add15.left = r23.out; + add15.right = mult_pipe15.out; + mod_pipe23.left = add15.out; + mod_pipe23.right = 32'd97; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s1_r23_op_mod[done] = A23.done; + } + group s1_r24_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe24.left = sub8.out; + mod_pipe24.right = 32'd97; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s1_r24_op_mod[done] = A24.done; + } + group s1_r25_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe25.left = sub9.out; + mod_pipe25.right = 32'd97; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s1_r25_op_mod[done] = A25.done; + } + group s1_r26_op_mod { + sub10.left = r18.out; + sub10.right = mult_pipe10.out; + mod_pipe26.left = sub10.out; + mod_pipe26.right = 32'd97; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s1_r26_op_mod[done] = A26.done; + } + group s1_r27_op_mod { + sub11.left = r19.out; + sub11.right = mult_pipe11.out; + mod_pipe27.left = sub11.out; + mod_pipe27.right = 32'd97; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s1_r27_op_mod[done] = A27.done; + } + group s1_r28_op_mod { + sub12.left = r20.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd97; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s1_r28_op_mod[done] = A28.done; + } + group s1_r29_op_mod { + sub13.left = r21.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd97; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s1_r29_op_mod[done] = A29.done; + } + group s1_r30_op_mod { + sub14.left = r22.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd97; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s1_r30_op_mod[done] = A30.done; + } + group s1_r31_op_mod { + sub15.left = r23.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd97; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s1_r31_op_mod[done] = A31.done; + } + group s2_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd97; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s2_r0_op_mod[done] = A0.done; + } + group s2_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd97; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s2_r1_op_mod[done] = A1.done; + } + group s2_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd97; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s2_r2_op_mod[done] = A2.done; + } + group s2_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd97; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s2_r3_op_mod[done] = A3.done; + } + group s2_r4_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe4.left = sub0.out; + mod_pipe4.right = 32'd97; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s2_r4_op_mod[done] = A4.done; + } + group s2_r5_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe5.left = sub1.out; + mod_pipe5.right = 32'd97; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s2_r5_op_mod[done] = A5.done; + } + group s2_r6_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe6.left = sub2.out; + mod_pipe6.right = 32'd97; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s2_r6_op_mod[done] = A6.done; + } + group s2_r7_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd97; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s2_r7_op_mod[done] = A7.done; + } + group s2_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd97; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s2_r8_op_mod[done] = A8.done; + } + group s2_r9_op_mod { + add5.left = r9.out; + add5.right = mult_pipe5.out; + mod_pipe9.left = add5.out; + mod_pipe9.right = 32'd97; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s2_r9_op_mod[done] = A9.done; + } + group s2_r10_op_mod { + add6.left = r10.out; + add6.right = mult_pipe6.out; + mod_pipe10.left = add6.out; + mod_pipe10.right = 32'd97; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s2_r10_op_mod[done] = A10.done; + } + group s2_r11_op_mod { + add7.left = r11.out; + add7.right = mult_pipe7.out; + mod_pipe11.left = add7.out; + mod_pipe11.right = 32'd97; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s2_r11_op_mod[done] = A11.done; + } + group s2_r12_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe12.left = sub4.out; + mod_pipe12.right = 32'd97; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s2_r12_op_mod[done] = A12.done; + } + group s2_r13_op_mod { + sub5.left = r9.out; + sub5.right = mult_pipe5.out; + mod_pipe13.left = sub5.out; + mod_pipe13.right = 32'd97; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s2_r13_op_mod[done] = A13.done; + } + group s2_r14_op_mod { + sub6.left = r10.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd97; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s2_r14_op_mod[done] = A14.done; + } + group s2_r15_op_mod { + sub7.left = r11.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd97; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s2_r15_op_mod[done] = A15.done; + } + group s2_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd97; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s2_r16_op_mod[done] = A16.done; + } + group s2_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd97; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s2_r17_op_mod[done] = A17.done; + } + group s2_r18_op_mod { + add10.left = r18.out; + add10.right = mult_pipe10.out; + mod_pipe18.left = add10.out; + mod_pipe18.right = 32'd97; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s2_r18_op_mod[done] = A18.done; + } + group s2_r19_op_mod { + add11.left = r19.out; + add11.right = mult_pipe11.out; + mod_pipe19.left = add11.out; + mod_pipe19.right = 32'd97; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s2_r19_op_mod[done] = A19.done; + } + group s2_r20_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe20.left = sub8.out; + mod_pipe20.right = 32'd97; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s2_r20_op_mod[done] = A20.done; + } + group s2_r21_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe21.left = sub9.out; + mod_pipe21.right = 32'd97; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s2_r21_op_mod[done] = A21.done; + } + group s2_r22_op_mod { + sub10.left = r18.out; + sub10.right = mult_pipe10.out; + mod_pipe22.left = sub10.out; + mod_pipe22.right = 32'd97; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s2_r22_op_mod[done] = A22.done; + } + group s2_r23_op_mod { + sub11.left = r19.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd97; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s2_r23_op_mod[done] = A23.done; + } + group s2_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd97; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s2_r24_op_mod[done] = A24.done; + } + group s2_r25_op_mod { + add13.left = r25.out; + add13.right = mult_pipe13.out; + mod_pipe25.left = add13.out; + mod_pipe25.right = 32'd97; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s2_r25_op_mod[done] = A25.done; + } + group s2_r26_op_mod { + add14.left = r26.out; + add14.right = mult_pipe14.out; + mod_pipe26.left = add14.out; + mod_pipe26.right = 32'd97; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s2_r26_op_mod[done] = A26.done; + } + group s2_r27_op_mod { + add15.left = r27.out; + add15.right = mult_pipe15.out; + mod_pipe27.left = add15.out; + mod_pipe27.right = 32'd97; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s2_r27_op_mod[done] = A27.done; + } + group s2_r28_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd97; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s2_r28_op_mod[done] = A28.done; + } + group s2_r29_op_mod { + sub13.left = r25.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd97; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s2_r29_op_mod[done] = A29.done; + } + group s2_r30_op_mod { + sub14.left = r26.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd97; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s2_r30_op_mod[done] = A30.done; + } + group s2_r31_op_mod { + sub15.left = r27.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd97; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s2_r31_op_mod[done] = A31.done; + } + group s3_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd97; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s3_r0_op_mod[done] = A0.done; + } + group s3_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd97; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s3_r1_op_mod[done] = A1.done; + } + group s3_r2_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe2.left = sub0.out; + mod_pipe2.right = 32'd97; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s3_r2_op_mod[done] = A2.done; + } + group s3_r3_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe3.left = sub1.out; + mod_pipe3.right = 32'd97; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s3_r3_op_mod[done] = A3.done; + } + group s3_r4_op_mod { + add2.left = r4.out; + add2.right = mult_pipe2.out; + mod_pipe4.left = add2.out; + mod_pipe4.right = 32'd97; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s3_r4_op_mod[done] = A4.done; + } + group s3_r5_op_mod { + add3.left = r5.out; + add3.right = mult_pipe3.out; + mod_pipe5.left = add3.out; + mod_pipe5.right = 32'd97; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s3_r5_op_mod[done] = A5.done; + } + group s3_r6_op_mod { + sub2.left = r4.out; + sub2.right = mult_pipe2.out; + mod_pipe6.left = sub2.out; + mod_pipe6.right = 32'd97; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s3_r6_op_mod[done] = A6.done; + } + group s3_r7_op_mod { + sub3.left = r5.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd97; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s3_r7_op_mod[done] = A7.done; + } + group s3_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd97; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s3_r8_op_mod[done] = A8.done; + } + group s3_r9_op_mod { + add5.left = r9.out; + add5.right = mult_pipe5.out; + mod_pipe9.left = add5.out; + mod_pipe9.right = 32'd97; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s3_r9_op_mod[done] = A9.done; + } + group s3_r10_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe10.left = sub4.out; + mod_pipe10.right = 32'd97; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s3_r10_op_mod[done] = A10.done; + } + group s3_r11_op_mod { + sub5.left = r9.out; + sub5.right = mult_pipe5.out; + mod_pipe11.left = sub5.out; + mod_pipe11.right = 32'd97; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s3_r11_op_mod[done] = A11.done; + } + group s3_r12_op_mod { + add6.left = r12.out; + add6.right = mult_pipe6.out; + mod_pipe12.left = add6.out; + mod_pipe12.right = 32'd97; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s3_r12_op_mod[done] = A12.done; + } + group s3_r13_op_mod { + add7.left = r13.out; + add7.right = mult_pipe7.out; + mod_pipe13.left = add7.out; + mod_pipe13.right = 32'd97; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s3_r13_op_mod[done] = A13.done; + } + group s3_r14_op_mod { + sub6.left = r12.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd97; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s3_r14_op_mod[done] = A14.done; + } + group s3_r15_op_mod { + sub7.left = r13.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd97; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s3_r15_op_mod[done] = A15.done; + } + group s3_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd97; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s3_r16_op_mod[done] = A16.done; + } + group s3_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd97; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s3_r17_op_mod[done] = A17.done; + } + group s3_r18_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe18.left = sub8.out; + mod_pipe18.right = 32'd97; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s3_r18_op_mod[done] = A18.done; + } + group s3_r19_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe19.left = sub9.out; + mod_pipe19.right = 32'd97; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s3_r19_op_mod[done] = A19.done; + } + group s3_r20_op_mod { + add10.left = r20.out; + add10.right = mult_pipe10.out; + mod_pipe20.left = add10.out; + mod_pipe20.right = 32'd97; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s3_r20_op_mod[done] = A20.done; + } + group s3_r21_op_mod { + add11.left = r21.out; + add11.right = mult_pipe11.out; + mod_pipe21.left = add11.out; + mod_pipe21.right = 32'd97; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s3_r21_op_mod[done] = A21.done; + } + group s3_r22_op_mod { + sub10.left = r20.out; + sub10.right = mult_pipe10.out; + mod_pipe22.left = sub10.out; + mod_pipe22.right = 32'd97; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s3_r22_op_mod[done] = A22.done; + } + group s3_r23_op_mod { + sub11.left = r21.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd97; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s3_r23_op_mod[done] = A23.done; + } + group s3_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd97; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s3_r24_op_mod[done] = A24.done; + } + group s3_r25_op_mod { + add13.left = r25.out; + add13.right = mult_pipe13.out; + mod_pipe25.left = add13.out; + mod_pipe25.right = 32'd97; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s3_r25_op_mod[done] = A25.done; + } + group s3_r26_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe26.left = sub12.out; + mod_pipe26.right = 32'd97; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s3_r26_op_mod[done] = A26.done; + } + group s3_r27_op_mod { + sub13.left = r25.out; + sub13.right = mult_pipe13.out; + mod_pipe27.left = sub13.out; + mod_pipe27.right = 32'd97; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s3_r27_op_mod[done] = A27.done; + } + group s3_r28_op_mod { + add14.left = r28.out; + add14.right = mult_pipe14.out; + mod_pipe28.left = add14.out; + mod_pipe28.right = 32'd97; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s3_r28_op_mod[done] = A28.done; + } + group s3_r29_op_mod { + add15.left = r29.out; + add15.right = mult_pipe15.out; + mod_pipe29.left = add15.out; + mod_pipe29.right = 32'd97; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s3_r29_op_mod[done] = A29.done; + } + group s3_r30_op_mod { + sub14.left = r28.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd97; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s3_r30_op_mod[done] = A30.done; + } + group s3_r31_op_mod { + sub15.left = r29.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd97; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s3_r31_op_mod[done] = A31.done; + } + group s4_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd97; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s4_r0_op_mod[done] = A0.done; + } + group s4_r1_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe1.left = sub0.out; + mod_pipe1.right = 32'd97; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s4_r1_op_mod[done] = A1.done; + } + group s4_r2_op_mod { + add1.left = r2.out; + add1.right = mult_pipe1.out; + mod_pipe2.left = add1.out; + mod_pipe2.right = 32'd97; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s4_r2_op_mod[done] = A2.done; + } + group s4_r3_op_mod { + sub1.left = r2.out; + sub1.right = mult_pipe1.out; + mod_pipe3.left = sub1.out; + mod_pipe3.right = 32'd97; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s4_r3_op_mod[done] = A3.done; + } + group s4_r4_op_mod { + add2.left = r4.out; + add2.right = mult_pipe2.out; + mod_pipe4.left = add2.out; + mod_pipe4.right = 32'd97; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s4_r4_op_mod[done] = A4.done; + } + group s4_r5_op_mod { + sub2.left = r4.out; + sub2.right = mult_pipe2.out; + mod_pipe5.left = sub2.out; + mod_pipe5.right = 32'd97; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s4_r5_op_mod[done] = A5.done; + } + group s4_r6_op_mod { + add3.left = r6.out; + add3.right = mult_pipe3.out; + mod_pipe6.left = add3.out; + mod_pipe6.right = 32'd97; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s4_r6_op_mod[done] = A6.done; + } + group s4_r7_op_mod { + sub3.left = r6.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd97; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s4_r7_op_mod[done] = A7.done; + } + group s4_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd97; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s4_r8_op_mod[done] = A8.done; + } + group s4_r9_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe9.left = sub4.out; + mod_pipe9.right = 32'd97; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s4_r9_op_mod[done] = A9.done; + } + group s4_r10_op_mod { + add5.left = r10.out; + add5.right = mult_pipe5.out; + mod_pipe10.left = add5.out; + mod_pipe10.right = 32'd97; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s4_r10_op_mod[done] = A10.done; + } + group s4_r11_op_mod { + sub5.left = r10.out; + sub5.right = mult_pipe5.out; + mod_pipe11.left = sub5.out; + mod_pipe11.right = 32'd97; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s4_r11_op_mod[done] = A11.done; + } + group s4_r12_op_mod { + add6.left = r12.out; + add6.right = mult_pipe6.out; + mod_pipe12.left = add6.out; + mod_pipe12.right = 32'd97; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s4_r12_op_mod[done] = A12.done; + } + group s4_r13_op_mod { + sub6.left = r12.out; + sub6.right = mult_pipe6.out; + mod_pipe13.left = sub6.out; + mod_pipe13.right = 32'd97; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s4_r13_op_mod[done] = A13.done; + } + group s4_r14_op_mod { + add7.left = r14.out; + add7.right = mult_pipe7.out; + mod_pipe14.left = add7.out; + mod_pipe14.right = 32'd97; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s4_r14_op_mod[done] = A14.done; + } + group s4_r15_op_mod { + sub7.left = r14.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd97; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s4_r15_op_mod[done] = A15.done; + } + group s4_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd97; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s4_r16_op_mod[done] = A16.done; + } + group s4_r17_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe17.left = sub8.out; + mod_pipe17.right = 32'd97; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s4_r17_op_mod[done] = A17.done; + } + group s4_r18_op_mod { + add9.left = r18.out; + add9.right = mult_pipe9.out; + mod_pipe18.left = add9.out; + mod_pipe18.right = 32'd97; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s4_r18_op_mod[done] = A18.done; + } + group s4_r19_op_mod { + sub9.left = r18.out; + sub9.right = mult_pipe9.out; + mod_pipe19.left = sub9.out; + mod_pipe19.right = 32'd97; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s4_r19_op_mod[done] = A19.done; + } + group s4_r20_op_mod { + add10.left = r20.out; + add10.right = mult_pipe10.out; + mod_pipe20.left = add10.out; + mod_pipe20.right = 32'd97; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s4_r20_op_mod[done] = A20.done; + } + group s4_r21_op_mod { + sub10.left = r20.out; + sub10.right = mult_pipe10.out; + mod_pipe21.left = sub10.out; + mod_pipe21.right = 32'd97; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s4_r21_op_mod[done] = A21.done; + } + group s4_r22_op_mod { + add11.left = r22.out; + add11.right = mult_pipe11.out; + mod_pipe22.left = add11.out; + mod_pipe22.right = 32'd97; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s4_r22_op_mod[done] = A22.done; + } + group s4_r23_op_mod { + sub11.left = r22.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd97; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s4_r23_op_mod[done] = A23.done; + } + group s4_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd97; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s4_r24_op_mod[done] = A24.done; + } + group s4_r25_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe25.left = sub12.out; + mod_pipe25.right = 32'd97; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s4_r25_op_mod[done] = A25.done; + } + group s4_r26_op_mod { + add13.left = r26.out; + add13.right = mult_pipe13.out; + mod_pipe26.left = add13.out; + mod_pipe26.right = 32'd97; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s4_r26_op_mod[done] = A26.done; + } + group s4_r27_op_mod { + sub13.left = r26.out; + sub13.right = mult_pipe13.out; + mod_pipe27.left = sub13.out; + mod_pipe27.right = 32'd97; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s4_r27_op_mod[done] = A27.done; + } + group s4_r28_op_mod { + add14.left = r28.out; + add14.right = mult_pipe14.out; + mod_pipe28.left = add14.out; + mod_pipe28.right = 32'd97; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s4_r28_op_mod[done] = A28.done; + } + group s4_r29_op_mod { + sub14.left = r28.out; + sub14.right = mult_pipe14.out; + mod_pipe29.left = sub14.out; + mod_pipe29.right = 32'd97; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s4_r29_op_mod[done] = A29.done; + } + group s4_r30_op_mod { + add15.left = r30.out; + add15.right = mult_pipe15.out; + mod_pipe30.left = add15.out; + mod_pipe30.right = 32'd97; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s4_r30_op_mod[done] = A30.done; + } + group s4_r31_op_mod { + sub15.left = r30.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd97; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s4_r31_op_mod[done] = A31.done; + } + group epilogue_0 { + a.addr0 = 6'd0; + a.write_en = 1'd1; + a.write_data = A0.out; + epilogue_0[done] = a.done; + } + group epilogue_1 { + a.addr0 = 6'd1; + a.write_en = 1'd1; + a.write_data = A1.out; + epilogue_1[done] = a.done; + } + group epilogue_2 { + a.addr0 = 6'd2; + a.write_en = 1'd1; + a.write_data = A2.out; + epilogue_2[done] = a.done; + } + group epilogue_3 { + a.addr0 = 6'd3; + a.write_en = 1'd1; + a.write_data = A3.out; + epilogue_3[done] = a.done; + } + group epilogue_4 { + a.addr0 = 6'd4; + a.write_en = 1'd1; + a.write_data = A4.out; + epilogue_4[done] = a.done; + } + group epilogue_5 { + a.addr0 = 6'd5; + a.write_en = 1'd1; + a.write_data = A5.out; + epilogue_5[done] = a.done; + } + group epilogue_6 { + a.addr0 = 6'd6; + a.write_en = 1'd1; + a.write_data = A6.out; + epilogue_6[done] = a.done; + } + group epilogue_7 { + a.addr0 = 6'd7; + a.write_en = 1'd1; + a.write_data = A7.out; + epilogue_7[done] = a.done; + } + group epilogue_8 { + a.addr0 = 6'd8; + a.write_en = 1'd1; + a.write_data = A8.out; + epilogue_8[done] = a.done; + } + group epilogue_9 { + a.addr0 = 6'd9; + a.write_en = 1'd1; + a.write_data = A9.out; + epilogue_9[done] = a.done; + } + group epilogue_10 { + a.addr0 = 6'd10; + a.write_en = 1'd1; + a.write_data = A10.out; + epilogue_10[done] = a.done; + } + group epilogue_11 { + a.addr0 = 6'd11; + a.write_en = 1'd1; + a.write_data = A11.out; + epilogue_11[done] = a.done; + } + group epilogue_12 { + a.addr0 = 6'd12; + a.write_en = 1'd1; + a.write_data = A12.out; + epilogue_12[done] = a.done; + } + group epilogue_13 { + a.addr0 = 6'd13; + a.write_en = 1'd1; + a.write_data = A13.out; + epilogue_13[done] = a.done; + } + group epilogue_14 { + a.addr0 = 6'd14; + a.write_en = 1'd1; + a.write_data = A14.out; + epilogue_14[done] = a.done; + } + group epilogue_15 { + a.addr0 = 6'd15; + a.write_en = 1'd1; + a.write_data = A15.out; + epilogue_15[done] = a.done; + } + group epilogue_16 { + a.addr0 = 6'd16; + a.write_en = 1'd1; + a.write_data = A16.out; + epilogue_16[done] = a.done; + } + group epilogue_17 { + a.addr0 = 6'd17; + a.write_en = 1'd1; + a.write_data = A17.out; + epilogue_17[done] = a.done; + } + group epilogue_18 { + a.addr0 = 6'd18; + a.write_en = 1'd1; + a.write_data = A18.out; + epilogue_18[done] = a.done; + } + group epilogue_19 { + a.addr0 = 6'd19; + a.write_en = 1'd1; + a.write_data = A19.out; + epilogue_19[done] = a.done; + } + group epilogue_20 { + a.addr0 = 6'd20; + a.write_en = 1'd1; + a.write_data = A20.out; + epilogue_20[done] = a.done; + } + group epilogue_21 { + a.addr0 = 6'd21; + a.write_en = 1'd1; + a.write_data = A21.out; + epilogue_21[done] = a.done; + } + group epilogue_22 { + a.addr0 = 6'd22; + a.write_en = 1'd1; + a.write_data = A22.out; + epilogue_22[done] = a.done; + } + group epilogue_23 { + a.addr0 = 6'd23; + a.write_en = 1'd1; + a.write_data = A23.out; + epilogue_23[done] = a.done; + } + group epilogue_24 { + a.addr0 = 6'd24; + a.write_en = 1'd1; + a.write_data = A24.out; + epilogue_24[done] = a.done; + } + group epilogue_25 { + a.addr0 = 6'd25; + a.write_en = 1'd1; + a.write_data = A25.out; + epilogue_25[done] = a.done; + } + group epilogue_26 { + a.addr0 = 6'd26; + a.write_en = 1'd1; + a.write_data = A26.out; + epilogue_26[done] = a.done; + } + group epilogue_27 { + a.addr0 = 6'd27; + a.write_en = 1'd1; + a.write_data = A27.out; + epilogue_27[done] = a.done; + } + group epilogue_28 { + a.addr0 = 6'd28; + a.write_en = 1'd1; + a.write_data = A28.out; + epilogue_28[done] = a.done; + } + group epilogue_29 { + a.addr0 = 6'd29; + a.write_en = 1'd1; + a.write_data = A29.out; + epilogue_29[done] = a.done; + } + group epilogue_30 { + a.addr0 = 6'd30; + a.write_en = 1'd1; + a.write_data = A30.out; + epilogue_30[done] = a.done; + } + group epilogue_31 { + a.addr0 = 6'd31; + a.write_en = 1'd1; + a.write_data = A31.out; + epilogue_31[done] = a.done; + } + } + control { + seq { + seq { + preamble_0; + preamble_1; + preamble_2; + preamble_3; + preamble_4; + preamble_5; + preamble_6; + preamble_7; + preamble_8; + preamble_9; + preamble_10; + preamble_11; + preamble_12; + preamble_13; + preamble_14; + preamble_15; + preamble_16; + preamble_17; + preamble_18; + preamble_19; + preamble_20; + preamble_21; + preamble_22; + preamble_23; + preamble_24; + preamble_25; + preamble_26; + preamble_27; + preamble_28; + preamble_29; + preamble_30; + preamble_31; + } + par { + s0_mul0; + s0_mul1; + s0_mul2; + s0_mul3; + s0_mul4; + s0_mul5; + s0_mul6; + s0_mul7; + s0_mul8; + s0_mul9; + s0_mul10; + s0_mul11; + s0_mul12; + s0_mul13; + s0_mul14; + s0_mul15; + } + par { + s0_r0_op_mod; + s0_r1_op_mod; + s0_r2_op_mod; + s0_r3_op_mod; + s0_r4_op_mod; + s0_r5_op_mod; + s0_r6_op_mod; + s0_r7_op_mod; + s0_r8_op_mod; + s0_r9_op_mod; + s0_r10_op_mod; + s0_r11_op_mod; + s0_r12_op_mod; + s0_r13_op_mod; + s0_r14_op_mod; + s0_r15_op_mod; + s0_r16_op_mod; + s0_r17_op_mod; + s0_r18_op_mod; + s0_r19_op_mod; + s0_r20_op_mod; + s0_r21_op_mod; + s0_r22_op_mod; + s0_r23_op_mod; + s0_r24_op_mod; + s0_r25_op_mod; + s0_r26_op_mod; + s0_r27_op_mod; + s0_r28_op_mod; + s0_r29_op_mod; + s0_r30_op_mod; + s0_r31_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + } + par { + s1_mul0; + s1_mul1; + s1_mul2; + s1_mul3; + s1_mul4; + s1_mul5; + s1_mul6; + s1_mul7; + s1_mul8; + s1_mul9; + s1_mul10; + s1_mul11; + s1_mul12; + s1_mul13; + s1_mul14; + s1_mul15; + } + par { + s1_r0_op_mod; + s1_r1_op_mod; + s1_r2_op_mod; + s1_r3_op_mod; + s1_r4_op_mod; + s1_r5_op_mod; + s1_r6_op_mod; + s1_r7_op_mod; + s1_r8_op_mod; + s1_r9_op_mod; + s1_r10_op_mod; + s1_r11_op_mod; + s1_r12_op_mod; + s1_r13_op_mod; + s1_r14_op_mod; + s1_r15_op_mod; + s1_r16_op_mod; + s1_r17_op_mod; + s1_r18_op_mod; + s1_r19_op_mod; + s1_r20_op_mod; + s1_r21_op_mod; + s1_r22_op_mod; + s1_r23_op_mod; + s1_r24_op_mod; + s1_r25_op_mod; + s1_r26_op_mod; + s1_r27_op_mod; + s1_r28_op_mod; + s1_r29_op_mod; + s1_r30_op_mod; + s1_r31_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + } + par { + s2_mul0; + s2_mul1; + s2_mul2; + s2_mul3; + s2_mul4; + s2_mul5; + s2_mul6; + s2_mul7; + s2_mul8; + s2_mul9; + s2_mul10; + s2_mul11; + s2_mul12; + s2_mul13; + s2_mul14; + s2_mul15; + } + par { + s2_r0_op_mod; + s2_r1_op_mod; + s2_r2_op_mod; + s2_r3_op_mod; + s2_r4_op_mod; + s2_r5_op_mod; + s2_r6_op_mod; + s2_r7_op_mod; + s2_r8_op_mod; + s2_r9_op_mod; + s2_r10_op_mod; + s2_r11_op_mod; + s2_r12_op_mod; + s2_r13_op_mod; + s2_r14_op_mod; + s2_r15_op_mod; + s2_r16_op_mod; + s2_r17_op_mod; + s2_r18_op_mod; + s2_r19_op_mod; + s2_r20_op_mod; + s2_r21_op_mod; + s2_r22_op_mod; + s2_r23_op_mod; + s2_r24_op_mod; + s2_r25_op_mod; + s2_r26_op_mod; + s2_r27_op_mod; + s2_r28_op_mod; + s2_r29_op_mod; + s2_r30_op_mod; + s2_r31_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + } + par { + s3_mul0; + s3_mul1; + s3_mul2; + s3_mul3; + s3_mul4; + s3_mul5; + s3_mul6; + s3_mul7; + s3_mul8; + s3_mul9; + s3_mul10; + s3_mul11; + s3_mul12; + s3_mul13; + s3_mul14; + s3_mul15; + } + par { + s3_r0_op_mod; + s3_r1_op_mod; + s3_r2_op_mod; + s3_r3_op_mod; + s3_r4_op_mod; + s3_r5_op_mod; + s3_r6_op_mod; + s3_r7_op_mod; + s3_r8_op_mod; + s3_r9_op_mod; + s3_r10_op_mod; + s3_r11_op_mod; + s3_r12_op_mod; + s3_r13_op_mod; + s3_r14_op_mod; + s3_r15_op_mod; + s3_r16_op_mod; + s3_r17_op_mod; + s3_r18_op_mod; + s3_r19_op_mod; + s3_r20_op_mod; + s3_r21_op_mod; + s3_r22_op_mod; + s3_r23_op_mod; + s3_r24_op_mod; + s3_r25_op_mod; + s3_r26_op_mod; + s3_r27_op_mod; + s3_r28_op_mod; + s3_r29_op_mod; + s3_r30_op_mod; + s3_r31_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + } + par { + s4_mul0; + s4_mul1; + s4_mul2; + s4_mul3; + s4_mul4; + s4_mul5; + s4_mul6; + s4_mul7; + s4_mul8; + s4_mul9; + s4_mul10; + s4_mul11; + s4_mul12; + s4_mul13; + s4_mul14; + s4_mul15; + } + par { + s4_r0_op_mod; + s4_r1_op_mod; + s4_r2_op_mod; + s4_r3_op_mod; + s4_r4_op_mod; + s4_r5_op_mod; + s4_r6_op_mod; + s4_r7_op_mod; + s4_r8_op_mod; + s4_r9_op_mod; + s4_r10_op_mod; + s4_r11_op_mod; + s4_r12_op_mod; + s4_r13_op_mod; + s4_r14_op_mod; + s4_r15_op_mod; + s4_r16_op_mod; + s4_r17_op_mod; + s4_r18_op_mod; + s4_r19_op_mod; + s4_r20_op_mod; + s4_r21_op_mod; + s4_r22_op_mod; + s4_r23_op_mod; + s4_r24_op_mod; + s4_r25_op_mod; + s4_r26_op_mod; + s4_r27_op_mod; + s4_r28_op_mod; + s4_r29_op_mod; + s4_r30_op_mod; + s4_r31_op_mod; + } + seq { + epilogue_0; + epilogue_1; + epilogue_2; + epilogue_3; + epilogue_4; + epilogue_5; + epilogue_6; + epilogue_7; + epilogue_8; + epilogue_9; + epilogue_10; + epilogue_11; + epilogue_12; + epilogue_13; + epilogue_14; + epilogue_15; + epilogue_16; + epilogue_17; + epilogue_18; + epilogue_19; + epilogue_20; + epilogue_21; + epilogue_22; + epilogue_23; + epilogue_24; + epilogue_25; + epilogue_26; + epilogue_27; + epilogue_28; + epilogue_29; + epilogue_30; + epilogue_31; + } + } + } +} diff --git a/interp/cider2-tests/benchmarks/ntt-32.futil.data b/interp/cider2-tests/benchmarks/ntt-32.futil.data new file mode 100644 index 0000000000..24990d01e1 --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-32.futil.data @@ -0,0 +1,84 @@ +{ + "a": { + "format": { + "numeric_type": "bitnum", + "is_signed": true, + "width": 32 + }, + "data": [ + 125, + 734, + 986, + 527, + 551, + 764, + 655, + 693, + 938, + 748, + 769, + 340, + 298, + 336, + 333, + 939, + 734, + 310, + 719, + 918, + 173, + 497, + 828, + 188, + 423, + 774, + 34, + 515, + 937, + 311, + 748, + 713 + ] + }, + "phis": { + "format": { + "numeric_type": "bitnum", + "is_signed": true, + "width": 32 + }, + "data": [ + 1, + 28, + 8, + 30, + 64, + 46, + 27, + 77, + 22, + 34, + 79, + 78, + 50, + 42, + 12, + 45, + 96, + 69, + 89, + 67, + 33, + 51, + 70, + 20, + 75, + 63, + 18, + 19, + 47, + 55, + 85, + 52 + ] + } +} diff --git a/interp/cider2-tests/benchmarks/ntt-64.expect b/interp/cider2-tests/benchmarks/ntt-64.expect new file mode 100644 index 0000000000..a49290f34b --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-64.expect @@ -0,0 +1,134 @@ +{ + "a": [ + 13, + 160, + 115, + 98, + 99, + 125, + 178, + 184, + 109, + 163, + 142, + 87, + 173, + 160, + 187, + 52, + 1, + 124, + 31, + 155, + 43, + 126, + 109, + 11, + 10, + 65, + 33, + 115, + 72, + 112, + 73, + 65, + 32, + 138, + 172, + 29, + 107, + 93, + 134, + 26, + 139, + 49, + 126, + 38, + 47, + 57, + 103, + 104, + 187, + 128, + 138, + 21, + 48, + 108, + 152, + 84, + 77, + 184, + 181, + 84, + 134, + 22, + 128, + 39 + ], + "phis": [ + 1, + 125, + 185, + 158, + 64, + 87, + 67, + 76, + 43, + 164, + 42, + 39, + 50, + 74, + 179, + 180, + 112, + 104, + 69, + 133, + 27, + 94, + 170, + 20, + 184, + 33, + 72, + 122, + 3, + 182, + 169, + 88, + 192, + 68, + 8, + 35, + 129, + 106, + 126, + 117, + 150, + 29, + 151, + 154, + 143, + 119, + 14, + 13, + 81, + 89, + 124, + 60, + 166, + 99, + 23, + 173, + 9, + 160, + 121, + 71, + 190, + 11, + 24, + 105 + ] +} diff --git a/interp/cider2-tests/benchmarks/ntt-64.futil b/interp/cider2-tests/benchmarks/ntt-64.futil new file mode 100644 index 0000000000..1c3a4b4935 --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-64.futil @@ -0,0 +1,7802 @@ +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+--------------------------+ +// | a | Stage 0 | Stage 1 | Stage 2 | Stage 3 | Stage 4 | Stage 5 | +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+--------------------------+ +// | 0 | a[0] + a[32] * phis[1] | a[0] + a[16] * phis[2] | a[0] + a[8] * phis[4] | a[0] + a[4] * phis[8] | a[0] + a[2] * phis[16] | a[0] + a[1] * phis[32] | +// | 1 | a[1] + a[33] * phis[1] | a[1] + a[17] * phis[2] | a[1] + a[9] * phis[4] | a[1] + a[5] * phis[8] | a[1] + a[3] * phis[16] | a[0] - a[1] * phis[32] | +// | 2 | a[2] + a[34] * phis[1] | a[2] + a[18] * phis[2] | a[2] + a[10] * phis[4] | a[2] + a[6] * phis[8] | a[0] - a[2] * phis[16] | a[2] + a[3] * phis[33] | +// | 3 | a[3] + a[35] * phis[1] | a[3] + a[19] * phis[2] | a[3] + a[11] * phis[4] | a[3] + a[7] * phis[8] | a[1] - a[3] * phis[16] | a[2] - a[3] * phis[33] | +// | 4 | a[4] + a[36] * phis[1] | a[4] + a[20] * phis[2] | a[4] + a[12] * phis[4] | a[0] - a[4] * phis[8] | a[4] + a[6] * phis[17] | a[4] + a[5] * phis[34] | +// | 5 | a[5] + a[37] * phis[1] | a[5] + a[21] * phis[2] | a[5] + a[13] * phis[4] | a[1] - a[5] * phis[8] | a[5] + a[7] * phis[17] | a[4] - a[5] * phis[34] | +// | 6 | a[6] + a[38] * phis[1] | a[6] + a[22] * phis[2] | a[6] + a[14] * phis[4] | a[2] - a[6] * phis[8] | a[4] - a[6] * phis[17] | a[6] + a[7] * phis[35] | +// | 7 | a[7] + a[39] * phis[1] | a[7] + a[23] * phis[2] | a[7] + a[15] * phis[4] | a[3] - a[7] * phis[8] | a[5] - a[7] * phis[17] | a[6] - a[7] * phis[35] | +// | 8 | a[8] + a[40] * phis[1] | a[8] + a[24] * phis[2] | a[0] - a[8] * phis[4] | a[8] + a[12] * phis[9] | a[8] + a[10] * phis[18] | a[8] + a[9] * phis[36] | +// | 9 | a[9] + a[41] * phis[1] | a[9] + a[25] * phis[2] | a[1] - a[9] * phis[4] | a[9] + a[13] * phis[9] | a[9] + a[11] * phis[18] | a[8] - a[9] * phis[36] | +// | 10 | a[10] + a[42] * phis[1] | a[10] + a[26] * phis[2] | a[2] - a[10] * phis[4] | a[10] + a[14] * phis[9] | a[8] - a[10] * phis[18] | a[10] + a[11] * phis[37] | +// | 11 | a[11] + a[43] * phis[1] | a[11] + a[27] * phis[2] | a[3] - a[11] * phis[4] | a[11] + a[15] * phis[9] | a[9] - a[11] * phis[18] | a[10] - a[11] * phis[37] | +// | 12 | a[12] + a[44] * phis[1] | a[12] + a[28] * phis[2] | a[4] - a[12] * phis[4] | a[8] - a[12] * phis[9] | a[12] + a[14] * phis[19] | a[12] + a[13] * phis[38] | +// | 13 | a[13] + a[45] * phis[1] | a[13] + a[29] * phis[2] | a[5] - a[13] * phis[4] | a[9] - a[13] * phis[9] | a[13] + a[15] * phis[19] | a[12] - a[13] * phis[38] | +// | 14 | a[14] + a[46] * phis[1] | a[14] + a[30] * phis[2] | a[6] - a[14] * phis[4] | a[10] - a[14] * phis[9] | a[12] - a[14] * phis[19] | a[14] + a[15] * phis[39] | +// | 15 | a[15] + a[47] * phis[1] | a[15] + a[31] * phis[2] | a[7] - a[15] * phis[4] | a[11] - a[15] * phis[9] | a[13] - a[15] * phis[19] | a[14] - a[15] * phis[39] | +// | 16 | a[16] + a[48] * phis[1] | a[0] - a[16] * phis[2] | a[16] + a[24] * phis[5] | a[16] + a[20] * phis[10] | a[16] + a[18] * phis[20] | a[16] + a[17] * phis[40] | +// | 17 | a[17] + a[49] * phis[1] | a[1] - a[17] * phis[2] | a[17] + a[25] * phis[5] | a[17] + a[21] * phis[10] | a[17] + a[19] * phis[20] | a[16] - a[17] * phis[40] | +// | 18 | a[18] + a[50] * phis[1] | a[2] - a[18] * phis[2] | a[18] + a[26] * phis[5] | a[18] + a[22] * phis[10] | a[16] - a[18] * phis[20] | a[18] + a[19] * phis[41] | +// | 19 | a[19] + a[51] * phis[1] | a[3] - a[19] * phis[2] | a[19] + a[27] * phis[5] | a[19] + a[23] * phis[10] | a[17] - a[19] * phis[20] | a[18] - a[19] * phis[41] | +// | 20 | a[20] + a[52] * phis[1] | a[4] - a[20] * phis[2] | a[20] + a[28] * phis[5] | a[16] - a[20] * phis[10] | a[20] + a[22] * phis[21] | a[20] + a[21] * phis[42] | +// | 21 | a[21] + a[53] * phis[1] | a[5] - a[21] * phis[2] | a[21] + a[29] * phis[5] | a[17] - a[21] * phis[10] | a[21] + a[23] * phis[21] | a[20] - a[21] * phis[42] | +// | 22 | a[22] + a[54] * phis[1] | a[6] - a[22] * phis[2] | a[22] + a[30] * phis[5] | a[18] - a[22] * phis[10] | a[20] - a[22] * phis[21] | a[22] + a[23] * phis[43] | +// | 23 | a[23] + a[55] * phis[1] | a[7] - a[23] * phis[2] | a[23] + a[31] * phis[5] | a[19] - a[23] * phis[10] | a[21] - a[23] * phis[21] | a[22] - a[23] * phis[43] | +// | 24 | a[24] + a[56] * phis[1] | a[8] - a[24] * phis[2] | a[16] - a[24] * phis[5] | a[24] + a[28] * phis[11] | a[24] + a[26] * phis[22] | a[24] + a[25] * phis[44] | +// | 25 | a[25] + a[57] * phis[1] | a[9] - a[25] * phis[2] | a[17] - a[25] * phis[5] | a[25] + a[29] * phis[11] | a[25] + a[27] * phis[22] | a[24] - a[25] * phis[44] | +// | 26 | a[26] + a[58] * phis[1] | a[10] - a[26] * phis[2] | a[18] - a[26] * phis[5] | a[26] + a[30] * phis[11] | a[24] - a[26] * phis[22] | a[26] + a[27] * phis[45] | +// | 27 | a[27] + a[59] * phis[1] | a[11] - a[27] * phis[2] | a[19] - a[27] * phis[5] | a[27] + a[31] * phis[11] | a[25] - a[27] * phis[22] | a[26] - a[27] * phis[45] | +// | 28 | a[28] + a[60] * phis[1] | a[12] - a[28] * phis[2] | a[20] - a[28] * phis[5] | a[24] - a[28] * phis[11] | a[28] + a[30] * phis[23] | a[28] + a[29] * phis[46] | +// | 29 | a[29] + a[61] * phis[1] | a[13] - a[29] * phis[2] | a[21] - a[29] * phis[5] | a[25] - a[29] * phis[11] | a[29] + a[31] * phis[23] | a[28] - a[29] * phis[46] | +// | 30 | a[30] + a[62] * phis[1] | a[14] - a[30] * phis[2] | a[22] - a[30] * phis[5] | a[26] - a[30] * phis[11] | a[28] - a[30] * phis[23] | a[30] + a[31] * phis[47] | +// | 31 | a[31] + a[63] * phis[1] | a[15] - a[31] * phis[2] | a[23] - a[31] * phis[5] | a[27] - a[31] * phis[11] | a[29] - a[31] * phis[23] | a[30] - a[31] * phis[47] | +// | 32 | a[0] - a[32] * phis[1] | a[32] + a[48] * phis[3] | a[32] + a[40] * phis[6] | a[32] + a[36] * phis[12] | a[32] + a[34] * phis[24] | a[32] + a[33] * phis[48] | +// | 33 | a[1] - a[33] * phis[1] | a[33] + a[49] * phis[3] | a[33] + a[41] * phis[6] | a[33] + a[37] * phis[12] | a[33] + a[35] * phis[24] | a[32] - a[33] * phis[48] | +// | 34 | a[2] - a[34] * phis[1] | a[34] + a[50] * phis[3] | a[34] + a[42] * phis[6] | a[34] + a[38] * phis[12] | a[32] - a[34] * phis[24] | a[34] + a[35] * phis[49] | +// | 35 | a[3] - a[35] * phis[1] | a[35] + a[51] * phis[3] | a[35] + a[43] * phis[6] | a[35] + a[39] * phis[12] | a[33] - a[35] * phis[24] | a[34] - a[35] * phis[49] | +// | 36 | a[4] - a[36] * phis[1] | a[36] + a[52] * phis[3] | a[36] + a[44] * phis[6] | a[32] - a[36] * phis[12] | a[36] + a[38] * phis[25] | a[36] + a[37] * phis[50] | +// | 37 | a[5] - a[37] * phis[1] | a[37] + a[53] * phis[3] | a[37] + a[45] * phis[6] | a[33] - a[37] * phis[12] | a[37] + a[39] * phis[25] | a[36] - a[37] * phis[50] | +// | 38 | a[6] - a[38] * phis[1] | a[38] + a[54] * phis[3] | a[38] + a[46] * phis[6] | a[34] - a[38] * phis[12] | a[36] - a[38] * phis[25] | a[38] + a[39] * phis[51] | +// | 39 | a[7] - a[39] * phis[1] | a[39] + a[55] * phis[3] | a[39] + a[47] * phis[6] | a[35] - a[39] * phis[12] | a[37] - a[39] * phis[25] | a[38] - a[39] * phis[51] | +// | 40 | a[8] - a[40] * phis[1] | a[40] + a[56] * phis[3] | a[32] - a[40] * phis[6] | a[40] + a[44] * phis[13] | a[40] + a[42] * phis[26] | a[40] + a[41] * phis[52] | +// | 41 | a[9] - a[41] * phis[1] | a[41] + a[57] * phis[3] | a[33] - a[41] * phis[6] | a[41] + a[45] * phis[13] | a[41] + a[43] * phis[26] | a[40] - a[41] * phis[52] | +// | 42 | a[10] - a[42] * phis[1] | a[42] + a[58] * phis[3] | a[34] - a[42] * phis[6] | a[42] + a[46] * phis[13] | a[40] - a[42] * phis[26] | a[42] + a[43] * phis[53] | +// | 43 | a[11] - a[43] * phis[1] | a[43] + a[59] * phis[3] | a[35] - a[43] * phis[6] | a[43] + a[47] * phis[13] | a[41] - a[43] * phis[26] | a[42] - a[43] * phis[53] | +// | 44 | a[12] - a[44] * phis[1] | a[44] + a[60] * phis[3] | a[36] - a[44] * phis[6] | a[40] - a[44] * phis[13] | a[44] + a[46] * phis[27] | a[44] + a[45] * phis[54] | +// | 45 | a[13] - a[45] * phis[1] | a[45] + a[61] * phis[3] | a[37] - a[45] * phis[6] | a[41] - a[45] * phis[13] | a[45] + a[47] * phis[27] | a[44] - a[45] * phis[54] | +// | 46 | a[14] - a[46] * phis[1] | a[46] + a[62] * phis[3] | a[38] - a[46] * phis[6] | a[42] - a[46] * phis[13] | a[44] - a[46] * phis[27] | a[46] + a[47] * phis[55] | +// | 47 | a[15] - a[47] * phis[1] | a[47] + a[63] * phis[3] | a[39] - a[47] * phis[6] | a[43] - a[47] * phis[13] | a[45] - a[47] * phis[27] | a[46] - a[47] * phis[55] | +// | 48 | a[16] - a[48] * phis[1] | a[32] - a[48] * phis[3] | a[48] + a[56] * phis[7] | a[48] + a[52] * phis[14] | a[48] + a[50] * phis[28] | a[48] + a[49] * phis[56] | +// | 49 | a[17] - a[49] * phis[1] | a[33] - a[49] * phis[3] | a[49] + a[57] * phis[7] | a[49] + a[53] * phis[14] | a[49] + a[51] * phis[28] | a[48] - a[49] * phis[56] | +// | 50 | a[18] - a[50] * phis[1] | a[34] - a[50] * phis[3] | a[50] + a[58] * phis[7] | a[50] + a[54] * phis[14] | a[48] - a[50] * phis[28] | a[50] + a[51] * phis[57] | +// | 51 | a[19] - a[51] * phis[1] | a[35] - a[51] * phis[3] | a[51] + a[59] * phis[7] | a[51] + a[55] * phis[14] | a[49] - a[51] * phis[28] | a[50] - a[51] * phis[57] | +// | 52 | a[20] - a[52] * phis[1] | a[36] - a[52] * phis[3] | a[52] + a[60] * phis[7] | a[48] - a[52] * phis[14] | a[52] + a[54] * phis[29] | a[52] + a[53] * phis[58] | +// | 53 | a[21] - a[53] * phis[1] | a[37] - a[53] * phis[3] | a[53] + a[61] * phis[7] | a[49] - a[53] * phis[14] | a[53] + a[55] * phis[29] | a[52] - a[53] * phis[58] | +// | 54 | a[22] - a[54] * phis[1] | a[38] - a[54] * phis[3] | a[54] + a[62] * phis[7] | a[50] - a[54] * phis[14] | a[52] - a[54] * phis[29] | a[54] + a[55] * phis[59] | +// | 55 | a[23] - a[55] * phis[1] | a[39] - a[55] * phis[3] | a[55] + a[63] * phis[7] | a[51] - a[55] * phis[14] | a[53] - a[55] * phis[29] | a[54] - a[55] * phis[59] | +// | 56 | a[24] - a[56] * phis[1] | a[40] - a[56] * phis[3] | a[48] - a[56] * phis[7] | a[56] + a[60] * phis[15] | a[56] + a[58] * phis[30] | a[56] + a[57] * phis[60] | +// | 57 | a[25] - a[57] * phis[1] | a[41] - a[57] * phis[3] | a[49] - a[57] * phis[7] | a[57] + a[61] * phis[15] | a[57] + a[59] * phis[30] | a[56] - a[57] * phis[60] | +// | 58 | a[26] - a[58] * phis[1] | a[42] - a[58] * phis[3] | a[50] - a[58] * phis[7] | a[58] + a[62] * phis[15] | a[56] - a[58] * phis[30] | a[58] + a[59] * phis[61] | +// | 59 | a[27] - a[59] * phis[1] | a[43] - a[59] * phis[3] | a[51] - a[59] * phis[7] | a[59] + a[63] * phis[15] | a[57] - a[59] * phis[30] | a[58] - a[59] * phis[61] | +// | 60 | a[28] - a[60] * phis[1] | a[44] - a[60] * phis[3] | a[52] - a[60] * phis[7] | a[56] - a[60] * phis[15] | a[60] + a[62] * phis[31] | a[60] + a[61] * phis[62] | +// | 61 | a[29] - a[61] * phis[1] | a[45] - a[61] * phis[3] | a[53] - a[61] * phis[7] | a[57] - a[61] * phis[15] | a[61] + a[63] * phis[31] | a[60] - a[61] * phis[62] | +// | 62 | a[30] - a[62] * phis[1] | a[46] - a[62] * phis[3] | a[54] - a[62] * phis[7] | a[58] - a[62] * phis[15] | a[60] - a[62] * phis[31] | a[62] + a[63] * phis[63] | +// | 63 | a[31] - a[63] * phis[1] | a[47] - a[63] * phis[3] | a[55] - a[63] * phis[7] | a[59] - a[63] * phis[15] | a[61] - a[63] * phis[31] | a[62] - a[63] * phis[63] | +// +----+-------------------------+-------------------------+-------------------------+--------------------------+--------------------------+--------------------------+ +import "primitives/core.futil"; +import "primitives/binary_operators.futil"; +import "primitives/memories/comb.futil"; + +component main() -> () { + cells { + @external(1) a = comb_mem_d1(32, 64, 7); + @external(1) phis = comb_mem_d1(32, 64, 7); + r0 = std_reg(32); + r1 = std_reg(32); + r2 = std_reg(32); + r3 = std_reg(32); + r4 = std_reg(32); + r5 = std_reg(32); + r6 = std_reg(32); + r7 = std_reg(32); + r8 = std_reg(32); + r9 = std_reg(32); + r10 = std_reg(32); + r11 = std_reg(32); + r12 = std_reg(32); + r13 = std_reg(32); + r14 = std_reg(32); + r15 = std_reg(32); + r16 = std_reg(32); + r17 = std_reg(32); + r18 = std_reg(32); + r19 = std_reg(32); + r20 = std_reg(32); + r21 = std_reg(32); + r22 = std_reg(32); + r23 = std_reg(32); + r24 = std_reg(32); + r25 = std_reg(32); + r26 = std_reg(32); + r27 = std_reg(32); + r28 = std_reg(32); + r29 = std_reg(32); + r30 = std_reg(32); + r31 = std_reg(32); + r32 = std_reg(32); + r33 = std_reg(32); + r34 = std_reg(32); + r35 = std_reg(32); + r36 = std_reg(32); + r37 = std_reg(32); + r38 = std_reg(32); + r39 = std_reg(32); + r40 = std_reg(32); + r41 = std_reg(32); + r42 = std_reg(32); + r43 = std_reg(32); + r44 = std_reg(32); + r45 = std_reg(32); + r46 = std_reg(32); + r47 = std_reg(32); + r48 = std_reg(32); + r49 = std_reg(32); + r50 = std_reg(32); + r51 = std_reg(32); + r52 = std_reg(32); + r53 = std_reg(32); + r54 = std_reg(32); + r55 = std_reg(32); + r56 = std_reg(32); + r57 = std_reg(32); + r58 = std_reg(32); + r59 = std_reg(32); + r60 = std_reg(32); + r61 = std_reg(32); + r62 = std_reg(32); + r63 = std_reg(32); + A0 = std_reg(32); + A1 = std_reg(32); + A2 = std_reg(32); + A3 = std_reg(32); + A4 = std_reg(32); + A5 = std_reg(32); + A6 = std_reg(32); + A7 = std_reg(32); + A8 = std_reg(32); + A9 = std_reg(32); + A10 = std_reg(32); + A11 = std_reg(32); + A12 = std_reg(32); + A13 = std_reg(32); + A14 = std_reg(32); + A15 = std_reg(32); + A16 = std_reg(32); + A17 = std_reg(32); + A18 = std_reg(32); + A19 = std_reg(32); + A20 = std_reg(32); + A21 = std_reg(32); + A22 = std_reg(32); + A23 = std_reg(32); + A24 = std_reg(32); + A25 = std_reg(32); + A26 = std_reg(32); + A27 = std_reg(32); + A28 = std_reg(32); + A29 = std_reg(32); + A30 = std_reg(32); + A31 = std_reg(32); + A32 = std_reg(32); + A33 = std_reg(32); + A34 = std_reg(32); + A35 = std_reg(32); + A36 = std_reg(32); + A37 = std_reg(32); + A38 = std_reg(32); + A39 = std_reg(32); + A40 = std_reg(32); + A41 = std_reg(32); + A42 = std_reg(32); + A43 = std_reg(32); + A44 = std_reg(32); + A45 = std_reg(32); + A46 = std_reg(32); + A47 = std_reg(32); + A48 = std_reg(32); + A49 = std_reg(32); + A50 = std_reg(32); + A51 = std_reg(32); + A52 = std_reg(32); + A53 = std_reg(32); + A54 = std_reg(32); + A55 = std_reg(32); + A56 = std_reg(32); + A57 = std_reg(32); + A58 = std_reg(32); + A59 = std_reg(32); + A60 = std_reg(32); + A61 = std_reg(32); + A62 = std_reg(32); + A63 = std_reg(32); + mul0 = std_reg(32); + mul1 = std_reg(32); + mul2 = std_reg(32); + mul3 = std_reg(32); + mul4 = std_reg(32); + mul5 = std_reg(32); + mul6 = std_reg(32); + mul7 = std_reg(32); + mul8 = std_reg(32); + mul9 = std_reg(32); + mul10 = std_reg(32); + mul11 = std_reg(32); + mul12 = std_reg(32); + mul13 = std_reg(32); + mul14 = std_reg(32); + mul15 = std_reg(32); + mul16 = std_reg(32); + mul17 = std_reg(32); + mul18 = std_reg(32); + mul19 = std_reg(32); + mul20 = std_reg(32); + mul21 = std_reg(32); + mul22 = std_reg(32); + mul23 = std_reg(32); + mul24 = std_reg(32); + mul25 = std_reg(32); + mul26 = std_reg(32); + mul27 = std_reg(32); + mul28 = std_reg(32); + mul29 = std_reg(32); + mul30 = std_reg(32); + mul31 = std_reg(32); + phi0 = std_reg(32); + phi1 = std_reg(32); + phi2 = std_reg(32); + phi3 = std_reg(32); + phi4 = std_reg(32); + phi5 = std_reg(32); + phi6 = std_reg(32); + phi7 = std_reg(32); + phi8 = std_reg(32); + phi9 = std_reg(32); + phi10 = std_reg(32); + phi11 = std_reg(32); + phi12 = std_reg(32); + phi13 = std_reg(32); + phi14 = std_reg(32); + phi15 = std_reg(32); + phi16 = std_reg(32); + phi17 = std_reg(32); + phi18 = std_reg(32); + phi19 = std_reg(32); + phi20 = std_reg(32); + phi21 = std_reg(32); + phi22 = std_reg(32); + phi23 = std_reg(32); + phi24 = std_reg(32); + phi25 = std_reg(32); + phi26 = std_reg(32); + phi27 = std_reg(32); + phi28 = std_reg(32); + phi29 = std_reg(32); + phi30 = std_reg(32); + phi31 = std_reg(32); + phi32 = std_reg(32); + phi33 = std_reg(32); + phi34 = std_reg(32); + phi35 = std_reg(32); + phi36 = std_reg(32); + phi37 = std_reg(32); + phi38 = std_reg(32); + phi39 = std_reg(32); + phi40 = std_reg(32); + phi41 = std_reg(32); + phi42 = std_reg(32); + phi43 = std_reg(32); + phi44 = std_reg(32); + phi45 = std_reg(32); + phi46 = std_reg(32); + phi47 = std_reg(32); + phi48 = std_reg(32); + phi49 = std_reg(32); + phi50 = std_reg(32); + phi51 = std_reg(32); + phi52 = std_reg(32); + phi53 = std_reg(32); + phi54 = std_reg(32); + phi55 = std_reg(32); + phi56 = std_reg(32); + phi57 = std_reg(32); + phi58 = std_reg(32); + phi59 = std_reg(32); + phi60 = std_reg(32); + phi61 = std_reg(32); + phi62 = std_reg(32); + phi63 = std_reg(32); + mod_pipe0 = std_sdiv_pipe(32); + mod_pipe1 = std_sdiv_pipe(32); + mod_pipe2 = std_sdiv_pipe(32); + mod_pipe3 = std_sdiv_pipe(32); + mod_pipe4 = std_sdiv_pipe(32); + mod_pipe5 = std_sdiv_pipe(32); + mod_pipe6 = std_sdiv_pipe(32); + mod_pipe7 = std_sdiv_pipe(32); + mod_pipe8 = std_sdiv_pipe(32); + mod_pipe9 = std_sdiv_pipe(32); + mod_pipe10 = std_sdiv_pipe(32); + mod_pipe11 = std_sdiv_pipe(32); + mod_pipe12 = std_sdiv_pipe(32); + mod_pipe13 = std_sdiv_pipe(32); + mod_pipe14 = std_sdiv_pipe(32); + mod_pipe15 = std_sdiv_pipe(32); + mod_pipe16 = std_sdiv_pipe(32); + mod_pipe17 = std_sdiv_pipe(32); + mod_pipe18 = std_sdiv_pipe(32); + mod_pipe19 = std_sdiv_pipe(32); + mod_pipe20 = std_sdiv_pipe(32); + mod_pipe21 = std_sdiv_pipe(32); + mod_pipe22 = std_sdiv_pipe(32); + mod_pipe23 = std_sdiv_pipe(32); + mod_pipe24 = std_sdiv_pipe(32); + mod_pipe25 = std_sdiv_pipe(32); + mod_pipe26 = std_sdiv_pipe(32); + mod_pipe27 = std_sdiv_pipe(32); + mod_pipe28 = std_sdiv_pipe(32); + mod_pipe29 = std_sdiv_pipe(32); + mod_pipe30 = std_sdiv_pipe(32); + mod_pipe31 = std_sdiv_pipe(32); + mod_pipe32 = std_sdiv_pipe(32); + mod_pipe33 = std_sdiv_pipe(32); + mod_pipe34 = std_sdiv_pipe(32); + mod_pipe35 = std_sdiv_pipe(32); + mod_pipe36 = std_sdiv_pipe(32); + mod_pipe37 = std_sdiv_pipe(32); + mod_pipe38 = std_sdiv_pipe(32); + mod_pipe39 = std_sdiv_pipe(32); + mod_pipe40 = std_sdiv_pipe(32); + mod_pipe41 = std_sdiv_pipe(32); + mod_pipe42 = std_sdiv_pipe(32); + mod_pipe43 = std_sdiv_pipe(32); + mod_pipe44 = std_sdiv_pipe(32); + mod_pipe45 = std_sdiv_pipe(32); + mod_pipe46 = std_sdiv_pipe(32); + mod_pipe47 = std_sdiv_pipe(32); + mod_pipe48 = std_sdiv_pipe(32); + mod_pipe49 = std_sdiv_pipe(32); + mod_pipe50 = std_sdiv_pipe(32); + mod_pipe51 = std_sdiv_pipe(32); + mod_pipe52 = std_sdiv_pipe(32); + mod_pipe53 = std_sdiv_pipe(32); + mod_pipe54 = std_sdiv_pipe(32); + mod_pipe55 = std_sdiv_pipe(32); + mod_pipe56 = std_sdiv_pipe(32); + mod_pipe57 = std_sdiv_pipe(32); + mod_pipe58 = std_sdiv_pipe(32); + mod_pipe59 = std_sdiv_pipe(32); + mod_pipe60 = std_sdiv_pipe(32); + mod_pipe61 = std_sdiv_pipe(32); + mod_pipe62 = std_sdiv_pipe(32); + mod_pipe63 = std_sdiv_pipe(32); + mult_pipe0 = std_smult_pipe(32); + mult_pipe1 = std_smult_pipe(32); + mult_pipe2 = std_smult_pipe(32); + mult_pipe3 = std_smult_pipe(32); + mult_pipe4 = std_smult_pipe(32); + mult_pipe5 = std_smult_pipe(32); + mult_pipe6 = std_smult_pipe(32); + mult_pipe7 = std_smult_pipe(32); + mult_pipe8 = std_smult_pipe(32); + mult_pipe9 = std_smult_pipe(32); + mult_pipe10 = std_smult_pipe(32); + mult_pipe11 = std_smult_pipe(32); + mult_pipe12 = std_smult_pipe(32); + mult_pipe13 = std_smult_pipe(32); + mult_pipe14 = std_smult_pipe(32); + mult_pipe15 = std_smult_pipe(32); + mult_pipe16 = std_smult_pipe(32); + mult_pipe17 = std_smult_pipe(32); + mult_pipe18 = std_smult_pipe(32); + mult_pipe19 = std_smult_pipe(32); + mult_pipe20 = std_smult_pipe(32); + mult_pipe21 = std_smult_pipe(32); + mult_pipe22 = std_smult_pipe(32); + mult_pipe23 = std_smult_pipe(32); + mult_pipe24 = std_smult_pipe(32); + mult_pipe25 = std_smult_pipe(32); + mult_pipe26 = std_smult_pipe(32); + mult_pipe27 = std_smult_pipe(32); + mult_pipe28 = std_smult_pipe(32); + mult_pipe29 = std_smult_pipe(32); + mult_pipe30 = std_smult_pipe(32); + mult_pipe31 = std_smult_pipe(32); + add0 = std_sadd(32); + add1 = std_sadd(32); + add2 = std_sadd(32); + add3 = std_sadd(32); + add4 = std_sadd(32); + add5 = std_sadd(32); + add6 = std_sadd(32); + add7 = std_sadd(32); + add8 = std_sadd(32); + add9 = std_sadd(32); + add10 = std_sadd(32); + add11 = std_sadd(32); + add12 = std_sadd(32); + add13 = std_sadd(32); + add14 = std_sadd(32); + add15 = std_sadd(32); + add16 = std_sadd(32); + add17 = std_sadd(32); + add18 = std_sadd(32); + add19 = std_sadd(32); + add20 = std_sadd(32); + add21 = std_sadd(32); + add22 = std_sadd(32); + add23 = std_sadd(32); + add24 = std_sadd(32); + add25 = std_sadd(32); + add26 = std_sadd(32); + add27 = std_sadd(32); + add28 = std_sadd(32); + add29 = std_sadd(32); + add30 = std_sadd(32); + add31 = std_sadd(32); + sub0 = std_ssub(32); + sub1 = std_ssub(32); + sub2 = std_ssub(32); + sub3 = std_ssub(32); + sub4 = std_ssub(32); + sub5 = std_ssub(32); + sub6 = std_ssub(32); + sub7 = std_ssub(32); + sub8 = std_ssub(32); + sub9 = std_ssub(32); + sub10 = std_ssub(32); + sub11 = std_ssub(32); + sub12 = std_ssub(32); + sub13 = std_ssub(32); + sub14 = std_ssub(32); + sub15 = std_ssub(32); + sub16 = std_ssub(32); + sub17 = std_ssub(32); + sub18 = std_ssub(32); + sub19 = std_ssub(32); + sub20 = std_ssub(32); + sub21 = std_ssub(32); + sub22 = std_ssub(32); + sub23 = std_ssub(32); + sub24 = std_ssub(32); + sub25 = std_ssub(32); + sub26 = std_ssub(32); + sub27 = std_ssub(32); + sub28 = std_ssub(32); + sub29 = std_ssub(32); + sub30 = std_ssub(32); + sub31 = std_ssub(32); + } + wires { + group preamble_0 { + a.addr0 = 7'd0; + phis.addr0 = 7'd0; + r0.write_en = 1'd1; + r0.in = a.read_data; + phi0.write_en = 1'd1; + phi0.in = phis.read_data; + preamble_0[done] = r0.done & phi0.done ? 1'd1; + } + group preamble_1 { + a.addr0 = 7'd1; + phis.addr0 = 7'd1; + r1.write_en = 1'd1; + r1.in = a.read_data; + phi1.write_en = 1'd1; + phi1.in = phis.read_data; + preamble_1[done] = r1.done & phi1.done ? 1'd1; + } + group preamble_2 { + a.addr0 = 7'd2; + phis.addr0 = 7'd2; + r2.write_en = 1'd1; + r2.in = a.read_data; + phi2.write_en = 1'd1; + phi2.in = phis.read_data; + preamble_2[done] = r2.done & phi2.done ? 1'd1; + } + group preamble_3 { + a.addr0 = 7'd3; + phis.addr0 = 7'd3; + r3.write_en = 1'd1; + r3.in = a.read_data; + phi3.write_en = 1'd1; + phi3.in = phis.read_data; + preamble_3[done] = r3.done & phi3.done ? 1'd1; + } + group preamble_4 { + a.addr0 = 7'd4; + phis.addr0 = 7'd4; + r4.write_en = 1'd1; + r4.in = a.read_data; + phi4.write_en = 1'd1; + phi4.in = phis.read_data; + preamble_4[done] = r4.done & phi4.done ? 1'd1; + } + group preamble_5 { + a.addr0 = 7'd5; + phis.addr0 = 7'd5; + r5.write_en = 1'd1; + r5.in = a.read_data; + phi5.write_en = 1'd1; + phi5.in = phis.read_data; + preamble_5[done] = r5.done & phi5.done ? 1'd1; + } + group preamble_6 { + a.addr0 = 7'd6; + phis.addr0 = 7'd6; + r6.write_en = 1'd1; + r6.in = a.read_data; + phi6.write_en = 1'd1; + phi6.in = phis.read_data; + preamble_6[done] = r6.done & phi6.done ? 1'd1; + } + group preamble_7 { + a.addr0 = 7'd7; + phis.addr0 = 7'd7; + r7.write_en = 1'd1; + r7.in = a.read_data; + phi7.write_en = 1'd1; + phi7.in = phis.read_data; + preamble_7[done] = r7.done & phi7.done ? 1'd1; + } + group preamble_8 { + a.addr0 = 7'd8; + phis.addr0 = 7'd8; + r8.write_en = 1'd1; + r8.in = a.read_data; + phi8.write_en = 1'd1; + phi8.in = phis.read_data; + preamble_8[done] = r8.done & phi8.done ? 1'd1; + } + group preamble_9 { + a.addr0 = 7'd9; + phis.addr0 = 7'd9; + r9.write_en = 1'd1; + r9.in = a.read_data; + phi9.write_en = 1'd1; + phi9.in = phis.read_data; + preamble_9[done] = r9.done & phi9.done ? 1'd1; + } + group preamble_10 { + a.addr0 = 7'd10; + phis.addr0 = 7'd10; + r10.write_en = 1'd1; + r10.in = a.read_data; + phi10.write_en = 1'd1; + phi10.in = phis.read_data; + preamble_10[done] = r10.done & phi10.done ? 1'd1; + } + group preamble_11 { + a.addr0 = 7'd11; + phis.addr0 = 7'd11; + r11.write_en = 1'd1; + r11.in = a.read_data; + phi11.write_en = 1'd1; + phi11.in = phis.read_data; + preamble_11[done] = r11.done & phi11.done ? 1'd1; + } + group preamble_12 { + a.addr0 = 7'd12; + phis.addr0 = 7'd12; + r12.write_en = 1'd1; + r12.in = a.read_data; + phi12.write_en = 1'd1; + phi12.in = phis.read_data; + preamble_12[done] = r12.done & phi12.done ? 1'd1; + } + group preamble_13 { + a.addr0 = 7'd13; + phis.addr0 = 7'd13; + r13.write_en = 1'd1; + r13.in = a.read_data; + phi13.write_en = 1'd1; + phi13.in = phis.read_data; + preamble_13[done] = r13.done & phi13.done ? 1'd1; + } + group preamble_14 { + a.addr0 = 7'd14; + phis.addr0 = 7'd14; + r14.write_en = 1'd1; + r14.in = a.read_data; + phi14.write_en = 1'd1; + phi14.in = phis.read_data; + preamble_14[done] = r14.done & phi14.done ? 1'd1; + } + group preamble_15 { + a.addr0 = 7'd15; + phis.addr0 = 7'd15; + r15.write_en = 1'd1; + r15.in = a.read_data; + phi15.write_en = 1'd1; + phi15.in = phis.read_data; + preamble_15[done] = r15.done & phi15.done ? 1'd1; + } + group preamble_16 { + a.addr0 = 7'd16; + phis.addr0 = 7'd16; + r16.write_en = 1'd1; + r16.in = a.read_data; + phi16.write_en = 1'd1; + phi16.in = phis.read_data; + preamble_16[done] = r16.done & phi16.done ? 1'd1; + } + group preamble_17 { + a.addr0 = 7'd17; + phis.addr0 = 7'd17; + r17.write_en = 1'd1; + r17.in = a.read_data; + phi17.write_en = 1'd1; + phi17.in = phis.read_data; + preamble_17[done] = r17.done & phi17.done ? 1'd1; + } + group preamble_18 { + a.addr0 = 7'd18; + phis.addr0 = 7'd18; + r18.write_en = 1'd1; + r18.in = a.read_data; + phi18.write_en = 1'd1; + phi18.in = phis.read_data; + preamble_18[done] = r18.done & phi18.done ? 1'd1; + } + group preamble_19 { + a.addr0 = 7'd19; + phis.addr0 = 7'd19; + r19.write_en = 1'd1; + r19.in = a.read_data; + phi19.write_en = 1'd1; + phi19.in = phis.read_data; + preamble_19[done] = r19.done & phi19.done ? 1'd1; + } + group preamble_20 { + a.addr0 = 7'd20; + phis.addr0 = 7'd20; + r20.write_en = 1'd1; + r20.in = a.read_data; + phi20.write_en = 1'd1; + phi20.in = phis.read_data; + preamble_20[done] = r20.done & phi20.done ? 1'd1; + } + group preamble_21 { + a.addr0 = 7'd21; + phis.addr0 = 7'd21; + r21.write_en = 1'd1; + r21.in = a.read_data; + phi21.write_en = 1'd1; + phi21.in = phis.read_data; + preamble_21[done] = r21.done & phi21.done ? 1'd1; + } + group preamble_22 { + a.addr0 = 7'd22; + phis.addr0 = 7'd22; + r22.write_en = 1'd1; + r22.in = a.read_data; + phi22.write_en = 1'd1; + phi22.in = phis.read_data; + preamble_22[done] = r22.done & phi22.done ? 1'd1; + } + group preamble_23 { + a.addr0 = 7'd23; + phis.addr0 = 7'd23; + r23.write_en = 1'd1; + r23.in = a.read_data; + phi23.write_en = 1'd1; + phi23.in = phis.read_data; + preamble_23[done] = r23.done & phi23.done ? 1'd1; + } + group preamble_24 { + a.addr0 = 7'd24; + phis.addr0 = 7'd24; + r24.write_en = 1'd1; + r24.in = a.read_data; + phi24.write_en = 1'd1; + phi24.in = phis.read_data; + preamble_24[done] = r24.done & phi24.done ? 1'd1; + } + group preamble_25 { + a.addr0 = 7'd25; + phis.addr0 = 7'd25; + r25.write_en = 1'd1; + r25.in = a.read_data; + phi25.write_en = 1'd1; + phi25.in = phis.read_data; + preamble_25[done] = r25.done & phi25.done ? 1'd1; + } + group preamble_26 { + a.addr0 = 7'd26; + phis.addr0 = 7'd26; + r26.write_en = 1'd1; + r26.in = a.read_data; + phi26.write_en = 1'd1; + phi26.in = phis.read_data; + preamble_26[done] = r26.done & phi26.done ? 1'd1; + } + group preamble_27 { + a.addr0 = 7'd27; + phis.addr0 = 7'd27; + r27.write_en = 1'd1; + r27.in = a.read_data; + phi27.write_en = 1'd1; + phi27.in = phis.read_data; + preamble_27[done] = r27.done & phi27.done ? 1'd1; + } + group preamble_28 { + a.addr0 = 7'd28; + phis.addr0 = 7'd28; + r28.write_en = 1'd1; + r28.in = a.read_data; + phi28.write_en = 1'd1; + phi28.in = phis.read_data; + preamble_28[done] = r28.done & phi28.done ? 1'd1; + } + group preamble_29 { + a.addr0 = 7'd29; + phis.addr0 = 7'd29; + r29.write_en = 1'd1; + r29.in = a.read_data; + phi29.write_en = 1'd1; + phi29.in = phis.read_data; + preamble_29[done] = r29.done & phi29.done ? 1'd1; + } + group preamble_30 { + a.addr0 = 7'd30; + phis.addr0 = 7'd30; + r30.write_en = 1'd1; + r30.in = a.read_data; + phi30.write_en = 1'd1; + phi30.in = phis.read_data; + preamble_30[done] = r30.done & phi30.done ? 1'd1; + } + group preamble_31 { + a.addr0 = 7'd31; + phis.addr0 = 7'd31; + r31.write_en = 1'd1; + r31.in = a.read_data; + phi31.write_en = 1'd1; + phi31.in = phis.read_data; + preamble_31[done] = r31.done & phi31.done ? 1'd1; + } + group preamble_32 { + a.addr0 = 7'd32; + phis.addr0 = 7'd32; + r32.write_en = 1'd1; + r32.in = a.read_data; + phi32.write_en = 1'd1; + phi32.in = phis.read_data; + preamble_32[done] = r32.done & phi32.done ? 1'd1; + } + group preamble_33 { + a.addr0 = 7'd33; + phis.addr0 = 7'd33; + r33.write_en = 1'd1; + r33.in = a.read_data; + phi33.write_en = 1'd1; + phi33.in = phis.read_data; + preamble_33[done] = r33.done & phi33.done ? 1'd1; + } + group preamble_34 { + a.addr0 = 7'd34; + phis.addr0 = 7'd34; + r34.write_en = 1'd1; + r34.in = a.read_data; + phi34.write_en = 1'd1; + phi34.in = phis.read_data; + preamble_34[done] = r34.done & phi34.done ? 1'd1; + } + group preamble_35 { + a.addr0 = 7'd35; + phis.addr0 = 7'd35; + r35.write_en = 1'd1; + r35.in = a.read_data; + phi35.write_en = 1'd1; + phi35.in = phis.read_data; + preamble_35[done] = r35.done & phi35.done ? 1'd1; + } + group preamble_36 { + a.addr0 = 7'd36; + phis.addr0 = 7'd36; + r36.write_en = 1'd1; + r36.in = a.read_data; + phi36.write_en = 1'd1; + phi36.in = phis.read_data; + preamble_36[done] = r36.done & phi36.done ? 1'd1; + } + group preamble_37 { + a.addr0 = 7'd37; + phis.addr0 = 7'd37; + r37.write_en = 1'd1; + r37.in = a.read_data; + phi37.write_en = 1'd1; + phi37.in = phis.read_data; + preamble_37[done] = r37.done & phi37.done ? 1'd1; + } + group preamble_38 { + a.addr0 = 7'd38; + phis.addr0 = 7'd38; + r38.write_en = 1'd1; + r38.in = a.read_data; + phi38.write_en = 1'd1; + phi38.in = phis.read_data; + preamble_38[done] = r38.done & phi38.done ? 1'd1; + } + group preamble_39 { + a.addr0 = 7'd39; + phis.addr0 = 7'd39; + r39.write_en = 1'd1; + r39.in = a.read_data; + phi39.write_en = 1'd1; + phi39.in = phis.read_data; + preamble_39[done] = r39.done & phi39.done ? 1'd1; + } + group preamble_40 { + a.addr0 = 7'd40; + phis.addr0 = 7'd40; + r40.write_en = 1'd1; + r40.in = a.read_data; + phi40.write_en = 1'd1; + phi40.in = phis.read_data; + preamble_40[done] = r40.done & phi40.done ? 1'd1; + } + group preamble_41 { + a.addr0 = 7'd41; + phis.addr0 = 7'd41; + r41.write_en = 1'd1; + r41.in = a.read_data; + phi41.write_en = 1'd1; + phi41.in = phis.read_data; + preamble_41[done] = r41.done & phi41.done ? 1'd1; + } + group preamble_42 { + a.addr0 = 7'd42; + phis.addr0 = 7'd42; + r42.write_en = 1'd1; + r42.in = a.read_data; + phi42.write_en = 1'd1; + phi42.in = phis.read_data; + preamble_42[done] = r42.done & phi42.done ? 1'd1; + } + group preamble_43 { + a.addr0 = 7'd43; + phis.addr0 = 7'd43; + r43.write_en = 1'd1; + r43.in = a.read_data; + phi43.write_en = 1'd1; + phi43.in = phis.read_data; + preamble_43[done] = r43.done & phi43.done ? 1'd1; + } + group preamble_44 { + a.addr0 = 7'd44; + phis.addr0 = 7'd44; + r44.write_en = 1'd1; + r44.in = a.read_data; + phi44.write_en = 1'd1; + phi44.in = phis.read_data; + preamble_44[done] = r44.done & phi44.done ? 1'd1; + } + group preamble_45 { + a.addr0 = 7'd45; + phis.addr0 = 7'd45; + r45.write_en = 1'd1; + r45.in = a.read_data; + phi45.write_en = 1'd1; + phi45.in = phis.read_data; + preamble_45[done] = r45.done & phi45.done ? 1'd1; + } + group preamble_46 { + a.addr0 = 7'd46; + phis.addr0 = 7'd46; + r46.write_en = 1'd1; + r46.in = a.read_data; + phi46.write_en = 1'd1; + phi46.in = phis.read_data; + preamble_46[done] = r46.done & phi46.done ? 1'd1; + } + group preamble_47 { + a.addr0 = 7'd47; + phis.addr0 = 7'd47; + r47.write_en = 1'd1; + r47.in = a.read_data; + phi47.write_en = 1'd1; + phi47.in = phis.read_data; + preamble_47[done] = r47.done & phi47.done ? 1'd1; + } + group preamble_48 { + a.addr0 = 7'd48; + phis.addr0 = 7'd48; + r48.write_en = 1'd1; + r48.in = a.read_data; + phi48.write_en = 1'd1; + phi48.in = phis.read_data; + preamble_48[done] = r48.done & phi48.done ? 1'd1; + } + group preamble_49 { + a.addr0 = 7'd49; + phis.addr0 = 7'd49; + r49.write_en = 1'd1; + r49.in = a.read_data; + phi49.write_en = 1'd1; + phi49.in = phis.read_data; + preamble_49[done] = r49.done & phi49.done ? 1'd1; + } + group preamble_50 { + a.addr0 = 7'd50; + phis.addr0 = 7'd50; + r50.write_en = 1'd1; + r50.in = a.read_data; + phi50.write_en = 1'd1; + phi50.in = phis.read_data; + preamble_50[done] = r50.done & phi50.done ? 1'd1; + } + group preamble_51 { + a.addr0 = 7'd51; + phis.addr0 = 7'd51; + r51.write_en = 1'd1; + r51.in = a.read_data; + phi51.write_en = 1'd1; + phi51.in = phis.read_data; + preamble_51[done] = r51.done & phi51.done ? 1'd1; + } + group preamble_52 { + a.addr0 = 7'd52; + phis.addr0 = 7'd52; + r52.write_en = 1'd1; + r52.in = a.read_data; + phi52.write_en = 1'd1; + phi52.in = phis.read_data; + preamble_52[done] = r52.done & phi52.done ? 1'd1; + } + group preamble_53 { + a.addr0 = 7'd53; + phis.addr0 = 7'd53; + r53.write_en = 1'd1; + r53.in = a.read_data; + phi53.write_en = 1'd1; + phi53.in = phis.read_data; + preamble_53[done] = r53.done & phi53.done ? 1'd1; + } + group preamble_54 { + a.addr0 = 7'd54; + phis.addr0 = 7'd54; + r54.write_en = 1'd1; + r54.in = a.read_data; + phi54.write_en = 1'd1; + phi54.in = phis.read_data; + preamble_54[done] = r54.done & phi54.done ? 1'd1; + } + group preamble_55 { + a.addr0 = 7'd55; + phis.addr0 = 7'd55; + r55.write_en = 1'd1; + r55.in = a.read_data; + phi55.write_en = 1'd1; + phi55.in = phis.read_data; + preamble_55[done] = r55.done & phi55.done ? 1'd1; + } + group preamble_56 { + a.addr0 = 7'd56; + phis.addr0 = 7'd56; + r56.write_en = 1'd1; + r56.in = a.read_data; + phi56.write_en = 1'd1; + phi56.in = phis.read_data; + preamble_56[done] = r56.done & phi56.done ? 1'd1; + } + group preamble_57 { + a.addr0 = 7'd57; + phis.addr0 = 7'd57; + r57.write_en = 1'd1; + r57.in = a.read_data; + phi57.write_en = 1'd1; + phi57.in = phis.read_data; + preamble_57[done] = r57.done & phi57.done ? 1'd1; + } + group preamble_58 { + a.addr0 = 7'd58; + phis.addr0 = 7'd58; + r58.write_en = 1'd1; + r58.in = a.read_data; + phi58.write_en = 1'd1; + phi58.in = phis.read_data; + preamble_58[done] = r58.done & phi58.done ? 1'd1; + } + group preamble_59 { + a.addr0 = 7'd59; + phis.addr0 = 7'd59; + r59.write_en = 1'd1; + r59.in = a.read_data; + phi59.write_en = 1'd1; + phi59.in = phis.read_data; + preamble_59[done] = r59.done & phi59.done ? 1'd1; + } + group preamble_60 { + a.addr0 = 7'd60; + phis.addr0 = 7'd60; + r60.write_en = 1'd1; + r60.in = a.read_data; + phi60.write_en = 1'd1; + phi60.in = phis.read_data; + preamble_60[done] = r60.done & phi60.done ? 1'd1; + } + group preamble_61 { + a.addr0 = 7'd61; + phis.addr0 = 7'd61; + r61.write_en = 1'd1; + r61.in = a.read_data; + phi61.write_en = 1'd1; + phi61.in = phis.read_data; + preamble_61[done] = r61.done & phi61.done ? 1'd1; + } + group preamble_62 { + a.addr0 = 7'd62; + phis.addr0 = 7'd62; + r62.write_en = 1'd1; + r62.in = a.read_data; + phi62.write_en = 1'd1; + phi62.in = phis.read_data; + preamble_62[done] = r62.done & phi62.done ? 1'd1; + } + group preamble_63 { + a.addr0 = 7'd63; + phis.addr0 = 7'd63; + r63.write_en = 1'd1; + r63.in = a.read_data; + phi63.write_en = 1'd1; + phi63.in = phis.read_data; + preamble_63[done] = r63.done & phi63.done ? 1'd1; + } + group precursor_0 { + r0.in = A0.out; + r0.write_en = 1'd1; + precursor_0[done] = r0.done; + } + group precursor_1 { + r1.in = A1.out; + r1.write_en = 1'd1; + precursor_1[done] = r1.done; + } + group precursor_2 { + r2.in = A2.out; + r2.write_en = 1'd1; + precursor_2[done] = r2.done; + } + group precursor_3 { + r3.in = A3.out; + r3.write_en = 1'd1; + precursor_3[done] = r3.done; + } + group precursor_4 { + r4.in = A4.out; + r4.write_en = 1'd1; + precursor_4[done] = r4.done; + } + group precursor_5 { + r5.in = A5.out; + r5.write_en = 1'd1; + precursor_5[done] = r5.done; + } + group precursor_6 { + r6.in = A6.out; + r6.write_en = 1'd1; + precursor_6[done] = r6.done; + } + group precursor_7 { + r7.in = A7.out; + r7.write_en = 1'd1; + precursor_7[done] = r7.done; + } + group precursor_8 { + r8.in = A8.out; + r8.write_en = 1'd1; + precursor_8[done] = r8.done; + } + group precursor_9 { + r9.in = A9.out; + r9.write_en = 1'd1; + precursor_9[done] = r9.done; + } + group precursor_10 { + r10.in = A10.out; + r10.write_en = 1'd1; + precursor_10[done] = r10.done; + } + group precursor_11 { + r11.in = A11.out; + r11.write_en = 1'd1; + precursor_11[done] = r11.done; + } + group precursor_12 { + r12.in = A12.out; + r12.write_en = 1'd1; + precursor_12[done] = r12.done; + } + group precursor_13 { + r13.in = A13.out; + r13.write_en = 1'd1; + precursor_13[done] = r13.done; + } + group precursor_14 { + r14.in = A14.out; + r14.write_en = 1'd1; + precursor_14[done] = r14.done; + } + group precursor_15 { + r15.in = A15.out; + r15.write_en = 1'd1; + precursor_15[done] = r15.done; + } + group precursor_16 { + r16.in = A16.out; + r16.write_en = 1'd1; + precursor_16[done] = r16.done; + } + group precursor_17 { + r17.in = A17.out; + r17.write_en = 1'd1; + precursor_17[done] = r17.done; + } + group precursor_18 { + r18.in = A18.out; + r18.write_en = 1'd1; + precursor_18[done] = r18.done; + } + group precursor_19 { + r19.in = A19.out; + r19.write_en = 1'd1; + precursor_19[done] = r19.done; + } + group precursor_20 { + r20.in = A20.out; + r20.write_en = 1'd1; + precursor_20[done] = r20.done; + } + group precursor_21 { + r21.in = A21.out; + r21.write_en = 1'd1; + precursor_21[done] = r21.done; + } + group precursor_22 { + r22.in = A22.out; + r22.write_en = 1'd1; + precursor_22[done] = r22.done; + } + group precursor_23 { + r23.in = A23.out; + r23.write_en = 1'd1; + precursor_23[done] = r23.done; + } + group precursor_24 { + r24.in = A24.out; + r24.write_en = 1'd1; + precursor_24[done] = r24.done; + } + group precursor_25 { + r25.in = A25.out; + r25.write_en = 1'd1; + precursor_25[done] = r25.done; + } + group precursor_26 { + r26.in = A26.out; + r26.write_en = 1'd1; + precursor_26[done] = r26.done; + } + group precursor_27 { + r27.in = A27.out; + r27.write_en = 1'd1; + precursor_27[done] = r27.done; + } + group precursor_28 { + r28.in = A28.out; + r28.write_en = 1'd1; + precursor_28[done] = r28.done; + } + group precursor_29 { + r29.in = A29.out; + r29.write_en = 1'd1; + precursor_29[done] = r29.done; + } + group precursor_30 { + r30.in = A30.out; + r30.write_en = 1'd1; + precursor_30[done] = r30.done; + } + group precursor_31 { + r31.in = A31.out; + r31.write_en = 1'd1; + precursor_31[done] = r31.done; + } + group precursor_32 { + r32.in = A32.out; + r32.write_en = 1'd1; + precursor_32[done] = r32.done; + } + group precursor_33 { + r33.in = A33.out; + r33.write_en = 1'd1; + precursor_33[done] = r33.done; + } + group precursor_34 { + r34.in = A34.out; + r34.write_en = 1'd1; + precursor_34[done] = r34.done; + } + group precursor_35 { + r35.in = A35.out; + r35.write_en = 1'd1; + precursor_35[done] = r35.done; + } + group precursor_36 { + r36.in = A36.out; + r36.write_en = 1'd1; + precursor_36[done] = r36.done; + } + group precursor_37 { + r37.in = A37.out; + r37.write_en = 1'd1; + precursor_37[done] = r37.done; + } + group precursor_38 { + r38.in = A38.out; + r38.write_en = 1'd1; + precursor_38[done] = r38.done; + } + group precursor_39 { + r39.in = A39.out; + r39.write_en = 1'd1; + precursor_39[done] = r39.done; + } + group precursor_40 { + r40.in = A40.out; + r40.write_en = 1'd1; + precursor_40[done] = r40.done; + } + group precursor_41 { + r41.in = A41.out; + r41.write_en = 1'd1; + precursor_41[done] = r41.done; + } + group precursor_42 { + r42.in = A42.out; + r42.write_en = 1'd1; + precursor_42[done] = r42.done; + } + group precursor_43 { + r43.in = A43.out; + r43.write_en = 1'd1; + precursor_43[done] = r43.done; + } + group precursor_44 { + r44.in = A44.out; + r44.write_en = 1'd1; + precursor_44[done] = r44.done; + } + group precursor_45 { + r45.in = A45.out; + r45.write_en = 1'd1; + precursor_45[done] = r45.done; + } + group precursor_46 { + r46.in = A46.out; + r46.write_en = 1'd1; + precursor_46[done] = r46.done; + } + group precursor_47 { + r47.in = A47.out; + r47.write_en = 1'd1; + precursor_47[done] = r47.done; + } + group precursor_48 { + r48.in = A48.out; + r48.write_en = 1'd1; + precursor_48[done] = r48.done; + } + group precursor_49 { + r49.in = A49.out; + r49.write_en = 1'd1; + precursor_49[done] = r49.done; + } + group precursor_50 { + r50.in = A50.out; + r50.write_en = 1'd1; + precursor_50[done] = r50.done; + } + group precursor_51 { + r51.in = A51.out; + r51.write_en = 1'd1; + precursor_51[done] = r51.done; + } + group precursor_52 { + r52.in = A52.out; + r52.write_en = 1'd1; + precursor_52[done] = r52.done; + } + group precursor_53 { + r53.in = A53.out; + r53.write_en = 1'd1; + precursor_53[done] = r53.done; + } + group precursor_54 { + r54.in = A54.out; + r54.write_en = 1'd1; + precursor_54[done] = r54.done; + } + group precursor_55 { + r55.in = A55.out; + r55.write_en = 1'd1; + precursor_55[done] = r55.done; + } + group precursor_56 { + r56.in = A56.out; + r56.write_en = 1'd1; + precursor_56[done] = r56.done; + } + group precursor_57 { + r57.in = A57.out; + r57.write_en = 1'd1; + precursor_57[done] = r57.done; + } + group precursor_58 { + r58.in = A58.out; + r58.write_en = 1'd1; + precursor_58[done] = r58.done; + } + group precursor_59 { + r59.in = A59.out; + r59.write_en = 1'd1; + precursor_59[done] = r59.done; + } + group precursor_60 { + r60.in = A60.out; + r60.write_en = 1'd1; + precursor_60[done] = r60.done; + } + group precursor_61 { + r61.in = A61.out; + r61.write_en = 1'd1; + precursor_61[done] = r61.done; + } + group precursor_62 { + r62.in = A62.out; + r62.write_en = 1'd1; + precursor_62[done] = r62.done; + } + group precursor_63 { + r63.in = A63.out; + r63.write_en = 1'd1; + precursor_63[done] = r63.done; + } + group s0_mul0 { + mult_pipe0.left = phi1.out; + mult_pipe0.right = r32.out; + mult_pipe0.go = 1'd1; + s0_mul0[done] = mult_pipe0.done; + } + group s0_mul1 { + mult_pipe1.left = phi1.out; + mult_pipe1.right = r33.out; + mult_pipe1.go = 1'd1; + s0_mul1[done] = mult_pipe1.done; + } + group s0_mul2 { + mult_pipe2.left = phi1.out; + mult_pipe2.right = r34.out; + mult_pipe2.go = 1'd1; + s0_mul2[done] = mult_pipe2.done; + } + group s0_mul3 { + mult_pipe3.left = phi1.out; + mult_pipe3.right = r35.out; + mult_pipe3.go = 1'd1; + s0_mul3[done] = mult_pipe3.done; + } + group s0_mul4 { + mult_pipe4.left = phi1.out; + mult_pipe4.right = r36.out; + mult_pipe4.go = 1'd1; + s0_mul4[done] = mult_pipe4.done; + } + group s0_mul5 { + mult_pipe5.left = phi1.out; + mult_pipe5.right = r37.out; + mult_pipe5.go = 1'd1; + s0_mul5[done] = mult_pipe5.done; + } + group s0_mul6 { + mult_pipe6.left = phi1.out; + mult_pipe6.right = r38.out; + mult_pipe6.go = 1'd1; + s0_mul6[done] = mult_pipe6.done; + } + group s0_mul7 { + mult_pipe7.left = phi1.out; + mult_pipe7.right = r39.out; + mult_pipe7.go = 1'd1; + s0_mul7[done] = mult_pipe7.done; + } + group s0_mul8 { + mult_pipe8.left = phi1.out; + mult_pipe8.right = r40.out; + mult_pipe8.go = 1'd1; + s0_mul8[done] = mult_pipe8.done; + } + group s0_mul9 { + mult_pipe9.left = phi1.out; + mult_pipe9.right = r41.out; + mult_pipe9.go = 1'd1; + s0_mul9[done] = mult_pipe9.done; + } + group s0_mul10 { + mult_pipe10.left = phi1.out; + mult_pipe10.right = r42.out; + mult_pipe10.go = 1'd1; + s0_mul10[done] = mult_pipe10.done; + } + group s0_mul11 { + mult_pipe11.left = phi1.out; + mult_pipe11.right = r43.out; + mult_pipe11.go = 1'd1; + s0_mul11[done] = mult_pipe11.done; + } + group s0_mul12 { + mult_pipe12.left = phi1.out; + mult_pipe12.right = r44.out; + mult_pipe12.go = 1'd1; + s0_mul12[done] = mult_pipe12.done; + } + group s0_mul13 { + mult_pipe13.left = phi1.out; + mult_pipe13.right = r45.out; + mult_pipe13.go = 1'd1; + s0_mul13[done] = mult_pipe13.done; + } + group s0_mul14 { + mult_pipe14.left = phi1.out; + mult_pipe14.right = r46.out; + mult_pipe14.go = 1'd1; + s0_mul14[done] = mult_pipe14.done; + } + group s0_mul15 { + mult_pipe15.left = phi1.out; + mult_pipe15.right = r47.out; + mult_pipe15.go = 1'd1; + s0_mul15[done] = mult_pipe15.done; + } + group s0_mul16 { + mult_pipe16.left = phi1.out; + mult_pipe16.right = r48.out; + mult_pipe16.go = 1'd1; + s0_mul16[done] = mult_pipe16.done; + } + group s0_mul17 { + mult_pipe17.left = phi1.out; + mult_pipe17.right = r49.out; + mult_pipe17.go = 1'd1; + s0_mul17[done] = mult_pipe17.done; + } + group s0_mul18 { + mult_pipe18.left = phi1.out; + mult_pipe18.right = r50.out; + mult_pipe18.go = 1'd1; + s0_mul18[done] = mult_pipe18.done; + } + group s0_mul19 { + mult_pipe19.left = phi1.out; + mult_pipe19.right = r51.out; + mult_pipe19.go = 1'd1; + s0_mul19[done] = mult_pipe19.done; + } + group s0_mul20 { + mult_pipe20.left = phi1.out; + mult_pipe20.right = r52.out; + mult_pipe20.go = 1'd1; + s0_mul20[done] = mult_pipe20.done; + } + group s0_mul21 { + mult_pipe21.left = phi1.out; + mult_pipe21.right = r53.out; + mult_pipe21.go = 1'd1; + s0_mul21[done] = mult_pipe21.done; + } + group s0_mul22 { + mult_pipe22.left = phi1.out; + mult_pipe22.right = r54.out; + mult_pipe22.go = 1'd1; + s0_mul22[done] = mult_pipe22.done; + } + group s0_mul23 { + mult_pipe23.left = phi1.out; + mult_pipe23.right = r55.out; + mult_pipe23.go = 1'd1; + s0_mul23[done] = mult_pipe23.done; + } + group s0_mul24 { + mult_pipe24.left = phi1.out; + mult_pipe24.right = r56.out; + mult_pipe24.go = 1'd1; + s0_mul24[done] = mult_pipe24.done; + } + group s0_mul25 { + mult_pipe25.left = phi1.out; + mult_pipe25.right = r57.out; + mult_pipe25.go = 1'd1; + s0_mul25[done] = mult_pipe25.done; + } + group s0_mul26 { + mult_pipe26.left = phi1.out; + mult_pipe26.right = r58.out; + mult_pipe26.go = 1'd1; + s0_mul26[done] = mult_pipe26.done; + } + group s0_mul27 { + mult_pipe27.left = phi1.out; + mult_pipe27.right = r59.out; + mult_pipe27.go = 1'd1; + s0_mul27[done] = mult_pipe27.done; + } + group s0_mul28 { + mult_pipe28.left = phi1.out; + mult_pipe28.right = r60.out; + mult_pipe28.go = 1'd1; + s0_mul28[done] = mult_pipe28.done; + } + group s0_mul29 { + mult_pipe29.left = phi1.out; + mult_pipe29.right = r61.out; + mult_pipe29.go = 1'd1; + s0_mul29[done] = mult_pipe29.done; + } + group s0_mul30 { + mult_pipe30.left = phi1.out; + mult_pipe30.right = r62.out; + mult_pipe30.go = 1'd1; + s0_mul30[done] = mult_pipe30.done; + } + group s0_mul31 { + mult_pipe31.left = phi1.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s0_mul31[done] = mult_pipe31.done; + } + group s1_mul0 { + mult_pipe0.left = phi2.out; + mult_pipe0.right = r16.out; + mult_pipe0.go = 1'd1; + s1_mul0[done] = mult_pipe0.done; + } + group s1_mul1 { + mult_pipe1.left = phi2.out; + mult_pipe1.right = r17.out; + mult_pipe1.go = 1'd1; + s1_mul1[done] = mult_pipe1.done; + } + group s1_mul2 { + mult_pipe2.left = phi2.out; + mult_pipe2.right = r18.out; + mult_pipe2.go = 1'd1; + s1_mul2[done] = mult_pipe2.done; + } + group s1_mul3 { + mult_pipe3.left = phi2.out; + mult_pipe3.right = r19.out; + mult_pipe3.go = 1'd1; + s1_mul3[done] = mult_pipe3.done; + } + group s1_mul4 { + mult_pipe4.left = phi2.out; + mult_pipe4.right = r20.out; + mult_pipe4.go = 1'd1; + s1_mul4[done] = mult_pipe4.done; + } + group s1_mul5 { + mult_pipe5.left = phi2.out; + mult_pipe5.right = r21.out; + mult_pipe5.go = 1'd1; + s1_mul5[done] = mult_pipe5.done; + } + group s1_mul6 { + mult_pipe6.left = phi2.out; + mult_pipe6.right = r22.out; + mult_pipe6.go = 1'd1; + s1_mul6[done] = mult_pipe6.done; + } + group s1_mul7 { + mult_pipe7.left = phi2.out; + mult_pipe7.right = r23.out; + mult_pipe7.go = 1'd1; + s1_mul7[done] = mult_pipe7.done; + } + group s1_mul8 { + mult_pipe8.left = phi2.out; + mult_pipe8.right = r24.out; + mult_pipe8.go = 1'd1; + s1_mul8[done] = mult_pipe8.done; + } + group s1_mul9 { + mult_pipe9.left = phi2.out; + mult_pipe9.right = r25.out; + mult_pipe9.go = 1'd1; + s1_mul9[done] = mult_pipe9.done; + } + group s1_mul10 { + mult_pipe10.left = phi2.out; + mult_pipe10.right = r26.out; + mult_pipe10.go = 1'd1; + s1_mul10[done] = mult_pipe10.done; + } + group s1_mul11 { + mult_pipe11.left = phi2.out; + mult_pipe11.right = r27.out; + mult_pipe11.go = 1'd1; + s1_mul11[done] = mult_pipe11.done; + } + group s1_mul12 { + mult_pipe12.left = phi2.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s1_mul12[done] = mult_pipe12.done; + } + group s1_mul13 { + mult_pipe13.left = phi2.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s1_mul13[done] = mult_pipe13.done; + } + group s1_mul14 { + mult_pipe14.left = phi2.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s1_mul14[done] = mult_pipe14.done; + } + group s1_mul15 { + mult_pipe15.left = phi2.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s1_mul15[done] = mult_pipe15.done; + } + group s1_mul16 { + mult_pipe16.left = phi3.out; + mult_pipe16.right = r48.out; + mult_pipe16.go = 1'd1; + s1_mul16[done] = mult_pipe16.done; + } + group s1_mul17 { + mult_pipe17.left = phi3.out; + mult_pipe17.right = r49.out; + mult_pipe17.go = 1'd1; + s1_mul17[done] = mult_pipe17.done; + } + group s1_mul18 { + mult_pipe18.left = phi3.out; + mult_pipe18.right = r50.out; + mult_pipe18.go = 1'd1; + s1_mul18[done] = mult_pipe18.done; + } + group s1_mul19 { + mult_pipe19.left = phi3.out; + mult_pipe19.right = r51.out; + mult_pipe19.go = 1'd1; + s1_mul19[done] = mult_pipe19.done; + } + group s1_mul20 { + mult_pipe20.left = phi3.out; + mult_pipe20.right = r52.out; + mult_pipe20.go = 1'd1; + s1_mul20[done] = mult_pipe20.done; + } + group s1_mul21 { + mult_pipe21.left = phi3.out; + mult_pipe21.right = r53.out; + mult_pipe21.go = 1'd1; + s1_mul21[done] = mult_pipe21.done; + } + group s1_mul22 { + mult_pipe22.left = phi3.out; + mult_pipe22.right = r54.out; + mult_pipe22.go = 1'd1; + s1_mul22[done] = mult_pipe22.done; + } + group s1_mul23 { + mult_pipe23.left = phi3.out; + mult_pipe23.right = r55.out; + mult_pipe23.go = 1'd1; + s1_mul23[done] = mult_pipe23.done; + } + group s1_mul24 { + mult_pipe24.left = phi3.out; + mult_pipe24.right = r56.out; + mult_pipe24.go = 1'd1; + s1_mul24[done] = mult_pipe24.done; + } + group s1_mul25 { + mult_pipe25.left = phi3.out; + mult_pipe25.right = r57.out; + mult_pipe25.go = 1'd1; + s1_mul25[done] = mult_pipe25.done; + } + group s1_mul26 { + mult_pipe26.left = phi3.out; + mult_pipe26.right = r58.out; + mult_pipe26.go = 1'd1; + s1_mul26[done] = mult_pipe26.done; + } + group s1_mul27 { + mult_pipe27.left = phi3.out; + mult_pipe27.right = r59.out; + mult_pipe27.go = 1'd1; + s1_mul27[done] = mult_pipe27.done; + } + group s1_mul28 { + mult_pipe28.left = phi3.out; + mult_pipe28.right = r60.out; + mult_pipe28.go = 1'd1; + s1_mul28[done] = mult_pipe28.done; + } + group s1_mul29 { + mult_pipe29.left = phi3.out; + mult_pipe29.right = r61.out; + mult_pipe29.go = 1'd1; + s1_mul29[done] = mult_pipe29.done; + } + group s1_mul30 { + mult_pipe30.left = phi3.out; + mult_pipe30.right = r62.out; + mult_pipe30.go = 1'd1; + s1_mul30[done] = mult_pipe30.done; + } + group s1_mul31 { + mult_pipe31.left = phi3.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s1_mul31[done] = mult_pipe31.done; + } + group s2_mul0 { + mult_pipe0.left = phi4.out; + mult_pipe0.right = r8.out; + mult_pipe0.go = 1'd1; + s2_mul0[done] = mult_pipe0.done; + } + group s2_mul1 { + mult_pipe1.left = phi4.out; + mult_pipe1.right = r9.out; + mult_pipe1.go = 1'd1; + s2_mul1[done] = mult_pipe1.done; + } + group s2_mul2 { + mult_pipe2.left = phi4.out; + mult_pipe2.right = r10.out; + mult_pipe2.go = 1'd1; + s2_mul2[done] = mult_pipe2.done; + } + group s2_mul3 { + mult_pipe3.left = phi4.out; + mult_pipe3.right = r11.out; + mult_pipe3.go = 1'd1; + s2_mul3[done] = mult_pipe3.done; + } + group s2_mul4 { + mult_pipe4.left = phi4.out; + mult_pipe4.right = r12.out; + mult_pipe4.go = 1'd1; + s2_mul4[done] = mult_pipe4.done; + } + group s2_mul5 { + mult_pipe5.left = phi4.out; + mult_pipe5.right = r13.out; + mult_pipe5.go = 1'd1; + s2_mul5[done] = mult_pipe5.done; + } + group s2_mul6 { + mult_pipe6.left = phi4.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s2_mul6[done] = mult_pipe6.done; + } + group s2_mul7 { + mult_pipe7.left = phi4.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s2_mul7[done] = mult_pipe7.done; + } + group s2_mul8 { + mult_pipe8.left = phi5.out; + mult_pipe8.right = r24.out; + mult_pipe8.go = 1'd1; + s2_mul8[done] = mult_pipe8.done; + } + group s2_mul9 { + mult_pipe9.left = phi5.out; + mult_pipe9.right = r25.out; + mult_pipe9.go = 1'd1; + s2_mul9[done] = mult_pipe9.done; + } + group s2_mul10 { + mult_pipe10.left = phi5.out; + mult_pipe10.right = r26.out; + mult_pipe10.go = 1'd1; + s2_mul10[done] = mult_pipe10.done; + } + group s2_mul11 { + mult_pipe11.left = phi5.out; + mult_pipe11.right = r27.out; + mult_pipe11.go = 1'd1; + s2_mul11[done] = mult_pipe11.done; + } + group s2_mul12 { + mult_pipe12.left = phi5.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s2_mul12[done] = mult_pipe12.done; + } + group s2_mul13 { + mult_pipe13.left = phi5.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s2_mul13[done] = mult_pipe13.done; + } + group s2_mul14 { + mult_pipe14.left = phi5.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s2_mul14[done] = mult_pipe14.done; + } + group s2_mul15 { + mult_pipe15.left = phi5.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s2_mul15[done] = mult_pipe15.done; + } + group s2_mul16 { + mult_pipe16.left = phi6.out; + mult_pipe16.right = r40.out; + mult_pipe16.go = 1'd1; + s2_mul16[done] = mult_pipe16.done; + } + group s2_mul17 { + mult_pipe17.left = phi6.out; + mult_pipe17.right = r41.out; + mult_pipe17.go = 1'd1; + s2_mul17[done] = mult_pipe17.done; + } + group s2_mul18 { + mult_pipe18.left = phi6.out; + mult_pipe18.right = r42.out; + mult_pipe18.go = 1'd1; + s2_mul18[done] = mult_pipe18.done; + } + group s2_mul19 { + mult_pipe19.left = phi6.out; + mult_pipe19.right = r43.out; + mult_pipe19.go = 1'd1; + s2_mul19[done] = mult_pipe19.done; + } + group s2_mul20 { + mult_pipe20.left = phi6.out; + mult_pipe20.right = r44.out; + mult_pipe20.go = 1'd1; + s2_mul20[done] = mult_pipe20.done; + } + group s2_mul21 { + mult_pipe21.left = phi6.out; + mult_pipe21.right = r45.out; + mult_pipe21.go = 1'd1; + s2_mul21[done] = mult_pipe21.done; + } + group s2_mul22 { + mult_pipe22.left = phi6.out; + mult_pipe22.right = r46.out; + mult_pipe22.go = 1'd1; + s2_mul22[done] = mult_pipe22.done; + } + group s2_mul23 { + mult_pipe23.left = phi6.out; + mult_pipe23.right = r47.out; + mult_pipe23.go = 1'd1; + s2_mul23[done] = mult_pipe23.done; + } + group s2_mul24 { + mult_pipe24.left = phi7.out; + mult_pipe24.right = r56.out; + mult_pipe24.go = 1'd1; + s2_mul24[done] = mult_pipe24.done; + } + group s2_mul25 { + mult_pipe25.left = phi7.out; + mult_pipe25.right = r57.out; + mult_pipe25.go = 1'd1; + s2_mul25[done] = mult_pipe25.done; + } + group s2_mul26 { + mult_pipe26.left = phi7.out; + mult_pipe26.right = r58.out; + mult_pipe26.go = 1'd1; + s2_mul26[done] = mult_pipe26.done; + } + group s2_mul27 { + mult_pipe27.left = phi7.out; + mult_pipe27.right = r59.out; + mult_pipe27.go = 1'd1; + s2_mul27[done] = mult_pipe27.done; + } + group s2_mul28 { + mult_pipe28.left = phi7.out; + mult_pipe28.right = r60.out; + mult_pipe28.go = 1'd1; + s2_mul28[done] = mult_pipe28.done; + } + group s2_mul29 { + mult_pipe29.left = phi7.out; + mult_pipe29.right = r61.out; + mult_pipe29.go = 1'd1; + s2_mul29[done] = mult_pipe29.done; + } + group s2_mul30 { + mult_pipe30.left = phi7.out; + mult_pipe30.right = r62.out; + mult_pipe30.go = 1'd1; + s2_mul30[done] = mult_pipe30.done; + } + group s2_mul31 { + mult_pipe31.left = phi7.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s2_mul31[done] = mult_pipe31.done; + } + group s3_mul0 { + mult_pipe0.left = phi8.out; + mult_pipe0.right = r4.out; + mult_pipe0.go = 1'd1; + s3_mul0[done] = mult_pipe0.done; + } + group s3_mul1 { + mult_pipe1.left = phi8.out; + mult_pipe1.right = r5.out; + mult_pipe1.go = 1'd1; + s3_mul1[done] = mult_pipe1.done; + } + group s3_mul2 { + mult_pipe2.left = phi8.out; + mult_pipe2.right = r6.out; + mult_pipe2.go = 1'd1; + s3_mul2[done] = mult_pipe2.done; + } + group s3_mul3 { + mult_pipe3.left = phi8.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s3_mul3[done] = mult_pipe3.done; + } + group s3_mul4 { + mult_pipe4.left = phi9.out; + mult_pipe4.right = r12.out; + mult_pipe4.go = 1'd1; + s3_mul4[done] = mult_pipe4.done; + } + group s3_mul5 { + mult_pipe5.left = phi9.out; + mult_pipe5.right = r13.out; + mult_pipe5.go = 1'd1; + s3_mul5[done] = mult_pipe5.done; + } + group s3_mul6 { + mult_pipe6.left = phi9.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s3_mul6[done] = mult_pipe6.done; + } + group s3_mul7 { + mult_pipe7.left = phi9.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s3_mul7[done] = mult_pipe7.done; + } + group s3_mul8 { + mult_pipe8.left = phi10.out; + mult_pipe8.right = r20.out; + mult_pipe8.go = 1'd1; + s3_mul8[done] = mult_pipe8.done; + } + group s3_mul9 { + mult_pipe9.left = phi10.out; + mult_pipe9.right = r21.out; + mult_pipe9.go = 1'd1; + s3_mul9[done] = mult_pipe9.done; + } + group s3_mul10 { + mult_pipe10.left = phi10.out; + mult_pipe10.right = r22.out; + mult_pipe10.go = 1'd1; + s3_mul10[done] = mult_pipe10.done; + } + group s3_mul11 { + mult_pipe11.left = phi10.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s3_mul11[done] = mult_pipe11.done; + } + group s3_mul12 { + mult_pipe12.left = phi11.out; + mult_pipe12.right = r28.out; + mult_pipe12.go = 1'd1; + s3_mul12[done] = mult_pipe12.done; + } + group s3_mul13 { + mult_pipe13.left = phi11.out; + mult_pipe13.right = r29.out; + mult_pipe13.go = 1'd1; + s3_mul13[done] = mult_pipe13.done; + } + group s3_mul14 { + mult_pipe14.left = phi11.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s3_mul14[done] = mult_pipe14.done; + } + group s3_mul15 { + mult_pipe15.left = phi11.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s3_mul15[done] = mult_pipe15.done; + } + group s3_mul16 { + mult_pipe16.left = phi12.out; + mult_pipe16.right = r36.out; + mult_pipe16.go = 1'd1; + s3_mul16[done] = mult_pipe16.done; + } + group s3_mul17 { + mult_pipe17.left = phi12.out; + mult_pipe17.right = r37.out; + mult_pipe17.go = 1'd1; + s3_mul17[done] = mult_pipe17.done; + } + group s3_mul18 { + mult_pipe18.left = phi12.out; + mult_pipe18.right = r38.out; + mult_pipe18.go = 1'd1; + s3_mul18[done] = mult_pipe18.done; + } + group s3_mul19 { + mult_pipe19.left = phi12.out; + mult_pipe19.right = r39.out; + mult_pipe19.go = 1'd1; + s3_mul19[done] = mult_pipe19.done; + } + group s3_mul20 { + mult_pipe20.left = phi13.out; + mult_pipe20.right = r44.out; + mult_pipe20.go = 1'd1; + s3_mul20[done] = mult_pipe20.done; + } + group s3_mul21 { + mult_pipe21.left = phi13.out; + mult_pipe21.right = r45.out; + mult_pipe21.go = 1'd1; + s3_mul21[done] = mult_pipe21.done; + } + group s3_mul22 { + mult_pipe22.left = phi13.out; + mult_pipe22.right = r46.out; + mult_pipe22.go = 1'd1; + s3_mul22[done] = mult_pipe22.done; + } + group s3_mul23 { + mult_pipe23.left = phi13.out; + mult_pipe23.right = r47.out; + mult_pipe23.go = 1'd1; + s3_mul23[done] = mult_pipe23.done; + } + group s3_mul24 { + mult_pipe24.left = phi14.out; + mult_pipe24.right = r52.out; + mult_pipe24.go = 1'd1; + s3_mul24[done] = mult_pipe24.done; + } + group s3_mul25 { + mult_pipe25.left = phi14.out; + mult_pipe25.right = r53.out; + mult_pipe25.go = 1'd1; + s3_mul25[done] = mult_pipe25.done; + } + group s3_mul26 { + mult_pipe26.left = phi14.out; + mult_pipe26.right = r54.out; + mult_pipe26.go = 1'd1; + s3_mul26[done] = mult_pipe26.done; + } + group s3_mul27 { + mult_pipe27.left = phi14.out; + mult_pipe27.right = r55.out; + mult_pipe27.go = 1'd1; + s3_mul27[done] = mult_pipe27.done; + } + group s3_mul28 { + mult_pipe28.left = phi15.out; + mult_pipe28.right = r60.out; + mult_pipe28.go = 1'd1; + s3_mul28[done] = mult_pipe28.done; + } + group s3_mul29 { + mult_pipe29.left = phi15.out; + mult_pipe29.right = r61.out; + mult_pipe29.go = 1'd1; + s3_mul29[done] = mult_pipe29.done; + } + group s3_mul30 { + mult_pipe30.left = phi15.out; + mult_pipe30.right = r62.out; + mult_pipe30.go = 1'd1; + s3_mul30[done] = mult_pipe30.done; + } + group s3_mul31 { + mult_pipe31.left = phi15.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s3_mul31[done] = mult_pipe31.done; + } + group s4_mul0 { + mult_pipe0.left = phi16.out; + mult_pipe0.right = r2.out; + mult_pipe0.go = 1'd1; + s4_mul0[done] = mult_pipe0.done; + } + group s4_mul1 { + mult_pipe1.left = phi16.out; + mult_pipe1.right = r3.out; + mult_pipe1.go = 1'd1; + s4_mul1[done] = mult_pipe1.done; + } + group s4_mul2 { + mult_pipe2.left = phi17.out; + mult_pipe2.right = r6.out; + mult_pipe2.go = 1'd1; + s4_mul2[done] = mult_pipe2.done; + } + group s4_mul3 { + mult_pipe3.left = phi17.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s4_mul3[done] = mult_pipe3.done; + } + group s4_mul4 { + mult_pipe4.left = phi18.out; + mult_pipe4.right = r10.out; + mult_pipe4.go = 1'd1; + s4_mul4[done] = mult_pipe4.done; + } + group s4_mul5 { + mult_pipe5.left = phi18.out; + mult_pipe5.right = r11.out; + mult_pipe5.go = 1'd1; + s4_mul5[done] = mult_pipe5.done; + } + group s4_mul6 { + mult_pipe6.left = phi19.out; + mult_pipe6.right = r14.out; + mult_pipe6.go = 1'd1; + s4_mul6[done] = mult_pipe6.done; + } + group s4_mul7 { + mult_pipe7.left = phi19.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s4_mul7[done] = mult_pipe7.done; + } + group s4_mul8 { + mult_pipe8.left = phi20.out; + mult_pipe8.right = r18.out; + mult_pipe8.go = 1'd1; + s4_mul8[done] = mult_pipe8.done; + } + group s4_mul9 { + mult_pipe9.left = phi20.out; + mult_pipe9.right = r19.out; + mult_pipe9.go = 1'd1; + s4_mul9[done] = mult_pipe9.done; + } + group s4_mul10 { + mult_pipe10.left = phi21.out; + mult_pipe10.right = r22.out; + mult_pipe10.go = 1'd1; + s4_mul10[done] = mult_pipe10.done; + } + group s4_mul11 { + mult_pipe11.left = phi21.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s4_mul11[done] = mult_pipe11.done; + } + group s4_mul12 { + mult_pipe12.left = phi22.out; + mult_pipe12.right = r26.out; + mult_pipe12.go = 1'd1; + s4_mul12[done] = mult_pipe12.done; + } + group s4_mul13 { + mult_pipe13.left = phi22.out; + mult_pipe13.right = r27.out; + mult_pipe13.go = 1'd1; + s4_mul13[done] = mult_pipe13.done; + } + group s4_mul14 { + mult_pipe14.left = phi23.out; + mult_pipe14.right = r30.out; + mult_pipe14.go = 1'd1; + s4_mul14[done] = mult_pipe14.done; + } + group s4_mul15 { + mult_pipe15.left = phi23.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s4_mul15[done] = mult_pipe15.done; + } + group s4_mul16 { + mult_pipe16.left = phi24.out; + mult_pipe16.right = r34.out; + mult_pipe16.go = 1'd1; + s4_mul16[done] = mult_pipe16.done; + } + group s4_mul17 { + mult_pipe17.left = phi24.out; + mult_pipe17.right = r35.out; + mult_pipe17.go = 1'd1; + s4_mul17[done] = mult_pipe17.done; + } + group s4_mul18 { + mult_pipe18.left = phi25.out; + mult_pipe18.right = r38.out; + mult_pipe18.go = 1'd1; + s4_mul18[done] = mult_pipe18.done; + } + group s4_mul19 { + mult_pipe19.left = phi25.out; + mult_pipe19.right = r39.out; + mult_pipe19.go = 1'd1; + s4_mul19[done] = mult_pipe19.done; + } + group s4_mul20 { + mult_pipe20.left = phi26.out; + mult_pipe20.right = r42.out; + mult_pipe20.go = 1'd1; + s4_mul20[done] = mult_pipe20.done; + } + group s4_mul21 { + mult_pipe21.left = phi26.out; + mult_pipe21.right = r43.out; + mult_pipe21.go = 1'd1; + s4_mul21[done] = mult_pipe21.done; + } + group s4_mul22 { + mult_pipe22.left = phi27.out; + mult_pipe22.right = r46.out; + mult_pipe22.go = 1'd1; + s4_mul22[done] = mult_pipe22.done; + } + group s4_mul23 { + mult_pipe23.left = phi27.out; + mult_pipe23.right = r47.out; + mult_pipe23.go = 1'd1; + s4_mul23[done] = mult_pipe23.done; + } + group s4_mul24 { + mult_pipe24.left = phi28.out; + mult_pipe24.right = r50.out; + mult_pipe24.go = 1'd1; + s4_mul24[done] = mult_pipe24.done; + } + group s4_mul25 { + mult_pipe25.left = phi28.out; + mult_pipe25.right = r51.out; + mult_pipe25.go = 1'd1; + s4_mul25[done] = mult_pipe25.done; + } + group s4_mul26 { + mult_pipe26.left = phi29.out; + mult_pipe26.right = r54.out; + mult_pipe26.go = 1'd1; + s4_mul26[done] = mult_pipe26.done; + } + group s4_mul27 { + mult_pipe27.left = phi29.out; + mult_pipe27.right = r55.out; + mult_pipe27.go = 1'd1; + s4_mul27[done] = mult_pipe27.done; + } + group s4_mul28 { + mult_pipe28.left = phi30.out; + mult_pipe28.right = r58.out; + mult_pipe28.go = 1'd1; + s4_mul28[done] = mult_pipe28.done; + } + group s4_mul29 { + mult_pipe29.left = phi30.out; + mult_pipe29.right = r59.out; + mult_pipe29.go = 1'd1; + s4_mul29[done] = mult_pipe29.done; + } + group s4_mul30 { + mult_pipe30.left = phi31.out; + mult_pipe30.right = r62.out; + mult_pipe30.go = 1'd1; + s4_mul30[done] = mult_pipe30.done; + } + group s4_mul31 { + mult_pipe31.left = phi31.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s4_mul31[done] = mult_pipe31.done; + } + group s5_mul0 { + mult_pipe0.left = phi32.out; + mult_pipe0.right = r1.out; + mult_pipe0.go = 1'd1; + s5_mul0[done] = mult_pipe0.done; + } + group s5_mul1 { + mult_pipe1.left = phi33.out; + mult_pipe1.right = r3.out; + mult_pipe1.go = 1'd1; + s5_mul1[done] = mult_pipe1.done; + } + group s5_mul2 { + mult_pipe2.left = phi34.out; + mult_pipe2.right = r5.out; + mult_pipe2.go = 1'd1; + s5_mul2[done] = mult_pipe2.done; + } + group s5_mul3 { + mult_pipe3.left = phi35.out; + mult_pipe3.right = r7.out; + mult_pipe3.go = 1'd1; + s5_mul3[done] = mult_pipe3.done; + } + group s5_mul4 { + mult_pipe4.left = phi36.out; + mult_pipe4.right = r9.out; + mult_pipe4.go = 1'd1; + s5_mul4[done] = mult_pipe4.done; + } + group s5_mul5 { + mult_pipe5.left = phi37.out; + mult_pipe5.right = r11.out; + mult_pipe5.go = 1'd1; + s5_mul5[done] = mult_pipe5.done; + } + group s5_mul6 { + mult_pipe6.left = phi38.out; + mult_pipe6.right = r13.out; + mult_pipe6.go = 1'd1; + s5_mul6[done] = mult_pipe6.done; + } + group s5_mul7 { + mult_pipe7.left = phi39.out; + mult_pipe7.right = r15.out; + mult_pipe7.go = 1'd1; + s5_mul7[done] = mult_pipe7.done; + } + group s5_mul8 { + mult_pipe8.left = phi40.out; + mult_pipe8.right = r17.out; + mult_pipe8.go = 1'd1; + s5_mul8[done] = mult_pipe8.done; + } + group s5_mul9 { + mult_pipe9.left = phi41.out; + mult_pipe9.right = r19.out; + mult_pipe9.go = 1'd1; + s5_mul9[done] = mult_pipe9.done; + } + group s5_mul10 { + mult_pipe10.left = phi42.out; + mult_pipe10.right = r21.out; + mult_pipe10.go = 1'd1; + s5_mul10[done] = mult_pipe10.done; + } + group s5_mul11 { + mult_pipe11.left = phi43.out; + mult_pipe11.right = r23.out; + mult_pipe11.go = 1'd1; + s5_mul11[done] = mult_pipe11.done; + } + group s5_mul12 { + mult_pipe12.left = phi44.out; + mult_pipe12.right = r25.out; + mult_pipe12.go = 1'd1; + s5_mul12[done] = mult_pipe12.done; + } + group s5_mul13 { + mult_pipe13.left = phi45.out; + mult_pipe13.right = r27.out; + mult_pipe13.go = 1'd1; + s5_mul13[done] = mult_pipe13.done; + } + group s5_mul14 { + mult_pipe14.left = phi46.out; + mult_pipe14.right = r29.out; + mult_pipe14.go = 1'd1; + s5_mul14[done] = mult_pipe14.done; + } + group s5_mul15 { + mult_pipe15.left = phi47.out; + mult_pipe15.right = r31.out; + mult_pipe15.go = 1'd1; + s5_mul15[done] = mult_pipe15.done; + } + group s5_mul16 { + mult_pipe16.left = phi48.out; + mult_pipe16.right = r33.out; + mult_pipe16.go = 1'd1; + s5_mul16[done] = mult_pipe16.done; + } + group s5_mul17 { + mult_pipe17.left = phi49.out; + mult_pipe17.right = r35.out; + mult_pipe17.go = 1'd1; + s5_mul17[done] = mult_pipe17.done; + } + group s5_mul18 { + mult_pipe18.left = phi50.out; + mult_pipe18.right = r37.out; + mult_pipe18.go = 1'd1; + s5_mul18[done] = mult_pipe18.done; + } + group s5_mul19 { + mult_pipe19.left = phi51.out; + mult_pipe19.right = r39.out; + mult_pipe19.go = 1'd1; + s5_mul19[done] = mult_pipe19.done; + } + group s5_mul20 { + mult_pipe20.left = phi52.out; + mult_pipe20.right = r41.out; + mult_pipe20.go = 1'd1; + s5_mul20[done] = mult_pipe20.done; + } + group s5_mul21 { + mult_pipe21.left = phi53.out; + mult_pipe21.right = r43.out; + mult_pipe21.go = 1'd1; + s5_mul21[done] = mult_pipe21.done; + } + group s5_mul22 { + mult_pipe22.left = phi54.out; + mult_pipe22.right = r45.out; + mult_pipe22.go = 1'd1; + s5_mul22[done] = mult_pipe22.done; + } + group s5_mul23 { + mult_pipe23.left = phi55.out; + mult_pipe23.right = r47.out; + mult_pipe23.go = 1'd1; + s5_mul23[done] = mult_pipe23.done; + } + group s5_mul24 { + mult_pipe24.left = phi56.out; + mult_pipe24.right = r49.out; + mult_pipe24.go = 1'd1; + s5_mul24[done] = mult_pipe24.done; + } + group s5_mul25 { + mult_pipe25.left = phi57.out; + mult_pipe25.right = r51.out; + mult_pipe25.go = 1'd1; + s5_mul25[done] = mult_pipe25.done; + } + group s5_mul26 { + mult_pipe26.left = phi58.out; + mult_pipe26.right = r53.out; + mult_pipe26.go = 1'd1; + s5_mul26[done] = mult_pipe26.done; + } + group s5_mul27 { + mult_pipe27.left = phi59.out; + mult_pipe27.right = r55.out; + mult_pipe27.go = 1'd1; + s5_mul27[done] = mult_pipe27.done; + } + group s5_mul28 { + mult_pipe28.left = phi60.out; + mult_pipe28.right = r57.out; + mult_pipe28.go = 1'd1; + s5_mul28[done] = mult_pipe28.done; + } + group s5_mul29 { + mult_pipe29.left = phi61.out; + mult_pipe29.right = r59.out; + mult_pipe29.go = 1'd1; + s5_mul29[done] = mult_pipe29.done; + } + group s5_mul30 { + mult_pipe30.left = phi62.out; + mult_pipe30.right = r61.out; + mult_pipe30.go = 1'd1; + s5_mul30[done] = mult_pipe30.done; + } + group s5_mul31 { + mult_pipe31.left = phi63.out; + mult_pipe31.right = r63.out; + mult_pipe31.go = 1'd1; + s5_mul31[done] = mult_pipe31.done; + } + group s0_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s0_r0_op_mod[done] = A0.done; + } + group s0_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s0_r1_op_mod[done] = A1.done; + } + group s0_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s0_r2_op_mod[done] = A2.done; + } + group s0_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s0_r3_op_mod[done] = A3.done; + } + group s0_r4_op_mod { + add4.left = r4.out; + add4.right = mult_pipe4.out; + mod_pipe4.left = add4.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s0_r4_op_mod[done] = A4.done; + } + group s0_r5_op_mod { + add5.left = r5.out; + add5.right = mult_pipe5.out; + mod_pipe5.left = add5.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s0_r5_op_mod[done] = A5.done; + } + group s0_r6_op_mod { + add6.left = r6.out; + add6.right = mult_pipe6.out; + mod_pipe6.left = add6.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s0_r6_op_mod[done] = A6.done; + } + group s0_r7_op_mod { + add7.left = r7.out; + add7.right = mult_pipe7.out; + mod_pipe7.left = add7.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s0_r7_op_mod[done] = A7.done; + } + group s0_r8_op_mod { + add8.left = r8.out; + add8.right = mult_pipe8.out; + mod_pipe8.left = add8.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s0_r8_op_mod[done] = A8.done; + } + group s0_r9_op_mod { + add9.left = r9.out; + add9.right = mult_pipe9.out; + mod_pipe9.left = add9.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s0_r9_op_mod[done] = A9.done; + } + group s0_r10_op_mod { + add10.left = r10.out; + add10.right = mult_pipe10.out; + mod_pipe10.left = add10.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s0_r10_op_mod[done] = A10.done; + } + group s0_r11_op_mod { + add11.left = r11.out; + add11.right = mult_pipe11.out; + mod_pipe11.left = add11.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s0_r11_op_mod[done] = A11.done; + } + group s0_r12_op_mod { + add12.left = r12.out; + add12.right = mult_pipe12.out; + mod_pipe12.left = add12.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s0_r12_op_mod[done] = A12.done; + } + group s0_r13_op_mod { + add13.left = r13.out; + add13.right = mult_pipe13.out; + mod_pipe13.left = add13.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s0_r13_op_mod[done] = A13.done; + } + group s0_r14_op_mod { + add14.left = r14.out; + add14.right = mult_pipe14.out; + mod_pipe14.left = add14.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s0_r14_op_mod[done] = A14.done; + } + group s0_r15_op_mod { + add15.left = r15.out; + add15.right = mult_pipe15.out; + mod_pipe15.left = add15.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s0_r15_op_mod[done] = A15.done; + } + group s0_r16_op_mod { + add16.left = r16.out; + add16.right = mult_pipe16.out; + mod_pipe16.left = add16.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s0_r16_op_mod[done] = A16.done; + } + group s0_r17_op_mod { + add17.left = r17.out; + add17.right = mult_pipe17.out; + mod_pipe17.left = add17.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s0_r17_op_mod[done] = A17.done; + } + group s0_r18_op_mod { + add18.left = r18.out; + add18.right = mult_pipe18.out; + mod_pipe18.left = add18.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s0_r18_op_mod[done] = A18.done; + } + group s0_r19_op_mod { + add19.left = r19.out; + add19.right = mult_pipe19.out; + mod_pipe19.left = add19.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s0_r19_op_mod[done] = A19.done; + } + group s0_r20_op_mod { + add20.left = r20.out; + add20.right = mult_pipe20.out; + mod_pipe20.left = add20.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s0_r20_op_mod[done] = A20.done; + } + group s0_r21_op_mod { + add21.left = r21.out; + add21.right = mult_pipe21.out; + mod_pipe21.left = add21.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s0_r21_op_mod[done] = A21.done; + } + group s0_r22_op_mod { + add22.left = r22.out; + add22.right = mult_pipe22.out; + mod_pipe22.left = add22.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s0_r22_op_mod[done] = A22.done; + } + group s0_r23_op_mod { + add23.left = r23.out; + add23.right = mult_pipe23.out; + mod_pipe23.left = add23.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s0_r23_op_mod[done] = A23.done; + } + group s0_r24_op_mod { + add24.left = r24.out; + add24.right = mult_pipe24.out; + mod_pipe24.left = add24.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s0_r24_op_mod[done] = A24.done; + } + group s0_r25_op_mod { + add25.left = r25.out; + add25.right = mult_pipe25.out; + mod_pipe25.left = add25.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s0_r25_op_mod[done] = A25.done; + } + group s0_r26_op_mod { + add26.left = r26.out; + add26.right = mult_pipe26.out; + mod_pipe26.left = add26.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s0_r26_op_mod[done] = A26.done; + } + group s0_r27_op_mod { + add27.left = r27.out; + add27.right = mult_pipe27.out; + mod_pipe27.left = add27.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s0_r27_op_mod[done] = A27.done; + } + group s0_r28_op_mod { + add28.left = r28.out; + add28.right = mult_pipe28.out; + mod_pipe28.left = add28.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s0_r28_op_mod[done] = A28.done; + } + group s0_r29_op_mod { + add29.left = r29.out; + add29.right = mult_pipe29.out; + mod_pipe29.left = add29.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s0_r29_op_mod[done] = A29.done; + } + group s0_r30_op_mod { + add30.left = r30.out; + add30.right = mult_pipe30.out; + mod_pipe30.left = add30.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s0_r30_op_mod[done] = A30.done; + } + group s0_r31_op_mod { + add31.left = r31.out; + add31.right = mult_pipe31.out; + mod_pipe31.left = add31.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s0_r31_op_mod[done] = A31.done; + } + group s0_r32_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe32.left = sub0.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s0_r32_op_mod[done] = A32.done; + } + group s0_r33_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe33.left = sub1.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s0_r33_op_mod[done] = A33.done; + } + group s0_r34_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe34.left = sub2.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s0_r34_op_mod[done] = A34.done; + } + group s0_r35_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe35.left = sub3.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s0_r35_op_mod[done] = A35.done; + } + group s0_r36_op_mod { + sub4.left = r4.out; + sub4.right = mult_pipe4.out; + mod_pipe36.left = sub4.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s0_r36_op_mod[done] = A36.done; + } + group s0_r37_op_mod { + sub5.left = r5.out; + sub5.right = mult_pipe5.out; + mod_pipe37.left = sub5.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s0_r37_op_mod[done] = A37.done; + } + group s0_r38_op_mod { + sub6.left = r6.out; + sub6.right = mult_pipe6.out; + mod_pipe38.left = sub6.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s0_r38_op_mod[done] = A38.done; + } + group s0_r39_op_mod { + sub7.left = r7.out; + sub7.right = mult_pipe7.out; + mod_pipe39.left = sub7.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s0_r39_op_mod[done] = A39.done; + } + group s0_r40_op_mod { + sub8.left = r8.out; + sub8.right = mult_pipe8.out; + mod_pipe40.left = sub8.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s0_r40_op_mod[done] = A40.done; + } + group s0_r41_op_mod { + sub9.left = r9.out; + sub9.right = mult_pipe9.out; + mod_pipe41.left = sub9.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s0_r41_op_mod[done] = A41.done; + } + group s0_r42_op_mod { + sub10.left = r10.out; + sub10.right = mult_pipe10.out; + mod_pipe42.left = sub10.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s0_r42_op_mod[done] = A42.done; + } + group s0_r43_op_mod { + sub11.left = r11.out; + sub11.right = mult_pipe11.out; + mod_pipe43.left = sub11.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s0_r43_op_mod[done] = A43.done; + } + group s0_r44_op_mod { + sub12.left = r12.out; + sub12.right = mult_pipe12.out; + mod_pipe44.left = sub12.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s0_r44_op_mod[done] = A44.done; + } + group s0_r45_op_mod { + sub13.left = r13.out; + sub13.right = mult_pipe13.out; + mod_pipe45.left = sub13.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s0_r45_op_mod[done] = A45.done; + } + group s0_r46_op_mod { + sub14.left = r14.out; + sub14.right = mult_pipe14.out; + mod_pipe46.left = sub14.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s0_r46_op_mod[done] = A46.done; + } + group s0_r47_op_mod { + sub15.left = r15.out; + sub15.right = mult_pipe15.out; + mod_pipe47.left = sub15.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s0_r47_op_mod[done] = A47.done; + } + group s0_r48_op_mod { + sub16.left = r16.out; + sub16.right = mult_pipe16.out; + mod_pipe48.left = sub16.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s0_r48_op_mod[done] = A48.done; + } + group s0_r49_op_mod { + sub17.left = r17.out; + sub17.right = mult_pipe17.out; + mod_pipe49.left = sub17.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s0_r49_op_mod[done] = A49.done; + } + group s0_r50_op_mod { + sub18.left = r18.out; + sub18.right = mult_pipe18.out; + mod_pipe50.left = sub18.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s0_r50_op_mod[done] = A50.done; + } + group s0_r51_op_mod { + sub19.left = r19.out; + sub19.right = mult_pipe19.out; + mod_pipe51.left = sub19.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s0_r51_op_mod[done] = A51.done; + } + group s0_r52_op_mod { + sub20.left = r20.out; + sub20.right = mult_pipe20.out; + mod_pipe52.left = sub20.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s0_r52_op_mod[done] = A52.done; + } + group s0_r53_op_mod { + sub21.left = r21.out; + sub21.right = mult_pipe21.out; + mod_pipe53.left = sub21.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s0_r53_op_mod[done] = A53.done; + } + group s0_r54_op_mod { + sub22.left = r22.out; + sub22.right = mult_pipe22.out; + mod_pipe54.left = sub22.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s0_r54_op_mod[done] = A54.done; + } + group s0_r55_op_mod { + sub23.left = r23.out; + sub23.right = mult_pipe23.out; + mod_pipe55.left = sub23.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s0_r55_op_mod[done] = A55.done; + } + group s0_r56_op_mod { + sub24.left = r24.out; + sub24.right = mult_pipe24.out; + mod_pipe56.left = sub24.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s0_r56_op_mod[done] = A56.done; + } + group s0_r57_op_mod { + sub25.left = r25.out; + sub25.right = mult_pipe25.out; + mod_pipe57.left = sub25.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s0_r57_op_mod[done] = A57.done; + } + group s0_r58_op_mod { + sub26.left = r26.out; + sub26.right = mult_pipe26.out; + mod_pipe58.left = sub26.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s0_r58_op_mod[done] = A58.done; + } + group s0_r59_op_mod { + sub27.left = r27.out; + sub27.right = mult_pipe27.out; + mod_pipe59.left = sub27.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s0_r59_op_mod[done] = A59.done; + } + group s0_r60_op_mod { + sub28.left = r28.out; + sub28.right = mult_pipe28.out; + mod_pipe60.left = sub28.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s0_r60_op_mod[done] = A60.done; + } + group s0_r61_op_mod { + sub29.left = r29.out; + sub29.right = mult_pipe29.out; + mod_pipe61.left = sub29.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s0_r61_op_mod[done] = A61.done; + } + group s0_r62_op_mod { + sub30.left = r30.out; + sub30.right = mult_pipe30.out; + mod_pipe62.left = sub30.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s0_r62_op_mod[done] = A62.done; + } + group s0_r63_op_mod { + sub31.left = r31.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s0_r63_op_mod[done] = A63.done; + } + group s1_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s1_r0_op_mod[done] = A0.done; + } + group s1_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s1_r1_op_mod[done] = A1.done; + } + group s1_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s1_r2_op_mod[done] = A2.done; + } + group s1_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s1_r3_op_mod[done] = A3.done; + } + group s1_r4_op_mod { + add4.left = r4.out; + add4.right = mult_pipe4.out; + mod_pipe4.left = add4.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s1_r4_op_mod[done] = A4.done; + } + group s1_r5_op_mod { + add5.left = r5.out; + add5.right = mult_pipe5.out; + mod_pipe5.left = add5.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s1_r5_op_mod[done] = A5.done; + } + group s1_r6_op_mod { + add6.left = r6.out; + add6.right = mult_pipe6.out; + mod_pipe6.left = add6.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s1_r6_op_mod[done] = A6.done; + } + group s1_r7_op_mod { + add7.left = r7.out; + add7.right = mult_pipe7.out; + mod_pipe7.left = add7.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s1_r7_op_mod[done] = A7.done; + } + group s1_r8_op_mod { + add8.left = r8.out; + add8.right = mult_pipe8.out; + mod_pipe8.left = add8.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s1_r8_op_mod[done] = A8.done; + } + group s1_r9_op_mod { + add9.left = r9.out; + add9.right = mult_pipe9.out; + mod_pipe9.left = add9.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s1_r9_op_mod[done] = A9.done; + } + group s1_r10_op_mod { + add10.left = r10.out; + add10.right = mult_pipe10.out; + mod_pipe10.left = add10.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s1_r10_op_mod[done] = A10.done; + } + group s1_r11_op_mod { + add11.left = r11.out; + add11.right = mult_pipe11.out; + mod_pipe11.left = add11.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s1_r11_op_mod[done] = A11.done; + } + group s1_r12_op_mod { + add12.left = r12.out; + add12.right = mult_pipe12.out; + mod_pipe12.left = add12.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s1_r12_op_mod[done] = A12.done; + } + group s1_r13_op_mod { + add13.left = r13.out; + add13.right = mult_pipe13.out; + mod_pipe13.left = add13.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s1_r13_op_mod[done] = A13.done; + } + group s1_r14_op_mod { + add14.left = r14.out; + add14.right = mult_pipe14.out; + mod_pipe14.left = add14.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s1_r14_op_mod[done] = A14.done; + } + group s1_r15_op_mod { + add15.left = r15.out; + add15.right = mult_pipe15.out; + mod_pipe15.left = add15.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s1_r15_op_mod[done] = A15.done; + } + group s1_r16_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe16.left = sub0.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s1_r16_op_mod[done] = A16.done; + } + group s1_r17_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe17.left = sub1.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s1_r17_op_mod[done] = A17.done; + } + group s1_r18_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe18.left = sub2.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s1_r18_op_mod[done] = A18.done; + } + group s1_r19_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe19.left = sub3.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s1_r19_op_mod[done] = A19.done; + } + group s1_r20_op_mod { + sub4.left = r4.out; + sub4.right = mult_pipe4.out; + mod_pipe20.left = sub4.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s1_r20_op_mod[done] = A20.done; + } + group s1_r21_op_mod { + sub5.left = r5.out; + sub5.right = mult_pipe5.out; + mod_pipe21.left = sub5.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s1_r21_op_mod[done] = A21.done; + } + group s1_r22_op_mod { + sub6.left = r6.out; + sub6.right = mult_pipe6.out; + mod_pipe22.left = sub6.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s1_r22_op_mod[done] = A22.done; + } + group s1_r23_op_mod { + sub7.left = r7.out; + sub7.right = mult_pipe7.out; + mod_pipe23.left = sub7.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s1_r23_op_mod[done] = A23.done; + } + group s1_r24_op_mod { + sub8.left = r8.out; + sub8.right = mult_pipe8.out; + mod_pipe24.left = sub8.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s1_r24_op_mod[done] = A24.done; + } + group s1_r25_op_mod { + sub9.left = r9.out; + sub9.right = mult_pipe9.out; + mod_pipe25.left = sub9.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s1_r25_op_mod[done] = A25.done; + } + group s1_r26_op_mod { + sub10.left = r10.out; + sub10.right = mult_pipe10.out; + mod_pipe26.left = sub10.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s1_r26_op_mod[done] = A26.done; + } + group s1_r27_op_mod { + sub11.left = r11.out; + sub11.right = mult_pipe11.out; + mod_pipe27.left = sub11.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s1_r27_op_mod[done] = A27.done; + } + group s1_r28_op_mod { + sub12.left = r12.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s1_r28_op_mod[done] = A28.done; + } + group s1_r29_op_mod { + sub13.left = r13.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s1_r29_op_mod[done] = A29.done; + } + group s1_r30_op_mod { + sub14.left = r14.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s1_r30_op_mod[done] = A30.done; + } + group s1_r31_op_mod { + sub15.left = r15.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s1_r31_op_mod[done] = A31.done; + } + group s1_r32_op_mod { + add16.left = r32.out; + add16.right = mult_pipe16.out; + mod_pipe32.left = add16.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s1_r32_op_mod[done] = A32.done; + } + group s1_r33_op_mod { + add17.left = r33.out; + add17.right = mult_pipe17.out; + mod_pipe33.left = add17.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s1_r33_op_mod[done] = A33.done; + } + group s1_r34_op_mod { + add18.left = r34.out; + add18.right = mult_pipe18.out; + mod_pipe34.left = add18.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s1_r34_op_mod[done] = A34.done; + } + group s1_r35_op_mod { + add19.left = r35.out; + add19.right = mult_pipe19.out; + mod_pipe35.left = add19.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s1_r35_op_mod[done] = A35.done; + } + group s1_r36_op_mod { + add20.left = r36.out; + add20.right = mult_pipe20.out; + mod_pipe36.left = add20.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s1_r36_op_mod[done] = A36.done; + } + group s1_r37_op_mod { + add21.left = r37.out; + add21.right = mult_pipe21.out; + mod_pipe37.left = add21.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s1_r37_op_mod[done] = A37.done; + } + group s1_r38_op_mod { + add22.left = r38.out; + add22.right = mult_pipe22.out; + mod_pipe38.left = add22.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s1_r38_op_mod[done] = A38.done; + } + group s1_r39_op_mod { + add23.left = r39.out; + add23.right = mult_pipe23.out; + mod_pipe39.left = add23.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s1_r39_op_mod[done] = A39.done; + } + group s1_r40_op_mod { + add24.left = r40.out; + add24.right = mult_pipe24.out; + mod_pipe40.left = add24.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s1_r40_op_mod[done] = A40.done; + } + group s1_r41_op_mod { + add25.left = r41.out; + add25.right = mult_pipe25.out; + mod_pipe41.left = add25.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s1_r41_op_mod[done] = A41.done; + } + group s1_r42_op_mod { + add26.left = r42.out; + add26.right = mult_pipe26.out; + mod_pipe42.left = add26.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s1_r42_op_mod[done] = A42.done; + } + group s1_r43_op_mod { + add27.left = r43.out; + add27.right = mult_pipe27.out; + mod_pipe43.left = add27.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s1_r43_op_mod[done] = A43.done; + } + group s1_r44_op_mod { + add28.left = r44.out; + add28.right = mult_pipe28.out; + mod_pipe44.left = add28.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s1_r44_op_mod[done] = A44.done; + } + group s1_r45_op_mod { + add29.left = r45.out; + add29.right = mult_pipe29.out; + mod_pipe45.left = add29.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s1_r45_op_mod[done] = A45.done; + } + group s1_r46_op_mod { + add30.left = r46.out; + add30.right = mult_pipe30.out; + mod_pipe46.left = add30.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s1_r46_op_mod[done] = A46.done; + } + group s1_r47_op_mod { + add31.left = r47.out; + add31.right = mult_pipe31.out; + mod_pipe47.left = add31.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s1_r47_op_mod[done] = A47.done; + } + group s1_r48_op_mod { + sub16.left = r32.out; + sub16.right = mult_pipe16.out; + mod_pipe48.left = sub16.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s1_r48_op_mod[done] = A48.done; + } + group s1_r49_op_mod { + sub17.left = r33.out; + sub17.right = mult_pipe17.out; + mod_pipe49.left = sub17.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s1_r49_op_mod[done] = A49.done; + } + group s1_r50_op_mod { + sub18.left = r34.out; + sub18.right = mult_pipe18.out; + mod_pipe50.left = sub18.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s1_r50_op_mod[done] = A50.done; + } + group s1_r51_op_mod { + sub19.left = r35.out; + sub19.right = mult_pipe19.out; + mod_pipe51.left = sub19.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s1_r51_op_mod[done] = A51.done; + } + group s1_r52_op_mod { + sub20.left = r36.out; + sub20.right = mult_pipe20.out; + mod_pipe52.left = sub20.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s1_r52_op_mod[done] = A52.done; + } + group s1_r53_op_mod { + sub21.left = r37.out; + sub21.right = mult_pipe21.out; + mod_pipe53.left = sub21.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s1_r53_op_mod[done] = A53.done; + } + group s1_r54_op_mod { + sub22.left = r38.out; + sub22.right = mult_pipe22.out; + mod_pipe54.left = sub22.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s1_r54_op_mod[done] = A54.done; + } + group s1_r55_op_mod { + sub23.left = r39.out; + sub23.right = mult_pipe23.out; + mod_pipe55.left = sub23.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s1_r55_op_mod[done] = A55.done; + } + group s1_r56_op_mod { + sub24.left = r40.out; + sub24.right = mult_pipe24.out; + mod_pipe56.left = sub24.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s1_r56_op_mod[done] = A56.done; + } + group s1_r57_op_mod { + sub25.left = r41.out; + sub25.right = mult_pipe25.out; + mod_pipe57.left = sub25.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s1_r57_op_mod[done] = A57.done; + } + group s1_r58_op_mod { + sub26.left = r42.out; + sub26.right = mult_pipe26.out; + mod_pipe58.left = sub26.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s1_r58_op_mod[done] = A58.done; + } + group s1_r59_op_mod { + sub27.left = r43.out; + sub27.right = mult_pipe27.out; + mod_pipe59.left = sub27.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s1_r59_op_mod[done] = A59.done; + } + group s1_r60_op_mod { + sub28.left = r44.out; + sub28.right = mult_pipe28.out; + mod_pipe60.left = sub28.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s1_r60_op_mod[done] = A60.done; + } + group s1_r61_op_mod { + sub29.left = r45.out; + sub29.right = mult_pipe29.out; + mod_pipe61.left = sub29.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s1_r61_op_mod[done] = A61.done; + } + group s1_r62_op_mod { + sub30.left = r46.out; + sub30.right = mult_pipe30.out; + mod_pipe62.left = sub30.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s1_r62_op_mod[done] = A62.done; + } + group s1_r63_op_mod { + sub31.left = r47.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s1_r63_op_mod[done] = A63.done; + } + group s2_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s2_r0_op_mod[done] = A0.done; + } + group s2_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s2_r1_op_mod[done] = A1.done; + } + group s2_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s2_r2_op_mod[done] = A2.done; + } + group s2_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s2_r3_op_mod[done] = A3.done; + } + group s2_r4_op_mod { + add4.left = r4.out; + add4.right = mult_pipe4.out; + mod_pipe4.left = add4.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s2_r4_op_mod[done] = A4.done; + } + group s2_r5_op_mod { + add5.left = r5.out; + add5.right = mult_pipe5.out; + mod_pipe5.left = add5.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s2_r5_op_mod[done] = A5.done; + } + group s2_r6_op_mod { + add6.left = r6.out; + add6.right = mult_pipe6.out; + mod_pipe6.left = add6.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s2_r6_op_mod[done] = A6.done; + } + group s2_r7_op_mod { + add7.left = r7.out; + add7.right = mult_pipe7.out; + mod_pipe7.left = add7.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s2_r7_op_mod[done] = A7.done; + } + group s2_r8_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe8.left = sub0.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s2_r8_op_mod[done] = A8.done; + } + group s2_r9_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe9.left = sub1.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s2_r9_op_mod[done] = A9.done; + } + group s2_r10_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe10.left = sub2.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s2_r10_op_mod[done] = A10.done; + } + group s2_r11_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe11.left = sub3.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s2_r11_op_mod[done] = A11.done; + } + group s2_r12_op_mod { + sub4.left = r4.out; + sub4.right = mult_pipe4.out; + mod_pipe12.left = sub4.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s2_r12_op_mod[done] = A12.done; + } + group s2_r13_op_mod { + sub5.left = r5.out; + sub5.right = mult_pipe5.out; + mod_pipe13.left = sub5.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s2_r13_op_mod[done] = A13.done; + } + group s2_r14_op_mod { + sub6.left = r6.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s2_r14_op_mod[done] = A14.done; + } + group s2_r15_op_mod { + sub7.left = r7.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s2_r15_op_mod[done] = A15.done; + } + group s2_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s2_r16_op_mod[done] = A16.done; + } + group s2_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s2_r17_op_mod[done] = A17.done; + } + group s2_r18_op_mod { + add10.left = r18.out; + add10.right = mult_pipe10.out; + mod_pipe18.left = add10.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s2_r18_op_mod[done] = A18.done; + } + group s2_r19_op_mod { + add11.left = r19.out; + add11.right = mult_pipe11.out; + mod_pipe19.left = add11.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s2_r19_op_mod[done] = A19.done; + } + group s2_r20_op_mod { + add12.left = r20.out; + add12.right = mult_pipe12.out; + mod_pipe20.left = add12.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s2_r20_op_mod[done] = A20.done; + } + group s2_r21_op_mod { + add13.left = r21.out; + add13.right = mult_pipe13.out; + mod_pipe21.left = add13.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s2_r21_op_mod[done] = A21.done; + } + group s2_r22_op_mod { + add14.left = r22.out; + add14.right = mult_pipe14.out; + mod_pipe22.left = add14.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s2_r22_op_mod[done] = A22.done; + } + group s2_r23_op_mod { + add15.left = r23.out; + add15.right = mult_pipe15.out; + mod_pipe23.left = add15.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s2_r23_op_mod[done] = A23.done; + } + group s2_r24_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe24.left = sub8.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s2_r24_op_mod[done] = A24.done; + } + group s2_r25_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe25.left = sub9.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s2_r25_op_mod[done] = A25.done; + } + group s2_r26_op_mod { + sub10.left = r18.out; + sub10.right = mult_pipe10.out; + mod_pipe26.left = sub10.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s2_r26_op_mod[done] = A26.done; + } + group s2_r27_op_mod { + sub11.left = r19.out; + sub11.right = mult_pipe11.out; + mod_pipe27.left = sub11.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s2_r27_op_mod[done] = A27.done; + } + group s2_r28_op_mod { + sub12.left = r20.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s2_r28_op_mod[done] = A28.done; + } + group s2_r29_op_mod { + sub13.left = r21.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s2_r29_op_mod[done] = A29.done; + } + group s2_r30_op_mod { + sub14.left = r22.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s2_r30_op_mod[done] = A30.done; + } + group s2_r31_op_mod { + sub15.left = r23.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s2_r31_op_mod[done] = A31.done; + } + group s2_r32_op_mod { + add16.left = r32.out; + add16.right = mult_pipe16.out; + mod_pipe32.left = add16.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s2_r32_op_mod[done] = A32.done; + } + group s2_r33_op_mod { + add17.left = r33.out; + add17.right = mult_pipe17.out; + mod_pipe33.left = add17.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s2_r33_op_mod[done] = A33.done; + } + group s2_r34_op_mod { + add18.left = r34.out; + add18.right = mult_pipe18.out; + mod_pipe34.left = add18.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s2_r34_op_mod[done] = A34.done; + } + group s2_r35_op_mod { + add19.left = r35.out; + add19.right = mult_pipe19.out; + mod_pipe35.left = add19.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s2_r35_op_mod[done] = A35.done; + } + group s2_r36_op_mod { + add20.left = r36.out; + add20.right = mult_pipe20.out; + mod_pipe36.left = add20.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s2_r36_op_mod[done] = A36.done; + } + group s2_r37_op_mod { + add21.left = r37.out; + add21.right = mult_pipe21.out; + mod_pipe37.left = add21.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s2_r37_op_mod[done] = A37.done; + } + group s2_r38_op_mod { + add22.left = r38.out; + add22.right = mult_pipe22.out; + mod_pipe38.left = add22.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s2_r38_op_mod[done] = A38.done; + } + group s2_r39_op_mod { + add23.left = r39.out; + add23.right = mult_pipe23.out; + mod_pipe39.left = add23.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s2_r39_op_mod[done] = A39.done; + } + group s2_r40_op_mod { + sub16.left = r32.out; + sub16.right = mult_pipe16.out; + mod_pipe40.left = sub16.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s2_r40_op_mod[done] = A40.done; + } + group s2_r41_op_mod { + sub17.left = r33.out; + sub17.right = mult_pipe17.out; + mod_pipe41.left = sub17.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s2_r41_op_mod[done] = A41.done; + } + group s2_r42_op_mod { + sub18.left = r34.out; + sub18.right = mult_pipe18.out; + mod_pipe42.left = sub18.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s2_r42_op_mod[done] = A42.done; + } + group s2_r43_op_mod { + sub19.left = r35.out; + sub19.right = mult_pipe19.out; + mod_pipe43.left = sub19.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s2_r43_op_mod[done] = A43.done; + } + group s2_r44_op_mod { + sub20.left = r36.out; + sub20.right = mult_pipe20.out; + mod_pipe44.left = sub20.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s2_r44_op_mod[done] = A44.done; + } + group s2_r45_op_mod { + sub21.left = r37.out; + sub21.right = mult_pipe21.out; + mod_pipe45.left = sub21.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s2_r45_op_mod[done] = A45.done; + } + group s2_r46_op_mod { + sub22.left = r38.out; + sub22.right = mult_pipe22.out; + mod_pipe46.left = sub22.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s2_r46_op_mod[done] = A46.done; + } + group s2_r47_op_mod { + sub23.left = r39.out; + sub23.right = mult_pipe23.out; + mod_pipe47.left = sub23.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s2_r47_op_mod[done] = A47.done; + } + group s2_r48_op_mod { + add24.left = r48.out; + add24.right = mult_pipe24.out; + mod_pipe48.left = add24.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s2_r48_op_mod[done] = A48.done; + } + group s2_r49_op_mod { + add25.left = r49.out; + add25.right = mult_pipe25.out; + mod_pipe49.left = add25.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s2_r49_op_mod[done] = A49.done; + } + group s2_r50_op_mod { + add26.left = r50.out; + add26.right = mult_pipe26.out; + mod_pipe50.left = add26.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s2_r50_op_mod[done] = A50.done; + } + group s2_r51_op_mod { + add27.left = r51.out; + add27.right = mult_pipe27.out; + mod_pipe51.left = add27.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s2_r51_op_mod[done] = A51.done; + } + group s2_r52_op_mod { + add28.left = r52.out; + add28.right = mult_pipe28.out; + mod_pipe52.left = add28.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s2_r52_op_mod[done] = A52.done; + } + group s2_r53_op_mod { + add29.left = r53.out; + add29.right = mult_pipe29.out; + mod_pipe53.left = add29.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s2_r53_op_mod[done] = A53.done; + } + group s2_r54_op_mod { + add30.left = r54.out; + add30.right = mult_pipe30.out; + mod_pipe54.left = add30.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s2_r54_op_mod[done] = A54.done; + } + group s2_r55_op_mod { + add31.left = r55.out; + add31.right = mult_pipe31.out; + mod_pipe55.left = add31.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s2_r55_op_mod[done] = A55.done; + } + group s2_r56_op_mod { + sub24.left = r48.out; + sub24.right = mult_pipe24.out; + mod_pipe56.left = sub24.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s2_r56_op_mod[done] = A56.done; + } + group s2_r57_op_mod { + sub25.left = r49.out; + sub25.right = mult_pipe25.out; + mod_pipe57.left = sub25.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s2_r57_op_mod[done] = A57.done; + } + group s2_r58_op_mod { + sub26.left = r50.out; + sub26.right = mult_pipe26.out; + mod_pipe58.left = sub26.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s2_r58_op_mod[done] = A58.done; + } + group s2_r59_op_mod { + sub27.left = r51.out; + sub27.right = mult_pipe27.out; + mod_pipe59.left = sub27.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s2_r59_op_mod[done] = A59.done; + } + group s2_r60_op_mod { + sub28.left = r52.out; + sub28.right = mult_pipe28.out; + mod_pipe60.left = sub28.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s2_r60_op_mod[done] = A60.done; + } + group s2_r61_op_mod { + sub29.left = r53.out; + sub29.right = mult_pipe29.out; + mod_pipe61.left = sub29.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s2_r61_op_mod[done] = A61.done; + } + group s2_r62_op_mod { + sub30.left = r54.out; + sub30.right = mult_pipe30.out; + mod_pipe62.left = sub30.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s2_r62_op_mod[done] = A62.done; + } + group s2_r63_op_mod { + sub31.left = r55.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s2_r63_op_mod[done] = A63.done; + } + group s3_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s3_r0_op_mod[done] = A0.done; + } + group s3_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s3_r1_op_mod[done] = A1.done; + } + group s3_r2_op_mod { + add2.left = r2.out; + add2.right = mult_pipe2.out; + mod_pipe2.left = add2.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s3_r2_op_mod[done] = A2.done; + } + group s3_r3_op_mod { + add3.left = r3.out; + add3.right = mult_pipe3.out; + mod_pipe3.left = add3.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s3_r3_op_mod[done] = A3.done; + } + group s3_r4_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe4.left = sub0.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s3_r4_op_mod[done] = A4.done; + } + group s3_r5_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe5.left = sub1.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s3_r5_op_mod[done] = A5.done; + } + group s3_r6_op_mod { + sub2.left = r2.out; + sub2.right = mult_pipe2.out; + mod_pipe6.left = sub2.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s3_r6_op_mod[done] = A6.done; + } + group s3_r7_op_mod { + sub3.left = r3.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s3_r7_op_mod[done] = A7.done; + } + group s3_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s3_r8_op_mod[done] = A8.done; + } + group s3_r9_op_mod { + add5.left = r9.out; + add5.right = mult_pipe5.out; + mod_pipe9.left = add5.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s3_r9_op_mod[done] = A9.done; + } + group s3_r10_op_mod { + add6.left = r10.out; + add6.right = mult_pipe6.out; + mod_pipe10.left = add6.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s3_r10_op_mod[done] = A10.done; + } + group s3_r11_op_mod { + add7.left = r11.out; + add7.right = mult_pipe7.out; + mod_pipe11.left = add7.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s3_r11_op_mod[done] = A11.done; + } + group s3_r12_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe12.left = sub4.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s3_r12_op_mod[done] = A12.done; + } + group s3_r13_op_mod { + sub5.left = r9.out; + sub5.right = mult_pipe5.out; + mod_pipe13.left = sub5.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s3_r13_op_mod[done] = A13.done; + } + group s3_r14_op_mod { + sub6.left = r10.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s3_r14_op_mod[done] = A14.done; + } + group s3_r15_op_mod { + sub7.left = r11.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s3_r15_op_mod[done] = A15.done; + } + group s3_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s3_r16_op_mod[done] = A16.done; + } + group s3_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s3_r17_op_mod[done] = A17.done; + } + group s3_r18_op_mod { + add10.left = r18.out; + add10.right = mult_pipe10.out; + mod_pipe18.left = add10.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s3_r18_op_mod[done] = A18.done; + } + group s3_r19_op_mod { + add11.left = r19.out; + add11.right = mult_pipe11.out; + mod_pipe19.left = add11.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s3_r19_op_mod[done] = A19.done; + } + group s3_r20_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe20.left = sub8.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s3_r20_op_mod[done] = A20.done; + } + group s3_r21_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe21.left = sub9.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s3_r21_op_mod[done] = A21.done; + } + group s3_r22_op_mod { + sub10.left = r18.out; + sub10.right = mult_pipe10.out; + mod_pipe22.left = sub10.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s3_r22_op_mod[done] = A22.done; + } + group s3_r23_op_mod { + sub11.left = r19.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s3_r23_op_mod[done] = A23.done; + } + group s3_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s3_r24_op_mod[done] = A24.done; + } + group s3_r25_op_mod { + add13.left = r25.out; + add13.right = mult_pipe13.out; + mod_pipe25.left = add13.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s3_r25_op_mod[done] = A25.done; + } + group s3_r26_op_mod { + add14.left = r26.out; + add14.right = mult_pipe14.out; + mod_pipe26.left = add14.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s3_r26_op_mod[done] = A26.done; + } + group s3_r27_op_mod { + add15.left = r27.out; + add15.right = mult_pipe15.out; + mod_pipe27.left = add15.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s3_r27_op_mod[done] = A27.done; + } + group s3_r28_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe28.left = sub12.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s3_r28_op_mod[done] = A28.done; + } + group s3_r29_op_mod { + sub13.left = r25.out; + sub13.right = mult_pipe13.out; + mod_pipe29.left = sub13.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s3_r29_op_mod[done] = A29.done; + } + group s3_r30_op_mod { + sub14.left = r26.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s3_r30_op_mod[done] = A30.done; + } + group s3_r31_op_mod { + sub15.left = r27.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s3_r31_op_mod[done] = A31.done; + } + group s3_r32_op_mod { + add16.left = r32.out; + add16.right = mult_pipe16.out; + mod_pipe32.left = add16.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s3_r32_op_mod[done] = A32.done; + } + group s3_r33_op_mod { + add17.left = r33.out; + add17.right = mult_pipe17.out; + mod_pipe33.left = add17.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s3_r33_op_mod[done] = A33.done; + } + group s3_r34_op_mod { + add18.left = r34.out; + add18.right = mult_pipe18.out; + mod_pipe34.left = add18.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s3_r34_op_mod[done] = A34.done; + } + group s3_r35_op_mod { + add19.left = r35.out; + add19.right = mult_pipe19.out; + mod_pipe35.left = add19.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s3_r35_op_mod[done] = A35.done; + } + group s3_r36_op_mod { + sub16.left = r32.out; + sub16.right = mult_pipe16.out; + mod_pipe36.left = sub16.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s3_r36_op_mod[done] = A36.done; + } + group s3_r37_op_mod { + sub17.left = r33.out; + sub17.right = mult_pipe17.out; + mod_pipe37.left = sub17.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s3_r37_op_mod[done] = A37.done; + } + group s3_r38_op_mod { + sub18.left = r34.out; + sub18.right = mult_pipe18.out; + mod_pipe38.left = sub18.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s3_r38_op_mod[done] = A38.done; + } + group s3_r39_op_mod { + sub19.left = r35.out; + sub19.right = mult_pipe19.out; + mod_pipe39.left = sub19.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s3_r39_op_mod[done] = A39.done; + } + group s3_r40_op_mod { + add20.left = r40.out; + add20.right = mult_pipe20.out; + mod_pipe40.left = add20.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s3_r40_op_mod[done] = A40.done; + } + group s3_r41_op_mod { + add21.left = r41.out; + add21.right = mult_pipe21.out; + mod_pipe41.left = add21.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s3_r41_op_mod[done] = A41.done; + } + group s3_r42_op_mod { + add22.left = r42.out; + add22.right = mult_pipe22.out; + mod_pipe42.left = add22.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s3_r42_op_mod[done] = A42.done; + } + group s3_r43_op_mod { + add23.left = r43.out; + add23.right = mult_pipe23.out; + mod_pipe43.left = add23.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s3_r43_op_mod[done] = A43.done; + } + group s3_r44_op_mod { + sub20.left = r40.out; + sub20.right = mult_pipe20.out; + mod_pipe44.left = sub20.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s3_r44_op_mod[done] = A44.done; + } + group s3_r45_op_mod { + sub21.left = r41.out; + sub21.right = mult_pipe21.out; + mod_pipe45.left = sub21.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s3_r45_op_mod[done] = A45.done; + } + group s3_r46_op_mod { + sub22.left = r42.out; + sub22.right = mult_pipe22.out; + mod_pipe46.left = sub22.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s3_r46_op_mod[done] = A46.done; + } + group s3_r47_op_mod { + sub23.left = r43.out; + sub23.right = mult_pipe23.out; + mod_pipe47.left = sub23.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s3_r47_op_mod[done] = A47.done; + } + group s3_r48_op_mod { + add24.left = r48.out; + add24.right = mult_pipe24.out; + mod_pipe48.left = add24.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s3_r48_op_mod[done] = A48.done; + } + group s3_r49_op_mod { + add25.left = r49.out; + add25.right = mult_pipe25.out; + mod_pipe49.left = add25.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s3_r49_op_mod[done] = A49.done; + } + group s3_r50_op_mod { + add26.left = r50.out; + add26.right = mult_pipe26.out; + mod_pipe50.left = add26.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s3_r50_op_mod[done] = A50.done; + } + group s3_r51_op_mod { + add27.left = r51.out; + add27.right = mult_pipe27.out; + mod_pipe51.left = add27.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s3_r51_op_mod[done] = A51.done; + } + group s3_r52_op_mod { + sub24.left = r48.out; + sub24.right = mult_pipe24.out; + mod_pipe52.left = sub24.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s3_r52_op_mod[done] = A52.done; + } + group s3_r53_op_mod { + sub25.left = r49.out; + sub25.right = mult_pipe25.out; + mod_pipe53.left = sub25.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s3_r53_op_mod[done] = A53.done; + } + group s3_r54_op_mod { + sub26.left = r50.out; + sub26.right = mult_pipe26.out; + mod_pipe54.left = sub26.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s3_r54_op_mod[done] = A54.done; + } + group s3_r55_op_mod { + sub27.left = r51.out; + sub27.right = mult_pipe27.out; + mod_pipe55.left = sub27.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s3_r55_op_mod[done] = A55.done; + } + group s3_r56_op_mod { + add28.left = r56.out; + add28.right = mult_pipe28.out; + mod_pipe56.left = add28.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s3_r56_op_mod[done] = A56.done; + } + group s3_r57_op_mod { + add29.left = r57.out; + add29.right = mult_pipe29.out; + mod_pipe57.left = add29.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s3_r57_op_mod[done] = A57.done; + } + group s3_r58_op_mod { + add30.left = r58.out; + add30.right = mult_pipe30.out; + mod_pipe58.left = add30.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s3_r58_op_mod[done] = A58.done; + } + group s3_r59_op_mod { + add31.left = r59.out; + add31.right = mult_pipe31.out; + mod_pipe59.left = add31.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s3_r59_op_mod[done] = A59.done; + } + group s3_r60_op_mod { + sub28.left = r56.out; + sub28.right = mult_pipe28.out; + mod_pipe60.left = sub28.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s3_r60_op_mod[done] = A60.done; + } + group s3_r61_op_mod { + sub29.left = r57.out; + sub29.right = mult_pipe29.out; + mod_pipe61.left = sub29.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s3_r61_op_mod[done] = A61.done; + } + group s3_r62_op_mod { + sub30.left = r58.out; + sub30.right = mult_pipe30.out; + mod_pipe62.left = sub30.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s3_r62_op_mod[done] = A62.done; + } + group s3_r63_op_mod { + sub31.left = r59.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s3_r63_op_mod[done] = A63.done; + } + group s4_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s4_r0_op_mod[done] = A0.done; + } + group s4_r1_op_mod { + add1.left = r1.out; + add1.right = mult_pipe1.out; + mod_pipe1.left = add1.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s4_r1_op_mod[done] = A1.done; + } + group s4_r2_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe2.left = sub0.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s4_r2_op_mod[done] = A2.done; + } + group s4_r3_op_mod { + sub1.left = r1.out; + sub1.right = mult_pipe1.out; + mod_pipe3.left = sub1.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s4_r3_op_mod[done] = A3.done; + } + group s4_r4_op_mod { + add2.left = r4.out; + add2.right = mult_pipe2.out; + mod_pipe4.left = add2.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s4_r4_op_mod[done] = A4.done; + } + group s4_r5_op_mod { + add3.left = r5.out; + add3.right = mult_pipe3.out; + mod_pipe5.left = add3.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s4_r5_op_mod[done] = A5.done; + } + group s4_r6_op_mod { + sub2.left = r4.out; + sub2.right = mult_pipe2.out; + mod_pipe6.left = sub2.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s4_r6_op_mod[done] = A6.done; + } + group s4_r7_op_mod { + sub3.left = r5.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s4_r7_op_mod[done] = A7.done; + } + group s4_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s4_r8_op_mod[done] = A8.done; + } + group s4_r9_op_mod { + add5.left = r9.out; + add5.right = mult_pipe5.out; + mod_pipe9.left = add5.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s4_r9_op_mod[done] = A9.done; + } + group s4_r10_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe10.left = sub4.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s4_r10_op_mod[done] = A10.done; + } + group s4_r11_op_mod { + sub5.left = r9.out; + sub5.right = mult_pipe5.out; + mod_pipe11.left = sub5.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s4_r11_op_mod[done] = A11.done; + } + group s4_r12_op_mod { + add6.left = r12.out; + add6.right = mult_pipe6.out; + mod_pipe12.left = add6.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s4_r12_op_mod[done] = A12.done; + } + group s4_r13_op_mod { + add7.left = r13.out; + add7.right = mult_pipe7.out; + mod_pipe13.left = add7.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s4_r13_op_mod[done] = A13.done; + } + group s4_r14_op_mod { + sub6.left = r12.out; + sub6.right = mult_pipe6.out; + mod_pipe14.left = sub6.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s4_r14_op_mod[done] = A14.done; + } + group s4_r15_op_mod { + sub7.left = r13.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s4_r15_op_mod[done] = A15.done; + } + group s4_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s4_r16_op_mod[done] = A16.done; + } + group s4_r17_op_mod { + add9.left = r17.out; + add9.right = mult_pipe9.out; + mod_pipe17.left = add9.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s4_r17_op_mod[done] = A17.done; + } + group s4_r18_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe18.left = sub8.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s4_r18_op_mod[done] = A18.done; + } + group s4_r19_op_mod { + sub9.left = r17.out; + sub9.right = mult_pipe9.out; + mod_pipe19.left = sub9.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s4_r19_op_mod[done] = A19.done; + } + group s4_r20_op_mod { + add10.left = r20.out; + add10.right = mult_pipe10.out; + mod_pipe20.left = add10.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s4_r20_op_mod[done] = A20.done; + } + group s4_r21_op_mod { + add11.left = r21.out; + add11.right = mult_pipe11.out; + mod_pipe21.left = add11.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s4_r21_op_mod[done] = A21.done; + } + group s4_r22_op_mod { + sub10.left = r20.out; + sub10.right = mult_pipe10.out; + mod_pipe22.left = sub10.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s4_r22_op_mod[done] = A22.done; + } + group s4_r23_op_mod { + sub11.left = r21.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s4_r23_op_mod[done] = A23.done; + } + group s4_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s4_r24_op_mod[done] = A24.done; + } + group s4_r25_op_mod { + add13.left = r25.out; + add13.right = mult_pipe13.out; + mod_pipe25.left = add13.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s4_r25_op_mod[done] = A25.done; + } + group s4_r26_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe26.left = sub12.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s4_r26_op_mod[done] = A26.done; + } + group s4_r27_op_mod { + sub13.left = r25.out; + sub13.right = mult_pipe13.out; + mod_pipe27.left = sub13.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s4_r27_op_mod[done] = A27.done; + } + group s4_r28_op_mod { + add14.left = r28.out; + add14.right = mult_pipe14.out; + mod_pipe28.left = add14.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s4_r28_op_mod[done] = A28.done; + } + group s4_r29_op_mod { + add15.left = r29.out; + add15.right = mult_pipe15.out; + mod_pipe29.left = add15.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s4_r29_op_mod[done] = A29.done; + } + group s4_r30_op_mod { + sub14.left = r28.out; + sub14.right = mult_pipe14.out; + mod_pipe30.left = sub14.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s4_r30_op_mod[done] = A30.done; + } + group s4_r31_op_mod { + sub15.left = r29.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s4_r31_op_mod[done] = A31.done; + } + group s4_r32_op_mod { + add16.left = r32.out; + add16.right = mult_pipe16.out; + mod_pipe32.left = add16.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s4_r32_op_mod[done] = A32.done; + } + group s4_r33_op_mod { + add17.left = r33.out; + add17.right = mult_pipe17.out; + mod_pipe33.left = add17.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s4_r33_op_mod[done] = A33.done; + } + group s4_r34_op_mod { + sub16.left = r32.out; + sub16.right = mult_pipe16.out; + mod_pipe34.left = sub16.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s4_r34_op_mod[done] = A34.done; + } + group s4_r35_op_mod { + sub17.left = r33.out; + sub17.right = mult_pipe17.out; + mod_pipe35.left = sub17.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s4_r35_op_mod[done] = A35.done; + } + group s4_r36_op_mod { + add18.left = r36.out; + add18.right = mult_pipe18.out; + mod_pipe36.left = add18.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s4_r36_op_mod[done] = A36.done; + } + group s4_r37_op_mod { + add19.left = r37.out; + add19.right = mult_pipe19.out; + mod_pipe37.left = add19.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s4_r37_op_mod[done] = A37.done; + } + group s4_r38_op_mod { + sub18.left = r36.out; + sub18.right = mult_pipe18.out; + mod_pipe38.left = sub18.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s4_r38_op_mod[done] = A38.done; + } + group s4_r39_op_mod { + sub19.left = r37.out; + sub19.right = mult_pipe19.out; + mod_pipe39.left = sub19.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s4_r39_op_mod[done] = A39.done; + } + group s4_r40_op_mod { + add20.left = r40.out; + add20.right = mult_pipe20.out; + mod_pipe40.left = add20.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s4_r40_op_mod[done] = A40.done; + } + group s4_r41_op_mod { + add21.left = r41.out; + add21.right = mult_pipe21.out; + mod_pipe41.left = add21.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s4_r41_op_mod[done] = A41.done; + } + group s4_r42_op_mod { + sub20.left = r40.out; + sub20.right = mult_pipe20.out; + mod_pipe42.left = sub20.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s4_r42_op_mod[done] = A42.done; + } + group s4_r43_op_mod { + sub21.left = r41.out; + sub21.right = mult_pipe21.out; + mod_pipe43.left = sub21.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s4_r43_op_mod[done] = A43.done; + } + group s4_r44_op_mod { + add22.left = r44.out; + add22.right = mult_pipe22.out; + mod_pipe44.left = add22.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s4_r44_op_mod[done] = A44.done; + } + group s4_r45_op_mod { + add23.left = r45.out; + add23.right = mult_pipe23.out; + mod_pipe45.left = add23.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s4_r45_op_mod[done] = A45.done; + } + group s4_r46_op_mod { + sub22.left = r44.out; + sub22.right = mult_pipe22.out; + mod_pipe46.left = sub22.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s4_r46_op_mod[done] = A46.done; + } + group s4_r47_op_mod { + sub23.left = r45.out; + sub23.right = mult_pipe23.out; + mod_pipe47.left = sub23.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s4_r47_op_mod[done] = A47.done; + } + group s4_r48_op_mod { + add24.left = r48.out; + add24.right = mult_pipe24.out; + mod_pipe48.left = add24.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s4_r48_op_mod[done] = A48.done; + } + group s4_r49_op_mod { + add25.left = r49.out; + add25.right = mult_pipe25.out; + mod_pipe49.left = add25.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s4_r49_op_mod[done] = A49.done; + } + group s4_r50_op_mod { + sub24.left = r48.out; + sub24.right = mult_pipe24.out; + mod_pipe50.left = sub24.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s4_r50_op_mod[done] = A50.done; + } + group s4_r51_op_mod { + sub25.left = r49.out; + sub25.right = mult_pipe25.out; + mod_pipe51.left = sub25.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s4_r51_op_mod[done] = A51.done; + } + group s4_r52_op_mod { + add26.left = r52.out; + add26.right = mult_pipe26.out; + mod_pipe52.left = add26.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s4_r52_op_mod[done] = A52.done; + } + group s4_r53_op_mod { + add27.left = r53.out; + add27.right = mult_pipe27.out; + mod_pipe53.left = add27.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s4_r53_op_mod[done] = A53.done; + } + group s4_r54_op_mod { + sub26.left = r52.out; + sub26.right = mult_pipe26.out; + mod_pipe54.left = sub26.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s4_r54_op_mod[done] = A54.done; + } + group s4_r55_op_mod { + sub27.left = r53.out; + sub27.right = mult_pipe27.out; + mod_pipe55.left = sub27.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s4_r55_op_mod[done] = A55.done; + } + group s4_r56_op_mod { + add28.left = r56.out; + add28.right = mult_pipe28.out; + mod_pipe56.left = add28.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s4_r56_op_mod[done] = A56.done; + } + group s4_r57_op_mod { + add29.left = r57.out; + add29.right = mult_pipe29.out; + mod_pipe57.left = add29.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s4_r57_op_mod[done] = A57.done; + } + group s4_r58_op_mod { + sub28.left = r56.out; + sub28.right = mult_pipe28.out; + mod_pipe58.left = sub28.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s4_r58_op_mod[done] = A58.done; + } + group s4_r59_op_mod { + sub29.left = r57.out; + sub29.right = mult_pipe29.out; + mod_pipe59.left = sub29.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s4_r59_op_mod[done] = A59.done; + } + group s4_r60_op_mod { + add30.left = r60.out; + add30.right = mult_pipe30.out; + mod_pipe60.left = add30.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s4_r60_op_mod[done] = A60.done; + } + group s4_r61_op_mod { + add31.left = r61.out; + add31.right = mult_pipe31.out; + mod_pipe61.left = add31.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s4_r61_op_mod[done] = A61.done; + } + group s4_r62_op_mod { + sub30.left = r60.out; + sub30.right = mult_pipe30.out; + mod_pipe62.left = sub30.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s4_r62_op_mod[done] = A62.done; + } + group s4_r63_op_mod { + sub31.left = r61.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s4_r63_op_mod[done] = A63.done; + } + group s5_r0_op_mod { + add0.left = r0.out; + add0.right = mult_pipe0.out; + mod_pipe0.left = add0.out; + mod_pipe0.right = 32'd193; + mod_pipe0.go = !mod_pipe0.done ? 1'd1; + A0.write_en = mod_pipe0.done; + A0.in = mod_pipe0.out_remainder; + s5_r0_op_mod[done] = A0.done; + } + group s5_r1_op_mod { + sub0.left = r0.out; + sub0.right = mult_pipe0.out; + mod_pipe1.left = sub0.out; + mod_pipe1.right = 32'd193; + mod_pipe1.go = !mod_pipe1.done ? 1'd1; + A1.write_en = mod_pipe1.done; + A1.in = mod_pipe1.out_remainder; + s5_r1_op_mod[done] = A1.done; + } + group s5_r2_op_mod { + add1.left = r2.out; + add1.right = mult_pipe1.out; + mod_pipe2.left = add1.out; + mod_pipe2.right = 32'd193; + mod_pipe2.go = !mod_pipe2.done ? 1'd1; + A2.write_en = mod_pipe2.done; + A2.in = mod_pipe2.out_remainder; + s5_r2_op_mod[done] = A2.done; + } + group s5_r3_op_mod { + sub1.left = r2.out; + sub1.right = mult_pipe1.out; + mod_pipe3.left = sub1.out; + mod_pipe3.right = 32'd193; + mod_pipe3.go = !mod_pipe3.done ? 1'd1; + A3.write_en = mod_pipe3.done; + A3.in = mod_pipe3.out_remainder; + s5_r3_op_mod[done] = A3.done; + } + group s5_r4_op_mod { + add2.left = r4.out; + add2.right = mult_pipe2.out; + mod_pipe4.left = add2.out; + mod_pipe4.right = 32'd193; + mod_pipe4.go = !mod_pipe4.done ? 1'd1; + A4.write_en = mod_pipe4.done; + A4.in = mod_pipe4.out_remainder; + s5_r4_op_mod[done] = A4.done; + } + group s5_r5_op_mod { + sub2.left = r4.out; + sub2.right = mult_pipe2.out; + mod_pipe5.left = sub2.out; + mod_pipe5.right = 32'd193; + mod_pipe5.go = !mod_pipe5.done ? 1'd1; + A5.write_en = mod_pipe5.done; + A5.in = mod_pipe5.out_remainder; + s5_r5_op_mod[done] = A5.done; + } + group s5_r6_op_mod { + add3.left = r6.out; + add3.right = mult_pipe3.out; + mod_pipe6.left = add3.out; + mod_pipe6.right = 32'd193; + mod_pipe6.go = !mod_pipe6.done ? 1'd1; + A6.write_en = mod_pipe6.done; + A6.in = mod_pipe6.out_remainder; + s5_r6_op_mod[done] = A6.done; + } + group s5_r7_op_mod { + sub3.left = r6.out; + sub3.right = mult_pipe3.out; + mod_pipe7.left = sub3.out; + mod_pipe7.right = 32'd193; + mod_pipe7.go = !mod_pipe7.done ? 1'd1; + A7.write_en = mod_pipe7.done; + A7.in = mod_pipe7.out_remainder; + s5_r7_op_mod[done] = A7.done; + } + group s5_r8_op_mod { + add4.left = r8.out; + add4.right = mult_pipe4.out; + mod_pipe8.left = add4.out; + mod_pipe8.right = 32'd193; + mod_pipe8.go = !mod_pipe8.done ? 1'd1; + A8.write_en = mod_pipe8.done; + A8.in = mod_pipe8.out_remainder; + s5_r8_op_mod[done] = A8.done; + } + group s5_r9_op_mod { + sub4.left = r8.out; + sub4.right = mult_pipe4.out; + mod_pipe9.left = sub4.out; + mod_pipe9.right = 32'd193; + mod_pipe9.go = !mod_pipe9.done ? 1'd1; + A9.write_en = mod_pipe9.done; + A9.in = mod_pipe9.out_remainder; + s5_r9_op_mod[done] = A9.done; + } + group s5_r10_op_mod { + add5.left = r10.out; + add5.right = mult_pipe5.out; + mod_pipe10.left = add5.out; + mod_pipe10.right = 32'd193; + mod_pipe10.go = !mod_pipe10.done ? 1'd1; + A10.write_en = mod_pipe10.done; + A10.in = mod_pipe10.out_remainder; + s5_r10_op_mod[done] = A10.done; + } + group s5_r11_op_mod { + sub5.left = r10.out; + sub5.right = mult_pipe5.out; + mod_pipe11.left = sub5.out; + mod_pipe11.right = 32'd193; + mod_pipe11.go = !mod_pipe11.done ? 1'd1; + A11.write_en = mod_pipe11.done; + A11.in = mod_pipe11.out_remainder; + s5_r11_op_mod[done] = A11.done; + } + group s5_r12_op_mod { + add6.left = r12.out; + add6.right = mult_pipe6.out; + mod_pipe12.left = add6.out; + mod_pipe12.right = 32'd193; + mod_pipe12.go = !mod_pipe12.done ? 1'd1; + A12.write_en = mod_pipe12.done; + A12.in = mod_pipe12.out_remainder; + s5_r12_op_mod[done] = A12.done; + } + group s5_r13_op_mod { + sub6.left = r12.out; + sub6.right = mult_pipe6.out; + mod_pipe13.left = sub6.out; + mod_pipe13.right = 32'd193; + mod_pipe13.go = !mod_pipe13.done ? 1'd1; + A13.write_en = mod_pipe13.done; + A13.in = mod_pipe13.out_remainder; + s5_r13_op_mod[done] = A13.done; + } + group s5_r14_op_mod { + add7.left = r14.out; + add7.right = mult_pipe7.out; + mod_pipe14.left = add7.out; + mod_pipe14.right = 32'd193; + mod_pipe14.go = !mod_pipe14.done ? 1'd1; + A14.write_en = mod_pipe14.done; + A14.in = mod_pipe14.out_remainder; + s5_r14_op_mod[done] = A14.done; + } + group s5_r15_op_mod { + sub7.left = r14.out; + sub7.right = mult_pipe7.out; + mod_pipe15.left = sub7.out; + mod_pipe15.right = 32'd193; + mod_pipe15.go = !mod_pipe15.done ? 1'd1; + A15.write_en = mod_pipe15.done; + A15.in = mod_pipe15.out_remainder; + s5_r15_op_mod[done] = A15.done; + } + group s5_r16_op_mod { + add8.left = r16.out; + add8.right = mult_pipe8.out; + mod_pipe16.left = add8.out; + mod_pipe16.right = 32'd193; + mod_pipe16.go = !mod_pipe16.done ? 1'd1; + A16.write_en = mod_pipe16.done; + A16.in = mod_pipe16.out_remainder; + s5_r16_op_mod[done] = A16.done; + } + group s5_r17_op_mod { + sub8.left = r16.out; + sub8.right = mult_pipe8.out; + mod_pipe17.left = sub8.out; + mod_pipe17.right = 32'd193; + mod_pipe17.go = !mod_pipe17.done ? 1'd1; + A17.write_en = mod_pipe17.done; + A17.in = mod_pipe17.out_remainder; + s5_r17_op_mod[done] = A17.done; + } + group s5_r18_op_mod { + add9.left = r18.out; + add9.right = mult_pipe9.out; + mod_pipe18.left = add9.out; + mod_pipe18.right = 32'd193; + mod_pipe18.go = !mod_pipe18.done ? 1'd1; + A18.write_en = mod_pipe18.done; + A18.in = mod_pipe18.out_remainder; + s5_r18_op_mod[done] = A18.done; + } + group s5_r19_op_mod { + sub9.left = r18.out; + sub9.right = mult_pipe9.out; + mod_pipe19.left = sub9.out; + mod_pipe19.right = 32'd193; + mod_pipe19.go = !mod_pipe19.done ? 1'd1; + A19.write_en = mod_pipe19.done; + A19.in = mod_pipe19.out_remainder; + s5_r19_op_mod[done] = A19.done; + } + group s5_r20_op_mod { + add10.left = r20.out; + add10.right = mult_pipe10.out; + mod_pipe20.left = add10.out; + mod_pipe20.right = 32'd193; + mod_pipe20.go = !mod_pipe20.done ? 1'd1; + A20.write_en = mod_pipe20.done; + A20.in = mod_pipe20.out_remainder; + s5_r20_op_mod[done] = A20.done; + } + group s5_r21_op_mod { + sub10.left = r20.out; + sub10.right = mult_pipe10.out; + mod_pipe21.left = sub10.out; + mod_pipe21.right = 32'd193; + mod_pipe21.go = !mod_pipe21.done ? 1'd1; + A21.write_en = mod_pipe21.done; + A21.in = mod_pipe21.out_remainder; + s5_r21_op_mod[done] = A21.done; + } + group s5_r22_op_mod { + add11.left = r22.out; + add11.right = mult_pipe11.out; + mod_pipe22.left = add11.out; + mod_pipe22.right = 32'd193; + mod_pipe22.go = !mod_pipe22.done ? 1'd1; + A22.write_en = mod_pipe22.done; + A22.in = mod_pipe22.out_remainder; + s5_r22_op_mod[done] = A22.done; + } + group s5_r23_op_mod { + sub11.left = r22.out; + sub11.right = mult_pipe11.out; + mod_pipe23.left = sub11.out; + mod_pipe23.right = 32'd193; + mod_pipe23.go = !mod_pipe23.done ? 1'd1; + A23.write_en = mod_pipe23.done; + A23.in = mod_pipe23.out_remainder; + s5_r23_op_mod[done] = A23.done; + } + group s5_r24_op_mod { + add12.left = r24.out; + add12.right = mult_pipe12.out; + mod_pipe24.left = add12.out; + mod_pipe24.right = 32'd193; + mod_pipe24.go = !mod_pipe24.done ? 1'd1; + A24.write_en = mod_pipe24.done; + A24.in = mod_pipe24.out_remainder; + s5_r24_op_mod[done] = A24.done; + } + group s5_r25_op_mod { + sub12.left = r24.out; + sub12.right = mult_pipe12.out; + mod_pipe25.left = sub12.out; + mod_pipe25.right = 32'd193; + mod_pipe25.go = !mod_pipe25.done ? 1'd1; + A25.write_en = mod_pipe25.done; + A25.in = mod_pipe25.out_remainder; + s5_r25_op_mod[done] = A25.done; + } + group s5_r26_op_mod { + add13.left = r26.out; + add13.right = mult_pipe13.out; + mod_pipe26.left = add13.out; + mod_pipe26.right = 32'd193; + mod_pipe26.go = !mod_pipe26.done ? 1'd1; + A26.write_en = mod_pipe26.done; + A26.in = mod_pipe26.out_remainder; + s5_r26_op_mod[done] = A26.done; + } + group s5_r27_op_mod { + sub13.left = r26.out; + sub13.right = mult_pipe13.out; + mod_pipe27.left = sub13.out; + mod_pipe27.right = 32'd193; + mod_pipe27.go = !mod_pipe27.done ? 1'd1; + A27.write_en = mod_pipe27.done; + A27.in = mod_pipe27.out_remainder; + s5_r27_op_mod[done] = A27.done; + } + group s5_r28_op_mod { + add14.left = r28.out; + add14.right = mult_pipe14.out; + mod_pipe28.left = add14.out; + mod_pipe28.right = 32'd193; + mod_pipe28.go = !mod_pipe28.done ? 1'd1; + A28.write_en = mod_pipe28.done; + A28.in = mod_pipe28.out_remainder; + s5_r28_op_mod[done] = A28.done; + } + group s5_r29_op_mod { + sub14.left = r28.out; + sub14.right = mult_pipe14.out; + mod_pipe29.left = sub14.out; + mod_pipe29.right = 32'd193; + mod_pipe29.go = !mod_pipe29.done ? 1'd1; + A29.write_en = mod_pipe29.done; + A29.in = mod_pipe29.out_remainder; + s5_r29_op_mod[done] = A29.done; + } + group s5_r30_op_mod { + add15.left = r30.out; + add15.right = mult_pipe15.out; + mod_pipe30.left = add15.out; + mod_pipe30.right = 32'd193; + mod_pipe30.go = !mod_pipe30.done ? 1'd1; + A30.write_en = mod_pipe30.done; + A30.in = mod_pipe30.out_remainder; + s5_r30_op_mod[done] = A30.done; + } + group s5_r31_op_mod { + sub15.left = r30.out; + sub15.right = mult_pipe15.out; + mod_pipe31.left = sub15.out; + mod_pipe31.right = 32'd193; + mod_pipe31.go = !mod_pipe31.done ? 1'd1; + A31.write_en = mod_pipe31.done; + A31.in = mod_pipe31.out_remainder; + s5_r31_op_mod[done] = A31.done; + } + group s5_r32_op_mod { + add16.left = r32.out; + add16.right = mult_pipe16.out; + mod_pipe32.left = add16.out; + mod_pipe32.right = 32'd193; + mod_pipe32.go = !mod_pipe32.done ? 1'd1; + A32.write_en = mod_pipe32.done; + A32.in = mod_pipe32.out_remainder; + s5_r32_op_mod[done] = A32.done; + } + group s5_r33_op_mod { + sub16.left = r32.out; + sub16.right = mult_pipe16.out; + mod_pipe33.left = sub16.out; + mod_pipe33.right = 32'd193; + mod_pipe33.go = !mod_pipe33.done ? 1'd1; + A33.write_en = mod_pipe33.done; + A33.in = mod_pipe33.out_remainder; + s5_r33_op_mod[done] = A33.done; + } + group s5_r34_op_mod { + add17.left = r34.out; + add17.right = mult_pipe17.out; + mod_pipe34.left = add17.out; + mod_pipe34.right = 32'd193; + mod_pipe34.go = !mod_pipe34.done ? 1'd1; + A34.write_en = mod_pipe34.done; + A34.in = mod_pipe34.out_remainder; + s5_r34_op_mod[done] = A34.done; + } + group s5_r35_op_mod { + sub17.left = r34.out; + sub17.right = mult_pipe17.out; + mod_pipe35.left = sub17.out; + mod_pipe35.right = 32'd193; + mod_pipe35.go = !mod_pipe35.done ? 1'd1; + A35.write_en = mod_pipe35.done; + A35.in = mod_pipe35.out_remainder; + s5_r35_op_mod[done] = A35.done; + } + group s5_r36_op_mod { + add18.left = r36.out; + add18.right = mult_pipe18.out; + mod_pipe36.left = add18.out; + mod_pipe36.right = 32'd193; + mod_pipe36.go = !mod_pipe36.done ? 1'd1; + A36.write_en = mod_pipe36.done; + A36.in = mod_pipe36.out_remainder; + s5_r36_op_mod[done] = A36.done; + } + group s5_r37_op_mod { + sub18.left = r36.out; + sub18.right = mult_pipe18.out; + mod_pipe37.left = sub18.out; + mod_pipe37.right = 32'd193; + mod_pipe37.go = !mod_pipe37.done ? 1'd1; + A37.write_en = mod_pipe37.done; + A37.in = mod_pipe37.out_remainder; + s5_r37_op_mod[done] = A37.done; + } + group s5_r38_op_mod { + add19.left = r38.out; + add19.right = mult_pipe19.out; + mod_pipe38.left = add19.out; + mod_pipe38.right = 32'd193; + mod_pipe38.go = !mod_pipe38.done ? 1'd1; + A38.write_en = mod_pipe38.done; + A38.in = mod_pipe38.out_remainder; + s5_r38_op_mod[done] = A38.done; + } + group s5_r39_op_mod { + sub19.left = r38.out; + sub19.right = mult_pipe19.out; + mod_pipe39.left = sub19.out; + mod_pipe39.right = 32'd193; + mod_pipe39.go = !mod_pipe39.done ? 1'd1; + A39.write_en = mod_pipe39.done; + A39.in = mod_pipe39.out_remainder; + s5_r39_op_mod[done] = A39.done; + } + group s5_r40_op_mod { + add20.left = r40.out; + add20.right = mult_pipe20.out; + mod_pipe40.left = add20.out; + mod_pipe40.right = 32'd193; + mod_pipe40.go = !mod_pipe40.done ? 1'd1; + A40.write_en = mod_pipe40.done; + A40.in = mod_pipe40.out_remainder; + s5_r40_op_mod[done] = A40.done; + } + group s5_r41_op_mod { + sub20.left = r40.out; + sub20.right = mult_pipe20.out; + mod_pipe41.left = sub20.out; + mod_pipe41.right = 32'd193; + mod_pipe41.go = !mod_pipe41.done ? 1'd1; + A41.write_en = mod_pipe41.done; + A41.in = mod_pipe41.out_remainder; + s5_r41_op_mod[done] = A41.done; + } + group s5_r42_op_mod { + add21.left = r42.out; + add21.right = mult_pipe21.out; + mod_pipe42.left = add21.out; + mod_pipe42.right = 32'd193; + mod_pipe42.go = !mod_pipe42.done ? 1'd1; + A42.write_en = mod_pipe42.done; + A42.in = mod_pipe42.out_remainder; + s5_r42_op_mod[done] = A42.done; + } + group s5_r43_op_mod { + sub21.left = r42.out; + sub21.right = mult_pipe21.out; + mod_pipe43.left = sub21.out; + mod_pipe43.right = 32'd193; + mod_pipe43.go = !mod_pipe43.done ? 1'd1; + A43.write_en = mod_pipe43.done; + A43.in = mod_pipe43.out_remainder; + s5_r43_op_mod[done] = A43.done; + } + group s5_r44_op_mod { + add22.left = r44.out; + add22.right = mult_pipe22.out; + mod_pipe44.left = add22.out; + mod_pipe44.right = 32'd193; + mod_pipe44.go = !mod_pipe44.done ? 1'd1; + A44.write_en = mod_pipe44.done; + A44.in = mod_pipe44.out_remainder; + s5_r44_op_mod[done] = A44.done; + } + group s5_r45_op_mod { + sub22.left = r44.out; + sub22.right = mult_pipe22.out; + mod_pipe45.left = sub22.out; + mod_pipe45.right = 32'd193; + mod_pipe45.go = !mod_pipe45.done ? 1'd1; + A45.write_en = mod_pipe45.done; + A45.in = mod_pipe45.out_remainder; + s5_r45_op_mod[done] = A45.done; + } + group s5_r46_op_mod { + add23.left = r46.out; + add23.right = mult_pipe23.out; + mod_pipe46.left = add23.out; + mod_pipe46.right = 32'd193; + mod_pipe46.go = !mod_pipe46.done ? 1'd1; + A46.write_en = mod_pipe46.done; + A46.in = mod_pipe46.out_remainder; + s5_r46_op_mod[done] = A46.done; + } + group s5_r47_op_mod { + sub23.left = r46.out; + sub23.right = mult_pipe23.out; + mod_pipe47.left = sub23.out; + mod_pipe47.right = 32'd193; + mod_pipe47.go = !mod_pipe47.done ? 1'd1; + A47.write_en = mod_pipe47.done; + A47.in = mod_pipe47.out_remainder; + s5_r47_op_mod[done] = A47.done; + } + group s5_r48_op_mod { + add24.left = r48.out; + add24.right = mult_pipe24.out; + mod_pipe48.left = add24.out; + mod_pipe48.right = 32'd193; + mod_pipe48.go = !mod_pipe48.done ? 1'd1; + A48.write_en = mod_pipe48.done; + A48.in = mod_pipe48.out_remainder; + s5_r48_op_mod[done] = A48.done; + } + group s5_r49_op_mod { + sub24.left = r48.out; + sub24.right = mult_pipe24.out; + mod_pipe49.left = sub24.out; + mod_pipe49.right = 32'd193; + mod_pipe49.go = !mod_pipe49.done ? 1'd1; + A49.write_en = mod_pipe49.done; + A49.in = mod_pipe49.out_remainder; + s5_r49_op_mod[done] = A49.done; + } + group s5_r50_op_mod { + add25.left = r50.out; + add25.right = mult_pipe25.out; + mod_pipe50.left = add25.out; + mod_pipe50.right = 32'd193; + mod_pipe50.go = !mod_pipe50.done ? 1'd1; + A50.write_en = mod_pipe50.done; + A50.in = mod_pipe50.out_remainder; + s5_r50_op_mod[done] = A50.done; + } + group s5_r51_op_mod { + sub25.left = r50.out; + sub25.right = mult_pipe25.out; + mod_pipe51.left = sub25.out; + mod_pipe51.right = 32'd193; + mod_pipe51.go = !mod_pipe51.done ? 1'd1; + A51.write_en = mod_pipe51.done; + A51.in = mod_pipe51.out_remainder; + s5_r51_op_mod[done] = A51.done; + } + group s5_r52_op_mod { + add26.left = r52.out; + add26.right = mult_pipe26.out; + mod_pipe52.left = add26.out; + mod_pipe52.right = 32'd193; + mod_pipe52.go = !mod_pipe52.done ? 1'd1; + A52.write_en = mod_pipe52.done; + A52.in = mod_pipe52.out_remainder; + s5_r52_op_mod[done] = A52.done; + } + group s5_r53_op_mod { + sub26.left = r52.out; + sub26.right = mult_pipe26.out; + mod_pipe53.left = sub26.out; + mod_pipe53.right = 32'd193; + mod_pipe53.go = !mod_pipe53.done ? 1'd1; + A53.write_en = mod_pipe53.done; + A53.in = mod_pipe53.out_remainder; + s5_r53_op_mod[done] = A53.done; + } + group s5_r54_op_mod { + add27.left = r54.out; + add27.right = mult_pipe27.out; + mod_pipe54.left = add27.out; + mod_pipe54.right = 32'd193; + mod_pipe54.go = !mod_pipe54.done ? 1'd1; + A54.write_en = mod_pipe54.done; + A54.in = mod_pipe54.out_remainder; + s5_r54_op_mod[done] = A54.done; + } + group s5_r55_op_mod { + sub27.left = r54.out; + sub27.right = mult_pipe27.out; + mod_pipe55.left = sub27.out; + mod_pipe55.right = 32'd193; + mod_pipe55.go = !mod_pipe55.done ? 1'd1; + A55.write_en = mod_pipe55.done; + A55.in = mod_pipe55.out_remainder; + s5_r55_op_mod[done] = A55.done; + } + group s5_r56_op_mod { + add28.left = r56.out; + add28.right = mult_pipe28.out; + mod_pipe56.left = add28.out; + mod_pipe56.right = 32'd193; + mod_pipe56.go = !mod_pipe56.done ? 1'd1; + A56.write_en = mod_pipe56.done; + A56.in = mod_pipe56.out_remainder; + s5_r56_op_mod[done] = A56.done; + } + group s5_r57_op_mod { + sub28.left = r56.out; + sub28.right = mult_pipe28.out; + mod_pipe57.left = sub28.out; + mod_pipe57.right = 32'd193; + mod_pipe57.go = !mod_pipe57.done ? 1'd1; + A57.write_en = mod_pipe57.done; + A57.in = mod_pipe57.out_remainder; + s5_r57_op_mod[done] = A57.done; + } + group s5_r58_op_mod { + add29.left = r58.out; + add29.right = mult_pipe29.out; + mod_pipe58.left = add29.out; + mod_pipe58.right = 32'd193; + mod_pipe58.go = !mod_pipe58.done ? 1'd1; + A58.write_en = mod_pipe58.done; + A58.in = mod_pipe58.out_remainder; + s5_r58_op_mod[done] = A58.done; + } + group s5_r59_op_mod { + sub29.left = r58.out; + sub29.right = mult_pipe29.out; + mod_pipe59.left = sub29.out; + mod_pipe59.right = 32'd193; + mod_pipe59.go = !mod_pipe59.done ? 1'd1; + A59.write_en = mod_pipe59.done; + A59.in = mod_pipe59.out_remainder; + s5_r59_op_mod[done] = A59.done; + } + group s5_r60_op_mod { + add30.left = r60.out; + add30.right = mult_pipe30.out; + mod_pipe60.left = add30.out; + mod_pipe60.right = 32'd193; + mod_pipe60.go = !mod_pipe60.done ? 1'd1; + A60.write_en = mod_pipe60.done; + A60.in = mod_pipe60.out_remainder; + s5_r60_op_mod[done] = A60.done; + } + group s5_r61_op_mod { + sub30.left = r60.out; + sub30.right = mult_pipe30.out; + mod_pipe61.left = sub30.out; + mod_pipe61.right = 32'd193; + mod_pipe61.go = !mod_pipe61.done ? 1'd1; + A61.write_en = mod_pipe61.done; + A61.in = mod_pipe61.out_remainder; + s5_r61_op_mod[done] = A61.done; + } + group s5_r62_op_mod { + add31.left = r62.out; + add31.right = mult_pipe31.out; + mod_pipe62.left = add31.out; + mod_pipe62.right = 32'd193; + mod_pipe62.go = !mod_pipe62.done ? 1'd1; + A62.write_en = mod_pipe62.done; + A62.in = mod_pipe62.out_remainder; + s5_r62_op_mod[done] = A62.done; + } + group s5_r63_op_mod { + sub31.left = r62.out; + sub31.right = mult_pipe31.out; + mod_pipe63.left = sub31.out; + mod_pipe63.right = 32'd193; + mod_pipe63.go = !mod_pipe63.done ? 1'd1; + A63.write_en = mod_pipe63.done; + A63.in = mod_pipe63.out_remainder; + s5_r63_op_mod[done] = A63.done; + } + group epilogue_0 { + a.addr0 = 7'd0; + a.write_en = 1'd1; + a.write_data = A0.out; + epilogue_0[done] = a.done; + } + group epilogue_1 { + a.addr0 = 7'd1; + a.write_en = 1'd1; + a.write_data = A1.out; + epilogue_1[done] = a.done; + } + group epilogue_2 { + a.addr0 = 7'd2; + a.write_en = 1'd1; + a.write_data = A2.out; + epilogue_2[done] = a.done; + } + group epilogue_3 { + a.addr0 = 7'd3; + a.write_en = 1'd1; + a.write_data = A3.out; + epilogue_3[done] = a.done; + } + group epilogue_4 { + a.addr0 = 7'd4; + a.write_en = 1'd1; + a.write_data = A4.out; + epilogue_4[done] = a.done; + } + group epilogue_5 { + a.addr0 = 7'd5; + a.write_en = 1'd1; + a.write_data = A5.out; + epilogue_5[done] = a.done; + } + group epilogue_6 { + a.addr0 = 7'd6; + a.write_en = 1'd1; + a.write_data = A6.out; + epilogue_6[done] = a.done; + } + group epilogue_7 { + a.addr0 = 7'd7; + a.write_en = 1'd1; + a.write_data = A7.out; + epilogue_7[done] = a.done; + } + group epilogue_8 { + a.addr0 = 7'd8; + a.write_en = 1'd1; + a.write_data = A8.out; + epilogue_8[done] = a.done; + } + group epilogue_9 { + a.addr0 = 7'd9; + a.write_en = 1'd1; + a.write_data = A9.out; + epilogue_9[done] = a.done; + } + group epilogue_10 { + a.addr0 = 7'd10; + a.write_en = 1'd1; + a.write_data = A10.out; + epilogue_10[done] = a.done; + } + group epilogue_11 { + a.addr0 = 7'd11; + a.write_en = 1'd1; + a.write_data = A11.out; + epilogue_11[done] = a.done; + } + group epilogue_12 { + a.addr0 = 7'd12; + a.write_en = 1'd1; + a.write_data = A12.out; + epilogue_12[done] = a.done; + } + group epilogue_13 { + a.addr0 = 7'd13; + a.write_en = 1'd1; + a.write_data = A13.out; + epilogue_13[done] = a.done; + } + group epilogue_14 { + a.addr0 = 7'd14; + a.write_en = 1'd1; + a.write_data = A14.out; + epilogue_14[done] = a.done; + } + group epilogue_15 { + a.addr0 = 7'd15; + a.write_en = 1'd1; + a.write_data = A15.out; + epilogue_15[done] = a.done; + } + group epilogue_16 { + a.addr0 = 7'd16; + a.write_en = 1'd1; + a.write_data = A16.out; + epilogue_16[done] = a.done; + } + group epilogue_17 { + a.addr0 = 7'd17; + a.write_en = 1'd1; + a.write_data = A17.out; + epilogue_17[done] = a.done; + } + group epilogue_18 { + a.addr0 = 7'd18; + a.write_en = 1'd1; + a.write_data = A18.out; + epilogue_18[done] = a.done; + } + group epilogue_19 { + a.addr0 = 7'd19; + a.write_en = 1'd1; + a.write_data = A19.out; + epilogue_19[done] = a.done; + } + group epilogue_20 { + a.addr0 = 7'd20; + a.write_en = 1'd1; + a.write_data = A20.out; + epilogue_20[done] = a.done; + } + group epilogue_21 { + a.addr0 = 7'd21; + a.write_en = 1'd1; + a.write_data = A21.out; + epilogue_21[done] = a.done; + } + group epilogue_22 { + a.addr0 = 7'd22; + a.write_en = 1'd1; + a.write_data = A22.out; + epilogue_22[done] = a.done; + } + group epilogue_23 { + a.addr0 = 7'd23; + a.write_en = 1'd1; + a.write_data = A23.out; + epilogue_23[done] = a.done; + } + group epilogue_24 { + a.addr0 = 7'd24; + a.write_en = 1'd1; + a.write_data = A24.out; + epilogue_24[done] = a.done; + } + group epilogue_25 { + a.addr0 = 7'd25; + a.write_en = 1'd1; + a.write_data = A25.out; + epilogue_25[done] = a.done; + } + group epilogue_26 { + a.addr0 = 7'd26; + a.write_en = 1'd1; + a.write_data = A26.out; + epilogue_26[done] = a.done; + } + group epilogue_27 { + a.addr0 = 7'd27; + a.write_en = 1'd1; + a.write_data = A27.out; + epilogue_27[done] = a.done; + } + group epilogue_28 { + a.addr0 = 7'd28; + a.write_en = 1'd1; + a.write_data = A28.out; + epilogue_28[done] = a.done; + } + group epilogue_29 { + a.addr0 = 7'd29; + a.write_en = 1'd1; + a.write_data = A29.out; + epilogue_29[done] = a.done; + } + group epilogue_30 { + a.addr0 = 7'd30; + a.write_en = 1'd1; + a.write_data = A30.out; + epilogue_30[done] = a.done; + } + group epilogue_31 { + a.addr0 = 7'd31; + a.write_en = 1'd1; + a.write_data = A31.out; + epilogue_31[done] = a.done; + } + group epilogue_32 { + a.addr0 = 7'd32; + a.write_en = 1'd1; + a.write_data = A32.out; + epilogue_32[done] = a.done; + } + group epilogue_33 { + a.addr0 = 7'd33; + a.write_en = 1'd1; + a.write_data = A33.out; + epilogue_33[done] = a.done; + } + group epilogue_34 { + a.addr0 = 7'd34; + a.write_en = 1'd1; + a.write_data = A34.out; + epilogue_34[done] = a.done; + } + group epilogue_35 { + a.addr0 = 7'd35; + a.write_en = 1'd1; + a.write_data = A35.out; + epilogue_35[done] = a.done; + } + group epilogue_36 { + a.addr0 = 7'd36; + a.write_en = 1'd1; + a.write_data = A36.out; + epilogue_36[done] = a.done; + } + group epilogue_37 { + a.addr0 = 7'd37; + a.write_en = 1'd1; + a.write_data = A37.out; + epilogue_37[done] = a.done; + } + group epilogue_38 { + a.addr0 = 7'd38; + a.write_en = 1'd1; + a.write_data = A38.out; + epilogue_38[done] = a.done; + } + group epilogue_39 { + a.addr0 = 7'd39; + a.write_en = 1'd1; + a.write_data = A39.out; + epilogue_39[done] = a.done; + } + group epilogue_40 { + a.addr0 = 7'd40; + a.write_en = 1'd1; + a.write_data = A40.out; + epilogue_40[done] = a.done; + } + group epilogue_41 { + a.addr0 = 7'd41; + a.write_en = 1'd1; + a.write_data = A41.out; + epilogue_41[done] = a.done; + } + group epilogue_42 { + a.addr0 = 7'd42; + a.write_en = 1'd1; + a.write_data = A42.out; + epilogue_42[done] = a.done; + } + group epilogue_43 { + a.addr0 = 7'd43; + a.write_en = 1'd1; + a.write_data = A43.out; + epilogue_43[done] = a.done; + } + group epilogue_44 { + a.addr0 = 7'd44; + a.write_en = 1'd1; + a.write_data = A44.out; + epilogue_44[done] = a.done; + } + group epilogue_45 { + a.addr0 = 7'd45; + a.write_en = 1'd1; + a.write_data = A45.out; + epilogue_45[done] = a.done; + } + group epilogue_46 { + a.addr0 = 7'd46; + a.write_en = 1'd1; + a.write_data = A46.out; + epilogue_46[done] = a.done; + } + group epilogue_47 { + a.addr0 = 7'd47; + a.write_en = 1'd1; + a.write_data = A47.out; + epilogue_47[done] = a.done; + } + group epilogue_48 { + a.addr0 = 7'd48; + a.write_en = 1'd1; + a.write_data = A48.out; + epilogue_48[done] = a.done; + } + group epilogue_49 { + a.addr0 = 7'd49; + a.write_en = 1'd1; + a.write_data = A49.out; + epilogue_49[done] = a.done; + } + group epilogue_50 { + a.addr0 = 7'd50; + a.write_en = 1'd1; + a.write_data = A50.out; + epilogue_50[done] = a.done; + } + group epilogue_51 { + a.addr0 = 7'd51; + a.write_en = 1'd1; + a.write_data = A51.out; + epilogue_51[done] = a.done; + } + group epilogue_52 { + a.addr0 = 7'd52; + a.write_en = 1'd1; + a.write_data = A52.out; + epilogue_52[done] = a.done; + } + group epilogue_53 { + a.addr0 = 7'd53; + a.write_en = 1'd1; + a.write_data = A53.out; + epilogue_53[done] = a.done; + } + group epilogue_54 { + a.addr0 = 7'd54; + a.write_en = 1'd1; + a.write_data = A54.out; + epilogue_54[done] = a.done; + } + group epilogue_55 { + a.addr0 = 7'd55; + a.write_en = 1'd1; + a.write_data = A55.out; + epilogue_55[done] = a.done; + } + group epilogue_56 { + a.addr0 = 7'd56; + a.write_en = 1'd1; + a.write_data = A56.out; + epilogue_56[done] = a.done; + } + group epilogue_57 { + a.addr0 = 7'd57; + a.write_en = 1'd1; + a.write_data = A57.out; + epilogue_57[done] = a.done; + } + group epilogue_58 { + a.addr0 = 7'd58; + a.write_en = 1'd1; + a.write_data = A58.out; + epilogue_58[done] = a.done; + } + group epilogue_59 { + a.addr0 = 7'd59; + a.write_en = 1'd1; + a.write_data = A59.out; + epilogue_59[done] = a.done; + } + group epilogue_60 { + a.addr0 = 7'd60; + a.write_en = 1'd1; + a.write_data = A60.out; + epilogue_60[done] = a.done; + } + group epilogue_61 { + a.addr0 = 7'd61; + a.write_en = 1'd1; + a.write_data = A61.out; + epilogue_61[done] = a.done; + } + group epilogue_62 { + a.addr0 = 7'd62; + a.write_en = 1'd1; + a.write_data = A62.out; + epilogue_62[done] = a.done; + } + group epilogue_63 { + a.addr0 = 7'd63; + a.write_en = 1'd1; + a.write_data = A63.out; + epilogue_63[done] = a.done; + } + } + control { + seq { + seq { + preamble_0; + preamble_1; + preamble_2; + preamble_3; + preamble_4; + preamble_5; + preamble_6; + preamble_7; + preamble_8; + preamble_9; + preamble_10; + preamble_11; + preamble_12; + preamble_13; + preamble_14; + preamble_15; + preamble_16; + preamble_17; + preamble_18; + preamble_19; + preamble_20; + preamble_21; + preamble_22; + preamble_23; + preamble_24; + preamble_25; + preamble_26; + preamble_27; + preamble_28; + preamble_29; + preamble_30; + preamble_31; + preamble_32; + preamble_33; + preamble_34; + preamble_35; + preamble_36; + preamble_37; + preamble_38; + preamble_39; + preamble_40; + preamble_41; + preamble_42; + preamble_43; + preamble_44; + preamble_45; + preamble_46; + preamble_47; + preamble_48; + preamble_49; + preamble_50; + preamble_51; + preamble_52; + preamble_53; + preamble_54; + preamble_55; + preamble_56; + preamble_57; + preamble_58; + preamble_59; + preamble_60; + preamble_61; + preamble_62; + preamble_63; + } + par { + s0_mul0; + s0_mul1; + s0_mul2; + s0_mul3; + s0_mul4; + s0_mul5; + s0_mul6; + s0_mul7; + s0_mul8; + s0_mul9; + s0_mul10; + s0_mul11; + s0_mul12; + s0_mul13; + s0_mul14; + s0_mul15; + s0_mul16; + s0_mul17; + s0_mul18; + s0_mul19; + s0_mul20; + s0_mul21; + s0_mul22; + s0_mul23; + s0_mul24; + s0_mul25; + s0_mul26; + s0_mul27; + s0_mul28; + s0_mul29; + s0_mul30; + s0_mul31; + } + par { + s0_r0_op_mod; + s0_r1_op_mod; + s0_r2_op_mod; + s0_r3_op_mod; + s0_r4_op_mod; + s0_r5_op_mod; + s0_r6_op_mod; + s0_r7_op_mod; + s0_r8_op_mod; + s0_r9_op_mod; + s0_r10_op_mod; + s0_r11_op_mod; + s0_r12_op_mod; + s0_r13_op_mod; + s0_r14_op_mod; + s0_r15_op_mod; + s0_r16_op_mod; + s0_r17_op_mod; + s0_r18_op_mod; + s0_r19_op_mod; + s0_r20_op_mod; + s0_r21_op_mod; + s0_r22_op_mod; + s0_r23_op_mod; + s0_r24_op_mod; + s0_r25_op_mod; + s0_r26_op_mod; + s0_r27_op_mod; + s0_r28_op_mod; + s0_r29_op_mod; + s0_r30_op_mod; + s0_r31_op_mod; + s0_r32_op_mod; + s0_r33_op_mod; + s0_r34_op_mod; + s0_r35_op_mod; + s0_r36_op_mod; + s0_r37_op_mod; + s0_r38_op_mod; + s0_r39_op_mod; + s0_r40_op_mod; + s0_r41_op_mod; + s0_r42_op_mod; + s0_r43_op_mod; + s0_r44_op_mod; + s0_r45_op_mod; + s0_r46_op_mod; + s0_r47_op_mod; + s0_r48_op_mod; + s0_r49_op_mod; + s0_r50_op_mod; + s0_r51_op_mod; + s0_r52_op_mod; + s0_r53_op_mod; + s0_r54_op_mod; + s0_r55_op_mod; + s0_r56_op_mod; + s0_r57_op_mod; + s0_r58_op_mod; + s0_r59_op_mod; + s0_r60_op_mod; + s0_r61_op_mod; + s0_r62_op_mod; + s0_r63_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + precursor_32; + precursor_33; + precursor_34; + precursor_35; + precursor_36; + precursor_37; + precursor_38; + precursor_39; + precursor_40; + precursor_41; + precursor_42; + precursor_43; + precursor_44; + precursor_45; + precursor_46; + precursor_47; + precursor_48; + precursor_49; + precursor_50; + precursor_51; + precursor_52; + precursor_53; + precursor_54; + precursor_55; + precursor_56; + precursor_57; + precursor_58; + precursor_59; + precursor_60; + precursor_61; + precursor_62; + precursor_63; + } + par { + s1_mul0; + s1_mul1; + s1_mul2; + s1_mul3; + s1_mul4; + s1_mul5; + s1_mul6; + s1_mul7; + s1_mul8; + s1_mul9; + s1_mul10; + s1_mul11; + s1_mul12; + s1_mul13; + s1_mul14; + s1_mul15; + s1_mul16; + s1_mul17; + s1_mul18; + s1_mul19; + s1_mul20; + s1_mul21; + s1_mul22; + s1_mul23; + s1_mul24; + s1_mul25; + s1_mul26; + s1_mul27; + s1_mul28; + s1_mul29; + s1_mul30; + s1_mul31; + } + par { + s1_r0_op_mod; + s1_r1_op_mod; + s1_r2_op_mod; + s1_r3_op_mod; + s1_r4_op_mod; + s1_r5_op_mod; + s1_r6_op_mod; + s1_r7_op_mod; + s1_r8_op_mod; + s1_r9_op_mod; + s1_r10_op_mod; + s1_r11_op_mod; + s1_r12_op_mod; + s1_r13_op_mod; + s1_r14_op_mod; + s1_r15_op_mod; + s1_r16_op_mod; + s1_r17_op_mod; + s1_r18_op_mod; + s1_r19_op_mod; + s1_r20_op_mod; + s1_r21_op_mod; + s1_r22_op_mod; + s1_r23_op_mod; + s1_r24_op_mod; + s1_r25_op_mod; + s1_r26_op_mod; + s1_r27_op_mod; + s1_r28_op_mod; + s1_r29_op_mod; + s1_r30_op_mod; + s1_r31_op_mod; + s1_r32_op_mod; + s1_r33_op_mod; + s1_r34_op_mod; + s1_r35_op_mod; + s1_r36_op_mod; + s1_r37_op_mod; + s1_r38_op_mod; + s1_r39_op_mod; + s1_r40_op_mod; + s1_r41_op_mod; + s1_r42_op_mod; + s1_r43_op_mod; + s1_r44_op_mod; + s1_r45_op_mod; + s1_r46_op_mod; + s1_r47_op_mod; + s1_r48_op_mod; + s1_r49_op_mod; + s1_r50_op_mod; + s1_r51_op_mod; + s1_r52_op_mod; + s1_r53_op_mod; + s1_r54_op_mod; + s1_r55_op_mod; + s1_r56_op_mod; + s1_r57_op_mod; + s1_r58_op_mod; + s1_r59_op_mod; + s1_r60_op_mod; + s1_r61_op_mod; + s1_r62_op_mod; + s1_r63_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + precursor_32; + precursor_33; + precursor_34; + precursor_35; + precursor_36; + precursor_37; + precursor_38; + precursor_39; + precursor_40; + precursor_41; + precursor_42; + precursor_43; + precursor_44; + precursor_45; + precursor_46; + precursor_47; + precursor_48; + precursor_49; + precursor_50; + precursor_51; + precursor_52; + precursor_53; + precursor_54; + precursor_55; + precursor_56; + precursor_57; + precursor_58; + precursor_59; + precursor_60; + precursor_61; + precursor_62; + precursor_63; + } + par { + s2_mul0; + s2_mul1; + s2_mul2; + s2_mul3; + s2_mul4; + s2_mul5; + s2_mul6; + s2_mul7; + s2_mul8; + s2_mul9; + s2_mul10; + s2_mul11; + s2_mul12; + s2_mul13; + s2_mul14; + s2_mul15; + s2_mul16; + s2_mul17; + s2_mul18; + s2_mul19; + s2_mul20; + s2_mul21; + s2_mul22; + s2_mul23; + s2_mul24; + s2_mul25; + s2_mul26; + s2_mul27; + s2_mul28; + s2_mul29; + s2_mul30; + s2_mul31; + } + par { + s2_r0_op_mod; + s2_r1_op_mod; + s2_r2_op_mod; + s2_r3_op_mod; + s2_r4_op_mod; + s2_r5_op_mod; + s2_r6_op_mod; + s2_r7_op_mod; + s2_r8_op_mod; + s2_r9_op_mod; + s2_r10_op_mod; + s2_r11_op_mod; + s2_r12_op_mod; + s2_r13_op_mod; + s2_r14_op_mod; + s2_r15_op_mod; + s2_r16_op_mod; + s2_r17_op_mod; + s2_r18_op_mod; + s2_r19_op_mod; + s2_r20_op_mod; + s2_r21_op_mod; + s2_r22_op_mod; + s2_r23_op_mod; + s2_r24_op_mod; + s2_r25_op_mod; + s2_r26_op_mod; + s2_r27_op_mod; + s2_r28_op_mod; + s2_r29_op_mod; + s2_r30_op_mod; + s2_r31_op_mod; + s2_r32_op_mod; + s2_r33_op_mod; + s2_r34_op_mod; + s2_r35_op_mod; + s2_r36_op_mod; + s2_r37_op_mod; + s2_r38_op_mod; + s2_r39_op_mod; + s2_r40_op_mod; + s2_r41_op_mod; + s2_r42_op_mod; + s2_r43_op_mod; + s2_r44_op_mod; + s2_r45_op_mod; + s2_r46_op_mod; + s2_r47_op_mod; + s2_r48_op_mod; + s2_r49_op_mod; + s2_r50_op_mod; + s2_r51_op_mod; + s2_r52_op_mod; + s2_r53_op_mod; + s2_r54_op_mod; + s2_r55_op_mod; + s2_r56_op_mod; + s2_r57_op_mod; + s2_r58_op_mod; + s2_r59_op_mod; + s2_r60_op_mod; + s2_r61_op_mod; + s2_r62_op_mod; + s2_r63_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + precursor_32; + precursor_33; + precursor_34; + precursor_35; + precursor_36; + precursor_37; + precursor_38; + precursor_39; + precursor_40; + precursor_41; + precursor_42; + precursor_43; + precursor_44; + precursor_45; + precursor_46; + precursor_47; + precursor_48; + precursor_49; + precursor_50; + precursor_51; + precursor_52; + precursor_53; + precursor_54; + precursor_55; + precursor_56; + precursor_57; + precursor_58; + precursor_59; + precursor_60; + precursor_61; + precursor_62; + precursor_63; + } + par { + s3_mul0; + s3_mul1; + s3_mul2; + s3_mul3; + s3_mul4; + s3_mul5; + s3_mul6; + s3_mul7; + s3_mul8; + s3_mul9; + s3_mul10; + s3_mul11; + s3_mul12; + s3_mul13; + s3_mul14; + s3_mul15; + s3_mul16; + s3_mul17; + s3_mul18; + s3_mul19; + s3_mul20; + s3_mul21; + s3_mul22; + s3_mul23; + s3_mul24; + s3_mul25; + s3_mul26; + s3_mul27; + s3_mul28; + s3_mul29; + s3_mul30; + s3_mul31; + } + par { + s3_r0_op_mod; + s3_r1_op_mod; + s3_r2_op_mod; + s3_r3_op_mod; + s3_r4_op_mod; + s3_r5_op_mod; + s3_r6_op_mod; + s3_r7_op_mod; + s3_r8_op_mod; + s3_r9_op_mod; + s3_r10_op_mod; + s3_r11_op_mod; + s3_r12_op_mod; + s3_r13_op_mod; + s3_r14_op_mod; + s3_r15_op_mod; + s3_r16_op_mod; + s3_r17_op_mod; + s3_r18_op_mod; + s3_r19_op_mod; + s3_r20_op_mod; + s3_r21_op_mod; + s3_r22_op_mod; + s3_r23_op_mod; + s3_r24_op_mod; + s3_r25_op_mod; + s3_r26_op_mod; + s3_r27_op_mod; + s3_r28_op_mod; + s3_r29_op_mod; + s3_r30_op_mod; + s3_r31_op_mod; + s3_r32_op_mod; + s3_r33_op_mod; + s3_r34_op_mod; + s3_r35_op_mod; + s3_r36_op_mod; + s3_r37_op_mod; + s3_r38_op_mod; + s3_r39_op_mod; + s3_r40_op_mod; + s3_r41_op_mod; + s3_r42_op_mod; + s3_r43_op_mod; + s3_r44_op_mod; + s3_r45_op_mod; + s3_r46_op_mod; + s3_r47_op_mod; + s3_r48_op_mod; + s3_r49_op_mod; + s3_r50_op_mod; + s3_r51_op_mod; + s3_r52_op_mod; + s3_r53_op_mod; + s3_r54_op_mod; + s3_r55_op_mod; + s3_r56_op_mod; + s3_r57_op_mod; + s3_r58_op_mod; + s3_r59_op_mod; + s3_r60_op_mod; + s3_r61_op_mod; + s3_r62_op_mod; + s3_r63_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + precursor_32; + precursor_33; + precursor_34; + precursor_35; + precursor_36; + precursor_37; + precursor_38; + precursor_39; + precursor_40; + precursor_41; + precursor_42; + precursor_43; + precursor_44; + precursor_45; + precursor_46; + precursor_47; + precursor_48; + precursor_49; + precursor_50; + precursor_51; + precursor_52; + precursor_53; + precursor_54; + precursor_55; + precursor_56; + precursor_57; + precursor_58; + precursor_59; + precursor_60; + precursor_61; + precursor_62; + precursor_63; + } + par { + s4_mul0; + s4_mul1; + s4_mul2; + s4_mul3; + s4_mul4; + s4_mul5; + s4_mul6; + s4_mul7; + s4_mul8; + s4_mul9; + s4_mul10; + s4_mul11; + s4_mul12; + s4_mul13; + s4_mul14; + s4_mul15; + s4_mul16; + s4_mul17; + s4_mul18; + s4_mul19; + s4_mul20; + s4_mul21; + s4_mul22; + s4_mul23; + s4_mul24; + s4_mul25; + s4_mul26; + s4_mul27; + s4_mul28; + s4_mul29; + s4_mul30; + s4_mul31; + } + par { + s4_r0_op_mod; + s4_r1_op_mod; + s4_r2_op_mod; + s4_r3_op_mod; + s4_r4_op_mod; + s4_r5_op_mod; + s4_r6_op_mod; + s4_r7_op_mod; + s4_r8_op_mod; + s4_r9_op_mod; + s4_r10_op_mod; + s4_r11_op_mod; + s4_r12_op_mod; + s4_r13_op_mod; + s4_r14_op_mod; + s4_r15_op_mod; + s4_r16_op_mod; + s4_r17_op_mod; + s4_r18_op_mod; + s4_r19_op_mod; + s4_r20_op_mod; + s4_r21_op_mod; + s4_r22_op_mod; + s4_r23_op_mod; + s4_r24_op_mod; + s4_r25_op_mod; + s4_r26_op_mod; + s4_r27_op_mod; + s4_r28_op_mod; + s4_r29_op_mod; + s4_r30_op_mod; + s4_r31_op_mod; + s4_r32_op_mod; + s4_r33_op_mod; + s4_r34_op_mod; + s4_r35_op_mod; + s4_r36_op_mod; + s4_r37_op_mod; + s4_r38_op_mod; + s4_r39_op_mod; + s4_r40_op_mod; + s4_r41_op_mod; + s4_r42_op_mod; + s4_r43_op_mod; + s4_r44_op_mod; + s4_r45_op_mod; + s4_r46_op_mod; + s4_r47_op_mod; + s4_r48_op_mod; + s4_r49_op_mod; + s4_r50_op_mod; + s4_r51_op_mod; + s4_r52_op_mod; + s4_r53_op_mod; + s4_r54_op_mod; + s4_r55_op_mod; + s4_r56_op_mod; + s4_r57_op_mod; + s4_r58_op_mod; + s4_r59_op_mod; + s4_r60_op_mod; + s4_r61_op_mod; + s4_r62_op_mod; + s4_r63_op_mod; + } + par { + precursor_0; + precursor_1; + precursor_2; + precursor_3; + precursor_4; + precursor_5; + precursor_6; + precursor_7; + precursor_8; + precursor_9; + precursor_10; + precursor_11; + precursor_12; + precursor_13; + precursor_14; + precursor_15; + precursor_16; + precursor_17; + precursor_18; + precursor_19; + precursor_20; + precursor_21; + precursor_22; + precursor_23; + precursor_24; + precursor_25; + precursor_26; + precursor_27; + precursor_28; + precursor_29; + precursor_30; + precursor_31; + precursor_32; + precursor_33; + precursor_34; + precursor_35; + precursor_36; + precursor_37; + precursor_38; + precursor_39; + precursor_40; + precursor_41; + precursor_42; + precursor_43; + precursor_44; + precursor_45; + precursor_46; + precursor_47; + precursor_48; + precursor_49; + precursor_50; + precursor_51; + precursor_52; + precursor_53; + precursor_54; + precursor_55; + precursor_56; + precursor_57; + precursor_58; + precursor_59; + precursor_60; + precursor_61; + precursor_62; + precursor_63; + } + par { + s5_mul0; + s5_mul1; + s5_mul2; + s5_mul3; + s5_mul4; + s5_mul5; + s5_mul6; + s5_mul7; + s5_mul8; + s5_mul9; + s5_mul10; + s5_mul11; + s5_mul12; + s5_mul13; + s5_mul14; + s5_mul15; + s5_mul16; + s5_mul17; + s5_mul18; + s5_mul19; + s5_mul20; + s5_mul21; + s5_mul22; + s5_mul23; + s5_mul24; + s5_mul25; + s5_mul26; + s5_mul27; + s5_mul28; + s5_mul29; + s5_mul30; + s5_mul31; + } + par { + s5_r0_op_mod; + s5_r1_op_mod; + s5_r2_op_mod; + s5_r3_op_mod; + s5_r4_op_mod; + s5_r5_op_mod; + s5_r6_op_mod; + s5_r7_op_mod; + s5_r8_op_mod; + s5_r9_op_mod; + s5_r10_op_mod; + s5_r11_op_mod; + s5_r12_op_mod; + s5_r13_op_mod; + s5_r14_op_mod; + s5_r15_op_mod; + s5_r16_op_mod; + s5_r17_op_mod; + s5_r18_op_mod; + s5_r19_op_mod; + s5_r20_op_mod; + s5_r21_op_mod; + s5_r22_op_mod; + s5_r23_op_mod; + s5_r24_op_mod; + s5_r25_op_mod; + s5_r26_op_mod; + s5_r27_op_mod; + s5_r28_op_mod; + s5_r29_op_mod; + s5_r30_op_mod; + s5_r31_op_mod; + s5_r32_op_mod; + s5_r33_op_mod; + s5_r34_op_mod; + s5_r35_op_mod; + s5_r36_op_mod; + s5_r37_op_mod; + s5_r38_op_mod; + s5_r39_op_mod; + s5_r40_op_mod; + s5_r41_op_mod; + s5_r42_op_mod; + s5_r43_op_mod; + s5_r44_op_mod; + s5_r45_op_mod; + s5_r46_op_mod; + s5_r47_op_mod; + s5_r48_op_mod; + s5_r49_op_mod; + s5_r50_op_mod; + s5_r51_op_mod; + s5_r52_op_mod; + s5_r53_op_mod; + s5_r54_op_mod; + s5_r55_op_mod; + s5_r56_op_mod; + s5_r57_op_mod; + s5_r58_op_mod; + s5_r59_op_mod; + s5_r60_op_mod; + s5_r61_op_mod; + s5_r62_op_mod; + s5_r63_op_mod; + } + seq { + epilogue_0; + epilogue_1; + epilogue_2; + epilogue_3; + epilogue_4; + epilogue_5; + epilogue_6; + epilogue_7; + epilogue_8; + epilogue_9; + epilogue_10; + epilogue_11; + epilogue_12; + epilogue_13; + epilogue_14; + epilogue_15; + epilogue_16; + epilogue_17; + epilogue_18; + epilogue_19; + epilogue_20; + epilogue_21; + epilogue_22; + epilogue_23; + epilogue_24; + epilogue_25; + epilogue_26; + epilogue_27; + epilogue_28; + epilogue_29; + epilogue_30; + epilogue_31; + epilogue_32; + epilogue_33; + epilogue_34; + epilogue_35; + epilogue_36; + epilogue_37; + epilogue_38; + epilogue_39; + epilogue_40; + epilogue_41; + epilogue_42; + epilogue_43; + epilogue_44; + epilogue_45; + epilogue_46; + epilogue_47; + epilogue_48; + epilogue_49; + epilogue_50; + epilogue_51; + epilogue_52; + epilogue_53; + epilogue_54; + epilogue_55; + epilogue_56; + epilogue_57; + epilogue_58; + epilogue_59; + epilogue_60; + epilogue_61; + epilogue_62; + epilogue_63; + } + } + } +} diff --git a/interp/cider2-tests/benchmarks/ntt-64.futil.data b/interp/cider2-tests/benchmarks/ntt-64.futil.data new file mode 100644 index 0000000000..8e9679b5f8 --- /dev/null +++ b/interp/cider2-tests/benchmarks/ntt-64.futil.data @@ -0,0 +1,148 @@ +{ + "a": { + "format": { + "numeric_type": "bitnum", + "is_signed": true, + "width": 32 + }, + "data": [ + 210, + 837, + 192, + 647, + 749, + 208, + 917, + 345, + 852, + 270, + 58, + 928, + 654, + 404, + 877, + 936, + 605, + 166, + 217, + 323, + 985, + 223, + 971, + 312, + 187, + 469, + 363, + 27, + 611, + 371, + 986, + 705, + 154, + 803, + 219, + 275, + 988, + 717, + 408, + 901, + 100, + 225, + 509, + 435, + 800, + 915, + 211, + 813, + 595, + 766, + 859, + 366, + 283, + 936, + 491, + 941, + 7, + 918, + 59, + 175, + 964, + 718, + 999, + 901 + ] + }, + "phis": { + "format": { + "numeric_type": "bitnum", + "is_signed": true, + "width": 32 + }, + "data": [ + 1, + 125, + 185, + 158, + 64, + 87, + 67, + 76, + 43, + 164, + 42, + 39, + 50, + 74, + 179, + 180, + 112, + 104, + 69, + 133, + 27, + 94, + 170, + 20, + 184, + 33, + 72, + 122, + 3, + 182, + 169, + 88, + 192, + 68, + 8, + 35, + 129, + 106, + 126, + 117, + 150, + 29, + 151, + 154, + 143, + 119, + 14, + 13, + 81, + 89, + 124, + 60, + 166, + 99, + 23, + 173, + 9, + 160, + 121, + 71, + 190, + 11, + 24, + 105 + ] + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.expect new file mode 100644 index 0000000000..c637a7bc4b --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.expect @@ -0,0 +1,418 @@ +{ + "A_int": [ + [ + 10, + 98, + 38, + 18, + 34, + 97, + 61, + 71 + ], + [ + 42, + 99, + 90, + 76, + 93, + 89, + 64, + 4 + ], + [ + 17, + 79, + 0, + 24, + 78, + 47, + 2, + 98 + ], + [ + 49, + 18, + 76, + 82, + 12, + 92, + 80, + 36 + ], + [ + 37, + 34, + 60, + 9, + 73, + 12, + 87, + 7 + ], + [ + 69, + 46, + 80, + 77, + 69, + 50, + 82, + 15 + ], + [ + 89, + 2, + 52, + 13, + 11, + 4, + 65, + 49 + ], + [ + 14, + 80, + 81, + 61, + 32, + 81, + 32, + 85 + ] + ], + "B_int": [ + [ + 39, + 50, + 44, + 33, + 9, + 13, + 49, + 54 + ], + [ + 77, + 21, + 35, + 70, + 24, + 99, + 51, + 65 + ], + [ + 69, + 91, + 33, + 61, + 65, + 75, + 0, + 36 + ], + [ + 67, + 14, + 92, + 92, + 47, + 6, + 0, + 63 + ], + [ + 60, + 73, + 86, + 23, + 12, + 45, + 47, + 76 + ], + [ + 63, + 14, + 51, + 60, + 74, + 16, + 15, + 87 + ], + [ + 89, + 73, + 32, + 63, + 46, + 52, + 96, + 45 + ], + [ + 67, + 42, + 83, + 8, + 40, + 43, + 81, + 73 + ] + ], + "C_int": [ + [ + 7, + 47, + 48, + 14, + 36, + 32, + 24, + 20 + ], + [ + 38, + 76, + 4, + 39, + 81, + 93, + 81, + 49 + ], + [ + 23, + 90, + 9, + 38, + 14, + 61, + 71, + 65 + ], + [ + 70, + 75, + 52, + 86, + 68, + 47, + 65, + 30 + ], + [ + 7, + 79, + 87, + 88, + 97, + 88, + 99, + 24 + ], + [ + 34, + 61, + 3, + 76, + 81, + 13, + 4, + 6 + ], + [ + 7, + 79, + 25, + 24, + 98, + 95, + 21, + 22 + ], + [ + 61, + 94, + 26, + 14, + 0, + 32, + 23, + 40 + ] + ], + "D_int": [ + [ + 285128881, + 677093601, + 291514135, + 404943226, + 496702407, + 489471108, + 411299966, + 287765107 + ], + [ + 377097610, + 857159441, + 366649976, + 524006430, + 619450364, + 616340259, + 543353653, + 375022739 + ], + [ + 222752836, + 542262513, + 210534560, + 298325772, + 367813678, + 385823041, + 316028166, + 238982892 + ], + [ + 291520399, + 679496636, + 306959805, + 414787405, + 491979428, + 502667509, + 447848556, + 299867620 + ], + [ + 213470537, + 505053446, + 202079213, + 300171329, + 389945721, + 382527223, + 315105504, + 219941962 + ], + [ + 322062723, + 744419053, + 314804405, + 447126706, + 542320619, + 549073986, + 477764786, + 329808418 + ], + [ + 173526770, + 425053637, + 170584219, + 243544587, + 324187663, + 330054617, + 268056947, + 187729702 + ], + [ + 310015607, + 727098946, + 314624741, + 441063985, + 522693400, + 523445850, + 458082770, + 316273951 + ] + ], + "alpha_int": [ + 50 + ], + "beta_int": [ + 51 + ], + "tmp_int": [ + [ + 1505050, + 877150, + 1124800, + 1108850, + 949500, + 1104850, + 1007400, + 1418150 + ], + [ + 1885700, + 1315400, + 1509600, + 1617050, + 1149100, + 1333100, + 964050, + 1735700 + ], + [ + 1136950, + 672950, + 1151200, + 691150, + 580150, + 838300, + 868150, + 1241300 + ], + [ + 1504150, + 1020400, + 1205500, + 1309050, + 1086950, + 816550, + 792950, + 1343100 + ], + [ + 1107600, + 1014600, + 794050, + 801250, + 575900, + 835150, + 803850, + 897650 + ], + [ + 1625250, + 1256350, + 1336150, + 1366700, + 972200, + 1036350, + 940350, + 1441300 + ], + [ + 903200, + 853400, + 709750, + 621250, + 510900, + 568950, + 762450, + 765650 + ], + [ + 1597400, + 999050, + 1333150, + 1245350, + 1071400, + 1129900, + 872100, + 1491950 + ] + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse new file mode 100644 index 0000000000..4697a3f7b4 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse @@ -0,0 +1,84 @@ +// BEGIN macro definition + + + + + + + + + + +// END macro definition + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl tmp_int: ubit<32>[8][8]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][8]; +decl C_int: ubit<32>[8][8]; +decl D_int: ubit<32>[8][8]; + +let tmp: ubit<32>[8][8]; +let A: ubit<32>[8][8]; +let B: ubit<32>[8][8]; +let C: ubit<32>[8][8]; +let D: ubit<32>[8][8]; + +view A_sh = A[_: bank 1][_: bank 1]; +view B_sh = B[_: bank 1][_: bank 1]; +view C_sh = C[_: bank 1][_: bank 1]; +view D_sh = D[_: bank 1][_: bank 1]; +view tmp_sh = tmp[_: bank 1][_: bank 1]; + +for (let i0: ubit<4> = 0..8) { + for (let j0: ubit<4> = 0..8) { + A_sh[i0][j0] := A_int[i0][j0]; + B_sh[i0][j0] := B_int[i0][j0]; + C_sh[i0][j0] := C_int[i0][j0]; + D_sh[i0][j0] := D_int[i0][j0]; + tmp_sh[i0][j0] := tmp_int[i0][j0]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + tmp[i][j] := 0; + --- + for (let k: ubit<4> = 0..8) { + let v: ubit<32> = alpha_int[0] * A[i][k] * B[k][j]; + } combine { + tmp[i][j] += v; + } + } +} + +--- + +for (let i1: ubit<4> = 0..8) { + for (let j1: ubit<4> = 0..8) { + let d_tmp: ubit<32> = D[i1][j1]; + --- + D[i1][j1] := beta_int[0] * d_tmp; + --- + for (let k1: ubit<4> = 0..8) { + let v1: ubit<32> = tmp[i1][k1] * C[k1][j1]; + } combine { + D[i1][j1] += v1; + } + } +} + +--- + +for (let i0: ubit<4> = 0..8) { + for (let j0: ubit<4> = 0..8) { + A_int[i0][j0] := A_sh[i0][j0]; + B_int[i0][j0] := B_sh[i0][j0]; + C_int[i0][j0] := C_sh[i0][j0]; + D_int[i0][j0] := D_sh[i0][j0]; + tmp_int[i0][j0] := tmp_sh[i0][j0]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse.data new file mode 100644 index 0000000000..8e016e5adb --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-2mm.fuse.data @@ -0,0 +1,467 @@ +{ + "alpha_int": { + "data": [ + 50 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 51 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "tmp_int": { + "data": [ + [ + 93, + 72, + 1, + 99, + 44, + 88, + 66, + 23 + ], + [ + 9, + 19, + 91, + 90, + 50, + 71, + 37, + 54 + ], + [ + 19, + 23, + 39, + 89, + 7, + 70, + 78, + 37 + ], + [ + 97, + 97, + 82, + 31, + 89, + 86, + 51, + 42 + ], + [ + 9, + 5, + 78, + 67, + 50, + 30, + 58, + 69 + ], + [ + 33, + 72, + 9, + 73, + 40, + 1, + 83, + 78 + ], + [ + 51, + 91, + 72, + 43, + 76, + 95, + 72, + 20 + ], + [ + 36, + 62, + 45, + 62, + 80, + 42, + 9, + 31 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 10, + 98, + 38, + 18, + 34, + 97, + 61, + 71 + ], + [ + 42, + 99, + 90, + 76, + 93, + 89, + 64, + 4 + ], + [ + 17, + 79, + 0, + 24, + 78, + 47, + 2, + 98 + ], + [ + 49, + 18, + 76, + 82, + 12, + 92, + 80, + 36 + ], + [ + 37, + 34, + 60, + 9, + 73, + 12, + 87, + 7 + ], + [ + 69, + 46, + 80, + 77, + 69, + 50, + 82, + 15 + ], + [ + 89, + 2, + 52, + 13, + 11, + 4, + 65, + 49 + ], + [ + 14, + 80, + 81, + 61, + 32, + 81, + 32, + 85 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 39, + 50, + 44, + 33, + 9, + 13, + 49, + 54 + ], + [ + 77, + 21, + 35, + 70, + 24, + 99, + 51, + 65 + ], + [ + 69, + 91, + 33, + 61, + 65, + 75, + 0, + 36 + ], + [ + 67, + 14, + 92, + 92, + 47, + 6, + 0, + 63 + ], + [ + 60, + 73, + 86, + 23, + 12, + 45, + 47, + 76 + ], + [ + 63, + 14, + 51, + 60, + 74, + 16, + 15, + 87 + ], + [ + 89, + 73, + 32, + 63, + 46, + 52, + 96, + 45 + ], + [ + 67, + 42, + 83, + 8, + 40, + 43, + 81, + 73 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C_int": { + "data": [ + [ + 7, + 47, + 48, + 14, + 36, + 32, + 24, + 20 + ], + [ + 38, + 76, + 4, + 39, + 81, + 93, + 81, + 49 + ], + [ + 23, + 90, + 9, + 38, + 14, + 61, + 71, + 65 + ], + [ + 70, + 75, + 52, + 86, + 68, + 47, + 65, + 30 + ], + [ + 7, + 79, + 87, + 88, + 97, + 88, + 99, + 24 + ], + [ + 34, + 61, + 3, + 76, + 81, + 13, + 4, + 6 + ], + [ + 7, + 79, + 25, + 24, + 98, + 95, + 21, + 22 + ], + [ + 61, + 94, + 26, + 14, + 0, + 32, + 23, + 40 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "D_int": { + "data": [ + [ + 31, + 1, + 35, + 76, + 57, + 58, + 16, + 7 + ], + [ + 60, + 91, + 26, + 30, + 64, + 9, + 3, + 89 + ], + [ + 86, + 63, + 60, + 22, + 78, + 41, + 66, + 42 + ], + [ + 99, + 86, + 5, + 55, + 28, + 9, + 6, + 20 + ], + [ + 37, + 96, + 13, + 79, + 21, + 73, + 4, + 12 + ], + [ + 23, + 53, + 5, + 56, + 69, + 86, + 36, + 18 + ], + [ + 20, + 37, + 19, + 37, + 63, + 67, + 97, + 52 + ], + [ + 57, + 96, + 41, + 85, + 50, + 0, + 70, + 1 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.expect new file mode 100644 index 0000000000..c6de3c942b --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.expect @@ -0,0 +1,576 @@ +{ + "A_int": [ + [ + 61, + 72, + 65, + 1, + 57, + 96, + 75, + 88 + ], + [ + 7, + 44, + 79, + 69, + 30, + 86, + 6, + 58 + ], + [ + 20, + 16, + 78, + 54, + 74, + 2, + 90, + 49 + ], + [ + 60, + 88, + 69, + 79, + 21, + 69, + 32, + 78 + ], + [ + 27, + 39, + 36, + 67, + 98, + 25, + 26, + 24 + ], + [ + 38, + 93, + 56, + 98, + 9, + 94, + 61, + 49 + ], + [ + 18, + 53, + 42, + 41, + 73, + 97, + 20, + 29 + ], + [ + 66, + 50, + 84, + 26, + 72, + 50, + 64, + 98 + ] + ], + "B_int": [ + [ + 94, + 32, + 48, + 67, + 28, + 77, + 84, + 95 + ], + [ + 35, + 52, + 18, + 23, + 17, + 48, + 99, + 2 + ], + [ + 46, + 98, + 71, + 75, + 49, + 38, + 64, + 63 + ], + [ + 6, + 91, + 77, + 51, + 90, + 49, + 16, + 66 + ], + [ + 61, + 1, + 79, + 19, + 81, + 37, + 37, + 46 + ], + [ + 39, + 64, + 42, + 4, + 37, + 43, + 95, + 52 + ], + [ + 53, + 62, + 56, + 2, + 59, + 35, + 87, + 24 + ], + [ + 16, + 34, + 53, + 90, + 52, + 75, + 67, + 98 + ] + ], + "C_int": [ + [ + 95, + 65, + 64, + 22, + 37, + 98, + 9, + 48 + ], + [ + 80, + 36, + 33, + 39, + 47, + 83, + 0, + 72 + ], + [ + 65, + 26, + 89, + 84, + 8, + 93, + 81, + 6 + ], + [ + 85, + 94, + 33, + 36, + 54, + 77, + 31, + 80 + ], + [ + 44, + 19, + 32, + 5, + 55, + 78, + 78, + 99 + ], + [ + 56, + 28, + 72, + 46, + 74, + 70, + 19, + 43 + ], + [ + 54, + 52, + 88, + 62, + 99, + 20, + 88, + 92 + ], + [ + 29, + 47, + 91, + 13, + 91, + 66, + 1, + 0 + ] + ], + "D_int": [ + [ + 3, + 82, + 53, + 10, + 31, + 88, + 66, + 24 + ], + [ + 1, + 61, + 79, + 99, + 54, + 71, + 90, + 65 + ], + [ + 78, + 29, + 5, + 69, + 51, + 2, + 81, + 17 + ], + [ + 14, + 17, + 9, + 31, + 89, + 70, + 97, + 80 + ], + [ + 51, + 6, + 92, + 21, + 46, + 91, + 96, + 72 + ], + [ + 59, + 44, + 77, + 65, + 19, + 69, + 10, + 15 + ], + [ + 40, + 75, + 73, + 43, + 78, + 7, + 14, + 54 + ], + [ + 81, + 78, + 98, + 61, + 7, + 88, + 88, + 17 + ] + ], + "E_int": [ + [ + 23854, + 26000, + 26315, + 20206, + 23377, + 26134, + 40078, + 28138 + ], + [ + 12676, + 24411, + 21442, + 17071, + 20007, + 18402, + 24792, + 21964 + ], + [ + 16498, + 21478, + 24511, + 16316, + 23440, + 17567, + 23161, + 20880 + ], + [ + 19284, + 29520, + 25929, + 23007, + 23865, + 26051, + 34774, + 28403 + ], + [ + 14676, + 16643, + 21233, + 12997, + 20858, + 16013, + 19376, + 18117 + ], + [ + 18223, + 31931, + 25692, + 18962, + 24563, + 24505, + 35404, + 25360 + ], + [ + 15485, + 19686, + 20455, + 12091, + 19343, + 17282, + 25702, + 18892 + ], + [ + 23276, + 25882, + 28600, + 23714, + 25708, + 26352, + 35834, + 30430 + ] + ], + "F_int": [ + [ + 17567, + 22938, + 26999, + 22945, + 16279, + 29059, + 28320, + 14789 + ], + [ + 16522, + 19926, + 25371, + 18624, + 13821, + 28732, + 26654, + 13794 + ], + [ + 17960, + 21608, + 21098, + 22031, + 23929, + 21864, + 25347, + 17930 + ], + [ + 18444, + 26550, + 33420, + 25901, + 19523, + 34224, + 33663, + 19668 + ], + [ + 21263, + 23114, + 30500, + 20302, + 15256, + 25280, + 23555, + 14260 + ], + [ + 18603, + 17473, + 23753, + 19270, + 17531, + 25761, + 28364, + 16203 + ], + [ + 25147, + 26456, + 34056, + 26457, + 26930, + 32061, + 40418, + 24876 + ], + [ + 15989, + 11630, + 19349, + 17869, + 14753, + 19823, + 24186, + 13934 + ] + ], + "G_int": [ + [ + 4134887983, + 259879444, + 1482289172, + 381031707, + 4081053759, + 1519048260, + 2013111150, + 3726520806 + ], + [ + 3068321745, + 3389047876, + 6113639, + 3469211271, + 3009615492, + 37886798, + 359302838, + 2750637780 + ], + [ + 3127313354, + 3473547407, + 82761429, + 3541425706, + 3067815454, + 97437018, + 406781067, + 2786629229 + ], + [ + 4037183009, + 163806865, + 1371082216, + 278489595, + 3967818658, + 1420207218, + 1863189797, + 3633023281 + ], + [ + 2672164764, + 2957358647, + 3727761129, + 3019512703, + 2618767727, + 3733852560, + 4001757556, + 2374282965 + ], + [ + 3932785883, + 45392891, + 1210564767, + 135728441, + 3854845645, + 1252726598, + 1679686985, + 3524957376 + ], + [ + 2868834928, + 3159214416, + 3994483297, + 3229053173, + 2818616895, + 4009347851, + 35327127, + 2563575793 + ], + [ + 4212067240, + 358846236, + 1605224160, + 486970470, + 4152084518, + 1642789824, + 2114595094, + 3789445764 + ] + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse new file mode 100644 index 0000000000..033ba573e1 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse @@ -0,0 +1,60 @@ +// BEGIN macro definition + + + + + + + + + + + + +// END macro definition + +decl E_int: ubit<32>[8][8]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][8]; +decl F_int: ubit<32>[8][8]; +decl C_int: ubit<32>[8][8]; +decl D_int: ubit<32>[8][8]; +decl G_int: ubit<32>[8][8]; + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + E_int[i][j] := (0 as ubit<32>); + --- + for (let k: ubit<4> = 0..8) { + let v: ubit<32> = A_int[i][k] * B_int[k][j]; + } combine { + E_int[i][j] += v; + } + } +} + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + F_int[i][j] := (0 as ubit<32>); + --- + for (let k: ubit<4> = 0..8) { + let v: ubit<32> = C_int[i][k] * D_int[k][j]; + } combine { + F_int[i][j] += v; + } + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + G_int[i][j] := (0 as ubit<32>); + --- + for (let k: ubit<4> = 0..8) { + let v: ubit<32> = E_int[i][k] * F_int[k][j]; + } combine { + G_int[i][j] += v; + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse.data new file mode 100644 index 0000000000..cfd1508a01 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-3mm.fuse.data @@ -0,0 +1,625 @@ +{ + "E_int": { + "data": [ + [ + 46, + 35, + 49, + 92, + 3, + 19, + 4, + 11 + ], + [ + 1, + 41, + 94, + 36, + 43, + 65, + 79, + 20 + ], + [ + 25, + 39, + 19, + 4, + 60, + 12, + 53, + 51 + ], + [ + 61, + 74, + 47, + 25, + 99, + 60, + 9, + 61 + ], + [ + 41, + 84, + 69, + 66, + 81, + 94, + 5, + 17 + ], + [ + 99, + 31, + 51, + 87, + 77, + 38, + 13, + 98 + ], + [ + 36, + 0, + 60, + 73, + 22, + 69, + 45, + 10 + ], + [ + 68, + 64, + 47, + 51, + 30, + 95, + 26, + 21 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 61, + 72, + 65, + 1, + 57, + 96, + 75, + 88 + ], + [ + 7, + 44, + 79, + 69, + 30, + 86, + 6, + 58 + ], + [ + 20, + 16, + 78, + 54, + 74, + 2, + 90, + 49 + ], + [ + 60, + 88, + 69, + 79, + 21, + 69, + 32, + 78 + ], + [ + 27, + 39, + 36, + 67, + 98, + 25, + 26, + 24 + ], + [ + 38, + 93, + 56, + 98, + 9, + 94, + 61, + 49 + ], + [ + 18, + 53, + 42, + 41, + 73, + 97, + 20, + 29 + ], + [ + 66, + 50, + 84, + 26, + 72, + 50, + 64, + 98 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 94, + 32, + 48, + 67, + 28, + 77, + 84, + 95 + ], + [ + 35, + 52, + 18, + 23, + 17, + 48, + 99, + 2 + ], + [ + 46, + 98, + 71, + 75, + 49, + 38, + 64, + 63 + ], + [ + 6, + 91, + 77, + 51, + 90, + 49, + 16, + 66 + ], + [ + 61, + 1, + 79, + 19, + 81, + 37, + 37, + 46 + ], + [ + 39, + 64, + 42, + 4, + 37, + 43, + 95, + 52 + ], + [ + 53, + 62, + 56, + 2, + 59, + 35, + 87, + 24 + ], + [ + 16, + 34, + 53, + 90, + 52, + 75, + 67, + 98 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "F_int": { + "data": [ + [ + 53, + 44, + 93, + 75, + 65, + 79, + 35, + 68 + ], + [ + 53, + 94, + 20, + 77, + 47, + 30, + 12, + 44 + ], + [ + 48, + 97, + 60, + 97, + 0, + 13, + 56, + 40 + ], + [ + 55, + 49, + 13, + 38, + 85, + 84, + 8, + 65 + ], + [ + 32, + 95, + 72, + 54, + 53, + 27, + 28, + 32 + ], + [ + 41, + 90, + 22, + 50, + 82, + 19, + 65, + 28 + ], + [ + 54, + 47, + 20, + 35, + 63, + 18, + 77, + 12 + ], + [ + 51, + 17, + 60, + 22, + 31, + 2, + 3, + 13 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C_int": { + "data": [ + [ + 95, + 65, + 64, + 22, + 37, + 98, + 9, + 48 + ], + [ + 80, + 36, + 33, + 39, + 47, + 83, + 0, + 72 + ], + [ + 65, + 26, + 89, + 84, + 8, + 93, + 81, + 6 + ], + [ + 85, + 94, + 33, + 36, + 54, + 77, + 31, + 80 + ], + [ + 44, + 19, + 32, + 5, + 55, + 78, + 78, + 99 + ], + [ + 56, + 28, + 72, + 46, + 74, + 70, + 19, + 43 + ], + [ + 54, + 52, + 88, + 62, + 99, + 20, + 88, + 92 + ], + [ + 29, + 47, + 91, + 13, + 91, + 66, + 1, + 0 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "D_int": { + "data": [ + [ + 3, + 82, + 53, + 10, + 31, + 88, + 66, + 24 + ], + [ + 1, + 61, + 79, + 99, + 54, + 71, + 90, + 65 + ], + [ + 78, + 29, + 5, + 69, + 51, + 2, + 81, + 17 + ], + [ + 14, + 17, + 9, + 31, + 89, + 70, + 97, + 80 + ], + [ + 51, + 6, + 92, + 21, + 46, + 91, + 96, + 72 + ], + [ + 59, + 44, + 77, + 65, + 19, + 69, + 10, + 15 + ], + [ + 40, + 75, + 73, + 43, + 78, + 7, + 14, + 54 + ], + [ + 81, + 78, + 98, + 61, + 7, + 88, + 88, + 17 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "G_int": { + "data": [ + [ + 63, + 69, + 26, + 16, + 90, + 74, + 23, + 29 + ], + [ + 10, + 6, + 34, + 64, + 33, + 9, + 73, + 97 + ], + [ + 23, + 69, + 35, + 81, + 9, + 23, + 43, + 42 + ], + [ + 91, + 28, + 83, + 28, + 86, + 92, + 35, + 43 + ], + [ + 9, + 30, + 96, + 30, + 18, + 98, + 27, + 28 + ], + [ + 90, + 95, + 27, + 54, + 69, + 80, + 1, + 12 + ], + [ + 45, + 85, + 91, + 66, + 4, + 22, + 8, + 51 + ], + [ + 93, + 59, + 49, + 41, + 98, + 63, + 18, + 12 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.expect new file mode 100644 index 0000000000..645f37edc4 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.expect @@ -0,0 +1,114 @@ +{ + "A_int": [ + [ + 48, + 68, + 35, + 24, + 9, + 22, + 4, + 6 + ], + [ + 82, + 12, + 76, + 14, + 1, + 40, + 34, + 27 + ], + [ + 52, + 36, + 61, + 84, + 78, + 43, + 62, + 67 + ], + [ + 0, + 54, + 60, + 83, + 61, + 82, + 84, + 59 + ], + [ + 50, + 59, + 40, + 0, + 10, + 10, + 63, + 41 + ], + [ + 7, + 4, + 97, + 42, + 41, + 58, + 17, + 2 + ], + [ + 10, + 51, + 94, + 2, + 74, + 24, + 49, + 53 + ], + [ + 62, + 21, + 90, + 93, + 60, + 47, + 9, + 58 + ] + ], + "tmp_int": [ + 14244, + 16527, + 34104, + 35505, + 19189, + 16405, + 24923, + 29000 + ], + "x_int": [ + 40, + 88, + 47, + 82, + 73, + 55, + 83, + 88 + ], + "y_int": [ + 6933849, + 7389774, + 13276843, + 9820741, + 9419437, + 8456862, + 8685781, + 8733934 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse new file mode 100644 index 0000000000..14c995a528 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse @@ -0,0 +1,57 @@ +// BEGIN macro definitions + + + + + + +// END macro definitions + +decl A_int: ubit<32>[8][8]; +decl x_int: ubit<32>[8]; +decl y_int: ubit<32>[8]; +decl tmp_int: ubit<32>[8]; + +let A: ubit<32>[8][8]; +let x: ubit<32>[8]; +let y: ubit<32>[8]; + +view y_sh = y[_: bank 1]; +view x_sh = x[_: bank 1]; +view A_sh = A[_: bank 1][_: bank 1]; + +for (let i0: ubit<4> = 0..8) { + y_sh[i0] := 0; + x_sh[i0] := x_int[i0]; + for (let j0: ubit<4> = 0..8) { + A_sh[i0][j0] := A_int[i0][j0]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + tmp_int[i] := 0; + --- + for (let j: ubit<4> = 0..8) { + let t: ubit<32> = A[i][j] * x[j]; + } combine { + tmp_int[i] += t; + } + --- + for (let j: ubit<4> = 0..8) { + let y0: ubit<32> = y[j]; + --- + y[j] := y0 + A[i][j] * tmp_int[i]; + } +} + +--- + +for (let i1: ubit<4> = 0..8) { + y_int[i1] := y_sh[i1]; + x_int[i1] := x_sh[i1]; + for (let j1: ubit<4> = 0..8) { + A_int[i1][j1] := A_sh[i1][j1]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse.data new file mode 100644 index 0000000000..108cbc0b21 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-atax.fuse.data @@ -0,0 +1,142 @@ +{ + "A_int": { + "data": [ + [ + 48, + 68, + 35, + 24, + 9, + 22, + 4, + 6 + ], + [ + 82, + 12, + 76, + 14, + 1, + 40, + 34, + 27 + ], + [ + 52, + 36, + 61, + 84, + 78, + 43, + 62, + 67 + ], + [ + 0, + 54, + 60, + 83, + 61, + 82, + 84, + 59 + ], + [ + 50, + 59, + 40, + 0, + 10, + 10, + 63, + 41 + ], + [ + 7, + 4, + 97, + 42, + 41, + 58, + 17, + 2 + ], + [ + 10, + 51, + 94, + 2, + 74, + 24, + 49, + 53 + ], + [ + 62, + 21, + 90, + 93, + 60, + 47, + 9, + 58 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "x_int": { + "data": [ + 40, + 88, + 47, + 82, + 73, + 55, + 83, + 88 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y_int": { + "data": [ + 48, + 61, + 89, + 88, + 62, + 22, + 65, + 33 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "tmp_int": { + "data": [ + 17, + 57, + 14, + 67, + 60, + 81, + 75, + 27 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.expect new file mode 100644 index 0000000000..d5c6d95c3f --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.expect @@ -0,0 +1,124 @@ +{ + "A_int": [ + [ + 78, + 89, + 76, + 79, + 59, + 17, + 60, + 7 + ], + [ + 90, + 23, + 13, + 86, + 50, + 48, + 66, + 49 + ], + [ + 45, + 84, + 33, + 9, + 28, + 72, + 38, + 33 + ], + [ + 59, + 51, + 57, + 38, + 17, + 89, + 50, + 84 + ], + [ + 29, + 63, + 23, + 70, + 85, + 32, + 74, + 67 + ], + [ + 91, + 23, + 32, + 70, + 38, + 41, + 59, + 50 + ], + [ + 85, + 10, + 38, + 91, + 33, + 8, + 4, + 61 + ], + [ + 87, + 62, + 67, + 71, + 45, + 85, + 27, + 0 + ] + ], + "p_int": [ + 48, + 15, + 11, + 13, + 91, + 21, + 16, + 88 + ], + "q_int": [ + 14244, + 16852, + 11472, + 16326, + 18987, + 15638, + 14434, + 13078 + ], + "r_int": [ + 10, + 78, + 18, + 38, + 46, + 39, + 54, + 1 + ], + "s_int": [ + 20412, + 10531, + 8959, + 20039, + 12859, + 12180, + 14280, + 16004 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse new file mode 100644 index 0000000000..41522d0a3f --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse @@ -0,0 +1,33 @@ +// BEGIN macro definitions + + + + + + +// END macro definitions + +decl A_int: ubit<32>[8][8]; +decl s_int: ubit<32>[8]; +decl q_int: ubit<32>[8]; +decl p_int: ubit<32>[8]; +decl r_int: ubit<32>[8]; + +for (let i: ubit<4> = 0..8) { + s_int[i] := 0; +} + +--- + +for (let i: ubit<4> = 0..8) { + q_int[i] := 0; + --- + for (let j: ubit<4> = 0..8) { + let s0: ubit<32> = s_int[j]; + let q0: ubit<32> = q_int[i]; + let A_i_j: ubit<32> = A_int[i][j]; + --- + s_int[j] := s0 + r_int[i] * A_i_j; + q_int[i] := q0 + A_i_j * p_int[j]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse.data new file mode 100644 index 0000000000..8ae6b0ee97 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-bicg.fuse.data @@ -0,0 +1,159 @@ +{ + "A_int": { + "data": [ + [ + 78, + 89, + 76, + 79, + 59, + 17, + 60, + 7 + ], + [ + 90, + 23, + 13, + 86, + 50, + 48, + 66, + 49 + ], + [ + 45, + 84, + 33, + 9, + 28, + 72, + 38, + 33 + ], + [ + 59, + 51, + 57, + 38, + 17, + 89, + 50, + 84 + ], + [ + 29, + 63, + 23, + 70, + 85, + 32, + 74, + 67 + ], + [ + 91, + 23, + 32, + 70, + 38, + 41, + 59, + 50 + ], + [ + 85, + 10, + 38, + 91, + 33, + 8, + 4, + 61 + ], + [ + 87, + 62, + 67, + 71, + 45, + 85, + 27, + 0 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "s_int": { + "data": [ + 41, + 24, + 13, + 7, + 27, + 95, + 0, + 20 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "q_int": { + "data": [ + 59, + 33, + 33, + 90, + 85, + 37, + 30, + 75 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "p_int": { + "data": [ + 48, + 15, + 11, + 13, + 91, + 21, + 16, + 88 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "r_int": { + "data": [ + 10, + 78, + 18, + 38, + 46, + 39, + 54, + 1 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.expect new file mode 100644 index 0000000000..6a5dcf8dce --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.expect @@ -0,0 +1,84 @@ +{ + "A_int": [ + [ + 6, + 90, + 62, + 84, + 26, + 57, + 77, + 39 + ], + [ + 8, + 65535, + 70, + 9, + 97, + 34, + 89, + 51 + ], + [ + 7, + 0, + 5, + 49, + 12, + 40, + 39, + 34 + ], + [ + 6, + 65536, + 2, + 7, + 83, + 98, + 91, + 94 + ], + [ + 6, + 0, + 858993453, + 368140052, + 29783, + 65, + 80, + 0 + ], + [ + 4, + 65536, + 858993458, + 368140056, + 124549, + 62484, + 62, + 20 + ], + [ + 9, + 65536, + 858993458, + 368140055, + 136909, + 43739, + 61569, + 74 + ], + [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 5 + ] + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse new file mode 100644 index 0000000000..7179851648 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse @@ -0,0 +1,61 @@ +import c++("math.h") + vivado("math.h") + futil("primitives/math.futil") { + def sqrt(in: ubit<32>): ubit<32>; +} + +decl A_int: ubit<32>[8][8]; + +for (let i: ubit<4> = 0..8) { + // j < i + let j: ubit<4> = 0 ; + while(j < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let k: ubit<4> = 0; + while(k < j) { + decor "#pragma HLS loop_tripcount min=0 max=6 avg=2" + let A_i_j = A_int[i][j]; + --- + let A_i_k = A_int[i][k]; + --- + let A_j_k = A_int[j][k]; + --- + A_int[i][j] := A_i_j - A_i_k * A_j_k; + // Update loop counter + k := k + 1; + } + --- + let A_j_j = A_int[j][j]; + --- + let A_i_j = A_int[i][j]; + --- + if (A_j_j != 0) { + A_int[i][j] := A_i_j / A_j_j; + } else { + A_int[i][j] := 0; + } + + // Update loop counter + j := j + 1; + } + + --- + // i==j case + let k: ubit<4> = 0; + while(k < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let A_i_k = A_int[i][k]; + --- + let A_i_i = A_int[i][i]; + --- + A_int[i][i] := A_i_i - A_i_k * A_i_k; + + // Update loop counter + k := k + 1; + } + --- + let A_i_i = A_int[i][i]; + --- + let sq = sqrt(A_i_i); + A_int[i][i] := sq; +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse.data new file mode 100644 index 0000000000..cd7dbd496c --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-cholesky.fuse.data @@ -0,0 +1,91 @@ +{ + "A_int": { + "data": [ + [ + 47, + 90, + 62, + 84, + 26, + 57, + 77, + 39 + ], + [ + 48, + 50, + 70, + 9, + 97, + 34, + 89, + 51 + ], + [ + 43, + 94, + 78, + 49, + 12, + 40, + 39, + 34 + ], + [ + 38, + 29, + 56, + 91, + 83, + 98, + 91, + 94 + ], + [ + 36, + 88, + 15, + 13, + 45, + 65, + 80, + 0 + ], + [ + 26, + 5, + 22, + 42, + 90, + 83, + 62, + 20 + ], + [ + 57, + 28, + 61, + 63, + 78, + 68, + 60, + 74 + ], + [ + 0, + 44, + 28, + 16, + 73, + 66, + 81, + 56 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.expect new file mode 100644 index 0000000000..267412d961 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.expect @@ -0,0 +1,752 @@ +{ + "A_int": [ + [ + [ + 12512, + 13785, + 26684, + 15676, + 12213, + 18834, + 21546, + 19379 + ], + [ + 10146, + 10693, + 20400, + 15961, + 11469, + 10315, + 14050, + 8767 + ], + [ + 9695, + 11148, + 18418, + 17025, + 12308, + 8835, + 11725, + 8305 + ], + [ + 11039, + 13531, + 20877, + 14448, + 12650, + 12473, + 12456, + 8781 + ], + [ + 20615, + 25120, + 40487, + 25615, + 23279, + 24514, + 26848, + 17892 + ], + [ + 16635, + 18689, + 31435, + 25287, + 20595, + 16341, + 19824, + 14271 + ], + [ + 13515, + 14898, + 28759, + 20103, + 15227, + 17252, + 21071, + 17007 + ], + [ + 13688, + 18925, + 28384, + 20858, + 17875, + 13465, + 18535, + 8047 + ] + ], + [ + [ + 13921, + 17521, + 29544, + 22887, + 21445, + 18450, + 16827, + 15007 + ], + [ + 12705, + 18979, + 32623, + 22202, + 19434, + 20536, + 22486, + 17556 + ], + [ + 13192, + 18859, + 28154, + 19536, + 18875, + 16572, + 16740, + 12023 + ], + [ + 11742, + 15702, + 21797, + 16495, + 13677, + 12186, + 14534, + 9444 + ], + [ + 19125, + 19043, + 34885, + 21914, + 21278, + 21748, + 22546, + 17826 + ], + [ + 13483, + 15731, + 27577, + 16996, + 15111, + 17428, + 16771, + 11379 + ], + [ + 11592, + 16120, + 28052, + 19991, + 18116, + 17249, + 19541, + 15090 + ], + [ + 15030, + 15273, + 31105, + 24518, + 18344, + 15569, + 19243, + 10594 + ] + ], + [ + [ + 16691, + 19228, + 32987, + 23826, + 19581, + 19551, + 24928, + 19570 + ], + [ + 15183, + 17484, + 31244, + 22460, + 20673, + 21102, + 20922, + 21022 + ], + [ + 17036, + 18567, + 38297, + 29045, + 19498, + 20756, + 26654, + 16825 + ], + [ + 15510, + 16612, + 34054, + 21285, + 19709, + 20106, + 19337, + 10466 + ], + [ + 16497, + 17251, + 33838, + 28786, + 21076, + 18441, + 22378, + 17770 + ], + [ + 16745, + 18403, + 32582, + 22546, + 16966, + 19324, + 22679, + 16027 + ], + [ + 10490, + 10476, + 22824, + 19000, + 13252, + 12330, + 15811, + 12108 + ], + [ + 16086, + 13894, + 30666, + 22987, + 20752, + 18327, + 20195, + 18117 + ] + ], + [ + [ + 15081, + 8708, + 28235, + 16481, + 13671, + 17994, + 17995, + 13709 + ], + [ + 12348, + 17129, + 29659, + 24042, + 18629, + 15656, + 19386, + 12505 + ], + [ + 12906, + 18740, + 29653, + 20486, + 14722, + 17576, + 20760, + 12822 + ], + [ + 16439, + 22655, + 37670, + 26637, + 25586, + 23016, + 20443, + 13808 + ], + [ + 12763, + 12080, + 23234, + 14350, + 16802, + 15709, + 15073, + 15038 + ], + [ + 11968, + 15857, + 33356, + 23937, + 17523, + 22934, + 25737, + 24559 + ], + [ + 16021, + 17987, + 33310, + 22598, + 18494, + 20544, + 20012, + 14468 + ], + [ + 14562, + 17830, + 35376, + 28376, + 19459, + 16911, + 22296, + 9599 + ] + ], + [ + [ + 15888, + 18993, + 28337, + 21692, + 17903, + 15694, + 20210, + 14840 + ], + [ + 7255, + 11250, + 20892, + 16597, + 13863, + 12969, + 13164, + 9407 + ], + [ + 10433, + 12499, + 25355, + 22981, + 15887, + 12239, + 16109, + 10308 + ], + [ + 6967, + 10654, + 22671, + 19144, + 14308, + 13441, + 16211, + 13808 + ], + [ + 14895, + 18285, + 26844, + 17300, + 18856, + 16118, + 14919, + 10370 + ], + [ + 14403, + 15394, + 26969, + 22232, + 17365, + 12787, + 19259, + 12149 + ], + [ + 14652, + 18448, + 37030, + 25695, + 22758, + 22648, + 24053, + 17472 + ], + [ + 13780, + 19614, + 32815, + 22688, + 23115, + 23711, + 18848, + 19468 + ] + ], + [ + [ + 12956, + 17562, + 23109, + 15923, + 16266, + 15128, + 15524, + 14417 + ], + [ + 14923, + 21770, + 32012, + 20618, + 20147, + 18251, + 19032, + 8600 + ], + [ + 14962, + 18449, + 32168, + 24205, + 16488, + 15621, + 22463, + 10500 + ], + [ + 18229, + 19257, + 35704, + 25492, + 22683, + 19578, + 22826, + 14899 + ], + [ + 18143, + 23946, + 40327, + 30564, + 27458, + 24272, + 23643, + 18087 + ], + [ + 16459, + 18507, + 29387, + 18269, + 20177, + 19996, + 18739, + 17348 + ], + [ + 14898, + 22510, + 35751, + 26482, + 26510, + 22234, + 20672, + 15683 + ], + [ + 12214, + 19861, + 27310, + 20998, + 19620, + 15513, + 18169, + 12698 + ] + ], + [ + [ + 17539, + 16804, + 29701, + 22921, + 19214, + 15927, + 17966, + 11972 + ], + [ + 19877, + 15859, + 31380, + 20268, + 16833, + 16377, + 18834, + 9171 + ], + [ + 13317, + 18495, + 27671, + 18795, + 17245, + 14957, + 18440, + 10076 + ], + [ + 13623, + 16873, + 29524, + 25131, + 20709, + 14229, + 17662, + 9949 + ], + [ + 20049, + 22809, + 34595, + 26183, + 20532, + 16013, + 24407, + 13113 + ], + [ + 17734, + 20791, + 37728, + 25565, + 26016, + 22938, + 22215, + 16149 + ], + [ + 14921, + 19572, + 26244, + 18444, + 17737, + 15178, + 17176, + 12510 + ], + [ + 8293, + 13875, + 23721, + 22160, + 15845, + 12158, + 13492, + 7727 + ] + ], + [ + [ + 12041, + 13257, + 26053, + 16778, + 13110, + 14294, + 17041, + 9567 + ], + [ + 20068, + 21022, + 35866, + 24358, + 20688, + 17395, + 23375, + 10802 + ], + [ + 11787, + 14885, + 23258, + 18776, + 12459, + 11393, + 17850, + 10907 + ], + [ + 15512, + 18424, + 31407, + 20163, + 20497, + 19370, + 19054, + 12129 + ], + [ + 8791, + 9239, + 21897, + 17098, + 12909, + 13490, + 16425, + 14752 + ], + [ + 13377, + 22433, + 35454, + 25564, + 25055, + 23619, + 20982, + 17872 + ], + [ + 14587, + 14082, + 31383, + 20054, + 12926, + 18232, + 26295, + 17532 + ], + [ + 9001, + 16399, + 25180, + 18145, + 17827, + 16728, + 15705, + 12835 + ] + ] + ], + "C4_int": [ + [ + 12, + 97, + 76, + 40, + 81, + 53, + 31, + 12 + ], + [ + 4, + 15, + 83, + 99, + 60, + 48, + 21, + 19 + ], + [ + 98, + 45, + 90, + 67, + 79, + 30, + 25, + 0 + ], + [ + 60, + 29, + 99, + 24, + 8, + 56, + 73, + 15 + ], + [ + 40, + 69, + 87, + 91, + 56, + 26, + 60, + 3 + ], + [ + 24, + 65, + 47, + 38, + 27, + 45, + 49, + 75 + ], + [ + 11, + 4, + 59, + 9, + 31, + 82, + 55, + 96 + ], + [ + 29, + 16, + 61, + 60, + 24, + 17, + 76, + 59 + ] + ], + "sum_int": [ + 9001, + 16399, + 25180, + 18145, + 17827, + 16728, + 15705, + 12835 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse new file mode 100644 index 0000000000..8cdd33e258 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse @@ -0,0 +1,34 @@ +// BEGIN macro defintions + + + + + + + + +// END macro definitions +// broken because of compilation bug in Verilator + +decl A_int: ubit<32>[8][8][8]; +decl C4_int: ubit<32>[8][8]; +decl sum_int: ubit<32>[8]; + +for (let r: ubit<4> = 0..8) { + for (let q: ubit<4> = 0..8) { + + for (let p: ubit<4> = 0..8) { + sum_int[p] := 0; + --- + for (let s: ubit<4> = 0..8) { + let v: ubit<32> = A_int[r][q][s] * C4_int[s][p]; + } combine { + sum_int[p] += v; + } + } + --- + for (let p: ubit<4> = 0..8) { + A_int[r][q][p] := sum_int[p]; + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse.data new file mode 100644 index 0000000000..d6ee52b8b9 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-doitgen.fuse.data @@ -0,0 +1,773 @@ +{ + "A_int": { + "data": [ + [ + [ + 10, + 18, + 19, + 75, + 36, + 91, + 83, + 49 + ], + [ + 17, + 36, + 34, + 37, + 40, + 33, + 13, + 59 + ], + [ + 7, + 44, + 48, + 3, + 46, + 56, + 3, + 46 + ], + [ + 31, + 35, + 48, + 47, + 25, + 71, + 14, + 5 + ], + [ + 72, + 27, + 70, + 98, + 77, + 86, + 65, + 36 + ], + [ + 46, + 61, + 85, + 30, + 31, + 78, + 12, + 85 + ], + [ + 32, + 50, + 38, + 64, + 13, + 77, + 38, + 89 + ], + [ + 83, + 20, + 42, + 52, + 71, + 17, + 1, + 73 + ] + ], + [ + [ + 52, + 69, + 82, + 5, + 37, + 66, + 63, + 32 + ], + [ + 84, + 58, + 25, + 60, + 26, + 58, + 55, + 82 + ], + [ + 90, + 50, + 59, + 47, + 2, + 67, + 13, + 51 + ], + [ + 22, + 10, + 43, + 27, + 85, + 71, + 27, + 7 + ], + [ + 54, + 30, + 97, + 64, + 26, + 64, + 79, + 54 + ], + [ + 43, + 48, + 46, + 86, + 26, + 66, + 36, + 3 + ], + [ + 63, + 31, + 35, + 22, + 63, + 24, + 76, + 70 + ], + [ + 31, + 73, + 59, + 56, + 61, + 23, + 21, + 69 + ] + ], + [ + [ + 29, + 11, + 57, + 32, + 95, + 70, + 85, + 82 + ], + [ + 35, + 50, + 78, + 13, + 32, + 92, + 96, + 55 + ], + [ + 20, + 86, + 32, + 94, + 81, + 62, + 36, + 88 + ], + [ + 75, + 71, + 59, + 99, + 29, + 1, + 50, + 30 + ], + [ + 8, + 85, + 74, + 21, + 65, + 80, + 46, + 87 + ], + [ + 13, + 41, + 49, + 82, + 73, + 95, + 47, + 34 + ], + [ + 6, + 59, + 38, + 24, + 39, + 40, + 32, + 74 + ], + [ + 29, + 47, + 99, + 2, + 32, + 27, + 95, + 95 + ] + ], + [ + [ + 0, + 58, + 70, + 92, + 1, + 15, + 80, + 41 + ], + [ + 57, + 68, + 35, + 35, + 57, + 41, + 20, + 82 + ], + [ + 33, + 44, + 6, + 92, + 83, + 90, + 23, + 17 + ], + [ + 95, + 86, + 75, + 55, + 52, + 48, + 58, + 15 + ], + [ + 53, + 9, + 88, + 2, + 1, + 21, + 94, + 61 + ], + [ + 26, + 80, + 7, + 54, + 33, + 93, + 95, + 97 + ], + [ + 37, + 82, + 59, + 92, + 23, + 90, + 34, + 17 + ], + [ + 48, + 96, + 24, + 85, + 89, + 12, + 1, + 79 + ] + ], + [ + [ + 23, + 6, + 67, + 21, + 94, + 86, + 47, + 49 + ], + [ + 28, + 46, + 15, + 7, + 89, + 5, + 69, + 14 + ], + [ + 26, + 86, + 35, + 20, + 47, + 29, + 7, + 86 + ], + [ + 40, + 71, + 8, + 6, + 32, + 19, + 49, + 96 + ], + [ + 77, + 23, + 87, + 40, + 20, + 56, + 34, + 15 + ], + [ + 29, + 18, + 63, + 10, + 85, + 25, + 36, + 97 + ], + [ + 82, + 74, + 44, + 57, + 49, + 10, + 86, + 86 + ], + [ + 69, + 80, + 72, + 21, + 21, + 91, + 99, + 7 + ] + ], + [ + [ + 45, + 1, + 68, + 9, + 42, + 99, + 52, + 20 + ], + [ + 92, + 21, + 45, + 74, + 96, + 24, + 40, + 1 + ], + [ + 38, + 46, + 21, + 89, + 96, + 43, + 2, + 70 + ], + [ + 64, + 43, + 86, + 48, + 58, + 24, + 59, + 84 + ], + [ + 77, + 90, + 85, + 35, + 65, + 74, + 68, + 45 + ], + [ + 53, + 7, + 96, + 23, + 39, + 75, + 97, + 20 + ], + [ + 99, + 60, + 72, + 6, + 84, + 29, + 92, + 34 + ], + [ + 78, + 17, + 45, + 4, + 84, + 47, + 46, + 54 + ] + ], + [ + [ + 10, + 37, + 98, + 29, + 81, + 59, + 47, + 26 + ], + [ + 11, + 28, + 99, + 97, + 58, + 42, + 29, + 16 + ], + [ + 78, + 11, + 41, + 52, + 66, + 29, + 27, + 54 + ], + [ + 59, + 63, + 65, + 10, + 72, + 10, + 23, + 80 + ], + [ + 51, + 7, + 78, + 60, + 90, + 73, + 0, + 97 + ], + [ + 97, + 55, + 94, + 38, + 45, + 12, + 91, + 61 + ], + [ + 55, + 2, + 72, + 27, + 58, + 86, + 32, + 29 + ], + [ + 31, + 91, + 18, + 14, + 79, + 36, + 8, + 29 + ] + ], + [ + [ + 54, + 53, + 29, + 94, + 0, + 33, + 2, + 65 + ], + [ + 71, + 20, + 81, + 91, + 63, + 28, + 10, + 84 + ], + [ + 13, + 18, + 23, + 41, + 82, + 68, + 7, + 64 + ], + [ + 62, + 18, + 69, + 45, + 94, + 12, + 92, + 6 + ], + [ + 15, + 48, + 26, + 12, + 33, + 25, + 67, + 86 + ], + [ + 99, + 78, + 51, + 23, + 55, + 63, + 86, + 29 + ], + [ + 5, + 12, + 5, + 99, + 90, + 35, + 75, + 96 + ], + [ + 74, + 43, + 26, + 11, + 61, + 34, + 71, + 24 + ] + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C4_int": { + "data": [ + [ + 12, + 97, + 76, + 40, + 81, + 53, + 31, + 12 + ], + [ + 4, + 15, + 83, + 99, + 60, + 48, + 21, + 19 + ], + [ + 98, + 45, + 90, + 67, + 79, + 30, + 25, + 0 + ], + [ + 60, + 29, + 99, + 24, + 8, + 56, + 73, + 15 + ], + [ + 40, + 69, + 87, + 91, + 56, + 26, + 60, + 3 + ], + [ + 24, + 65, + 47, + 38, + 27, + 45, + 49, + 75 + ], + [ + 11, + 4, + 59, + 9, + 31, + 82, + 55, + 96 + ], + [ + 29, + 16, + 61, + 60, + 24, + 17, + 76, + 59 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "sum_int": { + "data": [ + 40, + 65, + 35, + 24, + 80, + 81, + 92, + 68 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.expect new file mode 100644 index 0000000000..fbac37d4b8 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.expect @@ -0,0 +1,32 @@ +{ + "r_int": [ + 80, + 54, + 53, + 85, + 94, + 5, + 3, + 92 + ], + "y_int": [ + 0, + 4294967295, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "z_int": [ + 0, + 4294967295, + 0, + 0, + 0, + 0, + 0, + 3 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse new file mode 100644 index 0000000000..43dbd797e2 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse @@ -0,0 +1,56 @@ +// BEGIN macro definitions + + + + +// END macro definitions + +decl r_int: ubit<32>[8]; +decl y_int: ubit<32>[8]; + +// XXX(rachit): This should be a local array. +decl z_int: ubit<32>[8]; + +let alpha: ubit<32> = 0 - r_int[0]; +let beta: ubit<32> = 1; +y_int[0] := alpha; +--- +for (let k: ubit<4> = 1..8) { + beta := (1 - alpha * alpha) * beta; + + let sum: ubit<32> = 0; + let i: ubit<4> = 0; + while (i < k) { + decor "#pragma HLS loop_tripcount min=1 max=7 avg=4" + sum := sum + r_int[k-i-1] * y_int[i]; + // Update loop counter + i := i + 1; + } + --- + // modification to prevent div by 0 + if (beta != 0) { + alpha := 0 - (r_int[k] + sum)/beta; + } else { + alpha := 0; + } + + i := 0; + while(i < k) { + decor "#pragma HLS loop_tripcount min=1 max=7 avg=4" + let y_i: ubit<32> = y_int[i]; + --- + z_int[i] := y_i + alpha * y_int[k-i-1]; + // Update loop counter + i := i + 1; + } + --- + i := 0; + while(i < k) { + decor "#pragma HLS loop_tripcount min=1 max=7 avg=4" + y_int[i] := z_int[i]; + // Update loop counter + i := i + 1; + } + --- + y_int[k] := alpha; +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse.data new file mode 100644 index 0000000000..f09529820a --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-durbin.fuse.data @@ -0,0 +1,53 @@ +{ + "r_int": { + "data": [ + 80, + 54, + 53, + 85, + 94, + 5, + 3, + 92 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y_int": { + "data": [ + 67, + 73, + 51, + 45, + 8, + 76, + 24, + 69 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "z_int": { + "data": [ + 29, + 5, + 46, + 35, + 27, + 0, + 0, + 3 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.expect new file mode 100644 index 0000000000..c7b7a401c5 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.expect @@ -0,0 +1,254 @@ +{ + "A_int": [ + [ + 30, + 15, + 35, + 2, + 3, + 62, + 62, + 25 + ], + [ + 93, + 46, + 88, + 26, + 98, + 16, + 10, + 9 + ], + [ + 80, + 28, + 75, + 83, + 58, + 48, + 66, + 59 + ], + [ + 66, + 38, + 83, + 62, + 99, + 87, + 51, + 75 + ], + [ + 95, + 12, + 75, + 4, + 44, + 32, + 93, + 91 + ], + [ + 23, + 39, + 49, + 91, + 85, + 19, + 95, + 0 + ], + [ + 82, + 48, + 51, + 37, + 36, + 47, + 57, + 57 + ], + [ + 18, + 30, + 13, + 73, + 43, + 76, + 76, + 82 + ] + ], + "B_int": [ + [ + 67, + 87, + 99, + 6, + 20, + 94, + 68, + 64 + ], + [ + 6, + 38, + 51, + 21, + 69, + 85, + 3, + 89 + ], + [ + 18, + 47, + 64, + 62, + 88, + 77, + 51, + 61 + ], + [ + 4, + 68, + 56, + 77, + 82, + 86, + 41, + 99 + ], + [ + 42, + 76, + 74, + 45, + 70, + 26, + 33, + 80 + ], + [ + 33, + 21, + 23, + 21, + 91, + 25, + 46, + 12 + ], + [ + 61, + 79, + 2, + 60, + 35, + 13, + 21, + 20 + ], + [ + 12, + 76, + 24, + 37, + 56, + 91, + 78, + 97 + ] + ], + "C_int": [ + [ + 224800, + 333447, + 212509, + 228259, + 359311, + 297509, + 261771, + 262411 + ], + [ + 345505, + 626529, + 669381, + 369627, + 609426, + 647861, + 426210, + 679393 + ], + [ + 407278, + 816699, + 646790, + 548912, + 782490, + 797554, + 577848, + 823155 + ], + [ + 443978, + 861643, + 714851, + 583219, + 935818, + 843874, + 647353, + 908324 + ], + [ + 438304, + 773121, + 541279, + 441807, + 606743, + 692745, + 569584, + 676398 + ], + [ + 332469, + 666440, + 489605, + 523902, + 653771, + 526216, + 339813, + 655279 + ], + [ + 354056, + 667399, + 533583, + 395969, + 611732, + 681014, + 477449, + 660739 + ], + [ + 304892, + 638003, + 389006, + 460540, + 668544, + 581775, + 456043, + 642358 + ] + ], + "alpha_int": [ + 25 + ], + "beta_int": [ + 94 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse new file mode 100644 index 0000000000..0514b8f0ef --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse @@ -0,0 +1,68 @@ +// BEGIN macro defintions + + + + + + + + +// END macro definitions + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl C_int: ubit<32>[8][8]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][8]; + +let C: ubit<32>[8][8]; +let A: ubit<32>[8][8]; +let B: ubit<32>[8][8]; + +view C_sh = C[_: bank 1][_: bank 1]; +view A_sh = A[_: bank 1][_: bank 1]; +view B_sh = B[_: bank 1][_: bank 1]; + +let alpha_ = alpha_int[0]; +let beta_ = beta_int[0]; + +// Input interface. +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + A_sh[i][j] := A_int[i][j]; + B_sh[i][j] := B_int[i][j]; + C_sh[i][j] := C_int[i][j]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let C_i_j: ubit<32> = C[i][j]; + --- + C[i][j] := C_i_j * beta_; + } + + --- + + // Loop order has to change since j is not defined in the combine + // block otherwise. + for (let j: ubit<4> = 0..8) { + for (let k: ubit<4> = 0..8) { + let v: ubit<32> = alpha_ * A[i][k] * B[k][j]; + } combine { + C[i][j] += v; + } + } +} + +--- + +// Output interface. + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + C_int[i][j] := C_sh[i][j]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse.data new file mode 100644 index 0000000000..a0aa8c70a5 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemm.fuse.data @@ -0,0 +1,289 @@ +{ + "alpha_int": { + "data": [ + 25 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 94 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C_int": { + "data": [ + [ + 0, + 13, + 11, + 61, + 19, + 61, + 84, + 69 + ], + [ + 70, + 16, + 74, + 33, + 79, + 94, + 40, + 22 + ], + [ + 87, + 96, + 35, + 23, + 85, + 41, + 67, + 70 + ], + [ + 87, + 22, + 29, + 26, + 72, + 96, + 87, + 71 + ], + [ + 16, + 34, + 66, + 78, + 72, + 55, + 86, + 92 + ], + [ + 76, + 85, + 45, + 8, + 59, + 14, + 2, + 91 + ], + [ + 24, + 71, + 57, + 51, + 3, + 81, + 71, + 6 + ], + [ + 93, + 37, + 74, + 35, + 1, + 75, + 97, + 7 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 30, + 15, + 35, + 2, + 3, + 62, + 62, + 25 + ], + [ + 93, + 46, + 88, + 26, + 98, + 16, + 10, + 9 + ], + [ + 80, + 28, + 75, + 83, + 58, + 48, + 66, + 59 + ], + [ + 66, + 38, + 83, + 62, + 99, + 87, + 51, + 75 + ], + [ + 95, + 12, + 75, + 4, + 44, + 32, + 93, + 91 + ], + [ + 23, + 39, + 49, + 91, + 85, + 19, + 95, + 0 + ], + [ + 82, + 48, + 51, + 37, + 36, + 47, + 57, + 57 + ], + [ + 18, + 30, + 13, + 73, + 43, + 76, + 76, + 82 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 67, + 87, + 99, + 6, + 20, + 94, + 68, + 64 + ], + [ + 6, + 38, + 51, + 21, + 69, + 85, + 3, + 89 + ], + [ + 18, + 47, + 64, + 62, + 88, + 77, + 51, + 61 + ], + [ + 4, + 68, + 56, + 77, + 82, + 86, + 41, + 99 + ], + [ + 42, + 76, + 74, + 45, + 70, + 26, + 33, + 80 + ], + [ + 33, + 21, + 23, + 21, + 91, + 25, + 46, + 12 + ], + [ + 61, + 79, + 2, + 60, + 35, + 13, + 21, + 20 + ], + [ + 12, + 76, + 24, + 37, + 56, + 91, + 78, + 97 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.expect new file mode 100644 index 0000000000..7aaded20ac --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.expect @@ -0,0 +1,170 @@ +{ + "A_int": [ + [ + 1158, + 779, + 1980, + 1672, + 1136, + 1509, + 1422, + 1811 + ], + [ + 1501, + 981, + 3235, + 2271, + 2151, + 1758, + 2023, + 1705 + ], + [ + 6390, + 4140, + 12683, + 9434, + 7977, + 7649, + 8233, + 8194 + ], + [ + 4424, + 2823, + 6861, + 6110, + 3798, + 5586, + 4983, + 6813 + ], + [ + 6076, + 3958, + 12949, + 9164, + 8401, + 7048, + 8140, + 7076 + ], + [ + 5398, + 3466, + 10490, + 7853, + 6513, + 6431, + 6804, + 6988 + ], + [ + 4928, + 3183, + 9476, + 7197, + 5907, + 5993, + 6292, + 6515 + ], + [ + 6929, + 4581, + 14326, + 10457, + 9148, + 8212, + 9166, + 8577 + ] + ], + "alpha_int": [ + 87 + ], + "beta_int": [ + 35 + ], + "u1_int": [ + 3, + 22, + 65, + 5, + 82, + 50, + 43, + 81 + ], + "u2_int": [ + 19, + 15, + 81, + 75, + 66, + 70, + 66, + 83 + ], + "v1_int": [ + 28, + 20, + 89, + 49, + 66, + 27, + 49, + 14 + ], + "v2_int": [ + 56, + 35, + 85, + 77, + 45, + 72, + 62, + 89 + ], + "w_int": [ + 2550846912, + 2987456512, + 3372713567, + 3598216752, + 2271099903, + 3748601636, + 3543689434, + 1291069916 + ], + "x_int": [ + 54584155, + 35574806, + 108460862, + 80783592, + 68253741, + 65410381, + 70548875, + 69966960 + ], + "y_int": [ + 47, + 14, + 34, + 8, + 26, + 40, + 77, + 69 + ], + "z_int": [ + 53, + 45, + 39, + 21, + 2, + 51, + 72, + 88 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse new file mode 100644 index 0000000000..b7b89adca7 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse @@ -0,0 +1,113 @@ +// BEGIN macro definitions + + + + +// END macro definitions + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl A_int: ubit<32>[8][8]; +decl u1_int: ubit<32>[8]; +decl v1_int: ubit<32>[8]; +decl u2_int: ubit<32>[8]; +decl v2_int: ubit<32>[8]; +decl w_int: ubit<32>[8]; +decl x_int: ubit<32>[8]; +decl y_int: ubit<32>[8]; +decl z_int: ubit<32>[8]; + +let A: ubit<32>[8][8]; +let u1: ubit<32>[8]; +let v1: ubit<32>[8]; +let u2: ubit<32>[8]; +let v2: ubit<32>[8]; +let w: ubit<32>[8]; +let x: ubit<32>[8]; +let y: ubit<32>[8]; +let z: ubit<32>[8]; + +view A_sh = A[_: bank 1][_: bank 1]; +view u1_sh = u1[_: bank 1]; +view v1_sh = v1[_: bank 1]; +view u2_sh = u2[_: bank 1]; +view v2_sh = v2[_: bank 1]; +view w_sh = w[_: bank 1]; +view x_sh = x[_: bank 1]; +view y_sh = y[_: bank 1]; +view z_sh = z[_: bank 1]; + +// Scalar inputs. +let alpha_ = alpha_int[0]; +let beta_ = beta_int[0]; + +// Input interfaces. +for (let i: ubit<4> = 0..8) { + u1_sh[i] := u1_int[i]; + v1_sh[i] := v1_int[i]; + u2_sh[i] := u2_int[i]; + v2_sh[i] := v2_int[i]; + w_sh[i] := w_int[i]; + x_sh[i] := x_int[i]; + y_sh[i] := y_int[i]; + z_sh[i] := z_int[i]; +} +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + A_sh[i][j] := A_int[i][j]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let tmp1 = u1[i] * v1[j] + u2[i] * v2[j]; + let old = A[i][j]; + --- + A[i][j] := old + tmp1; + } +} +--- +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let tmp2 = beta_ * A[j][i] * y[j]; + } combine { + x[i] += tmp2; + } +} +--- +// We could've moved this up and parallelized with loop1. +for (let i: ubit<4> = 0..8) { + let tmp3 = z[i]; + let old = x[i]; + --- + x[i] := old + tmp3; +} +--- +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let tmp4 = alpha_ * A[i][j] * x[j]; + } combine { + w[i] += tmp4; + } +} + +--- + +// Output interfaces. +for (let i: ubit<4> = 0..8) { + u1_int[i] := u1_sh[i]; + v1_int[i] := v1_sh[i]; + u2_int[i] := u2_sh[i]; + v2_int[i] := v2_sh[i]; + w_int[i] := w_sh[i]; + x_int[i] := x_sh[i]; + y_int[i] := y_sh[i]; + z_int[i] := z_sh[i]; +} +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + A_int[i][j] := A_sh[i][j]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse.data new file mode 100644 index 0000000000..ce79b92323 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gemver.fuse.data @@ -0,0 +1,247 @@ +{ + "alpha_int": { + "data": [ + 87 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 35 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 10, + 54, + 98, + 62, + 83, + 60, + 97, + 78 + ], + [ + 45, + 16, + 2, + 38, + 24, + 84, + 15, + 62 + ], + [ + 34, + 5, + 13, + 12, + 42, + 62, + 26, + 75 + ], + [ + 84, + 98, + 41, + 90, + 93, + 51, + 88, + 68 + ], + [ + 84, + 8, + 41, + 64, + 19, + 82, + 30, + 54 + ], + [ + 78, + 16, + 90, + 13, + 63, + 41, + 14, + 58 + ], + [ + 28, + 13, + 39, + 8, + 99, + 80, + 93, + 39 + ], + [ + 13, + 56, + 62, + 97, + 67, + 49, + 51, + 56 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "u1_int": { + "data": [ + 3, + 22, + 65, + 5, + 82, + 50, + 43, + 81 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "v1_int": { + "data": [ + 28, + 20, + 89, + 49, + 66, + 27, + 49, + 14 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "u2_int": { + "data": [ + 19, + 15, + 81, + 75, + 66, + 70, + 66, + 83 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "v2_int": { + "data": [ + 56, + 35, + 85, + 77, + 45, + 72, + 62, + 89 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "w_int": { + "data": [ + 47, + 53, + 64, + 85, + 46, + 34, + 76, + 3 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "x_int": { + "data": [ + 27, + 96, + 23, + 71, + 64, + 20, + 3, + 87 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y_int": { + "data": [ + 47, + 14, + 34, + 8, + 26, + 40, + 77, + 69 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "z_int": { + "data": [ + 53, + 45, + 39, + 21, + 2, + 51, + 72, + 88 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.expect new file mode 100644 index 0000000000..3af33c7d5c --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.expect @@ -0,0 +1,202 @@ +{ + "A_int": [ + [ + 47, + 12, + 61, + 45, + 89, + 54, + 29, + 42 + ], + [ + 75, + 85, + 98, + 51, + 23, + 84, + 51, + 0 + ], + [ + 71, + 98, + 24, + 10, + 22, + 41, + 80, + 40 + ], + [ + 52, + 2, + 1, + 59, + 28, + 93, + 85, + 46 + ], + [ + 37, + 11, + 90, + 8, + 38, + 57, + 44, + 47 + ], + [ + 45, + 80, + 50, + 37, + 48, + 9, + 71, + 73 + ], + [ + 2, + 65, + 85, + 19, + 60, + 29, + 74, + 35 + ], + [ + 23, + 94, + 29, + 40, + 12, + 89, + 37, + 91 + ] + ], + "B_int": [ + [ + 11, + 70, + 93, + 70, + 12, + 41, + 65, + 90 + ], + [ + 2, + 56, + 47, + 9, + 97, + 5, + 68, + 98 + ], + [ + 75, + 67, + 71, + 16, + 96, + 85, + 89, + 70 + ], + [ + 17, + 73, + 65, + 25, + 39, + 80, + 55, + 36 + ], + [ + 59, + 32, + 55, + 17, + 80, + 24, + 16, + 61 + ], + [ + 45, + 94, + 93, + 25, + 29, + 91, + 51, + 50 + ], + [ + 69, + 19, + 57, + 0, + 11, + 68, + 53, + 72 + ], + [ + 80, + 31, + 69, + 99, + 59, + 77, + 70, + 2 + ] + ], + "alpha_int": [ + 37 + ], + "beta_int": [ + 11 + ], + "tmp_int": [ + 16604, + 21001, + 18520, + 13539, + 10990, + 20532, + 14211, + 19877 + ], + "x_int": [ + 72, + 87, + 20, + 83, + 51, + 10, + 0, + 51 + ], + "y_int": [ + 836152, + 960715, + 941463, + 672268, + 593344, + 982896, + 665221, + 976734 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse new file mode 100644 index 0000000000..7ab0e866bc --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse @@ -0,0 +1,70 @@ +// BEGIN macro definitions + + + + +// END macro definitions + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl tmp_int: ubit<32>[8]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][8]; +decl x_int: ubit<32>[8]; +decl y_int: ubit<32>[8]; + +let tmp: ubit<32>[8]; +let A: ubit<32>[8][8]; +let B: ubit<32>[8][8]; +let x: ubit<32>[8]; +let y: ubit<32>[8]; + +view tmp_sh = tmp[_: bank 1]; +view A_sh = A[_: bank 1][_: bank 1]; +view B_sh = B[_: bank 1][_: bank 1]; +view x_sh = x[_: bank 1]; +view y_sh = y[_: bank 1]; + +let alpha_ = alpha_int[0]; +let beta_ = beta_int[0]; + +for (let i0: ubit<4> = 0..8) { + tmp_sh[i0] := tmp_int[i0]; + x_sh[i0] := x_int[i0]; + y_sh[i0] := y_int[i0]; + for (let j0: ubit<4> = 0..8) { + A_sh[i0][j0] := A_int[i0][j0]; + B_sh[i0][j0] := B_int[i0][j0]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + tmp[i] := 0; + y[i] := 0; + --- + for (let j: ubit<4> = 0..8) { + let t1 = A[i][j] * x[j]; + let t2 = B[i][j] * x[j]; + } combine { + tmp[i] += t1; + y[i] += t2; + } + --- + let y_i: ubit<32> = y[i]; + --- + y[i] := alpha_ * tmp[i] + beta_ * y_i; +} + +--- + +for (let i0: ubit<4> = 0..8) { + tmp_int[i0] := tmp_sh[i0]; + x_int[i0] := x_sh[i0]; + y_int[i0] := y_sh[i0]; + for (let j0: ubit<4> = 0..8) { + A_int[i0][j0] := A_sh[i0][j0]; + B_int[i0][j0] := B_sh[i0][j0]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse.data new file mode 100644 index 0000000000..a9f5d8e428 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gesummv.fuse.data @@ -0,0 +1,251 @@ +{ + "alpha_int": { + "data": [ + 37 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 11 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 47, + 12, + 61, + 45, + 89, + 54, + 29, + 42 + ], + [ + 75, + 85, + 98, + 51, + 23, + 84, + 51, + 0 + ], + [ + 71, + 98, + 24, + 10, + 22, + 41, + 80, + 40 + ], + [ + 52, + 2, + 1, + 59, + 28, + 93, + 85, + 46 + ], + [ + 37, + 11, + 90, + 8, + 38, + 57, + 44, + 47 + ], + [ + 45, + 80, + 50, + 37, + 48, + 9, + 71, + 73 + ], + [ + 2, + 65, + 85, + 19, + 60, + 29, + 74, + 35 + ], + [ + 23, + 94, + 29, + 40, + 12, + 89, + 37, + 91 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 11, + 70, + 93, + 70, + 12, + 41, + 65, + 90 + ], + [ + 2, + 56, + 47, + 9, + 97, + 5, + 68, + 98 + ], + [ + 75, + 67, + 71, + 16, + 96, + 85, + 89, + 70 + ], + [ + 17, + 73, + 65, + 25, + 39, + 80, + 55, + 36 + ], + [ + 59, + 32, + 55, + 17, + 80, + 24, + 16, + 61 + ], + [ + 45, + 94, + 93, + 25, + 29, + 91, + 51, + 50 + ], + [ + 69, + 19, + 57, + 0, + 11, + 68, + 53, + 72 + ], + [ + 80, + 31, + 69, + 99, + 59, + 77, + 70, + 2 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "tmp_int": { + "data": [ + 79, + 94, + 59, + 70, + 26, + 29, + 67, + 76 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "x_int": { + "data": [ + 72, + 87, + 20, + 83, + 51, + 10, + 0, + 51 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y_int": { + "data": [ + 77, + 27, + 74, + 98, + 44, + 21, + 38, + 64 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.expect new file mode 100644 index 0000000000..e2f1867c8b --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.expect @@ -0,0 +1,400 @@ +{ + "A_int": [ + [ + 50, + 70, + 59, + 96, + 19, + 36, + 40, + 33, + 22, + 24, + 75, + 34 + ], + [ + 54, + 59, + 76, + 23, + 50, + 33, + 43, + 88, + 76, + 49, + 69, + 93 + ], + [ + 45, + 14, + 38, + 91, + 10, + 33, + 9, + 27, + 82, + 78, + 90, + 92 + ], + [ + 14, + 47, + 0, + 45, + 63, + 48, + 5, + 8, + 17, + 26, + 26, + 11 + ], + [ + 95, + 23, + 84, + 7, + 18, + 48, + 80, + 70, + 6, + 10, + 61, + 27 + ], + [ + 39, + 40, + 26, + 94, + 79, + 97, + 95, + 81, + 86, + 37, + 33, + 93 + ], + [ + 82, + 24, + 64, + 52, + 20, + 76, + 44, + 50, + 53, + 1, + 53, + 80 + ], + [ + 33, + 8, + 35, + 94, + 66, + 51, + 0, + 24, + 51, + 81, + 20, + 6 + ] + ], + "Q_int": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ], + "R_int": [ + [ + 161, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 47, + 116, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 29, + 69, + 154, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 61, + 85, + 37, + 201, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 22, + 7, + 70, + 81, + 135, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 58, + 37, + 54, + 95, + 88, + 160, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 93, + 77, + 77, + 77, + 74, + 48, + 144, + 0, + 0, + 0, + 0, + 0 + ], + [ + 89, + 23, + 68, + 31, + 55, + 83, + 42, + 155, + 0, + 0, + 0, + 0 + ], + [ + 60, + 44, + 11, + 97, + 84, + 40, + 72, + 88, + 161, + 0, + 0, + 0 + ], + [ + 67, + 64, + 84, + 17, + 91, + 79, + 59, + 17, + 30, + 133, + 0, + 0 + ], + [ + 84, + 15, + 35, + 46, + 83, + 38, + 7, + 27, + 33, + 67, + 164, + 0 + ], + [ + 42, + 97, + 27, + 92, + 90, + 66, + 76, + 11, + 44, + 18, + 18, + 184 + ] + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse new file mode 100644 index 0000000000..bb1220cdc1 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse @@ -0,0 +1,82 @@ +import c++("math.h") + vivado("math.h") + futil("primitives/math.futil") { + def sqrt(in: ubit<32>): ubit<32>; +} + +decl A_int: ubit<32>[8][12]; +decl R_int: ubit<32>[12][12]; +decl Q_int: ubit<32>[8][12]; + +let A: ubit<32>[8][12]; +let R: ubit<32>[12][12]; +let Q: ubit<32>[8][12]; + +view A_sh = A[_: bank 1][_: bank 1]; +view Q_sh = Q[_: bank 1][_: bank 1]; +view R_sh = R[_: bank 1][_: bank 1]; + +for (let init0: ubit<4> = 0..12) { + for (let init1: ubit<4> = 0..12) { + R_sh[init0][init1] := R_int[init0][init1]; + } +} + +for (let i0: ubit<4> = 0..8) { + for (let j0: ubit<4> = 0..12) { + A_sh[i0][j0] := A_int[i0][j0]; + Q_sh[i0][j0] := Q_int[i0][j0]; + } +} + +--- + +for (let k: ubit<4> = 0..12) { + let nrm: ubit<32> = 0; + + for (let i: ubit<4> = 0..8) { + let A_i_k = A[i][k]; + } combine { + nrm += A_i_k * A_i_k; + } + + let sq = sqrt(nrm); + R[k][k] := sq; + --- + for (let i: ubit<4> = 0..8) { + Q[i][k] := A[i][k] / R[k][k]; + } + --- + let j: ubit<4> = k + (1 as ubit<4>); + while (j < 12) { + decor "#pragma HLS loop_tripcount min=0 max=11 avg=6" + R[k][j] := 0; + --- + for (let i: ubit<4> = 0..8) { + let v: ubit<32> = Q[i][k] * A[i][j]; + } combine { + R[k][j] += v; + } + --- + for (let i: ubit<4> = 0..8) { + let A_i_j = A[i][j]; + --- + A[i][j] := A_i_j - Q[i][k] * R[k][j]; + } + // Update loop counter + j := j + (1 as ubit<4>); + } +} +--- +for (let init0: ubit<4> = 0..12) { + for (let init1: ubit<4> = 0..12) { + R_int[init0][init1] := R_sh[init0][init1]; + } +} + +for (let i0: ubit<4> = 0..8) { + for (let j0: ubit<4> = 0..12) { + A_int[i0][j0] := A_sh[i0][j0]; + Q_int[i0][j0] := Q_sh[i0][j0]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse.data new file mode 100644 index 0000000000..cd3cd43608 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-gramschmidt.fuse.data @@ -0,0 +1,421 @@ +{ + "A_int": { + "data": [ + [ + 50, + 70, + 59, + 96, + 19, + 36, + 40, + 33, + 22, + 24, + 75, + 34 + ], + [ + 54, + 59, + 76, + 23, + 50, + 33, + 43, + 88, + 76, + 49, + 69, + 93 + ], + [ + 45, + 14, + 38, + 91, + 10, + 33, + 9, + 27, + 82, + 78, + 90, + 92 + ], + [ + 14, + 47, + 0, + 45, + 63, + 48, + 5, + 8, + 17, + 26, + 26, + 11 + ], + [ + 95, + 23, + 84, + 7, + 18, + 48, + 80, + 70, + 6, + 10, + 61, + 27 + ], + [ + 39, + 40, + 26, + 94, + 79, + 97, + 95, + 81, + 86, + 37, + 33, + 93 + ], + [ + 82, + 24, + 64, + 52, + 20, + 76, + 44, + 50, + 53, + 1, + 53, + 80 + ], + [ + 33, + 8, + 35, + 94, + 66, + 51, + 0, + 24, + 51, + 81, + 20, + 6 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "R_int": { + "data": [ + [ + 6, + 88, + 24, + 61, + 0, + 89, + 33, + 41, + 71, + 11, + 26, + 2 + ], + [ + 47, + 20, + 79, + 16, + 19, + 16, + 97, + 6, + 85, + 0, + 5, + 74 + ], + [ + 29, + 69, + 53, + 60, + 4, + 92, + 71, + 41, + 99, + 64, + 20, + 52 + ], + [ + 61, + 85, + 37, + 62, + 28, + 81, + 3, + 38, + 87, + 19, + 31, + 63 + ], + [ + 22, + 7, + 70, + 81, + 0, + 67, + 65, + 75, + 88, + 60, + 59, + 95 + ], + [ + 58, + 37, + 54, + 95, + 88, + 88, + 89, + 79, + 89, + 94, + 5, + 32 + ], + [ + 93, + 77, + 77, + 77, + 74, + 48, + 61, + 30, + 97, + 79, + 84, + 7 + ], + [ + 89, + 23, + 68, + 31, + 55, + 83, + 42, + 13, + 16, + 74, + 41, + 70 + ], + [ + 60, + 44, + 11, + 97, + 84, + 40, + 72, + 88, + 8, + 89, + 51, + 29 + ], + [ + 67, + 64, + 84, + 17, + 91, + 79, + 59, + 17, + 30, + 79, + 8, + 77 + ], + [ + 84, + 15, + 35, + 46, + 83, + 38, + 7, + 27, + 33, + 67, + 32, + 67 + ], + [ + 42, + 97, + 27, + 92, + 90, + 66, + 76, + 11, + 44, + 18, + 18, + 10 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "Q_int": { + "data": [ + [ + 63, + 20, + 24, + 70, + 1, + 86, + 44, + 6, + 24, + 9, + 98, + 31 + ], + [ + 18, + 91, + 7, + 1, + 41, + 57, + 8, + 73, + 32, + 40, + 0, + 40 + ], + [ + 73, + 50, + 20, + 20, + 34, + 88, + 11, + 72, + 29, + 47, + 6, + 73 + ], + [ + 22, + 11, + 73, + 85, + 98, + 28, + 98, + 74, + 1, + 96, + 73, + 66 + ], + [ + 10, + 38, + 50, + 49, + 54, + 99, + 7, + 39, + 34, + 42, + 97, + 48 + ], + [ + 86, + 37, + 38, + 9, + 26, + 77, + 53, + 55, + 79, + 46, + 96, + 47 + ], + [ + 31, + 38, + 55, + 51, + 69, + 36, + 59, + 44, + 33, + 24, + 13, + 74 + ], + [ + 96, + 91, + 12, + 3, + 41, + 56, + 75, + 88, + 12, + 57, + 86, + 39 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.expect new file mode 100644 index 0000000000..68c58a75e2 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.expect @@ -0,0 +1,84 @@ +{ + "A_int": [ + [ + 9, + 52, + 2, + 7, + 62, + 99, + 21, + 59 + ], + [ + 0, + 31, + 21, + 74, + 86, + 17, + 91, + 74 + ], + [ + 3, + 138547329, + 1385473478, + 2632399549, + 969831452, + 1939662496, + 277094906, + 2632399420 + ], + [ + 9, + 138547317, + 1, + 826, + 673, + 4294966848, + 1028, + 560 + ], + [ + 1, + 138547330, + 0, + 3186924, + 3119998929, + 3367404563, + 1295904309, + 847722013 + ], + [ + 3, + 138547329, + 0, + 3186924, + 0, + 3367404378, + 1295904317, + 847721933 + ], + [ + 3, + 138547330, + 0, + 3186924, + 0, + 1, + 4294967200, + 4294967224 + ], + [ + 2, + 138547329, + 0, + 3186924, + 1, + 1, + 0, + 3447245391 + ] + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse new file mode 100644 index 0000000000..a88c121c85 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse @@ -0,0 +1,58 @@ +// BEGIN macro definition + + + + +// END macro definition + +decl A_int: ubit<32>[8][8]; + +for (let i: ubit<4> = 0..8) { + let j: ubit<4> = 0; + while (j < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let k: ubit<4> = 0; + while(k < j) { + decor "#pragma HLS loop_tripcount min=0 max=6 avg=2" + let A_i_j = A_int[i][j]; + --- + let A_i_k = A_int[i][k]; + --- + let A_k_j = A_int[k][j]; + --- + A_int[i][j] := A_i_j - A_i_k * A_k_j; + + // Update loop counter + k := k + 1; + } + --- + let A_i_j = A_int[i][j]; + --- + let A_j_j = A_int[j][j]; + --- + A_int[i][j] := A_i_j / A_j_j; + + // Update loop counter + j := j + 1; + } + --- + j := i; + while (j < 8) { + decor "#pragma HLS loop_tripcount min=1 max=8 avg=4" + let k: ubit<4> = 0; + while (k < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=2" + let A_i_j = A_int[i][j]; + --- + let A_i_k = A_int[i][k]; + --- + let A_k_j = A_int[k][j]; + --- + A_int[i][j] := A_i_j - A_i_k * A_k_j; + // Update loop counter + k := k + 1; + } + // Update loop counter + j := j + 1; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse.data new file mode 100644 index 0000000000..841d39e6fc --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-lu.fuse.data @@ -0,0 +1,91 @@ +{ + "A_int": { + "data": [ + [ + 9, + 52, + 2, + 7, + 62, + 99, + 21, + 59 + ], + [ + 5, + 31, + 21, + 74, + 86, + 17, + 91, + 74 + ], + [ + 29, + 89, + 97, + 28, + 44, + 90, + 20, + 55 + ], + [ + 84, + 29, + 60, + 8, + 57, + 32, + 82, + 81 + ], + [ + 12, + 10, + 72, + 91, + 39, + 24, + 48, + 44 + ], + [ + 27, + 67, + 48, + 57, + 60, + 20, + 7, + 8 + ], + [ + 35, + 95, + 24, + 53, + 21, + 94, + 2, + 10 + ], + [ + 18, + 29, + 17, + 43, + 19, + 98, + 97, + 57 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.expect new file mode 100644 index 0000000000..018f425748 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.expect @@ -0,0 +1,114 @@ +{ + "A_int": [ + [ + 20, + 96, + 10, + 70, + 64, + 68, + 9, + 29 + ], + [ + 3, + 4294967085, + 43, + 4294967182, + 4294967135, + 4294967143, + 33, + 4294967236 + ], + [ + 1, + 1, + 4294967269, + 87, + 144, + 135, + 4294967286, + 116 + ], + [ + 2, + 1, + 0, + 24, + 123, + 24, + 4294967289, + 4 + ], + [ + 1, + 1, + 0, + 5, + 4294966795, + 4294967286, + 69, + 100 + ], + [ + 0, + 0, + 0, + 2, + 1, + 4294967260, + 20, + 4294967274 + ], + [ + 2, + 1, + 1, + 178956969, + 0, + 0, + 1252698837, + 3579139335 + ], + [ + 3, + 0, + 0, + 178956965, + 0, + 0, + 0, + 3579139355 + ] + ], + "b_int": [ + 23, + 13, + 88, + 73, + 22, + 85, + 30, + 76 + ], + "x_int": [ + 17895700, + 0, + 0, + 178956969, + 1, + 0, + 1, + 0 + ], + "y_int": [ + 23, + 4294967240, + 121, + 83, + 4294966936, + 279, + 2326440676, + 2326441096 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse new file mode 100644 index 0000000000..c2ec591f44 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse @@ -0,0 +1,104 @@ +// BEGIN macro definition + + + + + + + + + + + +// END macro definition + +decl A_int: ubit<32>[8][8]; +decl b_int: ubit<32>[8]; +decl x_int: ubit<32>[8]; +decl y_int: ubit<32>[8]; + +// outer 1 +for (let i: ubit<4> = 0..8) { + // inner 1.1 + let j: ubit<4> = 0; + while (j < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let w: ubit<32> = A_int[i][j]; + --- + // inner 1.1.1 + let k: ubit<4> = 0; + while (k < j) { + decor "#pragma HLS loop_tripcount min=0 max=6 avg=2" + let A_i_k: ubit<32> = A_int[i][k]; + --- + w := w - (A_i_k * A_int[k][j]); + k := k + 1; + } + --- + let A_j_j: ubit<32> = A_int[j][j]; + --- + if (A_j_j != 0) { + A_int[i][j] := w / A_j_j; + } + j := j + 1; + } + + --- + + // inner 1.2 + j := i; + while(j < 8) { + decor "#pragma HLS loop_tripcount min=1 max=8 avg=4" + let w: ubit<32> = A_int[i][j]; + --- + // inner 1.2.1 + let k: ubit<4> = 0; + while(k < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=2" + let A_i_k: ubit<32> = A_int[i][k]; + --- + w := w - (A_i_k * A_int[k][j]); + k := k + 1; + } + --- + A_int[i][j] := w; + + j := j + 1; + } +} + +--- + +// outer 2 +for (let i: ubit<4> = 0..8) { + let w: ubit<32> = b_int[i]; + // inner 2.1 + let j: ubit<4> = 0; + while (j < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + w := w - (A_int[i][j] * y_int[j]); + j := j + 1; + } + --- + y_int[i] := w; +} +--- + +// outer 3 +let i: ubit<4> = 8 - 1; +while (i >= 0 && i < 8) { + decor "#pragma HLS loop_tripcount min=8 max=8 avg=8" + let w: ubit<32> = y_int[i]; + // inner 3.1 + let j: ubit<4> = i + 1; + while (j < 8) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + w := w - (A_int[i][j] * x_int[j]); + j := j + 1; + } + --- + if (A_int[i][i] != 0) { + x_int[i] := w / A_int[i][i]; + } + i := i - 1; +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse.data new file mode 100644 index 0000000000..56155501aa --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-ludcmp.fuse.data @@ -0,0 +1,142 @@ +{ + "A_int": { + "data": [ + [ + 20, + 96, + 10, + 70, + 64, + 68, + 9, + 29 + ], + [ + 65, + 77, + 73, + 96, + 31, + 51, + 60, + 27 + ], + [ + 21, + 74, + 26, + 43, + 47, + 50, + 32, + 85 + ], + [ + 59, + 21, + 95, + 50, + 90, + 7, + 44, + 2 + ], + [ + 24, + 23, + 23, + 95, + 17, + 25, + 76, + 89 + ], + [ + 18, + 99, + 18, + 55, + 3, + 2, + 75, + 86 + ], + [ + 58, + 70, + 60, + 77, + 17, + 11, + 95, + 29 + ], + [ + 70, + 60, + 72, + 76, + 66, + 18, + 29, + 6 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "b_int": { + "data": [ + 23, + 13, + 88, + 73, + 22, + 85, + 30, + 76 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "x_int": { + "data": [ + 8, + 83, + 84, + 5, + 58, + 28, + 40, + 69 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y_int": { + "data": [ + 49, + 39, + 13, + 10, + 77, + 86, + 84, + 89 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.expect new file mode 100644 index 0000000000..0c763ae8bf --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.expect @@ -0,0 +1,124 @@ +{ + "A_int": [ + [ + 12, + 1, + 85, + 34, + 3, + 26, + 94, + 74 + ], + [ + 41, + 58, + 95, + 99, + 73, + 80, + 59, + 1 + ], + [ + 91, + 12, + 26, + 37, + 68, + 84, + 34, + 93 + ], + [ + 44, + 98, + 66, + 12, + 0, + 35, + 28, + 19 + ], + [ + 67, + 59, + 60, + 62, + 86, + 92, + 11, + 67 + ], + [ + 96, + 36, + 63, + 85, + 87, + 94, + 37, + 93 + ], + [ + 75, + 75, + 89, + 90, + 38, + 99, + 14, + 61 + ], + [ + 12, + 35, + 68, + 48, + 90, + 80, + 4, + 76 + ] + ], + "x1_int": [ + 9907, + 16588, + 16680, + 8974, + 19208, + 22103, + 19186, + 16922 + ], + "x2_int": [ + 21877, + 17594, + 23436, + 21812, + 20643, + 29442, + 9286, + 22185 + ], + "y1_int": [ + 18, + 43, + 11, + 54, + 53, + 27, + 14, + 63 + ], + "y2_int": [ + 12, + 40, + 88, + 26, + 44, + 0, + 99, + 46 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse new file mode 100644 index 0000000000..510e5b7a27 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse @@ -0,0 +1,65 @@ +// BEGIN macro definitions + + + + +// END macro definitions + +decl x1_int: ubit<32>[8]; +decl x2_int: ubit<32>[8]; +decl y1_int: ubit<32>[8]; +decl y2_int: ubit<32>[8]; +decl A_int: ubit<32>[8][8]; + +let x1: ubit<32>[8]; +let x2: ubit<32>[8]; +let y1: ubit<32>[8]; +let y2: ubit<32>[8]; +let A: ubit<32>[8][8]; + +view x1_sh = x1[_: bank 1]; +view x2_sh = x2[_: bank 1]; +view y1_sh = y1[_: bank 1]; +view y2_sh = y2[_: bank 1]; +view A_sh = A[_: bank 1][_: bank 1]; + +// Input interfaces. +for (let i: ubit<4> = 0..8) { + y1_sh[i] := y1_int[i]; + y2_sh[i] := y2_int[i]; + x1_sh[i] := x1_int[i]; // XXX no need for this + x2_sh[i] := x2_int[i]; // XXX x1 & x2 are outputs +} +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + A_sh[i][j] := A_int[i][j]; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let tmp = A[i][j] * y1[j]; + } combine { + x1[i] += tmp; + } +} + +--- + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..8) { + let tmp2 = A[j][i] * y2[j]; + } combine { + x2[i] += tmp2; + } +} + +--- + +// Output interfaces. +for (let i: ubit<4> = 0..8) { + x1_int[i] := x1_sh[i]; + x2_int[i] := x2_sh[i]; +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse.data new file mode 100644 index 0000000000..60e90fe6c9 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-mvt.fuse.data @@ -0,0 +1,159 @@ +{ + "x1_int": { + "data": [ + 38, + 47, + 35, + 60, + 40, + 18, + 46, + 87 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "x2_int": { + "data": [ + 16, + 27, + 33, + 30, + 17, + 99, + 24, + 96 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y1_int": { + "data": [ + 18, + 43, + 11, + 54, + 53, + 27, + 14, + 63 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "y2_int": { + "data": [ + 12, + 40, + 88, + 26, + 44, + 0, + 99, + 46 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 12, + 1, + 85, + 34, + 3, + 26, + 94, + 74 + ], + [ + 41, + 58, + 95, + 99, + 73, + 80, + 59, + 1 + ], + [ + 91, + 12, + 26, + 37, + 68, + 84, + 34, + 93 + ], + [ + 44, + 98, + 66, + 12, + 0, + 35, + 28, + 19 + ], + [ + 67, + 59, + 60, + 62, + 86, + 92, + 11, + 67 + ], + [ + 96, + 36, + 63, + 85, + 87, + 94, + 37, + 93 + ], + [ + 75, + 75, + 89, + 90, + 38, + 99, + 14, + 61 + ], + [ + 12, + 35, + 68, + 48, + 90, + 80, + 4, + 76 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.expect new file mode 100644 index 0000000000..bda10f2791 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.expect @@ -0,0 +1,318 @@ +{ + "A_int": [ + [ + 91, + 30, + 57, + 92, + 61, + 93, + 42, + 12 + ], + [ + 67, + 70, + 9, + 63, + 94, + 39, + 83, + 94 + ], + [ + 56, + 3, + 33, + 98, + 83, + 6, + 90, + 99 + ], + [ + 8, + 21, + 28, + 7, + 98, + 31, + 21, + 71 + ], + [ + 19, + 18, + 49, + 72, + 87, + 62, + 82, + 58 + ], + [ + 68, + 20, + 17, + 70, + 40, + 80, + 23, + 97 + ], + [ + 38, + 20, + 97, + 84, + 38, + 2, + 16, + 82 + ], + [ + 92, + 98, + 13, + 4, + 4, + 50, + 29, + 55 + ] + ], + "B_int": [ + [ + 66, + 12, + 20, + 79, + 82, + 35, + 87, + 66, + 89, + 67, + 75, + 59 + ], + [ + 7, + 13, + 57, + 27, + 94, + 19, + 83, + 24, + 4, + 31, + 64, + 75 + ], + [ + 64, + 94, + 50, + 69, + 50, + 52, + 92, + 53, + 72, + 79, + 99, + 64 + ], + [ + 81, + 88, + 78, + 2, + 86, + 84, + 32, + 11, + 40, + 39, + 93, + 63 + ], + [ + 94, + 89, + 2, + 40, + 27, + 42, + 46, + 62, + 32, + 95, + 87, + 23 + ], + [ + 92, + 4, + 29, + 36, + 51, + 69, + 20, + 65, + 80, + 0, + 58, + 18 + ], + [ + 93, + 24, + 29, + 96, + 54, + 88, + 29, + 78, + 68, + 83, + 39, + 54 + ], + [ + 20, + 12, + 91, + 81, + 12, + 83, + 40, + 11, + 19, + 75, + 16, + 43 + ] + ], + "C_int": [ + [ + 98104, + 49035, + 85257, + 109519, + 100609, + 98482, + 105654, + 83704, + 95062, + 100936, + 104459, + 90278 + ], + [ + 59015, + 29193, + 69362, + 75416, + 73493, + 72360, + 73756, + 47145, + 53392, + 76220, + 67905, + 69066 + ], + [ + 94533, + 55023, + 39933, + 79565, + 68203, + 77274, + 62555, + 73498, + 75532, + 87814, + 79686, + 59966 + ], + [ + 98148, + 49755, + 36084, + 69220, + 60067, + 74444, + 50250, + 74083, + 67353, + 72717, + 77674, + 47647 + ], + [ + 103869, + 82339, + 49274, + 57709, + 75601, + 79981, + 64960, + 65393, + 68283, + 81226, + 102763, + 61158 + ], + [ + 96752, + 55866, + 63582, + 65431, + 80807, + 84851, + 70395, + 62425, + 78509, + 68604, + 94439, + 62884 + ], + [ + 89005, + 87531, + 66962, + 64016, + 78756, + 78304, + 80177, + 55183, + 68648, + 86453, + 104871, + 75935 + ], + [ + 69600, + 24572, + 65651, + 80382, + 92954, + 68370, + 86779, + 64258, + 69764, + 69839, + 80980, + 77186 + ] + ], + "alpha_int": [ + 4 + ], + "beta_int": [ + 31 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse new file mode 100644 index 0000000000..53682ad227 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse @@ -0,0 +1,39 @@ +// BEGIN macro definition + + + + + + +// END macro definition + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl C_int: ubit<32>[8][12]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][12]; + +let temp2: ubit<32> = 0; + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..12) { + temp2 := 0; + // This is a 'for' loop in the original source + let k: ubit<4> = 0; + while (k < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let C_k_j: ubit<32> = C_int[k][j]; + --- + C_int[k][j] := alpha_int[0] * B_int[i][j] * A_int[i][k] + C_k_j; + --- + temp2 := temp2 + B_int[k][j] * A_int[i][k]; + + // Update loop counter + k := k + 1; + } + --- + let C_i_j: ubit<32> = C_int[i][j]; + --- + C_int[i][j] := beta_int[0] * C_i_j + alpha_int[0]*B_int[i][j] * A_int[i][i] + alpha_int[0] * temp2; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse.data new file mode 100644 index 0000000000..01e6be803d --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-symm.fuse.data @@ -0,0 +1,353 @@ +{ + "alpha_int": { + "data": [ + 4 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 31 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C_int": { + "data": [ + [ + 52, + 45, + 99, + 25, + 99, + 14, + 66, + 88, + 86, + 60, + 21, + 54 + ], + [ + 77, + 15, + 14, + 16, + 75, + 60, + 16, + 31, + 84, + 80, + 19, + 62 + ], + [ + 11, + 73, + 35, + 15, + 69, + 50, + 85, + 90, + 80, + 94, + 54, + 46 + ], + [ + 52, + 9, + 96, + 48, + 37, + 40, + 2, + 41, + 7, + 51, + 50, + 1 + ], + [ + 19, + 41, + 6, + 3, + 67, + 39, + 28, + 35, + 33, + 10, + 17, + 26 + ], + [ + 64, + 78, + 10, + 53, + 1, + 21, + 93, + 75, + 91, + 24, + 5, + 12 + ], + [ + 99, + 69, + 26, + 16, + 36, + 28, + 7, + 89, + 44, + 51, + 21, + 93 + ], + [ + 92, + 36, + 93, + 10, + 78, + 34, + 1, + 70, + 80, + 21, + 20, + 66 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 91, + 30, + 57, + 92, + 61, + 93, + 42, + 12 + ], + [ + 67, + 70, + 9, + 63, + 94, + 39, + 83, + 94 + ], + [ + 56, + 3, + 33, + 98, + 83, + 6, + 90, + 99 + ], + [ + 8, + 21, + 28, + 7, + 98, + 31, + 21, + 71 + ], + [ + 19, + 18, + 49, + 72, + 87, + 62, + 82, + 58 + ], + [ + 68, + 20, + 17, + 70, + 40, + 80, + 23, + 97 + ], + [ + 38, + 20, + 97, + 84, + 38, + 2, + 16, + 82 + ], + [ + 92, + 98, + 13, + 4, + 4, + 50, + 29, + 55 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 66, + 12, + 20, + 79, + 82, + 35, + 87, + 66, + 89, + 67, + 75, + 59 + ], + [ + 7, + 13, + 57, + 27, + 94, + 19, + 83, + 24, + 4, + 31, + 64, + 75 + ], + [ + 64, + 94, + 50, + 69, + 50, + 52, + 92, + 53, + 72, + 79, + 99, + 64 + ], + [ + 81, + 88, + 78, + 2, + 86, + 84, + 32, + 11, + 40, + 39, + 93, + 63 + ], + [ + 94, + 89, + 2, + 40, + 27, + 42, + 46, + 62, + 32, + 95, + 87, + 23 + ], + [ + 92, + 4, + 29, + 36, + 51, + 69, + 20, + 65, + 80, + 0, + 58, + 18 + ], + [ + 93, + 24, + 29, + 96, + 54, + 88, + 29, + 78, + 68, + 83, + 39, + 54 + ], + [ + 20, + 12, + 91, + 81, + 12, + 83, + 40, + 11, + 19, + 75, + 16, + 43 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.expect new file mode 100644 index 0000000000..221b4c349a --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.expect @@ -0,0 +1,422 @@ +{ + "A_int": [ + [ + 96, + 86, + 56, + 24, + 22, + 75, + 73, + 49 + ], + [ + 53, + 44, + 16, + 68, + 32, + 72, + 70, + 12 + ], + [ + 36, + 4, + 71, + 79, + 70, + 26, + 30, + 45 + ], + [ + 49, + 16, + 93, + 55, + 50, + 93, + 31, + 91 + ], + [ + 36, + 42, + 45, + 46, + 68, + 29, + 72, + 68 + ], + [ + 62, + 7, + 59, + 18, + 15, + 76, + 56, + 54 + ], + [ + 69, + 68, + 32, + 8, + 43, + 23, + 4, + 50 + ], + [ + 50, + 90, + 80, + 42, + 32, + 32, + 63, + 99 + ], + [ + 59, + 16, + 32, + 70, + 28, + 4, + 9, + 83 + ], + [ + 35, + 68, + 3, + 66, + 10, + 29, + 60, + 47 + ], + [ + 28, + 34, + 49, + 37, + 71, + 96, + 45, + 72 + ], + [ + 89, + 35, + 41, + 63, + 91, + 71, + 90, + 80 + ] + ], + "B_int": [ + [ + 50, + 26, + 37, + 30, + 67, + 78, + 24, + 33 + ], + [ + 39, + 42, + 94, + 74, + 34, + 21, + 68, + 26 + ], + [ + 7, + 93, + 93, + 29, + 50, + 41, + 60, + 55 + ], + [ + 49, + 3, + 64, + 51, + 67, + 9, + 19, + 89 + ], + [ + 81, + 10, + 43, + 33, + 17, + 28, + 16, + 1 + ], + [ + 35, + 0, + 18, + 51, + 66, + 70, + 94, + 12 + ], + [ + 96, + 96, + 7, + 14, + 21, + 99, + 14, + 24 + ], + [ + 53, + 45, + 42, + 12, + 28, + 64, + 83, + 49 + ], + [ + 78, + 65, + 56, + 5, + 23, + 99, + 68, + 66 + ], + [ + 24, + 25, + 20, + 78, + 60, + 26, + 22, + 48 + ], + [ + 64, + 84, + 14, + 38, + 49, + 67, + 21, + 96 + ], + [ + 18, + 80, + 96, + 64, + 33, + 87, + 17, + 8 + ] + ], + "C_int": [ + [ + 3079074, + 2, + 0, + 18, + 3, + 18, + 93, + 57, + 83, + 10, + 62, + 91 + ], + [ + 2942265, + 2719647, + 33, + 34, + 21, + 27, + 41, + 11, + 10, + 1, + 68, + 7 + ], + [ + 3124020, + 2818254, + 2754102, + 10, + 73, + 63, + 10, + 67, + 81, + 38, + 85, + 80 + ], + [ + 2998461, + 2695248, + 3383667, + 3612843, + 77, + 32, + 34, + 57, + 95, + 25, + 39, + 10 + ], + [ + 2419449, + 2381283, + 2505555, + 2500401, + 1498545, + 14, + 48, + 67, + 78, + 49, + 4, + 36 + ], + [ + 2685600, + 2729709, + 2524275, + 2650914, + 2257104, + 2456241, + 44, + 48, + 83, + 22, + 26, + 63 + ], + [ + 3102129, + 2409906, + 2032824, + 2565648, + 1859829, + 1953921, + 2690070, + 88, + 33, + 67, + 92, + 33 + ], + [ + 3297546, + 3237318, + 3289278, + 3353691, + 2373585, + 2676663, + 2647911, + 3538893, + 37, + 57, + 45, + 59 + ], + [ + 3321258, + 2746773, + 2266851, + 3515010, + 2367495, + 2558067, + 2249421, + 3079890, + 2238549, + 15, + 11, + 35 + ], + [ + 1965849, + 2216133, + 2467761, + 2245572, + 1794057, + 1837206, + 1964364, + 2435478, + 2387634, + 1903338, + 23, + 31 + ], + [ + 3624093, + 2861229, + 2991984, + 3399936, + 2412213, + 2889498, + 2969421, + 3671487, + 3323052, + 2649102, + 3676494, + 8 + ], + [ + 3721437, + 3391548, + 3380772, + 3862032, + 2570796, + 3334488, + 2951592, + 3858405, + 3325353, + 2754477, + 3954780, + 3560037 + ] + ], + "alpha_int": [ + 75 + ], + "beta_int": [ + 21 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse new file mode 100644 index 0000000000..6e56998f60 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse @@ -0,0 +1,70 @@ +// BEGIN macro definition + + + + + + + + +// END macro definition + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl C_int: ubit<32>[12][12]; +decl A_int: ubit<32>[12][8]; +decl B_int: ubit<32>[12][8]; + +let alpha_ = alpha_int[0]; +let beta_ = beta_int[0]; +let A: ubit<32>[12][8]; +let B: ubit<32>[12][8]; + +view A_sh = A[_: bank 1][_: bank 1]; +view B_sh = B[_: bank 1][_: bank 1]; + +for (let i0: ubit<4> = 0..12) { + for (let j0: ubit<4> = 0..8) { + A_sh[i0][j0] := A_int[i0][j0]; + B_sh[i0][j0] := B_int[i0][j0]; + } +} + +--- + +for (let i: ubit<4> = 0..12) { + let j: ubit<4> = 0; + while (j <= i) { + decor "#pragma HLS loop_tripcount min=1 max=12 avg=6" + let C_i_j: ubit<32> = C_int[i][j]; + --- + C_int[i][j] := C_i_j * beta_; + + // Update loop counter + j := j + 1; + } + --- + let j2: ubit<4> = 0; + while (j2 <= i) { + decor "#pragma HLS loop_tripcount min=1 max=12 avg=6" + for (let k: ubit<4> = 0..8) { + let B_i_k: ubit<32> = B[i][k]; + let A_j2_k: ubit<32> = A[j2][k]; + --- + let t = A_j2_k * alpha_ * B_i_k + B[j2][k] * alpha_ * A[i][k]; + // Update loop counter + } combine { + C_int[i][j2] += t; + } + j2 := j2 + 1; + } +} + +--- + +for (let i0: ubit<4> = 0..12) { + for (let j0: ubit<4> = 0..8) { + A_int[i0][j0] := A_sh[i0][j0]; + B_int[i0][j0] := B_sh[i0][j0]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse.data new file mode 100644 index 0000000000..20208f5b94 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syr2k.fuse.data @@ -0,0 +1,457 @@ +{ + "alpha_int": { + "data": [ + 75 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 21 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C_int": { + "data": [ + [ + 44, + 2, + 0, + 18, + 3, + 18, + 93, + 57, + 83, + 10, + 62, + 91 + ], + [ + 40, + 57, + 33, + 34, + 21, + 27, + 41, + 11, + 10, + 1, + 68, + 7 + ], + [ + 20, + 49, + 12, + 10, + 73, + 63, + 10, + 67, + 81, + 38, + 85, + 80 + ], + [ + 16, + 13, + 52, + 33, + 77, + 32, + 34, + 57, + 95, + 25, + 39, + 10 + ], + [ + 19, + 23, + 80, + 6, + 95, + 14, + 48, + 67, + 78, + 49, + 4, + 36 + ], + [ + 0, + 4, + 0, + 84, + 74, + 21, + 44, + 48, + 83, + 22, + 26, + 63 + ], + [ + 49, + 86, + 69, + 63, + 49, + 76, + 70, + 88, + 33, + 67, + 92, + 33 + ], + [ + 51, + 33, + 18, + 96, + 60, + 78, + 16, + 33, + 37, + 57, + 45, + 59 + ], + [ + 98, + 38, + 56, + 85, + 70, + 2, + 51, + 65, + 69, + 15, + 11, + 35 + ], + [ + 19, + 23, + 91, + 57, + 92, + 36, + 84, + 18, + 79, + 78, + 23, + 31 + ], + [ + 33, + 49, + 4, + 41, + 53, + 88, + 51, + 97, + 37, + 87, + 14, + 8 + ], + [ + 47, + 38, + 57, + 67, + 51, + 53, + 27, + 80, + 18, + 87, + 30, + 97 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 96, + 86, + 56, + 24, + 22, + 75, + 73, + 49 + ], + [ + 53, + 44, + 16, + 68, + 32, + 72, + 70, + 12 + ], + [ + 36, + 4, + 71, + 79, + 70, + 26, + 30, + 45 + ], + [ + 49, + 16, + 93, + 55, + 50, + 93, + 31, + 91 + ], + [ + 36, + 42, + 45, + 46, + 68, + 29, + 72, + 68 + ], + [ + 62, + 7, + 59, + 18, + 15, + 76, + 56, + 54 + ], + [ + 69, + 68, + 32, + 8, + 43, + 23, + 4, + 50 + ], + [ + 50, + 90, + 80, + 42, + 32, + 32, + 63, + 99 + ], + [ + 59, + 16, + 32, + 70, + 28, + 4, + 9, + 83 + ], + [ + 35, + 68, + 3, + 66, + 10, + 29, + 60, + 47 + ], + [ + 28, + 34, + 49, + 37, + 71, + 96, + 45, + 72 + ], + [ + 89, + 35, + 41, + 63, + 91, + 71, + 90, + 80 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 50, + 26, + 37, + 30, + 67, + 78, + 24, + 33 + ], + [ + 39, + 42, + 94, + 74, + 34, + 21, + 68, + 26 + ], + [ + 7, + 93, + 93, + 29, + 50, + 41, + 60, + 55 + ], + [ + 49, + 3, + 64, + 51, + 67, + 9, + 19, + 89 + ], + [ + 81, + 10, + 43, + 33, + 17, + 28, + 16, + 1 + ], + [ + 35, + 0, + 18, + 51, + 66, + 70, + 94, + 12 + ], + [ + 96, + 96, + 7, + 14, + 21, + 99, + 14, + 24 + ], + [ + 53, + 45, + 42, + 12, + 28, + 64, + 83, + 49 + ], + [ + 78, + 65, + 56, + 5, + 23, + 99, + 68, + 66 + ], + [ + 24, + 25, + 20, + 78, + 60, + 26, + 22, + 48 + ], + [ + 64, + 84, + 14, + 38, + 49, + 67, + 21, + 96 + ], + [ + 18, + 80, + 96, + 64, + 33, + 87, + 17, + 8 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.expect new file mode 100644 index 0000000000..6426cf3130 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.expect @@ -0,0 +1,300 @@ +{ + "A_int": [ + [ + 32, + 46, + 49, + 9, + 76, + 74, + 17, + 18 + ], + [ + 55, + 95, + 48, + 40, + 48, + 12, + 28, + 90 + ], + [ + 76, + 88, + 21, + 33, + 73, + 81, + 92, + 94 + ], + [ + 92, + 17, + 2, + 67, + 85, + 58, + 25, + 57 + ], + [ + 19, + 80, + 65, + 44, + 34, + 36, + 91, + 28 + ], + [ + 39, + 83, + 0, + 74, + 9, + 94, + 51, + 8 + ], + [ + 84, + 15, + 20, + 9, + 18, + 93, + 87, + 29 + ], + [ + 71, + 63, + 60, + 53, + 59, + 23, + 40, + 97 + ], + [ + 68, + 57, + 51, + 44, + 60, + 27, + 63, + 4 + ], + [ + 30, + 33, + 70, + 65, + 26, + 82, + 91, + 14 + ], + [ + 39, + 29, + 53, + 66, + 15, + 95, + 15, + 84 + ], + [ + 35, + 88, + 58, + 15, + 26, + 21, + 65, + 95 + ] + ], + "C": [ + [ + 841200, + 44, + 84, + 51, + 85, + 64, + 24, + 94, + 69, + 51, + 89, + 35 + ], + [ + 744196, + 1309975, + 93, + 18, + 48, + 20, + 8, + 47, + 73, + 35, + 21, + 0 + ], + [ + 1085961, + 1459228, + 2124128, + 15, + 77, + 5, + 31, + 23, + 60, + 50, + 57, + 85 + ], + [ + 799171, + 963838, + 1406838, + 1331571, + 69, + 54, + 29, + 41, + 82, + 9, + 29, + 79 + ], + [ + 729850, + 992961, + 1331283, + 723542, + 1174896, + 47, + 49, + 87, + 35, + 40, + 85, + 87 + ], + [ + 691258, + 801922, + 1268552, + 860504, + 921216, + 1224345, + 0, + 79, + 74, + 12, + 73, + 46 + ], + [ + 705690, + 692307, + 1344835, + 931645, + 826569, + 901221, + 1207245, + 61, + 21, + 30, + 30, + 78 + ], + [ + 826141, + 1338205, + 1580244, + 1160246, + 1047631, + 837808, + 868923, + 1462487, + 41, + 20, + 48, + 62 + ], + [ + 739045, + 898422, + 1222624, + 899883, + 959866, + 815981, + 825386, + 1003931, + 994752, + 74, + 18, + 96 + ], + [ + 785952, + 806402, + 1298531, + 858028, + 1111636, + 1028822, + 1028624, + 974595, + 956271, + 1297145, + 41, + 80 + ], + [ + 754479, + 957321, + 1290474, + 987477, + 820465, + 927319, + 874204, + 1110145, + 705313, + 1001407, + 1251696, + 42 + ], + [ + 697344, + 1227449, + 1471929, + 783305, + 1073902, + 772021, + 787554, + 1256124, + 846005, + 895799, + 929080, + 1293464 + ] + ], + "alpha_int": [ + 48 + ], + "beta_int": [ + 19 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse new file mode 100644 index 0000000000..d888f110bf --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse @@ -0,0 +1,62 @@ +// BEGIN macro definitions + + + + + + + + +// END macro definitions + +decl alpha_int: ubit<32>[1]; +decl beta_int: ubit<32>[1]; +decl C: ubit<32>[12][12]; +decl A_int: ubit<32>[12][8]; + +let A: ubit<32>[12][8]; +view A_sh = A[_: bank 1][_: bank 1]; + +for (let i0: ubit<4> = 0..12) { + for (let j0: ubit<4> = 0..8) { + A_sh[i0][j0] := A_int[i0][j0]; + } +} + +--- + +for (let i: ubit<4> = 0..12) { + let j: ubit<4> = 0; + + // Originally a for loop + while (j <= i) { + decor "#pragma HLS loop_tripcount min=1 max=8 avg=4" + let C_i_j: ubit<32> = C[i][j]; + --- + C[i][j] := C_i_j * beta_int[0]; + // Update loop counter + j := j + (1 as ubit<4>); + } + --- + let j2: ubit<4> = 0; + while (j2 <= i) { + decor "#pragma HLS loop_tripcount min=1 max=8 avg=4" + for (let k: ubit<4> = 0..8) { + let A_i_k: ubit<32> = A[i][k]; + --- + let t = alpha_int[0] * A_i_k * A[j2][k]; + } combine { + C[i][j2] += t; + } + // Update loop counter + j2 := j2 + (1 as ubit<4>); + } +} + +--- + +for (let i0: ubit<4> = 0..12) { + for (let j0: ubit<4> = 0..8) { + A_int[i0][j0] := A_sh[i0][j0]; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse.data new file mode 100644 index 0000000000..b55e41ab62 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-syrk.fuse.data @@ -0,0 +1,328 @@ +{ + "alpha_int": { + "data": [ + 48 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "beta_int": { + "data": [ + 19 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "C": { + "data": [ + [ + 96, + 44, + 84, + 51, + 85, + 64, + 24, + 94, + 69, + 51, + 89, + 35 + ], + [ + 76, + 13, + 93, + 18, + 48, + 20, + 8, + 47, + 73, + 35, + 21, + 0 + ], + [ + 51, + 52, + 32, + 15, + 77, + 5, + 31, + 23, + 60, + 50, + 57, + 85 + ], + [ + 49, + 58, + 18, + 81, + 69, + 54, + 29, + 41, + 82, + 9, + 29, + 79 + ], + [ + 94, + 75, + 81, + 98, + 96, + 47, + 49, + 87, + 35, + 40, + 85, + 87 + ], + [ + 46, + 22, + 8, + 56, + 0, + 99, + 0, + 79, + 74, + 12, + 73, + 46 + ], + [ + 30, + 81, + 49, + 79, + 99, + 39, + 15, + 61, + 21, + 30, + 30, + 78 + ], + [ + 31, + 79, + 12, + 50, + 37, + 64, + 57, + 77, + 41, + 20, + 48, + 62 + ], + [ + 7, + 66, + 64, + 9, + 94, + 95, + 62, + 89, + 0, + 74, + 18, + 96 + ], + [ + 96, + 38, + 65, + 52, + 76, + 50, + 32, + 81, + 21, + 83, + 41, + 80 + ], + [ + 21, + 51, + 30, + 39, + 91, + 13, + 4, + 91, + 91, + 37, + 48, + 42 + ], + [ + 96, + 83, + 99, + 35, + 58, + 55, + 54, + 84, + 23, + 77, + 88, + 56 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 32, + 46, + 49, + 9, + 76, + 74, + 17, + 18 + ], + [ + 55, + 95, + 48, + 40, + 48, + 12, + 28, + 90 + ], + [ + 76, + 88, + 21, + 33, + 73, + 81, + 92, + 94 + ], + [ + 92, + 17, + 2, + 67, + 85, + 58, + 25, + 57 + ], + [ + 19, + 80, + 65, + 44, + 34, + 36, + 91, + 28 + ], + [ + 39, + 83, + 0, + 74, + 9, + 94, + 51, + 8 + ], + [ + 84, + 15, + 20, + 9, + 18, + 93, + 87, + 29 + ], + [ + 71, + 63, + 60, + 53, + 59, + 23, + 40, + 97 + ], + [ + 68, + 57, + 51, + 44, + 60, + 27, + 63, + 4 + ], + [ + 30, + 33, + 70, + 65, + 26, + 82, + 91, + 14 + ], + [ + 39, + 29, + 53, + 66, + 15, + 95, + 15, + 84 + ], + [ + 35, + 88, + 58, + 15, + 26, + 21, + 65, + 95 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.expect new file mode 100644 index 0000000000..c0121d2f3b --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.expect @@ -0,0 +1,104 @@ +{ + "L_int": [ + [ + 95, + 39, + 30, + 84, + 70, + 24, + 97, + 17 + ], + [ + 43, + 18, + 68, + 51, + 38, + 73, + 53, + 12 + ], + [ + 66, + 99, + 93, + 82, + 76, + 73, + 92, + 75 + ], + [ + 77, + 12, + 14, + 89, + 99, + 11, + 97, + 1 + ], + [ + 7, + 45, + 42, + 19, + 34, + 14, + 70, + 45 + ], + [ + 97, + 26, + 81, + 47, + 61, + 84, + 69, + 72 + ], + [ + 46, + 9, + 8, + 85, + 70, + 46, + 35, + 39 + ], + [ + 10, + 98, + 29, + 11, + 80, + 46, + 97, + 44 + ] + ], + "b_int": [ + 82, + 97, + 41, + 29, + 38, + 53, + 49, + 87 + ], + "x_int": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse new file mode 100644 index 0000000000..f3c4de0dd0 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse @@ -0,0 +1,31 @@ +// BEGIN macro definitions + + + + +// END macro definitions + +decl L_int: ubit<32>[8][8]; +decl x_int: ubit<32>[8]; +decl b_int: ubit<32>[8]; + +for (let i: ubit<4> = 0..8) { + x_int[i] := b_int[i]; + --- + let j: ubit<4> = 0; + // XXX: Try rewriting this as a for loop. + while (j < i) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + // XXX: This is a reduction pattern. + let x_j: ubit<32> = x_int[j]; + --- + x_int[i] := L_int[i][j] * x_j; + + // Update loop counter + j := j + 1; + } + --- + let x_i: ubit<32> = x_int[i]; + --- + x_int[i] := x_i / L_int[i][i]; +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse.data new file mode 100644 index 0000000000..c9f64b5777 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trisolv.fuse.data @@ -0,0 +1,125 @@ +{ + "x_int": { + "data": [ + 81, + 93, + 52, + 15, + 98, + 89, + 33, + 16 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "b_int": { + "data": [ + 82, + 97, + 41, + 29, + 38, + 53, + 49, + 87 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "L_int": { + "data": [ + [ + 95, + 39, + 30, + 84, + 70, + 24, + 97, + 17 + ], + [ + 43, + 18, + 68, + 51, + 38, + 73, + 53, + 12 + ], + [ + 66, + 99, + 93, + 82, + 76, + 73, + 92, + 75 + ], + [ + 77, + 12, + 14, + 89, + 99, + 11, + 97, + 1 + ], + [ + 7, + 45, + 42, + 19, + 34, + 14, + 70, + 45 + ], + [ + 97, + 26, + 81, + 47, + 61, + 84, + 69, + 72 + ], + [ + 46, + 9, + 8, + 85, + 70, + 46, + 35, + 39 + ], + [ + 10, + 98, + 29, + 11, + 80, + 46, + 97, + 44 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.expect b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.expect new file mode 100644 index 0000000000..b930f82333 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.expect @@ -0,0 +1,201 @@ +{ + "A_int": [ + [ + 43, + 54, + 73, + 11, + 40, + 28, + 98, + 78 + ], + [ + 82, + 47, + 77, + 35, + 81, + 42, + 43, + 41 + ], + [ + 76, + 12, + 67, + 41, + 66, + 79, + 27, + 42 + ], + [ + 28, + 16, + 96, + 13, + 16, + 65, + 69, + 6 + ], + [ + 66, + 78, + 14, + 11, + 91, + 35, + 50, + 31 + ], + [ + 57, + 11, + 17, + 47, + 50, + 35, + 30, + 62 + ], + [ + 90, + 15, + 54, + 91, + 61, + 22, + 60, + 63 + ], + [ + 92, + 15, + 58, + 24, + 86, + 73, + 22, + 50 + ] + ], + "B_int": [ + [ + 1848464, + 2249308, + 2301288, + 2059512, + 2183160, + 2126212, + 1840644, + 2887512, + 2280404, + 2715840, + 1503004, + 2573240 + ], + [ + 641700, + 857992, + 929936, + 821008, + 618976, + 602600, + 758908, + 754400, + 515476, + 852196, + 278300, + 912548 + ], + [ + 1317164, + 1153864, + 1308148, + 947784, + 926624, + 722568, + 862040, + 1380092, + 960296, + 1798692, + 908776, + 993140 + ], + [ + 864800, + 676752, + 645932, + 452456, + 1133072, + 942264, + 1050364, + 1197380, + 743268, + 950360, + 321540, + 914940 + ], + [ + 913744, + 545468, + 1040428, + 749892, + 1402908, + 1085692, + 954960, + 1428024, + 769304, + 1302260, + 807392, + 995716 + ], + [ + 500664, + 179308, + 599104, + 536452, + 660744, + 420532, + 412896, + 690736, + 281152, + 775652, + 611248, + 584752 + ], + [ + 112056, + 28612, + 173052, + 151524, + 165416, + 101200, + 78752, + 168544, + 60628, + 203504, + 180688, + 136528 + ], + [ + 4784, + 1104, + 7820, + 6808, + 7268, + 4416, + 3220, + 7360, + 2576, + 9016, + 8188, + 5888 + ] + ], + "alpha_int": [ + 92 + ] +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse new file mode 100644 index 0000000000..07ec296108 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse @@ -0,0 +1,37 @@ +// BEGIN macro definition + + + + + + + +// END macro definition + +decl alpha_int: ubit<32>[1]; +decl A_int: ubit<32>[8][8]; +decl B_int: ubit<32>[8][12]; + +for (let i: ubit<4> = 0..8) { + for (let j: ubit<4> = 0..12) { + let k: ubit<4> = i + (1 as ubit<4>); + // XXX: Try rewriting this as a 'for' loop + while (k < 8) { + decor "#pragma HLS loop_tripcount min=0 max=7 avg=4" + let B_i_j: ubit<32> = B_int[i][j]; + --- + let B_k_j: ubit<32> = B_int[k][j]; + --- + + // XXX: This is reduction pattern + B_int[i][j] := A_int[k][i] * B_k_j + B_i_j; + // Update loop counter + k := k + (1 as ubit<4>); + } + --- + // XXX: This is reduction pattern + let B_i_j: ubit<32> = B_int[i][j]; + --- + B_int[i][j] := alpha_int[0] * B_i_j; + } +} diff --git a/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse.data b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse.data new file mode 100644 index 0000000000..32684557f2 --- /dev/null +++ b/interp/cider2-tests/benchmarks/polybench/linear-algebra-trmm.fuse.data @@ -0,0 +1,222 @@ +{ + "alpha_int": { + "data": [ + 92 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "A_int": { + "data": [ + [ + 43, + 54, + 73, + 11, + 40, + 28, + 98, + 78 + ], + [ + 82, + 47, + 77, + 35, + 81, + 42, + 43, + 41 + ], + [ + 76, + 12, + 67, + 41, + 66, + 79, + 27, + 42 + ], + [ + 28, + 16, + 96, + 13, + 16, + 65, + 69, + 6 + ], + [ + 66, + 78, + 14, + 11, + 91, + 35, + 50, + 31 + ], + [ + 57, + 11, + 17, + 47, + 50, + 35, + 30, + 62 + ], + [ + 90, + 15, + 54, + 91, + 61, + 22, + 60, + 63 + ], + [ + 92, + 15, + 58, + 24, + 86, + 73, + 22, + 50 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + }, + "B_int": { + "data": [ + [ + 64, + 56, + 49, + 73, + 1, + 4, + 88, + 66, + 29, + 1, + 60, + 74 + ], + [ + 15, + 80, + 5, + 32, + 28, + 3, + 15, + 76, + 98, + 68, + 43, + 33 + ], + [ + 19, + 37, + 66, + 57, + 5, + 81, + 3, + 25, + 40, + 8, + 21, + 77 + ], + [ + 66, + 78, + 67, + 38, + 0, + 4, + 10, + 45, + 51, + 96, + 42, + 16 + ], + [ + 46, + 80, + 78, + 78, + 45, + 39, + 74, + 50, + 31, + 61, + 6, + 83 + ], + [ + 18, + 39, + 65, + 11, + 95, + 99, + 41, + 84, + 66, + 45, + 15, + 12 + ], + [ + 74, + 47, + 11, + 19, + 60, + 44, + 86, + 72, + 43, + 56, + 6, + 76 + ], + [ + 52, + 12, + 85, + 74, + 79, + 48, + 35, + 80, + 28, + 98, + 89, + 64 + ] + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 32 + } + } +} diff --git a/interp/cider2-tests/benchmarks/tcam-32.expect b/interp/cider2-tests/benchmarks/tcam-32.expect new file mode 100644 index 0000000000..5d5559bfec --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-32.expect @@ -0,0 +1,5 @@ +{ + "index": [ + 0 + ] +} diff --git a/interp/cider2-tests/benchmarks/tcam-32.futil b/interp/cider2-tests/benchmarks/tcam-32.futil new file mode 100644 index 0000000000..d563769420 --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-32.futil @@ -0,0 +1,108 @@ +import "primitives/core.futil"; +import "primitives/tcam.futil"; +import "primitives/memories/comb.futil"; + + +component main() -> () { + cells { + tcam = TCAM_IPv4(); + @external(1) index = comb_mem_d1(5, 1, 1); + } + + wires { + group save_index<"static"=1> { + index.write_en = 1'd1; + index.addr0 = 1'd0; + index.write_data = tcam.index; + save_index[done] = index.done; + } + } + + control { + seq { + // 32 writes. + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000001110000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000001100, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000010000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000100000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000100000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000000000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000000000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000000000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000000000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd15)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000000000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000100000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000010000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000001000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000001000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000010000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000010000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000100000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000001000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000001000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000100000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000100000000, prefix_len=6'd15)(); + + // 32 searches. + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000000000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000011000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000000000000110000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100011000000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000001100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000001100000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001011000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000111000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000010000001110000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000111000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001110000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000000010000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000001100000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000000110000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000011000000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100000011000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000001111100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000111100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000000001100011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000010000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001110000000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000000010000000011000)(); + + save_index; + } + } +} diff --git a/interp/cider2-tests/benchmarks/tcam-32.futil.data b/interp/cider2-tests/benchmarks/tcam-32.futil.data new file mode 100644 index 0000000000..476932357a --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-32.futil.data @@ -0,0 +1,12 @@ +{ + "index": { + "data": [ + 0 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 5 + } + } +} diff --git a/interp/cider2-tests/benchmarks/tcam-64.expect b/interp/cider2-tests/benchmarks/tcam-64.expect new file mode 100644 index 0000000000..5d5559bfec --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-64.expect @@ -0,0 +1,5 @@ +{ + "index": [ + 0 + ] +} diff --git a/interp/cider2-tests/benchmarks/tcam-64.futil b/interp/cider2-tests/benchmarks/tcam-64.futil new file mode 100644 index 0000000000..bb0f739b72 --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-64.futil @@ -0,0 +1,188 @@ +import "primitives/core.futil"; +import "primitives/tcam.futil"; +import "primitives/memories/comb.futil"; + + +component main() -> () { + cells { + tcam = TCAM_IPv4(); + @external(1) index = comb_mem_d1(5, 1, 1); + } + + wires { + group save_index<"static"=1> { + index.write_en = 1'd1; + index.addr0 = 1'd0; + index.write_data = tcam.index; + save_index[done] = index.done; + } + } + + control { + seq { + // 64 writes. + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000001110000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000001100, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000010000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000100000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000100000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000000000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000000000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000000000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000000000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd15)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000000000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000100000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000010000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000001000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000001000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000010000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000010000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000100000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000001000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000001000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000100000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000100000000, prefix_len=6'd15)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000001110000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000001100, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000010000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000100000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000100000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000000000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000000000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000000000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000000000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000000000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000000000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd15)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000001000000000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000100000000000000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000000000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000000000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000100000000000000, prefix_len=6'd4)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000100000000, prefix_len=6'd5)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000010000000000010000, prefix_len=6'd6)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000100000000001000000, prefix_len=6'd7)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000010000000001000000, prefix_len=6'd8)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000001000000000010000, prefix_len=6'd9)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000010000000, prefix_len=6'd10)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000000010000100000000, prefix_len=6'd11)(); + + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd0, in=32'b11000000000000000001000001000000, prefix_len=6'd12)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd1, in=32'b11000000000000000010000000001000, prefix_len=6'd13)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd2, in=32'b11000100000000000100000000100000, prefix_len=6'd14)(); + invoke tcam(write_en=1'd1, search_en=1'd0, write_index=5'd3, in=32'b11000100000000001000000100000000, prefix_len=6'd15)(); + + // 64 searches. + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000000000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000011000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000000000000110000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100011000000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000001100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000001100000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001011000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000111000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000010000001110000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000111000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001110000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000000010000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000001100000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000000110000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000011000000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100000011000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000001111100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000111100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000000001100011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000010000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001110000000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000000010000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000000000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000011000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000000000000110000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100011000000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000001100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000001100000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000001100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000011000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001011000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000111000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000010000001110000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000111000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001110000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000000010000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11100000000001100000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11010000000000000110000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11001000011000000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000100000011000000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001000000001111100000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000100000000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000010000111100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000001000000000001100011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000100000000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000010000000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000001000000000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000000000000100000000000011000)(); + + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000010000000000000001)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000001000000000000110)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000001110000000100000000001100)(); + invoke tcam(write_en=1'd0, search_en=1'd1, in=32'b11000110000000000010000000011000)(); + + save_index; + } + } +} diff --git a/interp/cider2-tests/benchmarks/tcam-64.futil.data b/interp/cider2-tests/benchmarks/tcam-64.futil.data new file mode 100644 index 0000000000..476932357a --- /dev/null +++ b/interp/cider2-tests/benchmarks/tcam-64.futil.data @@ -0,0 +1,12 @@ +{ + "index": { + "data": [ + 0 + ], + "format": { + "numeric_type": "bitnum", + "is_signed": false, + "width": 5 + } + } +} diff --git a/interp/cider2-tests/runt.toml b/interp/cider2-tests/runt.toml index a61f56d3b6..0e17516c59 100644 --- a/interp/cider2-tests/runt.toml +++ b/interp/cider2-tests/runt.toml @@ -163,6 +163,28 @@ fud2 --from calyx --to dat \ {} | jq --sort-keys """ +[[tests]] +name = "benchmark misc" +paths = ["benchmarks/*.futil"] +cmd = """ +fud2 --from calyx --to dat \ + --through cider \ + -s sim.data={}.data \ + -s calyx.args="--log off" \ + {} | jq --sort-keys +""" + +[[tests]] +name = "benchmark polybench" +paths = ["benchmarks/polybench/*.fuse"] +cmd = """ +fud2 --from dahlia --to dat \ + --through cider \ + -s sim.data={}.data \ + -s calyx.args="--log off" \ + {} | jq --sort-keys +""" + # [[tests]] # name = "[frontend] systolic array correctness" # paths = ["../tests/correctness/systolic/*.systolic"] diff --git a/interp/cider2-tests/unit/uninitialized-port-returns-zero.expect b/interp/cider2-tests/unit/uninitialized-port-returns-zero.expect index 2d71c0103d..c647c0bf11 100644 --- a/interp/cider2-tests/unit/uninitialized-port-returns-zero.expect +++ b/interp/cider2-tests/unit/uninitialized-port-returns-zero.expect @@ -1,5 +1,5 @@ ---STDERR--- Error: Attempted to write an undefined value to register or memory named "main.reg0" -thread 'main' panicked at interp/src/serialization/data_dump.rs:162:48: +thread 'main' panicked at interp/src/serialization/data_dump.rs:160:48: called `Result::unwrap()` on an `Err` value: Error { kind: UnexpectedEof, message: "failed to fill whole buffer" } note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/interp/src/flatten/flat_ir/base.rs b/interp/src/flatten/flat_ir/base.rs index 29dbae0df4..8544871889 100644 --- a/interp/src/flatten/flat_ir/base.rs +++ b/interp/src/flatten/flat_ir/base.rs @@ -447,6 +447,10 @@ impl PortValue { Self(Some(AssignedValue::cell_value(val))) } + pub fn new_cell_zeroes(width: u32) -> Self { + Self::new_cell(Value::zeroes(width)) + } + /// Creates a [PortValue] that has the "winner" as implicit pub fn new_implicit(val: Value) -> Self { Self(Some(AssignedValue::implicit_value(val))) diff --git a/interp/src/flatten/flat_ir/cell_prototype.rs b/interp/src/flatten/flat_ir/cell_prototype.rs index b62b5ceaa6..627e112f62 100644 --- a/interp/src/flatten/flat_ir/cell_prototype.rs +++ b/interp/src/flatten/flat_ir/cell_prototype.rs @@ -1,4 +1,4 @@ -use calyx_ir::{self as cir}; +use calyx_ir::{self as cir, BoolAttr}; use smallvec::SmallVec; use crate::{ @@ -219,6 +219,7 @@ pub enum CellPrototype { mem_type: MemType, width: Width, dims: MemoryDimensions, + is_external: bool, }, // TODO Griffin: lots more @@ -242,12 +243,12 @@ impl CellPrototype { } #[must_use] - pub fn construct_primitive(cell: &cir::CellType) -> Self { + pub fn construct_primitive(cell: &cir::Cell) -> Self { if let cir::CellType::Primitive { name, param_binding, .. - } = cell + } = &cell.prototype { let name: &str = name.as_ref(); let params: &SmallVec<_> = param_binding; @@ -540,6 +541,9 @@ impl CellPrototype { d0_size: size.try_into().unwrap(), d0_idx_size: idx_size.try_into().unwrap(), }, + is_external: cell + .get_attribute(BoolAttr::External) + .is_some(), } } n @ ("comb_mem_d2" | "seq_mem_d2") => { @@ -563,6 +567,9 @@ impl CellPrototype { d0_idx_size: d0_idx_size.try_into().unwrap(), d1_idx_size: d1_idx_size.try_into().unwrap(), }, + is_external: cell + .get_attribute(BoolAttr::External) + .is_some(), } } n @ ("comb_mem_d3" | "seq_mem_d3") => { @@ -590,6 +597,9 @@ impl CellPrototype { d1_idx_size: d1_idx_size.try_into().unwrap(), d2_idx_size: d2_idx_size.try_into().unwrap(), }, + is_external: cell + .get_attribute(BoolAttr::External) + .is_some(), } } n @ ("comb_mem_d4" | "seq_mem_d4") => { @@ -622,6 +632,9 @@ impl CellPrototype { d2_idx_size: d2_idx_size.try_into().unwrap(), d3_idx_size: d3_idx_size.try_into().unwrap(), }, + is_external: cell + .get_attribute(BoolAttr::External) + .is_some(), } } n @ ("std_unsyn_mult" | "std_unsyn_div" | "std_unsyn_smult" diff --git a/interp/src/flatten/flat_ir/control/structures.rs b/interp/src/flatten/flat_ir/control/structures.rs index 2c371ea11a..9a17a4f33e 100644 --- a/interp/src/flatten/flat_ir/control/structures.rs +++ b/interp/src/flatten/flat_ir/control/structures.rs @@ -236,6 +236,18 @@ impl Invoke { } } +#[derive(Debug)] +pub struct Repeat { + pub body: ControlIdx, + pub num_repeats: u64, +} + +impl Repeat { + pub fn new(body: ControlIdx, num_repeats: u64) -> Self { + Self { body, num_repeats } + } +} + /// An enum representing the different types of control nodes #[derive(Debug)] pub enum ControlNode { @@ -245,6 +257,7 @@ pub enum ControlNode { Par(Par), If(If), While(While), + Repeat(Repeat), Invoke(Invoke), } @@ -252,6 +265,7 @@ impl ControlNode { pub fn is_leaf(&self) -> bool { match self { ControlNode::While(_) + | ControlNode::Repeat(_) | ControlNode::Seq(_) | ControlNode::Par(_) | ControlNode::If(_) => false, diff --git a/interp/src/flatten/flat_ir/control/translator.rs b/interp/src/flatten/flat_ir/control/translator.rs index ef961dc4a2..ac98113faa 100644 --- a/interp/src/flatten/flat_ir/control/translator.rs +++ b/interp/src/flatten/flat_ir/control/translator.rs @@ -473,8 +473,8 @@ fn create_cell_prototype( ) -> CellPrototype { let borrow = cell.borrow(); match &borrow.prototype { - prim @ cir::CellType::Primitive { .. } => { - CellPrototype::construct_primitive(prim) + cir::CellType::Primitive { .. } => { + CellPrototype::construct_primitive(&borrow) } cir::CellType::Component { name } => { CellPrototype::Component(comp_id_map[name]) @@ -674,8 +674,9 @@ impl FlattenTree for cir::Control { cir::Control::Static(_) => { todo!("The interpreter does not support static control yet") } - cir::Control::Repeat(_) => { - todo!("The interpreter does not support repeat yet") + cir::Control::Repeat(repeat) => { + let body = handle.enqueue(&repeat.body); + ControlNode::Repeat(Repeat::new(body, repeat.num_repeats)) } } } diff --git a/interp/src/flatten/primitives/builder.rs b/interp/src/flatten/primitives/builder.rs index 78994fd666..2e15789aad 100644 --- a/interp/src/flatten/primitives/builder.rs +++ b/interp/src/flatten/primitives/builder.rs @@ -62,10 +62,19 @@ pub fn build_primitive( PrimType1::MultPipe => { Box::new(StdMultPipe::<2>::new(base_port, *width)) } - PrimType1::SignedMultPipe => todo!(), - PrimType1::DivPipe => todo!(), - PrimType1::SignedDivPipe => todo!(), - PrimType1::Sqrt => todo!(), + PrimType1::SignedMultPipe => { + // todo: Check if this is actually okay + Box::new(StdMultPipe::<2>::new(base_port, *width)) + } + PrimType1::DivPipe => { + Box::new(StdDivPipe::<2, false>::new(base_port, *width)) + } + PrimType1::SignedDivPipe => { + Box::new(StdDivPipe::<2, true>::new(base_port, *width)) + } + PrimType1::Sqrt => { + Box::new(Sqrt::::new(base_port, *width, None)) + } PrimType1::UnsynMult => { Box::new(StdUnsynMult::new(base_port, *width)) } @@ -110,6 +119,7 @@ pub fn build_primitive( mem_type, width, dims, + is_external: _, } => { let data = dump.as_ref().and_then(|data| { let string = ctx.lookup_string(prim.name); diff --git a/interp/src/flatten/primitives/combinational.rs b/interp/src/flatten/primitives/combinational.rs index 6336b71bac..e5c774421b 100644 --- a/interp/src/flatten/primitives/combinational.rs +++ b/interp/src/flatten/primitives/combinational.rs @@ -121,8 +121,10 @@ comb_primitive!(StdAdd(left [0], right [1]) -> (out [2]) { }); comb_primitive!(StdSub(left [0], right [1]) -> (out [2]) { all_defined!(left, right); - // TODO griffin: the old approach is not possible with the way primitives work - let result = Value::from(left.as_unsigned() - right.as_unsigned(), left.width()); + // TODO griffin: the old approach is not possible with the way primitives + // work. + // this is dubious + let result = Value::from(left.as_signed() - right.as_signed(), left.width()); Ok(Some(result)) }); diff --git a/interp/src/flatten/primitives/stateful/math.rs b/interp/src/flatten/primitives/stateful/math.rs index a017e2eca9..ff9b074013 100644 --- a/interp/src/flatten/primitives/stateful/math.rs +++ b/interp/src/flatten/primitives/stateful/math.rs @@ -1,6 +1,12 @@ +use ibig::ops::RemEuclid; + use crate::{ flatten::{flat_ir::prelude::*, primitives::declare_ports}, - primitives::prim_utils::ShiftBuffer, + primitives::{ + prim_utils::ShiftBuffer, + stateful::{floored_division, int_sqrt}, + }, + values::InputNumber, }; use crate::{ flatten::{ @@ -35,14 +41,8 @@ impl Primitive for StdMultPipe { fn exec_comb(&self, port_map: &mut PortMap) -> UpdateResult { ports![&self.base_port; out: Self::OUT, done: Self::DONE]; - let out_changed = if self.current_output.is_def() { - port_map.insert_val( - out, - self.current_output.as_option().unwrap().clone(), - )? - } else { - UpdateStatus::Unchanged - }; + let out_changed = + port_map.write_exact_unchecked(out, self.current_output.clone()); let done_signal = port_map.insert_val( done, @@ -113,3 +113,208 @@ impl Primitive for StdMultPipe { ) } } + +pub struct StdDivPipe { + base_port: GlobalPortIdx, + pipeline: ShiftBuffer<(PortValue, PortValue), DEPTH>, + output_quotient: PortValue, + output_remainder: PortValue, + width: u32, + done_is_high: bool, +} + +impl StdDivPipe { + declare_ports![_CLK: 0, RESET: 1, GO: 2, LEFT: 3, RIGHT: 4, OUT_QUOTIENT: 5, OUT_REMAINDER: 6, DONE: 7]; + pub fn new(base_port: GlobalPortIdx, width: u32) -> Self { + Self { + base_port, + pipeline: ShiftBuffer::default(), + output_quotient: PortValue::new_cell(Value::zeroes(width)), + output_remainder: PortValue::new_cell(Value::zeroes(width)), + width, + done_is_high: false, + } + } +} + +impl Primitive + for StdDivPipe +{ + fn exec_comb(&self, port_map: &mut PortMap) -> UpdateResult { + ports![&self.base_port; + out_quot: Self::OUT_QUOTIENT, + out_rem: Self::OUT_REMAINDER, + done: Self::DONE]; + + let quot_changed = port_map + .write_exact_unchecked(out_quot, self.output_quotient.clone()); + let rem_changed = port_map + .write_exact_unchecked(out_rem, self.output_remainder.clone()); + + let done_signal = port_map.set_done(done, self.done_is_high)?; + + Ok(quot_changed | rem_changed | done_signal) + } + + fn exec_cycle(&mut self, port_map: &mut PortMap) -> UpdateResult { + ports![&self.base_port; + left: Self::LEFT, + right: Self::RIGHT, + reset: Self::RESET, + go: Self::GO, + out_quot: Self::OUT_QUOTIENT, + out_rem: Self::OUT_REMAINDER, + done: Self::DONE + ]; + + if port_map[reset].as_bool().unwrap_or_default() { + self.output_quotient = + PortValue::new_cell(Value::zeroes(self.width)); + self.done_is_high = false; + self.pipeline.reset(); + } else if port_map[go].as_bool().unwrap_or_default() { + let output = self + .pipeline + .shift(Some((port_map[left].clone(), port_map[right].clone()))); + if let Some((l, r)) = output { + let out_val = l.as_option().and_then(|left| { + r.as_option().map(|right| { + ( + Value::from::( + if !SIGNED { + (left.val().as_unsigned() + / right.val().as_unsigned()) + .into() + } else { + (left.val().as_signed() + / right.val().as_signed()) + .into() + }, + self.width, + ), + Value::from::( + if !SIGNED { + (left + .val() + .as_unsigned() + .rem_euclid(right.val().as_unsigned())) + .into() + } else { + (left.val().as_signed() + - right.val().as_signed() + * floored_division( + &left.val().as_signed(), + &right.val().as_signed(), + )) + .into() + }, + self.width, + ), + ) + }) + }); + (self.output_quotient, self.output_remainder) = out_val.map_or( + (PortValue::new_undef(), PortValue::new_undef()), + |(q, r)| (PortValue::new_cell(q), PortValue::new_cell(r)), + ); + self.done_is_high = true; + } else { + self.output_quotient = + PortValue::new_cell(Value::zeroes(self.width)); + self.output_remainder = + PortValue::new_cell(Value::zeroes(self.width)); + self.done_is_high = false; + } + } else { + self.pipeline.reset(); + self.done_is_high = false; + } + + let done_signal = port_map.set_done(done, self.done_is_high)?; + let quot_changed = port_map + .write_exact_unchecked(out_quot, self.output_quotient.clone()); + let rem_changed = port_map + .write_exact_unchecked(out_rem, self.output_remainder.clone()); + + Ok(quot_changed | rem_changed | done_signal) + } +} + +#[derive(Debug, Clone)] +pub struct Sqrt { + base_port: GlobalPortIdx, + output: PortValue, + done_is_high: bool, + width: u32, + frac_width: Option, +} + +impl Sqrt { + declare_ports!(_CLK: 0, RESET: 1, GO: 2, IN: 3, OUT: 4, DONE: 5); + pub fn new( + base_port: GlobalPortIdx, + width: u32, + frac_width: Option, + ) -> Self { + Self { + base_port, + output: PortValue::new_undef(), + done_is_high: false, + width, + frac_width, + } + } +} + +impl Primitive for Sqrt { + fn exec_comb(&self, port_map: &mut PortMap) -> UpdateResult { + ports![&self.base_port; out: Self::OUT, done: Self::DONE]; + + let done_changed = port_map.set_done(done, self.done_is_high)?; + let out_changed = + port_map.write_exact_unchecked(out, self.output.clone()); + + Ok(out_changed | done_changed) + } + + fn exec_cycle(&mut self, port_map: &mut PortMap) -> UpdateResult { + ports![&self.base_port; + reset: Self::RESET, + go: Self::GO, + done: Self::DONE, + in_val: Self::IN, + out: Self::OUT + ]; + + if port_map[reset].as_bool().unwrap_or_default() { + self.done_is_high = false; + self.output = PortValue::new_cell(Value::zeroes(self.width)); + } else if port_map[go].as_bool().unwrap_or_default() { + let input = port_map[in_val].as_option(); + if let Some(input) = input { + self.output = if IS_FIXED_POINT { + let val = int_sqrt( + &(input.val().as_unsigned() + << (self.frac_width.unwrap() as usize)), + ); + PortValue::new_cell(Value::from(val, self.width)) + } else { + let val = int_sqrt(&input.val().as_unsigned()); + PortValue::new_cell(Value::from(val, self.width)) + }; + } else { + // TODO griffin: should probably put an error or warning here? + self.output = PortValue::new_undef(); + } + self.done_is_high = true; + } else { + self.done_is_high = false; + } + + let done_signal = port_map.set_done(done, self.done_is_high)?; + let out_changed = + port_map.write_exact_unchecked(out, self.output.clone()); + + Ok(out_changed | done_signal) + } +} diff --git a/interp/src/flatten/structures/environment/env.rs b/interp/src/flatten/structures/environment/env.rs index 226eb6565e..c3a3c8f1e5 100644 --- a/interp/src/flatten/structures/environment/env.rs +++ b/interp/src/flatten/structures/environment/env.rs @@ -3,7 +3,7 @@ use super::{ context::Context, index_trait::IndexRange, indexed_map::IndexedMap, }, assignments::{GroupInterfacePorts, ScheduledAssignments}, - program_counter::ProgramCounter, + program_counter::{PcMaps, ProgramCounter}, }; use crate::{ errors::{BoxedInterpreterError, InterpreterError, InterpreterResult}, @@ -13,10 +13,10 @@ use crate::{ prelude::{ AssignedValue, AssignmentIdx, BaseIndices, CellDefinitionRef::{Local, Ref}, - CellRef, ComponentIdx, ControlNode, GlobalCellIdx, - GlobalCellRef, GlobalPortIdx, GlobalPortRef, GlobalRefCellIdx, - GlobalRefPortIdx, GuardIdx, Identifier, Invoke, PortRef, - PortValue, + CellRef, CombGroupIdx, ComponentIdx, ControlNode, + GlobalCellIdx, GlobalCellRef, GlobalPortIdx, GlobalPortRef, + GlobalRefCellIdx, GlobalRefPortIdx, GuardIdx, Identifier, If, + Invoke, PortRef, PortValue, While, }, wires::guards::Guard, }, @@ -28,6 +28,7 @@ use crate::{ serialization::data_dump::{DataDump, Dimensions}, values::Value, }; +use ahash::HashMap; use ahash::HashSet; use ahash::HashSetExt; use itertools::Itertools; @@ -98,6 +99,21 @@ impl PortMap { } } } + + pub fn set_done( + &mut self, + target: GlobalPortIdx, + done_bool: bool, + ) -> InterpreterResult { + self.insert_val( + target, + AssignedValue::cell_value(if done_bool { + Value::bit_high() + } else { + Value::bit_low() + }), + ) + } } pub(crate) type CellMap = IndexedMap; @@ -760,6 +776,7 @@ impl<'a> Simulator<'a> { // non-leaf nodes ControlNode::If(_) | ControlNode::While(_) + | ControlNode::Repeat(_) | ControlNode::Seq(_) | ControlNode::Par(_) => { unreachable!( @@ -901,202 +918,25 @@ impl<'a> Simulator<'a> { let mut set_done_low: HashSet = HashSet::new(); let mut new_nodes = vec![]; - let (mut vecs, mut par_map, mut with_map) = self.env.pc.take_fields(); + let (mut vecs, mut par_map, mut with_map, mut repeat_map) = + self.env.pc.take_fields(); // TODO griffin: This has become an unwieldy mess and should really be // refactored into a handful of internal functions vecs.retain_mut(|node| { - let comp_go = self.env.get_comp_go(node.comp); - let comp_done = self.env.get_comp_done(node.comp); - - // if the done is not high & defined, we need to set it to low - if !self.env.ports[comp_done].as_bool().unwrap_or_default() { - set_done_low.insert(comp_done); - } - - if !self.env.ports[comp_go].as_bool().unwrap_or_default() || self.env.ports[comp_done].as_bool().unwrap_or_default() { - // if the go port is low or the done port is high, we skip the - // node without doing anything - return true; - } - - // just considering a single node case for the moment - let retain_bool = match &self.env.ctx.primary[node.control_node_idx] { - ControlNode::Seq(seq) => { - if !seq.is_empty() { - let next = seq.stms()[0]; - *node = node.new_retain_comp(next); - true - } else { - node.mutate_into_next(self.env.ctx) - } - } - ControlNode::Par(par) => { - if par_map.contains_key(node) { - let count = par_map.get_mut(node).unwrap(); - *count -= 1; - if *count == 0 { - par_map.remove(node); - node.mutate_into_next(self.env.ctx) - } else { - false - } - } else { - par_map.insert( - node.clone(), - par.stms().len().try_into().expect( - "More than (2^16 - 1 threads) in a par block. Are you sure this is a good idea?", - ), - ); - new_nodes.extend( - par.stms().iter().map(|x| node.new_retain_comp(*x)), - ); - false - } - } - ControlNode::If(i) => { - // this is bad but it works for now, what a headache - let contains_node = with_map.contains_key(node); - - if i.cond_group().is_some() && !contains_node { - let comb_group = i.cond_group().unwrap(); - let comb_assigns = ScheduledAssignments::new(node.comp, self.env.ctx.primary[comb_group].assignments, None); - - with_map.insert(node.clone(), comb_group); - - // TODO griffin: Sort out a way to make this error less terrible - // NOTE THIS MIGHT INTRODUCE A BUG SINCE THE PORTS - // HAVE NOT BEEN UNDEFINED YET - self.simulate_combinational(&[comb_assigns]).expect("something went wrong in evaluating with clause for if statement"); - - // now we fall through and proceed as normal - } - - if i.cond_group().is_some() && contains_node { - with_map.remove(node); - node.mutate_into_next(self.env.ctx) - } else { - let target = GlobalPortRef::from_local(i.cond_port(), &self.env.cells[node.comp].unwrap_comp().index_bases); - let result = match target { - GlobalPortRef::Port(p) => self.env.ports[p] - .as_bool() - .expect("if condition is undefined"), - GlobalPortRef::Ref(r) => { - let index = self.env.ref_ports[r].unwrap(); - self.env.ports[index] - .as_bool() - .expect("if condition is undefined") - } - }; - - let target = if result { i.tbranch() } else { i.fbranch() }; - *node = node.new_retain_comp(target); - true - } - } - ControlNode::While(w) => { - if w.cond_group().is_some() { - let comb_group = with_map.entry(node.clone()).or_insert(w.cond_group().unwrap()); - let comb_assigns = ScheduledAssignments::new(node.comp, self.env.ctx.primary[*comb_group].assignments, None); - - // NOTE THIS MIGHT INTRODUCE A BUG SINCE THE PORTS - // HAVE NOT BEEN UNDEFINED YET - self.simulate_combinational(&[comb_assigns]).expect("something went wrong in evaluating with clause for while statement"); - } - - let target = GlobalPortRef::from_local( - w.cond_port(), - &self.env.cells[node.comp].unwrap_comp().index_bases, - ); - - let result = match target { - GlobalPortRef::Port(p) => self.env.ports[p] - .as_bool() - .expect("while condition is undefined"), - GlobalPortRef::Ref(r) => { - let index = self.env.ref_ports[r].unwrap(); - self.env.ports[index] - .as_bool() - .expect("while condition is undefined") - } - }; - - if result { - // enter the body - *node = node.new_retain_comp(w.body()); - true - } else { - if w.cond_group().is_some() { - with_map.remove(node); - } - // ascend the tree - node.mutate_into_next(self.env.ctx) - } - } - - // ===== leaf nodes ===== - ControlNode::Empty(_) => node.mutate_into_next(self.env.ctx), - ControlNode::Enable(e) => { - let done_local = self.env.ctx.primary[e.group()].done; - let done_idx = &self.env.cells[node.comp] - .as_comp() - .unwrap() - .index_bases - + done_local; - - if !self.env.ports[done_idx].as_bool().unwrap_or_default() { - leaf_nodes.push(node.clone()); - true - } else { - // This group has finished running and may be removed - // this is somewhat dubious at the moment since it - // relies on the fact that the group done port will - // still be high since convergence hasn't propagated the - // low done signal yet. - node.mutate_into_next(self.env.ctx) - } - } - ControlNode::Invoke(i) => { - let done = self.get_global_port_idx(&i.done, node.comp); - - if i.comb_group.is_some() && !with_map.contains_key(node) { - with_map.insert(node.clone(), i.comb_group.unwrap()); - } - - - if !self.env.ports[done].as_bool().unwrap_or_default() { - leaf_nodes.push(node.clone()); - true - } else { - self.cleanup_ref_cells(node.comp, i); - - if i.comb_group.is_some() { - with_map.remove(node); - } - - node.mutate_into_next(self.env.ctx) - } - }, - }; - - if !retain_bool && ControlPoint::get_next(node, self.env.ctx).is_none() && - // either we are not a par node, or we are the last par node - (!matches!(&self.env.ctx.primary[node.control_node_idx], ControlNode::Par(_)) || !par_map.contains_key(node)) { - - let done_port = self.env.get_comp_done(node.comp); - set_done_high.push(done_port); - // make sure we don't set this port low - set_done_low.remove(&done_port); - let comp_ledger = self.env.cells[node.comp].unwrap_comp(); - *node = node.new_retain_comp(self.env.ctx.primary[comp_ledger.comp_id].control.unwrap()); - true - } else { - retain_bool - } - + self.evaluate_control_node( + node, + &mut set_done_low, + &mut new_nodes, + &mut leaf_nodes, + &mut set_done_high, + (&mut par_map, &mut with_map, &mut repeat_map), + ) }); - self.env.pc.restore_fields(vecs, par_map, with_map); + self.env + .pc + .restore_fields((vecs, par_map, with_map, repeat_map)); // insert all the new nodes from the par into the program counter self.env.pc.vec_mut().extend(new_nodes); @@ -1162,6 +1002,247 @@ impl<'a> Simulator<'a> { out.map_err(|(idx, err)| self.env.make_nice_error(idx, err)) } + fn evaluate_control_node( + &mut self, + node: &mut ControlPoint, + set_done_low: &mut HashSet, + new_nodes: &mut Vec, + leaf_nodes: &mut Vec, + set_done_high: &mut Vec, + maps: PcMaps, + ) -> bool { + let (par_map, with_map, repeat_map) = maps; + let comp_go = self.env.get_comp_go(node.comp); + let comp_done = self.env.get_comp_done(node.comp); + + // if the done is not high & defined, we need to set it to low + if !self.env.ports[comp_done].as_bool().unwrap_or_default() { + set_done_low.insert(comp_done); + } + + if !self.env.ports[comp_go].as_bool().unwrap_or_default() + || self.env.ports[comp_done].as_bool().unwrap_or_default() + { + // if the go port is low or the done port is high, we skip the + // node without doing anything + return true; + } + + // just considering a single node case for the moment + let retain_bool = match &self.env.ctx.primary[node.control_node_idx] { + ControlNode::Seq(seq) => { + if !seq.is_empty() { + let next = seq.stms()[0]; + *node = node.new_retain_comp(next); + true + } else { + node.mutate_into_next(self.env.ctx) + } + } + ControlNode::Par(par) => { + if par_map.contains_key(node) { + let count = par_map.get_mut(node).unwrap(); + *count -= 1; + if *count == 0 { + par_map.remove(node); + node.mutate_into_next(self.env.ctx) + } else { + false + } + } else { + par_map.insert( + node.clone(), + par.stms().len().try_into().expect( + "More than (2^16 - 1 threads) in a par block. Are you sure this is a good idea?", + ), + ); + new_nodes.extend( + par.stms().iter().map(|x| node.new_retain_comp(*x)), + ); + false + } + } + ControlNode::If(i) => self.handle_if(with_map, node, i), + ControlNode::While(w) => self.handle_while(w, with_map, node), + ControlNode::Repeat(rep) => { + if let Some(count) = repeat_map.get_mut(node) { + *count -= 1; + if *count == 0 { + repeat_map.remove(node); + node.mutate_into_next(self.env.ctx) + } else { + *node = node.new_retain_comp(rep.body); + true + } + } else { + repeat_map.insert(node.clone(), rep.num_repeats); + *node = node.new_retain_comp(rep.body); + true + } + } + + // ===== leaf nodes ===== + ControlNode::Empty(_) => node.mutate_into_next(self.env.ctx), + ControlNode::Enable(e) => { + let done_local = self.env.ctx.primary[e.group()].done; + let done_idx = + &self.env.cells[node.comp].as_comp().unwrap().index_bases + + done_local; + + if !self.env.ports[done_idx].as_bool().unwrap_or_default() { + leaf_nodes.push(node.clone()); + true + } else { + // This group has finished running and may be removed + // this is somewhat dubious at the moment since it + // relies on the fact that the group done port will + // still be high since convergence hasn't propagated the + // low done signal yet. + node.mutate_into_next(self.env.ctx) + } + } + ControlNode::Invoke(i) => { + let done = self.get_global_port_idx(&i.done, node.comp); + + if i.comb_group.is_some() && !with_map.contains_key(node) { + with_map.insert(node.clone(), i.comb_group.unwrap()); + } + + if !self.env.ports[done].as_bool().unwrap_or_default() { + leaf_nodes.push(node.clone()); + true + } else { + self.cleanup_ref_cells(node.comp, i); + + if i.comb_group.is_some() { + with_map.remove(node); + } + + node.mutate_into_next(self.env.ctx) + } + } + }; + + if !retain_bool && ControlPoint::get_next(node, self.env.ctx).is_none() && + // either we are not a par node, or we are the last par node + (!matches!(&self.env.ctx.primary[node.control_node_idx], ControlNode::Par(_)) || !par_map.contains_key(node)) + { + let done_port = self.env.get_comp_done(node.comp); + set_done_high.push(done_port); + // make sure we don't set this port low + set_done_low.remove(&done_port); + let comp_ledger = self.env.cells[node.comp].unwrap_comp(); + *node = node.new_retain_comp( + self.env.ctx.primary[comp_ledger.comp_id].control.unwrap(), + ); + true + } else { + retain_bool + } + } + + fn handle_while( + &mut self, + w: &While, + with_map: &mut HashMap, + node: &mut ControlPoint, + ) -> bool { + if w.cond_group().is_some() { + let comb_group = with_map + .entry(node.clone()) + .or_insert(w.cond_group().unwrap()); + let comb_assigns = ScheduledAssignments::new( + node.comp, + self.env.ctx.primary[*comb_group].assignments, + None, + ); + + // NOTE THIS MIGHT INTRODUCE A BUG SINCE THE PORTS + // HAVE NOT BEEN UNDEFINED YET + self.simulate_combinational(&[comb_assigns]).expect("something went wrong in evaluating with clause for while statement"); + } + + let target = GlobalPortRef::from_local( + w.cond_port(), + &self.env.cells[node.comp].unwrap_comp().index_bases, + ); + + let result = match target { + GlobalPortRef::Port(p) => self.env.ports[p] + .as_bool() + .expect("while condition is undefined"), + GlobalPortRef::Ref(r) => { + let index = self.env.ref_ports[r].unwrap(); + self.env.ports[index] + .as_bool() + .expect("while condition is undefined") + } + }; + + if result { + // enter the body + *node = node.new_retain_comp(w.body()); + true + } else { + if w.cond_group().is_some() { + with_map.remove(node); + } + // ascend the tree + node.mutate_into_next(self.env.ctx) + } + } + + fn handle_if( + &mut self, + with_map: &mut HashMap, + node: &mut ControlPoint, + i: &If, + ) -> bool { + // this is bad but it works for now, what a headache + let contains_node = with_map.contains_key(node); + if i.cond_group().is_some() && !contains_node { + let comb_group = i.cond_group().unwrap(); + let comb_assigns = ScheduledAssignments::new( + node.comp, + self.env.ctx.primary[comb_group].assignments, + None, + ); + + with_map.insert(node.clone(), comb_group); + + // TODO griffin: Sort out a way to make this error less terrible + // NOTE THIS MIGHT INTRODUCE A BUG SINCE THE PORTS + // HAVE NOT BEEN UNDEFINED YET + self.simulate_combinational(&[comb_assigns]).expect("something went wrong in evaluating with clause for if statement"); + + // now we fall through and proceed as normal + } + if i.cond_group().is_some() && contains_node { + with_map.remove(node); + node.mutate_into_next(self.env.ctx) + } else { + let target = GlobalPortRef::from_local( + i.cond_port(), + &self.env.cells[node.comp].unwrap_comp().index_bases, + ); + let result = match target { + GlobalPortRef::Port(p) => self.env.ports[p] + .as_bool() + .expect("if condition is undefined"), + GlobalPortRef::Ref(r) => { + let index = self.env.ref_ports[r].unwrap(); + self.env.ports[index] + .as_bool() + .expect("if condition is undefined") + } + }; + + let target = if result { i.tbranch() } else { i.fbranch() }; + *node = node.new_retain_comp(target); + true + } + } + fn is_done(&self) -> bool { self.env.ports[self.env.get_root_done()] .as_bool() @@ -1362,7 +1443,11 @@ impl<'a> Simulator<'a> { } /// Dump the current state of the environment as a DataDump - pub fn dump_memories(&self, dump_registers: bool) -> DataDump { + pub fn dump_memories( + &self, + dump_registers: bool, + all_mems: bool, + ) -> DataDump { let ctx = self.ctx(); let entrypoint_secondary = &ctx.secondary[ctx.entry_point]; @@ -1377,7 +1462,12 @@ impl<'a> Simulator<'a> { let cell_index = &root.index_bases + offset; let name = ctx.lookup_string(cell_info.name).clone(); match &cell_info.prototype { - CellPrototype::Memory { width, dims, .. } => dump.push_memory( + CellPrototype::Memory { + width, + dims, + is_external, + .. + } if *is_external | all_mems => dump.push_memory( name, *width as usize, dims.size(), diff --git a/interp/src/flatten/structures/environment/program_counter.rs b/interp/src/flatten/structures/environment/program_counter.rs index ad212c5e09..3cabda5e11 100644 --- a/interp/src/flatten/structures/environment/program_counter.rs +++ b/interp/src/flatten/structures/environment/program_counter.rs @@ -172,6 +172,12 @@ impl SearchPath { return Some(*node); } + ControlNode::Repeat(_) => { + // we need to re-check the loop count, so this is our + // next node + return Some(*node); + } + // none of these three should be possible as a non-leaf node // which is what we are currently searching through on the // path, so this is definitely an error @@ -293,6 +299,17 @@ impl SearchPath { }) } } + ControlNode::Repeat(rep) => { + if node.search_index.is_some() { + current_path.path.pop(); + } else { + node.search_index = Some(SearchIndex::new(0)); + current_path.path.push(SearchNode { + node: rep.body, + search_index: None, + }) + } + } } } @@ -339,10 +356,24 @@ pub(crate) struct ProgramCounter { par_map: HashMap, continuous_assigns: Vec, with_map: HashMap, + repeat_map: HashMap, } // we need a few things from the program counter +pub type PcFields = ( + Vec, + HashMap, + HashMap, + HashMap, +); + +pub type PcMaps<'a> = ( + &'a mut HashMap, + &'a mut HashMap, + &'a mut HashMap, +); + impl ProgramCounter { pub(crate) fn new_empty() -> Self { Self { @@ -350,6 +381,7 @@ impl ProgramCounter { par_map: HashMap::new(), continuous_assigns: Vec::new(), with_map: HashMap::new(), + repeat_map: HashMap::new(), } } @@ -373,29 +405,21 @@ impl ProgramCounter { &self.par_map } - pub fn take_fields( - &mut self, - ) -> ( - Vec, - HashMap, - HashMap, - ) { + pub fn take_fields(&mut self) -> PcFields { ( std::mem::take(&mut self.vec), std::mem::take(&mut self.par_map), std::mem::take(&mut self.with_map), + std::mem::take(&mut self.repeat_map), ) } - pub fn restore_fields( - &mut self, - vec: Vec, - par_map: HashMap, - with_map: HashMap, - ) { + pub fn restore_fields(&mut self, fields: PcFields) { + let (vec, par_map, with_map, repeat_map) = fields; self.vec = vec; self.par_map = par_map; self.with_map = with_map; + self.repeat_map = repeat_map; } pub(crate) fn push_continuous_assigns( diff --git a/interp/src/flatten/structures/printer.rs b/interp/src/flatten/structures/printer.rs index 3f92aaed5d..8889f035e6 100644 --- a/interp/src/flatten/structures/printer.rs +++ b/interp/src/flatten/structures/printer.rs @@ -284,6 +284,9 @@ impl<'a> Printer<'a> { text_utils::indent(out, indent) } + ControlNode::Repeat(_) => { + todo!() + } } } diff --git a/interp/src/main.rs b/interp/src/main.rs index 3a95c88db2..77f877d0d7 100644 --- a/interp/src/main.rs +++ b/interp/src/main.rs @@ -99,6 +99,9 @@ struct FlatInterp { /// dump registers as memories #[argh(switch, long = "dump-registers")] dump_registers: bool, + /// dumps all memories rather than just external ones + #[argh(switch, long = "all-memories")] + dump_all_memories: bool, } #[inline] @@ -215,7 +218,10 @@ fn main() -> InterpreterResult<()> { sim.run_program()?; - let output = sim.dump_memories(configs.dump_registers); + let output = sim.dump_memories( + configs.dump_registers, + configs.dump_all_memories, + ); output.serialize(&mut stdout())?; Ok(()) diff --git a/interp/src/serialization/data_dump.rs b/interp/src/serialization/data_dump.rs index fdabfd2dca..363e0cb9db 100644 --- a/interp/src/serialization/data_dump.rs +++ b/interp/src/serialization/data_dump.rs @@ -144,13 +144,11 @@ impl DataDump { ) -> std::io::Result<()> { let header_str = serde_json::to_string(&self.header).unwrap(); let len_bytes = header_str.len(); - let written = writer.write(&len_bytes.to_le_bytes()).unwrap(); - assert_eq!(written, 8); + writer.write_all(&len_bytes.to_le_bytes())?; write!(writer, "{}", header_str).unwrap(); - - let written = writer.write(&self.data)?; + writer.write_all(&self.data)?; writer.flush()?; - assert_eq!(written, self.data.len()); + Ok(()) } diff --git a/tools/cider-data-converter/src/converter.rs b/tools/cider-data-converter/src/converter.rs index 9e06aa4965..bcb8ba7a0e 100644 --- a/tools/cider-data-converter/src/converter.rs +++ b/tools/cider-data-converter/src/converter.rs @@ -8,7 +8,7 @@ pub fn convert_to_data_dump(json: &JsonData) -> DataDump { let mut data_dump = DataDump::new_empty(); for (name, entry) in json.0.iter() { - let width = &entry.format.width; + let width = &entry.format.get_width(); let data: Box> = match &entry.data { DataVec::Id1(v1) => Box::new(v1.iter().flat_map(|val| { // chopping off the upper bits @@ -133,10 +133,11 @@ mod tests { prop_compose! { fn arb_format_info()(width in 1_u64..=64) -> FormatInfo { FormatInfo { - width, + width: Some(width), is_signed: false, numeric_type: NumericType::Bitnum, int_width: None, + frac_width: None, } } } @@ -173,7 +174,7 @@ mod tests { let arb_format_info = arb_format_info(); let dim = dim_generator(); (arb_format_info, dim).prop_flat_map(|(format, dimensions)| { - arb_data(format.width, dimensions).prop_map(move |x| { + arb_data(format.get_width(), dimensions).prop_map(move |x| { JsonDataEntry { data: x, format: format.clone(), diff --git a/tools/cider-data-converter/src/json_data.rs b/tools/cider-data-converter/src/json_data.rs index 6b1afeab2f..26a9dbffd0 100644 --- a/tools/cider-data-converter/src/json_data.rs +++ b/tools/cider-data-converter/src/json_data.rs @@ -7,6 +7,7 @@ use serde::{self, Deserialize, Serialize}; #[serde(rename_all = "lowercase")] pub enum NumericType { Bitnum, + #[serde(alias = "fixed_point")] Fixed, } @@ -14,10 +15,27 @@ pub enum NumericType { pub struct FormatInfo { pub numeric_type: NumericType, pub is_signed: bool, - pub width: u64, + #[serde(default)] + #[serde(skip_serializing_if = "Option::is_none")] + pub width: Option, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] pub int_width: Option, + #[serde(default)] + #[serde(skip_serializing_if = "Option::is_none")] + pub frac_width: Option, +} + +impl FormatInfo { + pub fn get_width(&self) -> u64 { + if let Some(w) = self.width { + w + } else if self.int_width.is_some() && self.frac_width.is_some() { + self.int_width.unwrap() + self.frac_width.unwrap() + } else { + panic!("Either width or int_width and frac_width must be set") + } + } } // this is stupid