blob: 9dbdcd89a33b62b39e3e583263a50ae9910ed554 [file] [log] [blame]
//===---------------------- Stage.h -----------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
/// \file
///
/// This file defines a stage.
/// A chain of stages compose an instruction pipeline.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_TOOLS_LLVM_MCA_STAGE_H
#define LLVM_TOOLS_LLVM_MCA_STAGE_H
#include "HWEventListener.h"
#include <set>
namespace mca {
class InstRef;
class Stage {
Stage(const Stage &Other) = delete;
Stage &operator=(const Stage &Other) = delete;
std::set<HWEventListener *> Listeners;
protected:
const std::set<HWEventListener *> &getListeners() const { return Listeners; }
public:
Stage();
virtual ~Stage() = default;
/// Called prior to preExecute to ensure that the stage has items that it
/// is to process. For example, a FetchStage might have more instructions
/// that need to be processed, or a RCU might have items that have yet to
/// retire.
virtual bool hasWorkToComplete() const = 0;
/// Called once at the start of each cycle. This can be used as a setup
/// phase to prepare for the executions during the cycle.
virtual void cycleStart() {}
/// Called once at the end of each cycle.
virtual void cycleEnd() {}
/// Called prior to executing the list of stages.
/// This can be called multiple times per cycle.
virtual void preExecute() {}
/// Called as a cleanup and finalization phase after each execution.
/// This will only be called if all stages return a success from their
/// execute callback. This can be called multiple times per cycle.
virtual void postExecute() {}
/// The primary action that this stage performs.
/// Returning false prevents successor stages from having their 'execute'
/// routine called. This can be called multiple times during a single cycle.
virtual bool execute(InstRef &IR) = 0;
/// Add a listener to receive callbacks during the execution of this stage.
void addListener(HWEventListener *Listener);
/// Notify listeners of a particular hardware event.
template <typename EventT> void notifyEvent(const EventT &Event) {
for (HWEventListener *Listener : Listeners)
Listener->onEvent(Event);
}
};
} // namespace mca
#endif // LLVM_TOOLS_LLVM_MCA_STAGE_H