
class test_fir_helper : public adf::graph {
public:
  static constexpr unsigned int TP_SSR = 1;
  static constexpr unsigned int TP_PARA_DECI_POLY = 1;
  template <typename dir>
  using ssr_port_array = std::array<adf::port<dir>, TP_SSR>;

  std::array<adf::port<input>, TP_SSR*TP_PARA_DECI_POLY> in;
  // No dual input
  //No coeff port
  ssr_port_array<output> out;
  // No dual output

  std::vector<int16> taps = {0, 0, 0, 0};
  xf::dsp::aie::fir::decimate_asym::fir_decimate_asym_graph<
    int32, //TT_DATA
    int16, //TT_COEFF
    4, //TP_FIR_LEN
    2, //TP_DECIMATE_FACTOR
    0, //TP_SHIFT
    0, //TP_RND
    16, //TP_INPUT_WINDOW_VSIZE
    1, //TP_CASC_LEN
    0, //TP_USE_COEFF_RELOAD
    1, //TP_NUM_OUTPUTS
    0, //TP_DUAL_IP
    0, //TP_API
    1, //TP_SSR
    1, //TP_PARA_DECI_POLY
    0 //TP_SAT
  > filter;

  test_fir_helper() : filter(taps) {
    adf::kernel *filter_kernels = filter.getKernels();

    for (int paraPolyIdx=0; paraPolyIdx < TP_PARA_DECI_POLY; paraPolyIdx++) {
      for (int ssrIdx=0; ssrIdx < TP_SSR; ssrIdx++) {
        unsigned inPortIdx = paraPolyIdx + ssrIdx*TP_PARA_DECI_POLY;
        adf::connect<> net_in(in[inPortIdx], filter.in[inPortIdx]);
        // No dual input
      }
    }
    for (int ssrIdx=0; ssrIdx < TP_SSR; ssrIdx++) {
      unsigned outPortIdx = ssrIdx;
      //No coeff port
      adf::connect<> net_out(filter.out[outPortIdx], out[outPortIdx]);
      // No dual output
    }
  }

};
