blob: 9508b5c925165a09a08bca6854a1ddf31bf2388e [file] [log] [blame]
/* 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__