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