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