types.hh revision 9184
12SN/A/* 21762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665SN/A * 282665SN/A * Authors: Nathan Binkert 292SN/A */ 302SN/A 312SN/A/** 322SN/A * @file 336214Snate@binkert.org * Defines global host-dependent types: 342SN/A * Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t. 352SN/A */ 362SN/A 376214Snate@binkert.org#ifndef __BASE_TYPES_HH__ 386214Snate@binkert.org#define __BASE_TYPES_HH__ 392SN/A 402SN/A#include <inttypes.h> 412SN/A 429180Sandreas.hansson@arm.com#include <cassert> 439180Sandreas.hansson@arm.com 442SN/A/** uint64_t constant */ 455543SN/A#define ULL(N) ((uint64_t)N##ULL) 462SN/A/** int64_t constant */ 475543SN/A#define LL(N) ((int64_t)N##LL) 482SN/A 492SN/A/** Statistics counter type. Not much excuse for not using a 64-bit 502SN/A * integer here, but if you're desperate and only run short 512SN/A * simulations you could make this 32 bits. 522SN/A */ 532SN/Atypedef int64_t Counter; 542SN/A 552SN/A/** 569158Sandreas.hansson@arm.com * Tick count type. 572SN/A */ 589158Sandreas.hansson@arm.comtypedef uint64_t Tick; 592SN/A 609158Sandreas.hansson@arm.comconst Tick MaxTick = ULL(0xffffffffffffffff); 612667SN/A 622130SN/A/** 639180Sandreas.hansson@arm.com * Cycles is a wrapper class for representing cycle counts, i.e. a 649180Sandreas.hansson@arm.com * relative difference between two points in time, expressed in a 659180Sandreas.hansson@arm.com * number of clock cycles. 669180Sandreas.hansson@arm.com * 679180Sandreas.hansson@arm.com * The Cycles wrapper class is a type-safe alternative to a 689180Sandreas.hansson@arm.com * typedef, aiming to avoid unintentional mixing of cycles and ticks 699180Sandreas.hansson@arm.com * in the code base. 709180Sandreas.hansson@arm.com * 719180Sandreas.hansson@arm.com * Operators are defined inside an ifndef block to avoid swig touching 729180Sandreas.hansson@arm.com * them. Note that there is no overloading of the bool operator as the 739180Sandreas.hansson@arm.com * compiler is allowed to turn booleans into integers and this causes 749180Sandreas.hansson@arm.com * a whole range of issues in a handful locations. The solution to 759180Sandreas.hansson@arm.com * this problem would be to use the safe bool idiom, but for now we 769180Sandreas.hansson@arm.com * make do without the test and use the more elaborate comparison > 779180Sandreas.hansson@arm.com * Cycles(0). 789180Sandreas.hansson@arm.com */ 799180Sandreas.hansson@arm.comclass Cycles 809180Sandreas.hansson@arm.com{ 819180Sandreas.hansson@arm.com 829180Sandreas.hansson@arm.com private: 839180Sandreas.hansson@arm.com 849180Sandreas.hansson@arm.com /** Member holding the actual value. */ 859180Sandreas.hansson@arm.com uint64_t c; 869180Sandreas.hansson@arm.com 879180Sandreas.hansson@arm.com public: 889180Sandreas.hansson@arm.com 899180Sandreas.hansson@arm.com /** Explicit constructor assigning a value. */ 909180Sandreas.hansson@arm.com explicit Cycles(uint64_t _c) : c(_c) { } 919180Sandreas.hansson@arm.com 929184Sandreas.hansson@arm.com /** Default constructor for parameter classes. */ 939184Sandreas.hansson@arm.com Cycles() : c(0) { } 949184Sandreas.hansson@arm.com 959180Sandreas.hansson@arm.com#ifndef SWIG // keep the operators away from SWIG 969180Sandreas.hansson@arm.com 979180Sandreas.hansson@arm.com /** Converting back to the value type. */ 989180Sandreas.hansson@arm.com operator uint64_t() const { return c; } 999180Sandreas.hansson@arm.com 1009180Sandreas.hansson@arm.com /** Prefix increment operator. */ 1019180Sandreas.hansson@arm.com Cycles& operator++() 1029180Sandreas.hansson@arm.com { ++c; return *this; } 1039180Sandreas.hansson@arm.com 1049180Sandreas.hansson@arm.com /** Prefix decrement operator. Is only temporarily used in the O3 CPU. */ 1059180Sandreas.hansson@arm.com Cycles& operator--() 1069180Sandreas.hansson@arm.com { assert(c != 0); --c; return *this; } 1079180Sandreas.hansson@arm.com 1089180Sandreas.hansson@arm.com /** In-place addition of cycles. */ 1099180Sandreas.hansson@arm.com const Cycles& operator+=(const Cycles& cc) 1109180Sandreas.hansson@arm.com { c += cc.c; return *this; } 1119180Sandreas.hansson@arm.com 1129180Sandreas.hansson@arm.com /** Greater than comparison used for > Cycles(0). */ 1139180Sandreas.hansson@arm.com bool operator>(const Cycles& cc) const 1149180Sandreas.hansson@arm.com { return c > cc.c; } 1159180Sandreas.hansson@arm.com 1169180Sandreas.hansson@arm.com#endif // SWIG not touching operators 1179180Sandreas.hansson@arm.com 1189180Sandreas.hansson@arm.com}; 1199180Sandreas.hansson@arm.com 1209180Sandreas.hansson@arm.com/** 1212130SN/A * Address type 1222130SN/A * This will probably be moved somewhere else in the near future. 1232130SN/A * This should be at least as big as the biggest address width in use 1242130SN/A * in the system, which will probably be 64 bits. 1252130SN/A */ 1262130SN/Atypedef uint64_t Addr; 1272130SN/A 1287720Sgblack@eecs.umich.edutypedef uint16_t MicroPC; 1297720Sgblack@eecs.umich.edu 1307720Sgblack@eecs.umich.edustatic const MicroPC MicroPCRomBit = 1 << (sizeof(MicroPC) * 8 - 1); 1317720Sgblack@eecs.umich.edu 1327720Sgblack@eecs.umich.edustatic inline MicroPC 1337720Sgblack@eecs.umich.eduromMicroPC(MicroPC upc) 1347720Sgblack@eecs.umich.edu{ 1357720Sgblack@eecs.umich.edu return upc | MicroPCRomBit; 1367720Sgblack@eecs.umich.edu} 1377720Sgblack@eecs.umich.edu 1387720Sgblack@eecs.umich.edustatic inline MicroPC 1397720Sgblack@eecs.umich.edunormalMicroPC(MicroPC upc) 1407720Sgblack@eecs.umich.edu{ 1417720Sgblack@eecs.umich.edu return upc & ~MicroPCRomBit; 1427720Sgblack@eecs.umich.edu} 1437720Sgblack@eecs.umich.edu 1447720Sgblack@eecs.umich.edustatic inline bool 1457720Sgblack@eecs.umich.eduisRomMicroPC(MicroPC upc) 1467720Sgblack@eecs.umich.edu{ 1477720Sgblack@eecs.umich.edu return MicroPCRomBit & upc; 1487720Sgblack@eecs.umich.edu} 1497720Sgblack@eecs.umich.edu 1502438SN/Aconst Addr MaxAddr = (Addr)-1; 1512438SN/A 1526221Snate@binkert.org/** 1536221Snate@binkert.org * Thread index/ID type 1546221Snate@binkert.org */ 1556221Snate@binkert.orgtypedef int16_t ThreadID; 1566221Snate@binkert.orgconst ThreadID InvalidThreadID = (ThreadID)-1; 1576221Snate@binkert.org 1589031Sandreas.hansson@arm.com/** 1599031Sandreas.hansson@arm.com * Port index/ID type, and a symbolic name for an invalid port id. 1609031Sandreas.hansson@arm.com */ 1619031Sandreas.hansson@arm.comtypedef int16_t PortID; 1629031Sandreas.hansson@arm.comconst PortID InvalidPortID = (PortID)-1; 1639031Sandreas.hansson@arm.com 1647678Sgblack@eecs.umich.educlass FaultBase; 1657678Sgblack@eecs.umich.edutemplate <class T> class RefCountingPtr; 1667678Sgblack@eecs.umich.edutypedef RefCountingPtr<FaultBase> Fault; 1677678Sgblack@eecs.umich.edu 1686214Snate@binkert.org#endif // __BASE_TYPES_HH__ 169