1/* 2 * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood 3 * Copyright (c) 2013 Advanced Micro Devices, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30// External Types 31 32// 33// **PLEASE NOTE!** When adding objects to this file you must also add a line 34// in the src/mem/ruby/SConscript file. Otherwise the external object's .hh 35// file will not be copied to the protocol directory and you will encounter a 36// undefined declaration error. 37// 38 39external_type(MessageBuffer, buffer="yes", inport="yes", outport="yes"); 40external_type(OutPort, primitive="yes"); 41external_type(Scalar, primitive="yes"); 42 43structure(InPort, external = "yes", primitive="yes") { 44 bool isReady(Tick current_time); 45 Tick dequeue(Tick current_time); 46 void recycle(Tick current_time, Tick recycle_latency); 47 bool isEmpty(); 48 bool isStallMapEmpty(); 49 int getStallMapSize(); 50} 51 52external_type(NodeID, default="0", primitive="yes"); 53external_type(MachineID); 54 55structure (Set, external = "yes", non_obj="yes") { 56 void setSize(int); 57 void add(NodeID); 58 void addSet(Set); 59 void remove(NodeID); 60 void removeSet(Set); 61 void broadcast(); 62 void addRandom(); 63 void clear(); 64 int count(); 65 bool isElement(NodeID); 66 bool isEqual(Set); 67 bool isSuperset(Set); 68 bool intersectionIsEmpty(Set); 69 NodeID smallestElement(); 70} 71 72structure (NetDest, external = "yes", non_obj="yes") { 73 void setSize(int); 74 void setSize(int, int); 75 void add(NodeID); 76 void add(MachineID); 77 void addSet(Set); 78 void addNetDest(NetDest); 79 void setNetDest(MachineType, Set); 80 void remove(NodeID); 81 void remove(MachineID); 82 void removeSet(Set); 83 void removeNetDest(NetDest); 84 void broadcast(); 85 void broadcast(MachineType); 86 void addRandom(); 87 void clear(); 88 Set toSet(); 89 int count(); 90 bool isElement(NodeID); 91 bool isElement(MachineID); 92 bool isSuperset(Set); 93 bool isSuperset(NetDest); 94 bool isEmpty(); 95 bool intersectionIsEmpty(Set); 96 bool intersectionIsEmpty(NetDest); 97 MachineID smallestElement(MachineType); 98 NetDest OR(NetDest); 99 NetDest AND(NetDest); 100} 101 102structure (Sequencer, external = "yes") { 103 void readCallback(Addr, DataBlock); 104 void readCallback(Addr, DataBlock, bool); 105 void readCallback(Addr, DataBlock, bool, MachineType); 106 void readCallback(Addr, DataBlock, bool, MachineType, 107 Cycles, Cycles, Cycles); 108 109 void writeCallback(Addr, DataBlock); 110 void writeCallback(Addr, DataBlock, bool); 111 void writeCallback(Addr, DataBlock, bool, MachineType); 112 void writeCallback(Addr, DataBlock, bool, MachineType, 113 Cycles, Cycles, Cycles); 114 115 void checkCoherence(Addr); 116 void evictionCallback(Addr); 117 void recordRequestType(SequencerRequestType); 118 bool checkResourceAvailable(CacheResourceType, Addr); 119 void invalidateSC(Addr); 120} 121 122structure (GPUCoalescer, external = "yes") { 123 void readCallback(Addr, DataBlock); 124 void readCallback(Addr, MachineType, DataBlock); 125 void readCallback(Addr, MachineType, DataBlock, 126 Cycles, Cycles, Cycles); 127 void readCallback(Addr, MachineType, DataBlock, 128 Cycles, Cycles, Cycles, bool); 129 void writeCallback(Addr, DataBlock); 130 void writeCallback(Addr, MachineType, DataBlock); 131 void writeCallback(Addr, MachineType, DataBlock, 132 Cycles, Cycles, Cycles); 133 void writeCallback(Addr, MachineType, DataBlock, 134 Cycles, Cycles, Cycles, bool); 135 void checkCoherence(Addr); 136 void evictionCallback(Addr); 137 void recordCPReadCallBack(MachineID, MachineID); 138 void recordCPWriteCallBack(MachineID, MachineID); 139} 140 141structure (VIPERCoalescer, external = "yes") { 142 void readCallback(Addr, DataBlock); 143 void readCallback(Addr, MachineType, DataBlock); 144 void readCallback(Addr, MachineType, DataBlock, 145 Cycles, Cycles, Cycles); 146 void readCallback(Addr, MachineType, DataBlock, 147 Cycles, Cycles, Cycles, bool); 148 void writeCallback(Addr, DataBlock); 149 void writeCallback(Addr, MachineType, DataBlock); 150 void writeCallback(Addr, MachineType, DataBlock, 151 Cycles, Cycles, Cycles); 152 void writeCallback(Addr, MachineType, DataBlock, 153 Cycles, Cycles, Cycles, bool); 154 void invCallback(Addr); 155 void wbCallback(Addr); 156 void checkCoherence(Addr); 157 void evictionCallback(Addr); 158} 159 160structure(RubyRequest, desc="...", interface="Message", external="yes") { 161 Addr LineAddress, desc="Line address for this request"; 162 Addr PhysicalAddress, desc="Physical address for this request"; 163 RubyRequestType Type, desc="Type of request (LD, ST, etc)"; 164 Addr ProgramCounter, desc="Program counter of the instruction that caused the miss"; 165 RubyAccessMode AccessMode, desc="user/supervisor access type"; 166 int Size, desc="size in bytes of access"; 167 PrefetchBit Prefetch, desc="Is this a prefetch request"; 168 int contextId, desc="this goes away but must be replace with Nilay"; 169 WriteMask writeMask, desc="Writethrough mask"; 170 DataBlock WTData, desc="Writethrough data block"; 171 int wfid, desc="Writethrough wavefront"; 172 HSAScope scope, desc="HSA scope"; 173 HSASegment segment, desc="HSA segment"; 174 PacketPtr pkt, desc="Packet associated with this request"; 175} 176 177structure(AbstractEntry, primitive="yes", external = "yes") { 178 void changePermission(AccessPermission); 179} 180 181structure (DirectoryMemory, external = "yes") { 182 AbstractEntry allocate(Addr, AbstractEntry); 183 AbstractEntry lookup(Addr); 184 bool isPresent(Addr); 185 void invalidateBlock(Addr); 186 void recordRequestType(DirectoryRequestType); 187} 188 189structure(AbstractCacheEntry, primitive="yes", external = "yes") { 190 void changePermission(AccessPermission); 191} 192 193structure (CacheMemory, external = "yes") { 194 bool cacheAvail(Addr); 195 Addr cacheProbe(Addr); 196 AbstractCacheEntry allocate(Addr, AbstractCacheEntry); 197 AbstractCacheEntry allocate(Addr, AbstractCacheEntry, bool); 198 void allocateVoid(Addr, AbstractCacheEntry); 199 void deallocate(Addr); 200 AbstractCacheEntry lookup(Addr); 201 bool isTagPresent(Addr); 202 Cycles getTagLatency(); 203 Cycles getDataLatency(); 204 void setMRU(Addr); 205 void setMRU(Addr, int); 206 void setMRU(AbstractCacheEntry); 207 void recordRequestType(CacheRequestType, Addr); 208 bool checkResourceAvailable(CacheResourceType, Addr); 209 210 int getCacheSize(); 211 int getNumBlocks(); 212 Addr getAddressAtIdx(int); 213 214 Scalar demand_misses; 215 Scalar demand_hits; 216} 217 218structure (WireBuffer, inport="yes", outport="yes", external = "yes") { 219 220} 221 222structure (DMASequencer, external = "yes") { 223 void ackCallback(Addr); 224 void dataCallback(DataBlock,Addr); 225 void recordRequestType(CacheRequestType); 226} 227 228structure (TimerTable, inport="yes", external = "yes") { 229 bool isReady(Tick); 230 Addr nextAddress(); 231 void set(Addr, Tick); 232 void unset(Addr); 233 bool isSet(Addr); 234} 235 236structure (Prefetcher, external = "yes") { 237 void observeMiss(Addr, RubyRequestType); 238 void observePfHit(Addr); 239 void observePfMiss(Addr); 240} 241