PhotonicClos.cc revision 10448
110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology 210448Snilay@cs.wisc.edu * 310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy 410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal 510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights 610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is 810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions: 910448Snilay@cs.wisc.edu * 1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in 1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software. 1210448Snilay@cs.wisc.edu * 1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1910448Snilay@cs.wisc.edu * THE SOFTWARE. 2010448Snilay@cs.wisc.edu */ 2110448Snilay@cs.wisc.edu 2210447Snilay@cs.wisc.edu#include "model/network/PhotonicClos.h" 2310447Snilay@cs.wisc.edu 2410447Snilay@cs.wisc.edu#include <cmath> 2510447Snilay@cs.wisc.edu 2610447Snilay@cs.wisc.edu#include "model/ModelGen.h" 2710447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalTimingTree.h" 2810447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalNet.h" 2910447Snilay@cs.wisc.edu 3010447Snilay@cs.wisc.edunamespace DSENT 3110447Snilay@cs.wisc.edu{ 3210447Snilay@cs.wisc.edu using std::sqrt; 3310447Snilay@cs.wisc.edu 3410447Snilay@cs.wisc.edu PhotonicClos::PhotonicClos(const String& instance_name_, const TechModel* tech_model_) 3510447Snilay@cs.wisc.edu : ElectricalModel(instance_name_, tech_model_) 3610447Snilay@cs.wisc.edu { 3710447Snilay@cs.wisc.edu initParameters(); 3810447Snilay@cs.wisc.edu initProperties(); 3910447Snilay@cs.wisc.edu } 4010447Snilay@cs.wisc.edu 4110447Snilay@cs.wisc.edu PhotonicClos::~PhotonicClos() 4210447Snilay@cs.wisc.edu {} 4310447Snilay@cs.wisc.edu 4410447Snilay@cs.wisc.edu void PhotonicClos::initParameters() 4510447Snilay@cs.wisc.edu { 4610447Snilay@cs.wisc.edu // Clock Frequency 4710447Snilay@cs.wisc.edu addParameterName("Frequency"); 4810447Snilay@cs.wisc.edu // Physical Parameters 4910447Snilay@cs.wisc.edu addParameterName("NumberInputSites"); 5010447Snilay@cs.wisc.edu addParameterName("NumberOutputSites"); 5110447Snilay@cs.wisc.edu addParameterName("NumberBitsPerFlit"); 5210447Snilay@cs.wisc.edu // Number of each type of routers 5310447Snilay@cs.wisc.edu addParameterName("NumberIngressRouters"); 5410447Snilay@cs.wisc.edu addParameterName("NumberMiddleRouters"); 5510447Snilay@cs.wisc.edu addParameterName("NumberEgressRouters"); 5610447Snilay@cs.wisc.edu // Optical link parameters 5710447Snilay@cs.wisc.edu addParameterName("SWSR->LinkDataRate"); 5810447Snilay@cs.wisc.edu addParameterName("SWSR->LaserType"); 5910447Snilay@cs.wisc.edu addParameterName("SWSR->RingTuningMethod"); 6010447Snilay@cs.wisc.edu // Router parameters 6110447Snilay@cs.wisc.edu addParameterName("Router->NumberVirtualNetworks"); 6210447Snilay@cs.wisc.edu addParameterName("Router->NumberVirtualChannelsPerVirtualNetwork"); 6310447Snilay@cs.wisc.edu addParameterName("Router->NumberBuffersPerVirtualChannel"); 6410447Snilay@cs.wisc.edu addParameterName("Router->InputPort->BufferModel"); 6510447Snilay@cs.wisc.edu addParameterName("Router->CrossbarModel"); 6610447Snilay@cs.wisc.edu addParameterName("Router->SwitchAllocator->ArbiterModel"); 6710447Snilay@cs.wisc.edu addParameterName("Router->ClockTreeModel"); 6810447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->NumberLevels"); 6910447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireLayer"); 7010447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireWidthMultiplier"); 7110447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireSpacingMultiplier", 3.0); 7210447Snilay@cs.wisc.edu // Link parameters 7310447Snilay@cs.wisc.edu addParameterName("Link->WireLayer"); 7410447Snilay@cs.wisc.edu addParameterName("Link->WireWidthMultiplier"); 7510447Snilay@cs.wisc.edu addParameterName("Link->WireSpacingMultiplier"); 7610447Snilay@cs.wisc.edu return; 7710447Snilay@cs.wisc.edu } 7810447Snilay@cs.wisc.edu 7910447Snilay@cs.wisc.edu void PhotonicClos::initProperties() 8010447Snilay@cs.wisc.edu { 8110447Snilay@cs.wisc.edu addPropertyName("InputSitePitch"); 8210447Snilay@cs.wisc.edu addPropertyName("OutputSitePitch"); 8310447Snilay@cs.wisc.edu addPropertyName("SWSR->OptUtil", 1.0); 8410447Snilay@cs.wisc.edu return; 8510447Snilay@cs.wisc.edu } 8610447Snilay@cs.wisc.edu 8710447Snilay@cs.wisc.edu PhotonicClos* PhotonicClos::clone() const 8810447Snilay@cs.wisc.edu { 8910447Snilay@cs.wisc.edu // TODO 9010447Snilay@cs.wisc.edu return NULL; 9110447Snilay@cs.wisc.edu } 9210447Snilay@cs.wisc.edu 9310447Snilay@cs.wisc.edu void PhotonicClos::constructModel() 9410447Snilay@cs.wisc.edu { 9510447Snilay@cs.wisc.edu // Get input parameters 9610447Snilay@cs.wisc.edu double clock_freq = getParameter("Frequency"); 9710447Snilay@cs.wisc.edu unsigned int number_input_sites = getParameter("NumberInputSites").toUInt(); 9810447Snilay@cs.wisc.edu unsigned int number_output_sites = getParameter("NumberOutputSites").toUInt(); 9910447Snilay@cs.wisc.edu unsigned int number_bits_per_flit = getParameter("NumberBitsPerFlit").toUInt(); 10010447Snilay@cs.wisc.edu unsigned int number_ingress_routers = getParameter("NumberIngressRouters").toUInt(); 10110447Snilay@cs.wisc.edu unsigned int number_middle_routers = getParameter("NumberMiddleRouters").toUInt(); 10210447Snilay@cs.wisc.edu unsigned int number_egress_routers = getParameter("NumberEgressRouters").toUInt(); 10310447Snilay@cs.wisc.edu 10410447Snilay@cs.wisc.edu ASSERT(clock_freq > 0, "[Error] " + getInstanceName() + 10510447Snilay@cs.wisc.edu " -> Clock frequency must be > 0!"); 10610447Snilay@cs.wisc.edu ASSERT(number_input_sites > 0, "[Error] " + getInstanceName() + 10710447Snilay@cs.wisc.edu " -> Number of input sites must be > 0!"); 10810447Snilay@cs.wisc.edu ASSERT(number_output_sites > 0, "[Error] " + getInstanceName() + 10910447Snilay@cs.wisc.edu " -> Number of output sites must be > 0!"); 11010447Snilay@cs.wisc.edu ASSERT(number_bits_per_flit > 0, "[Error] " + getInstanceName() + 11110447Snilay@cs.wisc.edu " -> Number of bits per flit must be > 0!"); 11210447Snilay@cs.wisc.edu ASSERT(number_ingress_routers > 0, "[Error] " + getInstanceName() + 11310447Snilay@cs.wisc.edu " -> Number of ingress routers must be > 0!"); 11410447Snilay@cs.wisc.edu ASSERT(number_middle_routers > 0, "[Error] " + getInstanceName() + 11510447Snilay@cs.wisc.edu " -> Number of middle routers must be > 0!"); 11610447Snilay@cs.wisc.edu ASSERT(number_egress_routers > 0, "[Error] " + getInstanceName() + 11710447Snilay@cs.wisc.edu " -> Number of egress routers must be > 0!"); 11810447Snilay@cs.wisc.edu 11910447Snilay@cs.wisc.edu // Get input parameters that will be forwarded to the sub instances 12010447Snilay@cs.wisc.edu const String& swsr_link_data_rate = getParameter("SWSR->LinkDataRate"); 12110447Snilay@cs.wisc.edu const String& swsr_laser_type = getParameter("SWSR->LaserType"); 12210447Snilay@cs.wisc.edu const String& swsr_ring_tuning_method = getParameter("SWSR->RingTuningMethod"); 12310447Snilay@cs.wisc.edu const String& router_number_vns = getParameter("Router->NumberVirtualNetworks"); 12410447Snilay@cs.wisc.edu const String& router_number_vcs_per_vn = getParameter("Router->NumberVirtualChannelsPerVirtualNetwork"); 12510447Snilay@cs.wisc.edu const String& router_number_bufs_per_vc = getParameter("Router->NumberBuffersPerVirtualChannel"); 12610447Snilay@cs.wisc.edu const String& router_buffer_model = getParameter("Router->InputPort->BufferModel"); 12710447Snilay@cs.wisc.edu const String& router_crossbar_model = getParameter("Router->CrossbarModel"); 12810447Snilay@cs.wisc.edu const String& link_wire_layer = getParameter("Link->WireLayer"); 12910447Snilay@cs.wisc.edu const String& link_wire_width_multiplier = getParameter("Link->WireWidthMultiplier"); 13010447Snilay@cs.wisc.edu const String& link_wire_spacing_multiplier = getParameter("Link->WireSpacingMultiplier"); 13110447Snilay@cs.wisc.edu 13210447Snilay@cs.wisc.edu // Calculate properties from input parameters 13310447Snilay@cs.wisc.edu unsigned int ingress_router_number_input_ports = number_input_sites / number_ingress_routers; 13410447Snilay@cs.wisc.edu unsigned int ingress_router_number_output_ports = number_middle_routers; 13510447Snilay@cs.wisc.edu unsigned int middle_router_number_input_ports = number_ingress_routers; 13610447Snilay@cs.wisc.edu unsigned int middle_router_number_output_ports = number_egress_routers; 13710447Snilay@cs.wisc.edu unsigned int egress_router_number_input_ports = number_middle_routers; 13810447Snilay@cs.wisc.edu unsigned int egress_router_number_output_ports = number_output_sites / number_egress_routers; 13910447Snilay@cs.wisc.edu unsigned int number_input_to_ingress_links = number_input_sites; 14010447Snilay@cs.wisc.edu unsigned int number_ingress_to_middle_links = number_ingress_routers * number_middle_routers; 14110447Snilay@cs.wisc.edu unsigned int number_middle_to_egress_links = number_middle_routers * number_egress_routers; 14210447Snilay@cs.wisc.edu unsigned int number_egress_to_output_links = number_output_sites; 14310447Snilay@cs.wisc.edu 14410447Snilay@cs.wisc.edu getGenProperties()->set("NumberInputSitesPerIngressRouter", ingress_router_number_input_ports); 14510447Snilay@cs.wisc.edu getGenProperties()->set("NumberOutputSitesPerEgressRouter", egress_router_number_output_ports); 14610447Snilay@cs.wisc.edu getGenProperties()->set("IngressRouter->NumberInputPorts", ingress_router_number_input_ports); 14710447Snilay@cs.wisc.edu getGenProperties()->set("IngressRouter->NumberOutputPorts", ingress_router_number_output_ports); 14810447Snilay@cs.wisc.edu getGenProperties()->set("MiddleRouter->NumberInputPorts", middle_router_number_input_ports); 14910447Snilay@cs.wisc.edu getGenProperties()->set("MiddleRouter->NumberOutputPorts", middle_router_number_output_ports); 15010447Snilay@cs.wisc.edu getGenProperties()->set("EgressRouter->NumberInputPorts", egress_router_number_input_ports); 15110447Snilay@cs.wisc.edu getGenProperties()->set("EgressRouter->NumberOutputPorts", egress_router_number_output_ports); 15210447Snilay@cs.wisc.edu 15310447Snilay@cs.wisc.edu // Create ports 15410447Snilay@cs.wisc.edu createInputPort("CK"); 15510447Snilay@cs.wisc.edu 15610447Snilay@cs.wisc.edu // Init ingress router 15710447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)ModelGen::createModel("Router", "IngressRouter", getTechModel()); 15810447Snilay@cs.wisc.edu ingress_router->setParameter("NumberInputPorts", ingress_router_number_input_ports); 15910447Snilay@cs.wisc.edu ingress_router->setParameter("NumberOutputPorts", ingress_router_number_output_ports); 16010447Snilay@cs.wisc.edu ingress_router->setParameter("NumberVirtualNetworks", router_number_vns); 16110447Snilay@cs.wisc.edu ingress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 16210447Snilay@cs.wisc.edu ingress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 16310447Snilay@cs.wisc.edu ingress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 16410447Snilay@cs.wisc.edu ingress_router->setParameter("InputPort->BufferModel", router_buffer_model); 16510447Snilay@cs.wisc.edu ingress_router->setParameter("CrossbarModel", router_crossbar_model); 16610447Snilay@cs.wisc.edu ingress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 16710447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 16810447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 16910447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 17010447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 17110447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 17210447Snilay@cs.wisc.edu ingress_router->construct(); 17310447Snilay@cs.wisc.edu // Init middle routers 17410447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)ModelGen::createModel("Router", "MiddleRouter", getTechModel()); 17510447Snilay@cs.wisc.edu middle_router->setParameter("NumberInputPorts", middle_router_number_input_ports); 17610447Snilay@cs.wisc.edu middle_router->setParameter("NumberOutputPorts", middle_router_number_output_ports); 17710447Snilay@cs.wisc.edu middle_router->setParameter("NumberVirtualNetworks", router_number_vns); 17810447Snilay@cs.wisc.edu middle_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 17910447Snilay@cs.wisc.edu middle_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 18010447Snilay@cs.wisc.edu middle_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 18110447Snilay@cs.wisc.edu middle_router->setParameter("InputPort->BufferModel", router_buffer_model); 18210447Snilay@cs.wisc.edu middle_router->setParameter("CrossbarModel", router_crossbar_model); 18310447Snilay@cs.wisc.edu middle_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 18410447Snilay@cs.wisc.edu middle_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 18510447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 18610447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 18710447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 18810447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 18910447Snilay@cs.wisc.edu middle_router->construct(); 19010447Snilay@cs.wisc.edu // Init egress routers 19110447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)ModelGen::createModel("Router", "EgressRouter", getTechModel()); 19210447Snilay@cs.wisc.edu egress_router->setParameter("NumberInputPorts", egress_router_number_input_ports); 19310447Snilay@cs.wisc.edu egress_router->setParameter("NumberOutputPorts", egress_router_number_output_ports); 19410447Snilay@cs.wisc.edu egress_router->setParameter("NumberVirtualNetworks", router_number_vns); 19510447Snilay@cs.wisc.edu egress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 19610447Snilay@cs.wisc.edu egress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 19710447Snilay@cs.wisc.edu egress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 19810447Snilay@cs.wisc.edu egress_router->setParameter("InputPort->BufferModel", router_buffer_model); 19910447Snilay@cs.wisc.edu egress_router->setParameter("CrossbarModel", router_crossbar_model); 20010447Snilay@cs.wisc.edu egress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 20110447Snilay@cs.wisc.edu egress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 20210447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 20310447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 20410447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 20510447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 20610447Snilay@cs.wisc.edu egress_router->construct(); 20710447Snilay@cs.wisc.edu // Init input to ingress link 20810447Snilay@cs.wisc.edu ElectricalModel* input_to_ingress_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "InputToIngressLink", getTechModel()); 20910447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("NumberBits", number_bits_per_flit); 21010447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireLayer", link_wire_layer); 21110447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 21210447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 21310447Snilay@cs.wisc.edu input_to_ingress_link->construct(); 21410447Snilay@cs.wisc.edu // Init ingress to middle link 21510447Snilay@cs.wisc.edu ElectricalModel* ingress_to_middle_link = (ElectricalModel*)ModelGen::createModel("SWSRLink", "IngressToMiddleLink", getTechModel()); 21610447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("NumberBits", number_bits_per_flit); 21710447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("CoreDataRate", clock_freq); 21810447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("LinkDataRate", swsr_link_data_rate); 21910447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("LaserType", swsr_laser_type); 22010447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("RingTuningMethod", swsr_ring_tuning_method); 22110447Snilay@cs.wisc.edu ingress_to_middle_link->construct(); 22210447Snilay@cs.wisc.edu // Init middle to egress link 22310447Snilay@cs.wisc.edu ElectricalModel* middle_to_egress_link = (ElectricalModel*)ModelGen::createModel("SWSRLink", "MiddleToEgressLink", getTechModel()); 22410447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("NumberBits", number_bits_per_flit); 22510447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("CoreDataRate", clock_freq); 22610447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("LinkDataRate", swsr_link_data_rate); 22710447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("LaserType", swsr_laser_type); 22810447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("RingTuningMethod", swsr_ring_tuning_method); 22910447Snilay@cs.wisc.edu middle_to_egress_link->construct(); 23010447Snilay@cs.wisc.edu // Init egress to output link 23110447Snilay@cs.wisc.edu ElectricalModel* egress_to_output_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "EgressToOutputLink", getTechModel()); 23210447Snilay@cs.wisc.edu egress_to_output_link->setParameter("NumberBits", number_bits_per_flit); 23310447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireLayer", link_wire_layer); 23410447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 23510447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 23610447Snilay@cs.wisc.edu egress_to_output_link->construct(); 23710447Snilay@cs.wisc.edu 23810447Snilay@cs.wisc.edu // Connect ports 23910447Snilay@cs.wisc.edu createNet("InputToIngressLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 24010447Snilay@cs.wisc.edu createNet("InputToIngressLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 24110447Snilay@cs.wisc.edu portConnect(input_to_ingress_link, "In", "InputToIngressLink_In"); 24210447Snilay@cs.wisc.edu portConnect(input_to_ingress_link, "Out", "InputToIngressLink_Out"); 24310447Snilay@cs.wisc.edu 24410447Snilay@cs.wisc.edu createNet("IngressToMiddleLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 24510447Snilay@cs.wisc.edu createNet("IngressToMiddleLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 24610447Snilay@cs.wisc.edu portConnect(ingress_to_middle_link, "In", "IngressToMiddleLink_In"); 24710447Snilay@cs.wisc.edu portConnect(ingress_to_middle_link, "Out", "IngressToMiddleLink_Out"); 24810447Snilay@cs.wisc.edu 24910447Snilay@cs.wisc.edu createNet("MiddleToEgressLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 25010447Snilay@cs.wisc.edu createNet("MiddleToEgressLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 25110447Snilay@cs.wisc.edu portConnect(middle_to_egress_link, "In", "MiddleToEgressLink_In"); 25210447Snilay@cs.wisc.edu portConnect(middle_to_egress_link, "Out", "MiddleToEgressLink_Out"); 25310447Snilay@cs.wisc.edu 25410447Snilay@cs.wisc.edu createNet("EgressToOutputLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 25510447Snilay@cs.wisc.edu createNet("EgressToOutputLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 25610447Snilay@cs.wisc.edu portConnect(egress_to_output_link, "In", "EgressToOutputLink_In"); 25710447Snilay@cs.wisc.edu portConnect(egress_to_output_link, "Out", "EgressToOutputLink_Out"); 25810447Snilay@cs.wisc.edu 25910447Snilay@cs.wisc.edu portConnect(ingress_router, "CK", "CK"); 26010447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 26110447Snilay@cs.wisc.edu { 26210447Snilay@cs.wisc.edu createNet("IngressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 26310447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 26410447Snilay@cs.wisc.edu assignVirtualFanout("IngressRouter_In" + (String)i, makeNetIndex(j), "InputToIngressLink_Out", makeNetIndex(j)); 26510447Snilay@cs.wisc.edu portConnect(ingress_router, "FlitIn" + (String)i, "IngressRouter_In" + (String)i); 26610447Snilay@cs.wisc.edu } 26710447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_output_ports; ++i) 26810447Snilay@cs.wisc.edu { 26910447Snilay@cs.wisc.edu // VFI 27010447Snilay@cs.wisc.edu portConnect(ingress_router, "FlitOut" + (String)i, "IngressToMiddleLink_In"); 27110447Snilay@cs.wisc.edu } 27210447Snilay@cs.wisc.edu portConnect(middle_router, "CK", "CK"); 27310447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 27410447Snilay@cs.wisc.edu { 27510447Snilay@cs.wisc.edu createNet("MiddleRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 27610447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 27710447Snilay@cs.wisc.edu assignVirtualFanout("MiddleRouter_In" + (String)i, makeNetIndex(j), "IngressToMiddleLink_Out", makeNetIndex(j)); 27810447Snilay@cs.wisc.edu portConnect(middle_router, "FlitIn" + (String)i, "MiddleRouter_In" + (String)i); 27910447Snilay@cs.wisc.edu } 28010447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_output_ports; ++i) 28110447Snilay@cs.wisc.edu { 28210447Snilay@cs.wisc.edu // VFI 28310447Snilay@cs.wisc.edu portConnect(middle_router, "FlitOut" + (String)i, "MiddleToEgressLink_In"); 28410447Snilay@cs.wisc.edu } 28510447Snilay@cs.wisc.edu portConnect(egress_router, "CK", "CK"); 28610447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 28710447Snilay@cs.wisc.edu { 28810447Snilay@cs.wisc.edu createNet("EgressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 28910447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 29010447Snilay@cs.wisc.edu assignVirtualFanout("EgressRouter_In" + (String)i, makeNetIndex(j), "MiddleToEgressLink_Out", makeNetIndex(j)); 29110447Snilay@cs.wisc.edu portConnect(egress_router, "FlitIn" + (String)i, "EgressRouter_In" + (String)i); 29210447Snilay@cs.wisc.edu } 29310447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_output_ports; ++i) 29410447Snilay@cs.wisc.edu { 29510447Snilay@cs.wisc.edu // VFI 29610447Snilay@cs.wisc.edu portConnect(egress_router, "FlitOut" + (String)i, "EgressToOutputLink_In"); 29710447Snilay@cs.wisc.edu } 29810447Snilay@cs.wisc.edu 29910447Snilay@cs.wisc.edu // Create area, power, and event results 30010447Snilay@cs.wisc.edu createElectricalResults(); 30110447Snilay@cs.wisc.edu createElectricalEventResult("AvgUnicast"); 30210447Snilay@cs.wisc.edu createElectricalEventResult("AvgBroadcast"); 30310447Snilay@cs.wisc.edu addNddPowerResult(new Result("Laser")); 30410447Snilay@cs.wisc.edu addNddPowerResult(new Result("RingTuning")); 30510447Snilay@cs.wisc.edu addAreaResult(new Result("Photonic")); 30610447Snilay@cs.wisc.edu 30710447Snilay@cs.wisc.edu // Add all instances 30810447Snilay@cs.wisc.edu addSubInstances(ingress_router, number_ingress_routers); 30910447Snilay@cs.wisc.edu addElectricalSubResults(ingress_router, number_ingress_routers); 31010447Snilay@cs.wisc.edu addSubInstances(middle_router, number_middle_routers); 31110447Snilay@cs.wisc.edu addElectricalSubResults(middle_router, number_middle_routers); 31210447Snilay@cs.wisc.edu addSubInstances(egress_router, number_egress_routers); 31310447Snilay@cs.wisc.edu addElectricalSubResults(egress_router, number_egress_routers); 31410447Snilay@cs.wisc.edu addSubInstances(input_to_ingress_link, number_input_to_ingress_links); 31510447Snilay@cs.wisc.edu addElectricalSubResults(input_to_ingress_link, number_input_to_ingress_links); 31610447Snilay@cs.wisc.edu addSubInstances(ingress_to_middle_link, number_ingress_to_middle_links); 31710447Snilay@cs.wisc.edu addElectricalSubResults(ingress_to_middle_link, number_ingress_to_middle_links); 31810447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(ingress_to_middle_link->getAreaResult("Photonic"), "IngressToMiddleLink", number_ingress_to_middle_links); 31910447Snilay@cs.wisc.edu getNddPowerResult("Laser")->addSubResult(ingress_to_middle_link->getNddPowerResult("Laser"), "IngressToMiddleLink", number_ingress_to_middle_links); 32010447Snilay@cs.wisc.edu getNddPowerResult("RingTuning")->addSubResult(ingress_to_middle_link->getNddPowerResult("RingTuning"), "IngressToMiddleLink", number_ingress_to_middle_links); 32110447Snilay@cs.wisc.edu addSubInstances(middle_to_egress_link, number_middle_to_egress_links); 32210447Snilay@cs.wisc.edu addElectricalSubResults(middle_to_egress_link, number_middle_to_egress_links); 32310447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(middle_to_egress_link->getAreaResult("Photonic"), "MiddletoEgressLink", number_middle_to_egress_links); 32410447Snilay@cs.wisc.edu getNddPowerResult("Laser")->addSubResult(middle_to_egress_link->getNddPowerResult("Laser"), "MiddleToEgressLink", number_middle_to_egress_links); 32510447Snilay@cs.wisc.edu getNddPowerResult("RingTuning")->addSubResult(middle_to_egress_link->getNddPowerResult("RingTuning"), "MiddleToEgressLink", number_middle_to_egress_links); 32610447Snilay@cs.wisc.edu addSubInstances(egress_to_output_link, number_egress_to_output_links); 32710447Snilay@cs.wisc.edu addElectricalSubResults(egress_to_output_link, number_egress_to_output_links); 32810447Snilay@cs.wisc.edu 32910447Snilay@cs.wisc.edu // Update unicast event 33010447Snilay@cs.wisc.edu Result* avg_unicast_event = getEventResult("AvgUnicast"); 33110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 33210447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("WriteBuffer")) 33310447Snilay@cs.wisc.edu { 33410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 33510447Snilay@cs.wisc.edu } 33610447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("ReadBuffer")) 33710447Snilay@cs.wisc.edu { 33810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 33910447Snilay@cs.wisc.edu } 34010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 34110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 34210447Snilay@cs.wisc.edu if(middle_router->hasEventResult("WriteBuffer")) 34310447Snilay@cs.wisc.edu { 34410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 34510447Snilay@cs.wisc.edu } 34610447Snilay@cs.wisc.edu if(middle_router->hasEventResult("ReadBuffer")) 34710447Snilay@cs.wisc.edu { 34810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 34910447Snilay@cs.wisc.edu } 35010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 35110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", 1.0); 35210447Snilay@cs.wisc.edu if(egress_router->hasEventResult("WriteBuffer")) 35310447Snilay@cs.wisc.edu { 35410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", 1.0); 35510447Snilay@cs.wisc.edu } 35610447Snilay@cs.wisc.edu if(egress_router->hasEventResult("ReadBuffer")) 35710447Snilay@cs.wisc.edu { 35810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", 1.0); 35910447Snilay@cs.wisc.edu } 36010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast1"), "EgressRouter", 1.0); 36110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", 1.0); 36210447Snilay@cs.wisc.edu 36310447Snilay@cs.wisc.edu // Update broadcast event 36410447Snilay@cs.wisc.edu Result* avg_broadcast_event = getEventResult("AvgBroadcast"); 36510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 36610447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("WriteBuffer")) 36710447Snilay@cs.wisc.edu { 36810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 36910447Snilay@cs.wisc.edu } 37010447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("ReadBuffer")) 37110447Snilay@cs.wisc.edu { 37210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 37310447Snilay@cs.wisc.edu } 37410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 37510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 37610447Snilay@cs.wisc.edu if(middle_router->hasEventResult("WriteBuffer")) 37710447Snilay@cs.wisc.edu { 37810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 37910447Snilay@cs.wisc.edu } 38010447Snilay@cs.wisc.edu if(middle_router->hasEventResult("ReadBuffer")) 38110447Snilay@cs.wisc.edu { 38210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 38310447Snilay@cs.wisc.edu } 38410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 38510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", number_egress_routers); 38610447Snilay@cs.wisc.edu if(egress_router->hasEventResult("WriteBuffer")) 38710447Snilay@cs.wisc.edu { 38810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", number_egress_routers); 38910447Snilay@cs.wisc.edu } 39010447Snilay@cs.wisc.edu if(egress_router->hasEventResult("ReadBuffer")) 39110447Snilay@cs.wisc.edu { 39210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", number_egress_routers); 39310447Snilay@cs.wisc.edu } 39410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast" + (String)number_egress_routers), "EgressRouter", 1.0); 39510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", number_output_sites); 39610447Snilay@cs.wisc.edu return; 39710447Snilay@cs.wisc.edu } 39810447Snilay@cs.wisc.edu 39910447Snilay@cs.wisc.edu void PhotonicClos::updateModel() 40010447Snilay@cs.wisc.edu { 40110447Snilay@cs.wisc.edu // Assumes waveguide runs adjacent to ingress and egress routers 40210447Snilay@cs.wisc.edu // Assumes input sites belonging to each ingress router are centered around the ingress router 40310447Snilay@cs.wisc.edu // Assumes middle routers are distributed around the chip adjacent to the main waveguide 40410447Snilay@cs.wisc.edu // Assumes output sites belonging to each egress router are centered around the egress router 40510447Snilay@cs.wisc.edu 40610447Snilay@cs.wisc.edu // Get properties 40710447Snilay@cs.wisc.edu double input_site_pitch = getProperty("InputSitePitch").toDouble(); 40810447Snilay@cs.wisc.edu double output_site_pitch = getProperty("OutputSitePitch").toDouble(); 40910447Snilay@cs.wisc.edu double clock_freq = getParameter("Frequency"); 41010447Snilay@cs.wisc.edu const double swsr_opt_util = getProperty("SWSR->OptUtil"); 41110447Snilay@cs.wisc.edu 41210447Snilay@cs.wisc.edu ASSERT(input_site_pitch > 0, "[Error] " + getInstanceName() + 41310447Snilay@cs.wisc.edu " -> Input site pitch must be > 0!"); 41410447Snilay@cs.wisc.edu ASSERT(output_site_pitch > 0, "[Error] " + getInstanceName() + 41510447Snilay@cs.wisc.edu " -> Output site pitch must be > 0!"); 41610447Snilay@cs.wisc.edu 41710447Snilay@cs.wisc.edu unsigned int number_input_sites_per_ingress_router = getGenProperties()->get("NumberInputSitesPerIngressRouter"); 41810447Snilay@cs.wisc.edu unsigned int number_ingress_routers = getParameter("NumberIngressRouters"); 41910447Snilay@cs.wisc.edu unsigned int number_output_sites_per_egress_router = getGenProperties()->get("NumberOutputSitesPerEgressRouter"); 42010447Snilay@cs.wisc.edu unsigned int number_egress_routers = getParameter("NumberEgressRouters"); 42110447Snilay@cs.wisc.edu double delay = 1.0 / clock_freq; 42210447Snilay@cs.wisc.edu 42310447Snilay@cs.wisc.edu //Calculate the length of the waveguide 42410447Snilay@cs.wisc.edu double input_to_ingress_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) - 1.0); 42510447Snilay@cs.wisc.edu double input_to_ingress_link_delay = delay * 0.8; 42610447Snilay@cs.wisc.edu double ingress_to_middle_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) * number_ingress_routers); 42710447Snilay@cs.wisc.edu double middle_to_egress_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) * number_egress_routers); 42810447Snilay@cs.wisc.edu double egress_to_output_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) - 1.0); 42910447Snilay@cs.wisc.edu double egress_to_output_link_delay = delay * 0.8; 43010447Snilay@cs.wisc.edu double ingress_router_delay = delay; 43110447Snilay@cs.wisc.edu double middle_router_delay = delay; 43210447Snilay@cs.wisc.edu double egress_router_delay = delay; 43310447Snilay@cs.wisc.edu 43410447Snilay@cs.wisc.edu Model* input_to_ingress_link = getSubInstance("InputToIngressLink"); 43510447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("WireLength", input_to_ingress_link_length); 43610447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("Delay", input_to_ingress_link_delay); 43710447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("IsKeepParity", "TRUE"); 43810447Snilay@cs.wisc.edu input_to_ingress_link->update(); 43910447Snilay@cs.wisc.edu 44010447Snilay@cs.wisc.edu Model* ingress_to_middle_link = getSubInstance("IngressToMiddleLink"); 44110447Snilay@cs.wisc.edu ingress_to_middle_link->setProperty("Length", ingress_to_middle_link_length); 44210447Snilay@cs.wisc.edu ingress_to_middle_link->setProperty("OptUtil", swsr_opt_util); 44310447Snilay@cs.wisc.edu ingress_to_middle_link->update(); 44410447Snilay@cs.wisc.edu 44510447Snilay@cs.wisc.edu Model* middle_to_egress_link = getSubInstance("MiddleToEgressLink"); 44610447Snilay@cs.wisc.edu middle_to_egress_link->setProperty("Length", middle_to_egress_link_length); 44710447Snilay@cs.wisc.edu middle_to_egress_link->setProperty("OptUtil", swsr_opt_util); 44810447Snilay@cs.wisc.edu middle_to_egress_link->update(); 44910447Snilay@cs.wisc.edu 45010447Snilay@cs.wisc.edu Model* egress_to_output_link = getSubInstance("EgressToOutputLink"); 45110447Snilay@cs.wisc.edu egress_to_output_link->setProperty("WireLength", egress_to_output_link_length); 45210447Snilay@cs.wisc.edu egress_to_output_link->setProperty("Delay", egress_to_output_link_delay); 45310447Snilay@cs.wisc.edu egress_to_output_link->setProperty("IsKeepParity", "TRUE"); 45410447Snilay@cs.wisc.edu egress_to_output_link->update(); 45510447Snilay@cs.wisc.edu 45610447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 45710447Snilay@cs.wisc.edu ingress_router->update(); 45810447Snilay@cs.wisc.edu ElectricalTimingTree ingress_router_timing_tree("IngressRouter", ingress_router); 45910447Snilay@cs.wisc.edu ingress_router_timing_tree.performTimingOpt(ingress_router->getNet("CK"), ingress_router_delay); 46010447Snilay@cs.wisc.edu 46110447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 46210447Snilay@cs.wisc.edu middle_router->update(); 46310447Snilay@cs.wisc.edu ElectricalTimingTree middle_router_timing_tree("MiddleRouter", middle_router); 46410447Snilay@cs.wisc.edu middle_router_timing_tree.performTimingOpt(middle_router->getNet("CK"), middle_router_delay); 46510447Snilay@cs.wisc.edu 46610447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 46710447Snilay@cs.wisc.edu egress_router->update(); 46810447Snilay@cs.wisc.edu ElectricalTimingTree egress_router_timing_tree("EgressRouter", egress_router); 46910447Snilay@cs.wisc.edu egress_router_timing_tree.performTimingOpt(egress_router->getNet("CK"), egress_router_delay); 47010447Snilay@cs.wisc.edu 47110447Snilay@cs.wisc.edu return; 47210447Snilay@cs.wisc.edu } 47310447Snilay@cs.wisc.edu 47410447Snilay@cs.wisc.edu void PhotonicClos::propagateTransitionInfo() 47510447Snilay@cs.wisc.edu { 47610447Snilay@cs.wisc.edu // Get parameters 47710447Snilay@cs.wisc.edu double clock_freq = getParameter("Frequency"); 47810447Snilay@cs.wisc.edu double swsr_link_data_rate = getParameter("SWSR->LinkDataRate"); 47910447Snilay@cs.wisc.edu 48010447Snilay@cs.wisc.edu // Get properties 48110447Snilay@cs.wisc.edu unsigned int ingress_router_number_input_ports = getGenProperties()->get("IngressRouter->NumberInputPorts"); 48210447Snilay@cs.wisc.edu unsigned int middle_router_number_input_ports = getGenProperties()->get("MiddleRouter->NumberInputPorts"); 48310447Snilay@cs.wisc.edu unsigned int egress_router_number_input_ports = getGenProperties()->get("EgressRouter->NumberInputPorts"); 48410447Snilay@cs.wisc.edu 48510447Snilay@cs.wisc.edu ElectricalModel* input_to_ingress_link = (ElectricalModel*)getSubInstance("InputToIngressLink"); 48610447Snilay@cs.wisc.edu assignPortTransitionInfo(input_to_ingress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 48710447Snilay@cs.wisc.edu input_to_ingress_link->use(); 48810447Snilay@cs.wisc.edu 48910447Snilay@cs.wisc.edu ElectricalModel* ingress_to_middle_link = (ElectricalModel*)getSubInstance("IngressToMiddleLink"); 49010447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_to_middle_link, "LinkCK", TransitionInfo(0.0, (double) clock_freq / (swsr_link_data_rate * 2.0), 0.0)); 49110447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_to_middle_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 49210447Snilay@cs.wisc.edu ingress_to_middle_link->use(); 49310447Snilay@cs.wisc.edu 49410447Snilay@cs.wisc.edu ElectricalModel* middle_to_egress_link = (ElectricalModel*)getSubInstance("MiddleToEgressLink"); 49510447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_to_egress_link, "LinkCK", TransitionInfo(0.0, (double) clock_freq / (swsr_link_data_rate * 2.0), 0.0)); 49610447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_to_egress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 49710447Snilay@cs.wisc.edu middle_to_egress_link->use(); 49810447Snilay@cs.wisc.edu 49910447Snilay@cs.wisc.edu ElectricalModel* egress_to_output_link = (ElectricalModel*)getSubInstance("EgressToOutputLink"); 50010447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_to_output_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 50110447Snilay@cs.wisc.edu egress_to_output_link->use(); 50210447Snilay@cs.wisc.edu 50310447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 50410447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 50510447Snilay@cs.wisc.edu { 50610447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 50710447Snilay@cs.wisc.edu } 50810447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 50910447Snilay@cs.wisc.edu ingress_router->getGenProperties()->set("UseModelEvent", ""); 51010447Snilay@cs.wisc.edu ingress_router->use(); 51110447Snilay@cs.wisc.edu 51210447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 51310447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 51410447Snilay@cs.wisc.edu { 51510447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 51610447Snilay@cs.wisc.edu } 51710447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 51810447Snilay@cs.wisc.edu middle_router->getGenProperties()->set("UseModelEvent", ""); 51910447Snilay@cs.wisc.edu middle_router->use(); 52010447Snilay@cs.wisc.edu 52110447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 52210447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 52310447Snilay@cs.wisc.edu { 52410447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 52510447Snilay@cs.wisc.edu } 52610447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 52710447Snilay@cs.wisc.edu egress_router->getGenProperties()->set("UseModelEvent", ""); 52810447Snilay@cs.wisc.edu egress_router->use(); 52910447Snilay@cs.wisc.edu 53010447Snilay@cs.wisc.edu return; 53110447Snilay@cs.wisc.edu } 53210447Snilay@cs.wisc.edu} // namespace DSENT 53310447Snilay@cs.wisc.edu 534