ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
Timing.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2//
3// This file is part of ETISS. It is licensed under the BSD 3-Clause License; you may not use this file except in
4// compliance with the License. You should have received a copy of the license along with this project. If not, see the
5// LICENSE file.
15#ifndef ETISS_TIMING_H
16#define ETISS_TIMING_H
17
18#include "etiss/Instruction.h"
19#include "etiss/Misc.h"
20#include "etiss/Plugin.h"
21
22#include <functional>
23#include <regex>
24
25namespace etiss
26{
27
29{
30 private:
31 struct Rule
32 {
33 std::function<bool(uint32_t /*mode*/)> mode;
34 std::function<bool(unsigned /*width*/)> width;
35 std::function<bool(etiss::instr::Instruction & /*instr*/)> instr;
36 std::function<void(etiss::instr::Instruction &)> handler;
37 };
38
39 public:
45 void addRule(std::function<bool(uint32_t /*mode*/)> matchesMode,
46 std::function<bool(unsigned /*width*/)> matchesWidth,
47 std::function<bool(etiss::instr::Instruction & /*instr*/)> matchesInstr,
48 std::function<void(etiss::instr::Instruction & /*match*/)> handleMatch);
52 void addRule(const std::tuple<uint32_t, unsigned, const char *,
53 std::function<void(etiss::instr::Instruction & /*match*/)>> &tuple);
57 void addRule(const std::tuple<std::regex, std::regex, std::regex,
58 std::function<void(etiss::instr::Instruction & /*match*/)>> &tuple);
59 inline void addRule(
60 const std::tuple<std::regex, std::regex, std::regex, void (*)(etiss::instr::Instruction & /*match*/)> &tuple)
61 {
62 addRule(make_tuple(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple),
63 std::function<void(etiss::instr::Instruction &)>(std::get<3>(tuple))));
64 }
65
66 template <unsigned cycles, bool isNotAdditionalTime = true>
73 {
74 static_assert((cycles > 0) || (!isNotAdditionalTime),
75 "etiss::DataSheetAccurateTiming::handleMatch_cycles may not be used with cycle = 0 and "
76 "isNoteAdditionalTime = false");
77 std::string code;
78 if (cycles == 1)
79 {
80 code = "cpu->cpuTime_ps += cpu->cpuCycleTime_ps; //DataSheetAccurateTiming\n";
81 }
82 else
83 {
84 code = std::string("cpu->cpuTime_ps += ") + etiss::toString(cycles) +
85 " * cpu->cpuCycleTime_ps; //DataSheetAccurateTiming\n";
86 }
87 instr.addCallback(
89 {
91 cp.getAffectedRegisters().add("cpuTime_ps", 64);
92 cp.code() = code;
93
94 return true;
95 },
96 isNotAdditionalTime ? ((uint32_t)etiss::instr::Instruction::BUILTINGROUP::CPUTIMEUPDATE) : 0);
97 }
98
99 private:
101 inline void ctor_hlpr() {}
102 template <typename A, typename... T>
104 void ctor_hlpr(const A &arg, const T &...rules)
105 {
106 addRule(arg); // store current element
107 ctor_hlpr(rules...);
108 }
109
110 public:
111 const std::string name_;
112 template <typename... T>
113 DataSheetAccurateTiming(const std::string &name, const T &...rules) : name_(name)
114 {
115 ctor_hlpr(rules...);
116 }
117 virtual ~DataSheetAccurateTiming();
118
124
125 protected:
126 inline std::string _getPluginName() const { return name_; }
127
128 private:
129 std::list<Rule *> rules_;
130};
131
132} // namespace etiss
133
134#endif // ETISS_TIMING_H
contains container classes to store instruction definitions + translation functions and build a trans...
general configuration and logging
plugins for extensions to code translation and instruction execution
static __inline__ uint32_t
Definition arm_cde.h:25
Contains a small code snipped.
Definition CodePart.h:348
std::string & code()
Definition CodePart.h:378
RegisterSet & getAffectedRegisters()
Definition CodePart.h:376
A set of CodeParts.
Definition CodePart.h:399
CodePart & prepend(CodePart::TYPE type)
Definition CodePart.h:465
const std::string name_
Definition Timing.h:111
void addRule(const std::tuple< std::regex, std::regex, std::regex, void(*)(etiss::instr::Instruction &)> &tuple)
Definition Timing.h:59
std::string _getPluginName() const
Definition Timing.h:126
static void handleMatch_cycles(etiss::instr::Instruction &instr)
simple template function that adds the given number of cycles to the cpu time if the related rule mat...
Definition Timing.h:72
virtual void initInstrSet(etiss::instr::ModedInstructionSet &) const
performs lookups for instructions that are in the modded instruction set to add timing code (e....
Definition Timing.cpp:87
DataSheetAccurateTiming(const std::string &name, const T &...rules)
Definition Timing.h:113
std::list< Rule * > rules_
Definition Timing.h:129
void ctor_hlpr(const A &arg, const T &...rules)
handles the argument list passed to the template constructor
Definition Timing.h:104
void ctor_hlpr()
terminates recursion
Definition Timing.h:101
void addRule(std::function< bool(uint32_t)> matchesMode, std::function< bool(unsigned)> matchesWidth, std::function< bool(etiss::instr::Instruction &)> matchesInstr, std::function< void(etiss::instr::Instruction &)> handleMatch)
this is the main add rule function.
Definition Timing.cpp:13
allows to add code to the translation of instructions
Definition Plugin.h:222
stores a bit vector
this class contains parameters that persist in between instruction lookpus/translation within a trans...
holds information and translation callbacks for an instruction.
bool addCallback(std::function< bool(BitArray &, etiss::CodeSet &, InstructionContext &)> callback, uint32_t builtinGroups, const std::set< uint32_t > &groups=std::set< uint32_t >())
holds etiss::instr::VariableInstructionSet instances for different modes.
forwards: include/jit/*
Definition Benchmark.h:17
std::string toString(const T &val)
conversion of type T to std::string.
Definition Misc.h:133
#define bool
Definition stdbool.h:15
std::function< void(etiss::instr::Instruction &)> handler
Definition Timing.h:36
std::function< bool(etiss::instr::Instruction &)> instr
Definition Timing.h:35
std::function< bool(unsigned)> width
Definition Timing.h:34
std::function< bool(uint32_t)> mode
Definition Timing.h:33