interconnect.cc revision 10152
110152Satgutier@umich.edu/*****************************************************************************
210152Satgutier@umich.edu *                                McPAT
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#include <cassert>
3410152Satgutier@umich.edu#include <iostream>
3510152Satgutier@umich.edu
3610152Satgutier@umich.edu#include "globalvar.h"
3710152Satgutier@umich.edu#include "interconnect.h"
3810152Satgutier@umich.edu#include "wire.h"
3910152Satgutier@umich.edu
4010152Satgutier@umich.eduinterconnect::interconnect(
4110152Satgutier@umich.edu    string name_,
4210152Satgutier@umich.edu    enum Device_ty device_ty_,
4310152Satgutier@umich.edu        double base_w, double base_h,
4410152Satgutier@umich.edu    int data_w, double len,const InputParameter *configure_interface,
4510152Satgutier@umich.edu    int start_wiring_level_,
4610152Satgutier@umich.edu    bool pipelinable_ ,
4710152Satgutier@umich.edu    double route_over_perc_ ,
4810152Satgutier@umich.edu    bool opt_local_,
4910152Satgutier@umich.edu    enum Core_type core_ty_,
5010152Satgutier@umich.edu    enum Wire_type wire_model,
5110152Satgutier@umich.edu    double width_s, double space_s,
5210152Satgutier@umich.edu    TechnologyParameter::DeviceType *dt
5310152Satgutier@umich.edu)
5410152Satgutier@umich.edu :name(name_),
5510152Satgutier@umich.edu  device_ty(device_ty_),
5610152Satgutier@umich.edu  in_rise_time(0),
5710152Satgutier@umich.edu  out_rise_time(0),
5810152Satgutier@umich.edu  base_width(base_w),
5910152Satgutier@umich.edu  base_height(base_h),
6010152Satgutier@umich.edu  data_width(data_w),
6110152Satgutier@umich.edu  wt(wire_model),
6210152Satgutier@umich.edu  width_scaling(width_s),
6310152Satgutier@umich.edu  space_scaling(space_s),
6410152Satgutier@umich.edu  start_wiring_level(start_wiring_level_),
6510152Satgutier@umich.edu  length(len),
6610152Satgutier@umich.edu  //interconnect_latency(1e-12),
6710152Satgutier@umich.edu  //interconnect_throughput(1e-12),
6810152Satgutier@umich.edu  opt_local(opt_local_),
6910152Satgutier@umich.edu  core_ty(core_ty_),
7010152Satgutier@umich.edu  pipelinable(pipelinable_),
7110152Satgutier@umich.edu  route_over_perc(route_over_perc_),
7210152Satgutier@umich.edu  deviceType(dt)
7310152Satgutier@umich.edu{
7410152Satgutier@umich.edu
7510152Satgutier@umich.edu  wt = Global;
7610152Satgutier@umich.edu  l_ip=*configure_interface;
7710152Satgutier@umich.edu  local_result = init_interface(&l_ip);
7810152Satgutier@umich.edu
7910152Satgutier@umich.edu
8010152Satgutier@umich.edu  max_unpipelined_link_delay = 0; //TODO
8110152Satgutier@umich.edu  min_w_nmos = g_tp.min_w_nmos_;
8210152Satgutier@umich.edu  min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio * min_w_nmos;
8310152Satgutier@umich.edu
8410152Satgutier@umich.edu
8510152Satgutier@umich.edu
8610152Satgutier@umich.edu  latency               = l_ip.latency;
8710152Satgutier@umich.edu  throughput            = l_ip.throughput;
8810152Satgutier@umich.edu  latency_overflow=false;
8910152Satgutier@umich.edu  throughput_overflow=false;
9010152Satgutier@umich.edu
9110152Satgutier@umich.edu  /*
9210152Satgutier@umich.edu   * TODO: Add wiring option from semi-global to global automatically
9310152Satgutier@umich.edu   * And directly jump to global if semi-global cannot satisfy timing
9410152Satgutier@umich.edu   * Fat wires only available for global wires, thus
9510152Satgutier@umich.edu   * if signal wiring layer starts from semi-global,
9610152Satgutier@umich.edu   * the next layer up will be global, i.e., semi-global does
9710152Satgutier@umich.edu   * not have fat wires.
9810152Satgutier@umich.edu   */
9910152Satgutier@umich.edu  if (pipelinable == false)
10010152Satgutier@umich.edu  //Non-pipelinable wires, such as bypass logic, care latency
10110152Satgutier@umich.edu  {
10210152Satgutier@umich.edu          compute();
10310152Satgutier@umich.edu          if (opt_for_clk && opt_local)
10410152Satgutier@umich.edu          {
10510152Satgutier@umich.edu                  while (delay > latency && width_scaling<3.0)
10610152Satgutier@umich.edu                  {
10710152Satgutier@umich.edu                          width_scaling *= 2;
10810152Satgutier@umich.edu                          space_scaling *= 2;
10910152Satgutier@umich.edu                          Wire winit(width_scaling, space_scaling);
11010152Satgutier@umich.edu                          compute();
11110152Satgutier@umich.edu                  }
11210152Satgutier@umich.edu                  if (delay > latency)
11310152Satgutier@umich.edu                  {
11410152Satgutier@umich.edu                          latency_overflow=true;
11510152Satgutier@umich.edu                  }
11610152Satgutier@umich.edu          }
11710152Satgutier@umich.edu  }
11810152Satgutier@umich.edu  else //Pipelinable wires, such as bus, does not care latency but throughput
11910152Satgutier@umich.edu  {
12010152Satgutier@umich.edu          /*
12110152Satgutier@umich.edu           * TODO: Add pipe regs power, area, and timing;
12210152Satgutier@umich.edu           * Pipelinable wires optimize latency first.
12310152Satgutier@umich.edu           */
12410152Satgutier@umich.edu          compute();
12510152Satgutier@umich.edu          if (opt_for_clk && opt_local)
12610152Satgutier@umich.edu          {
12710152Satgutier@umich.edu                  while (delay > throughput && width_scaling<3.0)
12810152Satgutier@umich.edu                  {
12910152Satgutier@umich.edu                          width_scaling *= 2;
13010152Satgutier@umich.edu                          space_scaling *= 2;
13110152Satgutier@umich.edu                          Wire winit(width_scaling, space_scaling);
13210152Satgutier@umich.edu                          compute();
13310152Satgutier@umich.edu                  }
13410152Satgutier@umich.edu                  if (delay > throughput)
13510152Satgutier@umich.edu                          // insert pipeline stages
13610152Satgutier@umich.edu                  {
13710152Satgutier@umich.edu                          num_pipe_stages = (int)ceil(delay/throughput);
13810152Satgutier@umich.edu                          assert(num_pipe_stages>0);
13910152Satgutier@umich.edu                          delay = delay/num_pipe_stages + num_pipe_stages*0.05*delay;
14010152Satgutier@umich.edu                  }
14110152Satgutier@umich.edu          }
14210152Satgutier@umich.edu  }
14310152Satgutier@umich.edu
14410152Satgutier@umich.edu  power_bit = power;
14510152Satgutier@umich.edu  power.readOp.dynamic *= data_width;
14610152Satgutier@umich.edu  power.readOp.leakage *= data_width;
14710152Satgutier@umich.edu  power.readOp.gate_leakage *= data_width;
14810152Satgutier@umich.edu  area.set_area(area.get_area()*data_width);
14910152Satgutier@umich.edu  no_device_under_wire_area.h *= data_width;
15010152Satgutier@umich.edu
15110152Satgutier@umich.edu  if (latency_overflow==true)
15210152Satgutier@umich.edu                cout<< "Warning: "<< name <<" wire structure cannot satisfy latency constraint." << endl;
15310152Satgutier@umich.edu
15410152Satgutier@umich.edu
15510152Satgutier@umich.edu  assert(power.readOp.dynamic > 0);
15610152Satgutier@umich.edu  assert(power.readOp.leakage > 0);
15710152Satgutier@umich.edu  assert(power.readOp.gate_leakage > 0);
15810152Satgutier@umich.edu
15910152Satgutier@umich.edu  double long_channel_device_reduction = longer_channel_device_reduction(device_ty,core_ty);
16010152Satgutier@umich.edu
16110152Satgutier@umich.edu  double sckRation = g_tp.sckt_co_eff;
16210152Satgutier@umich.edu  power.readOp.dynamic *= sckRation;
16310152Satgutier@umich.edu  power.writeOp.dynamic *= sckRation;
16410152Satgutier@umich.edu  power.searchOp.dynamic *= sckRation;
16510152Satgutier@umich.edu
16610152Satgutier@umich.edu  power.readOp.longer_channel_leakage =
16710152Satgutier@umich.edu          power.readOp.leakage*long_channel_device_reduction;
16810152Satgutier@umich.edu
16910152Satgutier@umich.edu  if (pipelinable)//Only global wires has the option to choose whether routing over or not
17010152Satgutier@umich.edu          area.set_area(area.get_area()*route_over_perc + no_device_under_wire_area.get_area()*(1-route_over_perc));
17110152Satgutier@umich.edu
17210152Satgutier@umich.edu  Wire wreset();
17310152Satgutier@umich.edu}
17410152Satgutier@umich.edu
17510152Satgutier@umich.edu
17610152Satgutier@umich.edu
17710152Satgutier@umich.eduvoid
17810152Satgutier@umich.eduinterconnect::compute()
17910152Satgutier@umich.edu{
18010152Satgutier@umich.edu
18110152Satgutier@umich.edu  Wire *wtemp1 = 0;
18210152Satgutier@umich.edu  wtemp1 = new Wire(wt, length, 1, width_scaling, space_scaling);
18310152Satgutier@umich.edu  delay = wtemp1->delay;
18410152Satgutier@umich.edu  power.readOp.dynamic = wtemp1->power.readOp.dynamic;
18510152Satgutier@umich.edu  power.readOp.leakage = wtemp1->power.readOp.leakage;
18610152Satgutier@umich.edu  power.readOp.gate_leakage = wtemp1->power.readOp.gate_leakage;
18710152Satgutier@umich.edu
18810152Satgutier@umich.edu  area.set_area(wtemp1->area.get_area());
18910152Satgutier@umich.edu  no_device_under_wire_area.h =  (wtemp1->wire_width + wtemp1->wire_spacing);
19010152Satgutier@umich.edu  no_device_under_wire_area.w = length;
19110152Satgutier@umich.edu
19210152Satgutier@umich.edu  if (wtemp1)
19310152Satgutier@umich.edu   delete wtemp1;
19410152Satgutier@umich.edu
19510152Satgutier@umich.edu}
19610152Satgutier@umich.edu
19710152Satgutier@umich.eduvoid interconnect::leakage_feedback(double temperature)
19810152Satgutier@umich.edu{
19910152Satgutier@umich.edu  l_ip.temp = (unsigned int)round(temperature/10.0)*10;
20010152Satgutier@umich.edu  uca_org_t init_result = init_interface(&l_ip); // init_result is dummy
20110152Satgutier@umich.edu
20210152Satgutier@umich.edu  compute();
20310152Satgutier@umich.edu
20410152Satgutier@umich.edu  power_bit = power;
20510152Satgutier@umich.edu  power.readOp.dynamic *= data_width;
20610152Satgutier@umich.edu  power.readOp.leakage *= data_width;
20710152Satgutier@umich.edu  power.readOp.gate_leakage *= data_width;
20810152Satgutier@umich.edu
20910152Satgutier@umich.edu  assert(power.readOp.dynamic > 0);
21010152Satgutier@umich.edu  assert(power.readOp.leakage > 0);
21110152Satgutier@umich.edu  assert(power.readOp.gate_leakage > 0);
21210152Satgutier@umich.edu
21310152Satgutier@umich.edu  double long_channel_device_reduction = longer_channel_device_reduction(device_ty,core_ty);
21410152Satgutier@umich.edu
21510152Satgutier@umich.edu  double sckRation = g_tp.sckt_co_eff;
21610152Satgutier@umich.edu  power.readOp.dynamic *= sckRation;
21710152Satgutier@umich.edu  power.writeOp.dynamic *= sckRation;
21810152Satgutier@umich.edu  power.searchOp.dynamic *= sckRation;
21910152Satgutier@umich.edu
22010152Satgutier@umich.edu  power.readOp.longer_channel_leakage = power.readOp.leakage*long_channel_device_reduction;
22110152Satgutier@umich.edu}
22210152Satgutier@umich.edu
223