| /********************************************************************* | |
| * 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> | |
| /************************* 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.) { | |
| } | |
| const 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); | |
| 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::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( | |
| float (*usage_fn)(int num_inputs, float transistor_size)); | |
| 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(void); | |
| bool is_done_callibration(void); | |
| }; | |
| #endif |