component.cc revision 10152
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. 510152Satgutier@umich.edu * All Rights Reserved 610152Satgutier@umich.edu * 710152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 810152Satgutier@umich.edu * modification, are permitted provided that the following conditions are 910152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 1010152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 1110152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 1210152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 1310152Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 1410152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 1510152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 1610152Satgutier@umich.edu * this software without specific prior written permission. 1710152Satgutier@umich.edu 1810152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1910152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2010152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2110152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2210152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2310152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2410152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2510152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2610152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2710152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2810152Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.” 2910152Satgutier@umich.edu * 3010152Satgutier@umich.edu ***************************************************************************/ 3110152Satgutier@umich.edu 3210152Satgutier@umich.edu 3310152Satgutier@umich.edu 3410152Satgutier@umich.edu 3510152Satgutier@umich.edu#include <cassert> 3610152Satgutier@umich.edu#include <cmath> 3710152Satgutier@umich.edu#include <iostream> 3810152Satgutier@umich.edu 3910152Satgutier@umich.edu#include "bank.h" 4010152Satgutier@umich.edu#include "component.h" 4110152Satgutier@umich.edu#include "decoder.h" 4210152Satgutier@umich.edu 4310152Satgutier@umich.eduusing namespace std; 4410152Satgutier@umich.edu 4510152Satgutier@umich.edu 4610152Satgutier@umich.edu 4710152Satgutier@umich.eduComponent::Component() 4810152Satgutier@umich.edu :area(), power(), rt_power(),delay(0) 4910152Satgutier@umich.edu{ 5010152Satgutier@umich.edu} 5110152Satgutier@umich.edu 5210152Satgutier@umich.edu 5310152Satgutier@umich.edu 5410152Satgutier@umich.eduComponent::~Component() 5510152Satgutier@umich.edu{ 5610152Satgutier@umich.edu} 5710152Satgutier@umich.edu 5810152Satgutier@umich.edu 5910152Satgutier@umich.edu 6010152Satgutier@umich.edudouble Component::compute_diffusion_width(int num_stacked_in, int num_folded_tr) 6110152Satgutier@umich.edu{ 6210152Satgutier@umich.edu double w_poly = g_ip->F_sz_um; 6310152Satgutier@umich.edu double spacing_poly_to_poly = g_tp.w_poly_contact + 2 * g_tp.spacing_poly_to_contact; 6410152Satgutier@umich.edu double total_diff_w = 2 * spacing_poly_to_poly + // for both source and drain 6510152Satgutier@umich.edu num_stacked_in * w_poly + 6610152Satgutier@umich.edu (num_stacked_in - 1) * g_tp.spacing_poly_to_poly; 6710152Satgutier@umich.edu 6810152Satgutier@umich.edu if (num_folded_tr > 1) 6910152Satgutier@umich.edu { 7010152Satgutier@umich.edu total_diff_w += (num_folded_tr - 2) * 2 * spacing_poly_to_poly + 7110152Satgutier@umich.edu (num_folded_tr - 1) * num_stacked_in * w_poly + 7210152Satgutier@umich.edu (num_folded_tr - 1) * (num_stacked_in - 1) * g_tp.spacing_poly_to_poly; 7310152Satgutier@umich.edu } 7410152Satgutier@umich.edu 7510152Satgutier@umich.edu return total_diff_w; 7610152Satgutier@umich.edu} 7710152Satgutier@umich.edu 7810152Satgutier@umich.edu 7910152Satgutier@umich.edu 8010152Satgutier@umich.edudouble Component::compute_gate_area( 8110152Satgutier@umich.edu int gate_type, 8210152Satgutier@umich.edu int num_inputs, 8310152Satgutier@umich.edu double w_pmos, 8410152Satgutier@umich.edu double w_nmos, 8510152Satgutier@umich.edu double h_gate) 8610152Satgutier@umich.edu{ 8710152Satgutier@umich.edu if (w_pmos <= 0.0 || w_nmos <= 0.0) 8810152Satgutier@umich.edu { 8910152Satgutier@umich.edu return 0.0; 9010152Satgutier@umich.edu } 9110152Satgutier@umich.edu 9210152Satgutier@umich.edu double w_folded_pmos, w_folded_nmos; 9310152Satgutier@umich.edu int num_folded_pmos, num_folded_nmos; 9410152Satgutier@umich.edu double total_ndiff_w, total_pdiff_w; 9510152Satgutier@umich.edu Area gate; 9610152Satgutier@umich.edu 9710152Satgutier@umich.edu double h_tr_region = h_gate - 2 * g_tp.HPOWERRAIL; 9810152Satgutier@umich.edu double ratio_p_to_n = w_pmos / (w_pmos + w_nmos); 9910152Satgutier@umich.edu 10010152Satgutier@umich.edu if (ratio_p_to_n >= 1 || ratio_p_to_n <= 0) 10110152Satgutier@umich.edu { 10210152Satgutier@umich.edu return 0.0; 10310152Satgutier@umich.edu } 10410152Satgutier@umich.edu 10510152Satgutier@umich.edu w_folded_pmos = (h_tr_region - g_tp.MIN_GAP_BET_P_AND_N_DIFFS) * ratio_p_to_n; 10610152Satgutier@umich.edu w_folded_nmos = (h_tr_region - g_tp.MIN_GAP_BET_P_AND_N_DIFFS) * (1 - ratio_p_to_n); 10710152Satgutier@umich.edu assert(w_folded_pmos > 0); 10810152Satgutier@umich.edu 10910152Satgutier@umich.edu num_folded_pmos = (int) (ceil(w_pmos / w_folded_pmos)); 11010152Satgutier@umich.edu num_folded_nmos = (int) (ceil(w_nmos / w_folded_nmos)); 11110152Satgutier@umich.edu 11210152Satgutier@umich.edu switch (gate_type) 11310152Satgutier@umich.edu { 11410152Satgutier@umich.edu case INV: 11510152Satgutier@umich.edu total_ndiff_w = compute_diffusion_width(1, num_folded_nmos); 11610152Satgutier@umich.edu total_pdiff_w = compute_diffusion_width(1, num_folded_pmos); 11710152Satgutier@umich.edu break; 11810152Satgutier@umich.edu 11910152Satgutier@umich.edu case NOR: 12010152Satgutier@umich.edu total_ndiff_w = compute_diffusion_width(1, num_inputs * num_folded_nmos); 12110152Satgutier@umich.edu total_pdiff_w = compute_diffusion_width(num_inputs, num_folded_pmos); 12210152Satgutier@umich.edu break; 12310152Satgutier@umich.edu 12410152Satgutier@umich.edu case NAND: 12510152Satgutier@umich.edu total_ndiff_w = compute_diffusion_width(num_inputs, num_folded_nmos); 12610152Satgutier@umich.edu total_pdiff_w = compute_diffusion_width(1, num_inputs * num_folded_pmos); 12710152Satgutier@umich.edu break; 12810152Satgutier@umich.edu default: 12910152Satgutier@umich.edu cout << "Unknown gate type: " << gate_type << endl; 13010152Satgutier@umich.edu exit(1); 13110152Satgutier@umich.edu } 13210152Satgutier@umich.edu 13310152Satgutier@umich.edu gate.w = MAX(total_ndiff_w, total_pdiff_w); 13410152Satgutier@umich.edu 13510152Satgutier@umich.edu if (w_folded_nmos > w_nmos) 13610152Satgutier@umich.edu { 13710152Satgutier@umich.edu //means that the height of the gate can 13810152Satgutier@umich.edu //be made smaller than the input height specified, so calculate the height of the gate. 13910152Satgutier@umich.edu gate.h = w_nmos + w_pmos + g_tp.MIN_GAP_BET_P_AND_N_DIFFS + 2 * g_tp.HPOWERRAIL; 14010152Satgutier@umich.edu } 14110152Satgutier@umich.edu else 14210152Satgutier@umich.edu { 14310152Satgutier@umich.edu gate.h = h_gate; 14410152Satgutier@umich.edu } 14510152Satgutier@umich.edu return gate.get_area(); 14610152Satgutier@umich.edu} 14710152Satgutier@umich.edu 14810152Satgutier@umich.edu 14910152Satgutier@umich.edu 15010152Satgutier@umich.edudouble Component::compute_tr_width_after_folding( 15110152Satgutier@umich.edu double input_width, 15210152Satgutier@umich.edu double threshold_folding_width) 15310152Satgutier@umich.edu{//This is actually the width of the cell not the width of a device. 15410152Satgutier@umich.edu//The width of a cell and the width of a device is orthogonal. 15510152Satgutier@umich.edu if (input_width <= 0) 15610152Satgutier@umich.edu { 15710152Satgutier@umich.edu return 0; 15810152Satgutier@umich.edu } 15910152Satgutier@umich.edu 16010152Satgutier@umich.edu int num_folded_tr = (int) (ceil(input_width / threshold_folding_width)); 16110152Satgutier@umich.edu double spacing_poly_to_poly = g_tp.w_poly_contact + 2 * g_tp.spacing_poly_to_contact; 16210152Satgutier@umich.edu double width_poly = g_ip->F_sz_um; 16310152Satgutier@umich.edu double total_diff_width = num_folded_tr * width_poly + (num_folded_tr + 1) * spacing_poly_to_poly; 16410152Satgutier@umich.edu 16510152Satgutier@umich.edu return total_diff_width; 16610152Satgutier@umich.edu} 16710152Satgutier@umich.edu 16810152Satgutier@umich.edu 16910152Satgutier@umich.edu 17010152Satgutier@umich.edudouble Component::height_sense_amplifier(double pitch_sense_amp) 17110152Satgutier@umich.edu{ 17210152Satgutier@umich.edu // compute the height occupied by all PMOS transistors 17310152Satgutier@umich.edu double h_pmos_tr = compute_tr_width_after_folding(g_tp.w_sense_p, pitch_sense_amp) * 2 + 17410152Satgutier@umich.edu compute_tr_width_after_folding(g_tp.w_iso, pitch_sense_amp) + 17510152Satgutier@umich.edu 2 * g_tp.MIN_GAP_BET_SAME_TYPE_DIFFS; 17610152Satgutier@umich.edu 17710152Satgutier@umich.edu // compute the height occupied by all NMOS transistors 17810152Satgutier@umich.edu double h_nmos_tr = compute_tr_width_after_folding(g_tp.w_sense_n, pitch_sense_amp) * 2 + 17910152Satgutier@umich.edu compute_tr_width_after_folding(g_tp.w_sense_en, pitch_sense_amp) + 18010152Satgutier@umich.edu 2 * g_tp.MIN_GAP_BET_SAME_TYPE_DIFFS; 18110152Satgutier@umich.edu 18210152Satgutier@umich.edu // compute total height by considering gap between the p and n diffusion areas 18310152Satgutier@umich.edu return h_pmos_tr + h_nmos_tr + g_tp.MIN_GAP_BET_P_AND_N_DIFFS; 18410152Satgutier@umich.edu} 18510152Satgutier@umich.edu 18610152Satgutier@umich.edu 18710152Satgutier@umich.edu 18810152Satgutier@umich.eduint Component::logical_effort( 18910152Satgutier@umich.edu int num_gates_min, 19010152Satgutier@umich.edu double g, 19110152Satgutier@umich.edu double F, 19210152Satgutier@umich.edu double * w_n, 19310152Satgutier@umich.edu double * w_p, 19410152Satgutier@umich.edu double C_load, 19510152Satgutier@umich.edu double p_to_n_sz_ratio, 19610152Satgutier@umich.edu bool is_dram_, 19710152Satgutier@umich.edu bool is_wl_tr_, 19810152Satgutier@umich.edu double max_w_nmos) 19910152Satgutier@umich.edu{ 20010152Satgutier@umich.edu int num_gates = (int) (log(F) / log(fopt)); 20110152Satgutier@umich.edu 20210152Satgutier@umich.edu // check if num_gates is odd. if so, add 1 to make it even 20310152Satgutier@umich.edu num_gates+= (num_gates % 2) ? 1 : 0; 20410152Satgutier@umich.edu num_gates = MAX(num_gates, num_gates_min); 20510152Satgutier@umich.edu 20610152Satgutier@umich.edu // recalculate the effective fanout of each stage 20710152Satgutier@umich.edu double f = pow(F, 1.0 / num_gates); 20810152Satgutier@umich.edu int i = num_gates - 1; 20910152Satgutier@umich.edu double C_in = C_load / f; 21010152Satgutier@umich.edu w_n[i] = (1.0 / (1.0 + p_to_n_sz_ratio)) * C_in / gate_C(1, 0, is_dram_, false, is_wl_tr_); 21110152Satgutier@umich.edu w_n[i] = MAX(w_n[i], g_tp.min_w_nmos_); 21210152Satgutier@umich.edu w_p[i] = p_to_n_sz_ratio * w_n[i]; 21310152Satgutier@umich.edu 21410152Satgutier@umich.edu if (w_n[i] > max_w_nmos) 21510152Satgutier@umich.edu { 21610152Satgutier@umich.edu double C_ld = gate_C((1 + p_to_n_sz_ratio) * max_w_nmos, 0, is_dram_, false, is_wl_tr_); 21710152Satgutier@umich.edu F = g * C_ld / gate_C(w_n[0] + w_p[0], 0, is_dram_, false, is_wl_tr_); 21810152Satgutier@umich.edu num_gates = (int) (log(F) / log(fopt)) + 1; 21910152Satgutier@umich.edu num_gates+= (num_gates % 2) ? 1 : 0; 22010152Satgutier@umich.edu num_gates = MAX(num_gates, num_gates_min); 22110152Satgutier@umich.edu f = pow(F, 1.0 / (num_gates - 1)); 22210152Satgutier@umich.edu i = num_gates - 1; 22310152Satgutier@umich.edu w_n[i] = max_w_nmos; 22410152Satgutier@umich.edu w_p[i] = p_to_n_sz_ratio * w_n[i]; 22510152Satgutier@umich.edu } 22610152Satgutier@umich.edu 22710152Satgutier@umich.edu for (i = num_gates - 2; i >= 1; i--) 22810152Satgutier@umich.edu { 22910152Satgutier@umich.edu w_n[i] = MAX(w_n[i+1] / f, g_tp.min_w_nmos_); 23010152Satgutier@umich.edu w_p[i] = p_to_n_sz_ratio * w_n[i]; 23110152Satgutier@umich.edu } 23210152Satgutier@umich.edu 23310152Satgutier@umich.edu assert(num_gates <= MAX_NUMBER_GATES_STAGE); 23410152Satgutier@umich.edu return num_gates; 23510152Satgutier@umich.edu} 23610152Satgutier@umich.edu 237