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