2014-04-01 18:44:30 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* McPAT/CACTI
|
|
|
|
* SOFTWARE LICENSE AGREEMENT
|
|
|
|
* Copyright 2012 Hewlett-Packard Development Company, L.P.
|
2014-06-03 22:32:59 +02:00
|
|
|
* Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
|
2014-04-01 18:44:30 +02:00
|
|
|
* All Rights Reserved
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met: redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer;
|
|
|
|
* redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution;
|
|
|
|
* neither the name of the copyright holders nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
2014-06-03 22:32:59 +02:00
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2014-04-01 18:44:30 +02:00
|
|
|
*
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "arbiter.h"
|
|
|
|
|
|
|
|
Arbiter::Arbiter(
|
|
|
|
double n_req,
|
|
|
|
double flit_size_,
|
|
|
|
double output_len,
|
|
|
|
TechnologyParameter::DeviceType *dt
|
2014-06-03 22:32:59 +02:00
|
|
|
): R(n_req), flit_size(flit_size_),
|
|
|
|
o_len (output_len), deviceType(dt) {
|
|
|
|
min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio * g_tp.min_w_nmos_;
|
|
|
|
Vdd = dt->Vdd;
|
|
|
|
double technology = g_ip->F_sz_um;
|
|
|
|
NTn1 = 13.5 * technology / 2;
|
|
|
|
PTn1 = 76 * technology / 2;
|
|
|
|
NTn2 = 13.5 * technology / 2;
|
|
|
|
PTn2 = 76 * technology / 2;
|
|
|
|
NTi = 12.5 * technology / 2;
|
|
|
|
PTi = 25 * technology / 2;
|
|
|
|
NTtr = 10 * technology / 2; /*Transmission gate's nmos tr. length*/
|
|
|
|
PTtr = 20 * technology / 2; /* pmos tr. length*/
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
2014-06-03 22:32:59 +02:00
|
|
|
Arbiter::~Arbiter() {}
|
2014-04-01 18:44:30 +02:00
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::arb_req() {
|
2014-06-03 22:32:59 +02:00
|
|
|
double temp = ((R - 1) * (2 * gate_C(NTn1, 0) + gate_C(PTn1, 0)) + 2 *
|
|
|
|
gate_C(NTn2, 0) +
|
|
|
|
gate_C(PTn2, 0) + gate_C(NTi, 0) + gate_C(PTi, 0) +
|
|
|
|
drain_C_(NTi, 0, 1, 1, g_tp.cell_h_def) +
|
|
|
|
drain_C_(PTi, 1, 1, 1, g_tp.cell_h_def));
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::arb_pri() {
|
2014-06-03 22:32:59 +02:00
|
|
|
/* switching capacitance of flip-flop is ignored */
|
|
|
|
double temp = 2 * (2 * gate_C(NTn1, 0) + gate_C(PTn1, 0));
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::arb_grant() {
|
2014-06-03 22:32:59 +02:00
|
|
|
double temp = drain_C_(NTn1, 0, 1, 1, g_tp.cell_h_def) * 2 +
|
|
|
|
drain_C_(PTn1, 1, 1, 1, g_tp.cell_h_def) + crossbar_ctrline();
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::arb_int() {
|
2014-06-03 22:32:59 +02:00
|
|
|
double temp = (drain_C_(NTn1, 0, 1, 1, g_tp.cell_h_def) * 2 +
|
|
|
|
drain_C_(PTn1, 1, 1, 1, g_tp.cell_h_def) +
|
|
|
|
2 * gate_C(NTn2, 0) + gate_C(PTn2, 0));
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Arbiter::compute_power() {
|
2014-06-03 22:32:59 +02:00
|
|
|
power.readOp.dynamic = (R * arb_req() * Vdd * Vdd / 2 + R * arb_pri() *
|
|
|
|
Vdd * Vdd / 2 +
|
|
|
|
arb_grant() * Vdd * Vdd + arb_int() * 0.5 * Vdd *
|
|
|
|
Vdd);
|
|
|
|
double nor1_leak = cmos_Isub_leakage(g_tp.min_w_nmos_ * NTn1 * 2,
|
|
|
|
min_w_pmos * PTn1 * 2, 2, nor);
|
|
|
|
double nor2_leak = cmos_Isub_leakage(g_tp.min_w_nmos_ * NTn2 * R,
|
|
|
|
min_w_pmos * PTn2 * R, 2, nor);
|
|
|
|
double not_leak = cmos_Isub_leakage(g_tp.min_w_nmos_ * NTi,
|
|
|
|
min_w_pmos * PTi, 1, inv);
|
|
|
|
double nor1_leak_gate = cmos_Ig_leakage(g_tp.min_w_nmos_ * NTn1 * 2,
|
|
|
|
min_w_pmos * PTn1 * 2, 2, nor);
|
|
|
|
double nor2_leak_gate = cmos_Ig_leakage(g_tp.min_w_nmos_ * NTn2 * R,
|
|
|
|
min_w_pmos * PTn2 * R, 2, nor);
|
|
|
|
double not_leak_gate = cmos_Ig_leakage(g_tp.min_w_nmos_ * NTi,
|
|
|
|
min_w_pmos * PTi, 1, inv);
|
|
|
|
//FIXME include priority table leakage
|
|
|
|
power.readOp.leakage = (nor1_leak + nor2_leak + not_leak) * Vdd;
|
|
|
|
power.readOp.gate_leakage = nor1_leak_gate * Vdd + nor2_leak_gate * Vdd +
|
|
|
|
not_leak_gate * Vdd;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double //wire cap with triple spacing
|
|
|
|
Arbiter::Cw3(double length) {
|
2014-06-03 22:32:59 +02:00
|
|
|
Wire wc(g_ip->wt, length, 1, 3, 3);
|
|
|
|
double temp = (wc.wire_cap(length, true));
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::crossbar_ctrline() {
|
2014-06-03 22:32:59 +02:00
|
|
|
double temp = (Cw3(o_len * 1e-6 /* m */) +
|
|
|
|
drain_C_(NTi, 0, 1, 1, g_tp.cell_h_def) + drain_C_(PTi, 1, 1, 1, g_tp.cell_h_def) +
|
|
|
|
gate_C(NTi, 0) + gate_C(PTi, 0));
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
Arbiter::transmission_buf_ctrcap() {
|
2014-06-03 22:32:59 +02:00
|
|
|
double temp = gate_C(NTtr, 0) + gate_C(PTtr, 0);
|
|
|
|
return temp;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-06-03 22:32:59 +02:00
|
|
|
void Arbiter::print_arbiter() {
|
|
|
|
cout << "\nArbiter Stats (" << R << " input arbiter" << ")\n\n";
|
|
|
|
cout << "Flit size : " << flit_size << " bits" << endl;
|
|
|
|
cout << "Dynamic Power : " << power.readOp.dynamic*1e9 << " (nJ)" << endl;
|
|
|
|
cout << "Leakage Power : " << power.readOp.leakage*1e3 << " (mW)" << endl;
|
2014-04-01 18:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|