misc: Replaced master/slave terminology
[gem5.git] / src / cpu / testers / traffic_gen / traffic_gen.hh
1 /*
2 * Copyright (c) 2012-2013, 2016-2018 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #ifndef __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
39 #define __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
40
41 #include <unordered_map>
42
43 #include "cpu/testers/traffic_gen/base.hh"
44
45 struct TrafficGenParams;
46
47 /**
48 * The traffic generator is a module that generates stimuli for
49 * the memory system, based on a collection of simple behaviours that
50 * are either probabilistic or based on traces. It can be used stand
51 * alone for creating test cases for interconnect and memory
52 * controllers, or function as a black-box replacement for system
53 * components that are not yet modelled in detail, e.g. a video engine
54 * or baseband subsystem in an SoC.
55 *
56 * The traffic generator has a single request port that is used to send
57 * requests, independent of the specific behaviour. The behaviour of
58 * the traffic generator is specified in a configuration file, and this
59 * file describes a state transition graph where each state is a
60 * specific generator behaviour. Examples include idling, generating
61 * linear address sequences, random sequences and replay of captured
62 * traces. By describing these behaviours as states, it is straight
63 * forward to create very complex behaviours, simply by arranging them
64 * in graphs. The graph transitions can also be annotated with
65 * probabilities, effectively making it a Markov Chain.
66 */
67 class TrafficGen : public BaseTrafficGen
68 {
69 private: // Params
70 /**
71 * The config file to parse.
72 */
73 const std::string configFile;
74
75 private:
76 /**
77 * Resolve a file path in the configuration file.
78 *
79 * This method resolves a relative path to a file that has been
80 * referenced in the configuration file. It first tries to resolve
81 * the file relative to the configuration file's path. If that
82 * fails, it falls back to constructing a path relative to the
83 * current working directory.
84 *
85 * Absolute paths are returned unmodified.
86 *
87 * @param name Path to resolve
88 */
89 std::string resolveFile(const std::string &name);
90
91 /**
92 * Parse the config file and build the state map and
93 * transition matrix.
94 */
95 void parseConfig();
96
97 /**
98 * Use the transition matrix to find the next state index.
99 */
100 size_t nextState();
101
102 /** Struct to represent a probabilistic transition during parsing. */
103 struct Transition {
104 uint32_t from;
105 uint32_t to;
106 double p;
107 };
108
109 /** State transition matrix */
110 std::vector<std::vector<double> > transitionMatrix;
111
112 /** Index of the current state */
113 uint32_t currState;
114
115 /** Map of generator states */
116 std::unordered_map<uint32_t, std::shared_ptr<BaseGen>> states;
117
118 protected: // BaseTrafficGen
119 std::shared_ptr<BaseGen> nextGenerator() override;
120
121 public:
122
123 TrafficGen(const TrafficGenParams* p);
124
125 ~TrafficGen() {}
126
127 void init() override;
128 void initState() override;
129
130 void serialize(CheckpointOut &cp) const override;
131 void unserialize(CheckpointIn &cp) override;
132
133 };
134
135 #endif //__CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__