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