//===---- AMDILDevice.h - Define Device Data for AMDGPU -----*- C++ -*------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
//
/// \file
/// \brief Interface for the subtarget data classes.
//
/// This file will define the interface that each generation needs to
/// implement in order to correctly answer queries on the capabilities of the
/// specific hardware.
//===----------------------------------------------------------------------===//
#ifndef AMDILDEVICEIMPL_H
#define AMDILDEVICEIMPL_H
#include "AMDIL.h"
#include "llvm/ADT/BitVector.h"

namespace llvm {
  class AMDGPUSubtarget;
  class MCStreamer;
//===----------------------------------------------------------------------===//
// Interface for data that is specific to a single device
//===----------------------------------------------------------------------===//
class AMDGPUDevice {
public:
  AMDGPUDevice(AMDGPUSubtarget *ST);
  virtual ~AMDGPUDevice();

  // Enum values for the various memory types.
  enum {
    RAW_UAV_ID   = 0,
    ARENA_UAV_ID = 1,
    LDS_ID       = 2,
    GDS_ID       = 3,
    SCRATCH_ID   = 4,
    CONSTANT_ID  = 5,
    GLOBAL_ID    = 6,
    MAX_IDS      = 7
  } IO_TYPE_IDS;

  /// \returns The max LDS size that the hardware supports.  Size is in
  /// bytes.
  virtual size_t getMaxLDSSize() const = 0;

  /// \returns The max GDS size that the hardware supports if the GDS is
  /// supported by the hardware.  Size is in bytes.
  virtual size_t getMaxGDSSize() const;

  /// \returns The max number of hardware constant address spaces that
  /// are supported by this device.
  virtual size_t getMaxNumCBs() const;

  /// \returns The max number of bytes a single hardware constant buffer
  /// can support.  Size is in bytes.
  virtual size_t getMaxCBSize() const;

  /// \returns The max number of bytes allowed by the hardware scratch
  /// buffer.  Size is in bytes.
  virtual size_t getMaxScratchSize() const;

  /// \brief Get the flag that corresponds to the device.
  virtual uint32_t getDeviceFlag() const;

  /// \returns The number of work-items that exist in a single hardware
  /// wavefront.
  virtual size_t getWavefrontSize() const = 0;

  /// \brief Get the generational name of this specific device.
  virtual uint32_t getGeneration() const = 0;

  /// \brief Get the stack alignment of this specific device.
  virtual uint32_t getStackAlignment() const;

  /// \brief Get the resource ID for this specific device.
  virtual uint32_t getResourceID(uint32_t DeviceID) const = 0;

  /// \brief Get the max number of UAV's for this device.
  virtual uint32_t getMaxNumUAVs() const = 0;


  // API utilizing more detailed capabilities of each family of
  // cards. If a capability is supported, then either usesHardware or
  // usesSoftware returned true.  If usesHardware returned true, then
  // usesSoftware must return false for the same capability.  Hardware
  // execution means that the feature is done natively by the hardware
  // and is not emulated by the softare.  Software execution means
  // that the feature could be done in the hardware, but there is
  // software that emulates it with possibly using the hardware for
  // support since the hardware does not fully comply with OpenCL
  // specs.

  bool isSupported(AMDGPUDeviceInfo::Caps Mode) const;
  bool usesHardware(AMDGPUDeviceInfo::Caps Mode) const;
  bool usesSoftware(AMDGPUDeviceInfo::Caps Mode) const;
  virtual std::string getDataLayout() const;
  static const unsigned int MAX_LDS_SIZE_700 = 16384;
  static const unsigned int MAX_LDS_SIZE_800 = 32768;
  static const unsigned int WavefrontSize = 64;
  static const unsigned int HalfWavefrontSize = 32;
  static const unsigned int QuarterWavefrontSize = 16;
protected:
  virtual void setCaps();
  BitVector mHWBits;
  llvm::BitVector mSWBits;
  AMDGPUSubtarget *mSTM;
  uint32_t DeviceFlag;
private:
  AMDGPUDeviceInfo::ExecutionMode
  getExecutionMode(AMDGPUDeviceInfo::Caps Caps) const;
};

} // namespace llvm
#endif // AMDILDEVICEIMPL_H
