GarnetSyntheticTraffic.cc revision 11661
111661Stushar@ece.gatech.edu/* 211661Stushar@ece.gatech.edu * Copyright (c) 2016 Georgia Institute of Technology 311661Stushar@ece.gatech.edu * All rights reserved. 411661Stushar@ece.gatech.edu * 511661Stushar@ece.gatech.edu * Redistribution and use in source and binary forms, with or without 611661Stushar@ece.gatech.edu * modification, are permitted provided that the following conditions are 711661Stushar@ece.gatech.edu * met: redistributions of source code must retain the above copyright 811661Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer; 911661Stushar@ece.gatech.edu * redistributions in binary form must reproduce the above copyright 1011661Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer in the 1111661Stushar@ece.gatech.edu * documentation and/or other materials provided with the distribution; 1211661Stushar@ece.gatech.edu * neither the name of the copyright holders nor the names of its 1311661Stushar@ece.gatech.edu * contributors may be used to endorse or promote products derived from 1411661Stushar@ece.gatech.edu * this software without specific prior written permission. 1511661Stushar@ece.gatech.edu * 1611661Stushar@ece.gatech.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711661Stushar@ece.gatech.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811661Stushar@ece.gatech.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911661Stushar@ece.gatech.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011661Stushar@ece.gatech.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111661Stushar@ece.gatech.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211661Stushar@ece.gatech.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311661Stushar@ece.gatech.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411661Stushar@ece.gatech.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511661Stushar@ece.gatech.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611661Stushar@ece.gatech.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711661Stushar@ece.gatech.edu * 2811661Stushar@ece.gatech.edu * Authors: Tushar Krishna 2911661Stushar@ece.gatech.edu */ 3011661Stushar@ece.gatech.edu 3111661Stushar@ece.gatech.edu#include <cmath> 3211661Stushar@ece.gatech.edu#include <iomanip> 3311661Stushar@ece.gatech.edu#include <set> 3411661Stushar@ece.gatech.edu#include <string> 3511661Stushar@ece.gatech.edu#include <vector> 3611661Stushar@ece.gatech.edu 3711661Stushar@ece.gatech.edu#include "base/misc.hh" 3811661Stushar@ece.gatech.edu#include "base/random.hh" 3911661Stushar@ece.gatech.edu#include "base/statistics.hh" 4011661Stushar@ece.gatech.edu#include "cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.hh" 4111661Stushar@ece.gatech.edu#include "debug/GarnetSyntheticTraffic.hh" 4211661Stushar@ece.gatech.edu#include "mem/mem_object.hh" 4311661Stushar@ece.gatech.edu#include "mem/packet.hh" 4411661Stushar@ece.gatech.edu#include "mem/port.hh" 4511661Stushar@ece.gatech.edu#include "mem/request.hh" 4611661Stushar@ece.gatech.edu#include "sim/sim_events.hh" 4711661Stushar@ece.gatech.edu#include "sim/stats.hh" 4811661Stushar@ece.gatech.edu#include "sim/system.hh" 4911661Stushar@ece.gatech.edu 5011661Stushar@ece.gatech.eduusing namespace std; 5111661Stushar@ece.gatech.edu 5211661Stushar@ece.gatech.eduint TESTER_NETWORK=0; 5311661Stushar@ece.gatech.edu 5411661Stushar@ece.gatech.edubool 5511661Stushar@ece.gatech.eduGarnetSyntheticTraffic::CpuPort::recvTimingResp(PacketPtr pkt) 5611661Stushar@ece.gatech.edu{ 5711661Stushar@ece.gatech.edu tester->completeRequest(pkt); 5811661Stushar@ece.gatech.edu return true; 5911661Stushar@ece.gatech.edu} 6011661Stushar@ece.gatech.edu 6111661Stushar@ece.gatech.eduvoid 6211661Stushar@ece.gatech.eduGarnetSyntheticTraffic::CpuPort::recvReqRetry() 6311661Stushar@ece.gatech.edu{ 6411661Stushar@ece.gatech.edu tester->doRetry(); 6511661Stushar@ece.gatech.edu} 6611661Stushar@ece.gatech.edu 6711661Stushar@ece.gatech.eduvoid 6811661Stushar@ece.gatech.eduGarnetSyntheticTraffic::sendPkt(PacketPtr pkt) 6911661Stushar@ece.gatech.edu{ 7011661Stushar@ece.gatech.edu if (!cachePort.sendTimingReq(pkt)) { 7111661Stushar@ece.gatech.edu retryPkt = pkt; // RubyPort will retry sending 7211661Stushar@ece.gatech.edu } 7311661Stushar@ece.gatech.edu numPacketsSent++; 7411661Stushar@ece.gatech.edu} 7511661Stushar@ece.gatech.edu 7611661Stushar@ece.gatech.eduGarnetSyntheticTraffic::GarnetSyntheticTraffic(const Params *p) 7711661Stushar@ece.gatech.edu : MemObject(p), 7811661Stushar@ece.gatech.edu tickEvent(this), 7911661Stushar@ece.gatech.edu cachePort("GarnetSyntheticTraffic", this), 8011661Stushar@ece.gatech.edu retryPkt(NULL), 8111661Stushar@ece.gatech.edu size(p->memory_size), 8211661Stushar@ece.gatech.edu blockSizeBits(p->block_offset), 8311661Stushar@ece.gatech.edu numDestinations(p->num_dest), 8411661Stushar@ece.gatech.edu simCycles(p->sim_cycles), 8511661Stushar@ece.gatech.edu numPacketsMax(p->num_packets_max), 8611661Stushar@ece.gatech.edu numPacketsSent(0), 8711661Stushar@ece.gatech.edu singleSender(p->single_sender), 8811661Stushar@ece.gatech.edu singleDest(p->single_dest), 8911661Stushar@ece.gatech.edu trafficType(p->traffic_type), 9011661Stushar@ece.gatech.edu injRate(p->inj_rate), 9111661Stushar@ece.gatech.edu injVnet(p->inj_vnet), 9211661Stushar@ece.gatech.edu precision(p->precision), 9311661Stushar@ece.gatech.edu responseLimit(p->response_limit), 9411661Stushar@ece.gatech.edu masterId(p->system->getMasterId(name())) 9511661Stushar@ece.gatech.edu{ 9611661Stushar@ece.gatech.edu // set up counters 9711661Stushar@ece.gatech.edu noResponseCycles = 0; 9811661Stushar@ece.gatech.edu schedule(tickEvent, 0); 9911661Stushar@ece.gatech.edu 10011661Stushar@ece.gatech.edu initTrafficType(); 10111661Stushar@ece.gatech.edu if (trafficStringToEnum.count(trafficType) == 0) { 10211661Stushar@ece.gatech.edu fatal("Unknown Traffic Type: %s!\n", traffic); 10311661Stushar@ece.gatech.edu } 10411661Stushar@ece.gatech.edu traffic = trafficStringToEnum[trafficType]; 10511661Stushar@ece.gatech.edu 10611661Stushar@ece.gatech.edu id = TESTER_NETWORK++; 10711661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic,"Config Created: Name = %s , and id = %d\n", 10811661Stushar@ece.gatech.edu name(), id); 10911661Stushar@ece.gatech.edu} 11011661Stushar@ece.gatech.edu 11111661Stushar@ece.gatech.eduBaseMasterPort & 11211661Stushar@ece.gatech.eduGarnetSyntheticTraffic::getMasterPort(const std::string &if_name, PortID idx) 11311661Stushar@ece.gatech.edu{ 11411661Stushar@ece.gatech.edu if (if_name == "test") 11511661Stushar@ece.gatech.edu return cachePort; 11611661Stushar@ece.gatech.edu else 11711661Stushar@ece.gatech.edu return MemObject::getMasterPort(if_name, idx); 11811661Stushar@ece.gatech.edu} 11911661Stushar@ece.gatech.edu 12011661Stushar@ece.gatech.eduvoid 12111661Stushar@ece.gatech.eduGarnetSyntheticTraffic::init() 12211661Stushar@ece.gatech.edu{ 12311661Stushar@ece.gatech.edu numPacketsSent = 0; 12411661Stushar@ece.gatech.edu} 12511661Stushar@ece.gatech.edu 12611661Stushar@ece.gatech.edu 12711661Stushar@ece.gatech.eduvoid 12811661Stushar@ece.gatech.eduGarnetSyntheticTraffic::completeRequest(PacketPtr pkt) 12911661Stushar@ece.gatech.edu{ 13011661Stushar@ece.gatech.edu Request *req = pkt->req; 13111661Stushar@ece.gatech.edu 13211661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic, 13311661Stushar@ece.gatech.edu "Completed injection of %s packet for address %x\n", 13411661Stushar@ece.gatech.edu pkt->isWrite() ? "write" : "read\n", 13511661Stushar@ece.gatech.edu req->getPaddr()); 13611661Stushar@ece.gatech.edu 13711661Stushar@ece.gatech.edu assert(pkt->isResponse()); 13811661Stushar@ece.gatech.edu noResponseCycles = 0; 13911661Stushar@ece.gatech.edu delete req; 14011661Stushar@ece.gatech.edu delete pkt; 14111661Stushar@ece.gatech.edu} 14211661Stushar@ece.gatech.edu 14311661Stushar@ece.gatech.edu 14411661Stushar@ece.gatech.eduvoid 14511661Stushar@ece.gatech.eduGarnetSyntheticTraffic::tick() 14611661Stushar@ece.gatech.edu{ 14711661Stushar@ece.gatech.edu if (++noResponseCycles >= responseLimit) { 14811661Stushar@ece.gatech.edu fatal("%s deadlocked at cycle %d\n", name(), curTick()); 14911661Stushar@ece.gatech.edu } 15011661Stushar@ece.gatech.edu 15111661Stushar@ece.gatech.edu // make new request based on injection rate 15211661Stushar@ece.gatech.edu // (injection rate's range depends on precision) 15311661Stushar@ece.gatech.edu // - generate a random number between 0 and 10^precision 15411661Stushar@ece.gatech.edu // - send pkt if this number is < injRate*(10^precision) 15511661Stushar@ece.gatech.edu bool sendAllowedThisCycle; 15611661Stushar@ece.gatech.edu double injRange = pow((double) 10, (double) precision); 15711661Stushar@ece.gatech.edu unsigned trySending = random_mt.random<unsigned>(0, (int) injRange); 15811661Stushar@ece.gatech.edu if (trySending < injRate*injRange) 15911661Stushar@ece.gatech.edu sendAllowedThisCycle = true; 16011661Stushar@ece.gatech.edu else 16111661Stushar@ece.gatech.edu sendAllowedThisCycle = false; 16211661Stushar@ece.gatech.edu 16311661Stushar@ece.gatech.edu // always generatePkt unless fixedPkts or singleSender is enabled 16411661Stushar@ece.gatech.edu if (sendAllowedThisCycle) { 16511661Stushar@ece.gatech.edu bool senderEnable = true; 16611661Stushar@ece.gatech.edu 16711661Stushar@ece.gatech.edu if (numPacketsMax >= 0 && numPacketsSent >= numPacketsMax) 16811661Stushar@ece.gatech.edu senderEnable = false; 16911661Stushar@ece.gatech.edu 17011661Stushar@ece.gatech.edu if (singleSender >= 0 && id != singleSender) 17111661Stushar@ece.gatech.edu senderEnable = false; 17211661Stushar@ece.gatech.edu 17311661Stushar@ece.gatech.edu if (senderEnable) 17411661Stushar@ece.gatech.edu generatePkt(); 17511661Stushar@ece.gatech.edu } 17611661Stushar@ece.gatech.edu 17711661Stushar@ece.gatech.edu // Schedule wakeup 17811661Stushar@ece.gatech.edu if (curTick() >= simCycles) 17911661Stushar@ece.gatech.edu exitSimLoop("Network Tester completed simCycles"); 18011661Stushar@ece.gatech.edu else { 18111661Stushar@ece.gatech.edu if (!tickEvent.scheduled()) 18211661Stushar@ece.gatech.edu schedule(tickEvent, clockEdge(Cycles(1))); 18311661Stushar@ece.gatech.edu } 18411661Stushar@ece.gatech.edu} 18511661Stushar@ece.gatech.edu 18611661Stushar@ece.gatech.eduvoid 18711661Stushar@ece.gatech.eduGarnetSyntheticTraffic::generatePkt() 18811661Stushar@ece.gatech.edu{ 18911661Stushar@ece.gatech.edu int num_destinations = numDestinations; 19011661Stushar@ece.gatech.edu int radix = (int) sqrt(num_destinations); 19111661Stushar@ece.gatech.edu unsigned destination = id; 19211661Stushar@ece.gatech.edu int dest_x = -1; 19311661Stushar@ece.gatech.edu int dest_y = -1; 19411661Stushar@ece.gatech.edu int source = id; 19511661Stushar@ece.gatech.edu int src_x = id%radix; 19611661Stushar@ece.gatech.edu int src_y = id/radix; 19711661Stushar@ece.gatech.edu 19811661Stushar@ece.gatech.edu if (singleDest >= 0) 19911661Stushar@ece.gatech.edu { 20011661Stushar@ece.gatech.edu destination = singleDest; 20111661Stushar@ece.gatech.edu } else if (traffic == UNIFORM_RANDOM_) { 20211661Stushar@ece.gatech.edu destination = random_mt.random<unsigned>(0, num_destinations - 1); 20311661Stushar@ece.gatech.edu } else if (traffic == BIT_COMPLEMENT_) { 20411661Stushar@ece.gatech.edu dest_x = radix - src_x - 1; 20511661Stushar@ece.gatech.edu dest_y = radix - src_y - 1; 20611661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 20711661Stushar@ece.gatech.edu } else if (traffic == BIT_REVERSE_) { 20811661Stushar@ece.gatech.edu unsigned int straight = source; 20911661Stushar@ece.gatech.edu unsigned int reverse = source & 1; // LSB 21011661Stushar@ece.gatech.edu 21111661Stushar@ece.gatech.edu int num_bits = (int) log2(num_destinations); 21211661Stushar@ece.gatech.edu 21311661Stushar@ece.gatech.edu for (int i = 1; i < num_bits; i++) 21411661Stushar@ece.gatech.edu { 21511661Stushar@ece.gatech.edu reverse <<= 1; 21611661Stushar@ece.gatech.edu straight >>= 1; 21711661Stushar@ece.gatech.edu reverse |= (straight & 1); // LSB 21811661Stushar@ece.gatech.edu } 21911661Stushar@ece.gatech.edu destination = reverse; 22011661Stushar@ece.gatech.edu } else if (traffic == BIT_ROTATION_) { 22111661Stushar@ece.gatech.edu if (source%2 == 0) 22211661Stushar@ece.gatech.edu destination = source/2; 22311661Stushar@ece.gatech.edu else // (source%2 == 1) 22411661Stushar@ece.gatech.edu destination = ((source/2) + (num_destinations/2)); 22511661Stushar@ece.gatech.edu } else if (traffic == NEIGHBOR_) { 22611661Stushar@ece.gatech.edu dest_x = (src_x + 1) % radix; 22711661Stushar@ece.gatech.edu dest_y = src_y; 22811661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 22911661Stushar@ece.gatech.edu } else if (traffic == SHUFFLE_) { 23011661Stushar@ece.gatech.edu if (source < num_destinations/2) 23111661Stushar@ece.gatech.edu destination = source*2; 23211661Stushar@ece.gatech.edu else 23311661Stushar@ece.gatech.edu destination = (source*2 - num_destinations + 1); 23411661Stushar@ece.gatech.edu } else if (traffic == TRANSPOSE_) { 23511661Stushar@ece.gatech.edu dest_x = src_y; 23611661Stushar@ece.gatech.edu dest_y = src_x; 23711661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 23811661Stushar@ece.gatech.edu } else if (traffic == TORNADO_) { 23911661Stushar@ece.gatech.edu dest_x = (src_x + (int) ceil(radix/2) - 1) % radix; 24011661Stushar@ece.gatech.edu dest_y = src_y; 24111661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 24211661Stushar@ece.gatech.edu } 24311661Stushar@ece.gatech.edu else { 24411661Stushar@ece.gatech.edu fatal("Unknown Traffic Type: %s!\n", traffic); 24511661Stushar@ece.gatech.edu } 24611661Stushar@ece.gatech.edu 24711661Stushar@ece.gatech.edu // The source of the packets is a cache. 24811661Stushar@ece.gatech.edu // The destination of the packets is a directory. 24911661Stushar@ece.gatech.edu // The destination bits are embedded in the address after byte-offset. 25011661Stushar@ece.gatech.edu Addr paddr = destination; 25111661Stushar@ece.gatech.edu paddr <<= blockSizeBits; 25211661Stushar@ece.gatech.edu unsigned access_size = 1; // Does not affect Ruby simulation 25311661Stushar@ece.gatech.edu 25411661Stushar@ece.gatech.edu // Modeling different coherence msg types over different msg classes. 25511661Stushar@ece.gatech.edu // 25611661Stushar@ece.gatech.edu // GarnetSyntheticTraffic assumes the Garnet_standalone coherence protocol 25711661Stushar@ece.gatech.edu // which models three message classes/virtual networks. 25811661Stushar@ece.gatech.edu // These are: request, forward, response. 25911661Stushar@ece.gatech.edu // requests and forwards are "control" packets (typically 8 bytes), 26011661Stushar@ece.gatech.edu // while responses are "data" packets (typically 72 bytes). 26111661Stushar@ece.gatech.edu // 26211661Stushar@ece.gatech.edu // Life of a packet from the tester into the network: 26311661Stushar@ece.gatech.edu // (1) This function generatePkt() generates packets of one of the 26411661Stushar@ece.gatech.edu // following 3 types (randomly) : ReadReq, INST_FETCH, WriteReq 26511661Stushar@ece.gatech.edu // (2) mem/ruby/system/RubyPort.cc converts these to RubyRequestType_LD, 26611661Stushar@ece.gatech.edu // RubyRequestType_IFETCH, RubyRequestType_ST respectively 26711661Stushar@ece.gatech.edu // (3) mem/ruby/system/Sequencer.cc sends these to the cache controllers 26811661Stushar@ece.gatech.edu // in the coherence protocol. 26911661Stushar@ece.gatech.edu // (4) Network_test-cache.sm tags RubyRequestType:LD, 27011661Stushar@ece.gatech.edu // RubyRequestType:IFETCH and RubyRequestType:ST as 27111661Stushar@ece.gatech.edu // Request, Forward, and Response events respectively; 27211661Stushar@ece.gatech.edu // and injects them into virtual networks 0, 1 and 2 respectively. 27311661Stushar@ece.gatech.edu // It immediately calls back the sequencer. 27411661Stushar@ece.gatech.edu // (5) The packet traverses the network (simple/garnet) and reaches its 27511661Stushar@ece.gatech.edu // destination (Directory), and network stats are updated. 27611661Stushar@ece.gatech.edu // (6) Network_test-dir.sm simply drops the packet. 27711661Stushar@ece.gatech.edu // 27811661Stushar@ece.gatech.edu MemCmd::Command requestType; 27911661Stushar@ece.gatech.edu 28011661Stushar@ece.gatech.edu Request *req = nullptr; 28111661Stushar@ece.gatech.edu Request::Flags flags; 28211661Stushar@ece.gatech.edu 28311661Stushar@ece.gatech.edu // Inject in specific Vnet 28411661Stushar@ece.gatech.edu // Vnet 0 and 1 are for control packets (1-flit) 28511661Stushar@ece.gatech.edu // Vnet 2 is for data packets (5-flit) 28611661Stushar@ece.gatech.edu int injReqType = injVnet; 28711661Stushar@ece.gatech.edu 28811661Stushar@ece.gatech.edu if (injReqType < 0 || injReqType > 2) 28911661Stushar@ece.gatech.edu { 29011661Stushar@ece.gatech.edu // randomly inject in any vnet 29111661Stushar@ece.gatech.edu injReqType = random_mt.random(0, 2); 29211661Stushar@ece.gatech.edu } 29311661Stushar@ece.gatech.edu 29411661Stushar@ece.gatech.edu if (injReqType == 0) { 29511661Stushar@ece.gatech.edu // generate packet for virtual network 0 29611661Stushar@ece.gatech.edu requestType = MemCmd::ReadReq; 29711661Stushar@ece.gatech.edu req = new Request(paddr, access_size, flags, masterId); 29811661Stushar@ece.gatech.edu } else if (injReqType == 1) { 29911661Stushar@ece.gatech.edu // generate packet for virtual network 1 30011661Stushar@ece.gatech.edu requestType = MemCmd::ReadReq; 30111661Stushar@ece.gatech.edu flags.set(Request::INST_FETCH); 30211661Stushar@ece.gatech.edu req = new Request(0, 0x0, access_size, flags, masterId, 0x0, 0); 30311661Stushar@ece.gatech.edu req->setPaddr(paddr); 30411661Stushar@ece.gatech.edu } else { // if (injReqType == 2) 30511661Stushar@ece.gatech.edu // generate packet for virtual network 2 30611661Stushar@ece.gatech.edu requestType = MemCmd::WriteReq; 30711661Stushar@ece.gatech.edu req = new Request(paddr, access_size, flags, masterId); 30811661Stushar@ece.gatech.edu } 30911661Stushar@ece.gatech.edu 31011661Stushar@ece.gatech.edu req->setContext(id); 31111661Stushar@ece.gatech.edu 31211661Stushar@ece.gatech.edu //No need to do functional simulation 31311661Stushar@ece.gatech.edu //We just do timing simulation of the network 31411661Stushar@ece.gatech.edu 31511661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic, 31611661Stushar@ece.gatech.edu "Generated packet with destination %d, embedded in address %x\n", 31711661Stushar@ece.gatech.edu destination, req->getPaddr()); 31811661Stushar@ece.gatech.edu 31911661Stushar@ece.gatech.edu PacketPtr pkt = new Packet(req, requestType); 32011661Stushar@ece.gatech.edu pkt->dataDynamic(new uint8_t[req->getSize()]); 32111661Stushar@ece.gatech.edu pkt->senderState = NULL; 32211661Stushar@ece.gatech.edu 32311661Stushar@ece.gatech.edu sendPkt(pkt); 32411661Stushar@ece.gatech.edu} 32511661Stushar@ece.gatech.edu 32611661Stushar@ece.gatech.eduvoid 32711661Stushar@ece.gatech.eduGarnetSyntheticTraffic::initTrafficType() 32811661Stushar@ece.gatech.edu{ 32911661Stushar@ece.gatech.edu trafficStringToEnum["bit_complement"] = BIT_COMPLEMENT_; 33011661Stushar@ece.gatech.edu trafficStringToEnum["bit_reverse"] = BIT_REVERSE_; 33111661Stushar@ece.gatech.edu trafficStringToEnum["bit_rotation"] = BIT_ROTATION_; 33211661Stushar@ece.gatech.edu trafficStringToEnum["neighbor"] = NEIGHBOR_; 33311661Stushar@ece.gatech.edu trafficStringToEnum["shuffle"] = SHUFFLE_; 33411661Stushar@ece.gatech.edu trafficStringToEnum["tornado"] = TORNADO_; 33511661Stushar@ece.gatech.edu trafficStringToEnum["transpose"] = TRANSPOSE_; 33611661Stushar@ece.gatech.edu trafficStringToEnum["uniform_random"] = UNIFORM_RANDOM_; 33711661Stushar@ece.gatech.edu} 33811661Stushar@ece.gatech.edu 33911661Stushar@ece.gatech.eduvoid 34011661Stushar@ece.gatech.eduGarnetSyntheticTraffic::doRetry() 34111661Stushar@ece.gatech.edu{ 34211661Stushar@ece.gatech.edu if (cachePort.sendTimingReq(retryPkt)) { 34311661Stushar@ece.gatech.edu retryPkt = NULL; 34411661Stushar@ece.gatech.edu } 34511661Stushar@ece.gatech.edu} 34611661Stushar@ece.gatech.edu 34711661Stushar@ece.gatech.eduvoid 34811661Stushar@ece.gatech.eduGarnetSyntheticTraffic::printAddr(Addr a) 34911661Stushar@ece.gatech.edu{ 35011661Stushar@ece.gatech.edu cachePort.printAddr(a); 35111661Stushar@ece.gatech.edu} 35211661Stushar@ece.gatech.edu 35311661Stushar@ece.gatech.edu 35411661Stushar@ece.gatech.eduGarnetSyntheticTraffic * 35511661Stushar@ece.gatech.eduGarnetSyntheticTrafficParams::create() 35611661Stushar@ece.gatech.edu{ 35711661Stushar@ece.gatech.edu return new GarnetSyntheticTraffic(this); 35811661Stushar@ece.gatech.edu} 359