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 * Authors: Thomas Grass
38 *          Andreas Hansson
39 *          Sascha Bischoff
40 */
41
42#ifndef __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
43#define __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
44
45#include <unordered_map>
46
47#include "cpu/testers/traffic_gen/base.hh"
48
49struct TrafficGenParams;
50
51/**
52 * The traffic generator is a master module that generates stimuli for
53 * the memory system, based on a collection of simple behaviours that
54 * are either probabilistic or based on traces. It can be used stand
55 * alone for creating test cases for interconnect and memory
56 * controllers, or function as a black-box replacement for system
57 * components that are not yet modelled in detail, e.g. a video engine
58 * or baseband subsystem in an SoC.
59 *
60 * The traffic generator has a single master port that is used to send
61 * requests, independent of the specific behaviour. The behaviour of
62 * the traffic generator is specified in a configuration file, and this
63 * file describes a state transition graph where each state is a
64 * specific generator behaviour. Examples include idling, generating
65 * linear address sequences, random sequences and replay of captured
66 * traces. By describing these behaviours as states, it is straight
67 * forward to create very complex behaviours, simply by arranging them
68 * in graphs. The graph transitions can also be annotated with
69 * probabilities, effectively making it a Markov Chain.
70 */
71class TrafficGen : public BaseTrafficGen
72{
73  private: // Params
74    /**
75     * The config file to parse.
76     */
77    const std::string configFile;
78
79  private:
80    /**
81     * Resolve a file path in the configuration file.
82     *
83     * This method resolves a relative path to a file that has been
84     * referenced in the configuration file. It first tries to resolve
85     * the file relative to the configuration file's path. If that
86     * fails, it falls back to constructing a path relative to the
87     * current working directory.
88     *
89     * Absolute paths are returned unmodified.
90     *
91     * @param name Path to resolve
92     */
93    std::string resolveFile(const std::string &name);
94
95     /**
96      * Parse the config file and build the state map and
97      * transition matrix.
98      */
99    void parseConfig();
100
101    /**
102     * Use the transition matrix to find the next state index.
103     */
104    size_t nextState();
105
106    /** Struct to represent a probabilistic transition during parsing. */
107    struct Transition {
108        uint32_t from;
109        uint32_t to;
110        double p;
111    };
112
113    /** State transition matrix */
114    std::vector<std::vector<double> > transitionMatrix;
115
116    /** Index of the current state */
117    uint32_t currState;
118
119    /** Map of generator states */
120    std::unordered_map<uint32_t, std::shared_ptr<BaseGen>> states;
121
122  protected: // BaseTrafficGen
123    std::shared_ptr<BaseGen> nextGenerator() override;
124
125  public:
126
127    TrafficGen(const TrafficGenParams* p);
128
129    ~TrafficGen() {}
130
131    void init() override;
132    void initState() override;
133
134    void serialize(CheckpointOut &cp) const override;
135    void unserialize(CheckpointIn &cp) override;
136
137};
138
139#endif //__CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
140