mat.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 <cassert>
3510152Satgutier@umich.edu
3610152Satgutier@umich.edu#include "mat.h"
3710152Satgutier@umich.edu
3810152Satgutier@umich.eduMat::Mat(const DynamicParameter & dyn_p)
3910152Satgutier@umich.edu :dp(dyn_p),
4010152Satgutier@umich.edu  power_subarray_out_drv(),
4110152Satgutier@umich.edu  delay_fa_tag(0), delay_cam(0),
4210152Satgutier@umich.edu  delay_before_decoder(0), delay_bitline(0),
4310152Satgutier@umich.edu  delay_wl_reset(0), delay_bl_restore(0),
4410152Satgutier@umich.edu  delay_searchline(0), delay_matchchline(0),
4510152Satgutier@umich.edu  delay_cam_sl_restore(0), delay_cam_ml_reset(0),
4610152Satgutier@umich.edu  delay_fa_ram_wl(0),delay_hit_miss_reset(0),
4710152Satgutier@umich.edu  delay_hit_miss(0),
4810152Satgutier@umich.edu  subarray(dp, dp.fully_assoc),
4910152Satgutier@umich.edu  power_bitline(), per_bitline_read_energy(0),
5010152Satgutier@umich.edu  deg_bl_muxing(dp.deg_bl_muxing),
5110152Satgutier@umich.edu  num_act_mats_hor_dir(dyn_p.num_act_mats_hor_dir),
5210152Satgutier@umich.edu  delay_writeback(0),
5310152Satgutier@umich.edu  cell(subarray.cell), cam_cell(subarray.cam_cell),
5410152Satgutier@umich.edu  is_dram(dyn_p.is_dram),
5510152Satgutier@umich.edu  pure_cam(dyn_p.pure_cam),
5610152Satgutier@umich.edu  num_mats(dp.num_mats),
5710152Satgutier@umich.edu  power_sa(), delay_sa(0),
5810152Satgutier@umich.edu  leak_power_sense_amps_closed_page_state(0),
5910152Satgutier@umich.edu  leak_power_sense_amps_open_page_state(0),
6010152Satgutier@umich.edu  delay_subarray_out_drv(0),
6110152Satgutier@umich.edu  delay_comparator(0), power_comparator(),
6210152Satgutier@umich.edu  num_do_b_mat(dyn_p.num_do_b_mat), num_so_b_mat(dyn_p.num_so_b_mat),
6310152Satgutier@umich.edu  num_subarrays_per_mat(dp.num_subarrays/dp.num_mats),
6410152Satgutier@umich.edu  num_subarrays_per_row(dp.Ndwl/dp.num_mats_h_dir)
6510152Satgutier@umich.edu{
6610152Satgutier@umich.edu  assert(num_subarrays_per_mat <= 4);
6710152Satgutier@umich.edu  assert(num_subarrays_per_row <= 2);
6810152Satgutier@umich.edu  is_fa = (dp.fully_assoc) ? true : false;
6910152Satgutier@umich.edu  camFlag = (is_fa || pure_cam);//although cam_cell.w = cell.w for fa, we still differentiate them.
7010152Satgutier@umich.edu
7110152Satgutier@umich.edu  if (is_fa || pure_cam)
7210152Satgutier@umich.edu          num_subarrays_per_row = num_subarrays_per_mat>2?num_subarrays_per_mat/2:num_subarrays_per_mat;
7310152Satgutier@umich.edu
7410152Satgutier@umich.edu  if (dp.use_inp_params == 1) {
7510152Satgutier@umich.edu          RWP  = dp.num_rw_ports;
7610152Satgutier@umich.edu          ERP  = dp.num_rd_ports;
7710152Satgutier@umich.edu          EWP  = dp.num_wr_ports;
7810152Satgutier@umich.edu          SCHP = dp.num_search_ports;
7910152Satgutier@umich.edu  }
8010152Satgutier@umich.edu  else {
8110152Satgutier@umich.edu    RWP = g_ip->num_rw_ports;
8210152Satgutier@umich.edu    ERP = g_ip->num_rd_ports;
8310152Satgutier@umich.edu    EWP = g_ip->num_wr_ports;
8410152Satgutier@umich.edu    SCHP = g_ip->num_search_ports;
8510152Satgutier@umich.edu
8610152Satgutier@umich.edu  }
8710152Satgutier@umich.edu
8810152Satgutier@umich.edu  double number_sa_subarray;
8910152Satgutier@umich.edu
9010152Satgutier@umich.edu  if (!is_fa && !pure_cam)
9110152Satgutier@umich.edu  {
9210152Satgutier@umich.edu          number_sa_subarray = subarray.num_cols / deg_bl_muxing;
9310152Satgutier@umich.edu  }
9410152Satgutier@umich.edu  else if (is_fa && !pure_cam)
9510152Satgutier@umich.edu  {
9610152Satgutier@umich.edu          number_sa_subarray =  (subarray.num_cols_fa_cam + subarray.num_cols_fa_ram) / deg_bl_muxing;
9710152Satgutier@umich.edu  }
9810152Satgutier@umich.edu
9910152Satgutier@umich.edu  else
10010152Satgutier@umich.edu  {
10110152Satgutier@umich.edu          number_sa_subarray =  (subarray.num_cols_fa_cam) / deg_bl_muxing;
10210152Satgutier@umich.edu  }
10310152Satgutier@umich.edu
10410152Satgutier@umich.edu  int    num_dec_signals           = subarray.num_rows;
10510152Satgutier@umich.edu  double C_ld_bit_mux_dec_out      = 0;
10610152Satgutier@umich.edu  double C_ld_sa_mux_lev_1_dec_out = 0;
10710152Satgutier@umich.edu  double C_ld_sa_mux_lev_2_dec_out = 0;
10810152Satgutier@umich.edu  double R_wire_wl_drv_out;
10910152Satgutier@umich.edu
11010152Satgutier@umich.edu  if (!is_fa && !pure_cam)
11110152Satgutier@umich.edu    {
11210152Satgutier@umich.edu            R_wire_wl_drv_out = subarray.num_cols * cell.w * g_tp.wire_local.R_per_um;
11310152Satgutier@umich.edu    }
11410152Satgutier@umich.edu    else if (is_fa && !pure_cam)
11510152Satgutier@umich.edu    {
11610152Satgutier@umich.edu        R_wire_wl_drv_out = (subarray.num_cols_fa_cam * cam_cell.w + subarray.num_cols_fa_ram * cell.w) * g_tp.wire_local.R_per_um ;
11710152Satgutier@umich.edu    }
11810152Satgutier@umich.edu    else
11910152Satgutier@umich.edu    {
12010152Satgutier@umich.edu        R_wire_wl_drv_out = (subarray.num_cols_fa_cam * cam_cell.w ) * g_tp.wire_local.R_per_um;
12110152Satgutier@umich.edu    }
12210152Satgutier@umich.edu
12310152Satgutier@umich.edu  double R_wire_bit_mux_dec_out = num_subarrays_per_row * subarray.num_cols * g_tp.wire_inside_mat.R_per_um * cell.w;//TODO:revisit for FA
12410152Satgutier@umich.edu  double R_wire_sa_mux_dec_out  = num_subarrays_per_row * subarray.num_cols * g_tp.wire_inside_mat.R_per_um * cell.w;
12510152Satgutier@umich.edu
12610152Satgutier@umich.edu  if (deg_bl_muxing > 1)
12710152Satgutier@umich.edu  {
12810152Satgutier@umich.edu    C_ld_bit_mux_dec_out =
12910152Satgutier@umich.edu      (2 * num_subarrays_per_mat * subarray.num_cols / deg_bl_muxing)*gate_C(g_tp.w_nmos_b_mux, 0, is_dram) +  // 2 transistor per cell
13010152Satgutier@umich.edu      num_subarrays_per_row * subarray.num_cols*g_tp.wire_inside_mat.C_per_um*cell.get_w();
13110152Satgutier@umich.edu  }
13210152Satgutier@umich.edu
13310152Satgutier@umich.edu  if (dp.Ndsam_lev_1 > 1)
13410152Satgutier@umich.edu  {
13510152Satgutier@umich.edu    C_ld_sa_mux_lev_1_dec_out =
13610152Satgutier@umich.edu      (num_subarrays_per_mat * number_sa_subarray / dp.Ndsam_lev_1)*gate_C(g_tp.w_nmos_sa_mux, 0, is_dram) +
13710152Satgutier@umich.edu      num_subarrays_per_row * subarray.num_cols*g_tp.wire_inside_mat.C_per_um*cell.get_w();
13810152Satgutier@umich.edu  }
13910152Satgutier@umich.edu  if (dp.Ndsam_lev_2 > 1)
14010152Satgutier@umich.edu  {
14110152Satgutier@umich.edu    C_ld_sa_mux_lev_2_dec_out =
14210152Satgutier@umich.edu      (num_subarrays_per_mat * number_sa_subarray / (dp.Ndsam_lev_1*dp.Ndsam_lev_2))*gate_C(g_tp.w_nmos_sa_mux, 0, is_dram) +
14310152Satgutier@umich.edu      num_subarrays_per_row * subarray.num_cols*g_tp.wire_inside_mat.C_per_um*cell.get_w();
14410152Satgutier@umich.edu  }
14510152Satgutier@umich.edu
14610152Satgutier@umich.edu  if (num_subarrays_per_row >= 2)
14710152Satgutier@umich.edu  {
14810152Satgutier@umich.edu    // wire heads for both right and left side of a mat, so half the resistance
14910152Satgutier@umich.edu    R_wire_bit_mux_dec_out /= 2.0;
15010152Satgutier@umich.edu    R_wire_sa_mux_dec_out  /= 2.0;
15110152Satgutier@umich.edu  }
15210152Satgutier@umich.edu
15310152Satgutier@umich.edu
15410152Satgutier@umich.edu  row_dec = new Decoder(
15510152Satgutier@umich.edu      num_dec_signals,
15610152Satgutier@umich.edu      false,
15710152Satgutier@umich.edu      subarray.C_wl,
15810152Satgutier@umich.edu      R_wire_wl_drv_out,
15910152Satgutier@umich.edu      false/*is_fa*/,
16010152Satgutier@umich.edu      is_dram,
16110152Satgutier@umich.edu      true,
16210152Satgutier@umich.edu      camFlag? cam_cell:cell);
16310152Satgutier@umich.edu//  if (is_fa && (!dp.is_tag))
16410152Satgutier@umich.edu//  {
16510152Satgutier@umich.edu//    row_dec->exist = true;
16610152Satgutier@umich.edu//  }
16710152Satgutier@umich.edu  bit_mux_dec = new Decoder(
16810152Satgutier@umich.edu      deg_bl_muxing,// This number is 1 for FA or CAM
16910152Satgutier@umich.edu      false,
17010152Satgutier@umich.edu      C_ld_bit_mux_dec_out,
17110152Satgutier@umich.edu      R_wire_bit_mux_dec_out,
17210152Satgutier@umich.edu      false/*is_fa*/,
17310152Satgutier@umich.edu      is_dram,
17410152Satgutier@umich.edu      false,
17510152Satgutier@umich.edu      camFlag? cam_cell:cell);
17610152Satgutier@umich.edu  sa_mux_lev_1_dec = new Decoder(
17710152Satgutier@umich.edu      dp.deg_senseamp_muxing_non_associativity, // This number is 1 for FA or CAM
17810152Satgutier@umich.edu      dp.number_way_select_signals_mat ? true : false,//only sa_mux_lev_1_dec needs way select signal
17910152Satgutier@umich.edu      C_ld_sa_mux_lev_1_dec_out,
18010152Satgutier@umich.edu      R_wire_sa_mux_dec_out,
18110152Satgutier@umich.edu      false/*is_fa*/,
18210152Satgutier@umich.edu      is_dram,
18310152Satgutier@umich.edu      false,
18410152Satgutier@umich.edu      camFlag? cam_cell:cell);
18510152Satgutier@umich.edu  sa_mux_lev_2_dec = new Decoder(
18610152Satgutier@umich.edu      dp.Ndsam_lev_2, // This number is 1 for FA or CAM
18710152Satgutier@umich.edu      false,
18810152Satgutier@umich.edu      C_ld_sa_mux_lev_2_dec_out,
18910152Satgutier@umich.edu      R_wire_sa_mux_dec_out,
19010152Satgutier@umich.edu      false/*is_fa*/,
19110152Satgutier@umich.edu      is_dram,
19210152Satgutier@umich.edu      false,
19310152Satgutier@umich.edu      camFlag? cam_cell:cell);
19410152Satgutier@umich.edu
19510152Satgutier@umich.edu  double C_wire_predec_blk_out;
19610152Satgutier@umich.edu  double R_wire_predec_blk_out;
19710152Satgutier@umich.edu
19810152Satgutier@umich.edu  if (!is_fa && !pure_cam)
19910152Satgutier@umich.edu      {
20010152Satgutier@umich.edu
20110152Satgutier@umich.edu          C_wire_predec_blk_out  = num_subarrays_per_row * subarray.num_rows * g_tp.wire_inside_mat.C_per_um * cell.h;
20210152Satgutier@umich.edu          R_wire_predec_blk_out  = num_subarrays_per_row * subarray.num_rows * g_tp.wire_inside_mat.R_per_um * cell.h;
20310152Satgutier@umich.edu
20410152Satgutier@umich.edu      }
20510152Satgutier@umich.edu      else //for pre-decode block's load is same for both FA and CAM
20610152Satgutier@umich.edu      {
20710152Satgutier@umich.edu          C_wire_predec_blk_out  = subarray.num_rows * g_tp.wire_inside_mat.C_per_um * cam_cell.h;
20810152Satgutier@umich.edu          R_wire_predec_blk_out  = subarray.num_rows * g_tp.wire_inside_mat.R_per_um * cam_cell.h;
20910152Satgutier@umich.edu      }
21010152Satgutier@umich.edu
21110152Satgutier@umich.edu
21210152Satgutier@umich.edu  if (is_fa||pure_cam)
21310152Satgutier@umich.edu          num_dec_signals += _log2(num_subarrays_per_mat);
21410152Satgutier@umich.edu
21510152Satgutier@umich.edu  PredecBlk * r_predec_blk1 = new PredecBlk(
21610152Satgutier@umich.edu      num_dec_signals,
21710152Satgutier@umich.edu      row_dec,
21810152Satgutier@umich.edu      C_wire_predec_blk_out,
21910152Satgutier@umich.edu      R_wire_predec_blk_out,
22010152Satgutier@umich.edu      num_subarrays_per_mat,
22110152Satgutier@umich.edu      is_dram,
22210152Satgutier@umich.edu      true);
22310152Satgutier@umich.edu  PredecBlk * r_predec_blk2 = new PredecBlk(
22410152Satgutier@umich.edu      num_dec_signals,
22510152Satgutier@umich.edu      row_dec,
22610152Satgutier@umich.edu      C_wire_predec_blk_out,
22710152Satgutier@umich.edu      R_wire_predec_blk_out,
22810152Satgutier@umich.edu      num_subarrays_per_mat,
22910152Satgutier@umich.edu      is_dram,
23010152Satgutier@umich.edu      false);
23110152Satgutier@umich.edu  PredecBlk * b_mux_predec_blk1 = new PredecBlk(deg_bl_muxing, bit_mux_dec, 0, 0, 1, is_dram, true);
23210152Satgutier@umich.edu  PredecBlk * b_mux_predec_blk2 = new PredecBlk(deg_bl_muxing, bit_mux_dec, 0, 0, 1, is_dram, false);
23310152Satgutier@umich.edu  PredecBlk * sa_mux_lev_1_predec_blk1 = new PredecBlk(dyn_p.deg_senseamp_muxing_non_associativity, sa_mux_lev_1_dec, 0, 0, 1, is_dram, true);
23410152Satgutier@umich.edu  PredecBlk * sa_mux_lev_1_predec_blk2 = new PredecBlk(dyn_p.deg_senseamp_muxing_non_associativity, sa_mux_lev_1_dec, 0, 0, 1, is_dram, false);
23510152Satgutier@umich.edu  PredecBlk * sa_mux_lev_2_predec_blk1 = new PredecBlk(dp.Ndsam_lev_2, sa_mux_lev_2_dec, 0, 0, 1, is_dram, true);
23610152Satgutier@umich.edu  PredecBlk * sa_mux_lev_2_predec_blk2 = new PredecBlk(dp.Ndsam_lev_2, sa_mux_lev_2_dec, 0, 0, 1, is_dram, false);
23710152Satgutier@umich.edu  dummy_way_sel_predec_blk1 = new PredecBlk(1, sa_mux_lev_1_dec, 0, 0, 0, is_dram, true);
23810152Satgutier@umich.edu  dummy_way_sel_predec_blk2 = new PredecBlk(1, sa_mux_lev_1_dec, 0, 0, 0, is_dram, false);
23910152Satgutier@umich.edu
24010152Satgutier@umich.edu  PredecBlkDrv * r_predec_blk_drv1 = new PredecBlkDrv(0, r_predec_blk1, is_dram);
24110152Satgutier@umich.edu  PredecBlkDrv * r_predec_blk_drv2 = new PredecBlkDrv(0, r_predec_blk2, is_dram);
24210152Satgutier@umich.edu  PredecBlkDrv * b_mux_predec_blk_drv1 = new PredecBlkDrv(0, b_mux_predec_blk1, is_dram);
24310152Satgutier@umich.edu  PredecBlkDrv * b_mux_predec_blk_drv2 = new PredecBlkDrv(0, b_mux_predec_blk2, is_dram);
24410152Satgutier@umich.edu  PredecBlkDrv * sa_mux_lev_1_predec_blk_drv1 = new PredecBlkDrv(0, sa_mux_lev_1_predec_blk1, is_dram);
24510152Satgutier@umich.edu  PredecBlkDrv * sa_mux_lev_1_predec_blk_drv2 = new PredecBlkDrv(0, sa_mux_lev_1_predec_blk2, is_dram);
24610152Satgutier@umich.edu  PredecBlkDrv * sa_mux_lev_2_predec_blk_drv1 = new PredecBlkDrv(0, sa_mux_lev_2_predec_blk1, is_dram);
24710152Satgutier@umich.edu  PredecBlkDrv * sa_mux_lev_2_predec_blk_drv2 = new PredecBlkDrv(0, sa_mux_lev_2_predec_blk2, is_dram);
24810152Satgutier@umich.edu  way_sel_drv1 = new PredecBlkDrv(dyn_p.number_way_select_signals_mat, dummy_way_sel_predec_blk1, is_dram);
24910152Satgutier@umich.edu  dummy_way_sel_predec_blk_drv2 = new PredecBlkDrv(1, dummy_way_sel_predec_blk2, is_dram);
25010152Satgutier@umich.edu
25110152Satgutier@umich.edu  r_predec            = new Predec(r_predec_blk_drv1, r_predec_blk_drv2);
25210152Satgutier@umich.edu  b_mux_predec        = new Predec(b_mux_predec_blk_drv1, b_mux_predec_blk_drv2);
25310152Satgutier@umich.edu  sa_mux_lev_1_predec = new Predec(sa_mux_lev_1_predec_blk_drv1, sa_mux_lev_1_predec_blk_drv2);
25410152Satgutier@umich.edu  sa_mux_lev_2_predec = new Predec(sa_mux_lev_2_predec_blk_drv1, sa_mux_lev_2_predec_blk_drv2);
25510152Satgutier@umich.edu
25610152Satgutier@umich.edu  subarray_out_wire   = new Wire(g_ip->wt, subarray.area.h);//Bug should be subarray.area.w Owen and Sheng
25710152Satgutier@umich.edu
25810152Satgutier@umich.edu  double driver_c_gate_load;
25910152Satgutier@umich.edu  double driver_c_wire_load;
26010152Satgutier@umich.edu  double driver_r_wire_load;
26110152Satgutier@umich.edu
26210152Satgutier@umich.edu  if (is_fa || pure_cam)
26310152Satgutier@umich.edu
26410152Satgutier@umich.edu  {   //Although CAM and RAM use different bl pre-charge driver, assuming the precharge p size is the same
26510152Satgutier@umich.edu          driver_c_gate_load =  (subarray.num_cols_fa_cam )* gate_C(2 * g_tp.w_pmos_bl_precharge + g_tp.w_pmos_bl_eq, 0, is_dram, false, false);
26610152Satgutier@umich.edu          driver_c_wire_load =  subarray.num_cols_fa_cam * cam_cell.w * g_tp.wire_outside_mat.C_per_um;
26710152Satgutier@umich.edu          driver_r_wire_load =  subarray.num_cols_fa_cam * cam_cell.w * g_tp.wire_outside_mat.R_per_um;
26810152Satgutier@umich.edu          cam_bl_precharge_eq_drv = new Driver(
26910152Satgutier@umich.edu                          driver_c_gate_load,
27010152Satgutier@umich.edu                          driver_c_wire_load,
27110152Satgutier@umich.edu                          driver_r_wire_load,
27210152Satgutier@umich.edu                          is_dram);
27310152Satgutier@umich.edu
27410152Satgutier@umich.edu          if (!pure_cam)
27510152Satgutier@umich.edu          {
27610152Satgutier@umich.edu                  //This is only used for fully asso not pure CAM
27710152Satgutier@umich.edu                  driver_c_gate_load =  (subarray.num_cols_fa_ram )* gate_C(2 * g_tp.w_pmos_bl_precharge + g_tp.w_pmos_bl_eq, 0, is_dram, false, false);
27810152Satgutier@umich.edu                  driver_c_wire_load =  subarray.num_cols_fa_ram * cell.w * g_tp.wire_outside_mat.C_per_um;
27910152Satgutier@umich.edu                  driver_r_wire_load =  subarray.num_cols_fa_ram * cell.w * g_tp.wire_outside_mat.R_per_um;
28010152Satgutier@umich.edu                  bl_precharge_eq_drv = new Driver(
28110152Satgutier@umich.edu                                  driver_c_gate_load,
28210152Satgutier@umich.edu                                  driver_c_wire_load,
28310152Satgutier@umich.edu                                  driver_r_wire_load,
28410152Satgutier@umich.edu                                  is_dram);
28510152Satgutier@umich.edu          }
28610152Satgutier@umich.edu  }
28710152Satgutier@umich.edu
28810152Satgutier@umich.edu  else
28910152Satgutier@umich.edu  {
29010152Satgutier@umich.edu          driver_c_gate_load =  subarray.num_cols * gate_C(2 * g_tp.w_pmos_bl_precharge + g_tp.w_pmos_bl_eq, 0, is_dram, false, false);
29110152Satgutier@umich.edu          driver_c_wire_load =  subarray.num_cols * cell.w * g_tp.wire_outside_mat.C_per_um;
29210152Satgutier@umich.edu          driver_r_wire_load =  subarray.num_cols * cell.w * g_tp.wire_outside_mat.R_per_um;
29310152Satgutier@umich.edu          bl_precharge_eq_drv = new Driver(
29410152Satgutier@umich.edu                          driver_c_gate_load,
29510152Satgutier@umich.edu                          driver_c_wire_load,
29610152Satgutier@umich.edu                          driver_r_wire_load,
29710152Satgutier@umich.edu                          is_dram);
29810152Satgutier@umich.edu  }
29910152Satgutier@umich.edu  double area_row_decoder = row_dec->area.get_area() * subarray.num_rows * (RWP + ERP + EWP);
30010152Satgutier@umich.edu  double w_row_decoder    = area_row_decoder / subarray.area.get_h();
30110152Satgutier@umich.edu
30210152Satgutier@umich.edu  double h_bit_mux_sense_amp_precharge_sa_mux_write_driver_write_mux =
30310152Satgutier@umich.edu    compute_bit_mux_sa_precharge_sa_mux_wr_drv_wr_mux_h();
30410152Satgutier@umich.edu
30510152Satgutier@umich.edu  double h_subarray_out_drv = subarray_out_wire->area.get_area() *
30610152Satgutier@umich.edu    (subarray.num_cols / (deg_bl_muxing * dp.Ndsam_lev_1 * dp.Ndsam_lev_2)) / subarray.area.get_w();
30710152Satgutier@umich.edu
30810152Satgutier@umich.edu
30910152Satgutier@umich.edu  h_subarray_out_drv *= (RWP + ERP + SCHP);
31010152Satgutier@umich.edu
31110152Satgutier@umich.edu  double h_comparators                = 0.0;
31210152Satgutier@umich.edu  double w_row_predecode_output_wires = 0.0;
31310152Satgutier@umich.edu  double h_bit_mux_dec_out_wires      = 0.0;
31410152Satgutier@umich.edu  double h_senseamp_mux_dec_out_wires = 0.0;
31510152Satgutier@umich.edu
31610152Satgutier@umich.edu  if ((!is_fa)&&(dp.is_tag))
31710152Satgutier@umich.edu  {
31810152Satgutier@umich.edu    //tagbits = (4 * num_cols_subarray / (deg_bl_muxing * dp.Ndsam_lev_1 * dp.Ndsam_lev_2)) / num_do_b_mat;
31910152Satgutier@umich.edu    h_comparators  = compute_comparators_height(dp.tagbits, dyn_p.num_do_b_mat, subarray.area.get_w());
32010152Satgutier@umich.edu    h_comparators *= (RWP + ERP);
32110152Satgutier@umich.edu  }
32210152Satgutier@umich.edu
32310152Satgutier@umich.edu
32410152Satgutier@umich.edu    int branch_effort_predec_blk1_out = (1 << r_predec_blk2->number_input_addr_bits);
32510152Satgutier@umich.edu    int branch_effort_predec_blk2_out = (1 << r_predec_blk1->number_input_addr_bits);
32610152Satgutier@umich.edu    w_row_predecode_output_wires   = (branch_effort_predec_blk1_out + branch_effort_predec_blk2_out) *
32710152Satgutier@umich.edu      g_tp.wire_inside_mat.pitch * (RWP + ERP + EWP);
32810152Satgutier@umich.edu
32910152Satgutier@umich.edu
33010152Satgutier@umich.edu  double h_non_cell_area = (num_subarrays_per_mat / num_subarrays_per_row) *
33110152Satgutier@umich.edu                           (h_bit_mux_sense_amp_precharge_sa_mux_write_driver_write_mux +
33210152Satgutier@umich.edu                            h_subarray_out_drv + h_comparators);
33310152Satgutier@umich.edu
33410152Satgutier@umich.edu  double w_non_cell_area = MAX(w_row_predecode_output_wires, num_subarrays_per_row * w_row_decoder);
33510152Satgutier@umich.edu
33610152Satgutier@umich.edu  if (deg_bl_muxing > 1)
33710152Satgutier@umich.edu  {
33810152Satgutier@umich.edu    h_bit_mux_dec_out_wires = deg_bl_muxing * g_tp.wire_inside_mat.pitch * (RWP + ERP);
33910152Satgutier@umich.edu  }
34010152Satgutier@umich.edu  if (dp.Ndsam_lev_1 > 1)
34110152Satgutier@umich.edu  {
34210152Satgutier@umich.edu    h_senseamp_mux_dec_out_wires =  dp.Ndsam_lev_1 * g_tp.wire_inside_mat.pitch * (RWP + ERP);
34310152Satgutier@umich.edu  }
34410152Satgutier@umich.edu  if (dp.Ndsam_lev_2 > 1)
34510152Satgutier@umich.edu  {
34610152Satgutier@umich.edu    h_senseamp_mux_dec_out_wires += dp.Ndsam_lev_2 * g_tp.wire_inside_mat.pitch * (RWP + ERP);
34710152Satgutier@umich.edu  }
34810152Satgutier@umich.edu
34910152Satgutier@umich.edu  double h_addr_datain_wires;
35010152Satgutier@umich.edu  if (!g_ip->ver_htree_wires_over_array)
35110152Satgutier@umich.edu  {
35210152Satgutier@umich.edu    h_addr_datain_wires = (dp.number_addr_bits_mat + dp.number_way_select_signals_mat +
35310152Satgutier@umich.edu                                  (dp.num_di_b_mat + dp.num_do_b_mat)/num_subarrays_per_row) *
35410152Satgutier@umich.edu                                 g_tp.wire_inside_mat.pitch * (RWP + ERP + EWP);
35510152Satgutier@umich.edu
35610152Satgutier@umich.edu    if (is_fa || pure_cam)
35710152Satgutier@umich.edu    {
35810152Satgutier@umich.edu        h_addr_datain_wires = (dp.number_addr_bits_mat + dp.number_way_select_signals_mat +     //TODO: revisit
35910152Satgutier@umich.edu                                      (dp.num_di_b_mat+ dp.num_do_b_mat )/num_subarrays_per_row) *
36010152Satgutier@umich.edu                                       g_tp.wire_inside_mat.pitch * (RWP + ERP + EWP) +
36110152Satgutier@umich.edu                                       (dp.num_si_b_mat + dp.num_so_b_mat )/num_subarrays_per_row * g_tp.wire_inside_mat.pitch * SCHP;
36210152Satgutier@umich.edu    }
36310152Satgutier@umich.edu    //h_non_cell_area = 2 * h_bit_mux_sense_amp_precharge_sa_mux +
36410152Satgutier@umich.edu    //MAX(h_addr_datain_wires, 2 * h_subarray_out_drv);
36510152Satgutier@umich.edu    h_non_cell_area = (h_bit_mux_sense_amp_precharge_sa_mux_write_driver_write_mux + h_comparators +
36610152Satgutier@umich.edu                       h_subarray_out_drv) * (num_subarrays_per_mat / num_subarrays_per_row) +
36710152Satgutier@umich.edu                      h_addr_datain_wires +
36810152Satgutier@umich.edu                      h_bit_mux_dec_out_wires +
36910152Satgutier@umich.edu                      h_senseamp_mux_dec_out_wires;
37010152Satgutier@umich.edu
37110152Satgutier@umich.edu  }
37210152Satgutier@umich.edu
37310152Satgutier@umich.edu  // double area_rectangle_center_mat = h_non_cell_area * w_non_cell_area;
37410152Satgutier@umich.edu  double area_mat_center_circuitry = (r_predec_blk_drv1->area.get_area() +
37510152Satgutier@umich.edu                                      b_mux_predec_blk_drv1->area.get_area() +
37610152Satgutier@umich.edu                                      sa_mux_lev_1_predec_blk_drv1->area.get_area() +
37710152Satgutier@umich.edu                                      sa_mux_lev_2_predec_blk_drv1->area.get_area() +
37810152Satgutier@umich.edu                                      way_sel_drv1->area.get_area() +
37910152Satgutier@umich.edu                                      r_predec_blk_drv2->area.get_area() +
38010152Satgutier@umich.edu                                      b_mux_predec_blk_drv2->area.get_area() +
38110152Satgutier@umich.edu                                      sa_mux_lev_1_predec_blk_drv2->area.get_area() +
38210152Satgutier@umich.edu                                      sa_mux_lev_2_predec_blk_drv2->area.get_area() +
38310152Satgutier@umich.edu                                      r_predec_blk1->area.get_area() +
38410152Satgutier@umich.edu                                      b_mux_predec_blk1->area.get_area() +
38510152Satgutier@umich.edu                                      sa_mux_lev_1_predec_blk1->area.get_area() +
38610152Satgutier@umich.edu                                      sa_mux_lev_2_predec_blk1->area.get_area() +
38710152Satgutier@umich.edu                                      r_predec_blk2->area.get_area() +
38810152Satgutier@umich.edu                                      b_mux_predec_blk2->area.get_area() +
38910152Satgutier@umich.edu                                      sa_mux_lev_1_predec_blk2->area.get_area() +
39010152Satgutier@umich.edu                                      sa_mux_lev_2_predec_blk2->area.get_area() +
39110152Satgutier@umich.edu                                      bit_mux_dec->area.get_area() +
39210152Satgutier@umich.edu                                      sa_mux_lev_1_dec->area.get_area() +
39310152Satgutier@umich.edu                                      sa_mux_lev_2_dec->area.get_area()) * (RWP + ERP + EWP);
39410152Satgutier@umich.edu
39510152Satgutier@umich.edu  double area_efficiency_mat;
39610152Satgutier@umich.edu
39710152Satgutier@umich.edu//  if (!is_fa)
39810152Satgutier@umich.edu//  {
39910152Satgutier@umich.edu    assert(num_subarrays_per_mat/num_subarrays_per_row>0);
40010152Satgutier@umich.edu    area.h = (num_subarrays_per_mat/num_subarrays_per_row)* subarray.area.h + h_non_cell_area;
40110152Satgutier@umich.edu    area.w = num_subarrays_per_row * subarray.area.get_w() + w_non_cell_area;
40210152Satgutier@umich.edu    area.w = (area.h*area.w + area_mat_center_circuitry) / area.h;
40310152Satgutier@umich.edu    area_efficiency_mat = subarray.area.get_area() * num_subarrays_per_mat * 100.0 / area.get_area();
40410152Satgutier@umich.edu
40510152Satgutier@umich.edu//    cout<<"h_bit_mux_sense_amp_precharge_sa_mux_write_driver_write_mux"<<h_bit_mux_sense_amp_precharge_sa_mux_write_driver_write_mux<<endl;
40610152Satgutier@umich.edu//    cout<<"h_comparators"<<h_comparators<<endl;
40710152Satgutier@umich.edu//    cout<<"h_subarray_out_drv"<<h_subarray_out_drv<<endl;
40810152Satgutier@umich.edu//    cout<<"h_addr_datain_wires"<<h_addr_datain_wires<<endl;
40910152Satgutier@umich.edu//    cout<<"h_bit_mux_dec_out_wires"<<h_bit_mux_dec_out_wires<<endl;
41010152Satgutier@umich.edu//    cout<<"h_senseamp_mux_dec_out_wires"<<h_senseamp_mux_dec_out_wires<<endl;
41110152Satgutier@umich.edu//    cout<<"h_non_cell_area"<<h_non_cell_area<<endl;
41210152Satgutier@umich.edu//    cout<<"area.h =" << (num_subarrays_per_mat/num_subarrays_per_row)* subarray.area.h<<endl;
41310152Satgutier@umich.edu//    cout<<"w_non_cell_area"<<w_non_cell_area<<endl;
41410152Satgutier@umich.edu//    cout<<"area_mat_center_circuitry"<<area_mat_center_circuitry<<endl;
41510152Satgutier@umich.edu
41610152Satgutier@umich.edu    assert(area.h>0);
41710152Satgutier@umich.edu    assert(area.w>0);
41810152Satgutier@umich.edu//  }
41910152Satgutier@umich.edu//  else
42010152Satgutier@umich.edu//  {
42110152Satgutier@umich.edu//    area.h = (num_subarrays_per_mat / num_subarrays_per_row) * subarray.area.get_h() + h_non_cell_area;
42210152Satgutier@umich.edu//    area.w = num_subarrays_per_row * subarray.area.get_w() + w_non_cell_area;
42310152Satgutier@umich.edu//    area.w = (area.h*area.w + area_mat_center_circuitry) / area.h;
42410152Satgutier@umich.edu//    area_efficiency_mat = subarray.area.get_area() * num_subarrays_per_row * 100.0 / area.get_area();
42510152Satgutier@umich.edu//  }
42610152Satgutier@umich.edu  }
42710152Satgutier@umich.edu
42810152Satgutier@umich.edu
42910152Satgutier@umich.edu
43010152Satgutier@umich.eduMat::~Mat()
43110152Satgutier@umich.edu{
43210152Satgutier@umich.edu  delete row_dec;
43310152Satgutier@umich.edu  delete bit_mux_dec;
43410152Satgutier@umich.edu  delete sa_mux_lev_1_dec;
43510152Satgutier@umich.edu  delete sa_mux_lev_2_dec;
43610152Satgutier@umich.edu
43710152Satgutier@umich.edu  delete r_predec->blk1;
43810152Satgutier@umich.edu  delete r_predec->blk2;
43910152Satgutier@umich.edu  delete b_mux_predec->blk1;
44010152Satgutier@umich.edu  delete b_mux_predec->blk2;
44110152Satgutier@umich.edu  delete sa_mux_lev_1_predec->blk1;
44210152Satgutier@umich.edu  delete sa_mux_lev_1_predec->blk2;
44310152Satgutier@umich.edu  delete sa_mux_lev_2_predec->blk1;
44410152Satgutier@umich.edu  delete sa_mux_lev_2_predec->blk2;
44510152Satgutier@umich.edu  delete dummy_way_sel_predec_blk1;
44610152Satgutier@umich.edu  delete dummy_way_sel_predec_blk2;
44710152Satgutier@umich.edu
44810152Satgutier@umich.edu  delete r_predec->drv1;
44910152Satgutier@umich.edu  delete r_predec->drv2;
45010152Satgutier@umich.edu  delete b_mux_predec->drv1;
45110152Satgutier@umich.edu  delete b_mux_predec->drv2;
45210152Satgutier@umich.edu  delete sa_mux_lev_1_predec->drv1;
45310152Satgutier@umich.edu  delete sa_mux_lev_1_predec->drv2;
45410152Satgutier@umich.edu  delete sa_mux_lev_2_predec->drv1;
45510152Satgutier@umich.edu  delete sa_mux_lev_2_predec->drv2;
45610152Satgutier@umich.edu  delete way_sel_drv1;
45710152Satgutier@umich.edu  delete dummy_way_sel_predec_blk_drv2;
45810152Satgutier@umich.edu
45910152Satgutier@umich.edu  delete r_predec;
46010152Satgutier@umich.edu  delete b_mux_predec;
46110152Satgutier@umich.edu  delete sa_mux_lev_1_predec;
46210152Satgutier@umich.edu  delete sa_mux_lev_2_predec;
46310152Satgutier@umich.edu
46410152Satgutier@umich.edu  delete subarray_out_wire;
46510152Satgutier@umich.edu  if (!pure_cam)
46610152Satgutier@umich.edu    delete bl_precharge_eq_drv;
46710152Satgutier@umich.edu
46810152Satgutier@umich.edu  if (is_fa || pure_cam)
46910152Satgutier@umich.edu  {
47010152Satgutier@umich.edu    delete sl_precharge_eq_drv ;
47110152Satgutier@umich.edu    delete sl_data_drv ;
47210152Satgutier@umich.edu    delete cam_bl_precharge_eq_drv;
47310152Satgutier@umich.edu    delete ml_precharge_drv;
47410152Satgutier@umich.edu    delete ml_to_ram_wl_drv;
47510152Satgutier@umich.edu  }
47610152Satgutier@umich.edu}
47710152Satgutier@umich.edu
47810152Satgutier@umich.edu
47910152Satgutier@umich.edu
48010152Satgutier@umich.edudouble Mat::compute_delays(double inrisetime)
48110152Satgutier@umich.edu{
48210152Satgutier@umich.edu        int k;
48310152Satgutier@umich.edu        double rd, C_intrinsic, C_ld, tf, R_bl_precharge,r_b_metal, R_bl, C_bl;
48410152Satgutier@umich.edu        double outrisetime_search, outrisetime, row_dec_outrisetime;
48510152Satgutier@umich.edu        // delay calculation for tags of fully associative cache
48610152Satgutier@umich.edu        if (is_fa || pure_cam)
48710152Satgutier@umich.edu        {
48810152Satgutier@umich.edu                //Compute search access time
48910152Satgutier@umich.edu                outrisetime_search = compute_cam_delay(inrisetime);
49010152Satgutier@umich.edu                if (is_fa)
49110152Satgutier@umich.edu                {
49210152Satgutier@umich.edu                        bl_precharge_eq_drv->compute_delay(0);
49310152Satgutier@umich.edu                        k = ml_to_ram_wl_drv->number_gates - 1;
49410152Satgutier@umich.edu                        rd = tr_R_on(ml_to_ram_wl_drv->width_n[k], NCH, 1, is_dram, false, true);
49510152Satgutier@umich.edu                        C_intrinsic = drain_C_(ml_to_ram_wl_drv->width_n[k], PCH, 1, 1, 4*cell.h, is_dram, false, true) +
49610152Satgutier@umich.edu                        drain_C_(ml_to_ram_wl_drv->width_n[k], NCH, 1, 1, 4*cell.h, is_dram, false, true);
49710152Satgutier@umich.edu                        C_ld = ml_to_ram_wl_drv->c_gate_load+ ml_to_ram_wl_drv->c_wire_load;
49810152Satgutier@umich.edu                        tf = rd * (C_intrinsic + C_ld) + ml_to_ram_wl_drv->r_wire_load * C_ld / 2;
49910152Satgutier@umich.edu                        delay_wl_reset = horowitz(0, tf, 0.5, 0.5, RISE);
50010152Satgutier@umich.edu
50110152Satgutier@umich.edu                        R_bl_precharge = tr_R_on(g_tp.w_pmos_bl_precharge, PCH, 1, is_dram, false, false);
50210152Satgutier@umich.edu                        r_b_metal = cam_cell.h * g_tp.wire_local.R_per_um;//dummy rows in sram are filled in
50310152Satgutier@umich.edu                        R_bl = subarray.num_rows * r_b_metal;
50410152Satgutier@umich.edu                        C_bl = subarray.C_bl;
50510152Satgutier@umich.edu                        delay_bl_restore = bl_precharge_eq_drv->delay +
50610152Satgutier@umich.edu                                 log((g_tp.sram.Vbitpre - 0.1 * dp.V_b_sense) / (g_tp.sram.Vbitpre - dp.V_b_sense))*
50710152Satgutier@umich.edu                                 (R_bl_precharge * C_bl + R_bl * C_bl / 2);
50810152Satgutier@umich.edu
50910152Satgutier@umich.edu
51010152Satgutier@umich.edu                        outrisetime_search = compute_bitline_delay(outrisetime_search);
51110152Satgutier@umich.edu                        outrisetime_search = compute_sa_delay(outrisetime_search);
51210152Satgutier@umich.edu                }
51310152Satgutier@umich.edu                        outrisetime_search = compute_subarray_out_drv(outrisetime_search);
51410152Satgutier@umich.edu                        subarray_out_wire->set_in_rise_time(outrisetime_search);
51510152Satgutier@umich.edu                        outrisetime_search = subarray_out_wire->signal_rise_time();
51610152Satgutier@umich.edu                        delay_subarray_out_drv_htree = delay_subarray_out_drv + subarray_out_wire->delay;
51710152Satgutier@umich.edu
51810152Satgutier@umich.edu
51910152Satgutier@umich.edu                        //TODO: this is just for compute plain read/write energy for fa and cam, plain read/write access timing need to be revisited.
52010152Satgutier@umich.edu                        outrisetime = r_predec->compute_delays(inrisetime);
52110152Satgutier@umich.edu                        row_dec_outrisetime = row_dec->compute_delays(outrisetime);
52210152Satgutier@umich.edu
52310152Satgutier@umich.edu                        outrisetime = b_mux_predec->compute_delays(inrisetime);
52410152Satgutier@umich.edu                        bit_mux_dec->compute_delays(outrisetime);
52510152Satgutier@umich.edu
52610152Satgutier@umich.edu                        outrisetime = sa_mux_lev_1_predec->compute_delays(inrisetime);
52710152Satgutier@umich.edu                        sa_mux_lev_1_dec->compute_delays(outrisetime);
52810152Satgutier@umich.edu
52910152Satgutier@umich.edu                        outrisetime = sa_mux_lev_2_predec->compute_delays(inrisetime);
53010152Satgutier@umich.edu                        sa_mux_lev_2_dec->compute_delays(outrisetime);
53110152Satgutier@umich.edu
53210152Satgutier@umich.edu                        if (pure_cam)
53310152Satgutier@umich.edu                        {
53410152Satgutier@umich.edu                          outrisetime = compute_bitline_delay(row_dec_outrisetime);
53510152Satgutier@umich.edu                          outrisetime = compute_sa_delay(outrisetime);
53610152Satgutier@umich.edu                        }
53710152Satgutier@umich.edu                        return outrisetime_search;
53810152Satgutier@umich.edu    }
53910152Satgutier@umich.edu        else
54010152Satgutier@umich.edu        {
54110152Satgutier@umich.edu                bl_precharge_eq_drv->compute_delay(0);
54210152Satgutier@umich.edu                if (row_dec->exist == true)
54310152Satgutier@umich.edu                {
54410152Satgutier@umich.edu                        int k = row_dec->num_gates - 1;
54510152Satgutier@umich.edu                        double rd = tr_R_on(row_dec->w_dec_n[k], NCH, 1, is_dram, false, true);
54610152Satgutier@umich.edu                        // TODO: this 4*cell.h number must be revisited
54710152Satgutier@umich.edu                        double C_intrinsic = drain_C_(row_dec->w_dec_p[k], PCH, 1, 1, 4*cell.h, is_dram, false, true) +
54810152Satgutier@umich.edu                        drain_C_(row_dec->w_dec_n[k], NCH, 1, 1, 4*cell.h, is_dram, false, true);
54910152Satgutier@umich.edu                        double C_ld = row_dec->C_ld_dec_out;
55010152Satgutier@umich.edu                        double tf = rd * (C_intrinsic + C_ld) + row_dec->R_wire_dec_out * C_ld / 2;
55110152Satgutier@umich.edu                        delay_wl_reset = horowitz(0, tf, 0.5, 0.5, RISE);
55210152Satgutier@umich.edu                }
55310152Satgutier@umich.edu                double R_bl_precharge = tr_R_on(g_tp.w_pmos_bl_precharge, PCH, 1, is_dram, false, false);
55410152Satgutier@umich.edu                double r_b_metal = cell.h * g_tp.wire_local.R_per_um;
55510152Satgutier@umich.edu                double R_bl = subarray.num_rows * r_b_metal;
55610152Satgutier@umich.edu                double C_bl = subarray.C_bl;
55710152Satgutier@umich.edu
55810152Satgutier@umich.edu                if (is_dram)
55910152Satgutier@umich.edu                {
56010152Satgutier@umich.edu                        delay_bl_restore = bl_precharge_eq_drv->delay + 2.3 * (R_bl_precharge * C_bl + R_bl * C_bl / 2);
56110152Satgutier@umich.edu                }
56210152Satgutier@umich.edu                else
56310152Satgutier@umich.edu                {
56410152Satgutier@umich.edu                        delay_bl_restore = bl_precharge_eq_drv->delay +
56510152Satgutier@umich.edu                        log((g_tp.sram.Vbitpre - 0.1 * dp.V_b_sense) / (g_tp.sram.Vbitpre - dp.V_b_sense))*
56610152Satgutier@umich.edu                        (R_bl_precharge * C_bl + R_bl * C_bl / 2);
56710152Satgutier@umich.edu                }
56810152Satgutier@umich.edu  }
56910152Satgutier@umich.edu
57010152Satgutier@umich.edu
57110152Satgutier@umich.edu
57210152Satgutier@umich.edu  outrisetime = r_predec->compute_delays(inrisetime);
57310152Satgutier@umich.edu  row_dec_outrisetime = row_dec->compute_delays(outrisetime);
57410152Satgutier@umich.edu
57510152Satgutier@umich.edu  outrisetime = b_mux_predec->compute_delays(inrisetime);
57610152Satgutier@umich.edu  bit_mux_dec->compute_delays(outrisetime);
57710152Satgutier@umich.edu
57810152Satgutier@umich.edu  outrisetime = sa_mux_lev_1_predec->compute_delays(inrisetime);
57910152Satgutier@umich.edu  sa_mux_lev_1_dec->compute_delays(outrisetime);
58010152Satgutier@umich.edu
58110152Satgutier@umich.edu  outrisetime = sa_mux_lev_2_predec->compute_delays(inrisetime);
58210152Satgutier@umich.edu  sa_mux_lev_2_dec->compute_delays(outrisetime);
58310152Satgutier@umich.edu
58410152Satgutier@umich.edu  outrisetime = compute_bitline_delay(row_dec_outrisetime);
58510152Satgutier@umich.edu  outrisetime = compute_sa_delay(outrisetime);
58610152Satgutier@umich.edu  outrisetime = compute_subarray_out_drv(outrisetime);
58710152Satgutier@umich.edu  subarray_out_wire->set_in_rise_time(outrisetime);
58810152Satgutier@umich.edu  outrisetime = subarray_out_wire->signal_rise_time();
58910152Satgutier@umich.edu
59010152Satgutier@umich.edu  delay_subarray_out_drv_htree = delay_subarray_out_drv + subarray_out_wire->delay;
59110152Satgutier@umich.edu
59210152Satgutier@umich.edu  if (dp.is_tag == true && dp.fully_assoc == false)
59310152Satgutier@umich.edu  {
59410152Satgutier@umich.edu    compute_comparator_delay(0);
59510152Satgutier@umich.edu  }
59610152Satgutier@umich.edu
59710152Satgutier@umich.edu  if (row_dec->exist == false)
59810152Satgutier@umich.edu    {
59910152Satgutier@umich.edu      delay_wl_reset = MAX(r_predec->blk1->delay, r_predec->blk2->delay);
60010152Satgutier@umich.edu    }
60110152Satgutier@umich.edu  return outrisetime;
60210152Satgutier@umich.edu}
60310152Satgutier@umich.edu
60410152Satgutier@umich.edu
60510152Satgutier@umich.edu
60610152Satgutier@umich.edudouble Mat::compute_bit_mux_sa_precharge_sa_mux_wr_drv_wr_mux_h()
60710152Satgutier@umich.edu{
60810152Satgutier@umich.edu
60910152Satgutier@umich.edu  double height = compute_tr_width_after_folding(g_tp.w_pmos_bl_precharge, camFlag? cam_cell.w:cell.w / (2 *(RWP + ERP + SCHP))) +
61010152Satgutier@umich.edu    compute_tr_width_after_folding(g_tp.w_pmos_bl_eq, camFlag? cam_cell.w:cell.w / (RWP + ERP + SCHP));  // precharge circuitry
61110152Satgutier@umich.edu
61210152Satgutier@umich.edu  if (deg_bl_muxing > 1)
61310152Satgutier@umich.edu  {
61410152Satgutier@umich.edu    height += compute_tr_width_after_folding(g_tp.w_nmos_b_mux, cell.w / (2 *(RWP + ERP)));  // col mux tr height
61510152Satgutier@umich.edu    // height += deg_bl_muxing * g_tp.wire_inside_mat.pitch * (RWP + ERP);  // bit mux dec out wires height
61610152Satgutier@umich.edu  }
61710152Satgutier@umich.edu
61810152Satgutier@umich.edu  height += height_sense_amplifier(/*camFlag? sram_cell.w:*/cell.w * deg_bl_muxing / (RWP + ERP));  // sense_amp_height
61910152Satgutier@umich.edu
62010152Satgutier@umich.edu  if (dp.Ndsam_lev_1 > 1)
62110152Satgutier@umich.edu  {
62210152Satgutier@umich.edu    height += compute_tr_width_after_folding(
62310152Satgutier@umich.edu        g_tp.w_nmos_sa_mux, cell.w * dp.Ndsam_lev_1 / (RWP + ERP));  // sense_amp_mux_height
62410152Satgutier@umich.edu    //height_senseamp_mux_decode_output_wires =  Ndsam * wire_inside_mat_pitch * (RWP + ERP);
62510152Satgutier@umich.edu  }
62610152Satgutier@umich.edu
62710152Satgutier@umich.edu  if (dp.Ndsam_lev_2 > 1)
62810152Satgutier@umich.edu  {
62910152Satgutier@umich.edu    height += compute_tr_width_after_folding(
63010152Satgutier@umich.edu        g_tp.w_nmos_sa_mux, cell.w * deg_bl_muxing * dp.Ndsam_lev_1 / (RWP + ERP));  // sense_amp_mux_height
63110152Satgutier@umich.edu    //height_senseamp_mux_decode_output_wires =  Ndsam * wire_inside_mat_pitch * (RWP + ERP);
63210152Satgutier@umich.edu
63310152Satgutier@umich.edu    // add height of inverter-buffers between the two levels (pass-transistors) of sense-amp mux
63410152Satgutier@umich.edu    height += 2 * compute_tr_width_after_folding(
63510152Satgutier@umich.edu        pmos_to_nmos_sz_ratio(is_dram) * g_tp.min_w_nmos_, cell.w * dp.Ndsam_lev_2 / (RWP + ERP));
63610152Satgutier@umich.edu    height += 2 * compute_tr_width_after_folding(g_tp.min_w_nmos_, cell.w * dp.Ndsam_lev_2 / (RWP + ERP));
63710152Satgutier@umich.edu  }
63810152Satgutier@umich.edu
63910152Satgutier@umich.edu  // TODO: this should be uncommented...
64010152Satgutier@umich.edu  /*if (deg_bl_muxing * dp.Ndsam_lev_1 * dp.Ndsam_lev_2 > 1)
64110152Satgutier@umich.edu    {
64210152Satgutier@umich.edu  //height_write_mux_decode_output_wires = deg_bl_muxing * Ndsam * g_tp.wire_inside_mat.pitch * (RWP + EWP);
64310152Satgutier@umich.edu  double width_write_driver_write_mux  = width_write_driver_or_write_mux();
64410152Satgutier@umich.edu  double height_write_driver_write_mux = compute_tr_width_after_folding(2 * width_write_driver_write_mux,
64510152Satgutier@umich.edu  cell.w *
64610152Satgutier@umich.edu  // deg_bl_muxing *
64710152Satgutier@umich.edu  dp.Ndsam_lev_1 * dp.Ndsam_lev_2 / (RWP + EWP));
64810152Satgutier@umich.edu  height += height_write_driver_write_mux;
64910152Satgutier@umich.edu  }*/
65010152Satgutier@umich.edu
65110152Satgutier@umich.edu  return height;
65210152Satgutier@umich.edu}
65310152Satgutier@umich.edu
65410152Satgutier@umich.edu
65510152Satgutier@umich.edu
65610152Satgutier@umich.edudouble Mat::compute_cam_delay(double inrisetime)
65710152Satgutier@umich.edu{
65810152Satgutier@umich.edu
65910152Satgutier@umich.edu  double out_time_ramp, this_delay;
66010152Satgutier@umich.edu  double Rwire, tf, c_intrinsic, rd, Cwire, c_gate_load;
66110152Satgutier@umich.edu
66210152Satgutier@umich.edu
66310152Satgutier@umich.edu  double Wdecdrivep, Wdecdriven, Wfadriven, Wfadrivep, Wfadrive2n, Wfadrive2p, Wfadecdrive1n, Wfadecdrive1p,
66410152Satgutier@umich.edu    Wfadecdrive2n, Wfadecdrive2p, Wfadecdriven, Wfadecdrivep, Wfaprechn, Wfaprechp,
66510152Satgutier@umich.edu    Wdummyn, Wdummyinvn, Wdummyinvp, Wfainvn, Wfainvp, Waddrnandn, Waddrnandp,
66610152Satgutier@umich.edu    Wfanandn, Wfanandp, Wfanorn, Wfanorp, Wdecnandn, Wdecnandp, W_hit_miss_n, W_hit_miss_p;
66710152Satgutier@umich.edu
66810152Satgutier@umich.edu  double c_matchline_metal, r_matchline_metal, c_searchline_metal, r_searchline_metal,  dynSearchEng;
66910152Satgutier@umich.edu  int Htagbits;
67010152Satgutier@umich.edu
67110152Satgutier@umich.edu  double driver_c_gate_load;
67210152Satgutier@umich.edu  double driver_c_wire_load;
67310152Satgutier@umich.edu  double driver_r_wire_load;
67410152Satgutier@umich.edu  //double searchline_precharge_time;
67510152Satgutier@umich.edu
67610152Satgutier@umich.edu  double leak_power_cc_inverters_sram_cell         = 0;
67710152Satgutier@umich.edu  double leak_power_acc_tr_RW_or_WR_port_sram_cell = 0;
67810152Satgutier@umich.edu  double leak_power_RD_port_sram_cell              = 0;
67910152Satgutier@umich.edu  double leak_power_SCHP_port_sram_cell            = 0;
68010152Satgutier@umich.edu  double leak_comparator_cam_cell                  =0;
68110152Satgutier@umich.edu
68210152Satgutier@umich.edu  double gate_leak_comparator_cam_cell          = 0;
68310152Satgutier@umich.edu  double gate_leak_power_cc_inverters_sram_cell = 0;
68410152Satgutier@umich.edu  double gate_leak_power_RD_port_sram_cell      = 0;
68510152Satgutier@umich.edu  double gate_leak_power_SCHP_port_sram_cell    = 0;
68610152Satgutier@umich.edu
68710152Satgutier@umich.edu  c_matchline_metal   = cam_cell.get_w() * g_tp.wire_local.C_per_um;
68810152Satgutier@umich.edu  c_searchline_metal  = cam_cell.get_h() * g_tp.wire_local.C_per_um;
68910152Satgutier@umich.edu  r_matchline_metal   = cam_cell.get_w() * g_tp.wire_local.R_per_um;
69010152Satgutier@umich.edu  r_searchline_metal  = cam_cell.get_h() * g_tp.wire_local.R_per_um;
69110152Satgutier@umich.edu
69210152Satgutier@umich.edu  dynSearchEng = 0.0;
69310152Satgutier@umich.edu  delay_matchchline = 0.0;
69410152Satgutier@umich.edu  double p_to_n_sizing_r = pmos_to_nmos_sz_ratio(is_dram);
69510152Satgutier@umich.edu  bool linear_scaling = false;
69610152Satgutier@umich.edu
69710152Satgutier@umich.edu  if (linear_scaling)
69810152Satgutier@umich.edu  {
69910152Satgutier@umich.edu          Wdecdrivep    =  450 * g_ip->F_sz_um;//this was 360 micron for the 0.8 micron process
70010152Satgutier@umich.edu          Wdecdriven    =  300 * g_ip->F_sz_um;//this was 240 micron for the 0.8 micron process
70110152Satgutier@umich.edu          Wfadriven     = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
70210152Satgutier@umich.edu          Wfadrivep     =  125 * g_ip->F_sz_um;//this was 100 micron for the 0.8 micron process
70310152Satgutier@umich.edu          Wfadrive2n    =  250 * g_ip->F_sz_um;//this was 200 micron for the 0.8 micron process
70410152Satgutier@umich.edu          Wfadrive2p    =  500 * g_ip->F_sz_um;//this was 400 micron for the 0.8 micron process
70510152Satgutier@umich.edu          Wfadecdrive1n = 6.25 * g_ip->F_sz_um;//this was   5 micron for the 0.8 micron process
70610152Satgutier@umich.edu          Wfadecdrive1p = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
70710152Satgutier@umich.edu          Wfadecdrive2n =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
70810152Satgutier@umich.edu          Wfadecdrive2p =   50 * g_ip->F_sz_um;//this was  40 micron for the 0.8 micron process
70910152Satgutier@umich.edu          Wfadecdriven  = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
71010152Satgutier@umich.edu          Wfadecdrivep  =  125 * g_ip->F_sz_um;//this was 100 micron for the 0.8 micron process
71110152Satgutier@umich.edu          Wfaprechn     =  7.5 * g_ip->F_sz_um;//this was   6 micron for the 0.8 micron process
71210152Satgutier@umich.edu          Wfainvn       = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
71310152Satgutier@umich.edu          Wfainvp       =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
71410152Satgutier@umich.edu          Wfanandn      =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
71510152Satgutier@umich.edu          Wfanandp      = 37.5 * g_ip->F_sz_um;//this was  30 micron for the 0.8 micron process
71610152Satgutier@umich.edu          Wdecnandn     = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
71710152Satgutier@umich.edu          Wdecnandp     = 37.5 * g_ip->F_sz_um;//this was  30 micron for the 0.8 micron process
71810152Satgutier@umich.edu
71910152Satgutier@umich.edu          Wfaprechp     = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
72010152Satgutier@umich.edu          Wdummyn       = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
72110152Satgutier@umich.edu          Wdummyinvn    =   75 * g_ip->F_sz_um;//this was  60 micron for the 0.8 micron process
72210152Satgutier@umich.edu          Wdummyinvp    =  100 * g_ip->F_sz_um;//this was  80 micron for the 0.8 micron process
72310152Satgutier@umich.edu          Waddrnandn    = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
72410152Satgutier@umich.edu          Waddrnandp    = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
72510152Satgutier@umich.edu          Wfanorn       = 6.25 * g_ip->F_sz_um;//this was   5 micron for the 0.8 micron process
72610152Satgutier@umich.edu          Wfanorp       = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
72710152Satgutier@umich.edu          W_hit_miss_n    = Wdummyn;
72810152Satgutier@umich.edu          W_hit_miss_p    = g_tp.min_w_nmos_*p_to_n_sizing_r;
72910152Satgutier@umich.edu          //TODO: this number should updated using new layout; from the NAND to output NOR should be computed using logical effort
73010152Satgutier@umich.edu  }
73110152Satgutier@umich.edu  else
73210152Satgutier@umich.edu  {
73310152Satgutier@umich.edu          Wdecdrivep    =  450 * g_ip->F_sz_um;//this was 360 micron for the 0.8 micron process
73410152Satgutier@umich.edu          Wdecdriven    =  300 * g_ip->F_sz_um;//this was 240 micron for the 0.8 micron process
73510152Satgutier@umich.edu          Wfadriven     = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
73610152Satgutier@umich.edu          Wfadrivep     =  125 * g_ip->F_sz_um;//this was 100 micron for the 0.8 micron process
73710152Satgutier@umich.edu          Wfadrive2n    =  250 * g_ip->F_sz_um;//this was 200 micron for the 0.8 micron process
73810152Satgutier@umich.edu          Wfadrive2p    =  500 * g_ip->F_sz_um;//this was 400 micron for the 0.8 micron process
73910152Satgutier@umich.edu          Wfadecdrive1n = 6.25 * g_ip->F_sz_um;//this was   5 micron for the 0.8 micron process
74010152Satgutier@umich.edu          Wfadecdrive1p = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
74110152Satgutier@umich.edu          Wfadecdrive2n =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
74210152Satgutier@umich.edu          Wfadecdrive2p =   50 * g_ip->F_sz_um;//this was  40 micron for the 0.8 micron process
74310152Satgutier@umich.edu          Wfadecdriven  = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
74410152Satgutier@umich.edu          Wfadecdrivep  =  125 * g_ip->F_sz_um;//this was 100 micron for the 0.8 micron process
74510152Satgutier@umich.edu          Wfaprechn     =  7.5 * g_ip->F_sz_um;//this was   6 micron for the 0.8 micron process
74610152Satgutier@umich.edu          Wfainvn       = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
74710152Satgutier@umich.edu          Wfainvp       =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
74810152Satgutier@umich.edu          Wfanandn      =   25 * g_ip->F_sz_um;//this was  20 micron for the 0.8 micron process
74910152Satgutier@umich.edu          Wfanandp      = 37.5 * g_ip->F_sz_um;//this was  30 micron for the 0.8 micron process
75010152Satgutier@umich.edu          Wdecnandn     = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
75110152Satgutier@umich.edu          Wdecnandp     = 37.5 * g_ip->F_sz_um;//this was  30 micron for the 0.8 micron process
75210152Satgutier@umich.edu
75310152Satgutier@umich.edu          Wfaprechp     = g_tp.w_pmos_bl_precharge;//this was  10 micron for the 0.8 micron process
75410152Satgutier@umich.edu          Wdummyn       = g_tp.cam.cell_nmos_w;
75510152Satgutier@umich.edu          Wdummyinvn    =   75 * g_ip->F_sz_um;//this was  60 micron for the 0.8 micron process
75610152Satgutier@umich.edu          Wdummyinvp    =  100 * g_ip->F_sz_um;//this was  80 micron for the 0.8 micron process
75710152Satgutier@umich.edu          Waddrnandn    = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
75810152Satgutier@umich.edu          Waddrnandp    = 62.5 * g_ip->F_sz_um;//this was  50 micron for the 0.8 micron process
75910152Satgutier@umich.edu          Wfanorn       = 6.25 * g_ip->F_sz_um;//this was   5 micron for the 0.8 micron process
76010152Satgutier@umich.edu          Wfanorp       = 12.5 * g_ip->F_sz_um;//this was  10 micron for the 0.8 micron process
76110152Satgutier@umich.edu          W_hit_miss_n    = Wdummyn;
76210152Satgutier@umich.edu          W_hit_miss_p    = g_tp.min_w_nmos_*p_to_n_sizing_r;
76310152Satgutier@umich.edu  }
76410152Satgutier@umich.edu
76510152Satgutier@umich.edu  Htagbits = (int)(ceil ((double) (subarray.num_cols_fa_cam) / 2.0));
76610152Satgutier@umich.edu
76710152Satgutier@umich.edu  /* First stage, searchline is precharged. searchline data driver drives the searchline to open (if miss) the comparators.
76810152Satgutier@umich.edu     search_line_delay, search_line_power, search_line_restore_delay for cycle time computation.
76910152Satgutier@umich.edu     From the driver(am and an) to the comparators in all the rows including the dummy row,
77010152Satgutier@umich.edu     Assuming that comparators in both the normal matching line and the dummy matching line have the same sizing */
77110152Satgutier@umich.edu
77210152Satgutier@umich.edu  //Searchline precharge circuitry is same as that of bitline. However, no sharing between search ports and r/w ports
77310152Satgutier@umich.edu  //Searchline precharge routes horizontally
77410152Satgutier@umich.edu  driver_c_gate_load = subarray.num_cols_fa_cam * gate_C(2 * g_tp.w_pmos_bl_precharge + g_tp.w_pmos_bl_eq, 0, is_dram, false, false);
77510152Satgutier@umich.edu  driver_c_wire_load = subarray.num_cols_fa_cam * cam_cell.w * g_tp.wire_outside_mat.C_per_um;
77610152Satgutier@umich.edu  driver_r_wire_load = subarray.num_cols_fa_cam * cam_cell.w * g_tp.wire_outside_mat.R_per_um;
77710152Satgutier@umich.edu
77810152Satgutier@umich.edu  sl_precharge_eq_drv = new Driver(
77910152Satgutier@umich.edu      driver_c_gate_load,
78010152Satgutier@umich.edu          driver_c_wire_load,
78110152Satgutier@umich.edu      driver_r_wire_load,
78210152Satgutier@umich.edu      is_dram);
78310152Satgutier@umich.edu
78410152Satgutier@umich.edu  //searchline data driver ; subarray.num_rows + 1 is because of the dummy row
78510152Satgutier@umich.edu  //data drv should only have gate_C not 2*gate_C since the two searchlines are differential--same as bitlines
78610152Satgutier@umich.edu  driver_c_gate_load = (subarray.num_rows + 1) * gate_C(Wdummyn, 0, is_dram, false, false);
78710152Satgutier@umich.edu  driver_c_wire_load = (subarray.num_rows + 1) * c_searchline_metal;
78810152Satgutier@umich.edu  driver_r_wire_load = (subarray.num_rows + 1) * r_searchline_metal;
78910152Satgutier@umich.edu  sl_data_drv = new Driver(
79010152Satgutier@umich.edu      driver_c_gate_load,
79110152Satgutier@umich.edu          driver_c_wire_load,
79210152Satgutier@umich.edu      driver_r_wire_load,
79310152Satgutier@umich.edu      is_dram);
79410152Satgutier@umich.edu
79510152Satgutier@umich.edu  sl_precharge_eq_drv->compute_delay(0);
79610152Satgutier@umich.edu  double R_bl_precharge = tr_R_on(g_tp.w_pmos_bl_precharge, PCH, 1, is_dram, false, false);//Assuming CAM and SRAM have same Pre_eq_dr
79710152Satgutier@umich.edu  double r_b_metal = cam_cell.h * g_tp.wire_local.R_per_um;
79810152Satgutier@umich.edu  double R_bl = (subarray.num_rows + 1) * r_b_metal;
79910152Satgutier@umich.edu  double C_bl = subarray.C_bl_cam;
80010152Satgutier@umich.edu  delay_cam_sl_restore = sl_precharge_eq_drv->delay
80110152Satgutier@umich.edu                         + log(g_tp.cam.Vbitpre)* (R_bl_precharge * C_bl + R_bl * C_bl / 2);
80210152Satgutier@umich.edu
80310152Satgutier@umich.edu  out_time_ramp = sl_data_drv->compute_delay(inrisetime);//After entering one mat, start to consider the inrisetime from 0(0 is passed from outside)
80410152Satgutier@umich.edu
80510152Satgutier@umich.edu  //matchline ops delay
80610152Satgutier@umich.edu  delay_matchchline += sl_data_drv->delay;
80710152Satgutier@umich.edu
80810152Satgutier@umich.edu  /* second stage, from the trasistors in the comparators(both normal row and dummy row) to the NAND gates that combins both half*/
80910152Satgutier@umich.edu  //matchline delay, matchline power, matchline_reset for cycle time computation,
81010152Satgutier@umich.edu
81110152Satgutier@umich.edu  ////matchline precharge circuitry routes vertically
81210152Satgutier@umich.edu  //There are two matchline precharge driver chains per subarray.
81310152Satgutier@umich.edu  driver_c_gate_load = (subarray.num_rows + 1) * gate_C(Wfaprechp, 0, is_dram);
81410152Satgutier@umich.edu  driver_c_wire_load = (subarray.num_rows + 1) * c_searchline_metal;
81510152Satgutier@umich.edu  driver_r_wire_load = (subarray.num_rows + 1) * r_searchline_metal;
81610152Satgutier@umich.edu
81710152Satgutier@umich.edu  ml_precharge_drv = new Driver(
81810152Satgutier@umich.edu                                                  driver_c_gate_load,
81910152Satgutier@umich.edu                              driver_c_wire_load,
82010152Satgutier@umich.edu                          driver_r_wire_load,
82110152Satgutier@umich.edu                          is_dram);
82210152Satgutier@umich.edu
82310152Satgutier@umich.edu  ml_precharge_drv->compute_delay(0);
82410152Satgutier@umich.edu
82510152Satgutier@umich.edu
82610152Satgutier@umich.edu  rd =  tr_R_on(Wdummyn, NCH, 2, is_dram);
82710152Satgutier@umich.edu  c_intrinsic = Htagbits*(2*drain_C_(Wdummyn, NCH, 2, 1, g_tp.cell_h_def, is_dram)//TODO: the cell_h_def should be revisit
82810152Satgutier@umich.edu                                  + drain_C_(Wfaprechp, PCH, 1, 1, g_tp.cell_h_def, is_dram)/Htagbits);//since each halve only has one precharge tx per matchline
82910152Satgutier@umich.edu
83010152Satgutier@umich.edu  Cwire = c_matchline_metal * Htagbits;
83110152Satgutier@umich.edu  Rwire = r_matchline_metal * Htagbits;
83210152Satgutier@umich.edu  c_gate_load = gate_C(Waddrnandn + Waddrnandp, 0, is_dram);
83310152Satgutier@umich.edu
83410152Satgutier@umich.edu  double R_ml_precharge = tr_R_on(Wfaprechp, PCH, 1, is_dram);
83510152Satgutier@umich.edu  //double r_ml_metal = cam_cell.w * g_tp.wire_local.R_per_um;
83610152Satgutier@umich.edu  double R_ml = Rwire;
83710152Satgutier@umich.edu  double C_ml = Cwire + c_intrinsic;
83810152Satgutier@umich.edu  delay_cam_ml_reset = ml_precharge_drv->delay
83910152Satgutier@umich.edu                           + log(g_tp.cam.Vbitpre)* (R_ml_precharge * C_ml + R_ml * C_ml / 2);//TODO: latest CAM has sense amps on matchlines too
84010152Satgutier@umich.edu
84110152Satgutier@umich.edu  //matchline ops delay
84210152Satgutier@umich.edu  tf = rd * (c_intrinsic + Cwire / 2 + c_gate_load) + Rwire * (Cwire / 2 + c_gate_load);
84310152Satgutier@umich.edu  this_delay = horowitz(out_time_ramp, tf, VTHFA2, VTHFA3, FALL);
84410152Satgutier@umich.edu  delay_matchchline += this_delay;
84510152Satgutier@umich.edu  out_time_ramp = this_delay / VTHFA3;
84610152Satgutier@umich.edu
84710152Satgutier@umich.edu  dynSearchEng += ((c_intrinsic + Cwire + c_gate_load)*(subarray.num_rows +1)) //+ 2*drain_C_(Wdummyn, NCH, 2, 1, g_tp.cell_h_def, is_dram))//TODO: need to be precise
84810152Satgutier@umich.edu                                          * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd *2;//* Ntbl;//each subarry has two halves
84910152Satgutier@umich.edu
85010152Satgutier@umich.edu  /* third stage, from the NAND2 gates to the drivers in the dummy row */
85110152Satgutier@umich.edu  rd = tr_R_on(Waddrnandn, NCH, 2, is_dram);
85210152Satgutier@umich.edu  c_intrinsic = drain_C_(Waddrnandn, NCH, 2, 1, g_tp.cell_h_def, is_dram) +
85310152Satgutier@umich.edu                drain_C_(Waddrnandp, PCH, 1, 1, g_tp.cell_h_def, is_dram)*2;
85410152Satgutier@umich.edu  c_gate_load = gate_C(Wdummyinvn + Wdummyinvp, 0, is_dram);
85510152Satgutier@umich.edu  tf = rd * (c_intrinsic + c_gate_load);
85610152Satgutier@umich.edu  this_delay = horowitz(out_time_ramp, tf, VTHFA3, VTHFA4, RISE);
85710152Satgutier@umich.edu  out_time_ramp = this_delay / (1 - VTHFA4);
85810152Satgutier@umich.edu  delay_matchchline += this_delay;
85910152Satgutier@umich.edu
86010152Satgutier@umich.edu  //only the dummy row has the extra inverter between NAND and NOR gates
86110152Satgutier@umich.edu  dynSearchEng += (c_intrinsic* (subarray.num_rows+1)+ c_gate_load*2) * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;//  * Ntbl;
86210152Satgutier@umich.edu
86310152Satgutier@umich.edu  /* fourth stage, from the driver in dummy matchline to the NOR2 gate which drives the wordline of the data portion */
86410152Satgutier@umich.edu  rd = tr_R_on(Wdummyinvn, NCH, 1, is_dram);
86510152Satgutier@umich.edu  c_intrinsic = drain_C_(Wdummyinvn, NCH, 1, 1, g_tp.cell_h_def, is_dram) + drain_C_(Wdummyinvp, NCH, 1, 1, g_tp.cell_h_def, is_dram);
86610152Satgutier@umich.edu  Cwire = c_matchline_metal * Htagbits +  c_searchline_metal * (subarray.num_rows+1)/2;
86710152Satgutier@umich.edu  Rwire = r_matchline_metal * Htagbits +  r_searchline_metal * (subarray.num_rows+1)/2;
86810152Satgutier@umich.edu  c_gate_load = gate_C(Wfanorn + Wfanorp, 0, is_dram);
86910152Satgutier@umich.edu  tf = rd * (c_intrinsic + Cwire + c_gate_load) + Rwire * (Cwire / 2 + c_gate_load);
87010152Satgutier@umich.edu  this_delay = horowitz (out_time_ramp, tf, VTHFA4, VTHFA5, FALL);
87110152Satgutier@umich.edu  out_time_ramp = this_delay / VTHFA5;
87210152Satgutier@umich.edu  delay_matchchline += this_delay;
87310152Satgutier@umich.edu
87410152Satgutier@umich.edu  dynSearchEng += (c_intrinsic + Cwire + subarray.num_rows*c_gate_load) * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;//* Ntbl;
87510152Satgutier@umich.edu
87610152Satgutier@umich.edu  /*final statge from the NOR gate to drive the wordline of the data portion */
87710152Satgutier@umich.edu
87810152Satgutier@umich.edu  //searchline data driver There are two matchline precharge driver chains per subarray.
87910152Satgutier@umich.edu  driver_c_gate_load = gate_C(W_hit_miss_n, 0, is_dram, false, false);//nmos of the pull down logic
88010152Satgutier@umich.edu  driver_c_wire_load = subarray.C_wl_ram;
88110152Satgutier@umich.edu  driver_r_wire_load = subarray.R_wl_ram;
88210152Satgutier@umich.edu
88310152Satgutier@umich.edu  ml_to_ram_wl_drv = new Driver(
88410152Satgutier@umich.edu                                                  driver_c_gate_load,
88510152Satgutier@umich.edu                              driver_c_wire_load,
88610152Satgutier@umich.edu                          driver_r_wire_load,
88710152Satgutier@umich.edu                          is_dram);
88810152Satgutier@umich.edu
88910152Satgutier@umich.edu
89010152Satgutier@umich.edu
89110152Satgutier@umich.edu  rd = tr_R_on(Wfanorn, NCH, 1, is_dram);
89210152Satgutier@umich.edu  c_intrinsic = 2* drain_C_(Wfanorn, NCH, 1, 1, g_tp.cell_h_def, is_dram) + drain_C_(Wfanorp, NCH, 1, 1, g_tp.cell_h_def, is_dram);
89310152Satgutier@umich.edu  c_gate_load = gate_C(ml_to_ram_wl_drv->width_n[0] + ml_to_ram_wl_drv->width_p[0], 0, is_dram);
89410152Satgutier@umich.edu  tf = rd * (c_intrinsic + c_gate_load);
89510152Satgutier@umich.edu  this_delay = horowitz (out_time_ramp, tf, 0.5, 0.5, RISE);
89610152Satgutier@umich.edu  out_time_ramp = this_delay / (1-0.5);
89710152Satgutier@umich.edu  delay_matchchline += this_delay;
89810152Satgutier@umich.edu
89910152Satgutier@umich.edu  out_time_ramp   = ml_to_ram_wl_drv->compute_delay(out_time_ramp);
90010152Satgutier@umich.edu
90110152Satgutier@umich.edu  //c_gate_load energy is computed in ml_to_ram_wl_drv
90210152Satgutier@umich.edu  dynSearchEng  += (c_intrinsic) * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;//* Ntbl;
90310152Satgutier@umich.edu
90410152Satgutier@umich.edu
90510152Satgutier@umich.edu  /* peripheral-- hitting logic "CMOS VLSI Design Fig11.51*/
90610152Satgutier@umich.edu  /*Precharge the hitting logic */
90710152Satgutier@umich.edu  c_intrinsic = 2*drain_C_(W_hit_miss_p, NCH, 2, 1, g_tp.cell_h_def, is_dram);
90810152Satgutier@umich.edu  Cwire = c_searchline_metal * subarray.num_rows;
90910152Satgutier@umich.edu  Rwire = r_searchline_metal * subarray.num_rows;
91010152Satgutier@umich.edu  c_gate_load = drain_C_(W_hit_miss_n, NCH, 1, 1, g_tp.cell_h_def, is_dram)* subarray.num_rows;
91110152Satgutier@umich.edu
91210152Satgutier@umich.edu  rd = tr_R_on(W_hit_miss_p, PCH, 1, is_dram, false, false);
91310152Satgutier@umich.edu  //double r_ml_metal = cam_cell.w * g_tp.wire_local.R_per_um;
91410152Satgutier@umich.edu  double R_hit_miss = Rwire;
91510152Satgutier@umich.edu  double C_hit_miss = Cwire + c_intrinsic;
91610152Satgutier@umich.edu  delay_hit_miss_reset = log(g_tp.cam.Vbitpre)* (rd * C_hit_miss + R_hit_miss * C_hit_miss / 2);
91710152Satgutier@umich.edu  dynSearchEng  += (c_intrinsic + Cwire + c_gate_load) * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
91810152Satgutier@umich.edu
91910152Satgutier@umich.edu  /*hitting logic evaluation */
92010152Satgutier@umich.edu  c_intrinsic = 2*drain_C_(W_hit_miss_n, NCH, 2, 1, g_tp.cell_h_def, is_dram);
92110152Satgutier@umich.edu  Cwire = c_searchline_metal * subarray.num_rows;
92210152Satgutier@umich.edu  Rwire = r_searchline_metal * subarray.num_rows;
92310152Satgutier@umich.edu  c_gate_load = drain_C_(W_hit_miss_n, NCH, 1, 1, g_tp.cell_h_def, is_dram)* subarray.num_rows;
92410152Satgutier@umich.edu
92510152Satgutier@umich.edu  rd = tr_R_on(W_hit_miss_n, PCH, 1, is_dram, false, false);
92610152Satgutier@umich.edu  tf = rd * (c_intrinsic + Cwire / 2 + c_gate_load) + Rwire * (Cwire / 2 + c_gate_load);
92710152Satgutier@umich.edu
92810152Satgutier@umich.edu  delay_hit_miss = horowitz(0, tf, 0.5, 0.5, FALL);
92910152Satgutier@umich.edu
93010152Satgutier@umich.edu  if (is_fa)
93110152Satgutier@umich.edu      delay_matchchline += MAX(ml_to_ram_wl_drv->delay, delay_hit_miss);
93210152Satgutier@umich.edu
93310152Satgutier@umich.edu  dynSearchEng  += (c_intrinsic + Cwire + c_gate_load) * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
93410152Satgutier@umich.edu
93510152Satgutier@umich.edu  /* TODO: peripheral-- Priority Encoder, usually this is not necessary in processor components*/
93610152Satgutier@umich.edu
93710152Satgutier@umich.edu  power_matchline.searchOp.dynamic = dynSearchEng;
93810152Satgutier@umich.edu
93910152Satgutier@umich.edu  //leakage in one subarray
94010152Satgutier@umich.edu  double Iport     = cmos_Isub_leakage(g_tp.cam.cell_a_w, 0,  1, nmos, false, true);//TODO: how much is the idle time? just by *2?
94110152Satgutier@umich.edu  double Iport_erp = cmos_Isub_leakage(g_tp.cam.cell_a_w, 0,  2, nmos, false, true);
94210152Satgutier@umich.edu  double Icell     = cmos_Isub_leakage(g_tp.cam.cell_nmos_w, g_tp.cam.cell_pmos_w, 1, inv, false, true)*2;
94310152Satgutier@umich.edu  double Icell_comparator = cmos_Isub_leakage(Wdummyn, Wdummyn, 1, inv, false, true)*2;//approx XOR with Inv
94410152Satgutier@umich.edu
94510152Satgutier@umich.edu  leak_power_cc_inverters_sram_cell         = Icell * g_tp.cam_cell.Vdd;
94610152Satgutier@umich.edu  leak_comparator_cam_cell                  = Icell_comparator * g_tp.cam_cell.Vdd;
94710152Satgutier@umich.edu  leak_power_acc_tr_RW_or_WR_port_sram_cell = Iport * g_tp.cam_cell.Vdd;
94810152Satgutier@umich.edu  leak_power_RD_port_sram_cell              = Iport_erp * g_tp.cam_cell.Vdd;
94910152Satgutier@umich.edu  leak_power_SCHP_port_sram_cell            = 0;//search port and r/w port are sperate, therefore no access txs in search ports
95010152Satgutier@umich.edu
95110152Satgutier@umich.edu  power_matchline.searchOp.leakage += leak_power_cc_inverters_sram_cell +
95210152Satgutier@umich.edu    leak_comparator_cam_cell +
95310152Satgutier@umich.edu    leak_power_acc_tr_RW_or_WR_port_sram_cell +
95410152Satgutier@umich.edu    leak_power_acc_tr_RW_or_WR_port_sram_cell * (RWP + EWP - 1) +
95510152Satgutier@umich.edu    leak_power_RD_port_sram_cell * ERP +
95610152Satgutier@umich.edu    leak_power_SCHP_port_sram_cell*SCHP;
95710152Satgutier@umich.edu//  power_matchline.searchOp.leakage += leak_comparator_cam_cell;
95810152Satgutier@umich.edu  power_matchline.searchOp.leakage *= (subarray.num_rows+1) * subarray.num_cols_fa_cam;//TODO:dumy line precise
95910152Satgutier@umich.edu  power_matchline.searchOp.leakage += (subarray.num_rows+1) * cmos_Isub_leakage(0, Wfaprechp, 1, pmos) * g_tp.cam_cell.Vdd;
96010152Satgutier@umich.edu  power_matchline.searchOp.leakage += (subarray.num_rows+1) * cmos_Isub_leakage(Waddrnandn, Waddrnandp, 2, nand) * g_tp.cam_cell.Vdd;
96110152Satgutier@umich.edu  power_matchline.searchOp.leakage += (subarray.num_rows+1) * cmos_Isub_leakage(Wfanorn, Wfanorp,2, nor) * g_tp.cam_cell.Vdd;
96210152Satgutier@umich.edu  //In idle states, the hit/miss txs are closed (on) therefore no Isub
96310152Satgutier@umich.edu  power_matchline.searchOp.leakage += 0;// subarray.num_rows * cmos_Isub_leakage(W_hit_miss_n, 0,1, nmos) * g_tp.cam_cell.Vdd+
96410152Satgutier@umich.edu    // + cmos_Isub_leakage(0, W_hit_miss_p,1, pmos) * g_tp.cam_cell.Vdd;
96510152Satgutier@umich.edu
96610152Satgutier@umich.edu  //in idle state, Ig_on only possibly exist in access transistors of read only ports
96710152Satgutier@umich.edu  double Ig_port_erp = cmos_Ig_leakage(g_tp.cam.cell_a_w, 0, 1, nmos, false, true);
96810152Satgutier@umich.edu  double Ig_cell     = cmos_Ig_leakage(g_tp.cam.cell_nmos_w, g_tp.cam.cell_pmos_w, 1, inv, false, true)*2;
96910152Satgutier@umich.edu  double Ig_cell_comparator = cmos_Ig_leakage(Wdummyn, Wdummyn, 1, inv, false, true)*2;// cmos_Ig_leakage(Wdummyn, 0, 2, nmos)*2;
97010152Satgutier@umich.edu
97110152Satgutier@umich.edu  gate_leak_comparator_cam_cell          = Ig_cell_comparator* g_tp.cam_cell.Vdd;
97210152Satgutier@umich.edu  gate_leak_power_cc_inverters_sram_cell = Ig_cell*g_tp.cam_cell.Vdd;
97310152Satgutier@umich.edu  gate_leak_power_RD_port_sram_cell      = Ig_port_erp*g_tp.sram_cell.Vdd;
97410152Satgutier@umich.edu  gate_leak_power_SCHP_port_sram_cell    = 0;
97510152Satgutier@umich.edu
97610152Satgutier@umich.edu  //cout<<"power_matchline.searchOp.leakage"<<power_matchline.searchOp.leakage<<endl;
97710152Satgutier@umich.edu
97810152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += gate_leak_power_cc_inverters_sram_cell;
97910152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += gate_leak_comparator_cam_cell;
98010152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += gate_leak_power_SCHP_port_sram_cell*SCHP + gate_leak_power_RD_port_sram_cell * ERP;
98110152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage *= (subarray.num_rows+1) * subarray.num_cols_fa_cam;//TODO:dumy line precise
98210152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += (subarray.num_rows+1) * cmos_Ig_leakage(0, Wfaprechp,1, pmos) * g_tp.cam_cell.Vdd;
98310152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += (subarray.num_rows+1) * cmos_Ig_leakage(Waddrnandn, Waddrnandp, 2, nand) * g_tp.cam_cell.Vdd;
98410152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += (subarray.num_rows+1) * cmos_Ig_leakage(Wfanorn, Wfanorp, 2, nor) * g_tp.cam_cell.Vdd;
98510152Satgutier@umich.edu  power_matchline.searchOp.gate_leakage += subarray.num_rows * cmos_Ig_leakage(W_hit_miss_n, 0,1, nmos) * g_tp.cam_cell.Vdd+
98610152Satgutier@umich.edu                                       + cmos_Ig_leakage(0, W_hit_miss_p,1, pmos) * g_tp.cam_cell.Vdd;
98710152Satgutier@umich.edu
98810152Satgutier@umich.edu
98910152Satgutier@umich.edu   return out_time_ramp;
99010152Satgutier@umich.edu}
99110152Satgutier@umich.edu
99210152Satgutier@umich.edu
99310152Satgutier@umich.edudouble Mat::width_write_driver_or_write_mux()
99410152Satgutier@umich.edu{
99510152Satgutier@umich.edu  // calculate resistance of SRAM cell pull-up PMOS transistor
99610152Satgutier@umich.edu  // cam and sram have same cell trasistor properties
99710152Satgutier@umich.edu  double R_sram_cell_pull_up_tr  = tr_R_on(g_tp.sram.cell_pmos_w, NCH, 1, is_dram, true);
99810152Satgutier@umich.edu  double R_access_tr             = tr_R_on(g_tp.sram.cell_a_w,    NCH, 1, is_dram, true);
99910152Satgutier@umich.edu  double target_R_write_driver_and_mux = (2 * R_sram_cell_pull_up_tr - R_access_tr) / 2;
100010152Satgutier@umich.edu  double width_write_driver_nmos = R_to_w(target_R_write_driver_and_mux, NCH, is_dram);
100110152Satgutier@umich.edu
100210152Satgutier@umich.edu  return width_write_driver_nmos;
100310152Satgutier@umich.edu}
100410152Satgutier@umich.edu
100510152Satgutier@umich.edu
100610152Satgutier@umich.edu
100710152Satgutier@umich.edudouble Mat::compute_comparators_height(
100810152Satgutier@umich.edu    int tagbits,
100910152Satgutier@umich.edu    int number_ways_in_mat,
101010152Satgutier@umich.edu    double subarray_mem_cell_area_width)
101110152Satgutier@umich.edu{
101210152Satgutier@umich.edu  double nand2_area = compute_gate_area(NAND, 2, 0, g_tp.w_comp_n, g_tp.cell_h_def);
101310152Satgutier@umich.edu  double cumulative_area = nand2_area * number_ways_in_mat * tagbits / 4;
101410152Satgutier@umich.edu  return cumulative_area / subarray_mem_cell_area_width;
101510152Satgutier@umich.edu}
101610152Satgutier@umich.edu
101710152Satgutier@umich.edu
101810152Satgutier@umich.edu
101910152Satgutier@umich.edudouble Mat::compute_bitline_delay(double inrisetime)
102010152Satgutier@umich.edu{
102110152Satgutier@umich.edu  double V_b_pre, v_th_mem_cell, V_wl;
102210152Satgutier@umich.edu  double tstep;
102310152Satgutier@umich.edu  double dynRdEnergy = 0.0, dynWriteEnergy = 0.0;
102410152Satgutier@umich.edu  double R_cell_pull_down=0.0, R_cell_acc =0.0, r_dev=0.0;
102510152Satgutier@umich.edu  int deg_senseamp_muxing = dp.Ndsam_lev_1 * dp.Ndsam_lev_2;
102610152Satgutier@umich.edu
102710152Satgutier@umich.edu  double R_b_metal = camFlag? cam_cell.h:cell.h * g_tp.wire_local.R_per_um;
102810152Satgutier@umich.edu  double R_bl      = subarray.num_rows * R_b_metal;
102910152Satgutier@umich.edu  double C_bl      = subarray.C_bl;
103010152Satgutier@umich.edu
103110152Satgutier@umich.edu  // TODO: no leakage for DRAMs?
103210152Satgutier@umich.edu  double leak_power_cc_inverters_sram_cell = 0;
103310152Satgutier@umich.edu  double gate_leak_power_cc_inverters_sram_cell = 0;
103410152Satgutier@umich.edu  double leak_power_acc_tr_RW_or_WR_port_sram_cell = 0;
103510152Satgutier@umich.edu  double leak_power_RD_port_sram_cell = 0;
103610152Satgutier@umich.edu  double gate_leak_power_RD_port_sram_cell = 0;
103710152Satgutier@umich.edu
103810152Satgutier@umich.edu  if (is_dram == true)
103910152Satgutier@umich.edu  {
104010152Satgutier@umich.edu    V_b_pre = g_tp.dram.Vbitpre;
104110152Satgutier@umich.edu    v_th_mem_cell = g_tp.dram_acc.Vth;
104210152Satgutier@umich.edu    V_wl = g_tp.vpp;
104310152Satgutier@umich.edu    //The access transistor is not folded. So we just need to specify a threshold value for the
104410152Satgutier@umich.edu    //folding width that is equal to or greater than Wmemcella.
104510152Satgutier@umich.edu    R_cell_acc = tr_R_on(g_tp.dram.cell_a_w, NCH, 1, true, true);
104610152Satgutier@umich.edu    r_dev = g_tp.dram_cell_Vdd / g_tp.dram_cell_I_on + R_bl / 2;
104710152Satgutier@umich.edu  }
104810152Satgutier@umich.edu  else
104910152Satgutier@umich.edu  { //SRAM
105010152Satgutier@umich.edu    V_b_pre = g_tp.sram.Vbitpre;
105110152Satgutier@umich.edu    v_th_mem_cell = g_tp.sram_cell.Vth;
105210152Satgutier@umich.edu    V_wl = g_tp.sram_cell.Vdd;
105310152Satgutier@umich.edu    R_cell_pull_down = tr_R_on(g_tp.sram.cell_nmos_w, NCH, 1, false, true);
105410152Satgutier@umich.edu    R_cell_acc = tr_R_on(g_tp.sram.cell_a_w, NCH, 1, false, true);
105510152Satgutier@umich.edu
105610152Satgutier@umich.edu    //Leakage current of an SRAM cell
105710152Satgutier@umich.edu    double Iport     = cmos_Isub_leakage(g_tp.sram.cell_a_w, 0,  1, nmos,false, true);//TODO: how much is the idle time? just by *2?
105810152Satgutier@umich.edu    double Iport_erp = cmos_Isub_leakage(g_tp.sram.cell_a_w, 0,  2, nmos,false, true);
105910152Satgutier@umich.edu    double Icell     = cmos_Isub_leakage(g_tp.sram.cell_nmos_w, g_tp.sram.cell_pmos_w, 1, inv,false, true)*2;//two invs per cell
106010152Satgutier@umich.edu
106110152Satgutier@umich.edu    leak_power_cc_inverters_sram_cell         = Icell * g_tp.sram_cell.Vdd;
106210152Satgutier@umich.edu    leak_power_acc_tr_RW_or_WR_port_sram_cell = Iport * g_tp.sram_cell.Vdd;
106310152Satgutier@umich.edu    leak_power_RD_port_sram_cell              = Iport_erp * g_tp.sram_cell.Vdd;
106410152Satgutier@umich.edu
106510152Satgutier@umich.edu
106610152Satgutier@umich.edu    //in idle state, Ig_on only possibly exist in access transistors of read only ports
106710152Satgutier@umich.edu    double Ig_port_erp   = cmos_Ig_leakage(g_tp.sram.cell_a_w, 0, 1, nmos,false, true);
106810152Satgutier@umich.edu    double Ig_cell   = cmos_Ig_leakage(g_tp.sram.cell_nmos_w, g_tp.sram.cell_pmos_w, 1, inv,false, true);
106910152Satgutier@umich.edu
107010152Satgutier@umich.edu    gate_leak_power_cc_inverters_sram_cell = Ig_cell*g_tp.sram_cell.Vdd;
107110152Satgutier@umich.edu    gate_leak_power_RD_port_sram_cell      = Ig_port_erp*g_tp.sram_cell.Vdd;
107210152Satgutier@umich.edu  }
107310152Satgutier@umich.edu
107410152Satgutier@umich.edu
107510152Satgutier@umich.edu  double C_drain_bit_mux = drain_C_(g_tp.w_nmos_b_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w / (2 *(RWP + ERP + SCHP)), is_dram);
107610152Satgutier@umich.edu  double R_bit_mux = tr_R_on(g_tp.w_nmos_b_mux, NCH, 1, is_dram);
107710152Satgutier@umich.edu  double C_drain_sense_amp_iso = drain_C_(g_tp.w_iso, PCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram);
107810152Satgutier@umich.edu  double R_sense_amp_iso = tr_R_on(g_tp.w_iso, PCH, 1, is_dram);
107910152Satgutier@umich.edu  double C_sense_amp_latch = gate_C(g_tp.w_sense_p + g_tp.w_sense_n, 0, is_dram) +
108010152Satgutier@umich.edu    drain_C_(g_tp.w_sense_n, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram) +
108110152Satgutier@umich.edu    drain_C_(g_tp.w_sense_p, PCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram);
108210152Satgutier@umich.edu  double C_drain_sense_amp_mux = drain_C_(g_tp.w_nmos_sa_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram);
108310152Satgutier@umich.edu
108410152Satgutier@umich.edu  if (is_dram)
108510152Satgutier@umich.edu  {
108610152Satgutier@umich.edu    double fraction = dp.V_b_sense / ((g_tp.dram_cell_Vdd/2) * g_tp.dram_cell_C /(g_tp.dram_cell_C + C_bl));
108710152Satgutier@umich.edu    tstep = 2.3 * fraction * r_dev *
108810152Satgutier@umich.edu      (g_tp.dram_cell_C * (C_bl + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux)) /
108910152Satgutier@umich.edu      (g_tp.dram_cell_C + (C_bl + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux));
109010152Satgutier@umich.edu    delay_writeback = tstep;
109110152Satgutier@umich.edu    dynRdEnergy += (C_bl + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) *
109210152Satgutier@umich.edu      (g_tp.dram_cell_Vdd / 2) * g_tp.dram_cell_Vdd /* subarray.num_cols * num_subarrays_per_mat*/;
109310152Satgutier@umich.edu    dynWriteEnergy += (C_bl + 2*C_drain_sense_amp_iso + C_sense_amp_latch) *
109410152Satgutier@umich.edu      (g_tp.dram_cell_Vdd / 2) * g_tp.dram_cell_Vdd /* subarray.num_cols * num_subarrays_per_mat*/ * num_act_mats_hor_dir*100;
109510152Satgutier@umich.edu    per_bitline_read_energy = (C_bl + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) *
109610152Satgutier@umich.edu      (g_tp.dram_cell_Vdd / 2) * g_tp.dram_cell_Vdd;
109710152Satgutier@umich.edu  }
109810152Satgutier@umich.edu  else
109910152Satgutier@umich.edu  {
110010152Satgutier@umich.edu    double tau;
110110152Satgutier@umich.edu
110210152Satgutier@umich.edu    if (deg_bl_muxing > 1)
110310152Satgutier@umich.edu    {
110410152Satgutier@umich.edu      tau = (R_cell_pull_down + R_cell_acc) *
110510152Satgutier@umich.edu        (C_bl + 2*C_drain_bit_mux + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) +
110610152Satgutier@umich.edu        R_bl * (C_bl/2 + 2*C_drain_bit_mux + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) +
110710152Satgutier@umich.edu        R_bit_mux * (C_drain_bit_mux + 2*C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) +
110810152Satgutier@umich.edu        R_sense_amp_iso * (C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux);
110910152Satgutier@umich.edu      dynRdEnergy += (C_bl + 2 * C_drain_bit_mux) * 2 * dp.V_b_sense * g_tp.sram_cell.Vdd /*
111010152Satgutier@umich.edu        subarray.num_cols * num_subarrays_per_mat*/;
111110152Satgutier@umich.edu      dynRdEnergy += (2 * C_drain_sense_amp_iso + C_sense_amp_latch +  C_drain_sense_amp_mux) *
111210152Satgutier@umich.edu        2 * dp.V_b_sense * g_tp.sram_cell.Vdd * (1.0/*subarray.num_cols * num_subarrays_per_mat*/ / deg_bl_muxing);
111310152Satgutier@umich.edu      dynWriteEnergy += ((1.0/*subarray.num_cols *num_subarrays_per_mat*/ / deg_bl_muxing) / deg_senseamp_muxing) *
111410152Satgutier@umich.edu          num_act_mats_hor_dir * (C_bl + 2*C_drain_bit_mux) * g_tp.sram_cell.Vdd * g_tp.sram_cell.Vdd*2;
111510152Satgutier@umich.edu      //Write Ops are differential for SRAM
111610152Satgutier@umich.edu    }
111710152Satgutier@umich.edu    else
111810152Satgutier@umich.edu    {
111910152Satgutier@umich.edu      tau = (R_cell_pull_down + R_cell_acc) *
112010152Satgutier@umich.edu        (C_bl + C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) + R_bl * C_bl / 2 +
112110152Satgutier@umich.edu        R_sense_amp_iso * (C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux);
112210152Satgutier@umich.edu      dynRdEnergy += (C_bl + 2 * C_drain_sense_amp_iso + C_sense_amp_latch + C_drain_sense_amp_mux) *
112310152Satgutier@umich.edu        2 * dp.V_b_sense * g_tp.sram_cell.Vdd /* subarray.num_cols * num_subarrays_per_mat*/;
112410152Satgutier@umich.edu      dynWriteEnergy += (((1.0/*subarray.num_cols * num_subarrays_per_mat*/ / deg_bl_muxing) / deg_senseamp_muxing) *
112510152Satgutier@umich.edu          num_act_mats_hor_dir * C_bl) * g_tp.sram_cell.Vdd * g_tp.sram_cell.Vdd*2;
112610152Satgutier@umich.edu
112710152Satgutier@umich.edu    }
112810152Satgutier@umich.edu    tstep = tau * log(V_b_pre / (V_b_pre - dp.V_b_sense));
112910152Satgutier@umich.edu    power_bitline.readOp.leakage =
113010152Satgutier@umich.edu      leak_power_cc_inverters_sram_cell +
113110152Satgutier@umich.edu      leak_power_acc_tr_RW_or_WR_port_sram_cell +
113210152Satgutier@umich.edu      leak_power_acc_tr_RW_or_WR_port_sram_cell * (RWP + EWP - 1) +
113310152Satgutier@umich.edu      leak_power_RD_port_sram_cell * ERP;
113410152Satgutier@umich.edu    power_bitline.readOp.gate_leakage = gate_leak_power_cc_inverters_sram_cell +
113510152Satgutier@umich.edu      gate_leak_power_RD_port_sram_cell * ERP;
113610152Satgutier@umich.edu
113710152Satgutier@umich.edu  }
113810152Satgutier@umich.edu
113910152Satgutier@umich.edu//  cout<<"leak_power_cc_inverters_sram_cell"<<leak_power_cc_inverters_sram_cell<<endl;
114010152Satgutier@umich.edu//  cout<<"leak_power_acc_tr_RW_or_WR_port_sram_cell"<<leak_power_acc_tr_RW_or_WR_port_sram_cell<<endl;
114110152Satgutier@umich.edu//  cout<<"leak_power_acc_tr_RW_or_WR_port_sram_cell"<<leak_power_acc_tr_RW_or_WR_port_sram_cell<<endl;
114210152Satgutier@umich.edu//  cout<<"leak_power_RD_port_sram_cell"<<leak_power_RD_port_sram_cell<<endl;
114310152Satgutier@umich.edu
114410152Satgutier@umich.edu
114510152Satgutier@umich.edu  /* take input rise time into account */
114610152Satgutier@umich.edu  double m = V_wl / inrisetime;
114710152Satgutier@umich.edu  if (tstep <= (0.5 * (V_wl - v_th_mem_cell) / m))
114810152Satgutier@umich.edu  {
114910152Satgutier@umich.edu    delay_bitline = sqrt(2 * tstep * (V_wl - v_th_mem_cell)/ m);
115010152Satgutier@umich.edu  }
115110152Satgutier@umich.edu  else
115210152Satgutier@umich.edu  {
115310152Satgutier@umich.edu    delay_bitline = tstep + (V_wl - v_th_mem_cell) / (2 * m);
115410152Satgutier@umich.edu  }
115510152Satgutier@umich.edu
115610152Satgutier@umich.edu  bool is_fa = (dp.fully_assoc) ? true : false;
115710152Satgutier@umich.edu
115810152Satgutier@umich.edu  if (dp.is_tag == false || is_fa == false)
115910152Satgutier@umich.edu  {
116010152Satgutier@umich.edu    power_bitline.readOp.dynamic  = dynRdEnergy;
116110152Satgutier@umich.edu    power_bitline.writeOp.dynamic = dynWriteEnergy;
116210152Satgutier@umich.edu  }
116310152Satgutier@umich.edu
116410152Satgutier@umich.edu  double outrisetime = 0;
116510152Satgutier@umich.edu  return outrisetime;
116610152Satgutier@umich.edu}
116710152Satgutier@umich.edu
116810152Satgutier@umich.edu
116910152Satgutier@umich.edu
117010152Satgutier@umich.edudouble Mat::compute_sa_delay(double inrisetime)
117110152Satgutier@umich.edu{
117210152Satgutier@umich.edu  //int num_sa_subarray = subarray.num_cols / deg_bl_muxing; //in a subarray
117310152Satgutier@umich.edu
117410152Satgutier@umich.edu  //Bitline circuitry leakage.
117510152Satgutier@umich.edu  double Iiso     = simplified_pmos_leakage(g_tp.w_iso, is_dram);
117610152Satgutier@umich.edu  double IsenseEn = simplified_nmos_leakage(g_tp.w_sense_en, is_dram);
117710152Satgutier@umich.edu  double IsenseN  = simplified_nmos_leakage(g_tp.w_sense_n, is_dram);
117810152Satgutier@umich.edu  double IsenseP  = simplified_pmos_leakage(g_tp.w_sense_p, is_dram);
117910152Satgutier@umich.edu
118010152Satgutier@umich.edu  double lkgIdlePh  = IsenseEn;//+ 2*IoBufP;
118110152Satgutier@umich.edu  //double lkgWritePh = Iiso + IsenseEn;// + 2*IoBufP + 2*Ipch;
118210152Satgutier@umich.edu  double lkgReadPh  = Iiso + IsenseN + IsenseP;//+ IoBufN + IoBufP + 2*IsPch ;
118310152Satgutier@umich.edu  //double lkgRead = lkgReadPh * num_sa_subarray * 4 * num_act_mats_hor_dir +
118410152Satgutier@umich.edu  //    lkgIdlePh * num_sa_subarray * 4 * (num_mats - num_act_mats_hor_dir);
118510152Satgutier@umich.edu  double lkgIdle = lkgIdlePh /*num_sa_subarray * num_subarrays_per_mat*/;
118610152Satgutier@umich.edu  leak_power_sense_amps_closed_page_state = lkgIdlePh * g_tp.peri_global.Vdd /* num_sa_subarray * num_subarrays_per_mat*/;
118710152Satgutier@umich.edu  leak_power_sense_amps_open_page_state   = lkgReadPh * g_tp.peri_global.Vdd /* num_sa_subarray * num_subarrays_per_mat*/;
118810152Satgutier@umich.edu
118910152Satgutier@umich.edu  // sense amplifier has to drive logic in "data out driver" and sense precharge load.
119010152Satgutier@umich.edu  // load seen by sense amp. New delay model for sense amp that is sensitive to both the output time
119110152Satgutier@umich.edu  //constant as well as the magnitude of input differential voltage.
119210152Satgutier@umich.edu  double C_ld = gate_C(g_tp.w_sense_p + g_tp.w_sense_n, 0, is_dram) +
119310152Satgutier@umich.edu    drain_C_(g_tp.w_sense_n, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram) +
119410152Satgutier@umich.edu    drain_C_(g_tp.w_sense_p, PCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram) +
119510152Satgutier@umich.edu    drain_C_(g_tp.w_iso,PCH,1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram) +
119610152Satgutier@umich.edu    drain_C_(g_tp.w_nmos_sa_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram);
119710152Satgutier@umich.edu  double tau = C_ld / g_tp.gm_sense_amp_latch;
119810152Satgutier@umich.edu  delay_sa = tau * log(g_tp.peri_global.Vdd / dp.V_b_sense);
119910152Satgutier@umich.edu  power_sa.readOp.dynamic = C_ld * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd /* num_sa_subarray
120010152Satgutier@umich.edu                            num_subarrays_per_mat * num_act_mats_hor_dir*/;
120110152Satgutier@umich.edu  power_sa.readOp.leakage = lkgIdle * g_tp.peri_global.Vdd;
120210152Satgutier@umich.edu
120310152Satgutier@umich.edu  double outrisetime = 0;
120410152Satgutier@umich.edu  return outrisetime;
120510152Satgutier@umich.edu}
120610152Satgutier@umich.edu
120710152Satgutier@umich.edu
120810152Satgutier@umich.edu
120910152Satgutier@umich.edudouble Mat::compute_subarray_out_drv(double inrisetime)
121010152Satgutier@umich.edu{
121110152Satgutier@umich.edu  double C_ld, rd, tf, this_delay;
121210152Satgutier@umich.edu  double p_to_n_sz_r = pmos_to_nmos_sz_ratio(is_dram);
121310152Satgutier@umich.edu
121410152Satgutier@umich.edu  // delay of signal through pass-transistor of first level of sense-amp mux to input of inverter-buffer.
121510152Satgutier@umich.edu  rd = tr_R_on(g_tp.w_nmos_sa_mux, NCH, 1, is_dram);
121610152Satgutier@umich.edu  C_ld = dp.Ndsam_lev_1 * drain_C_(g_tp.w_nmos_sa_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing / (RWP + ERP + SCHP), is_dram) +
121710152Satgutier@umich.edu    gate_C(g_tp.min_w_nmos_ + p_to_n_sz_r * g_tp.min_w_nmos_, 0.0, is_dram);
121810152Satgutier@umich.edu  tf = rd * C_ld;
121910152Satgutier@umich.edu  this_delay = horowitz(inrisetime, tf, 0.5, 0.5, RISE);
122010152Satgutier@umich.edu  delay_subarray_out_drv += this_delay;
122110152Satgutier@umich.edu  inrisetime = this_delay/(1.0 - 0.5);
122210152Satgutier@umich.edu  power_subarray_out_drv.readOp.dynamic += C_ld * 0.5 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
122310152Satgutier@umich.edu  power_subarray_out_drv.readOp.leakage += 0;  // for now, let leakage of the pass transistor be 0
122410152Satgutier@umich.edu  power_subarray_out_drv.readOp.gate_leakage += cmos_Ig_leakage(g_tp.w_nmos_sa_mux, 0, 1, nmos)* g_tp.peri_global.Vdd;
122510152Satgutier@umich.edu  // delay of signal through inverter-buffer to second level of sense-amp mux.
122610152Satgutier@umich.edu  // internal delay of buffer
122710152Satgutier@umich.edu  rd = tr_R_on(g_tp.min_w_nmos_, NCH, 1, is_dram);
122810152Satgutier@umich.edu  C_ld = drain_C_(g_tp.min_w_nmos_, NCH, 1, 1, g_tp.cell_h_def, is_dram) +
122910152Satgutier@umich.edu    drain_C_(p_to_n_sz_r * g_tp.min_w_nmos_, PCH, 1, 1, g_tp.cell_h_def, is_dram) +
123010152Satgutier@umich.edu    gate_C(g_tp.min_w_nmos_ + p_to_n_sz_r * g_tp.min_w_nmos_, 0.0, is_dram);
123110152Satgutier@umich.edu  tf = rd * C_ld;
123210152Satgutier@umich.edu  this_delay = horowitz(inrisetime, tf, 0.5, 0.5, RISE);
123310152Satgutier@umich.edu  delay_subarray_out_drv += this_delay;
123410152Satgutier@umich.edu  inrisetime = this_delay/(1.0 - 0.5);
123510152Satgutier@umich.edu  power_subarray_out_drv.readOp.dynamic      += C_ld * 0.5 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
123610152Satgutier@umich.edu  power_subarray_out_drv.readOp.leakage      += cmos_Isub_leakage(g_tp.min_w_nmos_, p_to_n_sz_r * g_tp.min_w_nmos_, 1, inv, is_dram)* g_tp.peri_global.Vdd;
123710152Satgutier@umich.edu  power_subarray_out_drv.readOp.gate_leakage += cmos_Ig_leakage(g_tp.min_w_nmos_, p_to_n_sz_r * g_tp.min_w_nmos_, 1, inv)* g_tp.peri_global.Vdd;
123810152Satgutier@umich.edu
123910152Satgutier@umich.edu  // inverter driving drain of pass transistor of second level of sense-amp mux.
124010152Satgutier@umich.edu  rd = tr_R_on(g_tp.min_w_nmos_, NCH, 1, is_dram);
124110152Satgutier@umich.edu  C_ld = drain_C_(g_tp.min_w_nmos_, NCH, 1, 1, g_tp.cell_h_def, is_dram) +
124210152Satgutier@umich.edu    drain_C_(p_to_n_sz_r * g_tp.min_w_nmos_, PCH, 1, 1, g_tp.cell_h_def, is_dram) +
124310152Satgutier@umich.edu    drain_C_(g_tp.w_nmos_sa_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing * dp.Ndsam_lev_1 / (RWP + ERP + SCHP), is_dram);
124410152Satgutier@umich.edu  tf = rd * C_ld;
124510152Satgutier@umich.edu  this_delay = horowitz(inrisetime, tf, 0.5, 0.5, RISE);
124610152Satgutier@umich.edu  delay_subarray_out_drv += this_delay;
124710152Satgutier@umich.edu  inrisetime = this_delay/(1.0 - 0.5);
124810152Satgutier@umich.edu  power_subarray_out_drv.readOp.dynamic      += C_ld * 0.5 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
124910152Satgutier@umich.edu  power_subarray_out_drv.readOp.leakage      += cmos_Isub_leakage(g_tp.min_w_nmos_, p_to_n_sz_r * g_tp.min_w_nmos_, 1, inv)* g_tp.peri_global.Vdd;
125010152Satgutier@umich.edu  power_subarray_out_drv.readOp.gate_leakage += cmos_Ig_leakage(g_tp.min_w_nmos_, p_to_n_sz_r * g_tp.min_w_nmos_, 1, inv)* g_tp.peri_global.Vdd;
125110152Satgutier@umich.edu
125210152Satgutier@umich.edu
125310152Satgutier@umich.edu  // delay of signal through pass-transistor to input of subarray output driver.
125410152Satgutier@umich.edu  rd = tr_R_on(g_tp.w_nmos_sa_mux, NCH, 1, is_dram);
125510152Satgutier@umich.edu  C_ld = dp.Ndsam_lev_2 * drain_C_(g_tp.w_nmos_sa_mux, NCH, 1, 0, camFlag? cam_cell.w:cell.w * deg_bl_muxing * dp.Ndsam_lev_1 / (RWP + ERP + SCHP), is_dram) +
125610152Satgutier@umich.edu    //gate_C(subarray_out_wire->repeater_size * g_tp.min_w_nmos_ * (1 + p_to_n_sz_r), 0.0, is_dram);
125710152Satgutier@umich.edu    gate_C(subarray_out_wire->repeater_size *(subarray_out_wire->wire_length/subarray_out_wire->repeater_spacing) * g_tp.min_w_nmos_ * (1 + p_to_n_sz_r), 0.0, is_dram);
125810152Satgutier@umich.edu  tf = rd * C_ld;
125910152Satgutier@umich.edu  this_delay = horowitz(inrisetime, tf, 0.5, 0.5, RISE);
126010152Satgutier@umich.edu  delay_subarray_out_drv += this_delay;
126110152Satgutier@umich.edu  inrisetime = this_delay/(1.0 - 0.5);
126210152Satgutier@umich.edu  power_subarray_out_drv.readOp.dynamic += C_ld * 0.5 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd;
126310152Satgutier@umich.edu  power_subarray_out_drv.readOp.leakage += 0;  // for now, let leakage of the pass transistor be 0
126410152Satgutier@umich.edu  power_subarray_out_drv.readOp.gate_leakage += cmos_Ig_leakage(g_tp.w_nmos_sa_mux, 0, 1, nmos)* g_tp.peri_global.Vdd;
126510152Satgutier@umich.edu
126610152Satgutier@umich.edu
126710152Satgutier@umich.edu  return inrisetime;
126810152Satgutier@umich.edu}
126910152Satgutier@umich.edu
127010152Satgutier@umich.edu
127110152Satgutier@umich.edu
127210152Satgutier@umich.edudouble Mat::compute_comparator_delay(double inrisetime)
127310152Satgutier@umich.edu{
127410152Satgutier@umich.edu  int A = g_ip->tag_assoc;
127510152Satgutier@umich.edu
127610152Satgutier@umich.edu  int tagbits_ = dp.tagbits / 4; // Assuming there are 4 quarter comparators. input tagbits is already
127710152Satgutier@umich.edu  // a multiple of 4.
127810152Satgutier@umich.edu
127910152Satgutier@umich.edu  /* First Inverter */
128010152Satgutier@umich.edu  double Ceq = gate_C(g_tp.w_comp_inv_n2+g_tp.w_comp_inv_p2, 0, is_dram) +
128110152Satgutier@umich.edu               drain_C_(g_tp.w_comp_inv_p1, PCH, 1, 1, g_tp.cell_h_def, is_dram) +
128210152Satgutier@umich.edu               drain_C_(g_tp.w_comp_inv_n1, NCH, 1, 1, g_tp.cell_h_def, is_dram);
128310152Satgutier@umich.edu  double Req = tr_R_on(g_tp.w_comp_inv_p1, PCH, 1, is_dram);
128410152Satgutier@umich.edu  double tf  = Req*Ceq;
128510152Satgutier@umich.edu  double st1del = horowitz(inrisetime,tf,VTHCOMPINV,VTHCOMPINV,FALL);
128610152Satgutier@umich.edu  double nextinputtime = st1del/VTHCOMPINV;
128710152Satgutier@umich.edu  power_comparator.readOp.dynamic += 0.5 * Ceq * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd * 4 * A;
128810152Satgutier@umich.edu
128910152Satgutier@umich.edu  //For each degree of associativity
129010152Satgutier@umich.edu  //there are 4 such quarter comparators
129110152Satgutier@umich.edu  double lkgCurrent   = cmos_Isub_leakage(g_tp.w_comp_inv_n1, g_tp.w_comp_inv_p1, 1, inv, is_dram)* 4 * A;
129210152Satgutier@umich.edu  double gatelkgCurrent = cmos_Ig_leakage(g_tp.w_comp_inv_n1, g_tp.w_comp_inv_p1, 1, inv, is_dram)* 4 * A;
129310152Satgutier@umich.edu  /* Second Inverter */
129410152Satgutier@umich.edu  Ceq = gate_C(g_tp.w_comp_inv_n3+g_tp.w_comp_inv_p3, 0, is_dram) +
129510152Satgutier@umich.edu    drain_C_(g_tp.w_comp_inv_p2, PCH, 1, 1, g_tp.cell_h_def, is_dram) +
129610152Satgutier@umich.edu    drain_C_(g_tp.w_comp_inv_n2, NCH, 1, 1, g_tp.cell_h_def, is_dram);
129710152Satgutier@umich.edu  Req = tr_R_on(g_tp.w_comp_inv_n2, NCH, 1, is_dram);
129810152Satgutier@umich.edu  tf = Req*Ceq;
129910152Satgutier@umich.edu  double st2del = horowitz(nextinputtime,tf,VTHCOMPINV,VTHCOMPINV,RISE);
130010152Satgutier@umich.edu  nextinputtime = st2del/(1.0-VTHCOMPINV);
130110152Satgutier@umich.edu  power_comparator.readOp.dynamic += 0.5 * Ceq * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd * 4 * A;
130210152Satgutier@umich.edu  lkgCurrent += cmos_Isub_leakage(g_tp.w_comp_inv_n2, g_tp.w_comp_inv_p2, 1, inv, is_dram)* 4 * A;
130310152Satgutier@umich.edu  gatelkgCurrent += cmos_Ig_leakage(g_tp.w_comp_inv_n2, g_tp.w_comp_inv_p2, 1, inv, is_dram)* 4 * A;
130410152Satgutier@umich.edu
130510152Satgutier@umich.edu  /* Third Inverter */
130610152Satgutier@umich.edu  Ceq = gate_C(g_tp.w_eval_inv_n+g_tp.w_eval_inv_p, 0, is_dram) +
130710152Satgutier@umich.edu    drain_C_(g_tp.w_comp_inv_p3, PCH, 1, 1, g_tp.cell_h_def, is_dram) +
130810152Satgutier@umich.edu    drain_C_(g_tp.w_comp_inv_n3, NCH, 1, 1, g_tp.cell_h_def, is_dram);
130910152Satgutier@umich.edu  Req = tr_R_on(g_tp.w_comp_inv_p3, PCH, 1, is_dram);
131010152Satgutier@umich.edu  tf = Req*Ceq;
131110152Satgutier@umich.edu  double st3del = horowitz(nextinputtime,tf,VTHCOMPINV,VTHEVALINV,FALL);
131210152Satgutier@umich.edu  nextinputtime = st3del/(VTHEVALINV);
131310152Satgutier@umich.edu  power_comparator.readOp.dynamic += 0.5 * Ceq * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd * 4 * A;
131410152Satgutier@umich.edu  lkgCurrent += cmos_Isub_leakage(g_tp.w_comp_inv_n3, g_tp.w_comp_inv_p3, 1, inv, is_dram)* 4 * A;
131510152Satgutier@umich.edu  gatelkgCurrent += cmos_Ig_leakage(g_tp.w_comp_inv_n3, g_tp.w_comp_inv_p3, 1, inv, is_dram)* 4 * A;
131610152Satgutier@umich.edu
131710152Satgutier@umich.edu  /* Final Inverter (virtual ground driver) discharging compare part */
131810152Satgutier@umich.edu  double r1 = tr_R_on(g_tp.w_comp_n,NCH,2, is_dram);
131910152Satgutier@umich.edu  double r2 = tr_R_on(g_tp.w_eval_inv_n,NCH,1, is_dram); /* was switch */
132010152Satgutier@umich.edu  double c2 = (tagbits_)*(drain_C_(g_tp.w_comp_n,NCH,1, 1, g_tp.cell_h_def, is_dram) +
132110152Satgutier@umich.edu                   drain_C_(g_tp.w_comp_n,NCH,2, 1, g_tp.cell_h_def, is_dram)) +
132210152Satgutier@umich.edu       drain_C_(g_tp.w_eval_inv_p,PCH,1, 1, g_tp.cell_h_def, is_dram) +
132310152Satgutier@umich.edu       drain_C_(g_tp.w_eval_inv_n,NCH,1, 1, g_tp.cell_h_def, is_dram);
132410152Satgutier@umich.edu  double c1 = (tagbits_)*(drain_C_(g_tp.w_comp_n,NCH,1, 1, g_tp.cell_h_def, is_dram) +
132510152Satgutier@umich.edu                          drain_C_(g_tp.w_comp_n,NCH,2, 1, g_tp.cell_h_def, is_dram)) +
132610152Satgutier@umich.edu    drain_C_(g_tp.w_comp_p,PCH,1, 1, g_tp.cell_h_def, is_dram) +
132710152Satgutier@umich.edu    gate_C(WmuxdrvNANDn+WmuxdrvNANDp,0, is_dram);
132810152Satgutier@umich.edu  power_comparator.readOp.dynamic += 0.5 * c2 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd * 4 * A;
132910152Satgutier@umich.edu  power_comparator.readOp.dynamic += c1 * g_tp.peri_global.Vdd * g_tp.peri_global.Vdd *  (A - 1);
133010152Satgutier@umich.edu  lkgCurrent += cmos_Isub_leakage(g_tp.w_eval_inv_n, g_tp.w_eval_inv_p, 1, inv, is_dram)* 4 * A;
133110152Satgutier@umich.edu  lkgCurrent += cmos_Isub_leakage(g_tp.w_comp_n, g_tp.w_comp_n, 1, inv, is_dram)* 4 * A;  // stack factor of 0.2
133210152Satgutier@umich.edu
133310152Satgutier@umich.edu  gatelkgCurrent += cmos_Ig_leakage(g_tp.w_eval_inv_n, g_tp.w_eval_inv_p, 1, inv, is_dram)* 4 * A;
133410152Satgutier@umich.edu  gatelkgCurrent += cmos_Ig_leakage(g_tp.w_comp_n, g_tp.w_comp_n, 1, inv, is_dram)* 4 * A;//for gate leakage this equals to a inverter
133510152Satgutier@umich.edu
133610152Satgutier@umich.edu  /* time to go to threshold of mux driver */
133710152Satgutier@umich.edu  double tstep = (r2*c2+(r1+r2)*c1)*log(1.0/VTHMUXNAND);
133810152Satgutier@umich.edu  /* take into account non-zero input rise time */
133910152Satgutier@umich.edu  double m = g_tp.peri_global.Vdd/nextinputtime;
134010152Satgutier@umich.edu  double Tcomparatorni;
134110152Satgutier@umich.edu
134210152Satgutier@umich.edu  if((tstep) <= (0.5*(g_tp.peri_global.Vdd-g_tp.peri_global.Vth)/m))
134310152Satgutier@umich.edu  {
134410152Satgutier@umich.edu    double a = m;
134510152Satgutier@umich.edu    double b = 2*((g_tp.peri_global.Vdd*VTHEVALINV)-g_tp.peri_global.Vth);
134610152Satgutier@umich.edu    double c = -2*(tstep)*(g_tp.peri_global.Vdd-g_tp.peri_global.Vth)+1/m*((g_tp.peri_global.Vdd*VTHEVALINV)-g_tp.peri_global.Vth)*((g_tp.peri_global.Vdd*VTHEVALINV)-g_tp.peri_global.Vth);
134710152Satgutier@umich.edu    Tcomparatorni = (-b+sqrt(b*b-4*a*c))/(2*a);
134810152Satgutier@umich.edu  }
134910152Satgutier@umich.edu  else
135010152Satgutier@umich.edu  {
135110152Satgutier@umich.edu    Tcomparatorni = (tstep) + (g_tp.peri_global.Vdd+g_tp.peri_global.Vth)/(2*m) - (g_tp.peri_global.Vdd*VTHEVALINV)/m;
135210152Satgutier@umich.edu  }
135310152Satgutier@umich.edu  delay_comparator = Tcomparatorni+st1del+st2del+st3del;
135410152Satgutier@umich.edu  power_comparator.readOp.leakage = lkgCurrent * g_tp.peri_global.Vdd;
135510152Satgutier@umich.edu  power_comparator.readOp.gate_leakage = gatelkgCurrent * g_tp.peri_global.Vdd;
135610152Satgutier@umich.edu
135710152Satgutier@umich.edu  return Tcomparatorni / (1.0 - VTHMUXNAND);;
135810152Satgutier@umich.edu}
135910152Satgutier@umich.edu
136010152Satgutier@umich.edu
136110152Satgutier@umich.edu
136210152Satgutier@umich.eduvoid Mat::compute_power_energy()
136310152Satgutier@umich.edu{
136410152Satgutier@umich.edu        //for cam and FA, power.readOp is the plain read power, power.searchOp is the associative search related power
136510152Satgutier@umich.edu    //when search all subarrays and all mats are fully active
136610152Satgutier@umich.edu        //when plain read/write only one subarray in a single mat is active.
136710152Satgutier@umich.edu
136810152Satgutier@umich.edu    // add energy consumed in predecoder drivers. This unit is shared by all subarrays in a mat.
136910152Satgutier@umich.edu  power.readOp.dynamic += r_predec->power.readOp.dynamic +
137010152Satgutier@umich.edu                          b_mux_predec->power.readOp.dynamic +
137110152Satgutier@umich.edu                          sa_mux_lev_1_predec->power.readOp.dynamic +
137210152Satgutier@umich.edu                          sa_mux_lev_2_predec->power.readOp.dynamic;
137310152Satgutier@umich.edu
137410152Satgutier@umich.edu  // add energy consumed in decoders
137510152Satgutier@umich.edu  power_row_decoders.readOp.dynamic        = row_dec->power.readOp.dynamic;
137610152Satgutier@umich.edu  if (!(is_fa||pure_cam))
137710152Satgutier@umich.edu    power_row_decoders.readOp.dynamic        *= num_subarrays_per_mat;
137810152Satgutier@umich.edu
137910152Satgutier@umich.edu  // add energy consumed in bitline prechagers, SAs, and bitlines
138010152Satgutier@umich.edu  if (!(is_fa||pure_cam))
138110152Satgutier@umich.edu  {
138210152Satgutier@umich.edu          // add energy consumed in bitline prechagers
138310152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.dynamic = bl_precharge_eq_drv->power.readOp.dynamic;
138410152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.dynamic *= num_subarrays_per_mat;
138510152Satgutier@umich.edu
138610152Satgutier@umich.edu          //Add sense amps energy
138710152Satgutier@umich.edu          num_sa_subarray = subarray.num_cols / deg_bl_muxing;
138810152Satgutier@umich.edu          power_sa.readOp.dynamic *= num_sa_subarray*num_subarrays_per_mat ;
138910152Satgutier@umich.edu
139010152Satgutier@umich.edu          // add energy consumed in bitlines
139110152Satgutier@umich.edu          //cout<<"bitline power"<<power_bitline.readOp.dynamic<<endl;
139210152Satgutier@umich.edu          power_bitline.readOp.dynamic *= num_subarrays_per_mat*subarray.num_cols;
139310152Satgutier@umich.edu          power_bitline.writeOp.dynamic *= num_subarrays_per_mat*subarray.num_cols;
139410152Satgutier@umich.edu          //cout<<"bitline power"<<power_bitline.readOp.dynamic<<"subarray"<<num_subarrays_per_mat<<"cols"<<subarray.num_cols<<endl;
139510152Satgutier@umich.edu          //Add subarray output energy
139610152Satgutier@umich.edu          power_subarray_out_drv.readOp.dynamic =
139710152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.dynamic + subarray_out_wire->power.readOp.dynamic) * num_do_b_mat;
139810152Satgutier@umich.edu
139910152Satgutier@umich.edu          power.readOp.dynamic += power_bl_precharge_eq_drv.readOp.dynamic +
140010152Satgutier@umich.edu                                  power_sa.readOp.dynamic +
140110152Satgutier@umich.edu                                  power_bitline.readOp.dynamic +
140210152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.dynamic;
140310152Satgutier@umich.edu
140410152Satgutier@umich.edu          power.readOp.dynamic += power_row_decoders.readOp.dynamic +
140510152Satgutier@umich.edu                                  bit_mux_dec->power.readOp.dynamic +
140610152Satgutier@umich.edu                                  sa_mux_lev_1_dec->power.readOp.dynamic +
140710152Satgutier@umich.edu                                  sa_mux_lev_2_dec->power.readOp.dynamic +
140810152Satgutier@umich.edu                                  power_comparator.readOp.dynamic;
140910152Satgutier@umich.edu  }
141010152Satgutier@umich.edu
141110152Satgutier@umich.edu  else if (is_fa)
141210152Satgutier@umich.edu  {
141310152Satgutier@umich.edu          //for plain read/write only one subarray in a mat is active
141410152Satgutier@umich.edu          // add energy consumed in bitline prechagers
141510152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.dynamic = bl_precharge_eq_drv->power.readOp.dynamic
141610152Satgutier@umich.edu                   + cam_bl_precharge_eq_drv->power.readOp.dynamic;
141710152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.dynamic = bl_precharge_eq_drv->power.readOp.dynamic;
141810152Satgutier@umich.edu
141910152Satgutier@umich.edu          //Add sense amps energy
142010152Satgutier@umich.edu          num_sa_subarray = (subarray.num_cols_fa_cam + subarray.num_cols_fa_ram)/ deg_bl_muxing;
142110152Satgutier@umich.edu          num_sa_subarray_search = subarray.num_cols_fa_ram/ deg_bl_muxing;
142210152Satgutier@umich.edu          power_sa.searchOp.dynamic = power_sa.readOp.dynamic*num_sa_subarray_search;
142310152Satgutier@umich.edu          power_sa.readOp.dynamic *= num_sa_subarray;
142410152Satgutier@umich.edu
142510152Satgutier@umich.edu
142610152Satgutier@umich.edu          // add energy consumed in bitlines
142710152Satgutier@umich.edu          power_bitline.searchOp.dynamic = power_bitline.readOp.dynamic;
142810152Satgutier@umich.edu          power_bitline.readOp.dynamic *= (subarray.num_cols_fa_cam+subarray.num_cols_fa_ram);
142910152Satgutier@umich.edu          power_bitline.writeOp.dynamic *= (subarray.num_cols_fa_cam+subarray.num_cols_fa_ram);
143010152Satgutier@umich.edu          power_bitline.searchOp.dynamic *= subarray.num_cols_fa_ram;
143110152Satgutier@umich.edu
143210152Satgutier@umich.edu          //Add subarray output energy
143310152Satgutier@umich.edu      power_subarray_out_drv.searchOp.dynamic =
143410152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.dynamic + subarray_out_wire->power.readOp.dynamic) * num_so_b_mat;
143510152Satgutier@umich.edu          power_subarray_out_drv.readOp.dynamic =
143610152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.dynamic + subarray_out_wire->power.readOp.dynamic) * num_do_b_mat;
143710152Satgutier@umich.edu
143810152Satgutier@umich.edu
143910152Satgutier@umich.edu          power.readOp.dynamic += power_bl_precharge_eq_drv.readOp.dynamic +
144010152Satgutier@umich.edu                                  power_sa.readOp.dynamic +
144110152Satgutier@umich.edu                                  power_bitline.readOp.dynamic +
144210152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.dynamic;
144310152Satgutier@umich.edu
144410152Satgutier@umich.edu          power.readOp.dynamic += power_row_decoders.readOp.dynamic +
144510152Satgutier@umich.edu                                  bit_mux_dec->power.readOp.dynamic +
144610152Satgutier@umich.edu                                  sa_mux_lev_1_dec->power.readOp.dynamic +
144710152Satgutier@umich.edu                                  sa_mux_lev_2_dec->power.readOp.dynamic +
144810152Satgutier@umich.edu                                  power_comparator.readOp.dynamic;
144910152Satgutier@umich.edu
145010152Satgutier@umich.edu          //add energy consumed inside cam
145110152Satgutier@umich.edu          power_matchline.searchOp.dynamic *= num_subarrays_per_mat;
145210152Satgutier@umich.edu          power_searchline_precharge = sl_precharge_eq_drv->power;
145310152Satgutier@umich.edu      power_searchline_precharge.searchOp.dynamic = power_searchline_precharge.readOp.dynamic * num_subarrays_per_mat;
145410152Satgutier@umich.edu      power_searchline = sl_data_drv->power;
145510152Satgutier@umich.edu      power_searchline.searchOp.dynamic = power_searchline.readOp.dynamic*subarray.num_cols_fa_cam* num_subarrays_per_mat;;
145610152Satgutier@umich.edu      power_matchline_precharge  = ml_precharge_drv->power;
145710152Satgutier@umich.edu      power_matchline_precharge.searchOp.dynamic = power_matchline_precharge.readOp.dynamic* num_subarrays_per_mat;
145810152Satgutier@umich.edu      power_ml_to_ram_wl_drv= ml_to_ram_wl_drv->power;
145910152Satgutier@umich.edu      power_ml_to_ram_wl_drv.searchOp.dynamic= ml_to_ram_wl_drv->power.readOp.dynamic;
146010152Satgutier@umich.edu
146110152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic = power_matchline.searchOp.dynamic;
146210152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_searchline_precharge.searchOp.dynamic;
146310152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_searchline.searchOp.dynamic;
146410152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_matchline_precharge.searchOp.dynamic;
146510152Satgutier@umich.edu
146610152Satgutier@umich.edu          power.searchOp.dynamic += power_cam_all_active.searchOp.dynamic;
146710152Satgutier@umich.edu          //power.searchOp.dynamic += ml_to_ram_wl_drv->power.readOp.dynamic;
146810152Satgutier@umich.edu
146910152Satgutier@umich.edu  }
147010152Satgutier@umich.edu  else
147110152Satgutier@umich.edu  {
147210152Satgutier@umich.edu          // add energy consumed in bitline prechagers
147310152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.dynamic = cam_bl_precharge_eq_drv->power.readOp.dynamic;
147410152Satgutier@umich.edu          //power_bl_precharge_eq_drv.readOp.dynamic *= num_subarrays_per_mat;
147510152Satgutier@umich.edu          //power_bl_precharge_eq_drv.searchOp.dynamic = cam_bl_precharge_eq_drv->power.readOp.dynamic;
147610152Satgutier@umich.edu          //power_bl_precharge_eq_drv.searchOp.dynamic *= num_subarrays_per_mat;
147710152Satgutier@umich.edu
147810152Satgutier@umich.edu          //Add sense amps energy
147910152Satgutier@umich.edu          num_sa_subarray = subarray.num_cols_fa_cam/ deg_bl_muxing;
148010152Satgutier@umich.edu          power_sa.readOp.dynamic *= num_sa_subarray;//*num_subarrays_per_mat;
148110152Satgutier@umich.edu          power_sa.searchOp.dynamic = 0;
148210152Satgutier@umich.edu
148310152Satgutier@umich.edu          power_bitline.readOp.dynamic *= subarray.num_cols_fa_cam;
148410152Satgutier@umich.edu          power_bitline.searchOp.dynamic = 0;
148510152Satgutier@umich.edu          power_bitline.writeOp.dynamic *= subarray.num_cols_fa_cam;
148610152Satgutier@umich.edu
148710152Satgutier@umich.edu          power_subarray_out_drv.searchOp.dynamic =
148810152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.dynamic + subarray_out_wire->power.readOp.dynamic) * num_so_b_mat;
148910152Satgutier@umich.edu          power_subarray_out_drv.readOp.dynamic =
149010152Satgutier@umich.edu                          (power_subarray_out_drv.readOp.dynamic + subarray_out_wire->power.readOp.dynamic) * num_do_b_mat;
149110152Satgutier@umich.edu
149210152Satgutier@umich.edu          power.readOp.dynamic += power_bl_precharge_eq_drv.readOp.dynamic +
149310152Satgutier@umich.edu                                  power_sa.readOp.dynamic +
149410152Satgutier@umich.edu                                  power_bitline.readOp.dynamic +
149510152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.dynamic;
149610152Satgutier@umich.edu
149710152Satgutier@umich.edu          power.readOp.dynamic += power_row_decoders.readOp.dynamic +
149810152Satgutier@umich.edu                                  bit_mux_dec->power.readOp.dynamic +
149910152Satgutier@umich.edu                                  sa_mux_lev_1_dec->power.readOp.dynamic +
150010152Satgutier@umich.edu                                  sa_mux_lev_2_dec->power.readOp.dynamic +
150110152Satgutier@umich.edu                                  power_comparator.readOp.dynamic;
150210152Satgutier@umich.edu
150310152Satgutier@umich.edu
150410152Satgutier@umich.edu          ////add energy consumed inside cam
150510152Satgutier@umich.edu          power_matchline.searchOp.dynamic *= num_subarrays_per_mat;
150610152Satgutier@umich.edu          power_searchline_precharge = sl_precharge_eq_drv->power;
150710152Satgutier@umich.edu      power_searchline_precharge.searchOp.dynamic = power_searchline_precharge.readOp.dynamic * num_subarrays_per_mat;
150810152Satgutier@umich.edu      power_searchline = sl_data_drv->power;
150910152Satgutier@umich.edu      power_searchline.searchOp.dynamic = power_searchline.readOp.dynamic*subarray.num_cols_fa_cam* num_subarrays_per_mat;;
151010152Satgutier@umich.edu      power_matchline_precharge  = ml_precharge_drv->power;
151110152Satgutier@umich.edu      power_matchline_precharge.searchOp.dynamic = power_matchline_precharge.readOp.dynamic* num_subarrays_per_mat;
151210152Satgutier@umich.edu      power_ml_to_ram_wl_drv= ml_to_ram_wl_drv->power;
151310152Satgutier@umich.edu      power_ml_to_ram_wl_drv.searchOp.dynamic= ml_to_ram_wl_drv->power.readOp.dynamic;
151410152Satgutier@umich.edu
151510152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic = power_matchline.searchOp.dynamic;
151610152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_searchline_precharge.searchOp.dynamic;
151710152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_searchline.searchOp.dynamic;
151810152Satgutier@umich.edu          power_cam_all_active.searchOp.dynamic +=power_matchline_precharge.searchOp.dynamic;
151910152Satgutier@umich.edu
152010152Satgutier@umich.edu          power.searchOp.dynamic += power_cam_all_active.searchOp.dynamic;
152110152Satgutier@umich.edu          //power.searchOp.dynamic += ml_to_ram_wl_drv->power.readOp.dynamic;
152210152Satgutier@umich.edu
152310152Satgutier@umich.edu  }
152410152Satgutier@umich.edu
152510152Satgutier@umich.edu
152610152Satgutier@umich.edu
152710152Satgutier@umich.edu  // calculate leakage power
152810152Satgutier@umich.edu  if (!(is_fa || pure_cam))
152910152Satgutier@umich.edu  {
153010152Satgutier@umich.edu        int number_output_drivers_subarray = num_sa_subarray / (dp.Ndsam_lev_1 * dp.Ndsam_lev_2);
153110152Satgutier@umich.edu
153210152Satgutier@umich.edu        power_bitline.readOp.leakage            *= subarray.num_rows * subarray.num_cols * num_subarrays_per_mat;
153310152Satgutier@umich.edu    power_bl_precharge_eq_drv.readOp.leakage = bl_precharge_eq_drv->power.readOp.leakage * num_subarrays_per_mat;
153410152Satgutier@umich.edu    power_sa.readOp.leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP);
153510152Satgutier@umich.edu
153610152Satgutier@umich.edu    //num_sa_subarray             = subarray.num_cols / deg_bl_muxing;
153710152Satgutier@umich.edu    power_subarray_out_drv.readOp.leakage =
153810152Satgutier@umich.edu      (power_subarray_out_drv.readOp.leakage + subarray_out_wire->power.readOp.leakage) *
153910152Satgutier@umich.edu      number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP);
154010152Satgutier@umich.edu
154110152Satgutier@umich.edu    power.readOp.leakage += power_bitline.readOp.leakage +
154210152Satgutier@umich.edu                            power_bl_precharge_eq_drv.readOp.leakage +
154310152Satgutier@umich.edu                            power_sa.readOp.leakage +
154410152Satgutier@umich.edu                            power_subarray_out_drv.readOp.leakage;
154510152Satgutier@umich.edu    //cout<<"leakage"<<power.readOp.leakage<<endl;
154610152Satgutier@umich.edu
154710152Satgutier@umich.edu    power_comparator.readOp.leakage *= num_do_b_mat * (RWP + ERP);
154810152Satgutier@umich.edu    power.readOp.leakage += power_comparator.readOp.leakage;
154910152Satgutier@umich.edu
155010152Satgutier@umich.edu    //cout<<"leakage1"<<power.readOp.leakage<<endl;
155110152Satgutier@umich.edu
155210152Satgutier@umich.edu    // leakage power
155310152Satgutier@umich.edu    power_row_decoders.readOp.leakage = row_dec->power.readOp.leakage * subarray.num_rows * num_subarrays_per_mat;
155410152Satgutier@umich.edu    power_bit_mux_decoders.readOp.leakage      = bit_mux_dec->power.readOp.leakage * deg_bl_muxing;
155510152Satgutier@umich.edu    power_sa_mux_lev_1_decoders.readOp.leakage = sa_mux_lev_1_dec->power.readOp.leakage * dp.Ndsam_lev_1;
155610152Satgutier@umich.edu    power_sa_mux_lev_2_decoders.readOp.leakage = sa_mux_lev_2_dec->power.readOp.leakage * dp.Ndsam_lev_2;
155710152Satgutier@umich.edu
155810152Satgutier@umich.edu    power.readOp.leakage += r_predec->power.readOp.leakage +
155910152Satgutier@umich.edu                          b_mux_predec->power.readOp.leakage +
156010152Satgutier@umich.edu                          sa_mux_lev_1_predec->power.readOp.leakage +
156110152Satgutier@umich.edu                          sa_mux_lev_2_predec->power.readOp.leakage +
156210152Satgutier@umich.edu                          power_row_decoders.readOp.leakage +
156310152Satgutier@umich.edu                          power_bit_mux_decoders.readOp.leakage +
156410152Satgutier@umich.edu                          power_sa_mux_lev_1_decoders.readOp.leakage +
156510152Satgutier@umich.edu                          power_sa_mux_lev_2_decoders.readOp.leakage;
156610152Satgutier@umich.edu    //cout<<"leakage2"<<power.readOp.leakage<<endl;
156710152Satgutier@umich.edu
156810152Satgutier@umich.edu    //++++Below is gate leakage
156910152Satgutier@umich.edu        power_bitline.readOp.gate_leakage            *= subarray.num_rows * subarray.num_cols * num_subarrays_per_mat;
157010152Satgutier@umich.edu    power_bl_precharge_eq_drv.readOp.gate_leakage = bl_precharge_eq_drv->power.readOp.gate_leakage * num_subarrays_per_mat;
157110152Satgutier@umich.edu    power_sa.readOp.gate_leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP);
157210152Satgutier@umich.edu
157310152Satgutier@umich.edu    //num_sa_subarray             = subarray.num_cols / deg_bl_muxing;
157410152Satgutier@umich.edu    power_subarray_out_drv.readOp.gate_leakage =
157510152Satgutier@umich.edu      (power_subarray_out_drv.readOp.gate_leakage + subarray_out_wire->power.readOp.gate_leakage) *
157610152Satgutier@umich.edu      number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP);
157710152Satgutier@umich.edu
157810152Satgutier@umich.edu    power.readOp.gate_leakage += power_bitline.readOp.gate_leakage +
157910152Satgutier@umich.edu                            power_bl_precharge_eq_drv.readOp.gate_leakage +
158010152Satgutier@umich.edu                            power_sa.readOp.gate_leakage +
158110152Satgutier@umich.edu                            power_subarray_out_drv.readOp.gate_leakage;
158210152Satgutier@umich.edu    //cout<<"leakage"<<power.readOp.leakage<<endl;
158310152Satgutier@umich.edu
158410152Satgutier@umich.edu    power_comparator.readOp.gate_leakage *= num_do_b_mat * (RWP + ERP);
158510152Satgutier@umich.edu    power.readOp.gate_leakage += power_comparator.readOp.gate_leakage;
158610152Satgutier@umich.edu
158710152Satgutier@umich.edu    //cout<<"leakage1"<<power.readOp.gate_leakage<<endl;
158810152Satgutier@umich.edu
158910152Satgutier@umich.edu    // gate_leakage power
159010152Satgutier@umich.edu    power_row_decoders.readOp.gate_leakage = row_dec->power.readOp.gate_leakage * subarray.num_rows * num_subarrays_per_mat;
159110152Satgutier@umich.edu    power_bit_mux_decoders.readOp.gate_leakage      = bit_mux_dec->power.readOp.gate_leakage * deg_bl_muxing;
159210152Satgutier@umich.edu    power_sa_mux_lev_1_decoders.readOp.gate_leakage = sa_mux_lev_1_dec->power.readOp.gate_leakage * dp.Ndsam_lev_1;
159310152Satgutier@umich.edu    power_sa_mux_lev_2_decoders.readOp.gate_leakage = sa_mux_lev_2_dec->power.readOp.gate_leakage * dp.Ndsam_lev_2;
159410152Satgutier@umich.edu
159510152Satgutier@umich.edu    power.readOp.gate_leakage += r_predec->power.readOp.gate_leakage +
159610152Satgutier@umich.edu                          b_mux_predec->power.readOp.gate_leakage +
159710152Satgutier@umich.edu                          sa_mux_lev_1_predec->power.readOp.gate_leakage +
159810152Satgutier@umich.edu                          sa_mux_lev_2_predec->power.readOp.gate_leakage +
159910152Satgutier@umich.edu                          power_row_decoders.readOp.gate_leakage +
160010152Satgutier@umich.edu                          power_bit_mux_decoders.readOp.gate_leakage +
160110152Satgutier@umich.edu                          power_sa_mux_lev_1_decoders.readOp.gate_leakage +
160210152Satgutier@umich.edu                          power_sa_mux_lev_2_decoders.readOp.gate_leakage;
160310152Satgutier@umich.edu  }
160410152Satgutier@umich.edu  else if (is_fa)
160510152Satgutier@umich.edu  {
160610152Satgutier@umich.edu          int number_output_drivers_subarray = num_sa_subarray;// / (dp.Ndsam_lev_1 * dp.Ndsam_lev_2);
160710152Satgutier@umich.edu
160810152Satgutier@umich.edu          power_bitline.readOp.leakage            *= subarray.num_rows * subarray.num_cols * num_subarrays_per_mat;
160910152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.leakage = bl_precharge_eq_drv->power.readOp.leakage * num_subarrays_per_mat;
161010152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.leakage = cam_bl_precharge_eq_drv->power.readOp.leakage * num_subarrays_per_mat;
161110152Satgutier@umich.edu          power_sa.readOp.leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP + SCHP);
161210152Satgutier@umich.edu
161310152Satgutier@umich.edu          //cout<<"leakage3"<<power.readOp.leakage<<endl;
161410152Satgutier@umich.edu
161510152Satgutier@umich.edu
161610152Satgutier@umich.edu          power_subarray_out_drv.readOp.leakage =
161710152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.leakage + subarray_out_wire->power.readOp.leakage) *
161810152Satgutier@umich.edu                  number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP + SCHP);
161910152Satgutier@umich.edu
162010152Satgutier@umich.edu          power.readOp.leakage += power_bitline.readOp.leakage +
162110152Satgutier@umich.edu                                  power_bl_precharge_eq_drv.readOp.leakage +
162210152Satgutier@umich.edu                                  power_bl_precharge_eq_drv.searchOp.leakage +
162310152Satgutier@umich.edu                                  power_sa.readOp.leakage +
162410152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.leakage;
162510152Satgutier@umich.edu
162610152Satgutier@umich.edu          //cout<<"leakage4"<<power.readOp.leakage<<endl;
162710152Satgutier@umich.edu
162810152Satgutier@umich.edu          // leakage power
162910152Satgutier@umich.edu          power_row_decoders.readOp.leakage = row_dec->power.readOp.leakage * subarray.num_rows * num_subarrays_per_mat;
163010152Satgutier@umich.edu          power.readOp.leakage += r_predec->power.readOp.leakage +
163110152Satgutier@umich.edu                                  power_row_decoders.readOp.leakage;
163210152Satgutier@umich.edu
163310152Satgutier@umich.edu          //cout<<"leakage5"<<power.readOp.leakage<<endl;
163410152Satgutier@umich.edu
163510152Satgutier@umich.edu          //inside cam
163610152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage = power_matchline.searchOp.leakage;
163710152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=sl_precharge_eq_drv->power.readOp.leakage;
163810152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=sl_data_drv->power.readOp.leakage*subarray.num_cols_fa_cam;
163910152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=ml_precharge_drv->power.readOp.dynamic;
164010152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage *= num_subarrays_per_mat;
164110152Satgutier@umich.edu
164210152Satgutier@umich.edu          power.readOp.leakage += power_cam_all_active.searchOp.leakage;
164310152Satgutier@umich.edu
164410152Satgutier@umich.edu//	  cout<<"leakage6"<<power.readOp.leakage<<endl;
164510152Satgutier@umich.edu
164610152Satgutier@umich.edu          //+++Below is gate leakage
164710152Satgutier@umich.edu          power_bitline.readOp.gate_leakage            *= subarray.num_rows * subarray.num_cols * num_subarrays_per_mat;
164810152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.gate_leakage = bl_precharge_eq_drv->power.readOp.gate_leakage * num_subarrays_per_mat;
164910152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.gate_leakage = cam_bl_precharge_eq_drv->power.readOp.gate_leakage * num_subarrays_per_mat;
165010152Satgutier@umich.edu          power_sa.readOp.gate_leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP + SCHP);
165110152Satgutier@umich.edu
165210152Satgutier@umich.edu          //cout<<"leakage3"<<power.readOp.gate_leakage<<endl;
165310152Satgutier@umich.edu
165410152Satgutier@umich.edu
165510152Satgutier@umich.edu          power_subarray_out_drv.readOp.gate_leakage =
165610152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.gate_leakage + subarray_out_wire->power.readOp.gate_leakage) *
165710152Satgutier@umich.edu                  number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP + SCHP);
165810152Satgutier@umich.edu
165910152Satgutier@umich.edu          power.readOp.gate_leakage += power_bitline.readOp.gate_leakage +
166010152Satgutier@umich.edu          power_bl_precharge_eq_drv.readOp.gate_leakage +
166110152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.gate_leakage +
166210152Satgutier@umich.edu          power_sa.readOp.gate_leakage +
166310152Satgutier@umich.edu          power_subarray_out_drv.readOp.gate_leakage;
166410152Satgutier@umich.edu
166510152Satgutier@umich.edu          //cout<<"leakage4"<<power.readOp.gate_leakage<<endl;
166610152Satgutier@umich.edu
166710152Satgutier@umich.edu          // gate_leakage power
166810152Satgutier@umich.edu          power_row_decoders.readOp.gate_leakage = row_dec->power.readOp.gate_leakage * subarray.num_rows * num_subarrays_per_mat;
166910152Satgutier@umich.edu          power.readOp.gate_leakage += r_predec->power.readOp.gate_leakage +
167010152Satgutier@umich.edu          power_row_decoders.readOp.gate_leakage;
167110152Satgutier@umich.edu
167210152Satgutier@umich.edu          //cout<<"leakage5"<<power.readOp.gate_leakage<<endl;
167310152Satgutier@umich.edu
167410152Satgutier@umich.edu          //inside cam
167510152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage = power_matchline.searchOp.gate_leakage;
167610152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=sl_precharge_eq_drv->power.readOp.gate_leakage;
167710152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=sl_data_drv->power.readOp.gate_leakage*subarray.num_cols_fa_cam;
167810152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=ml_precharge_drv->power.readOp.dynamic;
167910152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage *= num_subarrays_per_mat;
168010152Satgutier@umich.edu
168110152Satgutier@umich.edu          power.readOp.gate_leakage += power_cam_all_active.searchOp.gate_leakage;
168210152Satgutier@umich.edu
168310152Satgutier@umich.edu  }
168410152Satgutier@umich.edu  else
168510152Satgutier@umich.edu  {
168610152Satgutier@umich.edu          int number_output_drivers_subarray = num_sa_subarray;// / (dp.Ndsam_lev_1 * dp.Ndsam_lev_2);
168710152Satgutier@umich.edu
168810152Satgutier@umich.edu          //power_bitline.readOp.leakage            *= subarray.num_rows * subarray.num_cols * num_subarrays_per_mat;
168910152Satgutier@umich.edu          //power_bl_precharge_eq_drv.readOp.leakage = bl_precharge_eq_drv->power.readOp.leakage * num_subarrays_per_mat;
169010152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.leakage = cam_bl_precharge_eq_drv->power.readOp.leakage * num_subarrays_per_mat;
169110152Satgutier@umich.edu          power_sa.readOp.leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP + SCHP);
169210152Satgutier@umich.edu
169310152Satgutier@umich.edu
169410152Satgutier@umich.edu          power_subarray_out_drv.readOp.leakage =
169510152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.leakage + subarray_out_wire->power.readOp.leakage) *
169610152Satgutier@umich.edu                  number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP + SCHP);
169710152Satgutier@umich.edu
169810152Satgutier@umich.edu          power.readOp.leakage += //power_bitline.readOp.leakage +
169910152Satgutier@umich.edu                                  //power_bl_precharge_eq_drv.readOp.leakage +
170010152Satgutier@umich.edu                                  power_bl_precharge_eq_drv.searchOp.leakage +
170110152Satgutier@umich.edu                                  power_sa.readOp.leakage +
170210152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.leakage;
170310152Satgutier@umich.edu
170410152Satgutier@umich.edu          // leakage power
170510152Satgutier@umich.edu          power_row_decoders.readOp.leakage = row_dec->power.readOp.leakage * subarray.num_rows * num_subarrays_per_mat*(RWP + ERP + EWP);
170610152Satgutier@umich.edu          power.readOp.leakage += r_predec->power.readOp.leakage +
170710152Satgutier@umich.edu                                  power_row_decoders.readOp.leakage;
170810152Satgutier@umich.edu
170910152Satgutier@umich.edu          //inside cam
171010152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage = power_matchline.searchOp.leakage;
171110152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=sl_precharge_eq_drv->power.readOp.leakage;
171210152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=sl_data_drv->power.readOp.leakage*subarray.num_cols_fa_cam;
171310152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage +=ml_precharge_drv->power.readOp.dynamic;
171410152Satgutier@umich.edu          power_cam_all_active.searchOp.leakage *= num_subarrays_per_mat;
171510152Satgutier@umich.edu
171610152Satgutier@umich.edu          power.readOp.leakage += power_cam_all_active.searchOp.leakage;
171710152Satgutier@umich.edu
171810152Satgutier@umich.edu          //+++Below is gate leakage
171910152Satgutier@umich.edu          power_bl_precharge_eq_drv.searchOp.gate_leakage = cam_bl_precharge_eq_drv->power.readOp.gate_leakage * num_subarrays_per_mat;
172010152Satgutier@umich.edu          power_sa.readOp.gate_leakage                 *= num_sa_subarray*num_subarrays_per_mat*(RWP + ERP + SCHP);
172110152Satgutier@umich.edu
172210152Satgutier@umich.edu
172310152Satgutier@umich.edu          power_subarray_out_drv.readOp.gate_leakage =
172410152Satgutier@umich.edu                  (power_subarray_out_drv.readOp.gate_leakage + subarray_out_wire->power.readOp.gate_leakage) *
172510152Satgutier@umich.edu                  number_output_drivers_subarray * num_subarrays_per_mat * (RWP + ERP + SCHP);
172610152Satgutier@umich.edu
172710152Satgutier@umich.edu          power.readOp.gate_leakage += //power_bitline.readOp.gate_leakage +
172810152Satgutier@umich.edu                                  //power_bl_precharge_eq_drv.readOp.gate_leakage +
172910152Satgutier@umich.edu                                  power_bl_precharge_eq_drv.searchOp.gate_leakage +
173010152Satgutier@umich.edu                                  power_sa.readOp.gate_leakage +
173110152Satgutier@umich.edu                                  power_subarray_out_drv.readOp.gate_leakage;
173210152Satgutier@umich.edu
173310152Satgutier@umich.edu          // gate_leakage power
173410152Satgutier@umich.edu          power_row_decoders.readOp.gate_leakage = row_dec->power.readOp.gate_leakage * subarray.num_rows * num_subarrays_per_mat*(RWP + ERP + EWP);
173510152Satgutier@umich.edu          power.readOp.gate_leakage += r_predec->power.readOp.gate_leakage +
173610152Satgutier@umich.edu                                  power_row_decoders.readOp.gate_leakage;
173710152Satgutier@umich.edu
173810152Satgutier@umich.edu          //inside cam
173910152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage = power_matchline.searchOp.gate_leakage;
174010152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=sl_precharge_eq_drv->power.readOp.gate_leakage;
174110152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=sl_data_drv->power.readOp.gate_leakage*subarray.num_cols_fa_cam;
174210152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage +=ml_precharge_drv->power.readOp.dynamic;
174310152Satgutier@umich.edu          power_cam_all_active.searchOp.gate_leakage *= num_subarrays_per_mat;
174410152Satgutier@umich.edu
174510152Satgutier@umich.edu          power.readOp.gate_leakage += power_cam_all_active.searchOp.gate_leakage;
174610152Satgutier@umich.edu  }
174710152Satgutier@umich.edu}
174810152Satgutier@umich.edu
1749