//===---------------------------- Context.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 class for holding ownership of various simulated /// hardware units. A Context also provides a utility routine for constructing /// a default out-of-order pipeline with fetch, dispatch, execute, and retire /// stages). /// //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_MCA_CONTEXT_H #define LLVM_TOOLS_LLVM_MCA_CONTEXT_H #include "HardwareUnit.h" #include "InstrBuilder.h" #include "Pipeline.h" #include "SourceMgr.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSchedule.h" #include "llvm/MC/MCSubtargetInfo.h" #include namespace mca { /// This is a convenience struct to hold the parameters necessary for creating /// the pre-built "default" out-of-order pipeline. struct PipelineOptions { PipelineOptions(unsigned DW, unsigned RFS, unsigned LQS, unsigned SQS, bool NoAlias) : DispatchWidth(DW), RegisterFileSize(RFS), LoadQueueSize(LQS), StoreQueueSize(SQS), AssumeNoAlias(NoAlias) {} unsigned DispatchWidth; unsigned RegisterFileSize; unsigned LoadQueueSize; unsigned StoreQueueSize; bool AssumeNoAlias; }; class Context { llvm::SmallVector, 4> Hardware; const llvm::MCRegisterInfo &MRI; const llvm::MCSubtargetInfo &STI; public: Context(const llvm::MCRegisterInfo &R, const llvm::MCSubtargetInfo &S) : MRI(R), STI(S) {} Context(const Context &C) = delete; Context &operator=(const Context &C) = delete; void addHardwareUnit(std::unique_ptr H) { Hardware.push_back(std::move(H)); } /// Construct a basic pipeline for simulating an out-of-order pipeline. /// This pipeline consists of Fetch, Dispatch, Execute, and Retire stages. std::unique_ptr createDefaultPipeline(const PipelineOptions &Opts, InstrBuilder &IB, SourceMgr &SrcMgr); }; } // namespace mca #endif // LLVM_TOOLS_LLVM_MCA_CONTEXT_H