OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [sw/] [example/] [floating_point_test/] [main.c] - Diff between revs 55 and 56

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 55 Rev 56
Line 80... Line 80...
#define RUN_SGNINJ_TESTS   (1)
#define RUN_SGNINJ_TESTS   (1)
//** Run classify tests when != 0 */
//** Run classify tests when != 0 */
#define RUN_CLASSIFY_TESTS (1)
#define RUN_CLASSIFY_TESTS (1)
//** Run unsupported instructions tests when != 0 */
//** Run unsupported instructions tests when != 0 */
#define RUN_UNAVAIL_TESTS  (1)
#define RUN_UNAVAIL_TESTS  (1)
 
//** Run average instruction execution time test when != 0 */
 
#define RUN_TIMING_TESTS   (0)
/**@}*/
/**@}*/
 
 
 
 
// Prototypes
// Prototypes
uint32_t get_test_vector(void);
uint32_t get_test_vector(void);
Line 141... Line 143...
  // intro
  // intro
  neorv32_uart_printf("<<< Zfinx extension test >>>\n");
  neorv32_uart_printf("<<< Zfinx extension test >>>\n");
#if (SILENT_MODE != 0)
#if (SILENT_MODE != 0)
  neorv32_uart_printf("SILENT_MODE enabled (only showing actual errors)\n");
  neorv32_uart_printf("SILENT_MODE enabled (only showing actual errors)\n");
#endif
#endif
  neorv32_uart_printf("Test cases per instruction: %u\n\n", (uint32_t)NUM_TEST_CASES);
  neorv32_uart_printf("Test cases per instruction: %u\n", (uint32_t)NUM_TEST_CASES);
 
  neorv32_uart_printf("NOTE: The NEORV32 FPU does not support subnormal numbers yet. Subnormal numbers are flushed to zero.\n\n");
 
 
 
 
  // clear exception status word
  // clear exception status word
  neorv32_cpu_csr_write(CSR_FFLAGS, 0);; // real hardware
  neorv32_cpu_csr_write(CSR_FFLAGS, 0);; // real hardware
  feclearexcept(FE_ALL_EXCEPT); // software runtime (GCC floating-point emulation)
  feclearexcept(FE_ALL_EXCEPT); // software runtime (GCC floating-point emulation)
Line 411... Line 414...
  neorv32_uart_printf("\n# unsupported FDIV.S (division) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FDIV.S (division) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fdivs(opa.float_value, opb.float_value);
  riscv_intrinsic_fdivs(opa.float_value, opb.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
Line 424... Line 427...
  neorv32_uart_printf("\n# unsupported FSQRT.S (square root) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FSQRT.S (square root) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fsqrts(opa.float_value);
  riscv_intrinsic_fsqrts(opa.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
Line 437... Line 440...
  neorv32_uart_printf("\n# unsupported FMADD.S (fused multiply-add) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FMADD.S (fused multiply-add) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fmadds(opa.float_value, opb.float_value, -opa.float_value);
  riscv_intrinsic_fmadds(opa.float_value, opb.float_value, -opa.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
Line 450... Line 453...
  neorv32_uart_printf("\n# unsupported FMSUB.S (fused multiply-sub) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FMSUB.S (fused multiply-sub) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fmsubs(opa.float_value, opb.float_value, -opa.float_value);
  riscv_intrinsic_fmsubs(opa.float_value, opb.float_value, -opa.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
Line 463... Line 466...
  neorv32_uart_printf("\n# unsupported FNMSUB.S (fused negated multiply-sub) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FNMSUB.S (fused negated multiply-sub) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fnmadds(opa.float_value, opb.float_value, -opa.float_value);
  riscv_intrinsic_fnmadds(opa.float_value, opb.float_value, -opa.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
Line 476... Line 479...
  neorv32_uart_printf("\n# unsupported FNMADD.S (fused negated multiply-add) [illegal instruction]...\n");
  neorv32_uart_printf("\n# unsupported FNMADD.S (fused negated multiply-add) [illegal instruction]...\n");
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  opa.binary_value = get_test_vector();
  opa.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  opb.binary_value = get_test_vector();
  riscv_intrinsic_fnmadds(opa.float_value, opb.float_value, -opa.float_value);
  riscv_intrinsic_fnmadds(opa.float_value, opb.float_value, -opa.float_value);
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) != TRAP_CODE_I_ILLEGAL) {
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[FAILED]%c[0m\n", 27, 27);
    err_cnt_total++;
    err_cnt_total++;
  }
  }
  else {
  else {
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
    neorv32_uart_printf("%c[1m[ok]%c[0m\n", 27, 27);
  }
  }
#endif
#endif
 
 
 
 
  // final report
// ----------------------------------------------------------------------------
 
// Instruction execution timing test
 
// ----------------------------------------------------------------------------
 
 
 
#if (RUN_TIMING_TESTS != 0)
 
 
 
  uint32_t time_start, time_sw, time_hw;
 
  const uint32_t num_runs = 4096;
 
 
 
  neorv32_uart_printf("\nAverage execution time tests (%u runs)\n", num_runs);
 
 
 
 
 
  // signed integer to float
 
  neorv32_uart_printf("FCVT.S.W: ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fcvt_sw((int32_t)opa.binary_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fcvt_sw((int32_t)opa.binary_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // float to signed integer
 
  neorv32_uart_printf("FCVT.W.S: ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.binary_value = (uint32_t)riscv_intrinsic_fcvt_ws(opa.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.binary_value = (uint32_t)riscv_emulate_fcvt_ws(opa.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // addition
 
  neorv32_uart_printf("FADD.S:   ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fadds(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fadds(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // subtraction
 
  neorv32_uart_printf("FSUB.S:   ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fsubs(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fsubs(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // multiplication
 
  neorv32_uart_printf("FMUL.S:   ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fmuls(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fmuls(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // Max
 
  neorv32_uart_printf("FMAX.S:   ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fmaxs(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fmaxs(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // Comparison
 
  neorv32_uart_printf("FLE.S:    ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fles(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fles(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
 
 
 
 
  // Sign-injection
 
  neorv32_uart_printf("FSGNJX.S: ");
 
  time_sw = 0;
 
  time_hw = 0;
 
  err_cnt = 0;
 
  for (i=0; i<num_runs; i++) {
 
    opa.binary_value = get_test_vector();
 
    opb.binary_value = get_test_vector();
 
 
 
    // hardware execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_hw.float_value = riscv_intrinsic_fsgnjxs(opa.float_value, opb.float_value);
 
    }
 
    time_hw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
    time_hw -= 4; // remove the 2 dummy instructions
 
 
 
    // software (emulation) execution time
 
    time_start = neorv32_cpu_csr_read(CSR_CYCLE);
 
    {
 
      res_sw.float_value = riscv_emulate_fsgnjxs(opa.float_value, opb.float_value);
 
    }
 
    time_sw += neorv32_cpu_csr_read(CSR_CYCLE) - time_start;
 
 
 
    if (res_sw.binary_value != res_hw.binary_value) {
 
      err_cnt++;
 
    }
 
  }
 
 
 
  if (err_cnt == 0) {
 
    neorv32_uart_printf("cycles[SW] = %u vs. cycles[HW] = %u\n", time_sw/num_runs, time_hw/num_runs);
 
  }
 
  else {
 
    neorv32_uart_printf("%c[1m[TEST FAILED!]%c[0m\n", 27, 27);
 
    err_cnt_total++;
 
  }
 
#endif
 
 
 
 
 
// ----------------------------------------------------------------------------
 
// Final report
 
// ----------------------------------------------------------------------------
 
 
  if (err_cnt_total != 0) {
  if (err_cnt_total != 0) {
    neorv32_uart_printf("\n%c[1m[ZFINX EXTENSION VERIFICATION FAILED!]%c[0m\n", 27, 27);
    neorv32_uart_printf("\n%c[1m[ZFINX EXTENSION VERIFICATION FAILED!]%c[0m\n", 27, 27);
    neorv32_uart_printf("%u errors in %u test cases\n", err_cnt_total, test_cnt*(uint32_t)NUM_TEST_CASES);
    neorv32_uart_printf("%u errors in %u test cases\n", err_cnt_total, test_cnt*(uint32_t)NUM_TEST_CASES);
  }
  }
  else {
  else {
Line 527... Line 848...
  }
  }
  else {
  else {
    tmp.binary_value = xorshift32();
    tmp.binary_value = xorshift32();
  }
  }
 
 
  // subnormal numbers are not supported yet!
 
  // flush them to zero
 
//tmp.float_value = subnormal_flush(tmp.float_value);
 
 
 
  return tmp.binary_value;
  return tmp.binary_value;
}
}
 
 
 
 
/**********************************************************************//**
/**********************************************************************//**

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.