cxx_config.hh revision 10458
110458Sandreas.hansson@arm.com/* 210458Sandreas.hansson@arm.com * Copyright (c) 2014 ARM Limited 310458Sandreas.hansson@arm.com * All rights reserved 410458Sandreas.hansson@arm.com * 510458Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 610458Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 710458Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 810458Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 910458Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 1010458Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 1110458Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 1210458Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1310458Sandreas.hansson@arm.com * 1410458Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1510458Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 1610458Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 1710458Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 1810458Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1910458Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 2010458Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 2110458Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 2210458Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2310458Sandreas.hansson@arm.com * this software without specific prior written permission. 2410458Sandreas.hansson@arm.com * 2510458Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610458Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710458Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810458Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910458Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010458Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110458Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210458Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310458Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410458Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510458Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610458Sandreas.hansson@arm.com * 3710458Sandreas.hansson@arm.com * Authors: Andrew Bardsley 3810458Sandreas.hansson@arm.com */ 3910458Sandreas.hansson@arm.com 4010458Sandreas.hansson@arm.com/** 4110458Sandreas.hansson@arm.com * @file 4210458Sandreas.hansson@arm.com * 4310458Sandreas.hansson@arm.com * C++-only configuration and instantiation support. This allows a 4410458Sandreas.hansson@arm.com * config to be read back from a .ini and instantiated without 4510458Sandreas.hansson@arm.com * Python. Useful if you want to embed gem5 within a larger system 4610458Sandreas.hansson@arm.com * without carrying the integration cost of the fully-featured 4710458Sandreas.hansson@arm.com * configuration system. 4810458Sandreas.hansson@arm.com * 4910458Sandreas.hansson@arm.com * This file contains definitions needed to store summaries of a 5010458Sandreas.hansson@arm.com * SimObject's parameter structure 5110458Sandreas.hansson@arm.com */ 5210458Sandreas.hansson@arm.com 5310458Sandreas.hansson@arm.com#ifndef __SIM_CXX_CONFIG_HH__ 5410458Sandreas.hansson@arm.com#define __SIM_CXX_CONFIG_HH__ 5510458Sandreas.hansson@arm.com 5610458Sandreas.hansson@arm.com#include <map> 5710458Sandreas.hansson@arm.com#include <string> 5810458Sandreas.hansson@arm.com#include <vector> 5910458Sandreas.hansson@arm.com 6010458Sandreas.hansson@arm.com#include "mem/port.hh" 6110458Sandreas.hansson@arm.com#include "params/SimObject.hh" 6210458Sandreas.hansson@arm.com#include "sim/sim_object.hh" 6310458Sandreas.hansson@arm.com 6410458Sandreas.hansson@arm.comclass CxxConfigParams; 6510458Sandreas.hansson@arm.com 6610458Sandreas.hansson@arm.com/** Config details entry for a SimObject. Instances of this class contain 6710458Sandreas.hansson@arm.com * enough configuration layout information to popular a ...Param structure 6810458Sandreas.hansson@arm.com * and build a SimObject from it with the help of the 'set' functions in 6910458Sandreas.hansson@arm.com * each ...Param class */ 7010458Sandreas.hansson@arm.comclass CxxConfigDirectoryEntry 7110458Sandreas.hansson@arm.com{ 7210458Sandreas.hansson@arm.com public: 7310458Sandreas.hansson@arm.com /* Class to represent parameters and SimObject references within 7410458Sandreas.hansson@arm.com * SimObjects */ 7510458Sandreas.hansson@arm.com class ParamDesc 7610458Sandreas.hansson@arm.com { 7710458Sandreas.hansson@arm.com public: 7810458Sandreas.hansson@arm.com const std::string name; 7910458Sandreas.hansson@arm.com 8010458Sandreas.hansson@arm.com /* Is this a vector or singleton parameters/SimObject */ 8110458Sandreas.hansson@arm.com const bool isVector; 8210458Sandreas.hansson@arm.com 8310458Sandreas.hansson@arm.com /** Is this a SimObject, and so is to be set with setSimObject... 8410458Sandreas.hansson@arm.com * or another from-string parameter set with setParam... */ 8510458Sandreas.hansson@arm.com const bool isSimObject; 8610458Sandreas.hansson@arm.com 8710458Sandreas.hansson@arm.com ParamDesc(const std::string &name_, 8810458Sandreas.hansson@arm.com bool isVector_, bool isSimObject_) : 8910458Sandreas.hansson@arm.com name(name_), isVector(isVector_), isSimObject(isSimObject_) 9010458Sandreas.hansson@arm.com { } 9110458Sandreas.hansson@arm.com }; 9210458Sandreas.hansson@arm.com 9310458Sandreas.hansson@arm.com /** Similar to ParamDesc to describe ports */ 9410458Sandreas.hansson@arm.com class PortDesc 9510458Sandreas.hansson@arm.com { 9610458Sandreas.hansson@arm.com public: 9710458Sandreas.hansson@arm.com const std::string name; 9810458Sandreas.hansson@arm.com 9910458Sandreas.hansson@arm.com /* Is this a vector or singleton parameters/SimObject */ 10010458Sandreas.hansson@arm.com const bool isVector; 10110458Sandreas.hansson@arm.com 10210458Sandreas.hansson@arm.com /** Is this a master or slave port */ 10310458Sandreas.hansson@arm.com const bool isMaster; 10410458Sandreas.hansson@arm.com 10510458Sandreas.hansson@arm.com PortDesc(const std::string &name_, 10610458Sandreas.hansson@arm.com bool isVector_, bool isMaster_) : 10710458Sandreas.hansson@arm.com name(name_), isVector(isVector_), isMaster(isMaster_) 10810458Sandreas.hansson@arm.com { } 10910458Sandreas.hansson@arm.com }; 11010458Sandreas.hansson@arm.com 11110458Sandreas.hansson@arm.com /** All parameters (including SimObjects) in order */ 11210458Sandreas.hansson@arm.com std::map<std::string, ParamDesc *> parameters; 11310458Sandreas.hansson@arm.com 11410458Sandreas.hansson@arm.com /** Ports */ 11510458Sandreas.hansson@arm.com std::map<std::string, PortDesc *> ports; 11610458Sandreas.hansson@arm.com 11710458Sandreas.hansson@arm.com /** Make a ...Param structure for the SimObject class of this entry */ 11810458Sandreas.hansson@arm.com virtual CxxConfigParams *makeParamsObject() const { return NULL; } 11910458Sandreas.hansson@arm.com 12010458Sandreas.hansson@arm.com virtual ~CxxConfigDirectoryEntry() { } 12110458Sandreas.hansson@arm.com}; 12210458Sandreas.hansson@arm.com 12310458Sandreas.hansson@arm.com/** Base for peer classes of SimObjectParams derived classes with parameter 12410458Sandreas.hansson@arm.com * modifying member functions. C++ configuration will offer objects of 12510458Sandreas.hansson@arm.com * these classes to SimObjects as params rather than SimObjectParams 12610458Sandreas.hansson@arm.com * objects */ 12710458Sandreas.hansson@arm.comclass CxxConfigParams 12810458Sandreas.hansson@arm.com{ 12910458Sandreas.hansson@arm.com private: 13010458Sandreas.hansson@arm.com static const std::string invalidName; 13110458Sandreas.hansson@arm.com 13210458Sandreas.hansson@arm.com public: 13310458Sandreas.hansson@arm.com /** Flags passable to setParam... to smooth over any parsing difference 13410458Sandreas.hansson@arm.com * between different config files */ 13510458Sandreas.hansson@arm.com typedef uint32_t FlagsType; 13610458Sandreas.hansson@arm.com typedef ::Flags<FlagsType> Flags; 13710458Sandreas.hansson@arm.com 13810458Sandreas.hansson@arm.com /** Example flag */ 13910458Sandreas.hansson@arm.com /* static const FlagsType MY_NEW_FLAG = 0x00000001; */ 14010458Sandreas.hansson@arm.com 14110458Sandreas.hansson@arm.com public: 14210458Sandreas.hansson@arm.com /** Set future object's full path name */ 14310458Sandreas.hansson@arm.com virtual void setName(const std::string &name_) { } 14410458Sandreas.hansson@arm.com 14510458Sandreas.hansson@arm.com /** Get full path name string */ 14610458Sandreas.hansson@arm.com virtual const std::string &getName() { return invalidName; } 14710458Sandreas.hansson@arm.com 14810458Sandreas.hansson@arm.com /** Set a SimObject valued parameter with a reference to the given 14910458Sandreas.hansson@arm.com * SimObject. This will return false if the parameter name is not 15010458Sandreas.hansson@arm.com * valid or the object is of the wrong type */ 15110458Sandreas.hansson@arm.com virtual bool setSimObject(const std::string &name, 15210458Sandreas.hansson@arm.com SimObject *simObject) 15310458Sandreas.hansson@arm.com { return false; } 15410458Sandreas.hansson@arm.com 15510458Sandreas.hansson@arm.com /** As setSimObjectVector but set a whole vector of references */ 15610458Sandreas.hansson@arm.com virtual bool setSimObjectVector(const std::string &name, 15710458Sandreas.hansson@arm.com const std::vector<SimObject *> &simObjects) 15810458Sandreas.hansson@arm.com { return false; } 15910458Sandreas.hansson@arm.com 16010458Sandreas.hansson@arm.com /** Set a parameter with a value parsed from the given string. The 16110458Sandreas.hansson@arm.com * parsing regime matches the format of .ini config files. Returns 16210458Sandreas.hansson@arm.com * false if the parameter name is not valid or the string cannot be 16310458Sandreas.hansson@arm.com * parsed as the type of the parameter */ 16410458Sandreas.hansson@arm.com virtual bool setParam(const std::string &name, 16510458Sandreas.hansson@arm.com const std::string &value, const Flags flags) 16610458Sandreas.hansson@arm.com { return false; } 16710458Sandreas.hansson@arm.com 16810458Sandreas.hansson@arm.com /** As setParamVector but for parameters given as vectors pre-separated 16910458Sandreas.hansson@arm.com * into elements */ 17010458Sandreas.hansson@arm.com virtual bool setParamVector(const std::string &name, 17110458Sandreas.hansson@arm.com const std::vector<std::string> &values, const Flags flags) 17210458Sandreas.hansson@arm.com { return false; } 17310458Sandreas.hansson@arm.com 17410458Sandreas.hansson@arm.com /** Set the number of connections expected for the named port. Returns 17510458Sandreas.hansson@arm.com * false if the port name is not valid */ 17610458Sandreas.hansson@arm.com virtual bool setPortConnectionCount(const std::string &name, 17710458Sandreas.hansson@arm.com unsigned int count) 17810458Sandreas.hansson@arm.com { return false; } 17910458Sandreas.hansson@arm.com 18010458Sandreas.hansson@arm.com /** Create the associated SimObject */ 18110458Sandreas.hansson@arm.com virtual SimObject *simObjectCreate() { return NULL; } 18210458Sandreas.hansson@arm.com 18310458Sandreas.hansson@arm.com CxxConfigParams() { } 18410458Sandreas.hansson@arm.com 18510458Sandreas.hansson@arm.com virtual ~CxxConfigParams() { } 18610458Sandreas.hansson@arm.com}; 18710458Sandreas.hansson@arm.com 18810458Sandreas.hansson@arm.com/** Config file wrapper providing a common interface to CxxConfigManager */ 18910458Sandreas.hansson@arm.comclass CxxConfigFileBase 19010458Sandreas.hansson@arm.com{ 19110458Sandreas.hansson@arm.com public: 19210458Sandreas.hansson@arm.com CxxConfigFileBase() { } 19310458Sandreas.hansson@arm.com virtual ~CxxConfigFileBase() { } 19410458Sandreas.hansson@arm.com 19510458Sandreas.hansson@arm.com /** Get a single parameter value as a string returned in value. 19610458Sandreas.hansson@arm.com * For booleans, the function expects "true" or "false" in value. 19710458Sandreas.hansson@arm.com * For NULL SimObjects, it expects "Null" */ 19810458Sandreas.hansson@arm.com virtual bool getParam(const std::string &object_name, 19910458Sandreas.hansson@arm.com const std::string ¶m_name, 20010458Sandreas.hansson@arm.com std::string &value) const = 0; 20110458Sandreas.hansson@arm.com 20210458Sandreas.hansson@arm.com /** Get a list/vector parameter */ 20310458Sandreas.hansson@arm.com virtual bool getParamVector(const std::string &object_name, 20410458Sandreas.hansson@arm.com const std::string ¶m_name, 20510458Sandreas.hansson@arm.com std::vector<std::string> &values) const = 0; 20610458Sandreas.hansson@arm.com 20710458Sandreas.hansson@arm.com /** Get the peer (connected) ports of the named ports */ 20810458Sandreas.hansson@arm.com virtual bool getPortPeers(const std::string &object_name, 20910458Sandreas.hansson@arm.com const std::string &port_name, 21010458Sandreas.hansson@arm.com std::vector<std::string> &peers) const = 0; 21110458Sandreas.hansson@arm.com 21210458Sandreas.hansson@arm.com /** Does an object with this path exist? */ 21310458Sandreas.hansson@arm.com virtual bool objectExists(const std::string &object_name) const = 0; 21410458Sandreas.hansson@arm.com 21510458Sandreas.hansson@arm.com /** Get all SimObjects in the config */ 21610458Sandreas.hansson@arm.com virtual void getAllObjectNames(std::vector<std::string> &list) const = 0; 21710458Sandreas.hansson@arm.com 21810458Sandreas.hansson@arm.com /** Get the names or paths of all the children SimObjects of this 21910458Sandreas.hansson@arm.com * SimObject. If return_paths is true then full paths are returned. 22010458Sandreas.hansson@arm.com * If false, only the last name component for each object is returned */ 22110458Sandreas.hansson@arm.com virtual void getObjectChildren(const std::string &object_name, 22210458Sandreas.hansson@arm.com std::vector<std::string> &children, 22310458Sandreas.hansson@arm.com bool return_paths = false) const = 0; 22410458Sandreas.hansson@arm.com 22510458Sandreas.hansson@arm.com /** Load config file */ 22610458Sandreas.hansson@arm.com virtual bool load(const std::string &filename) = 0; 22710458Sandreas.hansson@arm.com 22810458Sandreas.hansson@arm.com /** Get the flags which should be used to modify parameter parsing 22910458Sandreas.hansson@arm.com * behaviour */ 23010458Sandreas.hansson@arm.com virtual CxxConfigParams::Flags getFlags() const { return 0; } 23110458Sandreas.hansson@arm.com}; 23210458Sandreas.hansson@arm.com 23310458Sandreas.hansson@arm.com/** Directory of all SimObject classes config details */ 23410458Sandreas.hansson@arm.comextern std::map<std::string, CxxConfigDirectoryEntry *> 23510458Sandreas.hansson@arm.com cxx_config_directory; 23610458Sandreas.hansson@arm.com 23710458Sandreas.hansson@arm.com/** Initialise cxx_config_directory. This is defined in the 23810458Sandreas.hansson@arm.com * auto-generated .../cxx_config/init.cc */ 23910458Sandreas.hansson@arm.comvoid cxxConfigInit(); 24010458Sandreas.hansson@arm.com 24110458Sandreas.hansson@arm.com#endif // __SIM_CXX_CONFIG_HH__ 242