From 5562ef96a6b94ec1ce507d3a48d891e1d01142ed Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Wed, 3 Apr 2024 03:51:15 -0600 Subject: platform/wavelet3d: implement raster output test --- platform/wavelet3d/main.cpp | 109 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 13 deletions(-) (limited to 'platform/wavelet3d/main.cpp') diff --git a/platform/wavelet3d/main.cpp b/platform/wavelet3d/main.cpp index c1e2f69..77cde26 100644 --- a/platform/wavelet3d/main.cpp +++ b/platform/wavelet3d/main.cpp @@ -4,8 +4,9 @@ #include #include #include +#include -#include +#include #include #if VM_TRACE @@ -20,22 +21,28 @@ int main(int argc, char **argv) Vtop top; #if VM_TRACE + Verilated::traceEverOn(true); + VerilatedFstC trace; + top.trace(&trace, 0); + trace.open("dump.fst"); #endif - Py_Initialize(); - int time = 0; auto cycle = [&]() { - top.clk = 0; top.eval(); - +#if VM_TRACE + trace.dump(time++); +#endif top.clk = 1; - top.eval(); - ++time; + top.eval(); +#if VM_TRACE + trace.dump(time++); +#endif + top.clk = 0; }; auto send_op = [&](auto a, const char *op, auto b) @@ -182,6 +189,7 @@ int main(int argc, char **argv) send_op(a, min ? "min" : "max", b); }; + top.clk = 0; top.rst_n = 0; top.in_valid = 0; top.geom_tvalid = 0; @@ -220,10 +228,14 @@ int main(int argc, char **argv) std::cout << "b_y: "; std::cin >> b_y; std::cout << "c_x: "; - std::cin >> c_y; + std::cin >> c_x; std::cout << "c_y: "; std::cin >> c_y; + unsigned cycles; + std::cout << "cycles: "; + std::cin >> cycles; + constexpr int FIXED_FRAC = 10; int geom[] = { @@ -236,10 +248,27 @@ int main(int argc, char **argv) static_cast(::ldexpf(c_y, FIXED_FRAC)), }; + ::SDL_Event event; + ::SDL_Renderer *renderer; + ::SDL_Window *window; + + //FIXME: errores + ::SDL_Init(SDL_INIT_VIDEO); + ::SDL_CreateWindowAndRenderer(640, 480, 0, &window, &renderer); + ::SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + ::SDL_RenderClear(renderer); + + ::SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0); + + int bary_idx = 0, x_coarse, y_coarse, x_fine, y_fine; + int geom_state = 0; + int bit; + float barys[3]; + unsigned mask; unsigned geom_idx = 0; top.raster_tready = 1; - while (time < 1000) { + while (time < 2 * cycles) { cycle(); if (top.out_valid) { @@ -271,16 +300,70 @@ int main(int argc, char **argv) unsigned data = top.raster_tdata; auto fixed = ::ldexpf(static_cast(static_cast(data)), -FIXED_FRAC); - std::printf("[%03d] raster d=0x%08x, d_fix=%g\n", time, data, fixed); + //std::printf("[%03d] raster[%c] d=0x%08x, d_fix=%g\n", + // time, top.raster_tlast ? 'l' : '-', data, fixed); + + switch (geom_state) { + case 0: + geom_state = 1; + break; + + case 1: + y_coarse = (static_cast(data) >> 16 << 2) + 480/2; + x_coarse = (static_cast(data & 0xffff) << 2) + 640/2; + geom_state = 2; + ::SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0); + for (int dy = 0; dy < 4; ++dy) + for (int dx = 0; dx < 4; ++dx) + ::SDL_RenderDrawPoint(renderer, x_coarse + dx, y_coarse + dy); + break; + + case 2: + mask = data; + geom_state = 3; + break; + + case 3: + bit = ::ffs(mask) - 1; + barys[bary_idx] = fixed; + switch (bary_idx) { + case 0: + bary_idx = 1; + break; + case 1: + bary_idx = 2; + break; + case 2: + bary_idx = 0; + mask = mask & ~(1 << bit); + y_fine = y_coarse + (bit >> 2); + x_fine = x_coarse + (bit & 0b11); + + ::SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0); + ::SDL_RenderDrawPoint(renderer, x_fine, y_fine); + + break; + } + if (top.raster_tlast) + geom_state = 0; + break; + } } } - bool failed = Py_FinalizeEx() < 0; - #if VM_TRACE trace.close(); #endif top.final(); - return failed ? EXIT_FAILURE : EXIT_SUCCESS; + + ::SDL_RenderPresent(renderer); + while (!::SDL_PollEvent(&event) || event.type != SDL_QUIT) + continue; + + ::SDL_DestroyRenderer(renderer); + ::SDL_DestroyWindow(window); + ::SDL_Quit(); + + return EXIT_SUCCESS; } -- cgit v1.2.3