From e11fd369080e7d9b54f1a640c78fb4a1484cb2d6 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Fri, 8 Mar 2024 22:15:07 -0600 Subject: platform/wavelet3d: implement fpint lanes --- platform/wavelet3d/main.cpp | 238 ++++++++++++++++++++++++++++---------------- 1 file changed, 153 insertions(+), 85 deletions(-) (limited to 'platform/wavelet3d/main.cpp') diff --git a/platform/wavelet3d/main.cpp b/platform/wavelet3d/main.cpp index 49c96c1..2555d1d 100644 --- a/platform/wavelet3d/main.cpp +++ b/platform/wavelet3d/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -23,99 +24,166 @@ int main(int argc, char **argv) Py_Initialize(); - float q; - int a, b; - const char *op = "int->fp"; - - std::cin >> a >> b; - - // int->fp - top.setup_mul_float = 0; - top.setup_unit_b = 1; - top.mnorm_put_hi = 0; - top.mnorm_put_lo = 1; - top.mnorm_put_mul = 0; - top.mnorm_zero_flags = 1; - top.mnorm_zero_b = 1; - top.minmax_copy_flags = 0; - top.shiftr_int_signed = 1; - top.addsub_int_operand = 1; - top.addsub_copy_flags = 1; - top.clz_force_nop = 1; - top.shiftl_copy_flags = 0; - top.round_copy_flags = 0; - top.round_enable = 1; - top.encode_enable = 1; - - // mul int - //top.setup_mul_float = 0; - //top.setup_unit_b = 0; - //top.mnorm_put_hi = 0; - //top.mnorm_put_lo = 1; - //top.mnorm_put_mul = 0; - //top.mnorm_zero_flags = 1; - //top.mnorm_zero_b = 1; - //top.minmax_copy_flags = 1; - //top.shiftr_int_signed = 0; - //top.addsub_int_operand = 0; - //top.addsub_copy_flags = 1; - //top.clz_force_nop = 0; - //top.shiftl_copy_flags = 1; - //top.round_copy_flags = 1; - //top.round_enable = 0; - //top.encode_enable = 0; + int time = 0; - // mul fp - //top.setup_mul_float = 1; - //top.setup_unit_b = 0; - //top.mnorm_put_hi = 0; - //top.mnorm_put_lo = 0; - //top.mnorm_put_mul = 1; - //top.mnorm_zero_flags = 0; - //top.mnorm_zero_b = 1; - //top.minmax_copy_flags = 1; - //top.shiftr_int_signed = 0; - //top.addsub_int_operand = 0; - //top.addsub_copy_flags = 1; - //top.clz_force_nop = 1; - //top.shiftl_copy_flags = 1; - //top.round_copy_flags = 1; - //top.round_enable = 1; - //top.encode_enable = 1; - - // suma/resta - //top.setup_mul_float = 0; - //top.setup_unit_b = 1; - //top.mnorm_put_hi = 0; - //top.mnorm_put_lo = 1; - //top.mnorm_put_mul = 0; - //top.mnorm_zero_flags = 0; - //top.mnorm_zero_b = 0; - //top.minmax_copy_flags = 0; - //top.shiftr_int_signed = 0; - //top.addsub_int_operand = 0; - //top.addsub_copy_flags = 0; - //top.clz_force_nop = 1; - //top.shiftl_copy_flags = 0; - //top.round_copy_flags = 0; - //top.round_enable = 1; - //top.encode_enable = 1; - - top.a = *reinterpret_cast(&a); - top.b = *reinterpret_cast(&b); - - for (int i = 0; i < 1000; ++i) { + auto cycle = [&]() + { top.clk = 0; top.eval(); top.clk = 1; top.eval(); - } - unsigned q_bits = top.q; - q = *reinterpret_cast(&q_bits); + ++time; + }; + + auto send_op = [&](auto a, const char *op, auto b) + { + std::printf + ( + "[%03d] %s %s %s\n", + time, std::to_string(a).c_str(), op, std::to_string(b).c_str() + ); + + top.a[0] = *reinterpret_cast(&a); + top.b[0] = *reinterpret_cast(&b); + top.in_valid = 1; + cycle(); + + top.a[0] = 0; + top.b[0] = 0; + top.in_valid = 0; + }; + + auto int_to_fp = [&](int a) + { + top.setup_mul_float = 0; + top.setup_unit_b = 1; + top.mnorm_put_hi = 0; + top.mnorm_put_lo = 1; + top.mnorm_put_mul = 0; + top.mnorm_zero_flags = 1; + top.mnorm_zero_b = 1; + top.minmax_copy_flags = 0; + top.shiftr_int_signed = 1; + top.addsub_int_operand = 1; + top.addsub_copy_flags = 1; + top.clz_force_nop = 0; + top.shiftl_copy_flags = 0; + top.round_copy_flags = 0; + top.round_enable = 1; + top.encode_enable = 1; + + send_op(a, "fp->int", 0); + }; + + auto mul_int = [&](unsigned a, unsigned b) + { + top.setup_mul_float = 0; + top.setup_unit_b = 0; + top.mnorm_put_hi = 0; + top.mnorm_put_lo = 1; + top.mnorm_put_mul = 0; + top.mnorm_zero_flags = 1; + top.mnorm_zero_b = 1; + top.minmax_copy_flags = 1; + top.shiftr_int_signed = 0; + top.addsub_int_operand = 0; + top.addsub_copy_flags = 1; + top.clz_force_nop = 1; + top.shiftl_copy_flags = 1; + top.round_copy_flags = 1; + top.round_enable = 0; + top.encode_enable = 0; + + send_op(a, "*", b); + }; - std::cout << a << ' ' << op << ' ' << b << " = " << q << '\n'; + // mul fp + auto mul_fp = [&](float a, float b) + { + top.setup_mul_float = 1; + top.setup_unit_b = 0; + top.mnorm_put_hi = 0; + top.mnorm_put_lo = 0; + top.mnorm_put_mul = 1; + top.mnorm_zero_flags = 0; + top.mnorm_zero_b = 1; + top.minmax_copy_flags = 1; + top.shiftr_int_signed = 0; + top.addsub_int_operand = 0; + top.addsub_copy_flags = 1; + top.clz_force_nop = 1; + top.shiftl_copy_flags = 1; + top.round_copy_flags = 1; + top.round_enable = 1; + top.encode_enable = 1; + + send_op(a, "*", b); + }; + + auto add_fp = [&](float a, float b) + { + top.setup_mul_float = 0; + top.setup_unit_b = 1; + top.mnorm_put_hi = 0; + top.mnorm_put_lo = 1; + top.mnorm_put_mul = 0; + top.mnorm_zero_flags = 0; + top.mnorm_zero_b = 0; + top.minmax_copy_flags = 0; + top.shiftr_int_signed = 0; + top.addsub_int_operand = 0; + top.addsub_copy_flags = 0; + top.clz_force_nop = 0; + top.shiftl_copy_flags = 0; + top.round_copy_flags = 0; + top.round_enable = 1; + top.encode_enable = 1; + + send_op(a, "+", b); + }; + + top.rst_n = 0; + top.in_valid = 0; + cycle(); + + top.rst_n = 1; + cycle(); + + int a, b; + float a_flt, b_flt; + + std::cout << "a_int: "; + std::cin >> a; + std::cout << "b_int: "; + std::cin >> b; + std::cout << "a_flt: "; + std::cin >> a_flt; + std::cout << "b_flt: "; + std::cin >> b_flt; + + int_to_fp(a); + mul_int(a, b); + mul_fp(a_flt, b_flt); + add_fp(a_flt, b_flt); + + while (time < 20) { + cycle(); + + if (!top.out_valid) + continue; + + unsigned q_bits = top.q[0]; + int q_int = *reinterpret_cast(&q_bits); + float q_flt = *reinterpret_cast(&q_bits); + + std::printf + ( + "[%03d] q=0x%08x, q_flt=%g, q_int=%d, q_uint=%u\n", + time, q_bits, q_flt, q_int, q_bits + ); + } bool failed = Py_FinalizeEx() < 0; -- cgit v1.2.3