ElectricalClos.cc revision 10447
110447Snilay@cs.wisc.edu#include "model/network/ElectricalClos.h" 210447Snilay@cs.wisc.edu 310447Snilay@cs.wisc.edu#include <cmath> 410447Snilay@cs.wisc.edu 510447Snilay@cs.wisc.edu#include "model/ModelGen.h" 610447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalTimingTree.h" 710447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalNet.h" 810447Snilay@cs.wisc.edu 910447Snilay@cs.wisc.edunamespace DSENT 1010447Snilay@cs.wisc.edu{ 1110447Snilay@cs.wisc.edu using std::sqrt; 1210447Snilay@cs.wisc.edu 1310447Snilay@cs.wisc.edu ElectricalClos::ElectricalClos(const String& instance_name_, const TechModel* tech_model_) 1410447Snilay@cs.wisc.edu : ElectricalModel(instance_name_, tech_model_) 1510447Snilay@cs.wisc.edu { 1610447Snilay@cs.wisc.edu initParameters(); 1710447Snilay@cs.wisc.edu initProperties(); 1810447Snilay@cs.wisc.edu } 1910447Snilay@cs.wisc.edu 2010447Snilay@cs.wisc.edu ElectricalClos::~ElectricalClos() 2110447Snilay@cs.wisc.edu {} 2210447Snilay@cs.wisc.edu 2310447Snilay@cs.wisc.edu void ElectricalClos::initParameters() 2410447Snilay@cs.wisc.edu { 2510447Snilay@cs.wisc.edu // Frequency 2610447Snilay@cs.wisc.edu addParameterName("Frequency"); 2710447Snilay@cs.wisc.edu // Physical Parameters 2810447Snilay@cs.wisc.edu addParameterName("NumberInputSites"); 2910447Snilay@cs.wisc.edu addParameterName("NumberOutputSites"); 3010447Snilay@cs.wisc.edu addParameterName("NumberBitsPerFlit"); 3110447Snilay@cs.wisc.edu // Number of each type of routers 3210447Snilay@cs.wisc.edu addParameterName("NumberIngressRouters"); 3310447Snilay@cs.wisc.edu addParameterName("NumberMiddleRouters"); 3410447Snilay@cs.wisc.edu addParameterName("NumberEgressRouters"); 3510447Snilay@cs.wisc.edu // Router parameters 3610447Snilay@cs.wisc.edu addParameterName("Router->NumberVirtualNetworks"); 3710447Snilay@cs.wisc.edu addParameterName("Router->NumberVirtualChannelsPerVirtualNetwork"); 3810447Snilay@cs.wisc.edu addParameterName("Router->NumberBuffersPerVirtualChannel"); 3910447Snilay@cs.wisc.edu addParameterName("Router->InputPort->BufferModel"); 4010447Snilay@cs.wisc.edu addParameterName("Router->CrossbarModel"); 4110447Snilay@cs.wisc.edu addParameterName("Router->SwitchAllocator->ArbiterModel"); 4210447Snilay@cs.wisc.edu addParameterName("Router->ClockTreeModel"); 4310447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->NumberLevels"); 4410447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireLayer"); 4510447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireWidthMultiplier"); 4610447Snilay@cs.wisc.edu addParameterName("Router->ClockTree->WireSpacingMultiplier", 3.0); 4710447Snilay@cs.wisc.edu // Link parameters 4810447Snilay@cs.wisc.edu addParameterName("Link->WireLayer"); 4910447Snilay@cs.wisc.edu addParameterName("Link->WireWidthMultiplier"); 5010447Snilay@cs.wisc.edu addParameterName("Link->WireSpacingMultiplier"); 5110447Snilay@cs.wisc.edu return; 5210447Snilay@cs.wisc.edu } 5310447Snilay@cs.wisc.edu 5410447Snilay@cs.wisc.edu void ElectricalClos::initProperties() 5510447Snilay@cs.wisc.edu { 5610447Snilay@cs.wisc.edu addPropertyName("InputSitePitch"); 5710447Snilay@cs.wisc.edu addPropertyName("OutputSitePitch"); 5810447Snilay@cs.wisc.edu return; 5910447Snilay@cs.wisc.edu } 6010447Snilay@cs.wisc.edu 6110447Snilay@cs.wisc.edu ElectricalClos* ElectricalClos::clone() const 6210447Snilay@cs.wisc.edu { 6310447Snilay@cs.wisc.edu // TODO 6410447Snilay@cs.wisc.edu return NULL; 6510447Snilay@cs.wisc.edu } 6610447Snilay@cs.wisc.edu 6710447Snilay@cs.wisc.edu void ElectricalClos::constructModel() 6810447Snilay@cs.wisc.edu { 6910447Snilay@cs.wisc.edu // Get input parameters 7010447Snilay@cs.wisc.edu unsigned int number_input_sites = getParameter("NumberInputSites").toUInt(); 7110447Snilay@cs.wisc.edu unsigned int number_output_sites = getParameter("NumberOutputSites").toUInt(); 7210447Snilay@cs.wisc.edu unsigned int number_bits_per_flit = getParameter("NumberBitsPerFlit").toUInt(); 7310447Snilay@cs.wisc.edu unsigned int number_ingress_routers = getParameter("NumberIngressRouters").toUInt(); 7410447Snilay@cs.wisc.edu unsigned int number_middle_routers = getParameter("NumberMiddleRouters").toUInt(); 7510447Snilay@cs.wisc.edu unsigned int number_egress_routers = getParameter("NumberEgressRouters").toUInt(); 7610447Snilay@cs.wisc.edu 7710447Snilay@cs.wisc.edu ASSERT(number_input_sites > 0, "[Error] " + getInstanceName() + 7810447Snilay@cs.wisc.edu " -> Number of input sites must be > 0!"); 7910447Snilay@cs.wisc.edu ASSERT(number_output_sites > 0, "[Error] " + getInstanceName() + 8010447Snilay@cs.wisc.edu " -> Number of output sites must be > 0!"); 8110447Snilay@cs.wisc.edu ASSERT(number_bits_per_flit > 0, "[Error] " + getInstanceName() + 8210447Snilay@cs.wisc.edu " -> Number of bits per flit must be > 0!"); 8310447Snilay@cs.wisc.edu ASSERT(number_ingress_routers > 0, "[Error] " + getInstanceName() + 8410447Snilay@cs.wisc.edu " -> Number of ingress routers must be > 0!"); 8510447Snilay@cs.wisc.edu ASSERT(number_middle_routers > 0, "[Error] " + getInstanceName() + 8610447Snilay@cs.wisc.edu " -> Number of middle routers must be > 0!"); 8710447Snilay@cs.wisc.edu ASSERT(number_egress_routers > 0, "[Error] " + getInstanceName() + 8810447Snilay@cs.wisc.edu " -> Number of egress routers must be > 0!"); 8910447Snilay@cs.wisc.edu 9010447Snilay@cs.wisc.edu // Get input parameters that will be forwarded to the sub instances 9110447Snilay@cs.wisc.edu const String& router_number_vns = getParameter("Router->NumberVirtualNetworks"); 9210447Snilay@cs.wisc.edu const String& router_number_vcs_per_vn = getParameter("Router->NumberVirtualChannelsPerVirtualNetwork"); 9310447Snilay@cs.wisc.edu const String& router_number_bufs_per_vc = getParameter("Router->NumberBuffersPerVirtualChannel"); 9410447Snilay@cs.wisc.edu const String& router_buffer_model = getParameter("Router->InputPort->BufferModel"); 9510447Snilay@cs.wisc.edu const String& router_crossbar_model = getParameter("Router->CrossbarModel"); 9610447Snilay@cs.wisc.edu const String& link_wire_layer = getParameter("Link->WireLayer"); 9710447Snilay@cs.wisc.edu const String& link_wire_width_multiplier = getParameter("Link->WireWidthMultiplier"); 9810447Snilay@cs.wisc.edu const String& link_wire_spacing_multiplier = getParameter("Link->WireSpacingMultiplier"); 9910447Snilay@cs.wisc.edu 10010447Snilay@cs.wisc.edu // Calculate properties from input parameters 10110447Snilay@cs.wisc.edu unsigned int ingress_router_number_input_ports = number_input_sites / number_ingress_routers; 10210447Snilay@cs.wisc.edu unsigned int ingress_router_number_output_ports = number_middle_routers; 10310447Snilay@cs.wisc.edu unsigned int middle_router_number_input_ports = number_ingress_routers; 10410447Snilay@cs.wisc.edu unsigned int middle_router_number_output_ports = number_egress_routers; 10510447Snilay@cs.wisc.edu unsigned int egress_router_number_input_ports = number_middle_routers; 10610447Snilay@cs.wisc.edu unsigned int egress_router_number_output_ports = number_output_sites / number_egress_routers; 10710447Snilay@cs.wisc.edu unsigned int number_input_to_ingress_links = number_input_sites; 10810447Snilay@cs.wisc.edu unsigned int number_ingress_to_middle_links = number_ingress_routers * number_middle_routers; 10910447Snilay@cs.wisc.edu unsigned int number_middle_to_egress_links = number_middle_routers * number_egress_routers; 11010447Snilay@cs.wisc.edu unsigned int number_egress_to_output_links = number_output_sites; 11110447Snilay@cs.wisc.edu 11210447Snilay@cs.wisc.edu getGenProperties()->set("NumberInputSitesPerIngressRouter", ingress_router_number_input_ports); 11310447Snilay@cs.wisc.edu getGenProperties()->set("NumberOutputSitesPerEgressRouter", egress_router_number_output_ports); 11410447Snilay@cs.wisc.edu getGenProperties()->set("IngressRouter->NumberInputPorts", ingress_router_number_input_ports); 11510447Snilay@cs.wisc.edu getGenProperties()->set("IngressRouter->NumberOutputPorts", ingress_router_number_output_ports); 11610447Snilay@cs.wisc.edu getGenProperties()->set("MiddleRouter->NumberInputPorts", middle_router_number_input_ports); 11710447Snilay@cs.wisc.edu getGenProperties()->set("MiddleRouter->NumberOutputPorts", middle_router_number_output_ports); 11810447Snilay@cs.wisc.edu getGenProperties()->set("EgressRouter->NumberInputPorts", egress_router_number_input_ports); 11910447Snilay@cs.wisc.edu getGenProperties()->set("EgressRouter->NumberOutputPorts", egress_router_number_output_ports); 12010447Snilay@cs.wisc.edu 12110447Snilay@cs.wisc.edu // Create ports 12210447Snilay@cs.wisc.edu createInputPort("CK"); 12310447Snilay@cs.wisc.edu 12410447Snilay@cs.wisc.edu // Init ingress router 12510447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)ModelGen::createModel("Router", "IngressRouter", getTechModel()); 12610447Snilay@cs.wisc.edu ingress_router->setParameter("NumberInputPorts", ingress_router_number_input_ports); 12710447Snilay@cs.wisc.edu ingress_router->setParameter("NumberOutputPorts", ingress_router_number_output_ports); 12810447Snilay@cs.wisc.edu ingress_router->setParameter("NumberVirtualNetworks", router_number_vns); 12910447Snilay@cs.wisc.edu ingress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 13010447Snilay@cs.wisc.edu ingress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 13110447Snilay@cs.wisc.edu ingress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 13210447Snilay@cs.wisc.edu ingress_router->setParameter("InputPort->BufferModel", router_buffer_model); 13310447Snilay@cs.wisc.edu ingress_router->setParameter("CrossbarModel", router_crossbar_model); 13410447Snilay@cs.wisc.edu ingress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 13510447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 13610447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 13710447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 13810447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 13910447Snilay@cs.wisc.edu ingress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 14010447Snilay@cs.wisc.edu ingress_router->construct(); 14110447Snilay@cs.wisc.edu // Init middle routers 14210447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)ModelGen::createModel("Router", "MiddleRouter", getTechModel()); 14310447Snilay@cs.wisc.edu middle_router->setParameter("NumberInputPorts", middle_router_number_input_ports); 14410447Snilay@cs.wisc.edu middle_router->setParameter("NumberOutputPorts", middle_router_number_output_ports); 14510447Snilay@cs.wisc.edu middle_router->setParameter("NumberVirtualNetworks", router_number_vns); 14610447Snilay@cs.wisc.edu middle_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 14710447Snilay@cs.wisc.edu middle_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 14810447Snilay@cs.wisc.edu middle_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 14910447Snilay@cs.wisc.edu middle_router->setParameter("InputPort->BufferModel", router_buffer_model); 15010447Snilay@cs.wisc.edu middle_router->setParameter("CrossbarModel", router_crossbar_model); 15110447Snilay@cs.wisc.edu middle_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 15210447Snilay@cs.wisc.edu middle_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 15310447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 15410447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 15510447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 15610447Snilay@cs.wisc.edu middle_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 15710447Snilay@cs.wisc.edu middle_router->construct(); 15810447Snilay@cs.wisc.edu // Init egress routers 15910447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)ModelGen::createModel("Router", "EgressRouter", getTechModel()); 16010447Snilay@cs.wisc.edu egress_router->setParameter("NumberInputPorts", egress_router_number_input_ports); 16110447Snilay@cs.wisc.edu egress_router->setParameter("NumberOutputPorts", egress_router_number_output_ports); 16210447Snilay@cs.wisc.edu egress_router->setParameter("NumberVirtualNetworks", router_number_vns); 16310447Snilay@cs.wisc.edu egress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 16410447Snilay@cs.wisc.edu egress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 16510447Snilay@cs.wisc.edu egress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 16610447Snilay@cs.wisc.edu egress_router->setParameter("InputPort->BufferModel", router_buffer_model); 16710447Snilay@cs.wisc.edu egress_router->setParameter("CrossbarModel", router_crossbar_model); 16810447Snilay@cs.wisc.edu egress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 16910447Snilay@cs.wisc.edu egress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 17010447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 17110447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 17210447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 17310447Snilay@cs.wisc.edu egress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 17410447Snilay@cs.wisc.edu egress_router->construct(); 17510447Snilay@cs.wisc.edu // Init input to ingress link 17610447Snilay@cs.wisc.edu ElectricalModel* input_to_ingress_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "InputToIngressLink", getTechModel()); 17710447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("NumberBits", number_bits_per_flit); 17810447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireLayer", link_wire_layer); 17910447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 18010447Snilay@cs.wisc.edu input_to_ingress_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 18110447Snilay@cs.wisc.edu input_to_ingress_link->construct(); 18210447Snilay@cs.wisc.edu // Init ingress to middle link 18310447Snilay@cs.wisc.edu ElectricalModel* ingress_to_middle_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "IngressToMiddleLink", getTechModel()); 18410447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("NumberBits", number_bits_per_flit); 18510447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("WireLayer", link_wire_layer); 18610447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 18710447Snilay@cs.wisc.edu ingress_to_middle_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 18810447Snilay@cs.wisc.edu ingress_to_middle_link->construct(); 18910447Snilay@cs.wisc.edu // Init middle to egress link 19010447Snilay@cs.wisc.edu ElectricalModel* middle_to_egress_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "MiddleToEgressLink", getTechModel()); 19110447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("NumberBits", number_bits_per_flit); 19210447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("WireLayer", link_wire_layer); 19310447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 19410447Snilay@cs.wisc.edu middle_to_egress_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 19510447Snilay@cs.wisc.edu middle_to_egress_link->construct(); 19610447Snilay@cs.wisc.edu // Init egress to output link 19710447Snilay@cs.wisc.edu ElectricalModel* egress_to_output_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "EgressToOutputLink", getTechModel()); 19810447Snilay@cs.wisc.edu egress_to_output_link->setParameter("NumberBits", number_bits_per_flit); 19910447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireLayer", link_wire_layer); 20010447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 20110447Snilay@cs.wisc.edu egress_to_output_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 20210447Snilay@cs.wisc.edu egress_to_output_link->construct(); 20310447Snilay@cs.wisc.edu 20410447Snilay@cs.wisc.edu // Connect ports 20510447Snilay@cs.wisc.edu createNet("InputToIngressLink_Out", makeNetIndex(0, number_bits_per_flit-1)); 20610447Snilay@cs.wisc.edu createNet("InputToIngressLink_In", makeNetIndex(0, number_bits_per_flit-1)); 20710447Snilay@cs.wisc.edu portConnect(input_to_ingress_link, "In", "InputToIngressLink_In"); 20810447Snilay@cs.wisc.edu portConnect(input_to_ingress_link, "Out", "InputToIngressLink_Out"); 20910447Snilay@cs.wisc.edu 21010447Snilay@cs.wisc.edu createNet("IngressToMiddleLink_In", makeNetIndex(0, number_bits_per_flit-1)); 21110447Snilay@cs.wisc.edu createNet("IngressToMiddleLink_Out", makeNetIndex(0, number_bits_per_flit-1)); 21210447Snilay@cs.wisc.edu portConnect(ingress_to_middle_link, "In", "IngressToMiddleLink_In"); 21310447Snilay@cs.wisc.edu portConnect(ingress_to_middle_link, "Out", "IngressToMiddleLink_Out"); 21410447Snilay@cs.wisc.edu 21510447Snilay@cs.wisc.edu createNet("MiddleToEgressLink_In", makeNetIndex(0, number_bits_per_flit-1)); 21610447Snilay@cs.wisc.edu createNet("MiddleToEgressLink_Out", makeNetIndex(0, number_bits_per_flit-1)); 21710447Snilay@cs.wisc.edu portConnect(middle_to_egress_link, "In", "MiddleToEgressLink_In"); 21810447Snilay@cs.wisc.edu portConnect(middle_to_egress_link, "Out", "MiddleToEgressLink_Out"); 21910447Snilay@cs.wisc.edu 22010447Snilay@cs.wisc.edu createNet("EgressToOutputLink_In", makeNetIndex(0, number_bits_per_flit-1)); 22110447Snilay@cs.wisc.edu createNet("EgressToOutputLink_Out", makeNetIndex(0, number_bits_per_flit-1)); 22210447Snilay@cs.wisc.edu portConnect(egress_to_output_link, "In", "EgressToOutputLink_In"); 22310447Snilay@cs.wisc.edu portConnect(egress_to_output_link, "Out", "EgressToOutputLink_Out"); 22410447Snilay@cs.wisc.edu 22510447Snilay@cs.wisc.edu 22610447Snilay@cs.wisc.edu portConnect(ingress_router, "CK", "CK"); 22710447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 22810447Snilay@cs.wisc.edu { 22910447Snilay@cs.wisc.edu createNet("IngressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 23010447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 23110447Snilay@cs.wisc.edu assignVirtualFanout("IngressRouter_In" + (String)i, makeNetIndex(j), "InputToIngressLink_Out", makeNetIndex(j)); 23210447Snilay@cs.wisc.edu portConnect(ingress_router, "FlitIn" + (String)i, "IngressRouter_In" + (String)i); 23310447Snilay@cs.wisc.edu } 23410447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_output_ports; ++i) 23510447Snilay@cs.wisc.edu { 23610447Snilay@cs.wisc.edu // VFI 23710447Snilay@cs.wisc.edu portConnect(ingress_router, "FlitOut" + (String)i, "IngressToMiddleLink_In"); 23810447Snilay@cs.wisc.edu } 23910447Snilay@cs.wisc.edu 24010447Snilay@cs.wisc.edu portConnect(middle_router, "CK", "CK"); 24110447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 24210447Snilay@cs.wisc.edu { 24310447Snilay@cs.wisc.edu createNet("MiddleRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 24410447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 24510447Snilay@cs.wisc.edu assignVirtualFanout("MiddleRouter_In" + (String)i, makeNetIndex(j), "IngressToMiddleLink_Out", makeNetIndex(j)); 24610447Snilay@cs.wisc.edu portConnect(middle_router, "FlitIn" + (String)i, "MiddleRouter_In" + (String)i); 24710447Snilay@cs.wisc.edu } 24810447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_output_ports; ++i) 24910447Snilay@cs.wisc.edu { 25010447Snilay@cs.wisc.edu // VFI 25110447Snilay@cs.wisc.edu portConnect(middle_router, "FlitOut" + (String)i, "MiddleToEgressLink_In"); 25210447Snilay@cs.wisc.edu } 25310447Snilay@cs.wisc.edu 25410447Snilay@cs.wisc.edu portConnect(egress_router, "CK", "CK"); 25510447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 25610447Snilay@cs.wisc.edu { 25710447Snilay@cs.wisc.edu createNet("EgressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 25810447Snilay@cs.wisc.edu for (unsigned int j = 0; j < number_bits_per_flit; ++j) 25910447Snilay@cs.wisc.edu assignVirtualFanout("EgressRouter_In" + (String)i, makeNetIndex(j), "MiddleToEgressLink_Out", makeNetIndex(j)); 26010447Snilay@cs.wisc.edu portConnect(egress_router, "FlitIn" + (String)i, "EgressRouter_In" + (String)i); 26110447Snilay@cs.wisc.edu } 26210447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_output_ports; ++i) 26310447Snilay@cs.wisc.edu { 26410447Snilay@cs.wisc.edu // VFI 26510447Snilay@cs.wisc.edu portConnect(egress_router, "FlitOut" + (String)i, "EgressToOutputLink_In"); 26610447Snilay@cs.wisc.edu } 26710447Snilay@cs.wisc.edu 26810447Snilay@cs.wisc.edu // Create area, power, and event results 26910447Snilay@cs.wisc.edu createElectricalResults(); 27010447Snilay@cs.wisc.edu createElectricalEventResult("AvgUnicast"); 27110447Snilay@cs.wisc.edu createElectricalEventResult("AvgBroadcast"); 27210447Snilay@cs.wisc.edu 27310447Snilay@cs.wisc.edu // Add all instances 27410447Snilay@cs.wisc.edu addSubInstances(ingress_router, number_ingress_routers); 27510447Snilay@cs.wisc.edu addElectricalSubResults(ingress_router, number_ingress_routers); 27610447Snilay@cs.wisc.edu addSubInstances(middle_router, number_middle_routers); 27710447Snilay@cs.wisc.edu addElectricalSubResults(middle_router, number_middle_routers); 27810447Snilay@cs.wisc.edu addSubInstances(egress_router, number_egress_routers); 27910447Snilay@cs.wisc.edu addElectricalSubResults(egress_router, number_egress_routers); 28010447Snilay@cs.wisc.edu addSubInstances(input_to_ingress_link, number_input_to_ingress_links); 28110447Snilay@cs.wisc.edu addElectricalSubResults(input_to_ingress_link, number_input_to_ingress_links); 28210447Snilay@cs.wisc.edu addSubInstances(ingress_to_middle_link, number_ingress_to_middle_links); 28310447Snilay@cs.wisc.edu addElectricalSubResults(ingress_to_middle_link, number_ingress_to_middle_links); 28410447Snilay@cs.wisc.edu addSubInstances(middle_to_egress_link, number_middle_to_egress_links); 28510447Snilay@cs.wisc.edu addElectricalSubResults(middle_to_egress_link, number_middle_to_egress_links); 28610447Snilay@cs.wisc.edu addSubInstances(egress_to_output_link, number_egress_to_output_links); 28710447Snilay@cs.wisc.edu addElectricalSubResults(egress_to_output_link, number_egress_to_output_links); 28810447Snilay@cs.wisc.edu 28910447Snilay@cs.wisc.edu // Update unicast event 29010447Snilay@cs.wisc.edu Result* avg_unicast_event = getEventResult("AvgUnicast"); 29110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 29210447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("WriteBuffer")) 29310447Snilay@cs.wisc.edu { 29410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 29510447Snilay@cs.wisc.edu } 29610447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("ReadBuffer")) 29710447Snilay@cs.wisc.edu { 29810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 29910447Snilay@cs.wisc.edu } 30010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 30110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 30210447Snilay@cs.wisc.edu if(middle_router->hasEventResult("WriteBuffer")) 30310447Snilay@cs.wisc.edu { 30410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 30510447Snilay@cs.wisc.edu } 30610447Snilay@cs.wisc.edu if(middle_router->hasEventResult("ReadBuffer")) 30710447Snilay@cs.wisc.edu { 30810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 30910447Snilay@cs.wisc.edu } 31010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 31110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", 1.0); 31210447Snilay@cs.wisc.edu if(egress_router->hasEventResult("WriteBuffer")) 31310447Snilay@cs.wisc.edu { 31410447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", 1.0); 31510447Snilay@cs.wisc.edu } 31610447Snilay@cs.wisc.edu if(egress_router->hasEventResult("ReadBuffer")) 31710447Snilay@cs.wisc.edu { 31810447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", 1.0); 31910447Snilay@cs.wisc.edu } 32010447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast1"), "EgressRouter", 1.0); 32110447Snilay@cs.wisc.edu avg_unicast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", 1.0); 32210447Snilay@cs.wisc.edu 32310447Snilay@cs.wisc.edu // Update broadcast event 32410447Snilay@cs.wisc.edu Result* avg_broadcast_event = getEventResult("AvgBroadcast"); 32510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 32610447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("WriteBuffer")) 32710447Snilay@cs.wisc.edu { 32810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 32910447Snilay@cs.wisc.edu } 33010447Snilay@cs.wisc.edu if(ingress_router->hasEventResult("ReadBuffer")) 33110447Snilay@cs.wisc.edu { 33210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 33310447Snilay@cs.wisc.edu } 33410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 33510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 33610447Snilay@cs.wisc.edu if(middle_router->hasEventResult("WriteBuffer")) 33710447Snilay@cs.wisc.edu { 33810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 33910447Snilay@cs.wisc.edu } 34010447Snilay@cs.wisc.edu if(middle_router->hasEventResult("ReadBuffer")) 34110447Snilay@cs.wisc.edu { 34210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 34310447Snilay@cs.wisc.edu } 34410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 34510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", number_egress_routers); 34610447Snilay@cs.wisc.edu if(egress_router->hasEventResult("WriteBuffer")) 34710447Snilay@cs.wisc.edu { 34810447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", number_egress_routers); 34910447Snilay@cs.wisc.edu } 35010447Snilay@cs.wisc.edu if(egress_router->hasEventResult("ReadBuffer")) 35110447Snilay@cs.wisc.edu { 35210447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", number_egress_routers); 35310447Snilay@cs.wisc.edu } 35410447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast" + (String)number_egress_routers), "EgressRouter", 1.0); 35510447Snilay@cs.wisc.edu avg_broadcast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", number_output_sites); 35610447Snilay@cs.wisc.edu return; 35710447Snilay@cs.wisc.edu } 35810447Snilay@cs.wisc.edu 35910447Snilay@cs.wisc.edu void ElectricalClos::updateModel() 36010447Snilay@cs.wisc.edu { 36110447Snilay@cs.wisc.edu // Get properties 36210447Snilay@cs.wisc.edu double input_site_pitch = getProperty("InputSitePitch").toDouble(); 36310447Snilay@cs.wisc.edu double output_site_pitch = getProperty("OutputSitePitch").toDouble(); 36410447Snilay@cs.wisc.edu double clock_freq = getParameter("Frequency"); 36510447Snilay@cs.wisc.edu 36610447Snilay@cs.wisc.edu ASSERT(input_site_pitch > 0, "[Error] " + getInstanceName() + 36710447Snilay@cs.wisc.edu " -> Input site pitch must be > 0!"); 36810447Snilay@cs.wisc.edu ASSERT(output_site_pitch > 0, "[Error] " + getInstanceName() + 36910447Snilay@cs.wisc.edu " -> Output site pitch must be > 0!"); 37010447Snilay@cs.wisc.edu ASSERT(clock_freq > 0, "[Error] " + getInstanceName() + 37110447Snilay@cs.wisc.edu " -> Clock frequency must be > 0!"); 37210447Snilay@cs.wisc.edu 37310447Snilay@cs.wisc.edu unsigned int number_input_sites_per_ingress_router = getGenProperties()->get("NumberInputSitesPerIngressRouter"); 37410447Snilay@cs.wisc.edu unsigned int number_ingress_routers = getParameter("NumberIngressRouters"); 37510447Snilay@cs.wisc.edu unsigned int number_output_sites_per_egress_router = getGenProperties()->get("NumberOutputSitesPerEgressRouter"); 37610447Snilay@cs.wisc.edu unsigned int number_egress_routers = getParameter("NumberEgressRouters"); 37710447Snilay@cs.wisc.edu double delay = 1.0 / clock_freq; 37810447Snilay@cs.wisc.edu 37910447Snilay@cs.wisc.edu double input_to_ingress_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) - 1.0); 38010447Snilay@cs.wisc.edu double input_to_ingress_link_delay = delay * 0.8; 38110447Snilay@cs.wisc.edu double ingress_to_middle_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) * sqrt(number_ingress_routers)); 38210447Snilay@cs.wisc.edu double ingress_to_middle_link_delay = delay * 0.8; 38310447Snilay@cs.wisc.edu double middle_to_egress_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) * sqrt(number_egress_routers)); 38410447Snilay@cs.wisc.edu double middle_to_egress_link_delay = delay * 0.8; 38510447Snilay@cs.wisc.edu double egress_to_output_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) - 1.0); 38610447Snilay@cs.wisc.edu double egress_to_output_link_delay = delay * 0.8; 38710447Snilay@cs.wisc.edu double ingress_router_delay = delay; 38810447Snilay@cs.wisc.edu double middle_router_delay = delay; 38910447Snilay@cs.wisc.edu double egress_router_delay = delay; 39010447Snilay@cs.wisc.edu 39110447Snilay@cs.wisc.edu Model* input_to_ingress_link = getSubInstance("InputToIngressLink"); 39210447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("WireLength", input_to_ingress_link_length); 39310447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("Delay", input_to_ingress_link_delay); 39410447Snilay@cs.wisc.edu input_to_ingress_link->setProperty("IsKeepParity", "TRUE"); 39510447Snilay@cs.wisc.edu input_to_ingress_link->update(); 39610447Snilay@cs.wisc.edu 39710447Snilay@cs.wisc.edu Model* ingress_to_middle_link = getSubInstance("IngressToMiddleLink"); 39810447Snilay@cs.wisc.edu ingress_to_middle_link->setProperty("WireLength", ingress_to_middle_link_length); 39910447Snilay@cs.wisc.edu ingress_to_middle_link->setProperty("Delay", ingress_to_middle_link_delay); 40010447Snilay@cs.wisc.edu ingress_to_middle_link->setProperty("IsKeepParity", "TRUE"); 40110447Snilay@cs.wisc.edu ingress_to_middle_link->update(); 40210447Snilay@cs.wisc.edu 40310447Snilay@cs.wisc.edu Model* middle_to_egress_link = getSubInstance("MiddleToEgressLink"); 40410447Snilay@cs.wisc.edu middle_to_egress_link->setProperty("WireLength", middle_to_egress_link_length); 40510447Snilay@cs.wisc.edu middle_to_egress_link->setProperty("Delay", middle_to_egress_link_delay); 40610447Snilay@cs.wisc.edu middle_to_egress_link->setProperty("IsKeepParity", "TRUE"); 40710447Snilay@cs.wisc.edu middle_to_egress_link->update(); 40810447Snilay@cs.wisc.edu 40910447Snilay@cs.wisc.edu Model* egress_to_output_link = getSubInstance("EgressToOutputLink"); 41010447Snilay@cs.wisc.edu egress_to_output_link->setProperty("WireLength", egress_to_output_link_length); 41110447Snilay@cs.wisc.edu egress_to_output_link->setProperty("Delay", egress_to_output_link_delay); 41210447Snilay@cs.wisc.edu egress_to_output_link->setProperty("IsKeepParity", "TRUE"); 41310447Snilay@cs.wisc.edu egress_to_output_link->update(); 41410447Snilay@cs.wisc.edu 41510447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 41610447Snilay@cs.wisc.edu ingress_router->update(); 41710447Snilay@cs.wisc.edu 41810447Snilay@cs.wisc.edu ElectricalTimingTree ingress_router_timing_tree("IngressRouter", ingress_router); 41910447Snilay@cs.wisc.edu ingress_router_timing_tree.performTimingOpt(ingress_router->getNet("CK"), ingress_router_delay); 42010447Snilay@cs.wisc.edu 42110447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 42210447Snilay@cs.wisc.edu middle_router->update(); 42310447Snilay@cs.wisc.edu 42410447Snilay@cs.wisc.edu ElectricalTimingTree middle_router_timing_tree("MiddleRouter", middle_router); 42510447Snilay@cs.wisc.edu middle_router_timing_tree.performTimingOpt(middle_router->getNet("CK"), middle_router_delay); 42610447Snilay@cs.wisc.edu 42710447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 42810447Snilay@cs.wisc.edu egress_router->update(); 42910447Snilay@cs.wisc.edu 43010447Snilay@cs.wisc.edu ElectricalTimingTree egress_router_timing_tree("EgressRouter", egress_router); 43110447Snilay@cs.wisc.edu egress_router_timing_tree.performTimingOpt(egress_router->getNet("CK"), egress_router_delay); 43210447Snilay@cs.wisc.edu 43310447Snilay@cs.wisc.edu return; 43410447Snilay@cs.wisc.edu } 43510447Snilay@cs.wisc.edu 43610447Snilay@cs.wisc.edu void ElectricalClos::propagateTransitionInfo() 43710447Snilay@cs.wisc.edu { 43810447Snilay@cs.wisc.edu // Get properties 43910447Snilay@cs.wisc.edu unsigned int ingress_router_number_input_ports = getGenProperties()->get("IngressRouter->NumberInputPorts"); 44010447Snilay@cs.wisc.edu unsigned int middle_router_number_input_ports = getGenProperties()->get("MiddleRouter->NumberInputPorts"); 44110447Snilay@cs.wisc.edu unsigned int egress_router_number_input_ports = getGenProperties()->get("EgressRouter->NumberInputPorts"); 44210447Snilay@cs.wisc.edu 44310447Snilay@cs.wisc.edu ElectricalModel* input_to_ingress_link = (ElectricalModel*)getSubInstance("InputToIngressLink"); 44410447Snilay@cs.wisc.edu assignPortTransitionInfo(input_to_ingress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 44510447Snilay@cs.wisc.edu input_to_ingress_link->use(); 44610447Snilay@cs.wisc.edu 44710447Snilay@cs.wisc.edu ElectricalModel* ingress_to_middle_link = (ElectricalModel*)getSubInstance("IngressToMiddleLink"); 44810447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_to_middle_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 44910447Snilay@cs.wisc.edu ingress_to_middle_link->use(); 45010447Snilay@cs.wisc.edu 45110447Snilay@cs.wisc.edu ElectricalModel* middle_to_egress_link = (ElectricalModel*)getSubInstance("MiddleToEgressLink"); 45210447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_to_egress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 45310447Snilay@cs.wisc.edu middle_to_egress_link->use(); 45410447Snilay@cs.wisc.edu 45510447Snilay@cs.wisc.edu ElectricalModel* egress_to_output_link = (ElectricalModel*)getSubInstance("EgressToOutputLink"); 45610447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_to_output_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 45710447Snilay@cs.wisc.edu egress_to_output_link->use(); 45810447Snilay@cs.wisc.edu 45910447Snilay@cs.wisc.edu ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 46010447Snilay@cs.wisc.edu for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 46110447Snilay@cs.wisc.edu { 46210447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 46310447Snilay@cs.wisc.edu } 46410447Snilay@cs.wisc.edu assignPortTransitionInfo(ingress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 46510447Snilay@cs.wisc.edu ingress_router->getGenProperties()->set("UseModelEvent", ""); 46610447Snilay@cs.wisc.edu ingress_router->use(); 46710447Snilay@cs.wisc.edu 46810447Snilay@cs.wisc.edu ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 46910447Snilay@cs.wisc.edu for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 47010447Snilay@cs.wisc.edu { 47110447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 47210447Snilay@cs.wisc.edu } 47310447Snilay@cs.wisc.edu assignPortTransitionInfo(middle_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 47410447Snilay@cs.wisc.edu middle_router->getGenProperties()->set("UseModelEvent", ""); 47510447Snilay@cs.wisc.edu middle_router->use(); 47610447Snilay@cs.wisc.edu 47710447Snilay@cs.wisc.edu ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 47810447Snilay@cs.wisc.edu for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 47910447Snilay@cs.wisc.edu { 48010447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 48110447Snilay@cs.wisc.edu } 48210447Snilay@cs.wisc.edu assignPortTransitionInfo(egress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 48310447Snilay@cs.wisc.edu egress_router->getGenProperties()->set("UseModelEvent", ""); 48410447Snilay@cs.wisc.edu egress_router->use(); 48510447Snilay@cs.wisc.edu 48610447Snilay@cs.wisc.edu return; 48710447Snilay@cs.wisc.edu } 48810447Snilay@cs.wisc.edu} // namespace DSENT 48910447Snilay@cs.wisc.edu 490