trace_gen.hh revision 12811
13520Sgblack@eecs.umich.edu/* 23520Sgblack@eecs.umich.edu * Copyright (c) 2012-2013, 2017-2018 ARM Limited 33520Sgblack@eecs.umich.edu * All rights reserved 43520Sgblack@eecs.umich.edu * 53520Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 63520Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 73520Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 83520Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 93520Sgblack@eecs.umich.edu * licensed here under. You may use the software subject to the license 103520Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 113520Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 123520Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 133520Sgblack@eecs.umich.edu * 143520Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 153520Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 163520Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 173520Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 183520Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 193520Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 203520Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 213520Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 223520Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 233520Sgblack@eecs.umich.edu * this software without specific prior written permission. 243520Sgblack@eecs.umich.edu * 253520Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 263520Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 273520Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 283520Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 293520Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 303520Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 313520Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 323520Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 333520Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 343520Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 353520Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 363520Sgblack@eecs.umich.edu * 373520Sgblack@eecs.umich.edu * Authors: Thomas Grass 383520Sgblack@eecs.umich.edu * Andreas Hansson 393520Sgblack@eecs.umich.edu * Sascha Bischoff 403520Sgblack@eecs.umich.edu * Neha Agarwal 413520Sgblack@eecs.umich.edu */ 423520Sgblack@eecs.umich.edu 433520Sgblack@eecs.umich.edu/** 443520Sgblack@eecs.umich.edu * @file 453520Sgblack@eecs.umich.edu * Declaration of the trace generator that reads a trace file 463520Sgblack@eecs.umich.edu * and plays the transactions. 473520Sgblack@eecs.umich.edu */ 483520Sgblack@eecs.umich.edu 493520Sgblack@eecs.umich.edu#ifndef __CPU_TRAFFIC_GEN_TRACE_GEN_HH__ 503520Sgblack@eecs.umich.edu#define __CPU_TRAFFIC_GEN_TRACE_GEN_HH__ 513520Sgblack@eecs.umich.edu 523633Sktlim@umich.edu#include "base/bitfield.hh" 533520Sgblack@eecs.umich.edu#include "base/intmath.hh" 543520Sgblack@eecs.umich.edu#include "base_gen.hh" 553520Sgblack@eecs.umich.edu#include "mem/packet.hh" 563520Sgblack@eecs.umich.edu#include "proto/protoio.hh" 573520Sgblack@eecs.umich.edu 583520Sgblack@eecs.umich.edu/** 593520Sgblack@eecs.umich.edu * The trace replay generator reads a trace file and plays 603520Sgblack@eecs.umich.edu * back the transactions. The trace is offset with respect to 613520Sgblack@eecs.umich.edu * the time when the state was entered. 623520Sgblack@eecs.umich.edu */ 633520Sgblack@eecs.umich.educlass TraceGen : public BaseGen 643520Sgblack@eecs.umich.edu{ 653520Sgblack@eecs.umich.edu 663520Sgblack@eecs.umich.edu private: 673520Sgblack@eecs.umich.edu 683520Sgblack@eecs.umich.edu /** 693520Sgblack@eecs.umich.edu * This struct stores a line in the trace file. 703520Sgblack@eecs.umich.edu */ 713520Sgblack@eecs.umich.edu struct TraceElement { 723520Sgblack@eecs.umich.edu 733520Sgblack@eecs.umich.edu /** Specifies if the request is to be a read or a write */ 743520Sgblack@eecs.umich.edu MemCmd cmd; 753520Sgblack@eecs.umich.edu 763520Sgblack@eecs.umich.edu /** The address for the request */ 773520Sgblack@eecs.umich.edu Addr addr; 783520Sgblack@eecs.umich.edu 793520Sgblack@eecs.umich.edu /** The size of the access for the request */ 803520Sgblack@eecs.umich.edu Addr blocksize; 813520Sgblack@eecs.umich.edu 823520Sgblack@eecs.umich.edu /** The time at which the request should be sent */ 833520Sgblack@eecs.umich.edu Tick tick; 843520Sgblack@eecs.umich.edu 853520Sgblack@eecs.umich.edu /** Potential request flags to use */ 863520Sgblack@eecs.umich.edu Request::FlagsType flags; 873520Sgblack@eecs.umich.edu 883520Sgblack@eecs.umich.edu /** 893520Sgblack@eecs.umich.edu * Check validity of this element. 903520Sgblack@eecs.umich.edu * 913520Sgblack@eecs.umich.edu * @return if this element is valid 923520Sgblack@eecs.umich.edu */ 933520Sgblack@eecs.umich.edu bool isValid() const { 943520Sgblack@eecs.umich.edu return cmd != MemCmd::InvalidCmd; 953520Sgblack@eecs.umich.edu } 963520Sgblack@eecs.umich.edu 973520Sgblack@eecs.umich.edu /** 983520Sgblack@eecs.umich.edu * Make this element invalid. 993520Sgblack@eecs.umich.edu */ 1003520Sgblack@eecs.umich.edu void clear() { 1013520Sgblack@eecs.umich.edu cmd = MemCmd::InvalidCmd; 1023520Sgblack@eecs.umich.edu } 1033520Sgblack@eecs.umich.edu }; 1043521Sgblack@eecs.umich.edu 1053521Sgblack@eecs.umich.edu /** 1063521Sgblack@eecs.umich.edu * The InputStream encapsulates a trace file and the 1073521Sgblack@eecs.umich.edu * internal buffers and populates TraceElements based on 1083521Sgblack@eecs.umich.edu * the input. 1093520Sgblack@eecs.umich.edu */ 1103520Sgblack@eecs.umich.edu class InputStream 1113520Sgblack@eecs.umich.edu { 1123520Sgblack@eecs.umich.edu 1133520Sgblack@eecs.umich.edu private: 1143520Sgblack@eecs.umich.edu 1153520Sgblack@eecs.umich.edu /// Input file stream for the protobuf trace 1163520Sgblack@eecs.umich.edu ProtoInputStream trace; 1173520Sgblack@eecs.umich.edu 1183520Sgblack@eecs.umich.edu public: 1193520Sgblack@eecs.umich.edu 1203520Sgblack@eecs.umich.edu /** 1213520Sgblack@eecs.umich.edu * Create a trace input stream for a given file name. 1223520Sgblack@eecs.umich.edu * 1233520Sgblack@eecs.umich.edu * @param filename Path to the file to read from 1243520Sgblack@eecs.umich.edu */ 1253520Sgblack@eecs.umich.edu InputStream(const std::string& filename); 1263520Sgblack@eecs.umich.edu 1273520Sgblack@eecs.umich.edu /** 1283520Sgblack@eecs.umich.edu * Reset the stream such that it can be played once 1293520Sgblack@eecs.umich.edu * again. 1303520Sgblack@eecs.umich.edu */ 1313520Sgblack@eecs.umich.edu void reset(); 1323520Sgblack@eecs.umich.edu 1333520Sgblack@eecs.umich.edu /** 1343520Sgblack@eecs.umich.edu * Check the trace header to make sure that it is of the right 1353520Sgblack@eecs.umich.edu * format. 1363520Sgblack@eecs.umich.edu */ 1373520Sgblack@eecs.umich.edu void init(); 1383520Sgblack@eecs.umich.edu 1393520Sgblack@eecs.umich.edu /** 1403520Sgblack@eecs.umich.edu * Attempt to read a trace element from the stream, 1413633Sktlim@umich.edu * and also notify the caller if the end of the file 1423677Sktlim@umich.edu * was reached. 1433633Sktlim@umich.edu * 1443520Sgblack@eecs.umich.edu * @param element Trace element to populate 1453520Sgblack@eecs.umich.edu * @return True if an element could be read successfully 1463520Sgblack@eecs.umich.edu */ 1473520Sgblack@eecs.umich.edu bool read(TraceElement& element); 1483520Sgblack@eecs.umich.edu }; 1493520Sgblack@eecs.umich.edu 1503520Sgblack@eecs.umich.edu public: 1513520Sgblack@eecs.umich.edu 1523520Sgblack@eecs.umich.edu /** 1533633Sktlim@umich.edu * Create a trace generator. 1543633Sktlim@umich.edu * 1553633Sktlim@umich.edu * @param gen Traffic generator owning this sequence generator 1563633Sktlim@umich.edu * @param _duration duration of this state before transitioning 1573633Sktlim@umich.edu * @param trace_file File to read the transactions from 1583633Sktlim@umich.edu * @param addr_offset Positive offset to add to trace address 1593633Sktlim@umich.edu */ 1603633Sktlim@umich.edu TraceGen(BaseTrafficGen &gen, Tick _duration, 1613520Sgblack@eecs.umich.edu const std::string& trace_file, Addr addr_offset) 1623633Sktlim@umich.edu : BaseGen(gen, _duration), 1633633Sktlim@umich.edu trace(trace_file), 1643633Sktlim@umich.edu tickOffset(0), 1653520Sgblack@eecs.umich.edu addrOffset(addr_offset), 1663520Sgblack@eecs.umich.edu traceComplete(false) 1673520Sgblack@eecs.umich.edu { 1683520Sgblack@eecs.umich.edu } 1693520Sgblack@eecs.umich.edu 170 void enter(); 171 172 PacketPtr getNextPacket(); 173 174 void exit(); 175 176 /** 177 * Returns the tick when the next request should be generated. If 178 * the end of the file has been reached, it returns MaxTick to 179 * indicate that there will be no more requests. 180 */ 181 Tick nextPacketTick(bool elastic, Tick delay) const; 182 183 private: 184 185 /** Input stream used for reading the input trace file */ 186 InputStream trace; 187 188 /** Store the current and next element in the trace */ 189 TraceElement currElement; 190 TraceElement nextElement; 191 192 /** 193 * Stores the time when the state was entered. This is to add an 194 * offset to the times stored in the trace file. This is mutable 195 * to allow us to change it as part of nextPacketTick. 196 */ 197 mutable Tick tickOffset; 198 199 /** 200 * Offset for memory requests. Used to shift the trace 201 * away from the CPU address space. 202 */ 203 Addr addrOffset; 204 205 /** 206 * Set to true when the trace replay for one instance of 207 * state is complete. 208 */ 209 bool traceComplete; 210}; 211 212#endif 213