2014-10-11 23:16:00 +02:00
|
|
|
/* 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.
|
|
|
|
*/
|
|
|
|
|
2014-10-11 22:02:23 +02:00
|
|
|
#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__
|
|
|
|
|