90 lines
2.5 KiB
C++
90 lines
2.5 KiB
C++
/*********************************************************************
|
|
* The following code is part of the power modelling feature of VTR.
|
|
*
|
|
* For support:
|
|
* http://code.google.com/p/vtr-verilog-to-routing/wiki/Power
|
|
*
|
|
* or email:
|
|
* vtr.power.estimation@gmail.com
|
|
*
|
|
* If you are using power estimation for your researach please cite:
|
|
*
|
|
* Jeffrey Goeders and Steven Wilton. VersaPower: Power Estimation
|
|
* for Diverse FPGA Architectures. In International Conference on
|
|
* Field Programmable Technology, 2012.
|
|
*
|
|
********************************************************************/
|
|
|
|
#ifndef __POWER_POWERSPICEDCOMPONENT_NMOS_H__
|
|
#define __POWER_POWERSPICEDCOMPONENT_NMOS_H__
|
|
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
/************************* STRUCTS **********************************/
|
|
class PowerSpicedComponent;
|
|
|
|
class PowerCallibSize {
|
|
public:
|
|
float transistor_size;
|
|
float power;
|
|
float factor;
|
|
|
|
PowerCallibSize(float size, float power_)
|
|
: transistor_size(size)
|
|
, power(power_)
|
|
, factor(0.) {
|
|
}
|
|
bool operator<(const PowerCallibSize& rhs) {
|
|
return transistor_size < rhs.transistor_size;
|
|
}
|
|
};
|
|
|
|
class PowerCallibInputs {
|
|
public:
|
|
PowerSpicedComponent* parent;
|
|
int num_inputs;
|
|
std::vector<PowerCallibSize*> entries;
|
|
bool sorted;
|
|
|
|
PowerCallibInputs(PowerSpicedComponent* parent, float num_inputs);
|
|
~PowerCallibInputs();
|
|
|
|
void add_size(float transistor_size, float power = 0.);
|
|
PowerCallibSize* get_entry_bound(bool lower, float transistor_size);
|
|
void sort_me();
|
|
bool done_callibration;
|
|
void callibrate();
|
|
};
|
|
|
|
class PowerSpicedComponent {
|
|
public:
|
|
std::string name;
|
|
std::vector<PowerCallibInputs*> entries;
|
|
|
|
/* Estimation function for this component */
|
|
float (*component_usage)(int num_inputs, float transistor_size);
|
|
|
|
bool sorted;
|
|
bool done_callibration;
|
|
|
|
PowerCallibInputs* add_entry(int num_inputs);
|
|
PowerCallibInputs* get_entry(int num_inputs);
|
|
PowerCallibInputs* get_entry_bound(bool lower, int num_inputs);
|
|
|
|
PowerSpicedComponent(std::string component_name,
|
|
float (*usage_fn)(int num_inputs, float transistor_size));
|
|
~PowerSpicedComponent();
|
|
|
|
void add_data_point(int num_inputs, float transistor_size, float power);
|
|
float scale_factor(int num_inputs, float transistor_size);
|
|
void sort_me();
|
|
|
|
// void update_scale_factor(float (*fn)(float size));
|
|
void callibrate();
|
|
bool is_done_callibration();
|
|
void print(FILE* fp);
|
|
};
|
|
|
|
#endif
|