diff options
Diffstat (limited to 'ext/mcpat/logic.h')
-rw-r--r-- | ext/mcpat/logic.h | 322 |
1 files changed, 163 insertions, 159 deletions
diff --git a/ext/mcpat/logic.h b/ext/mcpat/logic.h index e2a35e845..19c774ef9 100644 --- a/ext/mcpat/logic.h +++ b/ext/mcpat/logic.h @@ -2,6 +2,7 @@ * McPAT * SOFTWARE LICENSE AGREEMENT * Copyright 2012 Hewlett-Packard Development Company, L.P. + * Copyright (c) 2010-2013 Advanced Micro Devices, Inc. * All Rights Reserved * * Redistribution and use in source and binary forms, with or without @@ -25,18 +26,16 @@ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.” + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ***************************************************************************/ #ifndef LOGIC_H_ #define LOGIC_H_ -#include <cassert> #include <cmath> #include <cstring> #include <iostream> -#include "XML_Parse.h" #include "arch_const.h" #include "basic_circuit.h" #include "basic_components.h" @@ -49,185 +48,190 @@ using namespace std; -class selection_logic : public Component{ +class selection_logic : public McPATComponent { public: - selection_logic(bool _is_default, int win_entries_, - int issue_width_, const InputParameter *configure_interface, - enum Device_ty device_ty_=Core_device, - enum Core_type core_ty_=Inorder);//, const ParseXML *_XML_interface); - bool is_default; - InputParameter l_ip; - uca_org_t local_result; - const ParseXML *XML_interface; - int win_entries; - int issue_width; - int num_threads; - enum Device_ty device_ty; - enum Core_type core_ty; - - void selection_power(); + bool is_default; + InputParameter l_ip; + uca_org_t local_result; + int win_entries; + int issue_width; + double accesses; + int num_threads; + enum Device_ty device_ty; + enum Core_type core_ty; + + selection_logic(XMLNode* _xml_data, bool _is_default, int _win_entries, + int issue_width_, const InputParameter* configure_interface, + string _name, double _accesses, + double clockRate_ = 0.0f, + enum Device_ty device_ty_ = Core_device, + enum Core_type core_ty_ = Inorder); + void computeArea(); + void computeEnergy(); void leakage_feedback(double temperature); // TODO + // TODO: Add a deconstructor }; -class dep_resource_conflict_check : public Component{ +class dep_resource_conflict_check : public McPATComponent { public: - dep_resource_conflict_check(const InputParameter *configure_interface, const CoreDynParam & dyn_p_, int compare_bits_, bool _is_default=true); - InputParameter l_ip; - uca_org_t local_result; - double WNORn, WNORp, Wevalinvp, Wevalinvn, Wcompn, Wcompp, Wcomppreequ; - CoreDynParam coredynp; - int compare_bits; - bool is_default; - statsDef tdp_stats; - statsDef rtp_stats; - statsDef stats_t; - powerDef power_t; - - void conflict_check_power(); - double compare_cap(); - ~dep_resource_conflict_check(){ - local_result.cleanup(); - } + InputParameter l_ip; + uca_org_t local_result; + double WNORn, WNORp, Wevalinvp, Wevalinvn, Wcompn, Wcompp, Wcomppreequ; + CoreParameters coredynp; + int compare_bits; + bool is_default; + statsDef stats_t; + + dep_resource_conflict_check(XMLNode* _xml_data, const string _name, + const InputParameter *configure_interface, + const CoreParameters & dyn_p_, int compare_bits_, + double clockRate_ = 0.0f, + bool _is_default = true); + void conflict_check_power(); + double compare_cap(); + void computeEnergy() {}; + ~dep_resource_conflict_check() { + local_result.cleanup(); + } void leakage_feedback(double temperature); }; -class inst_decoder: public Component{ +class InstructionDecoder: public McPATComponent { public: - inst_decoder(bool _is_default, const InputParameter *configure_interface, - int opcode_length_, - int num_decoders_, - bool x86_, - enum Device_ty device_ty_=Core_device, - enum Core_type core_ty_=Inorder); - inst_decoder(); - bool is_default; - int opcode_length; - int num_decoders; - bool x86; - int num_decoder_segments; - int num_decoded_signals; - InputParameter l_ip; - uca_org_t local_result; - enum Device_ty device_ty; - enum Core_type core_ty; - - Decoder * final_dec; - Predec * pre_dec; - - statsDef tdp_stats; - statsDef rtp_stats; - statsDef stats_t; - powerDef power_t; - void inst_decoder_delay_power(); - ~inst_decoder(); + Decoder* final_dec; + Predec* pre_dec; + + bool is_default; + int opcode_length; + int num_decoders; + bool x86; + int num_decoder_segments; + int num_decoded_signals; + InputParameter l_ip; + uca_org_t local_result; + enum Device_ty device_ty; + enum Core_type core_ty; + statsDef stats_t; + + InstructionDecoder(XMLNode* _xml_data, const string _name, bool _is_default, + const InputParameter *configure_interface, + int opcode_length_, int num_decoders_, bool x86_, + double clockRate_ = 0.0f, + enum Device_ty device_ty_ = Core_device, + enum Core_type core_ty_ = Inorder); + InstructionDecoder(); + void computeEnergy() {}; + void inst_decoder_delay_power(); + ~InstructionDecoder(); void leakage_feedback(double temperature); }; +// TODO: This should be defined elsewhere? This isn't a true McPATComponent class DFFCell : public Component { public: - DFFCell(bool _is_dram, double _WdecNANDn, double _WdecNANDp,double _cell_load, - const InputParameter *configure_interface); - InputParameter l_ip; - bool is_dram; - double cell_load; - double WdecNANDn; - double WdecNANDp; - double clock_cap; - int model; - int n_switch; - int n_keep_1; - int n_keep_0; - int n_clock; - powerDef e_switch; - powerDef e_keep_1; - powerDef e_keep_0; - powerDef e_clock; - - double fpfp_node_cap(unsigned int fan_in, unsigned int fan_out); - void compute_DFF_cell(void); - }; - -class Pipeline : public Component{ + InputParameter l_ip; + bool is_dram; + double cell_load; + double WdecNANDn; + double WdecNANDp; + double clock_cap; + int model; + int n_switch; + int n_keep_1; + int n_keep_0; + int n_clock; + powerDef e_switch; + powerDef e_keep_1; + powerDef e_keep_0; + powerDef e_clock; + + DFFCell(bool _is_dram, double _WdecNANDn, double _WdecNANDp, double _cell_load, + const InputParameter *configure_interface); + double fpfp_node_cap(unsigned int fan_in, unsigned int fan_out); + void compute_DFF_cell(void); + ~DFFCell() {}; +}; + +// TODO: This is a very ambiguous component. Try to refactor it. +class Pipeline : public McPATComponent { public: - Pipeline(const InputParameter *configure_interface, const CoreDynParam & dyn_p_, enum Device_ty device_ty_=Core_device, bool _is_core_pipeline=true, bool _is_default=true); - InputParameter l_ip; - uca_org_t local_result; - CoreDynParam coredynp; - enum Device_ty device_ty; - bool is_core_pipeline, is_default; - double num_piperegs; -// int pipeline_stages; -// int tot_stage_vector, per_stage_vector; - bool process_ind; - double WNANDn ; - double WNANDp; - double load_per_pipeline_stage; -// int Hthread, num_thread, fetchWidth, decodeWidth, issueWidth, commitWidth, instruction_length; -// int PC_width, opcode_length, num_arch_reg_tag, data_width,num_phsical_reg_tag, address_width; -// bool thread_clock_gated; -// bool in_order, multithreaded; - void compute_stage_vector(); - void compute(); - ~Pipeline(){ - local_result.cleanup(); - }; + InputParameter l_ip; + uca_org_t local_result; + CoreParameters coredynp; + enum Device_ty device_ty; + bool is_core_pipeline, is_default; + double num_piperegs; + bool process_ind; + double WNANDn; + double WNANDp; + double load_per_pipeline_stage; + + Pipeline(XMLNode* _xml_data, const InputParameter *configure_interface, + const CoreParameters & dyn_p_, + enum Device_ty device_ty_ = Core_device, + bool _is_core_pipeline = true, bool _is_default = true); + void compute_stage_vector(); + /** + * TODO: compute() completes work that should be completed in computeArea() + * and computeEnergy() recursively. Consider shifting these calculations + * around to be consistent with rest of hierarchy + */ + void compute(); + void computeArea() {}; + // TODO: Move energy computation to this function to unify hierarchy + void computeEnergy() {}; + ~Pipeline() { + local_result.cleanup(); + }; }; -//class core_pipeline :public pipeline{ -//public: -// int Hthread, num_thread, fetchWidth, decodeWidth, issueWidth, commitWidth, instruction_length; -// int PC_width, opcode_length, num_arch_reg_tag, data_width,num_phsical_reg_tag, address_width; -// bool thread_clock_gated; -// bool in_order, multithreaded; -// core_pipeline(bool _is_default, const InputParameter *configure_interface); -// virtual void compute_stage_vector(); -// -//}; - -class FunctionalUnit :public Component{ +class FunctionalUnit : public McPATComponent { public: - ParseXML *XML; - int ithCore; - InputParameter interface_ip; - CoreDynParam coredynp; - double FU_height; - double clockRate,executionTime; - double num_fu; - double energy, base_energy,per_access_energy, leakage, gate_leakage; - bool is_default; - enum FU_type fu_type; - statsDef tdp_stats; - statsDef rtp_stats; - statsDef stats_t; - powerDef power_t; - - FunctionalUnit(ParseXML *XML_interface, int ithCore_, InputParameter* interface_ip_,const CoreDynParam & dyn_p_, enum FU_type fu_type); - void computeEnergy(bool is_tdp=true); - void displayEnergy(uint32_t indent = 0,int plevel = 100, bool is_tdp=true); + InputParameter interface_ip; + CoreParameters core_params; + CoreStatistics core_stats; + double FU_height; + double num_fu; + double energy; + double base_energy; + double per_access_energy; + bool is_default; + enum FU_type fu_type; + statsDef stats_t; + + FunctionalUnit(XMLNode* _xml_data, InputParameter* interface_ip_, + const CoreParameters & _core_params, + const CoreStatistics & _core_stats, enum FU_type fu_type); + void computeEnergy(); void leakage_feedback(double temperature); - + ~FunctionalUnit() {}; }; -class UndiffCore :public Component{ +// TODO: This is a very ambiguous component. Try to refactor it. +class UndiffCore : public McPATComponent { public: - UndiffCore(ParseXML* XML_interface, int ithCore_, InputParameter* interface_ip_, const CoreDynParam & dyn_p_, bool exist_=true, bool embedded_=false); - ParseXML *XML; - int ithCore; - InputParameter interface_ip; - CoreDynParam coredynp; - double clockRate,executionTime; - double scktRatio, chip_PR_overhead, macro_PR_overhead; - enum Core_type core_ty; - bool opt_performance, embedded; - double pipeline_stage,num_hthreads,issue_width; - bool is_default; - - void displayEnergy(uint32_t indent = 0,int plevel = 100, bool is_tdp=true); - ~UndiffCore(){}; - bool exist; - - + InputParameter interface_ip; + CoreParameters coredynp; + double scktRatio; + double chip_PR_overhead; + double macro_PR_overhead; + enum Core_type core_ty; + bool opt_performance; + bool embedded; + double pipeline_stage; + double num_hthreads; + double issue_width; + bool is_default; + bool exist; + + UndiffCore(XMLNode* _xml_data, InputParameter* interface_ip_, + const CoreParameters & dyn_p_, + bool exist_ = true); + void computeArea() {}; + // TODO: Move energy computation to this function to unify hierarchy + void computeEnergy() {}; + ~UndiffCore() {}; }; #endif /* LOGIC_H_ */ |