/********************************************************************* * 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 #include /************************* 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 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 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