summaryrefslogtreecommitdiff
path: root/ext/mcpat/logic.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mcpat/logic.h')
-rw-r--r--ext/mcpat/logic.h322
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_ */