htree2.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#include <cassert> 3510152Satgutier@umich.edu#include <iostream> 3610152Satgutier@umich.edu 3710152Satgutier@umich.edu#include "htree2.h" 3810152Satgutier@umich.edu#include "wire.h" 3910152Satgutier@umich.edu 4010152Satgutier@umich.eduHtree2::Htree2( 4110152Satgutier@umich.edu enum Wire_type wire_model, double mat_w, double mat_h, 4210152Satgutier@umich.edu int a_bits, int d_inbits, int search_data_in, int d_outbits, int search_data_out, int bl, int wl, enum Htree_type htree_type, 4310152Satgutier@umich.edu bool uca_tree_, bool search_tree_, TechnologyParameter::DeviceType *dt) 4410152Satgutier@umich.edu :in_rise_time(0), out_rise_time(0), 4510152Satgutier@umich.edu tree_type(htree_type), mat_width(mat_w), mat_height(mat_h), 4610152Satgutier@umich.edu add_bits(a_bits), data_in_bits(d_inbits), search_data_in_bits(search_data_in),data_out_bits(d_outbits), 4710152Satgutier@umich.edu search_data_out_bits(search_data_out), ndbl(bl), ndwl(wl), 4810152Satgutier@umich.edu uca_tree(uca_tree_), search_tree(search_tree_), wt(wire_model), deviceType(dt) 4910152Satgutier@umich.edu{ 5010152Satgutier@umich.edu assert(ndbl >= 2 && ndwl >= 2); 5110152Satgutier@umich.edu 5210152Satgutier@umich.edu// if (ndbl == 1 && ndwl == 1) 5310152Satgutier@umich.edu// { 5410152Satgutier@umich.edu// delay = 0; 5510152Satgutier@umich.edu// power.readOp.dynamic = 0; 5610152Satgutier@umich.edu// power.readOp.leakage = 0; 5710152Satgutier@umich.edu// area.w = mat_w; 5810152Satgutier@umich.edu// area.h = mat_h; 5910152Satgutier@umich.edu// return; 6010152Satgutier@umich.edu// } 6110152Satgutier@umich.edu// if (ndwl == 1) ndwl++; 6210152Satgutier@umich.edu// if (ndbl == 1) ndbl++; 6310152Satgutier@umich.edu 6410152Satgutier@umich.edu max_unpipelined_link_delay = 0; //TODO 6510152Satgutier@umich.edu min_w_nmos = g_tp.min_w_nmos_; 6610152Satgutier@umich.edu min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio * min_w_nmos; 6710152Satgutier@umich.edu 6810152Satgutier@umich.edu switch (htree_type) 6910152Satgutier@umich.edu { 7010152Satgutier@umich.edu case Add_htree: 7110152Satgutier@umich.edu wire_bw = init_wire_bw = add_bits; 7210152Satgutier@umich.edu in_htree(); 7310152Satgutier@umich.edu break; 7410152Satgutier@umich.edu case Data_in_htree: 7510152Satgutier@umich.edu wire_bw = init_wire_bw = data_in_bits; 7610152Satgutier@umich.edu in_htree(); 7710152Satgutier@umich.edu break; 7810152Satgutier@umich.edu case Data_out_htree: 7910152Satgutier@umich.edu wire_bw = init_wire_bw = data_out_bits; 8010152Satgutier@umich.edu out_htree(); 8110152Satgutier@umich.edu break; 8210152Satgutier@umich.edu case Search_in_htree: 8310152Satgutier@umich.edu wire_bw = init_wire_bw = search_data_in_bits;//in_search_tree is broad cast, out_htree is not. 8410152Satgutier@umich.edu in_htree(); 8510152Satgutier@umich.edu break; 8610152Satgutier@umich.edu case Search_out_htree: 8710152Satgutier@umich.edu wire_bw = init_wire_bw = search_data_out_bits; 8810152Satgutier@umich.edu out_htree(); 8910152Satgutier@umich.edu break; 9010152Satgutier@umich.edu default: 9110152Satgutier@umich.edu assert(0); 9210152Satgutier@umich.edu break; 9310152Satgutier@umich.edu } 9410152Satgutier@umich.edu 9510152Satgutier@umich.edu power_bit = power; 9610152Satgutier@umich.edu power.readOp.dynamic *= init_wire_bw; 9710152Satgutier@umich.edu 9810152Satgutier@umich.edu assert(power.readOp.dynamic >= 0); 9910152Satgutier@umich.edu assert(power.readOp.leakage >= 0); 10010152Satgutier@umich.edu} 10110152Satgutier@umich.edu 10210152Satgutier@umich.edu 10310152Satgutier@umich.edu 10410152Satgutier@umich.edu// nand gate sizing calculation 10510152Satgutier@umich.eduvoid Htree2::input_nand(double s1, double s2, double l_eff) 10610152Satgutier@umich.edu{ 10710152Satgutier@umich.edu Wire w1(wt, l_eff); 10810152Satgutier@umich.edu double pton_size = deviceType->n_to_p_eff_curr_drv_ratio; 10910152Satgutier@umich.edu // input capacitance of a repeater = input capacitance of nand. 11010152Satgutier@umich.edu double nsize = s1*(1 + pton_size)/(2 + pton_size); 11110152Satgutier@umich.edu nsize = (nsize < 1) ? 1 : nsize; 11210152Satgutier@umich.edu 11310152Satgutier@umich.edu double tc = 2*tr_R_on(nsize*min_w_nmos, NCH, 1) * 11410152Satgutier@umich.edu (drain_C_(nsize*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def)*2 + 11510152Satgutier@umich.edu 2 * gate_C(s2*(min_w_nmos + min_w_pmos), 0)); 11610152Satgutier@umich.edu delay+= horowitz (w1.out_rise_time, tc, 11710152Satgutier@umich.edu deviceType->Vth/deviceType->Vdd, deviceType->Vth/deviceType->Vdd, RISE); 11810152Satgutier@umich.edu power.readOp.dynamic += 0.5 * 11910152Satgutier@umich.edu (2*drain_C_(pton_size * nsize*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 12010152Satgutier@umich.edu + drain_C_(nsize*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 12110152Satgutier@umich.edu + 2*gate_C(s2*(min_w_nmos + min_w_pmos), 0)) * 12210152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd; 12310152Satgutier@umich.edu 12410152Satgutier@umich.edu power.searchOp.dynamic += 0.5 * 12510152Satgutier@umich.edu (2*drain_C_(pton_size * nsize*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 12610152Satgutier@umich.edu + drain_C_(nsize*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 12710152Satgutier@umich.edu + 2*gate_C(s2*(min_w_nmos + min_w_pmos), 0)) * 12810152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd * wire_bw ; 12910152Satgutier@umich.edu power.readOp.leakage += (wire_bw*cmos_Isub_leakage(min_w_nmos*(nsize*2), min_w_pmos * nsize * 2, 2, nand))*deviceType->Vdd; 13010152Satgutier@umich.edu power.readOp.gate_leakage += (wire_bw*cmos_Ig_leakage(min_w_nmos*(nsize*2), min_w_pmos * nsize * 2, 2, nand))*deviceType->Vdd; 13110152Satgutier@umich.edu} 13210152Satgutier@umich.edu 13310152Satgutier@umich.edu 13410152Satgutier@umich.edu 13510152Satgutier@umich.edu// tristate buffer model consisting of not, nand, nor, and driver transistors 13610152Satgutier@umich.eduvoid Htree2::output_buffer(double s1, double s2, double l_eff) 13710152Satgutier@umich.edu{ 13810152Satgutier@umich.edu Wire w1(wt, l_eff); 13910152Satgutier@umich.edu double pton_size = deviceType->n_to_p_eff_curr_drv_ratio; 14010152Satgutier@umich.edu // input capacitance of repeater = input capacitance of nand + nor. 14110152Satgutier@umich.edu double size = s1*(1 + pton_size)/(2 + pton_size + 1 + 2*pton_size); 14210152Satgutier@umich.edu double s_eff = //stage eff of a repeater in a wire 14310152Satgutier@umich.edu (gate_C(s2*(min_w_nmos + min_w_pmos), 0) + w1.wire_cap(l_eff*1e-6,true))/ 14410152Satgutier@umich.edu gate_C(s2*(min_w_nmos + min_w_pmos), 0); 14510152Satgutier@umich.edu double tr_size = gate_C(s1*(min_w_nmos + min_w_pmos), 0) * 1/2/(s_eff*gate_C(min_w_pmos, 0)); 14610152Satgutier@umich.edu size = (size < 1) ? 1 : size; 14710152Satgutier@umich.edu 14810152Satgutier@umich.edu double res_nor = 2*tr_R_on(size*min_w_pmos, PCH, 1); 14910152Satgutier@umich.edu double res_ptrans = tr_R_on(tr_size*min_w_nmos, NCH, 1); 15010152Satgutier@umich.edu double cap_nand_out = drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) + 15110152Satgutier@umich.edu drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def)*2 + 15210152Satgutier@umich.edu gate_C(tr_size*min_w_pmos, 0); 15310152Satgutier@umich.edu double cap_ptrans_out = 2 *(drain_C_(tr_size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) + 15410152Satgutier@umich.edu drain_C_(tr_size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def)) + 15510152Satgutier@umich.edu gate_C(s1*(min_w_nmos + min_w_pmos), 0); 15610152Satgutier@umich.edu 15710152Satgutier@umich.edu double tc = res_nor * cap_nand_out + (res_nor + res_ptrans) * cap_ptrans_out; 15810152Satgutier@umich.edu 15910152Satgutier@umich.edu 16010152Satgutier@umich.edu delay += horowitz (w1.out_rise_time, tc, 16110152Satgutier@umich.edu deviceType->Vth/deviceType->Vdd, deviceType->Vth/deviceType->Vdd, RISE); 16210152Satgutier@umich.edu 16310152Satgutier@umich.edu //nand 16410152Satgutier@umich.edu power.readOp.dynamic += 0.5 * 16510152Satgutier@umich.edu (2*drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) + 16610152Satgutier@umich.edu drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) + 16710152Satgutier@umich.edu gate_C(tr_size*(min_w_pmos), 0)) * 16810152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd; 16910152Satgutier@umich.edu 17010152Satgutier@umich.edu power.searchOp.dynamic += 0.5 * 17110152Satgutier@umich.edu (2*drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) + 17210152Satgutier@umich.edu drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) + 17310152Satgutier@umich.edu gate_C(tr_size*(min_w_pmos), 0)) * 17410152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd*init_wire_bw; 17510152Satgutier@umich.edu 17610152Satgutier@umich.edu //not 17710152Satgutier@umich.edu power.readOp.dynamic += 0.5 * 17810152Satgutier@umich.edu (drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 17910152Satgutier@umich.edu +drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 18010152Satgutier@umich.edu +gate_C(size*(min_w_nmos + min_w_pmos), 0)) * 18110152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd; 18210152Satgutier@umich.edu 18310152Satgutier@umich.edu power.searchOp.dynamic += 0.5 * 18410152Satgutier@umich.edu (drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 18510152Satgutier@umich.edu +drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 18610152Satgutier@umich.edu +gate_C(size*(min_w_nmos + min_w_pmos), 0)) * 18710152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd*init_wire_bw; 18810152Satgutier@umich.edu 18910152Satgutier@umich.edu //nor 19010152Satgutier@umich.edu power.readOp.dynamic += 0.5 * 19110152Satgutier@umich.edu (drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 19210152Satgutier@umich.edu + 2*drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 19310152Satgutier@umich.edu +gate_C(tr_size*(min_w_nmos + min_w_pmos), 0)) * 19410152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd; 19510152Satgutier@umich.edu 19610152Satgutier@umich.edu power.searchOp.dynamic += 0.5 * 19710152Satgutier@umich.edu (drain_C_(size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 19810152Satgutier@umich.edu + 2*drain_C_(size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def) 19910152Satgutier@umich.edu +gate_C(tr_size*(min_w_nmos + min_w_pmos), 0)) * 20010152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd*init_wire_bw; 20110152Satgutier@umich.edu 20210152Satgutier@umich.edu //output transistor 20310152Satgutier@umich.edu power.readOp.dynamic += 0.5 * 20410152Satgutier@umich.edu ((drain_C_(tr_size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 20510152Satgutier@umich.edu +drain_C_(tr_size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def))*2 20610152Satgutier@umich.edu + gate_C(s1*(min_w_nmos + min_w_pmos), 0)) * 20710152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd; 20810152Satgutier@umich.edu 20910152Satgutier@umich.edu power.searchOp.dynamic += 0.5 * 21010152Satgutier@umich.edu ((drain_C_(tr_size*min_w_pmos, PCH, 1, 1, g_tp.cell_h_def) 21110152Satgutier@umich.edu +drain_C_(tr_size*min_w_nmos, NCH, 1, 1, g_tp.cell_h_def))*2 21210152Satgutier@umich.edu + gate_C(s1*(min_w_nmos + min_w_pmos), 0)) * 21310152Satgutier@umich.edu deviceType->Vdd * deviceType->Vdd*init_wire_bw; 21410152Satgutier@umich.edu 21510152Satgutier@umich.edu if(uca_tree) { 21610152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*tr_size*2, min_w_pmos*tr_size*2, 1, inv)*deviceType->Vdd*wire_bw;/*inverter + output tr*/ 21710152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nand)*deviceType->Vdd*wire_bw;//nand 21810152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nor)*deviceType->Vdd*wire_bw;//nor 21910152Satgutier@umich.edu 22010152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*tr_size*2, min_w_pmos*tr_size*2, 1, inv)*deviceType->Vdd*wire_bw;/*inverter + output tr*/ 22110152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nand)*deviceType->Vdd*wire_bw;//nand 22210152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nor)*deviceType->Vdd*wire_bw;//nor 22310152Satgutier@umich.edu //power.readOp.gate_leakage *=; 22410152Satgutier@umich.edu } 22510152Satgutier@umich.edu else { 22610152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*tr_size*2, min_w_pmos*tr_size*2, 1, inv)*deviceType->Vdd*wire_bw;/*inverter + output tr*/ 22710152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nand)*deviceType->Vdd*wire_bw;//nand 22810152Satgutier@umich.edu power.readOp.leakage += cmos_Isub_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nor)*deviceType->Vdd*wire_bw;//nor 22910152Satgutier@umich.edu 23010152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*tr_size*2, min_w_pmos*tr_size*2, 1, inv)*deviceType->Vdd*wire_bw;/*inverter + output tr*/ 23110152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nand)*deviceType->Vdd*wire_bw;//nand 23210152Satgutier@umich.edu power.readOp.gate_leakage += cmos_Ig_leakage(min_w_nmos*size*3, min_w_pmos*size*3, 2, nor)*deviceType->Vdd*wire_bw;//nor 23310152Satgutier@umich.edu //power.readOp.gate_leakage *=deviceType->Vdd*wire_bw; 23410152Satgutier@umich.edu } 23510152Satgutier@umich.edu} 23610152Satgutier@umich.edu 23710152Satgutier@umich.edu 23810152Satgutier@umich.edu 23910152Satgutier@umich.edu/* calculates the input h-tree delay/power 24010152Satgutier@umich.edu * A nand gate is used at each node to 24110152Satgutier@umich.edu * limit the signal 24210152Satgutier@umich.edu * The area of an unbalanced htree (rows != columns) 24310152Satgutier@umich.edu * depends on how data is traversed. 24410152Satgutier@umich.edu * In the following function, if ( no. of rows < no. of columns), 24510152Satgutier@umich.edu * then data first traverse in excess hor. links until vertical 24610152Satgutier@umich.edu * and horizontal nodes are same. 24710152Satgutier@umich.edu * If no. of rows is bigger, then data traverse in 24810152Satgutier@umich.edu * a hor. link followed by a ver. link in a repeated 24910152Satgutier@umich.edu * fashion (similar to a balanced tree) until there are no 25010152Satgutier@umich.edu * hor. links left. After this it goes through the remaining vertical 25110152Satgutier@umich.edu * links. 25210152Satgutier@umich.edu */ 25310152Satgutier@umich.edu void 25410152Satgutier@umich.eduHtree2::in_htree() 25510152Satgutier@umich.edu{ 25610152Satgutier@umich.edu //temp var 25710152Satgutier@umich.edu double s1 = 0, s2 = 0, s3 = 0; 25810152Satgutier@umich.edu double l_eff = 0; 25910152Satgutier@umich.edu Wire *wtemp1 = 0, *wtemp2 = 0, *wtemp3 = 0; 26010152Satgutier@umich.edu double len = 0, ht = 0; 26110152Satgutier@umich.edu int option = 0; 26210152Satgutier@umich.edu 26310152Satgutier@umich.edu int h = (int) _log2(ndwl/2); // horizontal nodes 26410152Satgutier@umich.edu int v = (int) _log2(ndbl/2); // vertical nodes 26510152Satgutier@umich.edu double len_temp; 26610152Satgutier@umich.edu double ht_temp; 26710152Satgutier@umich.edu if (uca_tree) 26810152Satgutier@umich.edu {//Sheng: this computation do not consider the wires that route from edge to middle. 26910152Satgutier@umich.edu ht_temp = (mat_height*ndbl/2 +/* since uca_tree models interbank tree, mat_height => bank height */ 27010152Satgutier@umich.edu ((add_bits + data_in_bits + data_out_bits + (search_data_in_bits + search_data_out_bits)) * g_tp.wire_outside_mat.pitch * 27110152Satgutier@umich.edu 2 * (1-pow(0.5,h))))/2; 27210152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 27310152Satgutier@umich.edu ((add_bits + data_in_bits + data_out_bits + (search_data_in_bits + search_data_out_bits)) * g_tp.wire_outside_mat.pitch * 27410152Satgutier@umich.edu 2 * (1-pow(0.5,v))))/2; 27510152Satgutier@umich.edu } 27610152Satgutier@umich.edu else 27710152Satgutier@umich.edu { 27810152Satgutier@umich.edu if (ndwl == ndbl) { 27910152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 28010152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* (ndbl/2-1) * g_tp.wire_outside_mat.pitch) + 28110152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * h) 28210152Satgutier@umich.edu )/2; 28310152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 28410152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits)) * (ndwl/2-1) * g_tp.wire_outside_mat.pitch) + 28510152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * v))/2; 28610152Satgutier@umich.edu } 28710152Satgutier@umich.edu else if (ndwl > ndbl) { 28810152Satgutier@umich.edu double excess_part = (_log2(ndwl/2) - _log2(ndbl/2)); 28910152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 29010152Satgutier@umich.edu ((add_bits + + (search_data_in_bits + search_data_out_bits)) * ((ndbl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 29110152Satgutier@umich.edu (data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * 29210152Satgutier@umich.edu (2*(1 - pow(0.5, h-v)) + pow(0.5, v-h) * v))/2; 29310152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 29410152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* (ndwl/2-1) * g_tp.wire_outside_mat.pitch) + 29510152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * v))/2; 29610152Satgutier@umich.edu } 29710152Satgutier@umich.edu else { 29810152Satgutier@umich.edu double excess_part = (_log2(ndbl/2) - _log2(ndwl/2)); 29910152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 30010152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* ((ndwl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 30110152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * h) 30210152Satgutier@umich.edu )/2; 30310152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 30410152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits)) * ((ndwl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 30510152Satgutier@umich.edu (data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * (h + 2*(1-pow(0.5, v-h))))/2; 30610152Satgutier@umich.edu } 30710152Satgutier@umich.edu } 30810152Satgutier@umich.edu 30910152Satgutier@umich.edu area.h = ht_temp * 2; 31010152Satgutier@umich.edu area.w = len_temp * 2; 31110152Satgutier@umich.edu delay = 0; 31210152Satgutier@umich.edu power.readOp.dynamic = 0; 31310152Satgutier@umich.edu power.readOp.leakage = 0; 31410152Satgutier@umich.edu power.searchOp.dynamic =0; 31510152Satgutier@umich.edu len = len_temp; 31610152Satgutier@umich.edu ht = ht_temp/2; 31710152Satgutier@umich.edu 31810152Satgutier@umich.edu while (v > 0 || h > 0) 31910152Satgutier@umich.edu { 32010152Satgutier@umich.edu if (wtemp1) delete wtemp1; 32110152Satgutier@umich.edu if (wtemp2) delete wtemp2; 32210152Satgutier@umich.edu if (wtemp3) delete wtemp3; 32310152Satgutier@umich.edu 32410152Satgutier@umich.edu if (h > v) 32510152Satgutier@umich.edu { 32610152Satgutier@umich.edu //the iteration considers only one horizontal link 32710152Satgutier@umich.edu wtemp1 = new Wire(wt, len); // hor 32810152Satgutier@umich.edu wtemp2 = new Wire(wt, len/2); // ver 32910152Satgutier@umich.edu len_temp = len; 33010152Satgutier@umich.edu len /= 2; 33110152Satgutier@umich.edu wtemp3 = 0; 33210152Satgutier@umich.edu h--; 33310152Satgutier@umich.edu option = 0; 33410152Satgutier@umich.edu } 33510152Satgutier@umich.edu else if (v>0 && h>0) 33610152Satgutier@umich.edu { 33710152Satgutier@umich.edu //considers one horizontal link and one vertical link 33810152Satgutier@umich.edu wtemp1 = new Wire(wt, len); // hor 33910152Satgutier@umich.edu wtemp2 = new Wire(wt, ht); // ver 34010152Satgutier@umich.edu wtemp3 = new Wire(wt, len/2); // next hor 34110152Satgutier@umich.edu len_temp = len; 34210152Satgutier@umich.edu ht_temp = ht; 34310152Satgutier@umich.edu len /= 2; 34410152Satgutier@umich.edu ht /= 2; 34510152Satgutier@umich.edu v--; 34610152Satgutier@umich.edu h--; 34710152Satgutier@umich.edu option = 1; 34810152Satgutier@umich.edu } 34910152Satgutier@umich.edu else 35010152Satgutier@umich.edu { 35110152Satgutier@umich.edu // considers only one vertical link 35210152Satgutier@umich.edu assert(h == 0); 35310152Satgutier@umich.edu wtemp1 = new Wire(wt, ht); // ver 35410152Satgutier@umich.edu wtemp2 = new Wire(wt, ht/2); // hor 35510152Satgutier@umich.edu ht_temp = ht; 35610152Satgutier@umich.edu ht /= 2; 35710152Satgutier@umich.edu wtemp3 = 0; 35810152Satgutier@umich.edu v--; 35910152Satgutier@umich.edu option = 2; 36010152Satgutier@umich.edu } 36110152Satgutier@umich.edu 36210152Satgutier@umich.edu delay += wtemp1->delay; 36310152Satgutier@umich.edu power.readOp.dynamic += wtemp1->power.readOp.dynamic; 36410152Satgutier@umich.edu power.searchOp.dynamic += wtemp1->power.readOp.dynamic*wire_bw; 36510152Satgutier@umich.edu power.readOp.leakage += wtemp1->power.readOp.leakage*wire_bw; 36610152Satgutier@umich.edu power.readOp.gate_leakage += wtemp1->power.readOp.gate_leakage*wire_bw; 36710152Satgutier@umich.edu if ((uca_tree == false && option == 2) || search_tree==true) 36810152Satgutier@umich.edu { 36910152Satgutier@umich.edu wire_bw*=2; // wire bandwidth doubles only for vertical branches 37010152Satgutier@umich.edu } 37110152Satgutier@umich.edu 37210152Satgutier@umich.edu if (uca_tree == false) 37310152Satgutier@umich.edu { 37410152Satgutier@umich.edu if (len_temp > wtemp1->repeater_spacing) 37510152Satgutier@umich.edu { 37610152Satgutier@umich.edu s1 = wtemp1->repeater_size; 37710152Satgutier@umich.edu l_eff = wtemp1->repeater_spacing; 37810152Satgutier@umich.edu } 37910152Satgutier@umich.edu else 38010152Satgutier@umich.edu { 38110152Satgutier@umich.edu s1 = (len_temp/wtemp1->repeater_spacing) * wtemp1->repeater_size; 38210152Satgutier@umich.edu l_eff = len_temp; 38310152Satgutier@umich.edu } 38410152Satgutier@umich.edu 38510152Satgutier@umich.edu if (ht_temp > wtemp2->repeater_spacing) 38610152Satgutier@umich.edu { 38710152Satgutier@umich.edu s2 = wtemp2->repeater_size; 38810152Satgutier@umich.edu } 38910152Satgutier@umich.edu else 39010152Satgutier@umich.edu { 39110152Satgutier@umich.edu s2 = (len_temp/wtemp2->repeater_spacing) * wtemp2->repeater_size; 39210152Satgutier@umich.edu } 39310152Satgutier@umich.edu // first level 39410152Satgutier@umich.edu input_nand(s1, s2, l_eff); 39510152Satgutier@umich.edu } 39610152Satgutier@umich.edu 39710152Satgutier@umich.edu 39810152Satgutier@umich.edu if (option != 1) 39910152Satgutier@umich.edu { 40010152Satgutier@umich.edu continue; 40110152Satgutier@umich.edu } 40210152Satgutier@umich.edu 40310152Satgutier@umich.edu // second level 40410152Satgutier@umich.edu delay += wtemp2->delay; 40510152Satgutier@umich.edu power.readOp.dynamic += wtemp2->power.readOp.dynamic; 40610152Satgutier@umich.edu power.searchOp.dynamic += wtemp2->power.readOp.dynamic*wire_bw; 40710152Satgutier@umich.edu power.readOp.leakage += wtemp2->power.readOp.leakage*wire_bw; 40810152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 40910152Satgutier@umich.edu 41010152Satgutier@umich.edu if (uca_tree) 41110152Satgutier@umich.edu { 41210152Satgutier@umich.edu power.readOp.leakage += (wtemp2->power.readOp.leakage*wire_bw); 41310152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 41410152Satgutier@umich.edu } 41510152Satgutier@umich.edu else 41610152Satgutier@umich.edu { 41710152Satgutier@umich.edu power.readOp.leakage += (wtemp2->power.readOp.leakage*wire_bw); 41810152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 41910152Satgutier@umich.edu wire_bw*=2; 42010152Satgutier@umich.edu 42110152Satgutier@umich.edu if (ht_temp > wtemp3->repeater_spacing) 42210152Satgutier@umich.edu { 42310152Satgutier@umich.edu s3 = wtemp3->repeater_size; 42410152Satgutier@umich.edu l_eff = wtemp3->repeater_spacing; 42510152Satgutier@umich.edu } 42610152Satgutier@umich.edu else 42710152Satgutier@umich.edu { 42810152Satgutier@umich.edu s3 = (len_temp/wtemp3->repeater_spacing) * wtemp3->repeater_size; 42910152Satgutier@umich.edu l_eff = ht_temp; 43010152Satgutier@umich.edu } 43110152Satgutier@umich.edu 43210152Satgutier@umich.edu input_nand(s2, s3, l_eff); 43310152Satgutier@umich.edu } 43410152Satgutier@umich.edu } 43510152Satgutier@umich.edu 43610152Satgutier@umich.edu if (wtemp1) delete wtemp1; 43710152Satgutier@umich.edu if (wtemp2) delete wtemp2; 43810152Satgutier@umich.edu if (wtemp3) delete wtemp3; 43910152Satgutier@umich.edu} 44010152Satgutier@umich.edu 44110152Satgutier@umich.edu 44210152Satgutier@umich.edu 44310152Satgutier@umich.edu/* a tristate buffer is used to handle fan-ins 44410152Satgutier@umich.edu * The area of an unbalanced htree (rows != columns) 44510152Satgutier@umich.edu * depends on how data is traversed. 44610152Satgutier@umich.edu * In the following function, if ( no. of rows < no. of columns), 44710152Satgutier@umich.edu * then data first traverse in excess hor. links until vertical 44810152Satgutier@umich.edu * and horizontal nodes are same. 44910152Satgutier@umich.edu * If no. of rows is bigger, then data traverse in 45010152Satgutier@umich.edu * a hor. link followed by a ver. link in a repeated 45110152Satgutier@umich.edu * fashion (similar to a balanced tree) until there are no 45210152Satgutier@umich.edu * hor. links left. After this it goes through the remaining vertical 45310152Satgutier@umich.edu * links. 45410152Satgutier@umich.edu */ 45510152Satgutier@umich.eduvoid Htree2::out_htree() 45610152Satgutier@umich.edu{ 45710152Satgutier@umich.edu //temp var 45810152Satgutier@umich.edu double s1 = 0, s2 = 0, s3 = 0; 45910152Satgutier@umich.edu double l_eff = 0; 46010152Satgutier@umich.edu Wire *wtemp1 = 0, *wtemp2 = 0, *wtemp3 = 0; 46110152Satgutier@umich.edu double len = 0, ht = 0; 46210152Satgutier@umich.edu int option = 0; 46310152Satgutier@umich.edu 46410152Satgutier@umich.edu int h = (int) _log2(ndwl/2); 46510152Satgutier@umich.edu int v = (int) _log2(ndbl/2); 46610152Satgutier@umich.edu double len_temp; 46710152Satgutier@umich.edu double ht_temp; 46810152Satgutier@umich.edu if (uca_tree) 46910152Satgutier@umich.edu { 47010152Satgutier@umich.edu ht_temp = (mat_height*ndbl/2 +/* since uca_tree models interbank tree, mat_height => bank height */ 47110152Satgutier@umich.edu ((add_bits + data_in_bits + data_out_bits + (search_data_in_bits + search_data_out_bits)) * g_tp.wire_outside_mat.pitch * 47210152Satgutier@umich.edu 2 * (1-pow(0.5,h))))/2; 47310152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 47410152Satgutier@umich.edu ((add_bits + data_in_bits + data_out_bits + (search_data_in_bits + search_data_out_bits)) * g_tp.wire_outside_mat.pitch * 47510152Satgutier@umich.edu 2 * (1-pow(0.5,v))))/2; 47610152Satgutier@umich.edu } 47710152Satgutier@umich.edu else 47810152Satgutier@umich.edu { 47910152Satgutier@umich.edu if (ndwl == ndbl) { 48010152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 48110152Satgutier@umich.edu ((add_bits+ (search_data_in_bits + search_data_out_bits)) * (ndbl/2-1) * g_tp.wire_outside_mat.pitch) + 48210152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * h) 48310152Satgutier@umich.edu )/2; 48410152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 48510152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits)) * (ndwl/2-1) * g_tp.wire_outside_mat.pitch) + 48610152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * v))/2; 48710152Satgutier@umich.edu 48810152Satgutier@umich.edu } 48910152Satgutier@umich.edu else if (ndwl > ndbl) { 49010152Satgutier@umich.edu double excess_part = (_log2(ndwl/2) - _log2(ndbl/2)); 49110152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 49210152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits)) * ((ndbl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 49310152Satgutier@umich.edu (data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * 49410152Satgutier@umich.edu (2*(1 - pow(0.5, h-v)) + pow(0.5, v-h) * v))/2; 49510152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 49610152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* (ndwl/2-1) * g_tp.wire_outside_mat.pitch) + 49710152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * v))/2; 49810152Satgutier@umich.edu } 49910152Satgutier@umich.edu else { 50010152Satgutier@umich.edu double excess_part = (_log2(ndbl/2) - _log2(ndwl/2)); 50110152Satgutier@umich.edu ht_temp = ((mat_height*ndbl/2) + 50210152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* ((ndwl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 50310152Satgutier@umich.edu ((data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * h) 50410152Satgutier@umich.edu )/2; 50510152Satgutier@umich.edu len_temp = (mat_width*ndwl/2 + 50610152Satgutier@umich.edu ((add_bits + (search_data_in_bits + search_data_out_bits))* ((ndwl/2-1) + excess_part) * g_tp.wire_outside_mat.pitch) + 50710152Satgutier@umich.edu (data_in_bits + data_out_bits) * g_tp.wire_outside_mat.pitch * (h + 2*(1-pow(0.5, v-h))))/2; 50810152Satgutier@umich.edu } 50910152Satgutier@umich.edu } 51010152Satgutier@umich.edu area.h = ht_temp * 2; 51110152Satgutier@umich.edu area.w = len_temp * 2; 51210152Satgutier@umich.edu delay = 0; 51310152Satgutier@umich.edu power.readOp.dynamic = 0; 51410152Satgutier@umich.edu power.readOp.leakage = 0; 51510152Satgutier@umich.edu power.readOp.gate_leakage = 0; 51610152Satgutier@umich.edu //cout<<"power.readOp.gate_leakage"<<power.readOp.gate_leakage<<endl; 51710152Satgutier@umich.edu len = len_temp; 51810152Satgutier@umich.edu ht = ht_temp/2; 51910152Satgutier@umich.edu 52010152Satgutier@umich.edu while (v > 0 || h > 0) 52110152Satgutier@umich.edu { //finds delay/power of each link in the tree 52210152Satgutier@umich.edu if (wtemp1) delete wtemp1; 52310152Satgutier@umich.edu if (wtemp2) delete wtemp2; 52410152Satgutier@umich.edu if (wtemp3) delete wtemp3; 52510152Satgutier@umich.edu 52610152Satgutier@umich.edu if(h > v) { 52710152Satgutier@umich.edu //the iteration considers only one horizontal link 52810152Satgutier@umich.edu wtemp1 = new Wire(wt, len); // hor 52910152Satgutier@umich.edu wtemp2 = new Wire(wt, len/2); // ver 53010152Satgutier@umich.edu len_temp = len; 53110152Satgutier@umich.edu len /= 2; 53210152Satgutier@umich.edu wtemp3 = 0; 53310152Satgutier@umich.edu h--; 53410152Satgutier@umich.edu option = 0; 53510152Satgutier@umich.edu } 53610152Satgutier@umich.edu else if (v>0 && h>0) { 53710152Satgutier@umich.edu //considers one horizontal link and one vertical link 53810152Satgutier@umich.edu wtemp1 = new Wire(wt, len); // hor 53910152Satgutier@umich.edu wtemp2 = new Wire(wt, ht); // ver 54010152Satgutier@umich.edu wtemp3 = new Wire(wt, len/2); // next hor 54110152Satgutier@umich.edu len_temp = len; 54210152Satgutier@umich.edu ht_temp = ht; 54310152Satgutier@umich.edu len /= 2; 54410152Satgutier@umich.edu ht /= 2; 54510152Satgutier@umich.edu v--; 54610152Satgutier@umich.edu h--; 54710152Satgutier@umich.edu option = 1; 54810152Satgutier@umich.edu } 54910152Satgutier@umich.edu else { 55010152Satgutier@umich.edu // considers only one vertical link 55110152Satgutier@umich.edu assert(h == 0); 55210152Satgutier@umich.edu wtemp1 = new Wire(wt, ht); // hor 55310152Satgutier@umich.edu wtemp2 = new Wire(wt, ht/2); // ver 55410152Satgutier@umich.edu ht_temp = ht; 55510152Satgutier@umich.edu ht /= 2; 55610152Satgutier@umich.edu wtemp3 = 0; 55710152Satgutier@umich.edu v--; 55810152Satgutier@umich.edu option = 2; 55910152Satgutier@umich.edu } 56010152Satgutier@umich.edu delay += wtemp1->delay; 56110152Satgutier@umich.edu power.readOp.dynamic += wtemp1->power.readOp.dynamic; 56210152Satgutier@umich.edu power.searchOp.dynamic += wtemp1->power.readOp.dynamic*init_wire_bw; 56310152Satgutier@umich.edu power.readOp.leakage += wtemp1->power.readOp.leakage*wire_bw; 56410152Satgutier@umich.edu power.readOp.gate_leakage += wtemp1->power.readOp.gate_leakage*wire_bw; 56510152Satgutier@umich.edu //cout<<"power.readOp.gate_leakage"<<power.readOp.gate_leakage<<endl; 56610152Satgutier@umich.edu if ((uca_tree == false && option == 2) || search_tree==true) 56710152Satgutier@umich.edu { 56810152Satgutier@umich.edu wire_bw*=2; 56910152Satgutier@umich.edu } 57010152Satgutier@umich.edu 57110152Satgutier@umich.edu if (uca_tree == false) 57210152Satgutier@umich.edu { 57310152Satgutier@umich.edu if (len_temp > wtemp1->repeater_spacing) 57410152Satgutier@umich.edu { 57510152Satgutier@umich.edu s1 = wtemp1->repeater_size; 57610152Satgutier@umich.edu l_eff = wtemp1->repeater_spacing; 57710152Satgutier@umich.edu } 57810152Satgutier@umich.edu else 57910152Satgutier@umich.edu { 58010152Satgutier@umich.edu s1 = (len_temp/wtemp1->repeater_spacing) * wtemp1->repeater_size; 58110152Satgutier@umich.edu l_eff = len_temp; 58210152Satgutier@umich.edu } 58310152Satgutier@umich.edu if (ht_temp > wtemp2->repeater_spacing) 58410152Satgutier@umich.edu { 58510152Satgutier@umich.edu s2 = wtemp2->repeater_size; 58610152Satgutier@umich.edu } 58710152Satgutier@umich.edu else 58810152Satgutier@umich.edu { 58910152Satgutier@umich.edu s2 = (len_temp/wtemp2->repeater_spacing) * wtemp2->repeater_size; 59010152Satgutier@umich.edu } 59110152Satgutier@umich.edu // first level 59210152Satgutier@umich.edu output_buffer(s1, s2, l_eff); 59310152Satgutier@umich.edu } 59410152Satgutier@umich.edu 59510152Satgutier@umich.edu 59610152Satgutier@umich.edu if (option != 1) 59710152Satgutier@umich.edu { 59810152Satgutier@umich.edu continue; 59910152Satgutier@umich.edu } 60010152Satgutier@umich.edu 60110152Satgutier@umich.edu // second level 60210152Satgutier@umich.edu delay += wtemp2->delay; 60310152Satgutier@umich.edu power.readOp.dynamic += wtemp2->power.readOp.dynamic; 60410152Satgutier@umich.edu power.searchOp.dynamic += wtemp2->power.readOp.dynamic*init_wire_bw; 60510152Satgutier@umich.edu power.readOp.leakage += wtemp2->power.readOp.leakage*wire_bw; 60610152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 60710152Satgutier@umich.edu //cout<<"power.readOp.gate_leakage"<<power.readOp.gate_leakage<<endl; 60810152Satgutier@umich.edu if (uca_tree) 60910152Satgutier@umich.edu { 61010152Satgutier@umich.edu power.readOp.leakage += (wtemp2->power.readOp.leakage*wire_bw); 61110152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 61210152Satgutier@umich.edu } 61310152Satgutier@umich.edu else 61410152Satgutier@umich.edu { 61510152Satgutier@umich.edu power.readOp.leakage += (wtemp2->power.readOp.leakage*wire_bw); 61610152Satgutier@umich.edu power.readOp.gate_leakage += wtemp2->power.readOp.gate_leakage*wire_bw; 61710152Satgutier@umich.edu wire_bw*=2; 61810152Satgutier@umich.edu 61910152Satgutier@umich.edu if (ht_temp > wtemp3->repeater_spacing) 62010152Satgutier@umich.edu { 62110152Satgutier@umich.edu s3 = wtemp3->repeater_size; 62210152Satgutier@umich.edu l_eff = wtemp3->repeater_spacing; 62310152Satgutier@umich.edu } 62410152Satgutier@umich.edu else 62510152Satgutier@umich.edu { 62610152Satgutier@umich.edu s3 = (len_temp/wtemp3->repeater_spacing) * wtemp3->repeater_size; 62710152Satgutier@umich.edu l_eff = ht_temp; 62810152Satgutier@umich.edu } 62910152Satgutier@umich.edu 63010152Satgutier@umich.edu output_buffer(s2, s3, l_eff); 63110152Satgutier@umich.edu } 63210152Satgutier@umich.edu //cout<<"power.readOp.leakage"<<power.readOp.leakage<<endl; 63310152Satgutier@umich.edu //cout<<"power.readOp.gate_leakage"<<power.readOp.gate_leakage<<endl; 63410152Satgutier@umich.edu //cout<<"wtemp2->power.readOp.gate_leakage"<<wtemp2->power.readOp.gate_leakage<<endl; 63510152Satgutier@umich.edu } 63610152Satgutier@umich.edu 63710152Satgutier@umich.edu if (wtemp1) delete wtemp1; 63810152Satgutier@umich.edu if (wtemp2) delete wtemp2; 63910152Satgutier@umich.edu if (wtemp3) delete wtemp3; 64010152Satgutier@umich.edu} 64110152Satgutier@umich.edu 642