M2_SETI/T1/TP/TP1/cacti_7/decoder.h
2022-11-18 15:07:43 +01:00

272 lines
7.2 KiB
C++

/*****************************************************************************
* CACTI 7.0
* SOFTWARE LICENSE AGREEMENT
* Copyright 2015 Hewlett-Packard Development Company, L.P.
* 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 "area.h"
#include "component.h"
#include "parameter.h"
#include "powergating.h"
#include <vector>
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;
double total_driver_nwidth;
double total_driver_pwidth;
Sleep_tx * sleeptx;
const Area & cell;
int nodes_DSTN;
void compute_widths();
void compute_area();
double compute_delays(double inrisetime); // return outrisetime
void compute_power_gating();
void leakage_feedback(double temperature);
~Decoder()
{
if (!sleeptx)
delete sleeptx;
};
};
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_;
double total_driver_nwidth;
double total_driver_pwidth;
Sleep_tx * sleeptx;
void compute_widths();
void compute_area();
double compute_delay(double inrisetime);
void compute_power_gating();
~Driver()
{
if (!sleeptx)
delete sleeptx;
};
};
#endif