core.cc revision 13409
1545SN/A/*
21762SN/A * Copyright (c) 2006 The Regents of The University of Michigan
3545SN/A * Copyright (c) 2013 Advanced Micro Devices, Inc.
4545SN/A * Copyright (c) 2013 Mark D. Hill and David A. Wood
5545SN/A * All rights reserved.
6545SN/A *
7545SN/A * Redistribution and use in source and binary forms, with or without
8545SN/A * modification, are permitted provided that the following conditions are
9545SN/A * met: redistributions of source code must retain the above copyright
10545SN/A * notice, this list of conditions and the following disclaimer;
11545SN/A * redistributions in binary form must reproduce the above copyright
12545SN/A * notice, this list of conditions and the following disclaimer in the
13545SN/A * documentation and/or other materials provided with the distribution;
14545SN/A * neither the name of the copyright holders nor the names of its
15545SN/A * contributors may be used to endorse or promote products derived from
16545SN/A * this software without specific prior written permission.
17545SN/A *
18545SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19545SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20545SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21545SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22545SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23545SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24545SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25545SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26545SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272665Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
282665Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292665Ssaidi@eecs.umich.edu *
30545SN/A * Authors: Nathan Binkert
31545SN/A *          Steve Reinhardt
321310SN/A */
331310SN/A
34545SN/A#include "sim/core.hh"
352542SN/A
363348Sbinkertn@umich.edu#include <iostream>
373348Sbinkertn@umich.edu#include <string>
382489SN/A
39545SN/A#include "base/callback.hh"
403090Sstever@eecs.umich.edu#include "base/cprintf.hh"
411310SN/A#include "base/logging.hh"
422384SN/A#include "base/output.hh"
432489SN/A#include "sim/eventq.hh"
442522SN/A
45545SN/Ausing namespace std;
462489SN/A
472489SN/Anamespace SimClock {
482489SN/A/// The simulated frequency of curTick(). (In ticks per second)
492489SN/ATick Frequency;
502489SN/A
513090Sstever@eecs.umich.edunamespace Float {
523090Sstever@eecs.umich.edudouble s;
532914Ssaidi@eecs.umich.edudouble ms;
54545SN/Adouble us;
55545SN/Adouble ns;
562489SN/Adouble ps;
572384SN/A
582384SN/Adouble Hz;
593349Sbinkertn@umich.edudouble kHz;
602384SN/Adouble MHz;
613090Sstever@eecs.umich.edudouble GHz;
624475Sstever@eecs.umich.edu} // namespace Float
632384SN/A
642384SN/Anamespace Int {
653091Sstever@eecs.umich.eduTick s;
662901Ssaidi@eecs.umich.eduTick ms;
672384SN/ATick us;
682384SN/ATick ns;
692565SN/ATick ps;
702384SN/A} // namespace Float
712384SN/A
722384SN/A} // namespace SimClock
732784Ssaidi@eecs.umich.edu
742784Ssaidi@eecs.umich.edunamespace {
752784Ssaidi@eecs.umich.edu
762784Ssaidi@eecs.umich.edubool _clockFrequencyFixed = false;
772784Ssaidi@eecs.umich.edu
782784Ssaidi@eecs.umich.edu// Default to 1 THz (1 Tick == 1 ps)
792784Ssaidi@eecs.umich.eduTick _ticksPerSecond = 1e12;
802784Ssaidi@eecs.umich.edu
812784Ssaidi@eecs.umich.edu} // anonymous namespace
822784Ssaidi@eecs.umich.edu
832784Ssaidi@eecs.umich.eduvoid
842784Ssaidi@eecs.umich.edufixClockFrequency()
852784Ssaidi@eecs.umich.edu{
862784Ssaidi@eecs.umich.edu    if (_clockFrequencyFixed)
872784Ssaidi@eecs.umich.edu        return;
882784Ssaidi@eecs.umich.edu
892784Ssaidi@eecs.umich.edu    using namespace SimClock;
902784Ssaidi@eecs.umich.edu    Frequency = _ticksPerSecond;
912784Ssaidi@eecs.umich.edu    Float::s = static_cast<double>(Frequency);
922784Ssaidi@eecs.umich.edu    Float::ms = Float::s / 1.0e3;
932565SN/A    Float::us = Float::s / 1.0e6;
943349Sbinkertn@umich.edu    Float::ns = Float::s / 1.0e9;
952384SN/A    Float::ps = Float::s / 1.0e12;
962901Ssaidi@eecs.umich.edu
972565SN/A    Float::Hz  = 1.0 / Float::s;
982901Ssaidi@eecs.umich.edu    Float::kHz = 1.0 / Float::ms;
992565SN/A    Float::MHz = 1.0 / Float::us;
1002565SN/A    Float::GHz = 1.0 / Float::ns;
1012565SN/A
1022384SN/A    Int::s  = Frequency;
1032901Ssaidi@eecs.umich.edu    Int::ms = Int::s / 1000;
1042901Ssaidi@eecs.umich.edu    Int::us = Int::ms / 1000;
1052901Ssaidi@eecs.umich.edu    Int::ns = Int::us / 1000;
1062901Ssaidi@eecs.umich.edu    Int::ps = Int::ns / 1000;
1072901Ssaidi@eecs.umich.edu
1082901Ssaidi@eecs.umich.edu    cprintf("Global frequency set at %d ticks per second\n", _ticksPerSecond);
1092901Ssaidi@eecs.umich.edu
1104435Ssaidi@eecs.umich.edu    _clockFrequencyFixed = true;
1114435Ssaidi@eecs.umich.edu}
1124435Ssaidi@eecs.umich.edubool clockFrequencyFixed() { return _clockFrequencyFixed; }
1134435Ssaidi@eecs.umich.edu
1144435Ssaidi@eecs.umich.eduvoid
1154435Ssaidi@eecs.umich.edusetClockFrequency(Tick tps)
1164435Ssaidi@eecs.umich.edu{
1174435Ssaidi@eecs.umich.edu    panic_if(_clockFrequencyFixed,
1183349Sbinkertn@umich.edu            "Global frequency already fixed at %f ticks/s.", _ticksPerSecond);
1193349Sbinkertn@umich.edu    _ticksPerSecond = tps;
1203918Ssaidi@eecs.umich.edu}
1213349Sbinkertn@umich.eduTick getClockFrequency() { return _ticksPerSecond; }
1222384SN/A
1232384SN/Avoid
1242384SN/AsetOutputDir(const string &dir)
1252384SN/A{
1262384SN/A    simout.setDirectory(dir);
1272657Ssaidi@eecs.umich.edu}
1282384SN/A
1293090Sstever@eecs.umich.edu/**
1304475Sstever@eecs.umich.edu * Queue of C++ callbacks to invoke on simulator exit.
1314475Sstever@eecs.umich.edu */
1322384SN/Ainline CallbackQueue &
1334435Ssaidi@eecs.umich.eduexitCallbacks()
1344435Ssaidi@eecs.umich.edu{
1354435Ssaidi@eecs.umich.edu    static CallbackQueue theQueue;
1364435Ssaidi@eecs.umich.edu    return theQueue;
1374435Ssaidi@eecs.umich.edu}
1382489SN/A
1392384SN/A/**
1402901Ssaidi@eecs.umich.edu * Register an exit callback.
1412565SN/A */
1422641Sstever@eecs.umich.eduvoid
1432641Sstever@eecs.umich.eduregisterExitCallback(Callback *callback)
1442565SN/A{
1452565SN/A    exitCallbacks().add(callback);
1462384SN/A}
1474263Ssaidi@eecs.umich.edu
1482901Ssaidi@eecs.umich.edu/**
1492384SN/A * Do C++ simulator exit processing.  Exported to Python to be invoked
1502384SN/A * when simulator terminates via Python's atexit mechanism.
1512489SN/A */
1522489SN/Avoid
1532489SN/AdoExitCleanup()
1542489SN/A{
1552489SN/A    exitCallbacks().process();
1562489SN/A    exitCallbacks().clear();
1572489SN/A
1582542SN/A    cout.flush();
1592384SN/A}
1602384SN/A
1612384SN/A