|
| 1 | +#ifdef TEST_MODE_ONE_WINDOW_RANDOM |
| 2 | +#include <cstdlib> |
| 3 | +#endif // TEST_MODE_ONE_WINDOW_RANDOM |
| 4 | +#ifdef IPS_DUMP_EN |
| 5 | +#include <sstream> |
| 6 | +#endif // IPS_DUMP_EN |
| 7 | +#include <systemc.h> |
| 8 | + |
| 9 | +#define IPS_FILTER_PV_EN |
| 10 | + |
| 11 | +#define IPS_FILTER_KERNEL_SIZE 3 |
| 12 | +#define IPS_IN_TYPE_TB float |
| 13 | +#define IPS_OUT_TYPE_TB float |
| 14 | + |
| 15 | +#ifdef IPS_FILTER_AT_EN |
| 16 | +#include "ips_filter_at_model.hpp" |
| 17 | +#elif defined(IPS_FILTER_LT_EN) |
| 18 | +#include "ips_filter_lt_model.hpp" |
| 19 | +#elif defined(IPS_FILTER_PV_EN) |
| 20 | +#include "ips_filter_pv_model.hpp" |
| 21 | +#else |
| 22 | +#error "No IPS_FILTER macro is defined. Please define one of IPS_FILTER_AT_EN, IPS_FILTER_LT_EN, or IPS_FILTER_PV_EN." |
| 23 | +#endif // IPS_FILTER_XX_EN |
| 24 | + |
| 25 | + |
| 26 | +#ifdef TEST_MODE_ONE_WINDOW |
| 27 | +#ifdef IPS_DUMP_EN |
| 28 | +void run_one_window(sc_trace_file* wf) |
| 29 | +#else |
| 30 | +void run_one_window() |
| 31 | +#endif // IPS_DUMP_EN |
| 32 | +{ |
| 33 | +#ifdef IPS_DEBUG_EN |
| 34 | + #ifdef TEST_MODE_ONE_WINDOW_RANDOM |
| 35 | + SC_REPORT_INFO("TEST_MODE_ONE_WINDOW_NORMAL", "Running test"); |
| 36 | + #elif defined(TEST_MODE_ONE_WINDOW_NORMAL) |
| 37 | + SC_REPORT_INFO("TEST_MODE_ONE_WINDOW_NORMAL", "Running test"); |
| 38 | + #else |
| 39 | + SC_REPORT_INFO("TEST_MODE_ONE_WINDOW_DEFAULT", "Running test"); |
| 40 | + #endif // TEST_MODE_ONE_WINDOW_RANDOM |
| 41 | + SC_REPORT_INFO("Initialize window", "Window value"); |
| 42 | +#endif |
| 43 | + |
| 44 | + // Variables |
| 45 | + IPS_IN_TYPE_TB *img_window; |
| 46 | + IPS_OUT_TYPE_TB result; |
| 47 | + |
| 48 | + // Initialize image window |
| 49 | + img_window = new IPS_IN_TYPE_TB[IPS_FILTER_KERNEL_SIZE * IPS_FILTER_KERNEL_SIZE]; |
| 50 | + |
| 51 | + for (size_t i = 0; i < IPS_FILTER_KERNEL_SIZE; ++i) |
| 52 | + { |
| 53 | + for (size_t j = 0; j < IPS_FILTER_KERNEL_SIZE; ++j) |
| 54 | + { |
| 55 | + IPS_IN_TYPE_TB value; |
| 56 | + |
| 57 | +#ifdef TEST_MODE_ONE_WINDOW_RANDOM |
| 58 | + value = (IPS_IN_TYPE_TB) (rand() % 256); |
| 59 | +#elif defined(TEST_MODE_ONE_WINDOW_NORMAL) |
| 60 | + value = (IPS_IN_TYPE_TB) (i * IPS_FILTER_KERNEL_SIZE + j); |
| 61 | +#else |
| 62 | + value = (IPS_IN_TYPE_TB) i; |
| 63 | +#endif // TEST_MODE_ONE_WINDOW |
| 64 | + |
| 65 | + img_window[i * IPS_FILTER_KERNEL_SIZE + j] = value; |
| 66 | + |
| 67 | +#ifdef IPS_DUMP_EN |
| 68 | + std::ostringstream var_name; |
| 69 | + var_name << "img_window_" << i << "_" << j; |
| 70 | + sc_trace(wf, img_window[i * IPS_FILTER_KERNEL_SIZE + j], var_name.str()); |
| 71 | +#endif // IPS_DUMP_EN |
| 72 | +#ifdef IPS_DEBUG_EN |
| 73 | + std::cout << "[" << img_window[i * IPS_FILTER_KERNEL_SIZE + j] << "]"; |
| 74 | +#endif // IPS_DUMP_EN |
| 75 | + } |
| 76 | + |
| 77 | +#ifdef IPS_DEBUG_EN |
| 78 | + std::cout << std::endl; |
| 79 | +#endif // IPS_DEBUG_EN |
| 80 | + } |
| 81 | + |
| 82 | + // Instantiate filter module and do the connection |
| 83 | +#ifdef IPS_DUMP_EN |
| 84 | + Filter<IPS_IN_TYPE_TB, IPS_OUT_TYPE_TB, IPS_FILTER_KERNEL_SIZE> filter("filter", wf); |
| 85 | +#else |
| 86 | + Filter<IPS_IN_TYPE_TB, IPS_OUT_TYPE_TB, IPS_FILTER_KERNEL_SIZE> filter("filter"); |
| 87 | +#endif // IPS_DEBUG_EN |
| 88 | + |
| 89 | + sc_start(); |
| 90 | + |
| 91 | +#ifdef IPS_DEBUG_EN |
| 92 | + std::cout << "Test starting" << std::endl; |
| 93 | + std::cout << "@" << sc_time_stamp() << std::endl; |
| 94 | +#endif // IPS_DEBUG_EN |
| 95 | + |
| 96 | + // Apply convolution |
| 97 | + filter.filter(img_window, result); |
| 98 | +#ifdef IPS_DEBUG_EN |
| 99 | + SC_REPORT_INFO("TEST_MODE_ONE_WINDOW", "filtering"); |
| 100 | + std::cout << "Result = " << result << std::endl; |
| 101 | +#endif // IPS_DEBUG_EN |
| 102 | + |
| 103 | +#ifdef IPS_DUMP_EN |
| 104 | + sc_trace(wf, result, "result"); |
| 105 | + sc_start(1, SC_NS); |
| 106 | +#endif // IPS_DUMP_EN |
| 107 | + |
| 108 | + delete [] img_window; |
| 109 | +} |
| 110 | +#endif // TEST_MODE_ONE_WINDOW |
| 111 | + |
| 112 | + |
| 113 | +int sc_main(int, char*[]) |
| 114 | +{ |
| 115 | + // Pass command linke arguments |
| 116 | + sc_argc(); |
| 117 | + sc_argv(); |
| 118 | + |
| 119 | +#ifdef IPS_DUMP_EN |
| 120 | + // Open VCD file |
| 121 | + sc_trace_file* wf = sc_create_vcd_trace_file("ips_filter"); |
| 122 | + wf->set_time_unit(1, SC_NS); |
| 123 | +#endif // IPS_DUMP_EN |
| 124 | + |
| 125 | +#ifdef TEST_MODE_ONE_WINDOW |
| 126 | + run_one_window(wf); |
| 127 | +#endif // TEST_MODE_ONE_WINDOW |
| 128 | + |
| 129 | +#ifdef IPS_DUMP_EN |
| 130 | + std::cout << "@" << sc_time_stamp() << " Terminating simulation" << std::endl; |
| 131 | + sc_close_vcd_trace_file(wf); |
| 132 | +#endif // IPS_DUMP_EN |
| 133 | + return 0; |
| 134 | +} |
0 commit comments