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