summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/main.cpp
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-03-08 22:15:07 -0600
committerAlejandro Soto <alejandro@34project.org>2024-03-08 22:15:07 -0600
commite11fd369080e7d9b54f1a640c78fb4a1484cb2d6 (patch)
tree53c1b6e76eddad2497470a16818cdfdf4b1e745e /platform/wavelet3d/main.cpp
parent9456d0f772502c4d9891f35cdc433da8332f55ea (diff)
platform/wavelet3d: implement fpint lanes
Diffstat (limited to 'platform/wavelet3d/main.cpp')
-rw-r--r--platform/wavelet3d/main.cpp238
1 files changed, 153 insertions, 85 deletions
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 <cstddef>
#include <cstdio>
#include <cstdlib>
+#include <string>
#include <Python.h>
#include <verilated.h>
@@ -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<unsigned*>(&a);
- top.b = *reinterpret_cast<unsigned*>(&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<decltype(q)*>(&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<unsigned*>(&a);
+ top.b[0] = *reinterpret_cast<unsigned*>(&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<int*>(&q_bits);
+ float q_flt = *reinterpret_cast<float*>(&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;