// -----------------------------------------------------------------------------
// (C) Bibix
// The content below includes confidential, proprietary information of
// Bibix. All use, disclosure, and/or reproduction is prohibited
// unless authorized in writing. All rights reserved.
// -----------------------------------------------------------------------------
// File         : tb_fir_gen.cpp
// Description  : C-testbench for fir_gen benchmark
// Author       : Sabih Gerez, Bibix
// Creation date: March 30, 2011
// -----------------------------------------------------------------------------
// $Rev: 119 $
// $Author: sabih $
// $Date: 2011-04-25 01:14:47 +0200 (Mon, 25 Apr 2011) $
// $Log$
// -----------------------------------------------------------------------------


// include global files
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

// include local files
#include "fir_gen.h"


int main(int argc, char* argv[])
{
  // both input and output data stream will be written from testbench
  // open file for input stream
  FILE *infile;

  infile = fopen("fir_gen.in", "wt");
  if (infile == NULL)
     printf("Cannot open fir_gen.in for reading!\n");
  assert(infile != NULL);

  // open file for output stream
  FILE *outfile;

  outfile = fopen("fir_gen.out", "wt");
  if (outfile == NULL)
     printf("Cannot open fir_gen.out for writing!\n");
  assert(outfile != NULL);

  // set up hardware
  fir_gen hardware;

  // word lengths of coefficients and data
  const int w1c = 9;
  const int w1d = 9;

  // scaling factors given word length
  const int coeff_scale = pow(2, w1c-1);
  const int data_scale  = pow(2, w1d-1);

  // number of test vectors
  const int no_tv = 15;
  
  // arrays for stimuli
  i32 c_in_arr[no_tv];
  i32 x_in_arr[no_tv];
  u32 load_x_arr[no_tv];

  // fill coefficients Daubechies DB2 (not DB4!)
  c_in_arr[0] = i32( 0.48296291314469025 * coeff_scale);
  c_in_arr[1] = i32( 0.83651630373746899 * coeff_scale);
  c_in_arr[2] = i32( 0.22414386804185735 * coeff_scale);
  c_in_arr[3] = i32(-0.12940952255092145 * coeff_scale);

  load_x_arr[0] = 0;
  load_x_arr[1] = 0;
  load_x_arr[2] = 0;
  load_x_arr[3] = 0;

  for (int i = 4; i < no_tv; i++) {
    c_in_arr[i] = 0;
    load_x_arr[i] = 1;
  }

  // fill input data for impulse-response simulation
  x_in_arr[0] = 0;
  x_in_arr[1] = 0;
  x_in_arr[2] = 0;
  x_in_arr[3] = 0;
  x_in_arr[4] = 0;
  x_in_arr[5] = data_scale-1;
  
  for (int i = 6; i < no_tv; i++) {
    x_in_arr[i] = 0;
  }

  // reset
  hardware.reset();

  // now execute simulation
  
  // variable to collect output
  i32 result;

  for (int i = 0; i < no_tv; i++) {
    hardware.run(load_x_arr[i], x_in_arr[i], c_in_arr[i], result);
    fprintf(infile, "%1d %d %d\n", load_x_arr[i], x_in_arr[i], c_in_arr[i]);
    fprintf(outfile, "%d\n", result);
  }
  
  // close files
  fclose(infile);
  fclose(outfile);
  printf("OK! End of simulation.\n");
}
