1/* Copyright (c) 2012 Massachusetts Institute of Technology 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 * copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 * THE SOFTWARE. 20 */ 21 22#ifndef __DSENT_MODEL_MODEL_H__ 23#define __DSENT_MODEL_MODEL_H__ 24 25#include <vector> 26 27#include "util/CommonType.h" 28 29namespace DSENT 30{ 31 using std::vector; 32 33 class TechModel; 34 class Result; 35 36 // Base class for all the models 37 class Model 38 { 39 protected: 40 class SubModel 41 { 42 public: 43 SubModel(Model* model_, double num_models_); 44 ~SubModel(); 45 46 public: 47 Model* getModel(); 48 const Model* getModel() const; 49 double getNumModels() const; 50 51 SubModel* clone() const; 52 53 protected: 54 SubModel(const SubModel& sub_model_); 55 56 private: 57 // Pointer to the actual model instance 58 Model* m_model_; 59 // Number of models are added 60 double m_num_models_; 61 }; 62 63 public: 64 // Model Constants 65 static const char TYPE_SEPARATOR[]; 66 static const char HIERARCHY_SEPARATOR[]; 67 static const char SUBFIELD_SEPARATOR[]; 68 static const char DETAIL_SEPARATOR[]; 69 70 public: 71 Model(const String& instance_name_, const TechModel* tech_model_); 72 virtual ~Model(); 73 74 public: 75 // Set the name of this instance 76 void setInstanceName(const String& instance_name_); 77 // Get the name of this instance 78 const String& getInstanceName() const; 79 80 // Set if the model is the top model 81 void setIsTopModel(bool is_top_model_); 82 bool getIsTopModel() const; 83 84 // Add a parameter name (with and without default) 85 void addParameterName(const String& parameter_name_); 86 void addParameterName(const String& parameter_name_, const String& parameter_default_); 87 const vector<String>* getParameterNames() const; 88 89 // Add a property name 90 void addPropertyName(const String& property_name_); 91 void addPropertyName(const String& property_name_, const String& property_default_); 92 const vector<String>* getPropertyNames() const; 93 94 // Check if all parameters needed exist in the m_parameters_ 95 void checkParameters() const; 96 // Check if all properties needed exist in the m_properties_ 97 void checkProperties() const; 98 99 // Get the pointer to parameters 100 const ParameterMap* getParameters() const; 101 const String getParameter(const String& parameter_name_) const; 102 void setParameter(const String& parameter_name_, const String& parameter_value_); 103 104 // Get the pointer to properties 105 const PropertyMap* getProperties() const; 106 const String getProperty(const String& property_name_) const; 107 void setProperty(const String& property_name_, const String& property_value_); 108 109 // Get the pointer to generated properties 110 PropertyMap* getGenProperties(); 111 const PropertyMap* getGenProperties() const; 112 113 // Add an instance to this model. num_sub_instances_ specifies the 114 // number of the same instance is added. 115 void addSubInstances(Model* sub_instance_, double num_sub_instances_); 116 // Get an instance by name. 117 Model* getSubInstance(const String& sub_instance_name_); 118 const Model* getSubInstance(const String& sub_instance_name_) const; 119 // Check if an instance exists 120 bool hasSubInstance(const String& sub_instance_name_) const; 121 122 // Add a new area 123 void addAreaResult(Result* area_); 124 // Get the pointer to an area. The area is specified by name. 125 Result* getAreaResult(const String& area_name_); 126 const Result* getAreaResult(const String& area_name_) const; 127 // Check if an area exists 128 bool hasAreaResult(const String& area_name_) const; 129 130 // Add a new ndd_power 131 void addNddPowerResult(Result* ndd_power_); 132 // Get the pointer to an ndd_power. The ndd_power is specified by name. 133 Result* getNddPowerResult(const String& ndd_power_name_); 134 const Result* getNddPowerResult(const String& ndd_power_name_) const; 135 // Check if a ndd_power exists 136 bool hasNddPowerResult(const String& ndd_power_name_) const; 137 138 // Add a new event 139 void addEventResult(Result* event_); 140 // Get the pointer to an event. The event is specified by name. 141 Result* getEventResult(const String& event_name_); 142 const Result* getEventResult(const String& event_name_) const; 143 // Check if an event exists 144 bool hasEventResult(const String& event_name_) const; 145 146 // Get the pointer to the TechModel. 147 const TechModel* getTechModel() const; 148 149 // Clone and return a new instance 150 virtual Model* clone() const; 151 152 // Checks to make sure all required parameters are present, makes sure that the model 153 // has not been constructed yet, and calls constructModel. This function is not meant 154 // to be overwritten by child classes; constructModel should be overwritten instead 155 void construct(); 156 // Update checks whether the model needs updating, whether all properties have been specified, 157 // and calls updateModel if update is necessary. This function is not meant 158 // to be overwritten by child classes; updateModel should be overwritten instead 159 void update(); 160 // Evaluate checks whether the model needs to be evaluated. Note that this function is 161 // not meant to be overwritten by child classes; evaluateModel should be overwritten 162 // instead 163 void evaluate(); 164 void use(const String& event_name_); 165 void use(); 166 167 // Resolve query hierarchy and process query 168 const void* parseQuery(const String& query_type_, const String& query_hier_, const String& query_sub_field_); 169 // Process the query 170 virtual const void* processQuery(const String& query_type_, const String& query_sub_field_); 171 172 // Print hierarchically 173 void printHierarchy(const String& query_type_, const String& query_sub_field_, const String& prepend_str_, int detail_level_, ostream& ost_) const; 174 void printInstHierarchy(const String& prepend_str_, int detail_level_, ostream& ost_) const; 175 176 protected: 177 // Query area 178 const Result* queryArea(const String& area_name_) const; 179 // Query non-data-dependent power 180 const Result* queryNddPower(const String& ndd_power_name_); 181 // Query event energy cost 182 const Result* queryEventEnergyCost(const String& event_name_); 183 184 // Constructs the model 185 virtual void constructModel() = 0; 186 // Updates timing related information of the model 187 virtual void updateModel(); 188 // Evaluate non data dependent power of the model 189 virtual void evaluateModel(); 190 virtual void useModel(const String& event_name_); 191 virtual void useModel(); 192 193 private: 194 // Private copy constructor. Use clone to perform copy operation. 195 Model(const Model& model_); 196 197 private: 198 // Name of this instance 199 String m_instance_name_; 200 // Set if this model is the top model 201 bool m_is_top_model_; 202 203 // Contains the parameters of a model 204 // Parameters are needed in order to constructModel() and CANNOT be 205 // changed after constructModel() has been called 206 ParameterMap* m_parameters_; 207 // Contains the names of all model parameters 208 vector<String>* m_parameter_names_; 209 // Contains the properties of a model 210 // Properties are required in order to updateModel() and CAN be 211 // changed be changed after constructModel(). Call updateModel() 212 // after properties have been changed to use the new properties 213 PropertyMap* m_properties_; 214 // Contains the property names needed to update the model 215 vector<String>* m_property_names_; 216 // Contains generated properties of the model 217 // Generated properties are used mostly as a scratch space for 218 // variables used in the model that must be passed from one 219 // function to another 220 PropertyMap* m_generated_properties_; 221 222 // Contains the instances of this model 223 Map<SubModel*>* m_sub_instances_; 224 // Contains the area resulst of a model 225 Map<Result*>* m_area_map_; 226 // Contains the noo power results of a model 227 Map<Result*>* m_ndd_power_map_; 228 // Contains the event results of a model 229 Map<Result*>* m_event_map_; 230 // Pointer to a TechModel which contains the technology information 231 const TechModel* m_tech_model_; 232 233 // Set when a model is constructed 234 bool m_constructed_; 235 // Set when a model is updated 236 bool m_updated_; 237 // Set when a model is evaluated 238 bool m_evaluated_; 239 240 }; // class Model 241} // namespace DSENT 242 243#endif // __DSENT_MODEL_MODEL_H__ 244 245