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