/* * Copyright (c) 2009 Advanced Micro Devices, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * Authors: Brad Beckmann * Tushar Krishna */ machine(MachineType:Directory, "Garnet_standalone Directory") : MessageBuffer * requestToDir, network="From", virtual_network="0", vnet_type = "request"; MessageBuffer * forwardToDir, network="From", virtual_network="1", vnet_type = "forward"; MessageBuffer * responseToDir, network="From", virtual_network="2", vnet_type = "response"; { // STATES state_declaration(State, desc="Directory states", default="Directory_State_I") { // Base states I, AccessPermission:Invalid, desc="Invalid"; } // Events enumeration(Event, desc="Directory events") { // processor requests Receive_Request, desc="Receive Message"; Receive_Forward, desc="Receive Message"; Receive_Response, desc="Receive Message"; } // TYPES // DirectoryEntry structure(Entry, desc="...", interface="AbstractCacheEntry", main="false") { State DirectoryState, desc="Directory state"; DataBlock DataBlk, desc="data for the block"; } // ** FUNCTIONS ** Tick clockEdge(); State getState(Addr addr) { return State:I; } void setState(Addr addr, State state) { } AccessPermission getAccessPermission(Addr addr) { return AccessPermission:NotPresent; } void setAccessPermission(Addr addr, State state) { } void functionalRead(Addr addr, Packet *pkt) { error("Garnet_standalone does not support functional read."); } int functionalWrite(Addr addr, Packet *pkt) { error("Garnet_standalone does not support functional write."); } // ** IN_PORTS ** in_port(requestQueue_in, RequestMsg, requestToDir) { if (requestQueue_in.isReady(clockEdge())) { peek(requestQueue_in, RequestMsg) { if (in_msg.Type == CoherenceRequestType:MSG) { trigger(Event:Receive_Request, in_msg.addr); } else { error("Invalid message"); } } } } in_port(forwardQueue_in, RequestMsg, forwardToDir) { if (forwardQueue_in.isReady(clockEdge())) { peek(forwardQueue_in, RequestMsg) { if (in_msg.Type == CoherenceRequestType:MSG) { trigger(Event:Receive_Forward, in_msg.addr); } else { error("Invalid message"); } } } } in_port(responseQueue_in, RequestMsg, responseToDir) { if (responseQueue_in.isReady(clockEdge())) { peek(responseQueue_in, RequestMsg) { if (in_msg.Type == CoherenceRequestType:MSG) { trigger(Event:Receive_Response, in_msg.addr); } else { error("Invalid message"); } } } } // Actions action(i_popIncomingRequestQueue, "i", desc="Pop incoming request queue") { requestQueue_in.dequeue(clockEdge()); } action(f_popIncomingForwardQueue, "f", desc="Pop incoming forward queue") { forwardQueue_in.dequeue(clockEdge()); } action(r_popIncomingResponseQueue, "r", desc="Pop incoming response queue") { responseQueue_in.dequeue(clockEdge()); } // TRANSITIONS // The directory simply drops the received packets. // The goal of Garnet_standalone is only to track network stats. transition(I, Receive_Request) { i_popIncomingRequestQueue; } transition(I, Receive_Forward) { f_popIncomingForwardQueue; } transition(I, Receive_Response) { r_popIncomingResponseQueue; } }