parameter.cc revision 10152
110152Satgutier@umich.edu/*****************************************************************************
210152Satgutier@umich.edu *                                McPAT/CACTI
310152Satgutier@umich.edu *                      SOFTWARE LICENSE AGREEMENT
410152Satgutier@umich.edu *            Copyright 2012 Hewlett-Packard Development Company, L.P.
510152Satgutier@umich.edu *                          All Rights Reserved
610152Satgutier@umich.edu *
710152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without
810152Satgutier@umich.edu * modification, are permitted provided that the following conditions are
910152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright
1010152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer;
1110152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright
1210152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the
1310152Satgutier@umich.edu * documentation and/or other materials provided with the distribution;
1410152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its
1510152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from
1610152Satgutier@umich.edu * this software without specific prior written permission.
1710152Satgutier@umich.edu
1810152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1910152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2010152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2110152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2210152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2310152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2410152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2510152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2610152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2710152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2810152Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.”
2910152Satgutier@umich.edu *
3010152Satgutier@umich.edu ***************************************************************************/
3110152Satgutier@umich.edu
3210152Satgutier@umich.edu
3310152Satgutier@umich.edu
3410152Satgutier@umich.edu#include <iomanip>
3510152Satgutier@umich.edu#include <iostream>
3610152Satgutier@umich.edu#include <string>
3710152Satgutier@umich.edu
3810152Satgutier@umich.edu#include "area.h"
3910152Satgutier@umich.edu#include "parameter.h"
4010152Satgutier@umich.edu
4110152Satgutier@umich.eduusing namespace std;
4210152Satgutier@umich.edu
4310152Satgutier@umich.edu
4410152Satgutier@umich.eduInputParameter * g_ip;
4510152Satgutier@umich.eduTechnologyParameter g_tp;
4610152Satgutier@umich.edu
4710152Satgutier@umich.edu
4810152Satgutier@umich.edu
4910152Satgutier@umich.eduvoid TechnologyParameter::DeviceType::display(uint32_t indent)
5010152Satgutier@umich.edu{
5110152Satgutier@umich.edu  string indent_str(indent, ' ');
5210152Satgutier@umich.edu
5310152Satgutier@umich.edu  cout << indent_str << "C_g_ideal = " << setw(12) << C_g_ideal << " F/um" << endl;
5410152Satgutier@umich.edu  cout << indent_str << "C_fringe  = " << setw(12) << C_fringe  << " F/um" << endl;
5510152Satgutier@umich.edu  cout << indent_str << "C_overlap = " << setw(12) << C_overlap << " F/um" << endl;
5610152Satgutier@umich.edu  cout << indent_str << "C_junc    = " << setw(12) << C_junc    << " F/um^2" << endl;
5710152Satgutier@umich.edu  cout << indent_str << "l_phy     = " << setw(12) << l_phy     << " um" << endl;
5810152Satgutier@umich.edu  cout << indent_str << "l_elec    = " << setw(12) << l_elec    << " um" << endl;
5910152Satgutier@umich.edu  cout << indent_str << "R_nch_on  = " << setw(12) << R_nch_on  << " ohm-um" << endl;
6010152Satgutier@umich.edu  cout << indent_str << "R_pch_on  = " << setw(12) << R_pch_on  << " ohm-um" << endl;
6110152Satgutier@umich.edu  cout << indent_str << "Vdd       = " << setw(12) << Vdd       << " V" << endl;
6210152Satgutier@umich.edu  cout << indent_str << "Vth       = " << setw(12) << Vth       << " V" << endl;
6310152Satgutier@umich.edu  cout << indent_str << "I_on_n    = " << setw(12) << I_on_n    << " A/um" << endl;
6410152Satgutier@umich.edu  cout << indent_str << "I_on_p    = " << setw(12) << I_on_p    << " A/um" << endl;
6510152Satgutier@umich.edu  cout << indent_str << "I_off_n   = " << setw(12) << I_off_n   << " A/um" << endl;
6610152Satgutier@umich.edu  cout << indent_str << "I_off_p   = " << setw(12) << I_off_p   << " A/um" << endl;
6710152Satgutier@umich.edu  cout << indent_str << "C_ox      = " << setw(12) << C_ox      << " F/um^2" << endl;
6810152Satgutier@umich.edu  cout << indent_str << "t_ox      = " << setw(12) << t_ox      << " um" << endl;
6910152Satgutier@umich.edu  cout << indent_str << "n_to_p_eff_curr_drv_ratio = " << n_to_p_eff_curr_drv_ratio << endl;
7010152Satgutier@umich.edu}
7110152Satgutier@umich.edu
7210152Satgutier@umich.edu
7310152Satgutier@umich.edu
7410152Satgutier@umich.eduvoid TechnologyParameter::InterconnectType::display(uint32_t indent)
7510152Satgutier@umich.edu{
7610152Satgutier@umich.edu  string indent_str(indent, ' ');
7710152Satgutier@umich.edu
7810152Satgutier@umich.edu  cout << indent_str << "pitch    = " << setw(12) << pitch    << " um" << endl;
7910152Satgutier@umich.edu  cout << indent_str << "R_per_um = " << setw(12) << R_per_um << " ohm/um" << endl;
8010152Satgutier@umich.edu  cout << indent_str << "C_per_um = " << setw(12) << C_per_um << " F/um" << endl;
8110152Satgutier@umich.edu}
8210152Satgutier@umich.edu
8310152Satgutier@umich.eduvoid TechnologyParameter::ScalingFactor::display(uint32_t indent)
8410152Satgutier@umich.edu{
8510152Satgutier@umich.edu  string indent_str(indent, ' ');
8610152Satgutier@umich.edu
8710152Satgutier@umich.edu  cout << indent_str << "logic_scaling_co_eff    = " << setw(12) << logic_scaling_co_eff << endl;
8810152Satgutier@umich.edu  cout << indent_str << "curr_core_tx_density = " << setw(12) << core_tx_density << " # of tx/um^2" << endl;
8910152Satgutier@umich.edu}
9010152Satgutier@umich.edu
9110152Satgutier@umich.eduvoid TechnologyParameter::MemoryType::display(uint32_t indent)
9210152Satgutier@umich.edu{
9310152Satgutier@umich.edu  string indent_str(indent, ' ');
9410152Satgutier@umich.edu
9510152Satgutier@umich.edu  cout << indent_str << "b_w         = " << setw(12) << b_w << " um" << endl;
9610152Satgutier@umich.edu  cout << indent_str << "b_h         = " << setw(12) << b_h << " um" << endl;
9710152Satgutier@umich.edu  cout << indent_str << "cell_a_w    = " << setw(12) << cell_a_w << " um" << endl;
9810152Satgutier@umich.edu  cout << indent_str << "cell_pmos_w = " << setw(12) << cell_pmos_w << " um" << endl;
9910152Satgutier@umich.edu  cout << indent_str << "cell_nmos_w = " << setw(12) << cell_nmos_w << " um" << endl;
10010152Satgutier@umich.edu  cout << indent_str << "Vbitpre     = " << setw(12) << Vbitpre << " V" << endl;
10110152Satgutier@umich.edu}
10210152Satgutier@umich.edu
10310152Satgutier@umich.edu
10410152Satgutier@umich.edu
10510152Satgutier@umich.eduvoid TechnologyParameter::display(uint32_t indent)
10610152Satgutier@umich.edu{
10710152Satgutier@umich.edu  string indent_str(indent, ' ');
10810152Satgutier@umich.edu
10910152Satgutier@umich.edu  cout << indent_str << "ram_wl_stitching_overhead_ = " << setw(12) << ram_wl_stitching_overhead_ << " um" << endl;
11010152Satgutier@umich.edu  cout << indent_str << "min_w_nmos_                = " << setw(12) << min_w_nmos_                << " um" << endl;
11110152Satgutier@umich.edu  cout << indent_str << "max_w_nmos_                = " << setw(12) << max_w_nmos_                << " um" << endl;
11210152Satgutier@umich.edu  cout << indent_str << "unit_len_wire_del          = " << setw(12) << unit_len_wire_del          << " s/um^2" << endl;
11310152Satgutier@umich.edu  cout << indent_str << "FO4                        = " << setw(12) << FO4                        << " s" << endl;
11410152Satgutier@umich.edu  cout << indent_str << "kinv                       = " << setw(12) << kinv                       << " s" << endl;
11510152Satgutier@umich.edu  cout << indent_str << "vpp                        = " << setw(12) << vpp                        << " V" << endl;
11610152Satgutier@umich.edu  cout << indent_str << "w_sense_en                 = " << setw(12) << w_sense_en                 << " um" << endl;
11710152Satgutier@umich.edu  cout << indent_str << "w_sense_n                  = " << setw(12) << w_sense_n                  << " um" << endl;
11810152Satgutier@umich.edu  cout << indent_str << "w_sense_p                  = " << setw(12) << w_sense_p                  << " um" << endl;
11910152Satgutier@umich.edu  cout << indent_str << "w_iso                      = " << setw(12) << w_iso                      << " um" << endl;
12010152Satgutier@umich.edu  cout << indent_str << "w_poly_contact             = " << setw(12) << w_poly_contact             << " um" << endl;
12110152Satgutier@umich.edu  cout << indent_str << "spacing_poly_to_poly       = " << setw(12) << spacing_poly_to_poly       << " um" << endl;
12210152Satgutier@umich.edu  cout << indent_str << "spacing_poly_to_contact    = " << setw(12) << spacing_poly_to_contact    << " um" << endl;
12310152Satgutier@umich.edu  cout << endl;
12410152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_p1              = " << setw(12) << w_comp_inv_p1 << " um" << endl;
12510152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_p2              = " << setw(12) << w_comp_inv_p2 << " um" << endl;
12610152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_p3              = " << setw(12) << w_comp_inv_p3 << " um" << endl;
12710152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_n1              = " << setw(12) << w_comp_inv_n1 << " um" << endl;
12810152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_n2              = " << setw(12) << w_comp_inv_n2 << " um" << endl;
12910152Satgutier@umich.edu  cout << indent_str << "w_comp_inv_n3              = " << setw(12) << w_comp_inv_n3 << " um" << endl;
13010152Satgutier@umich.edu  cout << indent_str << "w_eval_inv_p               = " << setw(12) << w_eval_inv_p  << " um" << endl;
13110152Satgutier@umich.edu  cout << indent_str << "w_eval_inv_n               = " << setw(12) << w_eval_inv_n  << " um" << endl;
13210152Satgutier@umich.edu  cout << indent_str << "w_comp_n                   = " << setw(12) << w_comp_n      << " um" << endl;
13310152Satgutier@umich.edu  cout << indent_str << "w_comp_p                   = " << setw(12) << w_comp_p      << " um" << endl;
13410152Satgutier@umich.edu  cout << endl;
13510152Satgutier@umich.edu  cout << indent_str << "dram_cell_I_on             = " << setw(12) << dram_cell_I_on << " A/um" << endl;
13610152Satgutier@umich.edu  cout << indent_str << "dram_cell_Vdd              = " << setw(12) << dram_cell_Vdd  << " V" << endl;
13710152Satgutier@umich.edu  cout << indent_str << "dram_cell_I_off_worst_case_len_temp = " << setw(12) << dram_cell_I_off_worst_case_len_temp << " A/um" << endl;
13810152Satgutier@umich.edu  cout << indent_str << "dram_cell_C                = " << setw(12) << dram_cell_C               << " F" << endl;
13910152Satgutier@umich.edu  cout << indent_str << "gm_sense_amp_latch         = " << setw(12) << gm_sense_amp_latch        << " F/s" << endl;
14010152Satgutier@umich.edu  cout << endl;
14110152Satgutier@umich.edu  cout << indent_str << "w_nmos_b_mux               = " << setw(12) << w_nmos_b_mux              << " um" << endl;
14210152Satgutier@umich.edu  cout << indent_str << "w_nmos_sa_mux              = " << setw(12) << w_nmos_sa_mux             << " um" << endl;
14310152Satgutier@umich.edu  cout << indent_str << "w_pmos_bl_precharge        = " << setw(12) << w_pmos_bl_precharge       << " um" << endl;
14410152Satgutier@umich.edu  cout << indent_str << "w_pmos_bl_eq               = " << setw(12) << w_pmos_bl_eq              << " um" << endl;
14510152Satgutier@umich.edu  cout << indent_str << "MIN_GAP_BET_P_AND_N_DIFFS  = " << setw(12) << MIN_GAP_BET_P_AND_N_DIFFS << " um" << endl;
14610152Satgutier@umich.edu  cout << indent_str << "HPOWERRAIL                 = " << setw(12) << HPOWERRAIL                << " um" << endl;
14710152Satgutier@umich.edu  cout << indent_str << "cell_h_def                 = " << setw(12) << cell_h_def                << " um" << endl;
14810152Satgutier@umich.edu
14910152Satgutier@umich.edu  cout << endl;
15010152Satgutier@umich.edu  cout << indent_str << "SRAM cell transistor: " << endl;
15110152Satgutier@umich.edu  sram_cell.display(indent + 2);
15210152Satgutier@umich.edu
15310152Satgutier@umich.edu  cout << endl;
15410152Satgutier@umich.edu  cout << indent_str << "DRAM access transistor: " << endl;
15510152Satgutier@umich.edu  dram_acc.display(indent + 2);
15610152Satgutier@umich.edu
15710152Satgutier@umich.edu  cout << endl;
15810152Satgutier@umich.edu  cout << indent_str << "DRAM wordline transistor: " << endl;
15910152Satgutier@umich.edu  dram_wl.display(indent + 2);
16010152Satgutier@umich.edu
16110152Satgutier@umich.edu  cout << endl;
16210152Satgutier@umich.edu  cout << indent_str << "peripheral global transistor: " << endl;
16310152Satgutier@umich.edu  peri_global.display(indent + 2);
16410152Satgutier@umich.edu
16510152Satgutier@umich.edu  cout << endl;
16610152Satgutier@umich.edu  cout << indent_str << "wire local" << endl;
16710152Satgutier@umich.edu  wire_local.display(indent + 2);
16810152Satgutier@umich.edu
16910152Satgutier@umich.edu  cout << endl;
17010152Satgutier@umich.edu  cout << indent_str << "wire inside mat" << endl;
17110152Satgutier@umich.edu  wire_inside_mat.display(indent + 2);
17210152Satgutier@umich.edu
17310152Satgutier@umich.edu  cout << endl;
17410152Satgutier@umich.edu  cout << indent_str << "wire outside mat" << endl;
17510152Satgutier@umich.edu  wire_outside_mat.display(indent + 2);
17610152Satgutier@umich.edu
17710152Satgutier@umich.edu  cout << endl;
17810152Satgutier@umich.edu  cout << indent_str << "SRAM" << endl;
17910152Satgutier@umich.edu  sram.display(indent + 2);
18010152Satgutier@umich.edu
18110152Satgutier@umich.edu  cout << endl;
18210152Satgutier@umich.edu  cout << indent_str << "DRAM" << endl;
18310152Satgutier@umich.edu  dram.display(indent + 2);
18410152Satgutier@umich.edu}
18510152Satgutier@umich.edu
18610152Satgutier@umich.edu
18710152Satgutier@umich.eduDynamicParameter::DynamicParameter():
18810152Satgutier@umich.edu  use_inp_params(0), cell(), is_valid(true)
18910152Satgutier@umich.edu{
19010152Satgutier@umich.edu}
19110152Satgutier@umich.edu
19210152Satgutier@umich.edu
19310152Satgutier@umich.edu
19410152Satgutier@umich.eduDynamicParameter::DynamicParameter(
19510152Satgutier@umich.edu    bool is_tag_,
19610152Satgutier@umich.edu    int pure_ram_,
19710152Satgutier@umich.edu    int pure_cam_,
19810152Satgutier@umich.edu    double Nspd_,
19910152Satgutier@umich.edu    unsigned int Ndwl_,
20010152Satgutier@umich.edu    unsigned int Ndbl_,
20110152Satgutier@umich.edu    unsigned int Ndcm_,
20210152Satgutier@umich.edu    unsigned int Ndsam_lev_1_,
20310152Satgutier@umich.edu    unsigned int Ndsam_lev_2_,
20410152Satgutier@umich.edu    bool is_main_mem_):
20510152Satgutier@umich.edu  is_tag(is_tag_), pure_ram(pure_ram_), pure_cam(pure_cam_), tagbits(0), Nspd(Nspd_), Ndwl(Ndwl_), Ndbl(Ndbl_),Ndcm(Ndcm_),
20610152Satgutier@umich.edu  Ndsam_lev_1(Ndsam_lev_1_), Ndsam_lev_2(Ndsam_lev_2_),
20710152Satgutier@umich.edu  number_way_select_signals_mat(0), V_b_sense(0), use_inp_params(0),
20810152Satgutier@umich.edu  is_main_mem(is_main_mem_), cell(), is_valid(false)
20910152Satgutier@umich.edu{
21010152Satgutier@umich.edu  ram_cell_tech_type = (is_tag) ? g_ip->tag_arr_ram_cell_tech_type : g_ip->data_arr_ram_cell_tech_type;
21110152Satgutier@umich.edu  is_dram            = ((ram_cell_tech_type == lp_dram) || (ram_cell_tech_type == comm_dram));
21210152Satgutier@umich.edu
21310152Satgutier@umich.edu  unsigned int capacity_per_die = g_ip->cache_sz / NUMBER_STACKED_DIE_LAYERS;  // capacity per stacked die layer
21410152Satgutier@umich.edu  const TechnologyParameter::InterconnectType & wire_local = g_tp.wire_local;
21510152Satgutier@umich.edu  fully_assoc = (g_ip->fully_assoc) ? true : false;
21610152Satgutier@umich.edu
21710152Satgutier@umich.edu  if (fully_assoc || pure_cam)
21810152Satgutier@umich.edu  { // fully-assocative cache -- ref: CACTi 2.0 report
21910152Satgutier@umich.edu          if (Ndwl != 1 ||            //Ndwl is fixed to 1 for FA
22010152Satgutier@umich.edu                          Ndcm != 1 ||            //Ndcm is fixed to 1 for FA
22110152Satgutier@umich.edu                          Nspd < 1 || Nspd > 1 || //Nspd is fixed to 1 for FA
22210152Satgutier@umich.edu                          Ndsam_lev_1 != 1 ||     //Ndsam_lev_1 is fixed to one
22310152Satgutier@umich.edu                          Ndsam_lev_2 != 1 ||     //Ndsam_lev_2 is fixed to one
22410152Satgutier@umich.edu                          Ndbl < 2)
22510152Satgutier@umich.edu          {
22610152Satgutier@umich.edu          return;
22710152Satgutier@umich.edu          }
22810152Satgutier@umich.edu  }
22910152Satgutier@umich.edu
23010152Satgutier@umich.edu  if ((is_dram) && (!is_tag) && (Ndcm > 1))
23110152Satgutier@umich.edu  {
23210152Satgutier@umich.edu          return;  // For a DRAM array, each bitline has its own sense-amp
23310152Satgutier@umich.edu  }
23410152Satgutier@umich.edu
23510152Satgutier@umich.edu  // If it's not an FA tag/data array, Ndwl should be at least two and Ndbl should be
23610152Satgutier@umich.edu  // at least two because an array is assumed to have at least one mat. And a mat
23710152Satgutier@umich.edu  // is formed out of two horizontal subarrays and two vertical subarrays
23810152Satgutier@umich.edu  if (fully_assoc == false && (Ndwl < 1 || Ndbl < 1))
23910152Satgutier@umich.edu  {
24010152Satgutier@umich.edu          return;
24110152Satgutier@umich.edu  }
24210152Satgutier@umich.edu
24310152Satgutier@umich.edu  //***********compute row, col of an subarray
24410152Satgutier@umich.edu  if (!(fully_assoc || pure_cam))//Not fully_asso nor cam
24510152Satgutier@umich.edu  {
24610152Satgutier@umich.edu          // if data array, let tagbits = 0
24710152Satgutier@umich.edu          if (is_tag)
24810152Satgutier@umich.edu          {
24910152Satgutier@umich.edu                  if (g_ip->specific_tag)
25010152Satgutier@umich.edu                  {
25110152Satgutier@umich.edu                          tagbits = g_ip->tag_w;
25210152Satgutier@umich.edu                  }
25310152Satgutier@umich.edu                  else
25410152Satgutier@umich.edu                  {
25510152Satgutier@umich.edu                          tagbits = ADDRESS_BITS + EXTRA_TAG_BITS - _log2(capacity_per_die) +
25610152Satgutier@umich.edu                          _log2(g_ip->tag_assoc*2 - 1) - _log2(g_ip->nbanks);
25710152Satgutier@umich.edu
25810152Satgutier@umich.edu                  }
25910152Satgutier@umich.edu                  tagbits = (((tagbits + 3) >> 2) << 2);
26010152Satgutier@umich.edu
26110152Satgutier@umich.edu                  num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks *
26210152Satgutier@umich.edu                                  g_ip->block_sz * g_ip->tag_assoc * Ndbl * Nspd));// + EPSILON);
26310152Satgutier@umich.edu                  num_c_subarray = (int)ceil((tagbits * g_ip->tag_assoc * Nspd / Ndwl));// + EPSILON);
26410152Satgutier@umich.edu                  //burst_length = 1;
26510152Satgutier@umich.edu          }
26610152Satgutier@umich.edu          else
26710152Satgutier@umich.edu          {
26810152Satgutier@umich.edu                  num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks *
26910152Satgutier@umich.edu                                  g_ip->block_sz * g_ip->data_assoc * Ndbl * Nspd));// + EPSILON);
27010152Satgutier@umich.edu                  num_c_subarray = (int)ceil((8 * g_ip->block_sz * g_ip->data_assoc * Nspd / Ndwl));// + EPSILON); + EPSILON);
27110152Satgutier@umich.edu                  // burst_length = g_ip->block_sz * 8 / g_ip->out_w;
27210152Satgutier@umich.edu          }
27310152Satgutier@umich.edu
27410152Satgutier@umich.edu          if (num_r_subarray < MINSUBARRAYROWS) return;
27510152Satgutier@umich.edu          if (num_r_subarray == 0) return;
27610152Satgutier@umich.edu          if (num_r_subarray > MAXSUBARRAYROWS) return;
27710152Satgutier@umich.edu          if (num_c_subarray < MINSUBARRAYCOLS) return;
27810152Satgutier@umich.edu          if (num_c_subarray > MAXSUBARRAYCOLS) return;
27910152Satgutier@umich.edu
28010152Satgutier@umich.edu  }
28110152Satgutier@umich.edu
28210152Satgutier@umich.edu  else
28310152Satgutier@umich.edu  {//either fully-asso or cam
28410152Satgutier@umich.edu          if (pure_cam)
28510152Satgutier@umich.edu          {
28610152Satgutier@umich.edu                  if (g_ip->specific_tag)
28710152Satgutier@umich.edu                  {
28810152Satgutier@umich.edu                          tagbits = int(ceil(g_ip->tag_w/8.0)*8);
28910152Satgutier@umich.edu                  }
29010152Satgutier@umich.edu                  else
29110152Satgutier@umich.edu                  {
29210152Satgutier@umich.edu                          tagbits = int(ceil((ADDRESS_BITS + EXTRA_TAG_BITS)/8.0)*8);
29310152Satgutier@umich.edu//			  cout<<"Pure CAM needs tag width to be specified"<<endl;
29410152Satgutier@umich.edu//			  exit(0);
29510152Satgutier@umich.edu                  }
29610152Satgutier@umich.edu                  //tagbits = (((tagbits + 3) >> 2) << 2);
29710152Satgutier@umich.edu
29810152Satgutier@umich.edu                  tag_num_r_subarray = (int)ceil(capacity_per_die / (g_ip->nbanks*tagbits/8.0 * Ndbl));//TODO: error check input of tagbits and blocksize //TODO: for pure CAM, g_ip->block should be number of entries.
29910152Satgutier@umich.edu                  //tag_num_c_subarray = (int)(tagbits  + EPSILON);
30010152Satgutier@umich.edu                  tag_num_c_subarray = tagbits;
30110152Satgutier@umich.edu                  if (tag_num_r_subarray == 0) return;
30210152Satgutier@umich.edu                  if (tag_num_r_subarray > MAXSUBARRAYROWS) return;
30310152Satgutier@umich.edu                  if (tag_num_c_subarray < MINSUBARRAYCOLS) return;
30410152Satgutier@umich.edu                  if (tag_num_c_subarray > MAXSUBARRAYCOLS) return;
30510152Satgutier@umich.edu                  num_r_subarray = tag_num_r_subarray;
30610152Satgutier@umich.edu          }
30710152Satgutier@umich.edu          else //fully associative
30810152Satgutier@umich.edu          {
30910152Satgutier@umich.edu                  if (g_ip->specific_tag)
31010152Satgutier@umich.edu                  {
31110152Satgutier@umich.edu                          tagbits = g_ip->tag_w;
31210152Satgutier@umich.edu                  }
31310152Satgutier@umich.edu                  else
31410152Satgutier@umich.edu                  {
31510152Satgutier@umich.edu                          tagbits = ADDRESS_BITS + EXTRA_TAG_BITS - _log2(g_ip->block_sz);//TODO: should be the page_offset=log2(page size), but this info is not avail with CACTI, for McPAT this is no problem.
31610152Satgutier@umich.edu                  }
31710152Satgutier@umich.edu                  tagbits = (((tagbits + 3) >> 2) << 2);
31810152Satgutier@umich.edu
31910152Satgutier@umich.edu                  tag_num_r_subarray = (int)(capacity_per_die / (g_ip->nbanks*g_ip->block_sz * Ndbl));
32010152Satgutier@umich.edu                  tag_num_c_subarray = (int)ceil((tagbits * Nspd / Ndwl));// + EPSILON);
32110152Satgutier@umich.edu                  if (tag_num_r_subarray == 0) return;
32210152Satgutier@umich.edu                  if (tag_num_r_subarray > MAXSUBARRAYROWS) return;
32310152Satgutier@umich.edu                  if (tag_num_c_subarray < MINSUBARRAYCOLS) return;
32410152Satgutier@umich.edu                  if (tag_num_c_subarray > MAXSUBARRAYCOLS) return;
32510152Satgutier@umich.edu
32610152Satgutier@umich.edu                  data_num_r_subarray = tag_num_r_subarray;
32710152Satgutier@umich.edu                  data_num_c_subarray = 8 * g_ip->block_sz;
32810152Satgutier@umich.edu                  if (data_num_r_subarray == 0) return;
32910152Satgutier@umich.edu                  if (data_num_r_subarray > MAXSUBARRAYROWS) return;
33010152Satgutier@umich.edu                  if (data_num_c_subarray < MINSUBARRAYCOLS) return;
33110152Satgutier@umich.edu                  if (data_num_c_subarray > MAXSUBARRAYCOLS) return;
33210152Satgutier@umich.edu                  num_r_subarray = tag_num_r_subarray;
33310152Satgutier@umich.edu          }
33410152Satgutier@umich.edu  }
33510152Satgutier@umich.edu
33610152Satgutier@umich.edu  num_subarrays = Ndwl * Ndbl;
33710152Satgutier@umich.edu  //****************end of computation of row, col of an subarray
33810152Satgutier@umich.edu
33910152Satgutier@umich.edu  // calculate wire parameters
34010152Satgutier@umich.edu  if (fully_assoc || pure_cam)
34110152Satgutier@umich.edu  {
34210152Satgutier@umich.edu          cam_cell.h = g_tp.cam.b_h + 2 * wire_local.pitch * (g_ip->num_rw_ports-1 + g_ip->num_rd_ports + g_ip->num_wr_ports)
34310152Satgutier@umich.edu          + 2 * wire_local.pitch*(g_ip->num_search_ports-1) + wire_local.pitch * g_ip->num_se_rd_ports;
34410152Satgutier@umich.edu          cam_cell.w = g_tp.cam.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports-1 + g_ip->num_rd_ports + g_ip->num_wr_ports)
34510152Satgutier@umich.edu          + 2 * wire_local.pitch*(g_ip->num_search_ports-1) + wire_local.pitch * g_ip->num_se_rd_ports;
34610152Satgutier@umich.edu
34710152Satgutier@umich.edu          cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_wr_ports +g_ip->num_rw_ports-1 + g_ip->num_rd_ports)
34810152Satgutier@umich.edu          + 2 * wire_local.pitch*(g_ip->num_search_ports-1);
34910152Satgutier@umich.edu          cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports -1 + (g_ip->num_rd_ports - g_ip->num_se_rd_ports)
35010152Satgutier@umich.edu                          + g_ip->num_wr_ports) + g_tp.wire_local.pitch * g_ip->num_se_rd_ports + 2 * wire_local.pitch*(g_ip->num_search_ports-1);
35110152Satgutier@umich.edu  }
35210152Satgutier@umich.edu  else
35310152Satgutier@umich.edu  {
35410152Satgutier@umich.edu          if(is_tag)
35510152Satgutier@umich.edu          {
35610152Satgutier@umich.edu                  cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 + g_ip->num_rd_ports +
35710152Satgutier@umich.edu                                  g_ip->num_wr_ports);
35810152Satgutier@umich.edu                  cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 + g_ip->num_wr_ports +
35910152Satgutier@umich.edu                                  (g_ip->num_rd_ports - g_ip->num_se_rd_ports)) +
36010152Satgutier@umich.edu                                  wire_local.pitch * g_ip->num_se_rd_ports;
36110152Satgutier@umich.edu          }
36210152Satgutier@umich.edu          else
36310152Satgutier@umich.edu          {
36410152Satgutier@umich.edu                  if (is_dram)
36510152Satgutier@umich.edu                  {
36610152Satgutier@umich.edu                          cell.h = g_tp.dram.b_h;
36710152Satgutier@umich.edu                          cell.w = g_tp.dram.b_w;
36810152Satgutier@umich.edu                  }
36910152Satgutier@umich.edu                  else
37010152Satgutier@umich.edu                  {
37110152Satgutier@umich.edu                          cell.h = g_tp.sram.b_h + 2 * wire_local.pitch * (g_ip->num_wr_ports +
37210152Satgutier@umich.edu                                          g_ip->num_rw_ports - 1 + g_ip->num_rd_ports);
37310152Satgutier@umich.edu                          cell.w = g_tp.sram.b_w + 2 * wire_local.pitch * (g_ip->num_rw_ports - 1 +
37410152Satgutier@umich.edu                                          (g_ip->num_rd_ports - g_ip->num_se_rd_ports) +
37510152Satgutier@umich.edu                                          g_ip->num_wr_ports) + g_tp.wire_local.pitch * g_ip->num_se_rd_ports;
37610152Satgutier@umich.edu                  }
37710152Satgutier@umich.edu          }
37810152Satgutier@umich.edu  }
37910152Satgutier@umich.edu
38010152Satgutier@umich.edu  double c_b_metal = cell.h * wire_local.C_per_um;
38110152Satgutier@umich.edu  double C_bl;
38210152Satgutier@umich.edu
38310152Satgutier@umich.edu  if (!(fully_assoc || pure_cam))
38410152Satgutier@umich.edu  {
38510152Satgutier@umich.edu          if (is_dram)
38610152Satgutier@umich.edu          {
38710152Satgutier@umich.edu                  deg_bl_muxing = 1;
38810152Satgutier@umich.edu                  if (ram_cell_tech_type == comm_dram)
38910152Satgutier@umich.edu                  {
39010152Satgutier@umich.edu                          C_bl  = num_r_subarray * c_b_metal;
39110152Satgutier@umich.edu                          V_b_sense = (g_tp.dram_cell_Vdd/2) * g_tp.dram_cell_C / (g_tp.dram_cell_C + C_bl);
39210152Satgutier@umich.edu                          if (V_b_sense < VBITSENSEMIN)
39310152Satgutier@umich.edu                          {
39410152Satgutier@umich.edu                                  return;
39510152Satgutier@umich.edu                          }
39610152Satgutier@umich.edu                          V_b_sense = VBITSENSEMIN;  // in any case, we fix sense amp input signal to a constant value
39710152Satgutier@umich.edu                          dram_refresh_period = 64e-3;
39810152Satgutier@umich.edu                  }
39910152Satgutier@umich.edu                  else
40010152Satgutier@umich.edu                  {
40110152Satgutier@umich.edu                          double Cbitrow_drain_cap = drain_C_(g_tp.dram.cell_a_w, NCH, 1, 0, cell.w, true, true) / 2.0;
40210152Satgutier@umich.edu                          C_bl  = num_r_subarray * (Cbitrow_drain_cap + c_b_metal);
40310152Satgutier@umich.edu                          V_b_sense = (g_tp.dram_cell_Vdd/2) * g_tp.dram_cell_C /(g_tp.dram_cell_C + C_bl);
40410152Satgutier@umich.edu
40510152Satgutier@umich.edu                          if (V_b_sense < VBITSENSEMIN)
40610152Satgutier@umich.edu                          {
40710152Satgutier@umich.edu                                  return; //Sense amp input signal is smaller that minimum allowable sense amp input signal
40810152Satgutier@umich.edu                          }
40910152Satgutier@umich.edu                          V_b_sense = VBITSENSEMIN; // in any case, we fix sense amp input signal to a constant value
41010152Satgutier@umich.edu                          //v_storage_worst = g_tp.dram_cell_Vdd / 2 - VBITSENSEMIN * (g_tp.dram_cell_C + C_bl) / g_tp.dram_cell_C;
41110152Satgutier@umich.edu                          //dram_refresh_period = 1.1 * g_tp.dram_cell_C * v_storage_worst / g_tp.dram_cell_I_off_worst_case_len_temp;
41210152Satgutier@umich.edu                          dram_refresh_period = 0.9 * g_tp.dram_cell_C * VDD_STORAGE_LOSS_FRACTION_WORST * g_tp.dram_cell_Vdd / g_tp.dram_cell_I_off_worst_case_len_temp;
41310152Satgutier@umich.edu                  }
41410152Satgutier@umich.edu          }
41510152Satgutier@umich.edu          else
41610152Satgutier@umich.edu          { //SRAM
41710152Satgutier@umich.edu                  V_b_sense = (0.05 * g_tp.sram_cell.Vdd > VBITSENSEMIN) ? 0.05 * g_tp.sram_cell.Vdd : VBITSENSEMIN;
41810152Satgutier@umich.edu                  deg_bl_muxing = Ndcm;
41910152Satgutier@umich.edu                  // "/ 2.0" below is due to the fact that two adjacent access transistors share drain
42010152Satgutier@umich.edu                  // contacts in a physical layout
42110152Satgutier@umich.edu                  double Cbitrow_drain_cap = drain_C_(g_tp.sram.cell_a_w, NCH, 1, 0, cell.w, false, true) / 2.0;
42210152Satgutier@umich.edu                  C_bl = num_r_subarray * (Cbitrow_drain_cap + c_b_metal);
42310152Satgutier@umich.edu                  dram_refresh_period = 0;
42410152Satgutier@umich.edu          }
42510152Satgutier@umich.edu  }
42610152Satgutier@umich.edu  else
42710152Satgutier@umich.edu  {
42810152Satgutier@umich.edu          c_b_metal = cam_cell.h * wire_local.C_per_um;//IBM and SUN design, SRAM array uses dummy cells to fill the blank space due to mismatch on CAM-RAM
42910152Satgutier@umich.edu          V_b_sense = (0.05 * g_tp.sram_cell.Vdd > VBITSENSEMIN) ? 0.05 * g_tp.sram_cell.Vdd : VBITSENSEMIN;
43010152Satgutier@umich.edu          deg_bl_muxing = 1;//FA fix as 1
43110152Satgutier@umich.edu          // "/ 2.0" below is due to the fact that two adjacent access transistors share drain
43210152Satgutier@umich.edu          // contacts in a physical layout
43310152Satgutier@umich.edu          double Cbitrow_drain_cap = drain_C_(g_tp.cam.cell_a_w, NCH, 1, 0, cam_cell.w, false, true) / 2.0;//TODO: comment out these two lines
43410152Satgutier@umich.edu          C_bl = num_r_subarray * (Cbitrow_drain_cap + c_b_metal);
43510152Satgutier@umich.edu          dram_refresh_period = 0;
43610152Satgutier@umich.edu  }
43710152Satgutier@umich.edu
43810152Satgutier@umich.edu
43910152Satgutier@umich.edu  // do/di: data in/out, for fully associative they are the data width for normal read and write
44010152Satgutier@umich.edu  // so/si: search data in/out, for fully associative they are the data width for the search ops
44110152Satgutier@umich.edu  // for CAM, si=di, but so = matching address. do = data out = di (for normal read/write)
44210152Satgutier@umich.edu  // so/si needs broadcase while do/di do not
44310152Satgutier@umich.edu
44410152Satgutier@umich.edu  if (fully_assoc || pure_cam)
44510152Satgutier@umich.edu  {
44610152Satgutier@umich.edu            switch (Ndbl) {
44710152Satgutier@umich.edu              case (0):
44810152Satgutier@umich.edu                cout <<  "   Invalid Ndbl \n"<<endl;
44910152Satgutier@umich.edu                exit(0);
45010152Satgutier@umich.edu                break;
45110152Satgutier@umich.edu              case (1):
45210152Satgutier@umich.edu                  num_mats_h_dir = 1;//one subarray per mat
45310152Satgutier@umich.edu                  num_mats_v_dir = 1;
45410152Satgutier@umich.edu                break;
45510152Satgutier@umich.edu              case (2):
45610152Satgutier@umich.edu                  num_mats_h_dir = 1;//two subarrays per mat
45710152Satgutier@umich.edu                  num_mats_v_dir = 1;
45810152Satgutier@umich.edu                  break;
45910152Satgutier@umich.edu              default:
46010152Satgutier@umich.edu                  num_mats_h_dir = int(floor(sqrt(Ndbl/4.0)));//4 subbarrys per mat
46110152Satgutier@umich.edu                  num_mats_v_dir = int(Ndbl/4.0 / num_mats_h_dir);
46210152Satgutier@umich.edu            }
46310152Satgutier@umich.edu            num_mats = num_mats_h_dir * num_mats_v_dir;
46410152Satgutier@umich.edu
46510152Satgutier@umich.edu            if (fully_assoc)
46610152Satgutier@umich.edu            {
46710152Satgutier@umich.edu                num_so_b_mat   = data_num_c_subarray;
46810152Satgutier@umich.edu                num_do_b_mat   = data_num_c_subarray + tagbits;
46910152Satgutier@umich.edu            }
47010152Satgutier@umich.edu            else
47110152Satgutier@umich.edu            {
47210152Satgutier@umich.edu                num_so_b_mat = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays)));//the address contains the matched data
47310152Satgutier@umich.edu                num_do_b_mat = tagbits;
47410152Satgutier@umich.edu            }
47510152Satgutier@umich.edu  }
47610152Satgutier@umich.edu  else
47710152Satgutier@umich.edu  {
47810152Satgutier@umich.edu          num_mats_h_dir = MAX(Ndwl / 2, 1);
47910152Satgutier@umich.edu          num_mats_v_dir = MAX(Ndbl / 2, 1);
48010152Satgutier@umich.edu          num_mats       = num_mats_h_dir * num_mats_v_dir;
48110152Satgutier@umich.edu          num_do_b_mat   = MAX((num_subarrays/num_mats) * num_c_subarray / (deg_bl_muxing * Ndsam_lev_1 * Ndsam_lev_2), 1);
48210152Satgutier@umich.edu  }
48310152Satgutier@umich.edu
48410152Satgutier@umich.edu  if (!(fully_assoc|| pure_cam) && (num_do_b_mat < (num_subarrays/num_mats)))
48510152Satgutier@umich.edu  {
48610152Satgutier@umich.edu          return;
48710152Satgutier@umich.edu  }
48810152Satgutier@umich.edu
48910152Satgutier@umich.edu
49010152Satgutier@umich.edu  int deg_sa_mux_l1_non_assoc;
49110152Satgutier@umich.edu  //TODO:the i/o for subbank is not necessary and should be removed.
49210152Satgutier@umich.edu  if (!(fully_assoc || pure_cam))
49310152Satgutier@umich.edu  {
49410152Satgutier@umich.edu          if (!is_tag)
49510152Satgutier@umich.edu          {
49610152Satgutier@umich.edu                  if (is_main_mem == true)
49710152Satgutier@umich.edu                  {
49810152Satgutier@umich.edu                          num_do_b_subbank = g_ip->int_prefetch_w * g_ip->out_w;
49910152Satgutier@umich.edu                          deg_sa_mux_l1_non_assoc = Ndsam_lev_1;
50010152Satgutier@umich.edu                  }
50110152Satgutier@umich.edu                  else
50210152Satgutier@umich.edu                  {
50310152Satgutier@umich.edu                          if (g_ip->fast_access == true)
50410152Satgutier@umich.edu                          {
50510152Satgutier@umich.edu                                  num_do_b_subbank = g_ip->out_w * g_ip->data_assoc;
50610152Satgutier@umich.edu                                  deg_sa_mux_l1_non_assoc = Ndsam_lev_1;
50710152Satgutier@umich.edu                          }
50810152Satgutier@umich.edu                          else
50910152Satgutier@umich.edu                          {
51010152Satgutier@umich.edu
51110152Satgutier@umich.edu                                  num_do_b_subbank = g_ip->out_w;
51210152Satgutier@umich.edu                                  deg_sa_mux_l1_non_assoc = Ndsam_lev_1 / g_ip->data_assoc;
51310152Satgutier@umich.edu                                  if (deg_sa_mux_l1_non_assoc < 1)
51410152Satgutier@umich.edu                                  {
51510152Satgutier@umich.edu                                          return;
51610152Satgutier@umich.edu                                  }
51710152Satgutier@umich.edu
51810152Satgutier@umich.edu                          }
51910152Satgutier@umich.edu                  }
52010152Satgutier@umich.edu          }
52110152Satgutier@umich.edu          else
52210152Satgutier@umich.edu          {
52310152Satgutier@umich.edu                  num_do_b_subbank = tagbits * g_ip->tag_assoc;
52410152Satgutier@umich.edu                  if (num_do_b_mat < tagbits)
52510152Satgutier@umich.edu                  {
52610152Satgutier@umich.edu                          return;
52710152Satgutier@umich.edu                  }
52810152Satgutier@umich.edu                  deg_sa_mux_l1_non_assoc = Ndsam_lev_1;
52910152Satgutier@umich.edu                  //num_do_b_mat = g_ip->tag_assoc / num_mats_h_dir;
53010152Satgutier@umich.edu          }
53110152Satgutier@umich.edu  }
53210152Satgutier@umich.edu  else
53310152Satgutier@umich.edu  {
53410152Satgutier@umich.edu          if (fully_assoc)
53510152Satgutier@umich.edu          {
53610152Satgutier@umich.edu                  num_so_b_subbank = 8 * g_ip->block_sz;//TODO:internal perfetch should be considered also for fa
53710152Satgutier@umich.edu                  num_do_b_subbank = num_so_b_subbank + tag_num_c_subarray;
53810152Satgutier@umich.edu          }
53910152Satgutier@umich.edu          else
54010152Satgutier@umich.edu          {
54110152Satgutier@umich.edu                  num_so_b_subbank = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays)));//the address contains the matched data
54210152Satgutier@umich.edu                  num_do_b_subbank = tag_num_c_subarray;
54310152Satgutier@umich.edu          }
54410152Satgutier@umich.edu
54510152Satgutier@umich.edu          deg_sa_mux_l1_non_assoc = 1;
54610152Satgutier@umich.edu  }
54710152Satgutier@umich.edu
54810152Satgutier@umich.edu  deg_senseamp_muxing_non_associativity = deg_sa_mux_l1_non_assoc;
54910152Satgutier@umich.edu
55010152Satgutier@umich.edu  if (fully_assoc || pure_cam)
55110152Satgutier@umich.edu  {
55210152Satgutier@umich.edu          num_act_mats_hor_dir = 1;
55310152Satgutier@umich.edu          num_act_mats_hor_dir_sl = num_mats_h_dir;//TODO: this is unnecessary, since search op, num_mats is used
55410152Satgutier@umich.edu  }
55510152Satgutier@umich.edu  else
55610152Satgutier@umich.edu  {
55710152Satgutier@umich.edu          num_act_mats_hor_dir = num_do_b_subbank / num_do_b_mat;
55810152Satgutier@umich.edu          if (num_act_mats_hor_dir == 0)
55910152Satgutier@umich.edu          {
56010152Satgutier@umich.edu                  return;
56110152Satgutier@umich.edu          }
56210152Satgutier@umich.edu  }
56310152Satgutier@umich.edu
56410152Satgutier@umich.edu  //compute num_do_mat for tag
56510152Satgutier@umich.edu  if (is_tag)
56610152Satgutier@umich.edu  {
56710152Satgutier@umich.edu          if (!(fully_assoc || pure_cam))
56810152Satgutier@umich.edu          {
56910152Satgutier@umich.edu                  num_do_b_mat     = g_ip->tag_assoc / num_act_mats_hor_dir;
57010152Satgutier@umich.edu                  num_do_b_subbank = num_act_mats_hor_dir * num_do_b_mat;
57110152Satgutier@umich.edu          }
57210152Satgutier@umich.edu  }
57310152Satgutier@umich.edu
57410152Satgutier@umich.edu  if ((g_ip->is_cache == false && is_main_mem == true) || (PAGE_MODE == 1 && is_dram))
57510152Satgutier@umich.edu  {
57610152Satgutier@umich.edu          if (num_act_mats_hor_dir * num_do_b_mat * Ndsam_lev_1 * Ndsam_lev_2 != (int)g_ip->page_sz_bits)
57710152Satgutier@umich.edu          {
57810152Satgutier@umich.edu                  return;
57910152Satgutier@umich.edu          }
58010152Satgutier@umich.edu  }
58110152Satgutier@umich.edu
58210152Satgutier@umich.edu//  if (is_tag == false && g_ip->is_cache == true && !fully_assoc && !pure_cam && //TODO: TODO burst transfer should also apply to RAM arrays
58310152Satgutier@umich.edu  if (is_tag == false && g_ip->is_main_mem == true &&
58410152Satgutier@umich.edu                  num_act_mats_hor_dir*num_do_b_mat*Ndsam_lev_1*Ndsam_lev_2 < ((int) g_ip->out_w * (int) g_ip->burst_len * (int) g_ip->data_assoc))
58510152Satgutier@umich.edu  {
58610152Satgutier@umich.edu          return;
58710152Satgutier@umich.edu  }
58810152Satgutier@umich.edu
58910152Satgutier@umich.edu  if (num_act_mats_hor_dir > num_mats_h_dir)
59010152Satgutier@umich.edu  {
59110152Satgutier@umich.edu          return;
59210152Satgutier@umich.edu  }
59310152Satgutier@umich.edu
59410152Satgutier@umich.edu
59510152Satgutier@umich.edu  //compute di for mat subbank and bank
59610152Satgutier@umich.edu  if (!(fully_assoc ||pure_cam))
59710152Satgutier@umich.edu  {
59810152Satgutier@umich.edu          if(!is_tag)
59910152Satgutier@umich.edu          {
60010152Satgutier@umich.edu                  if(g_ip->fast_access == true)
60110152Satgutier@umich.edu                  {
60210152Satgutier@umich.edu                          num_di_b_mat = num_do_b_mat / g_ip->data_assoc;
60310152Satgutier@umich.edu                  }
60410152Satgutier@umich.edu                  else
60510152Satgutier@umich.edu                  {
60610152Satgutier@umich.edu                          num_di_b_mat = num_do_b_mat;
60710152Satgutier@umich.edu                  }
60810152Satgutier@umich.edu          }
60910152Satgutier@umich.edu          else
61010152Satgutier@umich.edu          {
61110152Satgutier@umich.edu                  num_di_b_mat = tagbits;
61210152Satgutier@umich.edu          }
61310152Satgutier@umich.edu  }
61410152Satgutier@umich.edu  else
61510152Satgutier@umich.edu  {
61610152Satgutier@umich.edu          if (fully_assoc)
61710152Satgutier@umich.edu          {
61810152Satgutier@umich.edu                  num_di_b_mat = num_do_b_mat;
61910152Satgutier@umich.edu                  //*num_subarrays/num_mats; bits per mat of CAM/FA is as same as cache,
62010152Satgutier@umich.edu                  //but inside the mat wire tracks need to be reserved for search data bus
62110152Satgutier@umich.edu                  num_si_b_mat = tagbits;
62210152Satgutier@umich.edu          }
62310152Satgutier@umich.edu          else
62410152Satgutier@umich.edu          {
62510152Satgutier@umich.edu                  num_di_b_mat = tagbits;
62610152Satgutier@umich.edu                  num_si_b_mat = tagbits;//*num_subarrays/num_mats;
62710152Satgutier@umich.edu          }
62810152Satgutier@umich.edu
62910152Satgutier@umich.edu  }
63010152Satgutier@umich.edu
63110152Satgutier@umich.edu  num_di_b_subbank       = num_di_b_mat * num_act_mats_hor_dir;//normal cache or normal r/w for FA
63210152Satgutier@umich.edu  num_si_b_subbank       = num_si_b_mat; //* num_act_mats_hor_dir_sl; inside the data is broadcast
63310152Satgutier@umich.edu
63410152Satgutier@umich.edu  int num_addr_b_row_dec     = _log2(num_r_subarray);
63510152Satgutier@umich.edu  if  ((fully_assoc ||pure_cam))
63610152Satgutier@umich.edu          num_addr_b_row_dec     +=_log2(num_subarrays/num_mats);
63710152Satgutier@umich.edu  int number_subbanks        = num_mats / num_act_mats_hor_dir;
63810152Satgutier@umich.edu  number_subbanks_decode = _log2(number_subbanks);//TODO: add log2(num_subarray_per_bank) to FA/CAM
63910152Satgutier@umich.edu
64010152Satgutier@umich.edu  num_rw_ports = g_ip->num_rw_ports;
64110152Satgutier@umich.edu  num_rd_ports = g_ip->num_rd_ports;
64210152Satgutier@umich.edu  num_wr_ports = g_ip->num_wr_ports;
64310152Satgutier@umich.edu  num_se_rd_ports = g_ip->num_se_rd_ports;
64410152Satgutier@umich.edu  num_search_ports = g_ip->num_search_ports;
64510152Satgutier@umich.edu
64610152Satgutier@umich.edu  if (is_dram && is_main_mem)
64710152Satgutier@umich.edu  {
64810152Satgutier@umich.edu          number_addr_bits_mat = MAX((unsigned int) num_addr_b_row_dec,
64910152Satgutier@umich.edu                          _log2(deg_bl_muxing) + _log2(deg_sa_mux_l1_non_assoc) + _log2(Ndsam_lev_2));
65010152Satgutier@umich.edu  }
65110152Satgutier@umich.edu  else
65210152Satgutier@umich.edu  {
65310152Satgutier@umich.edu          number_addr_bits_mat = num_addr_b_row_dec + _log2(deg_bl_muxing) +
65410152Satgutier@umich.edu          _log2(deg_sa_mux_l1_non_assoc) + _log2(Ndsam_lev_2);
65510152Satgutier@umich.edu  }
65610152Satgutier@umich.edu
65710152Satgutier@umich.edu  if (!(fully_assoc ||pure_cam))
65810152Satgutier@umich.edu  {
65910152Satgutier@umich.edu          if (is_tag)
66010152Satgutier@umich.edu          {
66110152Satgutier@umich.edu                  num_di_b_bank_per_port = tagbits;
66210152Satgutier@umich.edu                  num_do_b_bank_per_port = g_ip->data_assoc;
66310152Satgutier@umich.edu          }
66410152Satgutier@umich.edu          else
66510152Satgutier@umich.edu          {
66610152Satgutier@umich.edu                  num_di_b_bank_per_port = g_ip->out_w + g_ip->data_assoc;
66710152Satgutier@umich.edu                  num_do_b_bank_per_port = g_ip->out_w;
66810152Satgutier@umich.edu          }
66910152Satgutier@umich.edu  }
67010152Satgutier@umich.edu  else
67110152Satgutier@umich.edu  {
67210152Satgutier@umich.edu          if (fully_assoc)
67310152Satgutier@umich.edu          {
67410152Satgutier@umich.edu                  num_di_b_bank_per_port = g_ip->out_w + tagbits;//TODO: out_w or block_sz?
67510152Satgutier@umich.edu                  num_si_b_bank_per_port = tagbits;
67610152Satgutier@umich.edu                  num_do_b_bank_per_port = g_ip->out_w + tagbits;
67710152Satgutier@umich.edu                  num_so_b_bank_per_port = g_ip->out_w;
67810152Satgutier@umich.edu          }
67910152Satgutier@umich.edu          else
68010152Satgutier@umich.edu          {
68110152Satgutier@umich.edu                  num_di_b_bank_per_port = tagbits;
68210152Satgutier@umich.edu                  num_si_b_bank_per_port = tagbits;
68310152Satgutier@umich.edu                  num_do_b_bank_per_port = tagbits;
68410152Satgutier@umich.edu                  num_so_b_bank_per_port = int(ceil(log2(num_r_subarray)) + ceil(log2(num_subarrays)));
68510152Satgutier@umich.edu          }
68610152Satgutier@umich.edu  }
68710152Satgutier@umich.edu
68810152Satgutier@umich.edu  if ((!is_tag) && (g_ip->data_assoc > 1) && (!g_ip->fast_access))
68910152Satgutier@umich.edu  {
69010152Satgutier@umich.edu          number_way_select_signals_mat = g_ip->data_assoc;
69110152Satgutier@umich.edu  }
69210152Satgutier@umich.edu
69310152Satgutier@umich.edu  // add ECC adjustment to all data signals that traverse on H-trees.
69410152Satgutier@umich.edu  if (g_ip->add_ecc_b_ == true)
69510152Satgutier@umich.edu  {
69610152Satgutier@umich.edu          num_do_b_mat += (int) (ceil(num_do_b_mat / num_bits_per_ecc_b_));
69710152Satgutier@umich.edu          num_di_b_mat += (int) (ceil(num_di_b_mat / num_bits_per_ecc_b_));
69810152Satgutier@umich.edu          num_di_b_subbank += (int) (ceil(num_di_b_subbank / num_bits_per_ecc_b_));
69910152Satgutier@umich.edu          num_do_b_subbank += (int) (ceil(num_do_b_subbank / num_bits_per_ecc_b_));
70010152Satgutier@umich.edu          num_di_b_bank_per_port += (int) (ceil(num_di_b_bank_per_port / num_bits_per_ecc_b_));
70110152Satgutier@umich.edu          num_do_b_bank_per_port += (int) (ceil(num_do_b_bank_per_port / num_bits_per_ecc_b_));
70210152Satgutier@umich.edu
70310152Satgutier@umich.edu          num_so_b_mat += (int) (ceil(num_so_b_mat / num_bits_per_ecc_b_));
70410152Satgutier@umich.edu          num_si_b_mat += (int) (ceil(num_si_b_mat / num_bits_per_ecc_b_));
70510152Satgutier@umich.edu          num_si_b_subbank += (int) (ceil(num_si_b_subbank / num_bits_per_ecc_b_));
70610152Satgutier@umich.edu          num_so_b_subbank += (int) (ceil(num_so_b_subbank / num_bits_per_ecc_b_));
70710152Satgutier@umich.edu          num_si_b_bank_per_port += (int) (ceil(num_si_b_bank_per_port / num_bits_per_ecc_b_));
70810152Satgutier@umich.edu          num_so_b_bank_per_port += (int) (ceil(num_so_b_bank_per_port / num_bits_per_ecc_b_));
70910152Satgutier@umich.edu  }
71010152Satgutier@umich.edu
71110152Satgutier@umich.edu  is_valid = true;
71210152Satgutier@umich.edu}
71310152Satgutier@umich.edu
714