19241Sandreas.hansson@arm.com/*
212810Sandreas.sandberg@arm.com * Copyright (c) 2012-2013, 2016-2018 ARM Limited
39241Sandreas.hansson@arm.com * All rights reserved
49241Sandreas.hansson@arm.com *
59241Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
69241Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
79241Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
89241Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
99241Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
109241Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
119241Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
129241Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
139241Sandreas.hansson@arm.com *
149241Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
159241Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
169241Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
179241Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
189241Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
199241Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
209241Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
219241Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
229241Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
239241Sandreas.hansson@arm.com * this software without specific prior written permission.
249241Sandreas.hansson@arm.com *
259241Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
269241Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
279241Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
289241Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
299241Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
309241Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
319241Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
329241Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
339241Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
349241Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
359241Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
369241Sandreas.hansson@arm.com *
379241Sandreas.hansson@arm.com * Authors: Thomas Grass
389241Sandreas.hansson@arm.com *          Andreas Hansson
399241Sandreas.hansson@arm.com *          Sascha Bischoff
409241Sandreas.hansson@arm.com */
4112396SRiken.Gohil@arm.com
429666Sandreas.hansson@arm.com#ifndef __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
439666Sandreas.hansson@arm.com#define __CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
449241Sandreas.hansson@arm.com
4511168Sandreas.hansson@arm.com#include <unordered_map>
4611168Sandreas.hansson@arm.com
4712810Sandreas.sandberg@arm.com#include "cpu/testers/traffic_gen/base.hh"
4812810Sandreas.sandberg@arm.com
4912810Sandreas.sandberg@arm.comstruct TrafficGenParams;
509241Sandreas.hansson@arm.com
519241Sandreas.hansson@arm.com/**
529241Sandreas.hansson@arm.com * The traffic generator is a master module that generates stimuli for
5312810Sandreas.sandberg@arm.com * the memory system, based on a collection of simple behaviours that
5412810Sandreas.sandberg@arm.com * are either probabilistic or based on traces. It can be used stand
5512810Sandreas.sandberg@arm.com * alone for creating test cases for interconnect and memory
5612810Sandreas.sandberg@arm.com * controllers, or function as a black-box replacement for system
5712810Sandreas.sandberg@arm.com * components that are not yet modelled in detail, e.g. a video engine
5812810Sandreas.sandberg@arm.com * or baseband subsystem in an SoC.
5912810Sandreas.sandberg@arm.com *
6012810Sandreas.sandberg@arm.com * The traffic generator has a single master port that is used to send
6112810Sandreas.sandberg@arm.com * requests, independent of the specific behaviour. The behaviour of
6212810Sandreas.sandberg@arm.com * the traffic generator is specified in a configuration file, and this
6312810Sandreas.sandberg@arm.com * file describes a state transition graph where each state is a
6412810Sandreas.sandberg@arm.com * specific generator behaviour. Examples include idling, generating
6512810Sandreas.sandberg@arm.com * linear address sequences, random sequences and replay of captured
6612810Sandreas.sandberg@arm.com * traces. By describing these behaviours as states, it is straight
6712810Sandreas.sandberg@arm.com * forward to create very complex behaviours, simply by arranging them
6812810Sandreas.sandberg@arm.com * in graphs. The graph transitions can also be annotated with
6912810Sandreas.sandberg@arm.com * probabilities, effectively making it a Markov Chain.
709241Sandreas.hansson@arm.com */
7112810Sandreas.sandberg@arm.comclass TrafficGen : public BaseTrafficGen
729241Sandreas.hansson@arm.com{
7312810Sandreas.sandberg@arm.com  private: // Params
7412810Sandreas.sandberg@arm.com    /**
7512810Sandreas.sandberg@arm.com     * The config file to parse.
7612810Sandreas.sandberg@arm.com     */
7712810Sandreas.sandberg@arm.com    const std::string configFile;
789241Sandreas.hansson@arm.com
799241Sandreas.hansson@arm.com  private:
809717Sandreas.hansson@arm.com    /**
8111540Sandreas.sandberg@arm.com     * Resolve a file path in the configuration file.
8211540Sandreas.sandberg@arm.com     *
8311540Sandreas.sandberg@arm.com     * This method resolves a relative path to a file that has been
8411540Sandreas.sandberg@arm.com     * referenced in the configuration file. It first tries to resolve
8511540Sandreas.sandberg@arm.com     * the file relative to the configuration file's path. If that
8611540Sandreas.sandberg@arm.com     * fails, it falls back to constructing a path relative to the
8711540Sandreas.sandberg@arm.com     * current working directory.
8811540Sandreas.sandberg@arm.com     *
8911540Sandreas.sandberg@arm.com     * Absolute paths are returned unmodified.
9011540Sandreas.sandberg@arm.com     *
9111540Sandreas.sandberg@arm.com     * @param name Path to resolve
9211540Sandreas.sandberg@arm.com     */
9311540Sandreas.sandberg@arm.com    std::string resolveFile(const std::string &name);
9411540Sandreas.sandberg@arm.com
9512810Sandreas.sandberg@arm.com     /**
9612810Sandreas.sandberg@arm.com      * Parse the config file and build the state map and
9712810Sandreas.sandberg@arm.com      * transition matrix.
9812810Sandreas.sandberg@arm.com      */
999718Sandreas.hansson@arm.com    void parseConfig();
1009717Sandreas.hansson@arm.com
1019717Sandreas.hansson@arm.com    /**
10212810Sandreas.sandberg@arm.com     * Use the transition matrix to find the next state index.
1039717Sandreas.hansson@arm.com     */
10412810Sandreas.sandberg@arm.com    size_t nextState();
10511491Sandreas.hansson@arm.com
1069717Sandreas.hansson@arm.com    /** Struct to represent a probabilistic transition during parsing. */
1079717Sandreas.hansson@arm.com    struct Transition {
1089717Sandreas.hansson@arm.com        uint32_t from;
1099717Sandreas.hansson@arm.com        uint32_t to;
1109717Sandreas.hansson@arm.com        double p;
1119717Sandreas.hansson@arm.com    };
1129717Sandreas.hansson@arm.com
1139717Sandreas.hansson@arm.com    /** State transition matrix */
1149717Sandreas.hansson@arm.com    std::vector<std::vector<double> > transitionMatrix;
1159241Sandreas.hansson@arm.com
1169717Sandreas.hansson@arm.com    /** Index of the current state */
1179717Sandreas.hansson@arm.com    uint32_t currState;
1189241Sandreas.hansson@arm.com
1199717Sandreas.hansson@arm.com    /** Map of generator states */
12012810Sandreas.sandberg@arm.com    std::unordered_map<uint32_t, std::shared_ptr<BaseGen>> states;
1219241Sandreas.hansson@arm.com
12212810Sandreas.sandberg@arm.com  protected: // BaseTrafficGen
12312810Sandreas.sandberg@arm.com    std::shared_ptr<BaseGen> nextGenerator() override;
1249241Sandreas.hansson@arm.com
1259241Sandreas.hansson@arm.com  public:
1269241Sandreas.hansson@arm.com
1279241Sandreas.hansson@arm.com    TrafficGen(const TrafficGenParams* p);
1289241Sandreas.hansson@arm.com
1299241Sandreas.hansson@arm.com    ~TrafficGen() {}
1309241Sandreas.hansson@arm.com
13111169Sandreas.hansson@arm.com    void init() override;
13211169Sandreas.hansson@arm.com    void initState() override;
1339241Sandreas.hansson@arm.com
13411168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
13511168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
1369241Sandreas.hansson@arm.com
1379241Sandreas.hansson@arm.com};
1389241Sandreas.hansson@arm.com
1399666Sandreas.hansson@arm.com#endif //__CPU_TRAFFIC_GEN_TRAFFIC_GEN_HH__
140