File 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