GarnetSyntheticTraffic.cc revision 12748
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 3111793Sbrandon.potter@amd.com#include "cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.hh" 3211793Sbrandon.potter@amd.com 3311661Stushar@ece.gatech.edu#include <cmath> 3411661Stushar@ece.gatech.edu#include <iomanip> 3511661Stushar@ece.gatech.edu#include <set> 3611661Stushar@ece.gatech.edu#include <string> 3711661Stushar@ece.gatech.edu#include <vector> 3811661Stushar@ece.gatech.edu 3912334Sgabeblack@google.com#include "base/logging.hh" 4011661Stushar@ece.gatech.edu#include "base/random.hh" 4111661Stushar@ece.gatech.edu#include "base/statistics.hh" 4211661Stushar@ece.gatech.edu#include "debug/GarnetSyntheticTraffic.hh" 4311661Stushar@ece.gatech.edu#include "mem/mem_object.hh" 4411661Stushar@ece.gatech.edu#include "mem/packet.hh" 4511661Stushar@ece.gatech.edu#include "mem/port.hh" 4611661Stushar@ece.gatech.edu#include "mem/request.hh" 4711661Stushar@ece.gatech.edu#include "sim/sim_events.hh" 4811661Stushar@ece.gatech.edu#include "sim/stats.hh" 4911661Stushar@ece.gatech.edu#include "sim/system.hh" 5011661Stushar@ece.gatech.edu 5111661Stushar@ece.gatech.eduusing namespace std; 5211661Stushar@ece.gatech.edu 5311661Stushar@ece.gatech.eduint TESTER_NETWORK=0; 5411661Stushar@ece.gatech.edu 5511661Stushar@ece.gatech.edubool 5611661Stushar@ece.gatech.eduGarnetSyntheticTraffic::CpuPort::recvTimingResp(PacketPtr pkt) 5711661Stushar@ece.gatech.edu{ 5811661Stushar@ece.gatech.edu tester->completeRequest(pkt); 5911661Stushar@ece.gatech.edu return true; 6011661Stushar@ece.gatech.edu} 6111661Stushar@ece.gatech.edu 6211661Stushar@ece.gatech.eduvoid 6311661Stushar@ece.gatech.eduGarnetSyntheticTraffic::CpuPort::recvReqRetry() 6411661Stushar@ece.gatech.edu{ 6511661Stushar@ece.gatech.edu tester->doRetry(); 6611661Stushar@ece.gatech.edu} 6711661Stushar@ece.gatech.edu 6811661Stushar@ece.gatech.eduvoid 6911661Stushar@ece.gatech.eduGarnetSyntheticTraffic::sendPkt(PacketPtr pkt) 7011661Stushar@ece.gatech.edu{ 7111661Stushar@ece.gatech.edu if (!cachePort.sendTimingReq(pkt)) { 7211661Stushar@ece.gatech.edu retryPkt = pkt; // RubyPort will retry sending 7311661Stushar@ece.gatech.edu } 7411661Stushar@ece.gatech.edu numPacketsSent++; 7511661Stushar@ece.gatech.edu} 7611661Stushar@ece.gatech.edu 7711661Stushar@ece.gatech.eduGarnetSyntheticTraffic::GarnetSyntheticTraffic(const Params *p) 7811661Stushar@ece.gatech.edu : MemObject(p), 7912129Sspwilson2@wisc.edu tickEvent([this]{ tick(); }, "GarnetSyntheticTraffic tick", 8012129Sspwilson2@wisc.edu false, Event::CPU_Tick_Pri), 8111661Stushar@ece.gatech.edu cachePort("GarnetSyntheticTraffic", this), 8211661Stushar@ece.gatech.edu retryPkt(NULL), 8311661Stushar@ece.gatech.edu size(p->memory_size), 8411661Stushar@ece.gatech.edu blockSizeBits(p->block_offset), 8511661Stushar@ece.gatech.edu numDestinations(p->num_dest), 8611661Stushar@ece.gatech.edu simCycles(p->sim_cycles), 8711661Stushar@ece.gatech.edu numPacketsMax(p->num_packets_max), 8811661Stushar@ece.gatech.edu numPacketsSent(0), 8911661Stushar@ece.gatech.edu singleSender(p->single_sender), 9011661Stushar@ece.gatech.edu singleDest(p->single_dest), 9111661Stushar@ece.gatech.edu trafficType(p->traffic_type), 9211661Stushar@ece.gatech.edu injRate(p->inj_rate), 9311661Stushar@ece.gatech.edu injVnet(p->inj_vnet), 9411661Stushar@ece.gatech.edu precision(p->precision), 9511661Stushar@ece.gatech.edu responseLimit(p->response_limit), 9612680Sgiacomo.travaglini@arm.com masterId(p->system->getMasterId(this)) 9711661Stushar@ece.gatech.edu{ 9811661Stushar@ece.gatech.edu // set up counters 9911661Stushar@ece.gatech.edu noResponseCycles = 0; 10011661Stushar@ece.gatech.edu schedule(tickEvent, 0); 10111661Stushar@ece.gatech.edu 10211661Stushar@ece.gatech.edu initTrafficType(); 10311661Stushar@ece.gatech.edu if (trafficStringToEnum.count(trafficType) == 0) { 10411661Stushar@ece.gatech.edu fatal("Unknown Traffic Type: %s!\n", traffic); 10511661Stushar@ece.gatech.edu } 10611661Stushar@ece.gatech.edu traffic = trafficStringToEnum[trafficType]; 10711661Stushar@ece.gatech.edu 10811661Stushar@ece.gatech.edu id = TESTER_NETWORK++; 10911661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic,"Config Created: Name = %s , and id = %d\n", 11011661Stushar@ece.gatech.edu name(), id); 11111661Stushar@ece.gatech.edu} 11211661Stushar@ece.gatech.edu 11311661Stushar@ece.gatech.eduBaseMasterPort & 11411661Stushar@ece.gatech.eduGarnetSyntheticTraffic::getMasterPort(const std::string &if_name, PortID idx) 11511661Stushar@ece.gatech.edu{ 11611661Stushar@ece.gatech.edu if (if_name == "test") 11711661Stushar@ece.gatech.edu return cachePort; 11811661Stushar@ece.gatech.edu else 11911661Stushar@ece.gatech.edu return MemObject::getMasterPort(if_name, idx); 12011661Stushar@ece.gatech.edu} 12111661Stushar@ece.gatech.edu 12211661Stushar@ece.gatech.eduvoid 12311661Stushar@ece.gatech.eduGarnetSyntheticTraffic::init() 12411661Stushar@ece.gatech.edu{ 12511661Stushar@ece.gatech.edu numPacketsSent = 0; 12611661Stushar@ece.gatech.edu} 12711661Stushar@ece.gatech.edu 12811661Stushar@ece.gatech.edu 12911661Stushar@ece.gatech.eduvoid 13011661Stushar@ece.gatech.eduGarnetSyntheticTraffic::completeRequest(PacketPtr pkt) 13111661Stushar@ece.gatech.edu{ 13212748Sgiacomo.travaglini@arm.com RequestPtr req = pkt->req; 13311661Stushar@ece.gatech.edu 13411661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic, 13511661Stushar@ece.gatech.edu "Completed injection of %s packet for address %x\n", 13611661Stushar@ece.gatech.edu pkt->isWrite() ? "write" : "read\n", 13711661Stushar@ece.gatech.edu req->getPaddr()); 13811661Stushar@ece.gatech.edu 13911661Stushar@ece.gatech.edu assert(pkt->isResponse()); 14011661Stushar@ece.gatech.edu noResponseCycles = 0; 14111661Stushar@ece.gatech.edu delete req; 14211661Stushar@ece.gatech.edu delete pkt; 14311661Stushar@ece.gatech.edu} 14411661Stushar@ece.gatech.edu 14511661Stushar@ece.gatech.edu 14611661Stushar@ece.gatech.eduvoid 14711661Stushar@ece.gatech.eduGarnetSyntheticTraffic::tick() 14811661Stushar@ece.gatech.edu{ 14911661Stushar@ece.gatech.edu if (++noResponseCycles >= responseLimit) { 15011661Stushar@ece.gatech.edu fatal("%s deadlocked at cycle %d\n", name(), curTick()); 15111661Stushar@ece.gatech.edu } 15211661Stushar@ece.gatech.edu 15311661Stushar@ece.gatech.edu // make new request based on injection rate 15411661Stushar@ece.gatech.edu // (injection rate's range depends on precision) 15511661Stushar@ece.gatech.edu // - generate a random number between 0 and 10^precision 15611661Stushar@ece.gatech.edu // - send pkt if this number is < injRate*(10^precision) 15711661Stushar@ece.gatech.edu bool sendAllowedThisCycle; 15811661Stushar@ece.gatech.edu double injRange = pow((double) 10, (double) precision); 15911661Stushar@ece.gatech.edu unsigned trySending = random_mt.random<unsigned>(0, (int) injRange); 16011661Stushar@ece.gatech.edu if (trySending < injRate*injRange) 16111661Stushar@ece.gatech.edu sendAllowedThisCycle = true; 16211661Stushar@ece.gatech.edu else 16311661Stushar@ece.gatech.edu sendAllowedThisCycle = false; 16411661Stushar@ece.gatech.edu 16511661Stushar@ece.gatech.edu // always generatePkt unless fixedPkts or singleSender is enabled 16611661Stushar@ece.gatech.edu if (sendAllowedThisCycle) { 16711661Stushar@ece.gatech.edu bool senderEnable = true; 16811661Stushar@ece.gatech.edu 16911661Stushar@ece.gatech.edu if (numPacketsMax >= 0 && numPacketsSent >= numPacketsMax) 17011661Stushar@ece.gatech.edu senderEnable = false; 17111661Stushar@ece.gatech.edu 17211661Stushar@ece.gatech.edu if (singleSender >= 0 && id != singleSender) 17311661Stushar@ece.gatech.edu senderEnable = false; 17411661Stushar@ece.gatech.edu 17511661Stushar@ece.gatech.edu if (senderEnable) 17611661Stushar@ece.gatech.edu generatePkt(); 17711661Stushar@ece.gatech.edu } 17811661Stushar@ece.gatech.edu 17911661Stushar@ece.gatech.edu // Schedule wakeup 18011661Stushar@ece.gatech.edu if (curTick() >= simCycles) 18111661Stushar@ece.gatech.edu exitSimLoop("Network Tester completed simCycles"); 18211661Stushar@ece.gatech.edu else { 18311661Stushar@ece.gatech.edu if (!tickEvent.scheduled()) 18411661Stushar@ece.gatech.edu schedule(tickEvent, clockEdge(Cycles(1))); 18511661Stushar@ece.gatech.edu } 18611661Stushar@ece.gatech.edu} 18711661Stushar@ece.gatech.edu 18811661Stushar@ece.gatech.eduvoid 18911661Stushar@ece.gatech.eduGarnetSyntheticTraffic::generatePkt() 19011661Stushar@ece.gatech.edu{ 19111661Stushar@ece.gatech.edu int num_destinations = numDestinations; 19211661Stushar@ece.gatech.edu int radix = (int) sqrt(num_destinations); 19311661Stushar@ece.gatech.edu unsigned destination = id; 19411661Stushar@ece.gatech.edu int dest_x = -1; 19511661Stushar@ece.gatech.edu int dest_y = -1; 19611661Stushar@ece.gatech.edu int source = id; 19711661Stushar@ece.gatech.edu int src_x = id%radix; 19811661Stushar@ece.gatech.edu int src_y = id/radix; 19911661Stushar@ece.gatech.edu 20011661Stushar@ece.gatech.edu if (singleDest >= 0) 20111661Stushar@ece.gatech.edu { 20211661Stushar@ece.gatech.edu destination = singleDest; 20311661Stushar@ece.gatech.edu } else if (traffic == UNIFORM_RANDOM_) { 20411661Stushar@ece.gatech.edu destination = random_mt.random<unsigned>(0, num_destinations - 1); 20511661Stushar@ece.gatech.edu } else if (traffic == BIT_COMPLEMENT_) { 20611661Stushar@ece.gatech.edu dest_x = radix - src_x - 1; 20711661Stushar@ece.gatech.edu dest_y = radix - src_y - 1; 20811661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 20911661Stushar@ece.gatech.edu } else if (traffic == BIT_REVERSE_) { 21011661Stushar@ece.gatech.edu unsigned int straight = source; 21111661Stushar@ece.gatech.edu unsigned int reverse = source & 1; // LSB 21211661Stushar@ece.gatech.edu 21311661Stushar@ece.gatech.edu int num_bits = (int) log2(num_destinations); 21411661Stushar@ece.gatech.edu 21511661Stushar@ece.gatech.edu for (int i = 1; i < num_bits; i++) 21611661Stushar@ece.gatech.edu { 21711661Stushar@ece.gatech.edu reverse <<= 1; 21811661Stushar@ece.gatech.edu straight >>= 1; 21911661Stushar@ece.gatech.edu reverse |= (straight & 1); // LSB 22011661Stushar@ece.gatech.edu } 22111661Stushar@ece.gatech.edu destination = reverse; 22211661Stushar@ece.gatech.edu } else if (traffic == BIT_ROTATION_) { 22311661Stushar@ece.gatech.edu if (source%2 == 0) 22411661Stushar@ece.gatech.edu destination = source/2; 22511661Stushar@ece.gatech.edu else // (source%2 == 1) 22611661Stushar@ece.gatech.edu destination = ((source/2) + (num_destinations/2)); 22711661Stushar@ece.gatech.edu } else if (traffic == NEIGHBOR_) { 22811661Stushar@ece.gatech.edu dest_x = (src_x + 1) % radix; 22911661Stushar@ece.gatech.edu dest_y = src_y; 23011661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 23111661Stushar@ece.gatech.edu } else if (traffic == SHUFFLE_) { 23211661Stushar@ece.gatech.edu if (source < num_destinations/2) 23311661Stushar@ece.gatech.edu destination = source*2; 23411661Stushar@ece.gatech.edu else 23511661Stushar@ece.gatech.edu destination = (source*2 - num_destinations + 1); 23611661Stushar@ece.gatech.edu } else if (traffic == TRANSPOSE_) { 23711661Stushar@ece.gatech.edu dest_x = src_y; 23811661Stushar@ece.gatech.edu dest_y = src_x; 23911661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 24011661Stushar@ece.gatech.edu } else if (traffic == TORNADO_) { 24111661Stushar@ece.gatech.edu dest_x = (src_x + (int) ceil(radix/2) - 1) % radix; 24211661Stushar@ece.gatech.edu dest_y = src_y; 24311661Stushar@ece.gatech.edu destination = dest_y*radix + dest_x; 24411661Stushar@ece.gatech.edu } 24511661Stushar@ece.gatech.edu else { 24611661Stushar@ece.gatech.edu fatal("Unknown Traffic Type: %s!\n", traffic); 24711661Stushar@ece.gatech.edu } 24811661Stushar@ece.gatech.edu 24911661Stushar@ece.gatech.edu // The source of the packets is a cache. 25011661Stushar@ece.gatech.edu // The destination of the packets is a directory. 25111661Stushar@ece.gatech.edu // The destination bits are embedded in the address after byte-offset. 25211661Stushar@ece.gatech.edu Addr paddr = destination; 25311661Stushar@ece.gatech.edu paddr <<= blockSizeBits; 25411661Stushar@ece.gatech.edu unsigned access_size = 1; // Does not affect Ruby simulation 25511661Stushar@ece.gatech.edu 25611661Stushar@ece.gatech.edu // Modeling different coherence msg types over different msg classes. 25711661Stushar@ece.gatech.edu // 25811661Stushar@ece.gatech.edu // GarnetSyntheticTraffic assumes the Garnet_standalone coherence protocol 25911661Stushar@ece.gatech.edu // which models three message classes/virtual networks. 26011661Stushar@ece.gatech.edu // These are: request, forward, response. 26111661Stushar@ece.gatech.edu // requests and forwards are "control" packets (typically 8 bytes), 26211661Stushar@ece.gatech.edu // while responses are "data" packets (typically 72 bytes). 26311661Stushar@ece.gatech.edu // 26411661Stushar@ece.gatech.edu // Life of a packet from the tester into the network: 26511661Stushar@ece.gatech.edu // (1) This function generatePkt() generates packets of one of the 26611661Stushar@ece.gatech.edu // following 3 types (randomly) : ReadReq, INST_FETCH, WriteReq 26711661Stushar@ece.gatech.edu // (2) mem/ruby/system/RubyPort.cc converts these to RubyRequestType_LD, 26811661Stushar@ece.gatech.edu // RubyRequestType_IFETCH, RubyRequestType_ST respectively 26911661Stushar@ece.gatech.edu // (3) mem/ruby/system/Sequencer.cc sends these to the cache controllers 27011661Stushar@ece.gatech.edu // in the coherence protocol. 27111661Stushar@ece.gatech.edu // (4) Network_test-cache.sm tags RubyRequestType:LD, 27211661Stushar@ece.gatech.edu // RubyRequestType:IFETCH and RubyRequestType:ST as 27311661Stushar@ece.gatech.edu // Request, Forward, and Response events respectively; 27411661Stushar@ece.gatech.edu // and injects them into virtual networks 0, 1 and 2 respectively. 27511661Stushar@ece.gatech.edu // It immediately calls back the sequencer. 27611661Stushar@ece.gatech.edu // (5) The packet traverses the network (simple/garnet) and reaches its 27711661Stushar@ece.gatech.edu // destination (Directory), and network stats are updated. 27811661Stushar@ece.gatech.edu // (6) Network_test-dir.sm simply drops the packet. 27911661Stushar@ece.gatech.edu // 28011661Stushar@ece.gatech.edu MemCmd::Command requestType; 28111661Stushar@ece.gatech.edu 28212748Sgiacomo.travaglini@arm.com RequestPtr req = nullptr; 28311661Stushar@ece.gatech.edu Request::Flags flags; 28411661Stushar@ece.gatech.edu 28511661Stushar@ece.gatech.edu // Inject in specific Vnet 28611661Stushar@ece.gatech.edu // Vnet 0 and 1 are for control packets (1-flit) 28711661Stushar@ece.gatech.edu // Vnet 2 is for data packets (5-flit) 28811661Stushar@ece.gatech.edu int injReqType = injVnet; 28911661Stushar@ece.gatech.edu 29011661Stushar@ece.gatech.edu if (injReqType < 0 || injReqType > 2) 29111661Stushar@ece.gatech.edu { 29211661Stushar@ece.gatech.edu // randomly inject in any vnet 29311661Stushar@ece.gatech.edu injReqType = random_mt.random(0, 2); 29411661Stushar@ece.gatech.edu } 29511661Stushar@ece.gatech.edu 29611661Stushar@ece.gatech.edu if (injReqType == 0) { 29711661Stushar@ece.gatech.edu // generate packet for virtual network 0 29811661Stushar@ece.gatech.edu requestType = MemCmd::ReadReq; 29911661Stushar@ece.gatech.edu req = new Request(paddr, access_size, flags, masterId); 30011661Stushar@ece.gatech.edu } else if (injReqType == 1) { 30111661Stushar@ece.gatech.edu // generate packet for virtual network 1 30211661Stushar@ece.gatech.edu requestType = MemCmd::ReadReq; 30311661Stushar@ece.gatech.edu flags.set(Request::INST_FETCH); 30411661Stushar@ece.gatech.edu req = new Request(0, 0x0, access_size, flags, masterId, 0x0, 0); 30511661Stushar@ece.gatech.edu req->setPaddr(paddr); 30611661Stushar@ece.gatech.edu } else { // if (injReqType == 2) 30711661Stushar@ece.gatech.edu // generate packet for virtual network 2 30811661Stushar@ece.gatech.edu requestType = MemCmd::WriteReq; 30911661Stushar@ece.gatech.edu req = new Request(paddr, access_size, flags, masterId); 31011661Stushar@ece.gatech.edu } 31111661Stushar@ece.gatech.edu 31211661Stushar@ece.gatech.edu req->setContext(id); 31311661Stushar@ece.gatech.edu 31411661Stushar@ece.gatech.edu //No need to do functional simulation 31511661Stushar@ece.gatech.edu //We just do timing simulation of the network 31611661Stushar@ece.gatech.edu 31711661Stushar@ece.gatech.edu DPRINTF(GarnetSyntheticTraffic, 31811661Stushar@ece.gatech.edu "Generated packet with destination %d, embedded in address %x\n", 31911661Stushar@ece.gatech.edu destination, req->getPaddr()); 32011661Stushar@ece.gatech.edu 32111661Stushar@ece.gatech.edu PacketPtr pkt = new Packet(req, requestType); 32211661Stushar@ece.gatech.edu pkt->dataDynamic(new uint8_t[req->getSize()]); 32311661Stushar@ece.gatech.edu pkt->senderState = NULL; 32411661Stushar@ece.gatech.edu 32511661Stushar@ece.gatech.edu sendPkt(pkt); 32611661Stushar@ece.gatech.edu} 32711661Stushar@ece.gatech.edu 32811661Stushar@ece.gatech.eduvoid 32911661Stushar@ece.gatech.eduGarnetSyntheticTraffic::initTrafficType() 33011661Stushar@ece.gatech.edu{ 33111661Stushar@ece.gatech.edu trafficStringToEnum["bit_complement"] = BIT_COMPLEMENT_; 33211661Stushar@ece.gatech.edu trafficStringToEnum["bit_reverse"] = BIT_REVERSE_; 33311661Stushar@ece.gatech.edu trafficStringToEnum["bit_rotation"] = BIT_ROTATION_; 33411661Stushar@ece.gatech.edu trafficStringToEnum["neighbor"] = NEIGHBOR_; 33511661Stushar@ece.gatech.edu trafficStringToEnum["shuffle"] = SHUFFLE_; 33611661Stushar@ece.gatech.edu trafficStringToEnum["tornado"] = TORNADO_; 33711661Stushar@ece.gatech.edu trafficStringToEnum["transpose"] = TRANSPOSE_; 33811661Stushar@ece.gatech.edu trafficStringToEnum["uniform_random"] = UNIFORM_RANDOM_; 33911661Stushar@ece.gatech.edu} 34011661Stushar@ece.gatech.edu 34111661Stushar@ece.gatech.eduvoid 34211661Stushar@ece.gatech.eduGarnetSyntheticTraffic::doRetry() 34311661Stushar@ece.gatech.edu{ 34411661Stushar@ece.gatech.edu if (cachePort.sendTimingReq(retryPkt)) { 34511661Stushar@ece.gatech.edu retryPkt = NULL; 34611661Stushar@ece.gatech.edu } 34711661Stushar@ece.gatech.edu} 34811661Stushar@ece.gatech.edu 34911661Stushar@ece.gatech.eduvoid 35011661Stushar@ece.gatech.eduGarnetSyntheticTraffic::printAddr(Addr a) 35111661Stushar@ece.gatech.edu{ 35211661Stushar@ece.gatech.edu cachePort.printAddr(a); 35311661Stushar@ece.gatech.edu} 35411661Stushar@ece.gatech.edu 35511661Stushar@ece.gatech.edu 35611661Stushar@ece.gatech.eduGarnetSyntheticTraffic * 35711661Stushar@ece.gatech.eduGarnetSyntheticTrafficParams::create() 35811661Stushar@ece.gatech.edu{ 35911661Stushar@ece.gatech.edu return new GarnetSyntheticTraffic(this); 36011661Stushar@ece.gatech.edu} 361