root.cc revision 1695
12567SN/A/* 22567SN/A * Copyright (c) 2002-2004 The Regents of The University of Michigan 32567SN/A * All rights reserved. 42567SN/A * 52567SN/A * Redistribution and use in source and binary forms, with or without 62567SN/A * modification, are permitted provided that the following conditions are 72567SN/A * met: redistributions of source code must retain the above copyright 82567SN/A * notice, this list of conditions and the following disclaimer; 92567SN/A * redistributions in binary form must reproduce the above copyright 102567SN/A * notice, this list of conditions and the following disclaimer in the 112567SN/A * documentation and/or other materials provided with the distribution; 122567SN/A * neither the name of the copyright holders nor the names of its 132567SN/A * contributors may be used to endorse or promote products derived from 142567SN/A * this software without specific prior written permission. 152567SN/A * 162567SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172567SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182567SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192567SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202567SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212567SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222567SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232567SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242567SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252567SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262567SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu */ 282665Ssaidi@eecs.umich.edu 292567SN/A#include <cstring> 302567SN/A#include <fstream> 312567SN/A#include <list> 322567SN/A#include <string> 332567SN/A#include <vector> 342567SN/A 352567SN/A#include "base/misc.hh" 362567SN/A#include "base/output.hh" 372567SN/A#include "sim/builder.hh" 382567SN/A#include "sim/host.hh" 392567SN/A#include "sim/sim_object.hh" 404762Snate@binkert.org#include "sim/universe.hh" 412567SN/A 422567SN/Ausing namespace std; 432567SN/A 442567SN/ATick curTick = 0; 452567SN/Aostream *outputStream; 462567SN/Aostream *configStream; 474762Snate@binkert.org 482567SN/A/// The simulated frequency of curTick. (This is only here for a short time) 492650Ssaidi@eecs.umich.eduTick ticksPerSecond; 502567SN/A 512567SN/Anamespace Clock { 522567SN/A/// The simulated frequency of curTick. (In ticks per second) 532567SN/ATick Frequency; 542567SN/A 552567SN/Anamespace Float { 562567SN/Adouble s; 572567SN/Adouble ms; 582567SN/Adouble us; 592567SN/Adouble ns; 602567SN/Adouble ps; 612567SN/A 622567SN/Adouble Hz; 632567SN/Adouble kHz; 642567SN/Adouble MHz; 652567SN/Adouble GHZ; 662567SN/A/* namespace Float */ } 673745Sgblack@eecs.umich.edu 683745Sgblack@eecs.umich.edunamespace Int { 693745Sgblack@eecs.umich.eduTick s; 703745Sgblack@eecs.umich.eduTick ms; 713745Sgblack@eecs.umich.eduTick us; 723745Sgblack@eecs.umich.eduTick ns; 733745Sgblack@eecs.umich.eduTick ps; 743745Sgblack@eecs.umich.edu/* namespace Float */ } 753745Sgblack@eecs.umich.edu 762567SN/A/* namespace Clock */ } 772567SN/A 782567SN/A 792567SN/A// Dummy Object 802567SN/Aclass Root : public SimObject 812567SN/A{ 822567SN/A public: 832567SN/A Root(const std::string &name) : SimObject(name) {} 842567SN/A}; 853745Sgblack@eecs.umich.edu 863745Sgblack@eecs.umich.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(Root) 873745Sgblack@eecs.umich.edu 883745Sgblack@eecs.umich.edu Param<Tick> clock; 893745Sgblack@eecs.umich.edu Param<string> output_file; 903745Sgblack@eecs.umich.edu 913745Sgblack@eecs.umich.eduEND_DECLARE_SIM_OBJECT_PARAMS(Root) 923745Sgblack@eecs.umich.edu 933745Sgblack@eecs.umich.eduBEGIN_INIT_SIM_OBJECT_PARAMS(Root) 942650Ssaidi@eecs.umich.edu 952650Ssaidi@eecs.umich.edu INIT_PARAM(clock, "tick frequency"), 962650Ssaidi@eecs.umich.edu INIT_PARAM(output_file, "file to dump simulator output to") 973584Ssaidi@eecs.umich.edu 983584Ssaidi@eecs.umich.eduEND_INIT_SIM_OBJECT_PARAMS(Root) 993584Ssaidi@eecs.umich.edu 1003745Sgblack@eecs.umich.eduCREATE_SIM_OBJECT(Root) 1013745Sgblack@eecs.umich.edu{ 1023745Sgblack@eecs.umich.edu static bool created = false; 1033745Sgblack@eecs.umich.edu if (created) 1043745Sgblack@eecs.umich.edu panic("only one root object allowed!"); 1053745Sgblack@eecs.umich.edu 1063745Sgblack@eecs.umich.edu created = true; 1073745Sgblack@eecs.umich.edu 1083745Sgblack@eecs.umich.edu outputStream = simout.find(output_file); 1092567SN/A Root *root = new Root(getInstanceName()); 1102567SN/A 1112567SN/A using namespace Clock; 1122567SN/A Frequency = clock; 1132567SN/A Float::s = static_cast<double>(Frequency); 1143853Sgblack@eecs.umich.edu Float::ms = Float::s / 1.0e3; 1152567SN/A Float::us = Float::s / 1.0e6; 1162567SN/A Float::ns = Float::s / 1.0e9; 1172567SN/A Float::ps = Float::s / 1.0e12; 1182567SN/A 1192567SN/A Float::Hz = 1.0 / Float::s; 1202567SN/A Float::kHz = 1.0 / Float::ms; 1213853Sgblack@eecs.umich.edu Float::MHz = 1.0 / Float::us; 1222567SN/A Float::GHZ = 1.0 / Float::ns; 1232567SN/A 1242567SN/A Int::s = Frequency; 1252567SN/A Int::ms = Int::s / 1000; 1262567SN/A Int::us = Int::ms / 1000; 1272567SN/A Int::ns = Int::us / 1000; 1283853Sgblack@eecs.umich.edu Int::ps = Int::ns / 1000; 1292567SN/A 1302567SN/A return root; 1312567SN/A} 1322567SN/A 1333553Sgblack@eecs.umich.eduREGISTER_SIM_OBJECT("Root", Root) 1343553Sgblack@eecs.umich.edu