bank.cc revision 10152
1/***************************************************************************** 2 * McPAT/CACTI 3 * SOFTWARE LICENSE AGREEMENT 4 * Copyright 2012 Hewlett-Packard Development Company, L.P. 5 * All Rights Reserved 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are 9 * met: redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer; 11 * redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution; 14 * neither the name of the copyright holders nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.” 29 * 30 ***************************************************************************/ 31 32 33 34#include <iostream> 35 36#include "bank.h" 37 38Bank::Bank(const DynamicParameter & dyn_p): 39 dp(dyn_p), mat(dp), 40 num_addr_b_mat(dyn_p.number_addr_bits_mat), 41 num_mats_hor_dir(dyn_p.num_mats_h_dir), num_mats_ver_dir(dyn_p.num_mats_v_dir) 42{ 43 int RWP; 44 int ERP; 45 int EWP; 46 int SCHP; 47 48 if (dp.use_inp_params) 49 { 50 RWP = dp.num_rw_ports; 51 ERP = dp.num_rd_ports; 52 EWP = dp.num_wr_ports; 53 SCHP = dp.num_search_ports; 54 } 55 else 56 { 57 RWP = g_ip->num_rw_ports; 58 ERP = g_ip->num_rd_ports; 59 EWP = g_ip->num_wr_ports; 60 SCHP = g_ip->num_search_ports; 61 } 62 63 int total_addrbits = (dp.number_addr_bits_mat + dp.number_subbanks_decode)*(RWP+ERP+EWP); 64 int datainbits = dp.num_di_b_bank_per_port * (RWP + EWP); 65 int dataoutbits = dp.num_do_b_bank_per_port * (RWP + ERP); 66 int searchinbits; 67 int searchoutbits; 68 69 if (dp.fully_assoc || dp.pure_cam) 70 { 71 datainbits = dp.num_di_b_bank_per_port * (RWP + EWP); 72 dataoutbits = dp.num_do_b_bank_per_port * (RWP + ERP); 73 searchinbits = dp.num_si_b_bank_per_port * SCHP; 74 searchoutbits = dp.num_so_b_bank_per_port * SCHP; 75 } 76 77 if (!(dp.fully_assoc || dp.pure_cam)) 78 { 79 if (g_ip->fast_access && dp.is_tag == false) 80 { 81 dataoutbits *= g_ip->data_assoc; 82 } 83 84 htree_in_add = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 85 total_addrbits, datainbits, 0,dataoutbits,0, num_mats_ver_dir*2, num_mats_hor_dir*2, Add_htree); 86 htree_in_data = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 87 total_addrbits, datainbits, 0,dataoutbits,0, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_in_htree); 88 htree_out_data = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 89 total_addrbits, datainbits, 0,dataoutbits,0, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_out_htree); 90 91// htree_out_data = new Htree2 (g_ip->wt,(double) 100, (double)100, 92// total_addrbits, datainbits, 0,dataoutbits,0, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_out_htree); 93 94 area.w = htree_in_data->area.w; 95 area.h = htree_in_data->area.h; 96 } 97 else 98 { 99 htree_in_add = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 100 total_addrbits, datainbits, searchinbits,dataoutbits,searchoutbits, num_mats_ver_dir*2, num_mats_hor_dir*2, Add_htree); 101 htree_in_data = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 102 total_addrbits, datainbits,searchinbits, dataoutbits, searchoutbits, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_in_htree); 103 htree_out_data = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 104 total_addrbits, datainbits,searchinbits, dataoutbits, searchoutbits,num_mats_ver_dir*2, num_mats_hor_dir*2, Data_out_htree); 105 htree_in_search = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 106 total_addrbits, datainbits,searchinbits, dataoutbits, searchoutbits, num_mats_ver_dir*2, num_mats_hor_dir*2, Data_in_htree,true, true); 107 htree_out_search = new Htree2 (g_ip->wt,(double) mat.area.w, (double)mat.area.h, 108 total_addrbits, datainbits,searchinbits, dataoutbits, searchoutbits,num_mats_ver_dir*2, num_mats_hor_dir*2, Data_out_htree,true); 109 110 area.w = htree_in_data->area.w; 111 area.h = htree_in_data->area.h; 112 } 113 114 num_addr_b_row_dec = _log2(mat.subarray.num_rows); 115 num_addr_b_routed_to_mat_for_act = num_addr_b_row_dec; 116 num_addr_b_routed_to_mat_for_rd_or_wr = num_addr_b_mat - num_addr_b_row_dec; 117} 118 119 120 121Bank::~Bank() 122{ 123 delete htree_in_add; 124 delete htree_out_data; 125 delete htree_in_data; 126 if (dp.fully_assoc || dp.pure_cam) 127 { 128 delete htree_in_search; 129 delete htree_out_search; 130 } 131} 132 133 134 135double Bank::compute_delays(double inrisetime) 136{ 137 return mat.compute_delays(inrisetime); 138} 139 140 141 142void Bank::compute_power_energy() 143{ 144 mat.compute_power_energy(); 145 146 if (!(dp.fully_assoc || dp.pure_cam)) 147 { 148 power.readOp.dynamic += mat.power.readOp.dynamic * dp.num_act_mats_hor_dir; 149 power.readOp.leakage += mat.power.readOp.leakage * dp.num_mats; 150 power.readOp.gate_leakage += mat.power.readOp.gate_leakage * dp.num_mats; 151 152 power.readOp.dynamic += htree_in_add->power.readOp.dynamic; 153 power.readOp.dynamic += htree_out_data->power.readOp.dynamic; 154 155 power.readOp.leakage += htree_in_add->power.readOp.leakage; 156 power.readOp.leakage += htree_in_data->power.readOp.leakage; 157 power.readOp.leakage += htree_out_data->power.readOp.leakage; 158 power.readOp.gate_leakage += htree_in_add->power.readOp.gate_leakage; 159 power.readOp.gate_leakage += htree_in_data->power.readOp.gate_leakage; 160 power.readOp.gate_leakage += htree_out_data->power.readOp.gate_leakage; 161 } 162 else 163 { 164 165 power.readOp.dynamic += mat.power.readOp.dynamic ;//for fa and cam num_act_mats_hor_dir is 1 for plain r/w 166 power.readOp.leakage += mat.power.readOp.leakage * dp.num_mats; 167 power.readOp.gate_leakage += mat.power.readOp.gate_leakage * dp.num_mats; 168 169 power.searchOp.dynamic += mat.power.searchOp.dynamic * dp.num_mats; 170 power.searchOp.dynamic += mat.power_bl_precharge_eq_drv.searchOp.dynamic + 171 mat.power_sa.searchOp.dynamic + 172 mat.power_bitline.searchOp.dynamic + 173 mat.power_subarray_out_drv.searchOp.dynamic+ 174 mat.ml_to_ram_wl_drv->power.readOp.dynamic; 175 176 power.readOp.dynamic += htree_in_add->power.readOp.dynamic; 177 power.readOp.dynamic += htree_out_data->power.readOp.dynamic; 178 179 power.searchOp.dynamic += htree_in_search->power.searchOp.dynamic; 180 power.searchOp.dynamic += htree_out_search->power.searchOp.dynamic; 181 182 power.readOp.leakage += htree_in_add->power.readOp.leakage; 183 power.readOp.leakage += htree_in_data->power.readOp.leakage; 184 power.readOp.leakage += htree_out_data->power.readOp.leakage; 185 power.readOp.leakage += htree_in_search->power.readOp.leakage; 186 power.readOp.leakage += htree_out_search->power.readOp.leakage; 187 188 189 power.readOp.gate_leakage += htree_in_add->power.readOp.gate_leakage; 190 power.readOp.gate_leakage += htree_in_data->power.readOp.gate_leakage; 191 power.readOp.gate_leakage += htree_out_data->power.readOp.gate_leakage; 192 power.readOp.gate_leakage += htree_in_search->power.readOp.gate_leakage; 193 power.readOp.gate_leakage += htree_out_search->power.readOp.gate_leakage; 194 195 } 196 197} 198 199