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