OpenFPGA/vpr/src/power/PowerSpicedComponent.h

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