mirror of
https://github.com/DrasLorus/CORDIC_Rotate_APFX.git
synced 2024-11-25 05:53:16 +01:00
Fix test method to really using test vectors
- Grow kn_i to 4 bits to pass the new tests.
This commit is contained in:
parent
7707d12e98
commit
0dc041b840
4 changed files with 41 additions and 40 deletions
|
@ -54,7 +54,7 @@ public:
|
||||||
static constexpr unsigned Out_I = In_I + 2;
|
static constexpr unsigned Out_I = In_I + 2;
|
||||||
static constexpr unsigned nb_stages = Tnb_stages;
|
static constexpr unsigned nb_stages = Tnb_stages;
|
||||||
|
|
||||||
static constexpr unsigned kn_i = unsigned(kn_values[nb_stages - 1] * double(1U << 3)); // 3 bits are enough
|
static constexpr unsigned kn_i = unsigned(kn_values[nb_stages - 1] * double(1U << 4)); // 4 bits are enough
|
||||||
static constexpr unsigned in_scale_factor = unsigned(1U << (In_W - In_I));
|
static constexpr unsigned in_scale_factor = unsigned(1U << (In_W - In_I));
|
||||||
static constexpr unsigned out_scale_factor = unsigned(1U << (Out_W - Out_I));
|
static constexpr unsigned out_scale_factor = unsigned(1U << (Out_W - Out_I));
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public:
|
||||||
static constexpr unsigned addr_length = CRomGeneratorConst<TIn_W, Tnb_stages, Tq, divider>::addr_length;
|
static constexpr unsigned addr_length = CRomGeneratorConst<TIn_W, Tnb_stages, Tq, divider>::addr_length;
|
||||||
|
|
||||||
static constexpr int64_t scale_cordic(int64_t in) {
|
static constexpr int64_t scale_cordic(int64_t in) {
|
||||||
return in * kn_i / 8U;
|
return in * kn_i / 16U;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__SYNTHESIS__) && defined(SOFTWARE)
|
#if !defined(__SYNTHESIS__) && defined(SOFTWARE)
|
||||||
|
@ -108,8 +108,8 @@ public:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static ap_int<Out_W> scale_cordic(const ap_int<Out_W> & in) {
|
static ap_int<Out_W> scale_cordic(const ap_int<Out_W> & in) {
|
||||||
const ap_int<Out_W + 3> tmp = in * ap_uint<3>(kn_i);
|
const ap_int<Out_W + 4> tmp = in * ap_uint<4>(kn_i);
|
||||||
return ap_int<Out_W>(tmp >> 3);
|
return ap_int<Out_W>(tmp >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cordic(const ap_int<In_W> & re_in, const ap_int<In_W> & im_in,
|
static void cordic(const ap_int<In_W> & re_in, const ap_int<In_W> & im_in,
|
||||||
|
|
|
@ -59,7 +59,7 @@ public:
|
||||||
static constexpr unsigned nb_stages = @CORDIC_STAGES@;
|
static constexpr unsigned nb_stages = @CORDIC_STAGES@;
|
||||||
static constexpr unsigned q = @CORDIC_Q@;
|
static constexpr unsigned q = @CORDIC_Q@;
|
||||||
|
|
||||||
static constexpr uint64_t kn_i = uint64_t(kn_values[nb_stages - 1] * double(1U << 3)); // 3 bits are enough
|
static constexpr uint64_t kn_i = uint64_t(kn_values[nb_stages - 1] * double(1U << 4)); // 4 bits are enough
|
||||||
static constexpr uint64_t in_scale_factor = uint64_t(1U << (In_W - In_I));
|
static constexpr uint64_t in_scale_factor = uint64_t(1U << (In_W - In_I));
|
||||||
static constexpr uint64_t out_scale_factor = uint64_t(1U << (Out_W - Out_I));
|
static constexpr uint64_t out_scale_factor = uint64_t(1U << (Out_W - Out_I));
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ public:
|
||||||
static constexpr unsigned addr_length = cordic_roms::@ROM_TYPE@_@CORDIC_W@_@CORDIC_STAGES@_@CORDIC_Q@_@CORDIC_DIVIDER@_size;
|
static constexpr unsigned addr_length = cordic_roms::@ROM_TYPE@_@CORDIC_W@_@CORDIC_STAGES@_@CORDIC_Q@_@CORDIC_DIVIDER@_size;
|
||||||
|
|
||||||
static constexpr int64_t scale_cordic(int64_t in) {
|
static constexpr int64_t scale_cordic(int64_t in) {
|
||||||
return in * kn_i / 8U;
|
return in * kn_i / 16U;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__SYNTHESIS__) && defined(SOFTWARE)
|
#if !defined(__SYNTHESIS__) && defined(SOFTWARE)
|
||||||
|
@ -113,8 +113,8 @@ public:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static ap_int<Out_W> scale_cordic(const ap_int<Out_W> & in) {
|
static ap_int<Out_W> scale_cordic(const ap_int<Out_W> & in) {
|
||||||
const ap_int<Out_W + 3> tmp = in * ap_uint<3>(kn_i);
|
const ap_int<Out_W + 4> tmp = in * ap_uint<4>(kn_i);
|
||||||
return ap_int<Out_W>(tmp >> 3);
|
return ap_int<Out_W>(tmp >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cordic(const ap_int<In_W> & re_in, const ap_int<In_W> & im_in,
|
static void cordic(const ap_int<In_W> & re_in, const ap_int<In_W> & im_in,
|
||||||
|
|
|
@ -101,12 +101,12 @@ TEST_CASE("ROM-based Cordic (TPL @ROM_TYPE@, @CORDIC_W@, @CORDIC_STAGES@, @CORDI
|
||||||
double results_re[n_lines];
|
double results_re[n_lines];
|
||||||
double results_im[n_lines];
|
double results_im[n_lines];
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
||||||
|
@ -117,7 +117,7 @@ TEST_CASE("ROM-based Cordic (TPL @ROM_TYPE@, @CORDIC_W@, @CORDIC_STAGES@, @CORDI
|
||||||
results_im[i] = e.imag();
|
results_im[i] = e.imag();
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
constexpr double abs_margin = double(1 << cordic.Out_I) * 2. / 100.;
|
constexpr double abs_margin = double(1 << cordic.Out_I) * 2. / 100.;
|
||||||
|
|
||||||
|
@ -156,12 +156,12 @@ TEST_CASE("ROM-based Cordic (TPL @ROM_TYPE@, @CORDIC_W@, @CORDIC_STAGES@, @CORDI
|
||||||
double results_re[n_lines];
|
double results_re[n_lines];
|
||||||
double results_im[n_lines];
|
double results_im[n_lines];
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
||||||
|
@ -172,7 +172,7 @@ TEST_CASE("ROM-based Cordic (TPL @ROM_TYPE@, @CORDIC_W@, @CORDIC_STAGES@, @CORDI
|
||||||
results_im[i] = e.imag();
|
results_im[i] = e.imag();
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
constexpr double abs_margin = double(1 << cordic.Out_I) * 2. / 100.;
|
constexpr double abs_margin = double(1 << cordic.Out_I) * 2. / 100.;
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ using Catch::Matchers::Floating::WithinAbsMatcher;
|
||||||
|
|
||||||
typedef CCordicRotateSmart<8, 14, 4, 17, 5, 19, 7, 12> cordic_legacy;
|
typedef CCordicRotateSmart<8, 14, 4, 17, 5, 19, 7, 12> cordic_legacy;
|
||||||
|
|
||||||
TEST_CASE("Adaptive CORDIC work as intended", "[!hide][WIP]") {
|
TEST_CASE("Adaptive CORDIC work as intended", "[!mayfail][!hide][WIP]") {
|
||||||
|
|
||||||
string input_fn = "../data/input.dat"; // _8_14_4_17_5_19_7_12
|
string input_fn = "../data/input.dat"; // _8_14_4_17_5_19_7_12
|
||||||
string output_fn = "../data/output.dat"; // _8_14_4_17_5_19_7_12
|
string output_fn = "../data/output.dat"; // _8_14_4_17_5_19_7_12
|
||||||
|
@ -45,28 +45,29 @@ TEST_CASE("Adaptive CORDIC work as intended", "[!hide][WIP]") {
|
||||||
double exp_re_out[n_lines];
|
double exp_re_out[n_lines];
|
||||||
double exp_im_out[n_lines];
|
double exp_im_out[n_lines];
|
||||||
|
|
||||||
ofstream FILE;
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
FILE * RESULTS = fopen(output_fn.c_str(), "r");
|
||||||
ifstream INPUT(input_fn);
|
|
||||||
ifstream RESULTS(output_fn);
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
|
|
||||||
double a, b, c;
|
double a, b, c;
|
||||||
INPUT >> a >> b >> c;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &c);
|
||||||
values_re_in[i] = a;
|
values_re_in[i] = a;
|
||||||
values_im_in[i] = b;
|
values_im_in[i] = b;
|
||||||
angles_in[i] = c;
|
angles_in[i] = c;
|
||||||
|
|
||||||
RESULTS >> a >> b;
|
fscanf(RESULTS, "%lf,%lf\n", &a, &b);
|
||||||
exp_re_out[i] = a;
|
exp_re_out[i] = a;
|
||||||
exp_im_out[i] = b;
|
exp_im_out[i] = b;
|
||||||
}
|
}
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
RESULTS.close();
|
fclose(RESULTS);
|
||||||
|
|
||||||
|
|
||||||
|
constexpr double abs_margin = double(1 << 6) * 3. / 100.;
|
||||||
|
|
||||||
// Save the results to a file
|
// Save the results to a file
|
||||||
// FILE.open("results.dat");
|
// ofstream FILE("results.dat");
|
||||||
|
|
||||||
// Executing the encoder
|
// Executing the encoder
|
||||||
for (unsigned iter = 0; iter < n_lines; iter++) {
|
for (unsigned iter = 0; iter < n_lines; iter++) {
|
||||||
|
@ -82,8 +83,8 @@ TEST_CASE("Adaptive CORDIC work as intended", "[!hide][WIP]") {
|
||||||
|
|
||||||
// FILE << values_re_out[iter].to_float() << ", " << values_re_out[iter].to_float() << endl;
|
// FILE << values_re_out[iter].to_float() << ", " << values_re_out[iter].to_float() << endl;
|
||||||
|
|
||||||
REQUIRE_THAT(values_re_out[iter].to_float(), WithinAbsMatcher(exp_re_out[iter], 0.079997558593750));
|
REQUIRE_THAT(values_re_out[iter].to_double(), WithinAbsMatcher(exp_re_out[iter], abs_margin));
|
||||||
REQUIRE_THAT(values_im_out[iter].to_float(), WithinAbsMatcher(exp_im_out[iter], 0.079997558593750));
|
REQUIRE_THAT(values_im_out[iter].to_double(), WithinAbsMatcher(exp_im_out[iter], abs_margin));
|
||||||
}
|
}
|
||||||
// FILE.close();
|
// FILE.close();
|
||||||
|
|
||||||
|
@ -111,12 +112,12 @@ TEST_CASE("ROM-based Cordic works with C-Types", "[CORDIC]") {
|
||||||
|
|
||||||
// ofstream FILE;
|
// ofstream FILE;
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_in[i] = c;
|
values_in[i] = c;
|
||||||
|
@ -128,7 +129,7 @@ TEST_CASE("ROM-based Cordic works with C-Types", "[CORDIC]") {
|
||||||
results[i] = c * e;
|
results[i] = c * e;
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
// Save the results to a file
|
// Save the results to a file
|
||||||
// FILE.open("results.dat");
|
// FILE.open("results.dat");
|
||||||
|
@ -186,12 +187,12 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
|
|
||||||
// ofstream out_stream;
|
// ofstream out_stream;
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
||||||
|
@ -202,7 +203,7 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
results_im[i] = e.imag();
|
results_im[i] = e.imag();
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
// Save the results to a file
|
// Save the results to a file
|
||||||
// out_stream.open("results_ap.dat");
|
// out_stream.open("results_ap.dat");
|
||||||
|
@ -229,8 +230,8 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
|
|
||||||
// out_stream << values_re_out[iter].to_int64() << " " << values_im_out[iter].to_int64() << " " << results_re[iter] << " " << results_im[iter] << endl;
|
// out_stream << values_re_out[iter].to_int64() << " " << values_im_out[iter].to_int64() << " " << results_re[iter] << " " << results_im[iter] << endl;
|
||||||
|
|
||||||
REQUIRE_THAT(values_re_out[iter].to_double() * 5. / 8. / cordic_rom::out_scale_factor, WithinAbsMatcher(results_re[iter], abs_margin));
|
REQUIRE_THAT(cordic_rom::scale_cordic(values_re_out[iter].to_double()) / cordic_rom::out_scale_factor, WithinAbsMatcher(results_re[iter], abs_margin));
|
||||||
REQUIRE_THAT(values_im_out[iter].to_double() * 5. / 8. / cordic_rom::out_scale_factor, WithinAbsMatcher(results_im[iter], abs_margin));
|
REQUIRE_THAT(cordic_rom::scale_cordic(values_im_out[iter].to_double()) / cordic_rom::out_scale_factor, WithinAbsMatcher(results_im[iter], abs_margin));
|
||||||
}
|
}
|
||||||
// out_stream.close();
|
// out_stream.close();
|
||||||
// fclose(romf);
|
// fclose(romf);
|
||||||
|
@ -263,12 +264,12 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
|
|
||||||
// ofstream out_stream;
|
// ofstream out_stream;
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
||||||
|
@ -279,7 +280,7 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
results_im[i] = e.imag();
|
results_im[i] = e.imag();
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
// Save the results to a file
|
// Save the results to a file
|
||||||
// out_stream.open("results_ap.dat");
|
// out_stream.open("results_ap.dat");
|
||||||
|
@ -345,12 +346,12 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
|
|
||||||
// ofstream out_stream;
|
// ofstream out_stream;
|
||||||
|
|
||||||
ifstream INPUT(input_fn);
|
FILE * INPUT = fopen(input_fn.c_str(), "r");
|
||||||
|
|
||||||
// Init test vector
|
// Init test vector
|
||||||
for (unsigned i = 0; i < n_lines; i++) {
|
for (unsigned i = 0; i < n_lines; i++) {
|
||||||
double a, b, r;
|
double a, b, r;
|
||||||
INPUT >> a >> b >> r;
|
fscanf(INPUT, "%lf,%lf,%lf\n", &a, &b, &r);
|
||||||
|
|
||||||
const complex<double> c {a, b};
|
const complex<double> c {a, b};
|
||||||
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
values_re_in[i] = int64_t(a * double(cordic_rom::in_scale_factor));
|
||||||
|
@ -361,7 +362,7 @@ TEST_CASE("ROM-based Cordic works with AP-Types", "[CORDIC]") {
|
||||||
results_im[i] = e.imag();
|
results_im[i] = e.imag();
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT.close();
|
fclose(INPUT);
|
||||||
|
|
||||||
// Save the results to a file
|
// Save the results to a file
|
||||||
// out_stream.open("results_ap.dat");
|
// out_stream.open("results_ap.dat");
|
||||||
|
|
Loading…
Reference in a new issue