2 * Copyright (c) 2012-2013, 2016-2018 ARM Limited
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.
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.
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.
38 #ifndef __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
39 #define __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
41 #include <unordered_map>
43 #include "cpu/testers/traffic_gen/base.hh"
45 struct TrafficGenParams;
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.
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.
67 class TrafficGen : public BaseTrafficGen
71 * The config file to parse.
73 const std::string configFile;
77 * Resolve a file path in the configuration file.
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.
85 * Absolute paths are returned unmodified.
87 * @param name Path to resolve
89 std::string resolveFile(const std::string &name);
92 * Parse the config file and build the state map and
98 * Use the transition matrix to find the next state index.
102 /** Struct to represent a probabilistic transition during parsing. */
109 /** State transition matrix */
110 std::vector<std::vector<double> > transitionMatrix;
112 /** Index of the current state */
115 /** Map of generator states */
116 std::unordered_map<uint32_t, std::shared_ptr<BaseGen>> states;
118 protected: // BaseTrafficGen
119 std::shared_ptr<BaseGen> nextGenerator() override;
123 TrafficGen(const TrafficGenParams* p);
127 void init() override;
128 void initState() override;
130 void serialize(CheckpointOut &cp) const override;
131 void unserialize(CheckpointIn &cp) override;
135 #endif //__CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__