cxx_config.hh revision 10458:64809024b924
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2014 ARM Limited 311308Santhony.gutierrez@amd.com * All rights reserved 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * The license below extends only to copyright in the software and shall 611308Santhony.gutierrez@amd.com * not be construed as granting a license to any other intellectual 711308Santhony.gutierrez@amd.com * property including but not limited to intellectual property relating 811308Santhony.gutierrez@amd.com * to a hardware implementation of the functionality of the software 911308Santhony.gutierrez@amd.com * licensed hereunder. You may use the software subject to the license 1011308Santhony.gutierrez@amd.com * terms below provided that you ensure that this notice is replicated 1111308Santhony.gutierrez@amd.com * unmodified and in its entirety in all distributions of the software, 1211308Santhony.gutierrez@amd.com * modified or unmodified, in source code or in binary form. 1311308Santhony.gutierrez@amd.com * 1411308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 1511308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 1611308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 1711308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 1811308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1911308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 2011308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 2111308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 2211308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 2311308Santhony.gutierrez@amd.com * this software without specific prior written permission. 2411308Santhony.gutierrez@amd.com * 2511308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2611308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2711308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2811308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2911308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3011308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3111308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3211308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3311308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3411308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3511308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3611308Santhony.gutierrez@amd.com * 3711308Santhony.gutierrez@amd.com * Authors: Andrew Bardsley 3811308Santhony.gutierrez@amd.com */ 3911308Santhony.gutierrez@amd.com 4011308Santhony.gutierrez@amd.com/** 4111308Santhony.gutierrez@amd.com * @file 4211308Santhony.gutierrez@amd.com * 4311308Santhony.gutierrez@amd.com * C++-only configuration and instantiation support. This allows a 4411308Santhony.gutierrez@amd.com * config to be read back from a .ini and instantiated without 4511308Santhony.gutierrez@amd.com * Python. Useful if you want to embed gem5 within a larger system 4611308Santhony.gutierrez@amd.com * without carrying the integration cost of the fully-featured 4711308Santhony.gutierrez@amd.com * configuration system. 4811308Santhony.gutierrez@amd.com * 4911308Santhony.gutierrez@amd.com * This file contains definitions needed to store summaries of a 5011308Santhony.gutierrez@amd.com * SimObject's parameter structure 5111308Santhony.gutierrez@amd.com */ 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.com#ifndef __SIM_CXX_CONFIG_HH__ 5411308Santhony.gutierrez@amd.com#define __SIM_CXX_CONFIG_HH__ 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.com#include <map> 5711308Santhony.gutierrez@amd.com#include <string> 5811308Santhony.gutierrez@amd.com#include <vector> 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com#include "mem/port.hh" 6111308Santhony.gutierrez@amd.com#include "params/SimObject.hh" 6211308Santhony.gutierrez@amd.com#include "sim/sim_object.hh" 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.comclass CxxConfigParams; 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.com/** Config details entry for a SimObject. Instances of this class contain 6711308Santhony.gutierrez@amd.com * enough configuration layout information to popular a ...Param structure 6811308Santhony.gutierrez@amd.com * and build a SimObject from it with the help of the 'set' functions in 6911308Santhony.gutierrez@amd.com * each ...Param class */ 7011308Santhony.gutierrez@amd.comclass CxxConfigDirectoryEntry 7111308Santhony.gutierrez@amd.com{ 7211308Santhony.gutierrez@amd.com public: 7311308Santhony.gutierrez@amd.com /* Class to represent parameters and SimObject references within 7411308Santhony.gutierrez@amd.com * SimObjects */ 75 class ParamDesc 76 { 77 public: 78 const std::string name; 79 80 /* Is this a vector or singleton parameters/SimObject */ 81 const bool isVector; 82 83 /** Is this a SimObject, and so is to be set with setSimObject... 84 * or another from-string parameter set with setParam... */ 85 const bool isSimObject; 86 87 ParamDesc(const std::string &name_, 88 bool isVector_, bool isSimObject_) : 89 name(name_), isVector(isVector_), isSimObject(isSimObject_) 90 { } 91 }; 92 93 /** Similar to ParamDesc to describe ports */ 94 class PortDesc 95 { 96 public: 97 const std::string name; 98 99 /* Is this a vector or singleton parameters/SimObject */ 100 const bool isVector; 101 102 /** Is this a master or slave port */ 103 const bool isMaster; 104 105 PortDesc(const std::string &name_, 106 bool isVector_, bool isMaster_) : 107 name(name_), isVector(isVector_), isMaster(isMaster_) 108 { } 109 }; 110 111 /** All parameters (including SimObjects) in order */ 112 std::map<std::string, ParamDesc *> parameters; 113 114 /** Ports */ 115 std::map<std::string, PortDesc *> ports; 116 117 /** Make a ...Param structure for the SimObject class of this entry */ 118 virtual CxxConfigParams *makeParamsObject() const { return NULL; } 119 120 virtual ~CxxConfigDirectoryEntry() { } 121}; 122 123/** Base for peer classes of SimObjectParams derived classes with parameter 124 * modifying member functions. C++ configuration will offer objects of 125 * these classes to SimObjects as params rather than SimObjectParams 126 * objects */ 127class CxxConfigParams 128{ 129 private: 130 static const std::string invalidName; 131 132 public: 133 /** Flags passable to setParam... to smooth over any parsing difference 134 * between different config files */ 135 typedef uint32_t FlagsType; 136 typedef ::Flags<FlagsType> Flags; 137 138 /** Example flag */ 139 /* static const FlagsType MY_NEW_FLAG = 0x00000001; */ 140 141 public: 142 /** Set future object's full path name */ 143 virtual void setName(const std::string &name_) { } 144 145 /** Get full path name string */ 146 virtual const std::string &getName() { return invalidName; } 147 148 /** Set a SimObject valued parameter with a reference to the given 149 * SimObject. This will return false if the parameter name is not 150 * valid or the object is of the wrong type */ 151 virtual bool setSimObject(const std::string &name, 152 SimObject *simObject) 153 { return false; } 154 155 /** As setSimObjectVector but set a whole vector of references */ 156 virtual bool setSimObjectVector(const std::string &name, 157 const std::vector<SimObject *> &simObjects) 158 { return false; } 159 160 /** Set a parameter with a value parsed from the given string. The 161 * parsing regime matches the format of .ini config files. Returns 162 * false if the parameter name is not valid or the string cannot be 163 * parsed as the type of the parameter */ 164 virtual bool setParam(const std::string &name, 165 const std::string &value, const Flags flags) 166 { return false; } 167 168 /** As setParamVector but for parameters given as vectors pre-separated 169 * into elements */ 170 virtual bool setParamVector(const std::string &name, 171 const std::vector<std::string> &values, const Flags flags) 172 { return false; } 173 174 /** Set the number of connections expected for the named port. Returns 175 * false if the port name is not valid */ 176 virtual bool setPortConnectionCount(const std::string &name, 177 unsigned int count) 178 { return false; } 179 180 /** Create the associated SimObject */ 181 virtual SimObject *simObjectCreate() { return NULL; } 182 183 CxxConfigParams() { } 184 185 virtual ~CxxConfigParams() { } 186}; 187 188/** Config file wrapper providing a common interface to CxxConfigManager */ 189class CxxConfigFileBase 190{ 191 public: 192 CxxConfigFileBase() { } 193 virtual ~CxxConfigFileBase() { } 194 195 /** Get a single parameter value as a string returned in value. 196 * For booleans, the function expects "true" or "false" in value. 197 * For NULL SimObjects, it expects "Null" */ 198 virtual bool getParam(const std::string &object_name, 199 const std::string ¶m_name, 200 std::string &value) const = 0; 201 202 /** Get a list/vector parameter */ 203 virtual bool getParamVector(const std::string &object_name, 204 const std::string ¶m_name, 205 std::vector<std::string> &values) const = 0; 206 207 /** Get the peer (connected) ports of the named ports */ 208 virtual bool getPortPeers(const std::string &object_name, 209 const std::string &port_name, 210 std::vector<std::string> &peers) const = 0; 211 212 /** Does an object with this path exist? */ 213 virtual bool objectExists(const std::string &object_name) const = 0; 214 215 /** Get all SimObjects in the config */ 216 virtual void getAllObjectNames(std::vector<std::string> &list) const = 0; 217 218 /** Get the names or paths of all the children SimObjects of this 219 * SimObject. If return_paths is true then full paths are returned. 220 * If false, only the last name component for each object is returned */ 221 virtual void getObjectChildren(const std::string &object_name, 222 std::vector<std::string> &children, 223 bool return_paths = false) const = 0; 224 225 /** Load config file */ 226 virtual bool load(const std::string &filename) = 0; 227 228 /** Get the flags which should be used to modify parameter parsing 229 * behaviour */ 230 virtual CxxConfigParams::Flags getFlags() const { return 0; } 231}; 232 233/** Directory of all SimObject classes config details */ 234extern std::map<std::string, CxxConfigDirectoryEntry *> 235 cxx_config_directory; 236 237/** Initialise cxx_config_directory. This is defined in the 238 * auto-generated .../cxx_config/init.cc */ 239void cxxConfigInit(); 240 241#endif // __SIM_CXX_CONFIG_HH__ 242