1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
//===---------------------- 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
|