//===---------------------- 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
|