summaryrefslogtreecommitdiff
path: root/src/gpuwattch/iocontrollers.cc
diff options
context:
space:
mode:
authorVijayKandiah <[email protected]>2021-10-17 02:18:10 -0500
committerVijayKandiah <[email protected]>2021-10-17 02:18:10 -0500
commit84c6cf45131e42b1a724ebf7977987a9ddb70db9 (patch)
treee82f15238e79a03f3cc2435d4f9bb48d5023e8ae /src/gpuwattch/iocontrollers.cc
parent4a4fc87a2dcd95bfe298f2b3d18a9833a506e499 (diff)
AccelWattch dev Integration
Diffstat (limited to 'src/gpuwattch/iocontrollers.cc')
-rw-r--r--src/gpuwattch/iocontrollers.cc503
1 files changed, 0 insertions, 503 deletions
diff --git a/src/gpuwattch/iocontrollers.cc b/src/gpuwattch/iocontrollers.cc
deleted file mode 100644
index f5e2502..0000000
--- a/src/gpuwattch/iocontrollers.cc
+++ /dev/null
@@ -1,503 +0,0 @@
-/*****************************************************************************
- * McPAT
- * SOFTWARE LICENSE AGREEMENT
- * Copyright 2012 Hewlett-Packard Development Company, L.P.
- * 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
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.”
- *
- ***************************************************************************/
-#include "iocontrollers.h"
-#include <assert.h>
-#include <algorithm>
-#include <cmath>
-#include <iostream>
-#include <string>
-#include "XML_Parse.h"
-#include "basic_components.h"
-#include "cacti/basic_circuit.h"
-#include "const.h"
-#include "io.h"
-#include "logic.h"
-#include "parameter.h"
-
-/*
-SUN Niagara 2 I/O power analysis:
-total signal bits: 711
-Total FBDIMM bits: (14+10)*2*8= 384
-PCIe bits: (8 + 8)*2 = 32
-10Gb NIC: (4*2+4*2)*2 = 32
-Debug I/Os: 168
-Other I/Os: 711- 32-32 - 384 - 168 = 95
-
-According to "Implementation of an 8-Core, 64-Thread, Power-Efficient SPARC
-Server on a Chip" 90% of I/Os are SerDers (the calucaltion is
-384+64/(711-168)=83% about the same as the 90% reported in the paper)
---> around 80Pins are common I/Os.
-Common I/Os consumes 71mW/Gb/s according to Cadence ChipEstimate @65nm
-Niagara 2 I/O clock is 1/4 of core clock. --> 87pin (<--((711-168)*17%)) *
-71mW/Gb/s *0.25*1.4Ghz = 2.17W
-
-Total dynamic power of FBDIMM, NIC, PCIe = 84*0.132 + 84*0.049*0.132 = 11.14
-- 2.17 = 8.98 Further, if assuming I/O logic power is about 50% of I/Os then
-Total energy of FBDIMM, NIC, PCIe = 11.14 - 2.17*1.5 = 7.89
- */
-
-/*
- * A bug in Cadence ChipEstimator: After update the clock rate in the clock tab,
- * a user need to re-select the IP clock (the same clk) and then click Estimate.
- * if not reselect the new clock rate may not be propogate into the IPs.
- *
- */
-
-NIUController::NIUController(ParseXML* XML_interface,
- InputParameter* interface_ip_)
- : XML(XML_interface), interface_ip(*interface_ip_) {
- local_result = init_interface(&interface_ip);
-
- double frontend_area, mac_area, SerDer_area;
- double frontend_dyn, mac_dyn, SerDer_dyn;
- double frontend_gates, mac_gates;
- double pmos_to_nmos_sizing_r = pmos_to_nmos_sz_ratio();
- double NMOS_sizing, PMOS_sizing;
-
- set_niu_param();
-
- if (niup.type == 0) // high performance NIU
- {
- // Area estimation based on average of die photo from Niagara 2 and Cadence
- // ChipEstimate using 65nm.
- mac_area = (1.53 + 0.3) / 2 * (interface_ip.F_sz_um / 0.065) *
- (interface_ip.F_sz_um / 0.065);
- // Area estimation based on average of die photo from Niagara 2, ISSCC "An
- // 800mW 10Gb Ethernet Transceiver in 0.13μm CMOS" and"A 1.2-V-Only 900-mW
- // 10 Gb Ethernet Transceiver and XAUI Interface With Robust VCO Tuning
- // Technique" Frontend is PCS
- frontend_area = (9.8 + (6 + 18) * 65 / 130 * 65 / 130) / 3 *
- (interface_ip.F_sz_um / 0.065) *
- (interface_ip.F_sz_um / 0.065);
- // Area estimation based on average of die photo from Niagara 2 and Cadence
- // ChipEstimate hard IP @65nm. SerDer is very hard to scale
- SerDer_area = (1.39 + 0.36) * (interface_ip.F_sz_um /
- 0.065); //* (interface_ip.F_sz_um/0.065);
- // total area
- area.set_area((mac_area + frontend_area + SerDer_area) * 1e6);
- // Power
- // Cadence ChipEstimate using 65nm (mac, front_end are all energy. E=P*T =
- // P/F = 1.37/1Ghz = 1.37e-9);
- mac_dyn = 2.19e-9 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 *
- (interface_ip.F_sz_nm /
- 65.0); // niup.clockRate; //2.19W@1GHz fully active according to
- // Cadence ChipEstimate @65nm
- // Cadence ChipEstimate using 65nm soft IP;
- frontend_dyn = 0.27e-9 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 * (interface_ip.F_sz_nm / 65.0); // niup.clockRate;
- // according to "A 100mW 9.6Gb/s Transceiver in 90nm CMOS..." ISSCC 2006
- // SerDer_dyn is power not energy, scaling from 10mw/Gb/s @90nm
- SerDer_dyn = 0.01 * 10 * sqrt(interface_ip.F_sz_um / 0.09) *
- g_tp.peri_global.Vdd / 1.2 * g_tp.peri_global.Vdd / 1.2;
- SerDer_dyn /=
- niup.clockRate; // covert to energy per clock cycle of whole NIU
-
- // Cadence ChipEstimate using 65nm
- mac_gates = 111700;
- frontend_gates = 320000;
- NMOS_sizing = 5 * g_tp.min_w_nmos_;
- PMOS_sizing = 5 * g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
-
- } else { // Low power implementations are mostly from Cadence ChipEstimator;
- // Ignore the multiple IP effect
- // ---When there are multiple IP (same kind or not) selected, Cadence
- // ChipEstimator results are not a simple summation of all IPs. Ignore this
- // effect
- mac_area =
- 0.24 * (interface_ip.F_sz_um / 0.065) * (interface_ip.F_sz_um / 0.065);
- frontend_area =
- 0.1 * (interface_ip.F_sz_um / 0.065) *
- (interface_ip.F_sz_um / 0.065); // Frontend is the PCS layer
- SerDer_area =
- 0.35 * (interface_ip.F_sz_um / 0.065) * (interface_ip.F_sz_um / 0.065);
- // Compare 130um implementation in "A 1.2-V-Only 900-mW 10 Gb Ethernet
- // Transceiver and XAUI Interface With Robust VCO Tuning Technique" and the
- // ChipEstimator XAUI PHY hard IP, confirm that even PHY can scale perfectly
- // with the technology total area
- area.set_area((mac_area + frontend_area + SerDer_area) * 1e6);
- // Power
- // Cadence ChipEstimate using 65nm (mac, front_end are all energy. E=P*T =
- // P/F = 1.37/1Ghz = 1.37e-9);
- mac_dyn = 1.257e-9 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 *
- (interface_ip.F_sz_nm /
- 65.0); // niup.clockRate; //2.19W@1GHz fully active according to
- // Cadence ChipEstimate @65nm
- // Cadence ChipEstimate using 65nm soft IP;
- frontend_dyn = 0.6e-9 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 * (interface_ip.F_sz_nm / 65.0); // niup.clockRate;
- // SerDer_dyn is power not energy, scaling from 216mw/10Gb/s @130nm
- SerDer_dyn = 0.0216 * 10 * (interface_ip.F_sz_um / 0.13) *
- g_tp.peri_global.Vdd / 1.2 * g_tp.peri_global.Vdd / 1.2;
- SerDer_dyn /=
- niup.clockRate; // covert to energy per clock cycle of whole NIU
-
- mac_gates = 111700;
- frontend_gates = 52000;
-
- NMOS_sizing = g_tp.min_w_nmos_;
- PMOS_sizing = g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
- }
-
- power_t.readOp.dynamic = mac_dyn + frontend_dyn + SerDer_dyn;
- power_t.readOp.leakage =
- (mac_gates + frontend_gates + frontend_gates) *
- cmos_Isub_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
- double long_channel_device_reduction =
- longer_channel_device_reduction(Uncore_device);
- power_t.readOp.longer_channel_leakage =
- power_t.readOp.leakage * long_channel_device_reduction;
- power_t.readOp.gate_leakage =
- (mac_gates + frontend_gates + frontend_gates) *
- cmos_Ig_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
-}
-
-void NIUController::computeEnergy(bool is_tdp) {
- if (is_tdp) {
- power = power_t;
- power.readOp.dynamic *= niup.duty_cycle;
-
- } else {
- rt_power = power_t;
- rt_power.readOp.dynamic *= niup.perc_load;
- }
-}
-
-void NIUController::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
-
- if (is_tdp) {
- cout << "NIU:" << endl;
- cout << indent_str << "Area = " << area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str
- << "Peak Dynamic = " << power.readOp.dynamic * niup.clockRate << " W"
- << endl;
- cout << indent_str << "Subthreshold Leakage = "
- << (long_channel ? power.readOp.longer_channel_leakage
- : power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str<< "Subthreshold Leakage = " <<
- // power.readOp.longer_channel_leakage <<" W" << endl;
- cout << indent_str << "Gate Leakage = " << power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str
- << "Runtime Dynamic = " << rt_power.readOp.dynamic * niup.clockRate
- << " W" << endl;
- cout << endl;
- } else {
- }
-}
-
-void NIUController::set_niu_param() {
- niup.clockRate = XML->sys.niu.clockrate;
- niup.clockRate *= 1e6;
- niup.num_units = XML->sys.niu.number_units;
- niup.duty_cycle = XML->sys.niu.duty_cycle;
- niup.perc_load = XML->sys.niu.total_load_perc;
- niup.type = XML->sys.niu.type;
- // niup.executionTime =
- // XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);
-}
-
-PCIeController::PCIeController(ParseXML* XML_interface,
- InputParameter* interface_ip_)
- : XML(XML_interface), interface_ip(*interface_ip_) {
- local_result = init_interface(&interface_ip);
- double ctrl_area, SerDer_area;
- double ctrl_dyn, SerDer_dyn;
- double ctrl_gates, SerDer_gates;
- double pmos_to_nmos_sizing_r = pmos_to_nmos_sz_ratio();
- double NMOS_sizing, PMOS_sizing;
-
- /* Assuming PCIe is bit-slice based architecture
- * This is the reason for /8 in both area and power calculation
- * to get per lane numbers
- */
-
- set_pcie_param();
- if (pciep.type == 0) // high performance NIU
- {
- // Area estimation based on average of die photo from Niagara 2 and Cadence
- // ChipEstimate @ 65nm.
- ctrl_area = (5.2 + 0.5) / 2 * (interface_ip.F_sz_um / 0.065) *
- (interface_ip.F_sz_um / 0.065);
- // Area estimation based on average of die photo from Niagara 2, and Cadence
- // ChipEstimate @ 65nm. Area estimation based on average of die photo from
- // Niagara 2 and Cadence ChipEstimate hard IP @65nm. SerDer is very hard to
- // scale
- SerDer_area = (3.03 + 0.36) * (interface_ip.F_sz_um /
- 0.065); //* (interface_ip.F_sz_um/0.065);
- // total area
- // Power
- // Cadence ChipEstimate using 65nm the controller includes everything: the
- // PHY, the data link and transaction layer
- ctrl_dyn = 3.75e-9 / 8 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 * (interface_ip.F_sz_nm / 65.0);
- // //Cadence ChipEstimate using 65nm soft IP;
- // frontend_dyn =
- // 0.27e-9/8*g_tp.peri_global.Vdd/1.1*g_tp.peri_global.Vdd/1.1*(interface_ip.F_sz_nm/65.0);
- // SerDer_dyn is power not energy, scaling from 10mw/Gb/s @90nm
- SerDer_dyn = 0.01 * 4 * (interface_ip.F_sz_um / 0.09) *
- g_tp.peri_global.Vdd / 1.2 * g_tp.peri_global.Vdd /
- 1.2; // PCIe 2.0 max per lane speed is 4Gb/s
- SerDer_dyn /= pciep.clockRate; // covert to energy per clock cycle
-
- // power_t.readOp.dynamic = (ctrl_dyn)*pciep.num_channels;
- // Cadence ChipEstimate using 65nm
- ctrl_gates = 900000 / 8 * pciep.num_channels;
- // frontend_gates = 120000/8;
- // SerDer_gates = 200000/8;
- NMOS_sizing = 5 * g_tp.min_w_nmos_;
- PMOS_sizing = 5 * g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
- } else {
- ctrl_area =
- 0.412 * (interface_ip.F_sz_um / 0.065) * (interface_ip.F_sz_um / 0.065);
- // Area estimation based on average of die photo from Niagara 2, and Cadence
- // ChipEstimate @ 65nm.
- SerDer_area =
- 0.36 * (interface_ip.F_sz_um / 0.065) * (interface_ip.F_sz_um / 0.065);
- // total area
- // Power
- // Cadence ChipEstimate using 65nm the controller includes everything: the
- // PHY, the data link and transaction layer
- ctrl_dyn = 2.21e-9 / 8 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd /
- 1.1 * (interface_ip.F_sz_nm / 65.0);
- // //Cadence ChipEstimate using 65nm soft IP;
- // frontend_dyn =
- // 0.27e-9/8*g_tp.peri_global.Vdd/1.1*g_tp.peri_global.Vdd/1.1*(interface_ip.F_sz_nm/65.0);
- // SerDer_dyn is power not energy, scaling from 10mw/Gb/s @90nm
- SerDer_dyn = 0.01 * 4 * (interface_ip.F_sz_um / 0.09) *
- g_tp.peri_global.Vdd / 1.2 * g_tp.peri_global.Vdd /
- 1.2; // PCIe 2.0 max per lane speed is 4Gb/s
- SerDer_dyn /= pciep.clockRate; // covert to energy per clock cycle
-
- // Cadence ChipEstimate using 65nm
- ctrl_gates = 200000 / 8 * pciep.num_channels;
- // frontend_gates = 120000/8;
- SerDer_gates = 200000 / 8 * pciep.num_channels;
- NMOS_sizing = g_tp.min_w_nmos_;
- PMOS_sizing = g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
- }
- area.set_area(((ctrl_area + (pciep.withPHY ? SerDer_area : 0)) / 8 *
- pciep.num_channels) *
- 1e6);
- power_t.readOp.dynamic =
- (ctrl_dyn + (pciep.withPHY ? SerDer_dyn : 0)) * pciep.num_channels;
- power_t.readOp.leakage =
- (ctrl_gates + (pciep.withPHY ? SerDer_gates : 0)) *
- cmos_Isub_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
- double long_channel_device_reduction =
- longer_channel_device_reduction(Uncore_device);
- power_t.readOp.longer_channel_leakage =
- power_t.readOp.leakage * long_channel_device_reduction;
- power_t.readOp.gate_leakage =
- (ctrl_gates + (pciep.withPHY ? SerDer_gates : 0)) *
- cmos_Ig_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
-}
-
-void PCIeController::computeEnergy(bool is_tdp) {
- if (is_tdp) {
- power = power_t;
- power.readOp.dynamic *= pciep.duty_cycle;
-
- } else {
- rt_power = power_t;
- rt_power.readOp.dynamic *= pciep.perc_load;
- }
-}
-
-void PCIeController::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
-
- if (is_tdp) {
- cout << "PCIe:" << endl;
- cout << indent_str << "Area = " << area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str
- << "Peak Dynamic = " << power.readOp.dynamic * pciep.clockRate << " W"
- << endl;
- cout << indent_str << "Subthreshold Leakage = "
- << (long_channel ? power.readOp.longer_channel_leakage
- : power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str<< "Subthreshold Leakage = " <<
- // power.readOp.longer_channel_leakage <<" W" << endl;
- cout << indent_str << "Gate Leakage = " << power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str
- << "Runtime Dynamic = " << rt_power.readOp.dynamic * pciep.clockRate
- << " W" << endl;
- cout << endl;
- } else {
- }
-}
-
-void PCIeController::set_pcie_param() {
- pciep.clockRate = XML->sys.pcie.clockrate;
- pciep.clockRate *= 1e6;
- pciep.num_units = XML->sys.pcie.number_units;
- pciep.num_channels = XML->sys.pcie.num_channels;
- pciep.duty_cycle = XML->sys.pcie.duty_cycle;
- pciep.perc_load = XML->sys.pcie.total_load_perc;
- pciep.type = XML->sys.pcie.type;
- pciep.withPHY = XML->sys.pcie.withPHY;
- // pciep.executionTime =
- // XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);
-}
-
-FlashController::FlashController(ParseXML* XML_interface,
- InputParameter* interface_ip_)
- : XML(XML_interface), interface_ip(*interface_ip_) {
- local_result = init_interface(&interface_ip);
- double ctrl_area, SerDer_area;
- double ctrl_dyn, SerDer_dyn;
- double ctrl_gates, SerDer_gates;
- double pmos_to_nmos_sizing_r = pmos_to_nmos_sz_ratio();
- double NMOS_sizing, PMOS_sizing;
-
- /* Assuming PCIe is bit-slice based architecture
- * This is the reason for /8 in both area and power calculation
- * to get per lane numbers
- */
-
- set_fc_param();
- if (fcp.type == 0) // high performance NIU
- {
- cout << "Current McPAT does not support high performance flash contorller "
- "since even low power designs are enough for maintain throughput"
- << endl;
- exit(0);
- NMOS_sizing = 5 * g_tp.min_w_nmos_;
- PMOS_sizing = 5 * g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
- } else {
- ctrl_area =
- 0.243 * (interface_ip.F_sz_um / 0.065) * (interface_ip.F_sz_um / 0.065);
- // Area estimation based on Cadence ChipEstimate @ 65nm: NANDFLASH-CTRL from
- // CAST
- SerDer_area = 0.36 / 8 * (interface_ip.F_sz_um / 0.065) *
- (interface_ip.F_sz_um / 0.065);
- // based On PCIe PHY TSMC65GP from Cadence ChipEstimate @ 65nm, it support
- // 8x lanes with each lane speed up to 250MB/s (PCIe1.1x) This is already
- // saturate the 200MB/s of the flash controller core above.
- ctrl_gates = 129267;
- SerDer_gates = 200000 / 8;
- NMOS_sizing = g_tp.min_w_nmos_;
- PMOS_sizing = g_tp.min_w_nmos_ * pmos_to_nmos_sizing_r;
-
- // Power
- // Cadence ChipEstimate using 65nm the controller 125mW for every 200MB/s
- // This is power not energy!
- ctrl_dyn = 0.125 * g_tp.peri_global.Vdd / 1.1 * g_tp.peri_global.Vdd / 1.1 *
- (interface_ip.F_sz_nm / 65.0);
- // SerDer_dyn is power not energy, scaling from 10mw/Gb/s @90nm
- SerDer_dyn = 0.01 * 1.6 * (interface_ip.F_sz_um / 0.09) *
- g_tp.peri_global.Vdd / 1.2 * g_tp.peri_global.Vdd / 1.2;
- // max Per controller speed is 1.6Gb/s (200MB/s)
- }
- double number_channel = 1 + (fcp.num_channels - 1) * 0.2;
- area.set_area((ctrl_area + (fcp.withPHY ? SerDer_area : 0)) * 1e6 *
- number_channel);
- power_t.readOp.dynamic =
- (ctrl_dyn + (fcp.withPHY ? SerDer_dyn : 0)) * number_channel;
- power_t.readOp.leakage =
- ((ctrl_gates + (fcp.withPHY ? SerDer_gates : 0)) * number_channel) *
- cmos_Isub_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
- double long_channel_device_reduction =
- longer_channel_device_reduction(Uncore_device);
- power_t.readOp.longer_channel_leakage =
- power_t.readOp.leakage * long_channel_device_reduction;
- power_t.readOp.gate_leakage =
- ((ctrl_gates + (fcp.withPHY ? SerDer_gates : 0)) * number_channel) *
- cmos_Ig_leakage(NMOS_sizing, PMOS_sizing, 2, nand) *
- g_tp.peri_global.Vdd; // unit W
-}
-
-void FlashController::computeEnergy(bool is_tdp) {
- if (is_tdp) {
- power = power_t;
- power.readOp.dynamic *= fcp.duty_cycle;
-
- } else {
- rt_power = power_t;
- rt_power.readOp.dynamic *= fcp.perc_load;
- }
-}
-
-void FlashController::displayEnergy(uint32_t indent, int plevel, bool is_tdp) {
- string indent_str(indent, ' ');
- string indent_str_next(indent + 2, ' ');
- bool long_channel = XML->sys.longer_channel_device;
-
- if (is_tdp) {
- cout << "Flash Controller:" << endl;
- cout << indent_str << "Area = " << area.get_area() * 1e-6 << " mm^2"
- << endl;
- cout << indent_str << "Peak Dynamic = " << power.readOp.dynamic << " W"
- << endl; // no multiply of clock since this is power already
- cout << indent_str << "Subthreshold Leakage = "
- << (long_channel ? power.readOp.longer_channel_leakage
- : power.readOp.leakage)
- << " W" << endl;
- // cout << indent_str<< "Subthreshold Leakage = " <<
- // power.readOp.longer_channel_leakage <<" W" << endl;
- cout << indent_str << "Gate Leakage = " << power.readOp.gate_leakage << " W"
- << endl;
- cout << indent_str << "Runtime Dynamic = " << rt_power.readOp.dynamic
- << " W" << endl;
- cout << endl;
- } else {
- }
-}
-
-void FlashController::set_fc_param() {
- // fcp.clockRate = XML->sys.flashc.mc_clock;
- // fcp.clockRate *= 1e6;
- fcp.peakDataTransferRate = XML->sys.flashc.peak_transfer_rate;
- fcp.num_channels = ceil(fcp.peakDataTransferRate / 200);
- fcp.num_mcs = XML->sys.flashc.number_mcs;
- fcp.duty_cycle = XML->sys.flashc.duty_cycle;
- fcp.perc_load = XML->sys.flashc.total_load_perc;
- fcp.type = XML->sys.flashc.type;
- fcp.withPHY = XML->sys.flashc.withPHY;
- // flashcp.executionTime =
- // XML->sys.total_cycles/(XML->sys.target_core_clockrate*1e6);
-}