root.cc revision 488
16019Shines@cs.fsu.edu/* 27093Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 37093Sgblack@eecs.umich.edu * All rights reserved. 47093Sgblack@eecs.umich.edu * 57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146019Shines@cs.fsu.edu * this software without specific prior written permission. 156019Shines@cs.fsu.edu * 166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276019Shines@cs.fsu.edu */ 286019Shines@cs.fsu.edu 296019Shines@cs.fsu.edu#include <sys/types.h> 306019Shines@cs.fsu.edu#include <sys/stat.h> 316019Shines@cs.fsu.edu 326019Shines@cs.fsu.edu#include <cstring> 336019Shines@cs.fsu.edu#include <fstream> 346019Shines@cs.fsu.edu#include <list> 356019Shines@cs.fsu.edu#include <string> 366019Shines@cs.fsu.edu#include <vector> 376019Shines@cs.fsu.edu 386019Shines@cs.fsu.edu#include "base/files.hh" 396019Shines@cs.fsu.edu#include "base/misc.hh" 407399SAli.Saidi@ARM.com#include "sim/universe.hh" 417399SAli.Saidi@ARM.com#include "sim/host.hh" 426019Shines@cs.fsu.edu#include "sim/param.hh" 436019Shines@cs.fsu.edu 446019Shines@cs.fsu.eduusing namespace std; 456019Shines@cs.fsu.edu 466019Shines@cs.fsu.eduTick curTick = 0; 476019Shines@cs.fsu.eduTick ticksPerSecond; 486116Snate@binkert.orgdouble __ticksPerMS; 496019Shines@cs.fsu.edudouble __ticksPerUS; 506019Shines@cs.fsu.edudouble __ticksPerNS; 516019Shines@cs.fsu.edu 526019Shines@cs.fsu.edustring outputDirectory; 536019Shines@cs.fsu.eduostream *outputStream; 546019Shines@cs.fsu.edu 556019Shines@cs.fsu.educlass UniverseParamContext : public ParamContext 566116Snate@binkert.org{ 576116Snate@binkert.org private: 586019Shines@cs.fsu.edu ofstream outputFile; 596019Shines@cs.fsu.edu 607406SAli.Saidi@ARM.com public: 617406SAli.Saidi@ARM.com UniverseParamContext(const string &is) : ParamContext(is) {} 627406SAli.Saidi@ARM.com void checkParams(); 637406SAli.Saidi@ARM.com}; 646019Shines@cs.fsu.edu 656019Shines@cs.fsu.eduUniverseParamContext universe("Universe"); 666019Shines@cs.fsu.edu 676019Shines@cs.fsu.eduParam<Tick> universe_freq(&universe, "frequency", "tick frequency", 687697SAli.Saidi@ARM.com 200000000); 697404SAli.Saidi@ARM.com 707404SAli.Saidi@ARM.comParam<string> universe_output_dir(&universe, "output_dir", 717404SAli.Saidi@ARM.com "directory to output data to"); 727749SAli.Saidi@ARM.comParam<string> universe_output_file(&universe, "output_file", 736019Shines@cs.fsu.edu "file to dump simulator output to"); 747404SAli.Saidi@ARM.com 757404SAli.Saidi@ARM.comvoid 767399SAli.Saidi@ARM.comUniverseParamContext::checkParams() 777406SAli.Saidi@ARM.com{ 787404SAli.Saidi@ARM.com ticksPerSecond = universe_freq; 797406SAli.Saidi@ARM.com double freq = double(ticksPerSecond); 806019Shines@cs.fsu.edu __ticksPerMS = freq / 1.0e3; 816019Shines@cs.fsu.edu __ticksPerUS = freq / 1.0e6; 826019Shines@cs.fsu.edu __ticksPerNS = freq / 1.0e9; 836019Shines@cs.fsu.edu 846019Shines@cs.fsu.edu if (universe_output_dir.isValid()) { 856019Shines@cs.fsu.edu outputDirectory = universe_output_dir; 866019Shines@cs.fsu.edu 876019Shines@cs.fsu.edu // guarantee that directory ends with a '/' 887694SAli.Saidi@ARM.com if (outputDirectory[outputDirectory.size() - 1] != '/') 897694SAli.Saidi@ARM.com outputDirectory += "/"; 907694SAli.Saidi@ARM.com 917749SAli.Saidi@ARM.com if (mkdir(outputDirectory.c_str(), 0777) < 0) { 927749SAli.Saidi@ARM.com if (errno != EEXIST) { 937749SAli.Saidi@ARM.com panic("%s\ncould not make output directory: %s\n", 947694SAli.Saidi@ARM.com strerror(errno), outputDirectory); 957694SAli.Saidi@ARM.com } 967694SAli.Saidi@ARM.com } 977694SAli.Saidi@ARM.com } 987694SAli.Saidi@ARM.com 997694SAli.Saidi@ARM.com string filename; 1007404SAli.Saidi@ARM.com if (universe_output_file.isValid()) { 1017694SAli.Saidi@ARM.com string f = universe_output_file; 1026019Shines@cs.fsu.edu if (f != "stdout" && f != "cout" && f != "stderr" && f != "cerr") 1037404SAli.Saidi@ARM.com filename = outputDirectory + f; 1047404SAli.Saidi@ARM.com else 1057404SAli.Saidi@ARM.com filename = f; 1067697SAli.Saidi@ARM.com } else { 1077404SAli.Saidi@ARM.com if (outputDirectory.empty()) 1087404SAli.Saidi@ARM.com filename = "stdout"; 1097404SAli.Saidi@ARM.com else 1107404SAli.Saidi@ARM.com filename = outputDirectory + "output.txt"; 1117404SAli.Saidi@ARM.com } 1127697SAli.Saidi@ARM.com 1137697SAli.Saidi@ARM.com if (filename == "stdout" || filename == "cout") 1147697SAli.Saidi@ARM.com outputStream = &cout; 1157697SAli.Saidi@ARM.com else if (filename == "stderr" || filename == "cerr") 1167697SAli.Saidi@ARM.com outputStream = &cerr; 1177697SAli.Saidi@ARM.com else { 1187697SAli.Saidi@ARM.com outputFile.open(filename.c_str(), ios::trunc); 1197697SAli.Saidi@ARM.com outputStream = &outputFile; 1207697SAli.Saidi@ARM.com } 1217697SAli.Saidi@ARM.com} 1227404SAli.Saidi@ARM.com