bank.cc revision 10234
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. 510234Syasuko.eckert@amd.com * Copyright (c) 2010-2013 Advanced Micro Devices, Inc. 610152Satgutier@umich.edu * All Rights Reserved 710152Satgutier@umich.edu * 810152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 910152Satgutier@umich.edu * modification, are permitted provided that the following conditions are 1010152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 1110152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 1210152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 1310152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 1410152Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 1510152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 1610152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 1710152Satgutier@umich.edu * this software without specific prior written permission. 1810152Satgutier@umich.edu 1910152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2010152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2110152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2210152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2310152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2410152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2510152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2610152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2710152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2810152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2910234Syasuko.eckert@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3010152Satgutier@umich.edu * 3110152Satgutier@umich.edu ***************************************************************************/ 3210152Satgutier@umich.edu 3310152Satgutier@umich.edu 3410152Satgutier@umich.edu 3510152Satgutier@umich.edu#include <iostream> 3610152Satgutier@umich.edu 3710152Satgutier@umich.edu#include "bank.h" 3810152Satgutier@umich.edu 3910152Satgutier@umich.eduBank::Bank(const DynamicParameter & dyn_p): 4010234Syasuko.eckert@amd.com dp(dyn_p), mat(dp), 4110234Syasuko.eckert@amd.com num_addr_b_mat(dyn_p.number_addr_bits_mat), 4210234Syasuko.eckert@amd.com num_mats_hor_dir(dyn_p.num_mats_h_dir), 4310234Syasuko.eckert@amd.com num_mats_ver_dir(dyn_p.num_mats_v_dir) { 4410234Syasuko.eckert@amd.com int RWP; 4510234Syasuko.eckert@amd.com int ERP; 4610234Syasuko.eckert@amd.com int EWP; 4710234Syasuko.eckert@amd.com int SCHP; 4810152Satgutier@umich.edu 4910234Syasuko.eckert@amd.com if (dp.use_inp_params) { 5010234Syasuko.eckert@amd.com RWP = dp.num_rw_ports; 5110234Syasuko.eckert@amd.com ERP = dp.num_rd_ports; 5210234Syasuko.eckert@amd.com EWP = dp.num_wr_ports; 5310234Syasuko.eckert@amd.com SCHP = dp.num_search_ports; 5410234Syasuko.eckert@amd.com } else { 5510234Syasuko.eckert@amd.com RWP = g_ip->num_rw_ports; 5610234Syasuko.eckert@amd.com ERP = g_ip->num_rd_ports; 5710234Syasuko.eckert@amd.com EWP = g_ip->num_wr_ports; 5810234Syasuko.eckert@amd.com SCHP = g_ip->num_search_ports; 5910152Satgutier@umich.edu } 6010152Satgutier@umich.edu 6110234Syasuko.eckert@amd.com int total_addrbits = (dp.number_addr_bits_mat + 6210234Syasuko.eckert@amd.com dp.number_subbanks_decode) * (RWP + ERP + EWP); 6310234Syasuko.eckert@amd.com int datainbits = dp.num_di_b_bank_per_port * (RWP + EWP); 6410234Syasuko.eckert@amd.com int dataoutbits = dp.num_do_b_bank_per_port * (RWP + ERP); 6510234Syasuko.eckert@amd.com int searchinbits; 6610234Syasuko.eckert@amd.com int searchoutbits; 6710234Syasuko.eckert@amd.com 6810234Syasuko.eckert@amd.com if (dp.fully_assoc || dp.pure_cam) { 6910234Syasuko.eckert@amd.com datainbits = dp.num_di_b_bank_per_port * (RWP + EWP); 7010234Syasuko.eckert@amd.com dataoutbits = dp.num_do_b_bank_per_port * (RWP + ERP); 7110234Syasuko.eckert@amd.com searchinbits = dp.num_si_b_bank_per_port * SCHP; 7210234Syasuko.eckert@amd.com searchoutbits = dp.num_so_b_bank_per_port * SCHP; 7310234Syasuko.eckert@amd.com } 7410234Syasuko.eckert@amd.com 7510234Syasuko.eckert@amd.com if (!(dp.fully_assoc || dp.pure_cam)) { 7610234Syasuko.eckert@amd.com if (g_ip->fast_access && dp.is_tag == false) { 7710234Syasuko.eckert@amd.com dataoutbits *= g_ip->data_assoc; 7810234Syasuko.eckert@amd.com } 7910234Syasuko.eckert@amd.com 8010234Syasuko.eckert@amd.com htree_in_add = new Htree2(g_ip->wt, (double) mat.area.w, 8110234Syasuko.eckert@amd.com (double)mat.area.h, 8210234Syasuko.eckert@amd.com total_addrbits, datainbits, 0, dataoutbits, 8310234Syasuko.eckert@amd.com 0, num_mats_ver_dir * 2, num_mats_hor_dir * 2, 8410234Syasuko.eckert@amd.com Add_htree); 8510234Syasuko.eckert@amd.com htree_in_data = new Htree2(g_ip->wt, (double) mat.area.w, 8610234Syasuko.eckert@amd.com (double)mat.area.h, 8710234Syasuko.eckert@amd.com total_addrbits, datainbits, 0, dataoutbits, 8810234Syasuko.eckert@amd.com 0, num_mats_ver_dir * 2, num_mats_hor_dir * 2, 8910234Syasuko.eckert@amd.com Data_in_htree); 9010234Syasuko.eckert@amd.com htree_out_data = new Htree2(g_ip->wt, (double) mat.area.w, 9110234Syasuko.eckert@amd.com (double)mat.area.h, 9210234Syasuko.eckert@amd.com total_addrbits, datainbits, 0, dataoutbits, 9310234Syasuko.eckert@amd.com 0, num_mats_ver_dir * 2, 9410234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Data_out_htree); 9510152Satgutier@umich.edu 9610152Satgutier@umich.edu// htree_out_data = new Htree2 (g_ip->wt,(double) 100, (double)100, 9710234Syasuko.eckert@amd.com// total_addrbits, datainbits, 0,dataoutbits,0, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_out_htree); 9810152Satgutier@umich.edu 9910234Syasuko.eckert@amd.com area.w = htree_in_data->area.w; 10010234Syasuko.eckert@amd.com area.h = htree_in_data->area.h; 10110234Syasuko.eckert@amd.com } else { 10210234Syasuko.eckert@amd.com htree_in_add = 10310234Syasuko.eckert@amd.com new Htree2(g_ip->wt, (double) mat.area.w, (double)mat.area.h, 10410234Syasuko.eckert@amd.com total_addrbits, datainbits, searchinbits, dataoutbits, 10510234Syasuko.eckert@amd.com searchoutbits, num_mats_ver_dir * 2, 10610234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Add_htree); 10710234Syasuko.eckert@amd.com htree_in_data = 10810234Syasuko.eckert@amd.com new Htree2(g_ip->wt, (double) mat.area.w, (double)mat.area.h, 10910234Syasuko.eckert@amd.com total_addrbits, datainbits, searchinbits, dataoutbits, 11010234Syasuko.eckert@amd.com searchoutbits, num_mats_ver_dir * 2, 11110234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Data_in_htree); 11210234Syasuko.eckert@amd.com htree_out_data = 11310234Syasuko.eckert@amd.com new Htree2(g_ip->wt, (double) mat.area.w, (double)mat.area.h, 11410234Syasuko.eckert@amd.com total_addrbits, datainbits, searchinbits, dataoutbits, 11510234Syasuko.eckert@amd.com searchoutbits, num_mats_ver_dir * 2, 11610234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Data_out_htree); 11710234Syasuko.eckert@amd.com htree_in_search = 11810234Syasuko.eckert@amd.com new Htree2(g_ip->wt, (double) mat.area.w, (double)mat.area.h, 11910234Syasuko.eckert@amd.com total_addrbits, datainbits, searchinbits, dataoutbits, 12010234Syasuko.eckert@amd.com searchoutbits, num_mats_ver_dir * 2, 12110234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Data_in_htree, true, true); 12210234Syasuko.eckert@amd.com htree_out_search = 12310234Syasuko.eckert@amd.com new Htree2 (g_ip->wt, (double) mat.area.w, (double)mat.area.h, 12410234Syasuko.eckert@amd.com total_addrbits, datainbits, searchinbits, dataoutbits, 12510234Syasuko.eckert@amd.com searchoutbits, num_mats_ver_dir * 2, 12610234Syasuko.eckert@amd.com num_mats_hor_dir * 2, Data_out_htree, true); 12710152Satgutier@umich.edu 12810234Syasuko.eckert@amd.com area.w = htree_in_data->area.w; 12910234Syasuko.eckert@amd.com area.h = htree_in_data->area.h; 13010234Syasuko.eckert@amd.com } 13110152Satgutier@umich.edu 13210234Syasuko.eckert@amd.com num_addr_b_row_dec = _log2(mat.subarray.num_rows); 13310234Syasuko.eckert@amd.com num_addr_b_routed_to_mat_for_act = num_addr_b_row_dec; 13410234Syasuko.eckert@amd.com num_addr_b_routed_to_mat_for_rd_or_wr = 13510234Syasuko.eckert@amd.com num_addr_b_mat - num_addr_b_row_dec; 13610152Satgutier@umich.edu} 13710152Satgutier@umich.edu 13810152Satgutier@umich.edu 13910152Satgutier@umich.edu 14010234Syasuko.eckert@amd.comBank::~Bank() { 14110234Syasuko.eckert@amd.com delete htree_in_add; 14210234Syasuko.eckert@amd.com delete htree_out_data; 14310234Syasuko.eckert@amd.com delete htree_in_data; 14410234Syasuko.eckert@amd.com if (dp.fully_assoc || dp.pure_cam) { 14510234Syasuko.eckert@amd.com delete htree_in_search; 14610234Syasuko.eckert@amd.com delete htree_out_search; 14710234Syasuko.eckert@amd.com } 14810152Satgutier@umich.edu} 14910152Satgutier@umich.edu 15010152Satgutier@umich.edu 15110152Satgutier@umich.edu 15210234Syasuko.eckert@amd.comdouble Bank::compute_delays(double inrisetime) { 15310234Syasuko.eckert@amd.com return mat.compute_delays(inrisetime); 15410152Satgutier@umich.edu} 15510152Satgutier@umich.edu 15610152Satgutier@umich.edu 15710152Satgutier@umich.edu 15810234Syasuko.eckert@amd.comvoid Bank::compute_power_energy() { 15910234Syasuko.eckert@amd.com mat.compute_power_energy(); 16010152Satgutier@umich.edu 16110234Syasuko.eckert@amd.com if (!(dp.fully_assoc || dp.pure_cam)) { 16210234Syasuko.eckert@amd.com power.readOp.dynamic += mat.power.readOp.dynamic * dp.num_act_mats_hor_dir; 16310234Syasuko.eckert@amd.com power.readOp.leakage += mat.power.readOp.leakage * dp.num_mats; 16410234Syasuko.eckert@amd.com power.readOp.gate_leakage += mat.power.readOp.gate_leakage * dp.num_mats; 16510152Satgutier@umich.edu 16610234Syasuko.eckert@amd.com power.readOp.dynamic += htree_in_add->power.readOp.dynamic; 16710234Syasuko.eckert@amd.com power.readOp.dynamic += htree_out_data->power.readOp.dynamic; 16810152Satgutier@umich.edu 16910234Syasuko.eckert@amd.com power.readOp.leakage += htree_in_add->power.readOp.leakage; 17010234Syasuko.eckert@amd.com power.readOp.leakage += htree_in_data->power.readOp.leakage; 17110234Syasuko.eckert@amd.com power.readOp.leakage += htree_out_data->power.readOp.leakage; 17210234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_in_add->power.readOp.gate_leakage; 17310234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_in_data->power.readOp.gate_leakage; 17410234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_out_data->power.readOp.gate_leakage; 17510234Syasuko.eckert@amd.com } else { 17610152Satgutier@umich.edu 17710234Syasuko.eckert@amd.com power.readOp.dynamic += mat.power.readOp.dynamic ;//for fa and cam num_act_mats_hor_dir is 1 for plain r/w 17810234Syasuko.eckert@amd.com power.readOp.leakage += mat.power.readOp.leakage * dp.num_mats; 17910234Syasuko.eckert@amd.com power.readOp.gate_leakage += mat.power.readOp.gate_leakage * dp.num_mats; 18010152Satgutier@umich.edu 18110234Syasuko.eckert@amd.com power.searchOp.dynamic += mat.power.searchOp.dynamic * dp.num_mats; 18210234Syasuko.eckert@amd.com power.searchOp.dynamic += mat.power_bl_precharge_eq_drv.searchOp.dynamic + 18310234Syasuko.eckert@amd.com mat.power_sa.searchOp.dynamic + 18410234Syasuko.eckert@amd.com mat.power_bitline.searchOp.dynamic + 18510234Syasuko.eckert@amd.com mat.power_subarray_out_drv.searchOp.dynamic + 18610234Syasuko.eckert@amd.com mat.ml_to_ram_wl_drv->power.readOp.dynamic; 18710152Satgutier@umich.edu 18810234Syasuko.eckert@amd.com power.readOp.dynamic += htree_in_add->power.readOp.dynamic; 18910234Syasuko.eckert@amd.com power.readOp.dynamic += htree_out_data->power.readOp.dynamic; 19010152Satgutier@umich.edu 19110234Syasuko.eckert@amd.com power.searchOp.dynamic += htree_in_search->power.searchOp.dynamic; 19210234Syasuko.eckert@amd.com power.searchOp.dynamic += htree_out_search->power.searchOp.dynamic; 19310152Satgutier@umich.edu 19410234Syasuko.eckert@amd.com power.readOp.leakage += htree_in_add->power.readOp.leakage; 19510234Syasuko.eckert@amd.com power.readOp.leakage += htree_in_data->power.readOp.leakage; 19610234Syasuko.eckert@amd.com power.readOp.leakage += htree_out_data->power.readOp.leakage; 19710234Syasuko.eckert@amd.com power.readOp.leakage += htree_in_search->power.readOp.leakage; 19810234Syasuko.eckert@amd.com power.readOp.leakage += htree_out_search->power.readOp.leakage; 19910152Satgutier@umich.edu 20010152Satgutier@umich.edu 20110234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_in_add->power.readOp.gate_leakage; 20210234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_in_data->power.readOp.gate_leakage; 20310234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_out_data->power.readOp.gate_leakage; 20410234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_in_search->power.readOp.gate_leakage; 20510234Syasuko.eckert@amd.com power.readOp.gate_leakage += htree_out_search->power.readOp.gate_leakage; 20610152Satgutier@umich.edu 20710234Syasuko.eckert@amd.com } 20810152Satgutier@umich.edu 20910152Satgutier@umich.edu} 21010152Satgutier@umich.edu 211