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