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