RubySlicc_Util.hh revision 7832:de7601e6e19d
12810Srdreslin@umich.edu/* 22810Srdreslin@umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 32810Srdreslin@umich.edu * All rights reserved. 42810Srdreslin@umich.edu * 52810Srdreslin@umich.edu * Redistribution and use in source and binary forms, with or without 62810Srdreslin@umich.edu * modification, are permitted provided that the following conditions are 72810Srdreslin@umich.edu * met: redistributions of source code must retain the above copyright 82810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer; 92810Srdreslin@umich.edu * redistributions in binary form must reproduce the above copyright 102810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer in the 112810Srdreslin@umich.edu * documentation and/or other materials provided with the distribution; 122810Srdreslin@umich.edu * neither the name of the copyright holders nor the names of its 132810Srdreslin@umich.edu * contributors may be used to endorse or promote products derived from 142810Srdreslin@umich.edu * this software without specific prior written permission. 152810Srdreslin@umich.edu * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu */ 282810Srdreslin@umich.edu 292810Srdreslin@umich.edu/* 302810Srdreslin@umich.edu * These are the functions that exported to slicc from ruby. 312810Srdreslin@umich.edu */ 322810Srdreslin@umich.edu 332810Srdreslin@umich.edu#ifndef __MEM_RUBY_SLICC_INTERFACE_RUBYSLICCUTIL_HH__ 342810Srdreslin@umich.edu#define __MEM_RUBY_SLICC_INTERFACE_RUBYSLICCUTIL_HH__ 352810Srdreslin@umich.edu 362810Srdreslin@umich.edu#include <cassert> 372810Srdreslin@umich.edu 382810Srdreslin@umich.edu#include "mem/protocol/AccessType.hh" 392810Srdreslin@umich.edu#include "mem/protocol/CacheMsg.hh" 402810Srdreslin@umich.edu#include "mem/protocol/CacheRequestType.hh" 412810Srdreslin@umich.edu#include "mem/protocol/Directory_State.hh" 422810Srdreslin@umich.edu#include "mem/protocol/GenericRequestType.hh" 432810Srdreslin@umich.edu#include "mem/protocol/L1Cache_State.hh" 442810Srdreslin@umich.edu#include "mem/protocol/MachineType.hh" 452810Srdreslin@umich.edu#include "mem/protocol/MessageSizeType.hh" 462810Srdreslin@umich.edu#include "mem/protocol/PrefetchBit.hh" 472810Srdreslin@umich.edu#include "mem/ruby/common/Address.hh" 482810Srdreslin@umich.edu#include "mem/ruby/common/Global.hh" 492810Srdreslin@umich.edu#include "mem/ruby/network/Network.hh" 502810Srdreslin@umich.edu#include "mem/ruby/slicc_interface/RubySlicc_ComponentMapping.hh" 512810Srdreslin@umich.edu#include "mem/ruby/system/MachineID.hh" 522810Srdreslin@umich.edu#include "mem/ruby/system/NodeID.hh" 532810Srdreslin@umich.edu#include "mem/ruby/system/System.hh" 542810Srdreslin@umich.edu 552810Srdreslin@umich.educlass Set; 562810Srdreslin@umich.educlass NetDest; 572810Srdreslin@umich.edu 582810Srdreslin@umich.eduinline int 592810Srdreslin@umich.edurandom(int n) 602810Srdreslin@umich.edu{ 612810Srdreslin@umich.edu return random() % n; 622810Srdreslin@umich.edu} 632810Srdreslin@umich.edu 642810Srdreslin@umich.eduinline bool 652810Srdreslin@umich.edumulticast_retry() 662810Srdreslin@umich.edu{ 672810Srdreslin@umich.edu if (RubySystem::getRandomization()) { 682810Srdreslin@umich.edu return (random() & 0x1); 692810Srdreslin@umich.edu } else { 702810Srdreslin@umich.edu return true; 712810Srdreslin@umich.edu } 722810Srdreslin@umich.edu} 732810Srdreslin@umich.edu 742810Srdreslin@umich.eduinline int 752810Srdreslin@umich.educache_state_to_int(L1Cache_State state) 762810Srdreslin@umich.edu{ 772810Srdreslin@umich.edu return state; 782810Srdreslin@umich.edu} 792810Srdreslin@umich.edu 802810Srdreslin@umich.eduinline Time 812810Srdreslin@umich.eduget_time() 822810Srdreslin@umich.edu{ 832810Srdreslin@umich.edu return g_eventQueue_ptr->getTime(); 842810Srdreslin@umich.edu} 852810Srdreslin@umich.edu 862810Srdreslin@umich.eduinline Time 872810Srdreslin@umich.eduzero_time() 882810Srdreslin@umich.edu{ 892810Srdreslin@umich.edu return 0; 902810Srdreslin@umich.edu} 912810Srdreslin@umich.edu 922810Srdreslin@umich.eduinline NodeID 932810Srdreslin@umich.eduintToID(int nodenum) 942810Srdreslin@umich.edu{ 952810Srdreslin@umich.edu NodeID id = nodenum; 962810Srdreslin@umich.edu return id; 972810Srdreslin@umich.edu} 982810Srdreslin@umich.edu 992810Srdreslin@umich.eduinline int 1002810Srdreslin@umich.eduIDToInt(NodeID id) 1012810Srdreslin@umich.edu{ 1022810Srdreslin@umich.edu int nodenum = id; 1032810Srdreslin@umich.edu return nodenum; 1042810Srdreslin@umich.edu} 1052810Srdreslin@umich.edu 1062810Srdreslin@umich.eduinline int 1072810Srdreslin@umich.eduaddressToInt(Address addr) 1082810Srdreslin@umich.edu{ 1092810Srdreslin@umich.edu return (int)addr.getLineAddress(); 1102810Srdreslin@umich.edu} 1112810Srdreslin@umich.edu 1122810Srdreslin@umich.eduinline bool 1132810Srdreslin@umich.edulong_enough_ago(Time event) 1142810Srdreslin@umich.edu{ 1152810Srdreslin@umich.edu return ((get_time() - event) > 200); 1162810Srdreslin@umich.edu} 1172810Srdreslin@umich.edu 1182810Srdreslin@umich.eduinline int 1192810Srdreslin@umich.edugetAddThenMod(int addend1, int addend2, int modulus) 1202810Srdreslin@umich.edu{ 1212810Srdreslin@umich.edu return (addend1 + addend2) % modulus; 1222810Srdreslin@umich.edu} 1232810Srdreslin@umich.edu 1242810Srdreslin@umich.eduinline Time 1252810Srdreslin@umich.edugetTimeModInt(Time time, int modulus) 1262810Srdreslin@umich.edu{ 1272810Srdreslin@umich.edu return time % modulus; 1282810Srdreslin@umich.edu} 1292810Srdreslin@umich.edu 1302810Srdreslin@umich.eduinline Time 1312810Srdreslin@umich.edugetTimePlusInt(Time addend1, int addend2) 1322810Srdreslin@umich.edu{ 1332810Srdreslin@umich.edu return (Time) addend1 + addend2; 1342810Srdreslin@umich.edu} 1352810Srdreslin@umich.edu 1362810Srdreslin@umich.eduinline Time 1372810Srdreslin@umich.edugetTimeMinusTime(Time t1, Time t2) 1382810Srdreslin@umich.edu{ 1392810Srdreslin@umich.edu assert(t1 >= t2); 1402810Srdreslin@umich.edu return t1 - t2; 1412810Srdreslin@umich.edu} 1422810Srdreslin@umich.edu 1432810Srdreslin@umich.eduinline Time 1442810Srdreslin@umich.edugetPreviousDelayedCycles(Time t1, Time t2) 1452810Srdreslin@umich.edu{ 1462810Srdreslin@umich.edu if (RubySystem::getRandomization()) { // when randomizing delayed 1472810Srdreslin@umich.edu return 0; 1482810Srdreslin@umich.edu } else { 1492810Srdreslin@umich.edu return getTimeMinusTime(t1, t2); 1502810Srdreslin@umich.edu } 1512810Srdreslin@umich.edu} 1522810Srdreslin@umich.edu 1532810Srdreslin@umich.edu// Return type for time_to_int is "Time" and not "int" so we get a 1542810Srdreslin@umich.edu// 64-bit integer 1552810Srdreslin@umich.eduinline Time 1562810Srdreslin@umich.edutime_to_int(Time time) 1572810Srdreslin@umich.edu{ 1582810Srdreslin@umich.edu return time; 1592810Srdreslin@umich.edu} 1602810Srdreslin@umich.edu 1612810Srdreslin@umich.edu// Appends an offset to an address 1622810Srdreslin@umich.eduinline Address 1632810Srdreslin@umich.edusetOffset(Address addr, int offset) 1642810Srdreslin@umich.edu{ 1652810Srdreslin@umich.edu Address result = addr; 1662810Srdreslin@umich.edu result.setOffset(offset); 1672810Srdreslin@umich.edu return result; 1682810Srdreslin@umich.edu} 1692810Srdreslin@umich.edu 1702810Srdreslin@umich.edu// Makes an address into a line address 1712810Srdreslin@umich.eduinline Address 1722810Srdreslin@umich.edumakeLineAddress(Address addr) 1732810Srdreslin@umich.edu{ 1742810Srdreslin@umich.edu Address result = addr; 1752810Srdreslin@umich.edu result.makeLineAddress(); 1762810Srdreslin@umich.edu return result; 1772810Srdreslin@umich.edu} 1782810Srdreslin@umich.edu 1792810Srdreslin@umich.eduinline int 1802810Srdreslin@umich.eduaddressOffset(Address addr) 1812810Srdreslin@umich.edu{ 1822810Srdreslin@umich.edu return addr.getOffset(); 1832810Srdreslin@umich.edu} 1842810Srdreslin@umich.edu 1852810Srdreslin@umich.edu#endif // __MEM_RUBY_SLICC_INTERFACE_RUBYSLICCUTIL_HH__ 1862810Srdreslin@umich.edu