| /* | |
| * Copyright (c) 2016, Dresden University of Technology (TU Dresden) | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are | |
| * met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * | |
| * 2. Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * 3. Neither the name of the copyright holder nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
| * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER | |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * Authors: Christian Menard | |
| */ | |
| #include <iostream> | |
| #include <sstream> | |
| #include "cli_parser.hh" | |
| #include "sim/cxx_manager.hh" | |
| void | |
| CliParser::usage(const std::string& prog_name) | |
| { | |
| std::cerr | |
| << "Usage: " << prog_name | |
| << (" <config_file.ini> [ <option> ]\n\n" | |
| "OPTIONS:\n" | |
| " -o <offset> -- set memory offset\n" | |
| " -d <flag> -- set a gem5 debug flag\n" | |
| " (-<flag> clears a flag)\n" | |
| " -v -- verbose output\n" | |
| " -e <ticks> -- end of simulation after a \n" | |
| " given number of ticks\n" | |
| "\n"); | |
| std::exit(EXIT_FAILURE); | |
| } | |
| void | |
| CliParser::parse(int argc, char** argv) | |
| { | |
| std::string prog_name(argv[0]); | |
| unsigned int arg_ptr = 1; | |
| if (argc == 1) { | |
| usage(prog_name); | |
| } | |
| configFile = std::string(argv[arg_ptr]); | |
| arg_ptr++; | |
| // default values | |
| verboseFlag = false; | |
| simulationEnd = 0; | |
| memoryOffset = 0; | |
| try { | |
| while (arg_ptr < argc) { | |
| std::string option(argv[arg_ptr]); | |
| arg_ptr++; | |
| unsigned num_args = argc - arg_ptr; | |
| if (option == "-d") { | |
| if (num_args < 1) { | |
| usage(prog_name); | |
| } | |
| std::string flag(argv[arg_ptr]); | |
| arg_ptr++; | |
| debugFlags.push_back(flag); | |
| } else if (option == "-e") { | |
| if (num_args < 1) { | |
| usage(prog_name); | |
| } | |
| std::istringstream(argv[arg_ptr]) >> simulationEnd; | |
| arg_ptr++; | |
| } else if (option == "-v") { | |
| verboseFlag = true; | |
| } else if (option == "-o") { | |
| if (num_args < 1) { | |
| usage(prog_name); | |
| } | |
| std::istringstream(argv[arg_ptr]) >> memoryOffset; | |
| arg_ptr++; | |
| /* code */ | |
| } else { | |
| usage(prog_name); | |
| } | |
| } | |
| } catch (CxxConfigManager::Exception &e) { | |
| std::cerr << e.name << ": " << e.message << "\n"; | |
| std::exit(EXIT_FAILURE); | |
| } | |
| parsed = true; | |
| } | |
| std::string | |
| CliParser::getDebugFlags() | |
| { | |
| std::stringstream ss; | |
| for (auto& flag : debugFlags) { | |
| ss << flag << ' '; | |
| } | |
| return ss.str(); | |
| } |