blob: 573b726a6ce0c719a6093dd9f24af635c1b3607f [file] [log] [blame]
/*****************************************************************************
* 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 __PARAMETER_H__
#define __PARAMETER_H__
#include "area.h"
#include "cacti_interface.h"
#include "const.h"
#include "io.h"
// parameters which are functions of certain device technology
class TechnologyParameter {
public:
class DeviceType {
public:
double C_g_ideal;
double C_fringe;
double C_overlap;
double C_junc; // C_junc_area
double C_junc_sidewall;
double l_phy;
double l_elec;
double R_nch_on;
double R_pch_on;
double Vdd;
double Vth;
double I_on_n;
double I_on_p;
double I_off_n;
double I_off_p;
double I_g_on_n;
double I_g_on_p;
double C_ox;
double t_ox;
double n_to_p_eff_curr_drv_ratio;
double long_channel_leakage_reduction;
DeviceType(): C_g_ideal(0), C_fringe(0), C_overlap(0), C_junc(0),
C_junc_sidewall(0), l_phy(0), l_elec(0), R_nch_on(0), R_pch_on(0),
Vdd(0), Vth(0),
I_on_n(0), I_on_p(0), I_off_n(0), I_off_p(0), I_g_on_n(0),
I_g_on_p(0),
C_ox(0), t_ox(0), n_to_p_eff_curr_drv_ratio(0),
long_channel_leakage_reduction(0) { };
void reset() {
C_g_ideal = 0;
C_fringe = 0;
C_overlap = 0;
C_junc = 0;
l_phy = 0;
l_elec = 0;
R_nch_on = 0;
R_pch_on = 0;
Vdd = 0;
Vth = 0;
I_on_n = 0;
I_on_p = 0;
I_off_n = 0;
I_off_p = 0;
I_g_on_n = 0;
I_g_on_p = 0;
C_ox = 0;
t_ox = 0;
n_to_p_eff_curr_drv_ratio = 0;
long_channel_leakage_reduction = 0;
}
void display(uint32_t indent = 0);
};
class InterconnectType {
public:
double pitch;
double R_per_um;
double C_per_um;
double horiz_dielectric_constant;
double vert_dielectric_constant;
double aspect_ratio;
double miller_value;
double ild_thickness;
InterconnectType(): pitch(0), R_per_um(0), C_per_um(0) { };
void reset() {
pitch = 0;
R_per_um = 0;
C_per_um = 0;
horiz_dielectric_constant = 0;
vert_dielectric_constant = 0;
aspect_ratio = 0;
miller_value = 0;
ild_thickness = 0;
}
void display(uint32_t indent = 0);
};
class MemoryType {
public:
double b_w;
double b_h;
double cell_a_w;
double cell_pmos_w;
double cell_nmos_w;
double Vbitpre;
void reset() {
b_w = 0;
b_h = 0;
cell_a_w = 0;
cell_pmos_w = 0;
cell_nmos_w = 0;
Vbitpre = 0;
}
void display(uint32_t indent = 0);
};
class ScalingFactor {
public:
double logic_scaling_co_eff;
double core_tx_density;
double long_channel_leakage_reduction;
ScalingFactor(): logic_scaling_co_eff(0), core_tx_density(0),
long_channel_leakage_reduction(0) { };
void reset() {
logic_scaling_co_eff = 0;
core_tx_density = 0;
long_channel_leakage_reduction = 0;
}
void display(uint32_t indent = 0);
};
double ram_wl_stitching_overhead_;
double min_w_nmos_;
double max_w_nmos_;
double max_w_nmos_dec;
double unit_len_wire_del;
double FO4;
double kinv;
double vpp;
double w_sense_en;
double w_sense_n;
double w_sense_p;
double sense_delay;
double sense_dy_power;
double w_iso;
double w_poly_contact;
double spacing_poly_to_poly;
double spacing_poly_to_contact;
double w_comp_inv_p1;
double w_comp_inv_p2;
double w_comp_inv_p3;
double w_comp_inv_n1;
double w_comp_inv_n2;
double w_comp_inv_n3;
double w_eval_inv_p;
double w_eval_inv_n;
double w_comp_n;
double w_comp_p;
double dram_cell_I_on;
double dram_cell_Vdd;
double dram_cell_I_off_worst_case_len_temp;
double dram_cell_C;
double gm_sense_amp_latch;
double w_nmos_b_mux;
double w_nmos_sa_mux;
double w_pmos_bl_precharge;
double w_pmos_bl_eq;
double MIN_GAP_BET_P_AND_N_DIFFS;
double MIN_GAP_BET_SAME_TYPE_DIFFS;
double HPOWERRAIL;
double cell_h_def;
double chip_layout_overhead;
double macro_layout_overhead;
double sckt_co_eff;
double fringe_cap;
uint64_t h_dec;
DeviceType sram_cell; // SRAM cell transistor
DeviceType dram_acc; // DRAM access transistor
DeviceType dram_wl; // DRAM wordline transistor
DeviceType peri_global; // peripheral global
DeviceType cam_cell; // SRAM cell transistor
InterconnectType wire_local;
InterconnectType wire_inside_mat;
InterconnectType wire_outside_mat;
ScalingFactor scaling_factor;
MemoryType sram;
MemoryType dram;
MemoryType cam;
void display(uint32_t indent = 0);
void reset() {
dram_cell_Vdd = 0;
dram_cell_I_on = 0;
dram_cell_C = 0;
vpp = 0;
sense_delay = 0;
sense_dy_power = 0;
fringe_cap = 0;
// horiz_dielectric_constant = 0;
// vert_dielectric_constant = 0;
// aspect_ratio = 0;
// miller_value = 0;
// ild_thickness = 0;
dram_cell_I_off_worst_case_len_temp = 0;
sram_cell.reset();
dram_acc.reset();
dram_wl.reset();
peri_global.reset();
cam_cell.reset();
scaling_factor.reset();
wire_local.reset();
wire_inside_mat.reset();
wire_outside_mat.reset();
sram.reset();
dram.reset();
cam.reset();
chip_layout_overhead = 0;
macro_layout_overhead = 0;
sckt_co_eff = 0;
}
};
class DynamicParameter {
public:
bool is_tag;
bool pure_ram;
bool pure_cam;
bool fully_assoc;
int tagbits;
int num_subarrays; // only for leakage computation -- the number of subarrays per bank
int num_mats; // only for leakage computation -- the number of mats per bank
double Nspd;
int Ndwl;
int Ndbl;
int Ndcm;
int deg_bl_muxing;
int deg_senseamp_muxing_non_associativity;
int Ndsam_lev_1;
int Ndsam_lev_2;
int number_addr_bits_mat; // per port
int number_subbanks_decode; // per_port
int num_di_b_bank_per_port;
int num_do_b_bank_per_port;
int num_di_b_mat;
int num_do_b_mat;
int num_di_b_subbank;
int num_do_b_subbank;
int num_si_b_mat;
int num_so_b_mat;
int num_si_b_subbank;
int num_so_b_subbank;
int num_si_b_bank_per_port;
int num_so_b_bank_per_port;
int number_way_select_signals_mat;
int num_act_mats_hor_dir;
int num_act_mats_hor_dir_sl;
bool is_dram;
double V_b_sense;
unsigned int num_r_subarray;
unsigned int num_c_subarray;
int tag_num_r_subarray;//sheng: fully associative cache tag and data must be computed together, data and tag must be separate
int tag_num_c_subarray;
int data_num_r_subarray;
int data_num_c_subarray;
int num_mats_h_dir;
int num_mats_v_dir;
uint32_t ram_cell_tech_type;
double dram_refresh_period;
DynamicParameter();
DynamicParameter(
bool is_tag_,
int pure_ram_,
int pure_cam_,
double Nspd_,
unsigned int Ndwl_,
unsigned int Ndbl_,
unsigned int Ndcm_,
unsigned int Ndsam_lev_1_,
unsigned int Ndsam_lev_2_,
bool is_main_mem_);
int use_inp_params;
unsigned int num_rw_ports;
unsigned int num_rd_ports;
unsigned int num_wr_ports;
unsigned int num_se_rd_ports; // number of single ended read ports
unsigned int num_search_ports;
unsigned int out_w;// == nr_bits_out
bool is_main_mem;
Area cell, cam_cell;//cell is the sram_cell in both nomal cache/ram and FA.
bool is_valid;
};
extern InputParameter * g_ip;
extern TechnologyParameter g_tp;
#endif