Skip to content

File atomic.h

File List > atomic > atomic.h

Go to the documentation of this file

#pragma once

#include <simtix/sm.h>
#include <simtix/statistics.h>

#include <string>

#include "sm/arbitrator/atomic.h"
#include "sm/base.h"
#include "sm/fu/lsu/atomic.h"

namespace simtix {

class AtomicSMImpl : public BaseSMImpl {
 public:
  enum class LastStatus : uint8_t {
    kAllStageRun,
    kWaitImemAccept,
    kWaitImemResp,
    kWaitToIssue,
    kWaitToExecute,
    kWaitToCommit,
    kWaitToRetire
  };

  AtomicSMImpl(const std::string &name, uint32_t cid,
               const ArchParam &p = kDefaultArchParam);
  ~AtomicSMImpl() = default;

  void NotifyCtrlFlowChange(uint32_t wid, bool is_diverged, uint64_t wpc,
                            uint64_t sswpc) override {}

  BaseSMImpl::WorkGroupStat *wg_stat() override { return wg_stat_.get(); }
  std::shared_ptr<BaseSMImpl::Stat> stat() override { return stat_; }
  BaseLoadStoreUnit *lsu() override { return &atomic_lsu_; }
  BaseArbitrator *arbitrator() override { return &atomic_arbitrator_; }

  struct WorkGroupStat : BaseSMImpl::WorkGroupStat {
    WorkGroupStat(const std::string &s, uint32_t num_warps)
        : BaseSMImpl::WorkGroupStat(s, num_warps) {}
    // Add Atomic SM only stats here.
  };

 protected:
  const uint32_t kWarpsPerCore;

  void Tick() override;
  void Reset() override;
  void ResetStat() override;

  AtomicLoadStoreUnit atomic_lsu_;
  AtomicArbitrator atomic_arbitrator_;

  struct Stat : BaseSMImpl::Stat {
    explicit Stat(const std::string &s) : BaseSMImpl::Stat(s) {}
    // Add Atomic SM only stats here.
  };

  std::shared_ptr<Stat> stat_;

  // Current workgroup stat
  std::shared_ptr<WorkGroupStat> wg_stat_;

 private:
  void ResetInstrStatus();

  LastStatus last_status_;
  InstrPtr instr_;

  std::array<uint8_t, 4> ifetch_bytes_;
  MemoryInterface::Payload ifetch_payload_;
  bool ifetch_access_fault_;
  bool ifetch_ready_;
  bool ifetch_accepted_;
};

class AtomicSM::Impl : public AtomicSMImpl {
 public:
  Impl(const std::string &name, uint32_t cid, const ArchParam &p)
      : AtomicSMImpl(name, cid, p) {}
  ~Impl() = default;

  friend class AtomicSM;
};

};  // namespace simtix