// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

// Abstract primitives wrapper.
//
// This file is a stop-gap until the DV file list is generated by FuseSoC.
// Its contents are taken from the file which would be generated by FuseSoC.
// https://github.com/lowRISC/ibex/issues/893

package lowrisc_prim_pkg;

  // Implementation target specialization
  typedef enum integer {
    ImplGeneric,
    ImplXilinx
  } impl_e;
endpackage : lowrisc_prim_pkg

`ifndef LOWRISC_PRIM_DEFAULT_IMPL
  `ifdef FPGA_XILINX
    `define LOWRISC_PRIM_DEFAULT_IMPL lowrisc_prim_pkg::ImplXilinx
  `else
    `define LOWRISC_PRIM_DEFAULT_IMPL lowrisc_prim_pkg::ImplGeneric
  `endif
`endif

module lowrisc_prim_clock_gating (
  input        clk_i,
  input        en_i,
  input        test_en_i,
  output logic clk_o
);
  parameter lowrisc_prim_pkg::impl_e Impl = `LOWRISC_PRIM_DEFAULT_IMPL;

  if (Impl == lowrisc_prim_pkg::ImplGeneric) begin : gen_generic
`ifndef SYNTHESIS
    lowrisc_prim_generic_clock_gating u_impl_generic (
      .*
    );
`endif
  end else if (Impl == lowrisc_prim_pkg::ImplXilinx) begin : gen_xilinx
`ifdef FPGA_XILINX
    lowrisc_prim_xilinx_clock_gating u_impl_xilinx (
      .*
    );
`endif
  end else begin : gen_failure
    // TODO: Find code that works across tools and causes a compile failure
  end

endmodule
