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