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 "sim/sim_object.hh" 6110458Sandreas.hansson@arm.com 6210458Sandreas.hansson@arm.comclass CxxConfigParams; 6310458Sandreas.hansson@arm.com 6410458Sandreas.hansson@arm.com/** Config details entry for a SimObject. Instances of this class contain 6510458Sandreas.hansson@arm.com * enough configuration layout information to popular a ...Param structure 6610458Sandreas.hansson@arm.com * and build a SimObject from it with the help of the 'set' functions in 6710458Sandreas.hansson@arm.com * each ...Param class */ 6810458Sandreas.hansson@arm.comclass CxxConfigDirectoryEntry 6910458Sandreas.hansson@arm.com{ 7010458Sandreas.hansson@arm.com public: 7110458Sandreas.hansson@arm.com /* Class to represent parameters and SimObject references within 7210458Sandreas.hansson@arm.com * SimObjects */ 7310458Sandreas.hansson@arm.com class ParamDesc 7410458Sandreas.hansson@arm.com { 7510458Sandreas.hansson@arm.com public: 7610458Sandreas.hansson@arm.com const std::string name; 7710458Sandreas.hansson@arm.com 7810458Sandreas.hansson@arm.com /* Is this a vector or singleton parameters/SimObject */ 7910458Sandreas.hansson@arm.com const bool isVector; 8010458Sandreas.hansson@arm.com 8110458Sandreas.hansson@arm.com /** Is this a SimObject, and so is to be set with setSimObject... 8210458Sandreas.hansson@arm.com * or another from-string parameter set with setParam... */ 8310458Sandreas.hansson@arm.com const bool isSimObject; 8410458Sandreas.hansson@arm.com 8510458Sandreas.hansson@arm.com ParamDesc(const std::string &name_, 8610458Sandreas.hansson@arm.com bool isVector_, bool isSimObject_) : 8710458Sandreas.hansson@arm.com name(name_), isVector(isVector_), isSimObject(isSimObject_) 8810458Sandreas.hansson@arm.com { } 8910458Sandreas.hansson@arm.com }; 9010458Sandreas.hansson@arm.com 9110458Sandreas.hansson@arm.com /** Similar to ParamDesc to describe ports */ 9210458Sandreas.hansson@arm.com class PortDesc 9310458Sandreas.hansson@arm.com { 9410458Sandreas.hansson@arm.com public: 9510458Sandreas.hansson@arm.com const std::string name; 9610458Sandreas.hansson@arm.com 9710458Sandreas.hansson@arm.com /* Is this a vector or singleton parameters/SimObject */ 9810458Sandreas.hansson@arm.com const bool isVector; 9910458Sandreas.hansson@arm.com 10010458Sandreas.hansson@arm.com /** Is this a master or slave port */ 10110458Sandreas.hansson@arm.com const bool isMaster; 10210458Sandreas.hansson@arm.com 10310458Sandreas.hansson@arm.com PortDesc(const std::string &name_, 10410458Sandreas.hansson@arm.com bool isVector_, bool isMaster_) : 10510458Sandreas.hansson@arm.com name(name_), isVector(isVector_), isMaster(isMaster_) 10610458Sandreas.hansson@arm.com { } 10710458Sandreas.hansson@arm.com }; 10810458Sandreas.hansson@arm.com 10910458Sandreas.hansson@arm.com /** All parameters (including SimObjects) in order */ 11010458Sandreas.hansson@arm.com std::map<std::string, ParamDesc *> parameters; 11110458Sandreas.hansson@arm.com 11210458Sandreas.hansson@arm.com /** Ports */ 11310458Sandreas.hansson@arm.com std::map<std::string, PortDesc *> ports; 11410458Sandreas.hansson@arm.com 11510458Sandreas.hansson@arm.com /** Make a ...Param structure for the SimObject class of this entry */ 11610458Sandreas.hansson@arm.com virtual CxxConfigParams *makeParamsObject() const { return NULL; } 11710458Sandreas.hansson@arm.com 11810458Sandreas.hansson@arm.com virtual ~CxxConfigDirectoryEntry() { } 11910458Sandreas.hansson@arm.com}; 12010458Sandreas.hansson@arm.com 12110458Sandreas.hansson@arm.com/** Base for peer classes of SimObjectParams derived classes with parameter 12210458Sandreas.hansson@arm.com * modifying member functions. C++ configuration will offer objects of 12310458Sandreas.hansson@arm.com * these classes to SimObjects as params rather than SimObjectParams 12410458Sandreas.hansson@arm.com * objects */ 12510458Sandreas.hansson@arm.comclass CxxConfigParams 12610458Sandreas.hansson@arm.com{ 12710458Sandreas.hansson@arm.com private: 12810458Sandreas.hansson@arm.com static const std::string invalidName; 12910458Sandreas.hansson@arm.com 13010458Sandreas.hansson@arm.com public: 13110458Sandreas.hansson@arm.com /** Flags passable to setParam... to smooth over any parsing difference 13210458Sandreas.hansson@arm.com * between different config files */ 13310458Sandreas.hansson@arm.com typedef uint32_t FlagsType; 13410458Sandreas.hansson@arm.com typedef ::Flags<FlagsType> Flags; 13510458Sandreas.hansson@arm.com 13610458Sandreas.hansson@arm.com /** Example flag */ 13710458Sandreas.hansson@arm.com /* static const FlagsType MY_NEW_FLAG = 0x00000001; */ 13810458Sandreas.hansson@arm.com 13910458Sandreas.hansson@arm.com public: 14010458Sandreas.hansson@arm.com /** Set future object's full path name */ 14110458Sandreas.hansson@arm.com virtual void setName(const std::string &name_) { } 14210458Sandreas.hansson@arm.com 14310458Sandreas.hansson@arm.com /** Get full path name string */ 14410458Sandreas.hansson@arm.com virtual const std::string &getName() { return invalidName; } 14510458Sandreas.hansson@arm.com 14610458Sandreas.hansson@arm.com /** Set a SimObject valued parameter with a reference to the given 14710458Sandreas.hansson@arm.com * SimObject. This will return false if the parameter name is not 14810458Sandreas.hansson@arm.com * valid or the object is of the wrong type */ 14910458Sandreas.hansson@arm.com virtual bool setSimObject(const std::string &name, 15010458Sandreas.hansson@arm.com SimObject *simObject) 15110458Sandreas.hansson@arm.com { return false; } 15210458Sandreas.hansson@arm.com 15310458Sandreas.hansson@arm.com /** As setSimObjectVector but set a whole vector of references */ 15410458Sandreas.hansson@arm.com virtual bool setSimObjectVector(const std::string &name, 15510458Sandreas.hansson@arm.com const std::vector<SimObject *> &simObjects) 15610458Sandreas.hansson@arm.com { return false; } 15710458Sandreas.hansson@arm.com 15810458Sandreas.hansson@arm.com /** Set a parameter with a value parsed from the given string. The 15910458Sandreas.hansson@arm.com * parsing regime matches the format of .ini config files. Returns 16010458Sandreas.hansson@arm.com * false if the parameter name is not valid or the string cannot be 16110458Sandreas.hansson@arm.com * parsed as the type of the parameter */ 16210458Sandreas.hansson@arm.com virtual bool setParam(const std::string &name, 16310458Sandreas.hansson@arm.com const std::string &value, const Flags flags) 16410458Sandreas.hansson@arm.com { return false; } 16510458Sandreas.hansson@arm.com 16610458Sandreas.hansson@arm.com /** As setParamVector but for parameters given as vectors pre-separated 16710458Sandreas.hansson@arm.com * into elements */ 16810458Sandreas.hansson@arm.com virtual bool setParamVector(const std::string &name, 16910458Sandreas.hansson@arm.com const std::vector<std::string> &values, const Flags flags) 17010458Sandreas.hansson@arm.com { return false; } 17110458Sandreas.hansson@arm.com 17210458Sandreas.hansson@arm.com /** Set the number of connections expected for the named port. Returns 17310458Sandreas.hansson@arm.com * false if the port name is not valid */ 17410458Sandreas.hansson@arm.com virtual bool setPortConnectionCount(const std::string &name, 17510458Sandreas.hansson@arm.com unsigned int count) 17610458Sandreas.hansson@arm.com { return false; } 17710458Sandreas.hansson@arm.com 17810458Sandreas.hansson@arm.com /** Create the associated SimObject */ 17910458Sandreas.hansson@arm.com virtual SimObject *simObjectCreate() { return NULL; } 18010458Sandreas.hansson@arm.com 18110458Sandreas.hansson@arm.com CxxConfigParams() { } 18210458Sandreas.hansson@arm.com 18310458Sandreas.hansson@arm.com virtual ~CxxConfigParams() { } 18410458Sandreas.hansson@arm.com}; 18510458Sandreas.hansson@arm.com 18610458Sandreas.hansson@arm.com/** Config file wrapper providing a common interface to CxxConfigManager */ 18710458Sandreas.hansson@arm.comclass CxxConfigFileBase 18810458Sandreas.hansson@arm.com{ 18910458Sandreas.hansson@arm.com public: 19010458Sandreas.hansson@arm.com CxxConfigFileBase() { } 19110458Sandreas.hansson@arm.com virtual ~CxxConfigFileBase() { } 19210458Sandreas.hansson@arm.com 19310458Sandreas.hansson@arm.com /** Get a single parameter value as a string returned in value. 19410458Sandreas.hansson@arm.com * For booleans, the function expects "true" or "false" in value. 19510458Sandreas.hansson@arm.com * For NULL SimObjects, it expects "Null" */ 19610458Sandreas.hansson@arm.com virtual bool getParam(const std::string &object_name, 19710458Sandreas.hansson@arm.com const std::string ¶m_name, 19810458Sandreas.hansson@arm.com std::string &value) const = 0; 19910458Sandreas.hansson@arm.com 20010458Sandreas.hansson@arm.com /** Get a list/vector parameter */ 20110458Sandreas.hansson@arm.com virtual bool getParamVector(const std::string &object_name, 20210458Sandreas.hansson@arm.com const std::string ¶m_name, 20310458Sandreas.hansson@arm.com std::vector<std::string> &values) const = 0; 20410458Sandreas.hansson@arm.com 20510458Sandreas.hansson@arm.com /** Get the peer (connected) ports of the named ports */ 20610458Sandreas.hansson@arm.com virtual bool getPortPeers(const std::string &object_name, 20710458Sandreas.hansson@arm.com const std::string &port_name, 20810458Sandreas.hansson@arm.com std::vector<std::string> &peers) const = 0; 20910458Sandreas.hansson@arm.com 21010458Sandreas.hansson@arm.com /** Does an object with this path exist? */ 21110458Sandreas.hansson@arm.com virtual bool objectExists(const std::string &object_name) const = 0; 21210458Sandreas.hansson@arm.com 21310458Sandreas.hansson@arm.com /** Get all SimObjects in the config */ 21410458Sandreas.hansson@arm.com virtual void getAllObjectNames(std::vector<std::string> &list) const = 0; 21510458Sandreas.hansson@arm.com 21610458Sandreas.hansson@arm.com /** Get the names or paths of all the children SimObjects of this 21710458Sandreas.hansson@arm.com * SimObject. If return_paths is true then full paths are returned. 21810458Sandreas.hansson@arm.com * If false, only the last name component for each object is returned */ 21910458Sandreas.hansson@arm.com virtual void getObjectChildren(const std::string &object_name, 22010458Sandreas.hansson@arm.com std::vector<std::string> &children, 22110458Sandreas.hansson@arm.com bool return_paths = false) const = 0; 22210458Sandreas.hansson@arm.com 22310458Sandreas.hansson@arm.com /** Load config file */ 22410458Sandreas.hansson@arm.com virtual bool load(const std::string &filename) = 0; 22510458Sandreas.hansson@arm.com 22610458Sandreas.hansson@arm.com /** Get the flags which should be used to modify parameter parsing 22710458Sandreas.hansson@arm.com * behaviour */ 22810458Sandreas.hansson@arm.com virtual CxxConfigParams::Flags getFlags() const { return 0; } 22910458Sandreas.hansson@arm.com}; 23010458Sandreas.hansson@arm.com 23110458Sandreas.hansson@arm.com/** Directory of all SimObject classes config details */ 23210458Sandreas.hansson@arm.comextern std::map<std::string, CxxConfigDirectoryEntry *> 23310458Sandreas.hansson@arm.com cxx_config_directory; 23410458Sandreas.hansson@arm.com 23510458Sandreas.hansson@arm.com/** Initialise cxx_config_directory. This is defined in the 23610458Sandreas.hansson@arm.com * auto-generated .../cxx_config/init.cc */ 23710458Sandreas.hansson@arm.comvoid cxxConfigInit(); 23810458Sandreas.hansson@arm.com 23910458Sandreas.hansson@arm.com#endif // __SIM_CXX_CONFIG_HH__ 240