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