bank.cc revision 10152:52c552138ba1
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