|  | /* Copyright (c) 2012 Massachusetts Institute of Technology | 
|  | * | 
|  | * Permission is hereby granted, free of charge, to any person obtaining a copy | 
|  | * of this software and associated documentation files (the "Software"), to deal | 
|  | * in the Software without restriction, including without limitation the rights | 
|  | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|  | * copies of the Software, and to permit persons to whom the Software is | 
|  | * furnished to do so, subject to the following conditions: | 
|  | * | 
|  | * The above copyright notice and this permission notice shall be included in | 
|  | * all copies or substantial portions of the Software. | 
|  | * | 
|  | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|  | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|  | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
|  | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|  | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|  | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
|  | * THE SOFTWARE. | 
|  | */ | 
|  |  | 
|  | #ifndef __DSENT_MODEL_MODEL_H__ | 
|  | #define __DSENT_MODEL_MODEL_H__ | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "util/CommonType.h" | 
|  |  | 
|  | namespace DSENT | 
|  | { | 
|  | using std::vector; | 
|  |  | 
|  | class TechModel; | 
|  | class Result; | 
|  |  | 
|  | // Base class for all the models | 
|  | class Model | 
|  | { | 
|  | protected: | 
|  | class SubModel | 
|  | { | 
|  | public: | 
|  | SubModel(Model* model_, double num_models_); | 
|  | ~SubModel(); | 
|  |  | 
|  | public: | 
|  | Model* getModel(); | 
|  | const Model* getModel() const; | 
|  | double getNumModels() const; | 
|  |  | 
|  | SubModel* clone() const; | 
|  |  | 
|  | protected: | 
|  | SubModel(const SubModel& sub_model_); | 
|  |  | 
|  | private: | 
|  | // Pointer to the actual model instance | 
|  | Model* m_model_; | 
|  | // Number of models are added | 
|  | double m_num_models_; | 
|  | }; | 
|  |  | 
|  | public: | 
|  | // Model Constants | 
|  | static const char TYPE_SEPARATOR[]; | 
|  | static const char HIERARCHY_SEPARATOR[]; | 
|  | static const char SUBFIELD_SEPARATOR[]; | 
|  | static const char DETAIL_SEPARATOR[]; | 
|  |  | 
|  | public: | 
|  | Model(const String& instance_name_, const TechModel* tech_model_); | 
|  | virtual ~Model(); | 
|  |  | 
|  | public: | 
|  | // Set the name of this instance | 
|  | void setInstanceName(const String& instance_name_); | 
|  | // Get the name of this instance | 
|  | const String& getInstanceName() const; | 
|  |  | 
|  | // Set if the model is the top model | 
|  | void setIsTopModel(bool is_top_model_); | 
|  | bool getIsTopModel() const; | 
|  |  | 
|  | // Add a parameter name (with and without default) | 
|  | void addParameterName(const String& parameter_name_); | 
|  | void addParameterName(const String& parameter_name_, const String& parameter_default_); | 
|  | const vector<String>* getParameterNames() const; | 
|  |  | 
|  | // Add a property name | 
|  | void addPropertyName(const String& property_name_); | 
|  | void addPropertyName(const String& property_name_, const String& property_default_); | 
|  | const vector<String>* getPropertyNames() const; | 
|  |  | 
|  | // Check if all parameters needed exist in the m_parameters_ | 
|  | void checkParameters() const; | 
|  | // Check if all properties needed exist in the m_properties_ | 
|  | void checkProperties() const; | 
|  |  | 
|  | // Get the pointer to parameters | 
|  | const ParameterMap* getParameters() const; | 
|  | const String getParameter(const String& parameter_name_) const; | 
|  | void setParameter(const String& parameter_name_, const String& parameter_value_); | 
|  |  | 
|  | // Get the pointer to properties | 
|  | const PropertyMap* getProperties() const; | 
|  | const String getProperty(const String& property_name_) const; | 
|  | void setProperty(const String& property_name_, const String& property_value_); | 
|  |  | 
|  | // Get the pointer to generated properties | 
|  | PropertyMap* getGenProperties(); | 
|  | const PropertyMap* getGenProperties() const; | 
|  |  | 
|  | // Add an instance to this model. num_sub_instances_ specifies the | 
|  | // number of the same instance is added. | 
|  | void addSubInstances(Model* sub_instance_, double num_sub_instances_); | 
|  | // Get an instance by name. | 
|  | Model* getSubInstance(const String& sub_instance_name_); | 
|  | const Model* getSubInstance(const String& sub_instance_name_) const; | 
|  | // Check if an instance exists | 
|  | bool hasSubInstance(const String& sub_instance_name_) const; | 
|  |  | 
|  | // Add a new area | 
|  | void addAreaResult(Result* area_); | 
|  | // Get the pointer to an area. The area is specified by name. | 
|  | Result* getAreaResult(const String& area_name_); | 
|  | const Result* getAreaResult(const String& area_name_) const; | 
|  | // Check if an area exists | 
|  | bool hasAreaResult(const String& area_name_) const; | 
|  |  | 
|  | // Add a new ndd_power | 
|  | void addNddPowerResult(Result* ndd_power_); | 
|  | // Get the pointer to an ndd_power. The ndd_power is specified by name. | 
|  | Result* getNddPowerResult(const String& ndd_power_name_); | 
|  | const Result* getNddPowerResult(const String& ndd_power_name_) const; | 
|  | // Check if a ndd_power exists | 
|  | bool hasNddPowerResult(const String& ndd_power_name_) const; | 
|  |  | 
|  | // Add a new event | 
|  | void addEventResult(Result* event_); | 
|  | // Get the pointer to an event. The event is specified by name. | 
|  | Result* getEventResult(const String& event_name_); | 
|  | const Result* getEventResult(const String& event_name_) const; | 
|  | // Check if an event exists | 
|  | bool hasEventResult(const String& event_name_) const; | 
|  |  | 
|  | // Get the pointer to the TechModel. | 
|  | const TechModel* getTechModel() const; | 
|  |  | 
|  | // Clone and return a new instance | 
|  | virtual Model* clone() const; | 
|  |  | 
|  | // Checks to make sure all required parameters are present, makes sure that the model | 
|  | // has not been constructed yet, and calls constructModel. This function is not meant | 
|  | // to be overwritten by child classes; constructModel should be overwritten instead | 
|  | void construct(); | 
|  | // Update checks whether the model needs updating, whether all properties have been specified, | 
|  | // and calls updateModel if update is necessary. This function is not meant | 
|  | // to be overwritten by child classes; updateModel should be overwritten instead | 
|  | void update(); | 
|  | // Evaluate checks whether the model needs to be evaluated. Note that this function is | 
|  | // not meant to be overwritten by child classes; evaluateModel should be overwritten | 
|  | // instead | 
|  | void evaluate(); | 
|  | void use(const String& event_name_); | 
|  | void use(); | 
|  |  | 
|  | // Resolve query hierarchy and process query | 
|  | const void* parseQuery(const String& query_type_, const String& query_hier_, const String& query_sub_field_); | 
|  | // Process the query | 
|  | virtual const void* processQuery(const String& query_type_, const String& query_sub_field_); | 
|  |  | 
|  | // Print hierarchically | 
|  | void printHierarchy(const String& query_type_, const String& query_sub_field_, const String& prepend_str_, int detail_level_, ostream& ost_) const; | 
|  | void printInstHierarchy(const String& prepend_str_, int detail_level_, ostream& ost_) const; | 
|  |  | 
|  | protected: | 
|  | // Query area | 
|  | const Result* queryArea(const String& area_name_) const; | 
|  | // Query non-data-dependent power | 
|  | const Result* queryNddPower(const String& ndd_power_name_); | 
|  | // Query event energy cost | 
|  | const Result* queryEventEnergyCost(const String& event_name_); | 
|  |  | 
|  | // Constructs the model | 
|  | virtual void constructModel() = 0; | 
|  | // Updates timing related information of the model | 
|  | virtual void updateModel(); | 
|  | // Evaluate non data dependent power of the model | 
|  | virtual void evaluateModel(); | 
|  | virtual void useModel(const String& event_name_); | 
|  | virtual void useModel(); | 
|  |  | 
|  | private: | 
|  | // Private copy constructor. Use clone to perform copy operation. | 
|  | Model(const Model& model_); | 
|  |  | 
|  | private: | 
|  | // Name of this instance | 
|  | String m_instance_name_; | 
|  | // Set if this model is the top model | 
|  | bool m_is_top_model_; | 
|  |  | 
|  | // Contains the parameters of a model | 
|  | // Parameters are needed in order to constructModel() and CANNOT be | 
|  | // changed after constructModel() has been called | 
|  | ParameterMap* m_parameters_; | 
|  | // Contains the names of all model parameters | 
|  | vector<String>* m_parameter_names_; | 
|  | // Contains the properties of a model | 
|  | // Properties are required in order to updateModel() and CAN be | 
|  | // changed be changed after constructModel(). Call updateModel() | 
|  | // after properties have been changed to use the new properties | 
|  | PropertyMap* m_properties_; | 
|  | // Contains the property names needed to update the model | 
|  | vector<String>* m_property_names_; | 
|  | // Contains generated properties of the model | 
|  | // Generated properties are used mostly as a scratch space for | 
|  | // variables used in the model that must be passed from one | 
|  | // function to another | 
|  | PropertyMap* m_generated_properties_; | 
|  |  | 
|  | // Contains the instances of this model | 
|  | Map<SubModel*>* m_sub_instances_; | 
|  | // Contains the area resulst of a model | 
|  | Map<Result*>* m_area_map_; | 
|  | // Contains the noo power results of a model | 
|  | Map<Result*>* m_ndd_power_map_; | 
|  | // Contains the event results of a model | 
|  | Map<Result*>* m_event_map_; | 
|  | // Pointer to a TechModel which contains the technology information | 
|  | const TechModel* m_tech_model_; | 
|  |  | 
|  | // Set when a model is constructed | 
|  | bool m_constructed_; | 
|  | // Set when a model is updated | 
|  | bool m_updated_; | 
|  | // Set when a model is evaluated | 
|  | bool m_evaluated_; | 
|  |  | 
|  | }; // class Model | 
|  | } // namespace DSENT | 
|  |  | 
|  | #endif // __DSENT_MODEL_MODEL_H__ | 
|  |  |