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