| /***************************************************************************** | |
| * McPAT/CACTI | |
| * 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 | |
| * modification, are permitted provided that the following conditions are | |
| * met: redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer; | |
| * redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution; | |
| * neither the name of the copyright holders nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| * 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. | |
| * | |
| ***************************************************************************/ | |
| #ifndef __DECODER_H__ | |
| #define __DECODER_H__ | |
| #include <vector> | |
| #include "area.h" | |
| #include "component.h" | |
| #include "parameter.h" | |
| using namespace std; | |
| class Decoder : public Component { | |
| public: | |
| Decoder( | |
| int _num_dec_signals, | |
| bool flag_way_select, | |
| double _C_ld_dec_out, | |
| double _R_wire_dec_out, | |
| bool fully_assoc_, | |
| bool is_dram_, | |
| bool is_wl_tr_, | |
| const Area & cell_); | |
| bool exist; | |
| int num_in_signals; | |
| double C_ld_dec_out; | |
| double R_wire_dec_out; | |
| int num_gates; | |
| int num_gates_min; | |
| double w_dec_n[MAX_NUMBER_GATES_STAGE]; | |
| double w_dec_p[MAX_NUMBER_GATES_STAGE]; | |
| double delay; | |
| //powerDef power; | |
| bool fully_assoc; | |
| bool is_dram; | |
| bool is_wl_tr; | |
| const Area & cell; | |
| void compute_widths(); | |
| void compute_area(); | |
| double compute_delays(double inrisetime); // return outrisetime | |
| void leakage_feedback(double temperature); | |
| }; | |
| class PredecBlk : public Component { | |
| public: | |
| PredecBlk( | |
| int num_dec_signals, | |
| Decoder * dec, | |
| double C_wire_predec_blk_out, | |
| double R_wire_predec_blk_out, | |
| int num_dec_per_predec, | |
| bool is_dram_, | |
| bool is_blk1); | |
| Decoder * dec; | |
| bool exist; | |
| int number_input_addr_bits; | |
| double C_ld_predec_blk_out; | |
| double R_wire_predec_blk_out; | |
| int branch_effort_nand2_gate_output; | |
| int branch_effort_nand3_gate_output; | |
| bool flag_two_unique_paths; | |
| int flag_L2_gate; | |
| int number_inputs_L1_gate; | |
| int number_gates_L1_nand2_path; | |
| int number_gates_L1_nand3_path; | |
| int number_gates_L2; | |
| int min_number_gates_L1; | |
| int min_number_gates_L2; | |
| int num_L1_active_nand2_path; | |
| int num_L1_active_nand3_path; | |
| double w_L1_nand2_n[MAX_NUMBER_GATES_STAGE]; | |
| double w_L1_nand2_p[MAX_NUMBER_GATES_STAGE]; | |
| double w_L1_nand3_n[MAX_NUMBER_GATES_STAGE]; | |
| double w_L1_nand3_p[MAX_NUMBER_GATES_STAGE]; | |
| double w_L2_n[MAX_NUMBER_GATES_STAGE]; | |
| double w_L2_p[MAX_NUMBER_GATES_STAGE]; | |
| double delay_nand2_path; | |
| double delay_nand3_path; | |
| powerDef power_nand2_path; | |
| powerDef power_nand3_path; | |
| powerDef power_L2; | |
| bool is_dram_; | |
| void compute_widths(); | |
| void compute_area(); | |
| void leakage_feedback(double temperature); | |
| pair<double, double> compute_delays(pair<double, double> inrisetime); // <nand2, nand3> | |
| // return <outrise_nand2, outrise_nand3> | |
| }; | |
| class PredecBlkDrv : public Component { | |
| public: | |
| PredecBlkDrv( | |
| int way_select, | |
| PredecBlk * blk_, | |
| bool is_dram); | |
| int flag_driver_exists; | |
| int number_input_addr_bits; | |
| int number_gates_nand2_path; | |
| int number_gates_nand3_path; | |
| int min_number_gates; | |
| int num_buffers_driving_1_nand2_load; | |
| int num_buffers_driving_2_nand2_load; | |
| int num_buffers_driving_4_nand2_load; | |
| int num_buffers_driving_2_nand3_load; | |
| int num_buffers_driving_8_nand3_load; | |
| int num_buffers_nand3_path; | |
| double c_load_nand2_path_out; | |
| double c_load_nand3_path_out; | |
| double r_load_nand2_path_out; | |
| double r_load_nand3_path_out; | |
| double width_nand2_path_n[MAX_NUMBER_GATES_STAGE]; | |
| double width_nand2_path_p[MAX_NUMBER_GATES_STAGE]; | |
| double width_nand3_path_n[MAX_NUMBER_GATES_STAGE]; | |
| double width_nand3_path_p[MAX_NUMBER_GATES_STAGE]; | |
| double delay_nand2_path; | |
| double delay_nand3_path; | |
| powerDef power_nand2_path; | |
| powerDef power_nand3_path; | |
| PredecBlk * blk; | |
| Decoder * dec; | |
| bool is_dram_; | |
| int way_select; | |
| void compute_widths(); | |
| void compute_area(); | |
| void leakage_feedback(double temperature); | |
| pair<double, double> compute_delays( | |
| double inrisetime_nand2_path, | |
| double inrisetime_nand3_path); // return <outrise_nand2, outrise_nand3> | |
| inline int num_addr_bits_nand2_path() { | |
| return num_buffers_driving_1_nand2_load + | |
| num_buffers_driving_2_nand2_load + | |
| num_buffers_driving_4_nand2_load; | |
| } | |
| inline int num_addr_bits_nand3_path() { | |
| return num_buffers_driving_2_nand3_load + | |
| num_buffers_driving_8_nand3_load; | |
| } | |
| double get_rdOp_dynamic_E(int num_act_mats_hor_dir); | |
| }; | |
| class Predec : public Component { | |
| public: | |
| Predec( | |
| PredecBlkDrv * drv1, | |
| PredecBlkDrv * drv2); | |
| double compute_delays(double inrisetime); // return outrisetime | |
| void leakage_feedback(double temperature); | |
| PredecBlk * blk1; | |
| PredecBlk * blk2; | |
| PredecBlkDrv * drv1; | |
| PredecBlkDrv * drv2; | |
| powerDef block_power; | |
| powerDef driver_power; | |
| private: | |
| // returns <delay, risetime> | |
| pair<double, double> get_max_delay_before_decoder( | |
| pair<double, double> input_pair1, | |
| pair<double, double> input_pair2); | |
| }; | |
| class Driver : public Component { | |
| public: | |
| Driver(double c_gate_load_, double c_wire_load_, double r_wire_load_, bool is_dram); | |
| int number_gates; | |
| int min_number_gates; | |
| double width_n[MAX_NUMBER_GATES_STAGE]; | |
| double width_p[MAX_NUMBER_GATES_STAGE]; | |
| double c_gate_load; | |
| double c_wire_load; | |
| double r_wire_load; | |
| double delay; | |
| powerDef power; | |
| bool is_dram_; | |
| void compute_widths(); | |
| double compute_delay(double inrisetime); | |
| }; | |
| #endif |