PhotonicClos.cc revision 10447:a465576671d4
12568SN/A#include "model/network/PhotonicClos.h" 29786Sandreas.hansson@arm.com 38713Sandreas.hansson@arm.com#include <cmath> 48713Sandreas.hansson@arm.com 58713Sandreas.hansson@arm.com#include "model/ModelGen.h" 68713Sandreas.hansson@arm.com#include "model/timing_graph/ElectricalTimingTree.h" 78713Sandreas.hansson@arm.com#include "model/timing_graph/ElectricalNet.h" 88713Sandreas.hansson@arm.com 98713Sandreas.hansson@arm.comnamespace DSENT 108713Sandreas.hansson@arm.com{ 118713Sandreas.hansson@arm.com using std::sqrt; 128713Sandreas.hansson@arm.com 138713Sandreas.hansson@arm.com PhotonicClos::PhotonicClos(const String& instance_name_, const TechModel* tech_model_) 142568SN/A : ElectricalModel(instance_name_, tech_model_) 152568SN/A { 162568SN/A initParameters(); 172568SN/A initProperties(); 182568SN/A } 192568SN/A 202568SN/A PhotonicClos::~PhotonicClos() 212568SN/A {} 222568SN/A 232568SN/A void PhotonicClos::initParameters() 242568SN/A { 252568SN/A // Clock Frequency 262568SN/A addParameterName("Frequency"); 272568SN/A // Physical Parameters 282568SN/A addParameterName("NumberInputSites"); 292568SN/A addParameterName("NumberOutputSites"); 302568SN/A addParameterName("NumberBitsPerFlit"); 312568SN/A // Number of each type of routers 322568SN/A addParameterName("NumberIngressRouters"); 332568SN/A addParameterName("NumberMiddleRouters"); 342568SN/A addParameterName("NumberEgressRouters"); 352568SN/A // Optical link parameters 362568SN/A addParameterName("SWSR->LinkDataRate"); 372568SN/A addParameterName("SWSR->LaserType"); 382568SN/A addParameterName("SWSR->RingTuningMethod"); 392665Ssaidi@eecs.umich.edu // Router parameters 402665Ssaidi@eecs.umich.edu addParameterName("Router->NumberVirtualNetworks"); 412665Ssaidi@eecs.umich.edu addParameterName("Router->NumberVirtualChannelsPerVirtualNetwork"); 428713Sandreas.hansson@arm.com addParameterName("Router->NumberBuffersPerVirtualChannel"); 432568SN/A addParameterName("Router->InputPort->BufferModel"); 442568SN/A addParameterName("Router->CrossbarModel"); 452568SN/A addParameterName("Router->SwitchAllocator->ArbiterModel"); 462982Sstever@eecs.umich.edu addParameterName("Router->ClockTreeModel"); 4710405Sandreas.hansson@arm.com addParameterName("Router->ClockTree->NumberLevels"); 488713Sandreas.hansson@arm.com addParameterName("Router->ClockTree->WireLayer"); 492568SN/A addParameterName("Router->ClockTree->WireWidthMultiplier"); 502568SN/A addParameterName("Router->ClockTree->WireSpacingMultiplier", 3.0); 512568SN/A // Link parameters 529164Sandreas.hansson@arm.com addParameterName("Link->WireLayer"); 532568SN/A addParameterName("Link->WireWidthMultiplier"); 544762Snate@binkert.org addParameterName("Link->WireSpacingMultiplier"); 552568SN/A return; 569164Sandreas.hansson@arm.com } 579164Sandreas.hansson@arm.com 588851Sandreas.hansson@arm.com void PhotonicClos::initProperties() 599180Sandreas.hansson@arm.com { 609235Sandreas.hansson@arm.com addPropertyName("InputSitePitch"); 619164Sandreas.hansson@arm.com addPropertyName("OutputSitePitch"); 629164Sandreas.hansson@arm.com addPropertyName("SWSR->OptUtil", 1.0); 639164Sandreas.hansson@arm.com return; 648851Sandreas.hansson@arm.com } 658713Sandreas.hansson@arm.com 668713Sandreas.hansson@arm.com PhotonicClos* PhotonicClos::clone() const 678713Sandreas.hansson@arm.com { 689164Sandreas.hansson@arm.com // TODO 699164Sandreas.hansson@arm.com return NULL; 708851Sandreas.hansson@arm.com } 719180Sandreas.hansson@arm.com 729164Sandreas.hansson@arm.com void PhotonicClos::constructModel() 739164Sandreas.hansson@arm.com { 742643Sstever@eecs.umich.edu // Get input parameters 752643Sstever@eecs.umich.edu double clock_freq = getParameter("Frequency"); 762643Sstever@eecs.umich.edu unsigned int number_input_sites = getParameter("NumberInputSites").toUInt(); 774435Ssaidi@eecs.umich.edu unsigned int number_output_sites = getParameter("NumberOutputSites").toUInt(); 785034Smilesck@eecs.umich.edu unsigned int number_bits_per_flit = getParameter("NumberBitsPerFlit").toUInt(); 799180Sandreas.hansson@arm.com unsigned int number_ingress_routers = getParameter("NumberIngressRouters").toUInt(); 809180Sandreas.hansson@arm.com unsigned int number_middle_routers = getParameter("NumberMiddleRouters").toUInt(); 819180Sandreas.hansson@arm.com unsigned int number_egress_routers = getParameter("NumberEgressRouters").toUInt(); 829180Sandreas.hansson@arm.com 832643Sstever@eecs.umich.edu ASSERT(clock_freq > 0, "[Error] " + getInstanceName() + 842643Sstever@eecs.umich.edu " -> Clock frequency must be > 0!"); 852643Sstever@eecs.umich.edu ASSERT(number_input_sites > 0, "[Error] " + getInstanceName() + 869294Sandreas.hansson@arm.com " -> Number of input sites must be > 0!"); 879294Sandreas.hansson@arm.com ASSERT(number_output_sites > 0, "[Error] " + getInstanceName() + 888922Swilliam.wang@arm.com " -> Number of output sites must be > 0!"); 898922Swilliam.wang@arm.com ASSERT(number_bits_per_flit > 0, "[Error] " + getInstanceName() + 908922Swilliam.wang@arm.com " -> Number of bits per flit must be > 0!"); 918922Swilliam.wang@arm.com ASSERT(number_ingress_routers > 0, "[Error] " + getInstanceName() + 928922Swilliam.wang@arm.com " -> Number of ingress routers must be > 0!"); 938922Swilliam.wang@arm.com ASSERT(number_middle_routers > 0, "[Error] " + getInstanceName() + 948922Swilliam.wang@arm.com " -> Number of middle routers must be > 0!"); 958922Swilliam.wang@arm.com ASSERT(number_egress_routers > 0, "[Error] " + getInstanceName() + 969294Sandreas.hansson@arm.com " -> Number of egress routers must be > 0!"); 979294Sandreas.hansson@arm.com 982643Sstever@eecs.umich.edu // Get input parameters that will be forwarded to the sub instances 998713Sandreas.hansson@arm.com const String& swsr_link_data_rate = getParameter("SWSR->LinkDataRate"); 1008922Swilliam.wang@arm.com const String& swsr_laser_type = getParameter("SWSR->LaserType"); 1018922Swilliam.wang@arm.com const String& swsr_ring_tuning_method = getParameter("SWSR->RingTuningMethod"); 1028922Swilliam.wang@arm.com const String& router_number_vns = getParameter("Router->NumberVirtualNetworks"); 1038922Swilliam.wang@arm.com const String& router_number_vcs_per_vn = getParameter("Router->NumberVirtualChannelsPerVirtualNetwork"); 1042643Sstever@eecs.umich.edu const String& router_number_bufs_per_vc = getParameter("Router->NumberBuffersPerVirtualChannel"); 1052643Sstever@eecs.umich.edu const String& router_buffer_model = getParameter("Router->InputPort->BufferModel"); 1062568SN/A const String& router_crossbar_model = getParameter("Router->CrossbarModel"); 1072568SN/A const String& link_wire_layer = getParameter("Link->WireLayer"); 1082568SN/A const String& link_wire_width_multiplier = getParameter("Link->WireWidthMultiplier"); 1098713Sandreas.hansson@arm.com const String& link_wire_spacing_multiplier = getParameter("Link->WireSpacingMultiplier"); 1108713Sandreas.hansson@arm.com 11110405Sandreas.hansson@arm.com // Calculate properties from input parameters 1124432Ssaidi@eecs.umich.edu unsigned int ingress_router_number_input_ports = number_input_sites / number_ingress_routers; 1138713Sandreas.hansson@arm.com unsigned int ingress_router_number_output_ports = number_middle_routers; 1148713Sandreas.hansson@arm.com unsigned int middle_router_number_input_ports = number_ingress_routers; 1152568SN/A unsigned int middle_router_number_output_ports = number_egress_routers; 1162568SN/A unsigned int egress_router_number_input_ports = number_middle_routers; 1174433Ssaidi@eecs.umich.edu unsigned int egress_router_number_output_ports = number_output_sites / number_egress_routers; 1189786Sandreas.hansson@arm.com unsigned int number_input_to_ingress_links = number_input_sites; 1194433Ssaidi@eecs.umich.edu unsigned int number_ingress_to_middle_links = number_ingress_routers * number_middle_routers; 1208713Sandreas.hansson@arm.com unsigned int number_middle_to_egress_links = number_middle_routers * number_egress_routers; 1214435Ssaidi@eecs.umich.edu unsigned int number_egress_to_output_links = number_output_sites; 1224435Ssaidi@eecs.umich.edu 1234435Ssaidi@eecs.umich.edu getGenProperties()->set("NumberInputSitesPerIngressRouter", ingress_router_number_input_ports); 1249786Sandreas.hansson@arm.com getGenProperties()->set("NumberOutputSitesPerEgressRouter", egress_router_number_output_ports); 1254435Ssaidi@eecs.umich.edu getGenProperties()->set("IngressRouter->NumberInputPorts", ingress_router_number_input_ports); 1269164Sandreas.hansson@arm.com getGenProperties()->set("IngressRouter->NumberOutputPorts", ingress_router_number_output_ports); 1274433Ssaidi@eecs.umich.edu getGenProperties()->set("MiddleRouter->NumberInputPorts", middle_router_number_input_ports); 1282568SN/A getGenProperties()->set("MiddleRouter->NumberOutputPorts", middle_router_number_output_ports); 1292568SN/A getGenProperties()->set("EgressRouter->NumberInputPorts", egress_router_number_input_ports); 1308975Sandreas.hansson@arm.com getGenProperties()->set("EgressRouter->NumberOutputPorts", egress_router_number_output_ports); 1312568SN/A 1328713Sandreas.hansson@arm.com // Create ports 1338713Sandreas.hansson@arm.com createInputPort("CK"); 1349164Sandreas.hansson@arm.com 1358949Sandreas.hansson@arm.com // Init ingress router 1362643Sstever@eecs.umich.edu ElectricalModel* ingress_router = (ElectricalModel*)ModelGen::createModel("Router", "IngressRouter", getTechModel()); 1379164Sandreas.hansson@arm.com ingress_router->setParameter("NumberInputPorts", ingress_router_number_input_ports); 1384450Ssaidi@eecs.umich.edu ingress_router->setParameter("NumberOutputPorts", ingress_router_number_output_ports); 1399549Sandreas.hansson@arm.com ingress_router->setParameter("NumberVirtualNetworks", router_number_vns); 14010405Sandreas.hansson@arm.com ingress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 1419549Sandreas.hansson@arm.com ingress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 1429180Sandreas.hansson@arm.com ingress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 1438713Sandreas.hansson@arm.com ingress_router->setParameter("InputPort->BufferModel", router_buffer_model); 1448713Sandreas.hansson@arm.com ingress_router->setParameter("CrossbarModel", router_crossbar_model); 1458713Sandreas.hansson@arm.com ingress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 1468713Sandreas.hansson@arm.com ingress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 1478713Sandreas.hansson@arm.com ingress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 1488975Sandreas.hansson@arm.com ingress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 1498713Sandreas.hansson@arm.com ingress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 1509164Sandreas.hansson@arm.com ingress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 1518949Sandreas.hansson@arm.com ingress_router->construct(); 1528713Sandreas.hansson@arm.com // Init middle routers 1539786Sandreas.hansson@arm.com ElectricalModel* middle_router = (ElectricalModel*)ModelGen::createModel("Router", "MiddleRouter", getTechModel()); 1549786Sandreas.hansson@arm.com middle_router->setParameter("NumberInputPorts", middle_router_number_input_ports); 1559164Sandreas.hansson@arm.com middle_router->setParameter("NumberOutputPorts", middle_router_number_output_ports); 1569164Sandreas.hansson@arm.com middle_router->setParameter("NumberVirtualNetworks", router_number_vns); 1579164Sandreas.hansson@arm.com middle_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 1588713Sandreas.hansson@arm.com middle_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 1599786Sandreas.hansson@arm.com middle_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 1608851Sandreas.hansson@arm.com middle_router->setParameter("InputPort->BufferModel", router_buffer_model); 1619164Sandreas.hansson@arm.com middle_router->setParameter("CrossbarModel", router_crossbar_model); 1629164Sandreas.hansson@arm.com middle_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 1639786Sandreas.hansson@arm.com middle_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 1649786Sandreas.hansson@arm.com middle_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 1659786Sandreas.hansson@arm.com middle_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 1669786Sandreas.hansson@arm.com middle_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 1679786Sandreas.hansson@arm.com middle_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 1689786Sandreas.hansson@arm.com middle_router->construct(); 1699786Sandreas.hansson@arm.com // Init egress routers 1709786Sandreas.hansson@arm.com ElectricalModel* egress_router = (ElectricalModel*)ModelGen::createModel("Router", "EgressRouter", getTechModel()); 1719786Sandreas.hansson@arm.com egress_router->setParameter("NumberInputPorts", egress_router_number_input_ports); 1729786Sandreas.hansson@arm.com egress_router->setParameter("NumberOutputPorts", egress_router_number_output_ports); 1739786Sandreas.hansson@arm.com egress_router->setParameter("NumberVirtualNetworks", router_number_vns); 1749786Sandreas.hansson@arm.com egress_router->setParameter("NumberVirtualChannelsPerVirtualNetwork", router_number_vcs_per_vn); 1759786Sandreas.hansson@arm.com egress_router->setParameter("NumberBuffersPerVirtualChannel", router_number_bufs_per_vc); 1769549Sandreas.hansson@arm.com egress_router->setParameter("NumberBitsPerFlit", number_bits_per_flit); 1779786Sandreas.hansson@arm.com egress_router->setParameter("InputPort->BufferModel", router_buffer_model); 1789786Sandreas.hansson@arm.com egress_router->setParameter("CrossbarModel", router_crossbar_model); 1799786Sandreas.hansson@arm.com egress_router->setParameter("SwitchAllocator->ArbiterModel", getParameter("Router->SwitchAllocator->ArbiterModel")); 1809786Sandreas.hansson@arm.com egress_router->setParameter("ClockTreeModel", getParameter("Router->ClockTreeModel")); 1819786Sandreas.hansson@arm.com egress_router->setParameter("ClockTree->NumberLevels", getParameter("Router->ClockTree->NumberLevels")); 1829786Sandreas.hansson@arm.com egress_router->setParameter("ClockTree->WireLayer", getParameter("Router->ClockTree->WireLayer")); 1839549Sandreas.hansson@arm.com egress_router->setParameter("ClockTree->WireWidthMultiplier", getParameter("Router->ClockTree->WireWidthMultiplier")); 18410405Sandreas.hansson@arm.com egress_router->setParameter("ClockTree->WireSpacingMultiplier", getParameter("Router->ClockTree->WireSpacingMultiplier")); 1859549Sandreas.hansson@arm.com egress_router->construct(); 1869180Sandreas.hansson@arm.com // Init input to ingress link 1874433Ssaidi@eecs.umich.edu ElectricalModel* input_to_ingress_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "InputToIngressLink", getTechModel()); 1885562Snate@binkert.org input_to_ingress_link->setParameter("NumberBits", number_bits_per_flit); 1894433Ssaidi@eecs.umich.edu input_to_ingress_link->setParameter("WireLayer", link_wire_layer); 1909164Sandreas.hansson@arm.com input_to_ingress_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 1919164Sandreas.hansson@arm.com input_to_ingress_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 1929164Sandreas.hansson@arm.com input_to_ingress_link->construct(); 1939164Sandreas.hansson@arm.com // Init ingress to middle link 1949164Sandreas.hansson@arm.com ElectricalModel* ingress_to_middle_link = (ElectricalModel*)ModelGen::createModel("SWSRLink", "IngressToMiddleLink", getTechModel()); 1952657Ssaidi@eecs.umich.edu ingress_to_middle_link->setParameter("NumberBits", number_bits_per_flit); 1962657Ssaidi@eecs.umich.edu ingress_to_middle_link->setParameter("CoreDataRate", clock_freq); 1974433Ssaidi@eecs.umich.edu ingress_to_middle_link->setParameter("LinkDataRate", swsr_link_data_rate); 1989164Sandreas.hansson@arm.com ingress_to_middle_link->setParameter("LaserType", swsr_laser_type); 1994433Ssaidi@eecs.umich.edu ingress_to_middle_link->setParameter("RingTuningMethod", swsr_ring_tuning_method); 2009164Sandreas.hansson@arm.com ingress_to_middle_link->construct(); 2019164Sandreas.hansson@arm.com // Init middle to egress link 2029164Sandreas.hansson@arm.com ElectricalModel* middle_to_egress_link = (ElectricalModel*)ModelGen::createModel("SWSRLink", "MiddleToEgressLink", getTechModel()); 2039164Sandreas.hansson@arm.com middle_to_egress_link->setParameter("NumberBits", number_bits_per_flit); 2044433Ssaidi@eecs.umich.edu middle_to_egress_link->setParameter("CoreDataRate", clock_freq); 2054433Ssaidi@eecs.umich.edu middle_to_egress_link->setParameter("LinkDataRate", swsr_link_data_rate); 2064433Ssaidi@eecs.umich.edu middle_to_egress_link->setParameter("LaserType", swsr_laser_type); 2074433Ssaidi@eecs.umich.edu middle_to_egress_link->setParameter("RingTuningMethod", swsr_ring_tuning_method); 2089164Sandreas.hansson@arm.com middle_to_egress_link->construct(); 2092657Ssaidi@eecs.umich.edu // Init egress to output link 2109029Sandreas.hansson@arm.com ElectricalModel* egress_to_output_link = (ElectricalModel*)ModelGen::createModel("RepeatedLink", "EgressToOutputLink", getTechModel()); 2119029Sandreas.hansson@arm.com egress_to_output_link->setParameter("NumberBits", number_bits_per_flit); 21210405Sandreas.hansson@arm.com egress_to_output_link->setParameter("WireLayer", link_wire_layer); 2139029Sandreas.hansson@arm.com egress_to_output_link->setParameter("WireWidthMultiplier", link_wire_width_multiplier); 2149029Sandreas.hansson@arm.com egress_to_output_link->setParameter("WireSpacingMultiplier", link_wire_spacing_multiplier); 2159029Sandreas.hansson@arm.com egress_to_output_link->construct(); 2169542Sandreas.hansson@arm.com 2179029Sandreas.hansson@arm.com // Connect ports 2182643Sstever@eecs.umich.edu createNet("InputToIngressLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 2192643Sstever@eecs.umich.edu createNet("InputToIngressLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 2202643Sstever@eecs.umich.edu portConnect(input_to_ingress_link, "In", "InputToIngressLink_In"); 2212643Sstever@eecs.umich.edu portConnect(input_to_ingress_link, "Out", "InputToIngressLink_Out"); 2222643Sstever@eecs.umich.edu 2239164Sandreas.hansson@arm.com createNet("IngressToMiddleLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 2249164Sandreas.hansson@arm.com createNet("IngressToMiddleLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 2252568SN/A portConnect(ingress_to_middle_link, "In", "IngressToMiddleLink_In"); 2268713Sandreas.hansson@arm.com portConnect(ingress_to_middle_link, "Out", "IngressToMiddleLink_Out"); 2279164Sandreas.hansson@arm.com 2288713Sandreas.hansson@arm.com createNet("MiddleToEgressLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 2299164Sandreas.hansson@arm.com createNet("MiddleToEgressLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 2308713Sandreas.hansson@arm.com portConnect(middle_to_egress_link, "In", "MiddleToEgressLink_In"); 2318713Sandreas.hansson@arm.com portConnect(middle_to_egress_link, "Out", "MiddleToEgressLink_Out"); 2328713Sandreas.hansson@arm.com 2338713Sandreas.hansson@arm.com createNet("EgressToOutputLink_In", makeNetIndex(0, number_bits_per_flit - 1)); 2349164Sandreas.hansson@arm.com createNet("EgressToOutputLink_Out", makeNetIndex(0, number_bits_per_flit - 1)); 2358713Sandreas.hansson@arm.com portConnect(egress_to_output_link, "In", "EgressToOutputLink_In"); 2368713Sandreas.hansson@arm.com portConnect(egress_to_output_link, "Out", "EgressToOutputLink_Out"); 2379029Sandreas.hansson@arm.com 2388713Sandreas.hansson@arm.com portConnect(ingress_router, "CK", "CK"); 2399542Sandreas.hansson@arm.com for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 2409542Sandreas.hansson@arm.com { 2419029Sandreas.hansson@arm.com createNet("IngressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 2429542Sandreas.hansson@arm.com for (unsigned int j = 0; j < number_bits_per_flit; ++j) 2439164Sandreas.hansson@arm.com assignVirtualFanout("IngressRouter_In" + (String)i, makeNetIndex(j), "InputToIngressLink_Out", makeNetIndex(j)); 2448713Sandreas.hansson@arm.com portConnect(ingress_router, "FlitIn" + (String)i, "IngressRouter_In" + (String)i); 24510405Sandreas.hansson@arm.com } 2468949Sandreas.hansson@arm.com for(unsigned int i = 0; i < ingress_router_number_output_ports; ++i) 2478949Sandreas.hansson@arm.com { 2489164Sandreas.hansson@arm.com // VFI 2498713Sandreas.hansson@arm.com portConnect(ingress_router, "FlitOut" + (String)i, "IngressToMiddleLink_In"); 2508713Sandreas.hansson@arm.com } 2518713Sandreas.hansson@arm.com portConnect(middle_router, "CK", "CK"); 2528713Sandreas.hansson@arm.com for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 2538713Sandreas.hansson@arm.com { 2549164Sandreas.hansson@arm.com createNet("MiddleRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 2559164Sandreas.hansson@arm.com for (unsigned int j = 0; j < number_bits_per_flit; ++j) 2568713Sandreas.hansson@arm.com assignVirtualFanout("MiddleRouter_In" + (String)i, makeNetIndex(j), "IngressToMiddleLink_Out", makeNetIndex(j)); 2579164Sandreas.hansson@arm.com portConnect(middle_router, "FlitIn" + (String)i, "MiddleRouter_In" + (String)i); 2589164Sandreas.hansson@arm.com } 2592568SN/A for(unsigned int i = 0; i < middle_router_number_output_ports; ++i) 2602568SN/A { 2612568SN/A // VFI 2629164Sandreas.hansson@arm.com portConnect(middle_router, "FlitOut" + (String)i, "MiddleToEgressLink_In"); 2632568SN/A } 2649164Sandreas.hansson@arm.com portConnect(egress_router, "CK", "CK"); 2652568SN/A for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 2669164Sandreas.hansson@arm.com { 2672643Sstever@eecs.umich.edu createNet("EgressRouter_In" + (String)i, makeNetIndex(0, number_bits_per_flit-1)); 2689164Sandreas.hansson@arm.com for (unsigned int j = 0; j < number_bits_per_flit; ++j) 2692643Sstever@eecs.umich.edu assignVirtualFanout("EgressRouter_In" + (String)i, makeNetIndex(j), "MiddleToEgressLink_Out", makeNetIndex(j)); 2709029Sandreas.hansson@arm.com portConnect(egress_router, "FlitIn" + (String)i, "EgressRouter_In" + (String)i); 2712643Sstever@eecs.umich.edu } 2729164Sandreas.hansson@arm.com for(unsigned int i = 0; i < egress_router_number_output_ports; ++i) 2739164Sandreas.hansson@arm.com { 2744432Ssaidi@eecs.umich.edu // VFI 2758975Sandreas.hansson@arm.com portConnect(egress_router, "FlitOut" + (String)i, "EgressToOutputLink_In"); 2762643Sstever@eecs.umich.edu } 2779164Sandreas.hansson@arm.com 2789164Sandreas.hansson@arm.com // Create area, power, and event results 2792657Ssaidi@eecs.umich.edu createElectricalResults(); 2802657Ssaidi@eecs.umich.edu createElectricalEventResult("AvgUnicast"); 2819164Sandreas.hansson@arm.com createElectricalEventResult("AvgBroadcast"); 2829786Sandreas.hansson@arm.com addNddPowerResult(new Result("Laser")); 2839164Sandreas.hansson@arm.com addNddPowerResult(new Result("RingTuning")); 2849786Sandreas.hansson@arm.com addAreaResult(new Result("Photonic")); 2859648Sdam.sunwoo@arm.com 2862657Ssaidi@eecs.umich.edu // Add all instances 2879164Sandreas.hansson@arm.com addSubInstances(ingress_router, number_ingress_routers); 2889164Sandreas.hansson@arm.com addElectricalSubResults(ingress_router, number_ingress_routers); 2899164Sandreas.hansson@arm.com addSubInstances(middle_router, number_middle_routers); 2909164Sandreas.hansson@arm.com addElectricalSubResults(middle_router, number_middle_routers); 2919164Sandreas.hansson@arm.com addSubInstances(egress_router, number_egress_routers); 2929164Sandreas.hansson@arm.com addElectricalSubResults(egress_router, number_egress_routers); 2932643Sstever@eecs.umich.edu addSubInstances(input_to_ingress_link, number_input_to_ingress_links); 2944986Ssaidi@eecs.umich.edu addElectricalSubResults(input_to_ingress_link, number_input_to_ingress_links); 2959164Sandreas.hansson@arm.com addSubInstances(ingress_to_middle_link, number_ingress_to_middle_links); 2969164Sandreas.hansson@arm.com addElectricalSubResults(ingress_to_middle_link, number_ingress_to_middle_links); 2972568SN/A getAreaResult("Photonic")->addSubResult(ingress_to_middle_link->getAreaResult("Photonic"), "IngressToMiddleLink", number_ingress_to_middle_links); 2982568SN/A getNddPowerResult("Laser")->addSubResult(ingress_to_middle_link->getNddPowerResult("Laser"), "IngressToMiddleLink", number_ingress_to_middle_links); 2998713Sandreas.hansson@arm.com getNddPowerResult("RingTuning")->addSubResult(ingress_to_middle_link->getNddPowerResult("RingTuning"), "IngressToMiddleLink", number_ingress_to_middle_links); 3009164Sandreas.hansson@arm.com addSubInstances(middle_to_egress_link, number_middle_to_egress_links); 3018713Sandreas.hansson@arm.com addElectricalSubResults(middle_to_egress_link, number_middle_to_egress_links); 3029164Sandreas.hansson@arm.com getAreaResult("Photonic")->addSubResult(middle_to_egress_link->getAreaResult("Photonic"), "MiddletoEgressLink", number_middle_to_egress_links); 3038713Sandreas.hansson@arm.com getNddPowerResult("Laser")->addSubResult(middle_to_egress_link->getNddPowerResult("Laser"), "MiddleToEgressLink", number_middle_to_egress_links); 3049164Sandreas.hansson@arm.com getNddPowerResult("RingTuning")->addSubResult(middle_to_egress_link->getNddPowerResult("RingTuning"), "MiddleToEgressLink", number_middle_to_egress_links); 3058713Sandreas.hansson@arm.com addSubInstances(egress_to_output_link, number_egress_to_output_links); 3069164Sandreas.hansson@arm.com addElectricalSubResults(egress_to_output_link, number_egress_to_output_links); 3078713Sandreas.hansson@arm.com 3089029Sandreas.hansson@arm.com // Update unicast event 3098713Sandreas.hansson@arm.com Result* avg_unicast_event = getEventResult("AvgUnicast"); 3109164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 3119164Sandreas.hansson@arm.com if(ingress_router->hasEventResult("WriteBuffer")) 3128713Sandreas.hansson@arm.com { 3138975Sandreas.hansson@arm.com avg_unicast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 3148713Sandreas.hansson@arm.com } 3159164Sandreas.hansson@arm.com if(ingress_router->hasEventResult("ReadBuffer")) 3169164Sandreas.hansson@arm.com { 3178713Sandreas.hansson@arm.com avg_unicast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 3189164Sandreas.hansson@arm.com } 3199164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 3209164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 3219164Sandreas.hansson@arm.com if(middle_router->hasEventResult("WriteBuffer")) 3229164Sandreas.hansson@arm.com { 3239786Sandreas.hansson@arm.com avg_unicast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 3249164Sandreas.hansson@arm.com } 3259786Sandreas.hansson@arm.com if(middle_router->hasEventResult("ReadBuffer")) 3269648Sdam.sunwoo@arm.com { 3278713Sandreas.hansson@arm.com avg_unicast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 3288713Sandreas.hansson@arm.com } 3299164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 3309164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", 1.0); 3319164Sandreas.hansson@arm.com if(egress_router->hasEventResult("WriteBuffer")) 3329164Sandreas.hansson@arm.com { 3339164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", 1.0); 3349164Sandreas.hansson@arm.com } 3359164Sandreas.hansson@arm.com if(egress_router->hasEventResult("ReadBuffer")) 3368713Sandreas.hansson@arm.com { 3378713Sandreas.hansson@arm.com avg_unicast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", 1.0); 3388713Sandreas.hansson@arm.com } 3399164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast1"), "EgressRouter", 1.0); 3409164Sandreas.hansson@arm.com avg_unicast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", 1.0); 3418713Sandreas.hansson@arm.com 3422568SN/A // Update broadcast event 3432657Ssaidi@eecs.umich.edu Result* avg_broadcast_event = getEventResult("AvgBroadcast"); 3448713Sandreas.hansson@arm.com avg_broadcast_event->addSubResult(input_to_ingress_link->getEventResult("Send"), "InputToIngressLink", 1.0); 3452568SN/A if(ingress_router->hasEventResult("WriteBuffer")) 3469786Sandreas.hansson@arm.com { 3472568SN/A avg_broadcast_event->addSubResult(ingress_router->getEventResult("WriteBuffer"), "IngressRouter", 1.0); 3482568SN/A } 3498713Sandreas.hansson@arm.com if(ingress_router->hasEventResult("ReadBuffer")) 3508713Sandreas.hansson@arm.com { 3512568SN/A avg_broadcast_event->addSubResult(ingress_router->getEventResult("ReadBuffer"), "IngressRouter", 1.0); 3529786Sandreas.hansson@arm.com } 3532568SN/A avg_broadcast_event->addSubResult(ingress_router->getEventResult("TraverseCrossbar->Multicast1"), "IngressRouter", 1.0); 3542568SN/A avg_broadcast_event->addSubResult(ingress_to_middle_link->getEventResult("Send"), "IngressToMiddleLink", 1.0); 3558713Sandreas.hansson@arm.com if(middle_router->hasEventResult("WriteBuffer")) 3568713Sandreas.hansson@arm.com { 3578713Sandreas.hansson@arm.com avg_broadcast_event->addSubResult(middle_router->getEventResult("WriteBuffer"), "MiddleRouter", 1.0); 3589180Sandreas.hansson@arm.com } 3598713Sandreas.hansson@arm.com if(middle_router->hasEventResult("ReadBuffer")) 3608713Sandreas.hansson@arm.com { 3612568SN/A avg_broadcast_event->addSubResult(middle_router->getEventResult("ReadBuffer"), "MiddleRouter", 1.0); 3628713Sandreas.hansson@arm.com } 3632568SN/A avg_broadcast_event->addSubResult(middle_router->getEventResult("TraverseCrossbar->Multicast1"), "MiddleRouter", 1.0); 3645314Sstever@gmail.com avg_broadcast_event->addSubResult(middle_to_egress_link->getEventResult("Send"), "MiddleToEgressLink", number_egress_routers); 3655314Sstever@gmail.com if(egress_router->hasEventResult("WriteBuffer")) 3668713Sandreas.hansson@arm.com { 3679786Sandreas.hansson@arm.com avg_broadcast_event->addSubResult(egress_router->getEventResult("WriteBuffer"), "EgressRouter", number_egress_routers); 3689029Sandreas.hansson@arm.com } 3697668Ssteve.reinhardt@amd.com if(egress_router->hasEventResult("ReadBuffer")) 3704626Sstever@eecs.umich.edu { 3717668Ssteve.reinhardt@amd.com avg_broadcast_event->addSubResult(egress_router->getEventResult("ReadBuffer"), "EgressRouter", number_egress_routers); 3722568SN/A } 3732568SN/A avg_broadcast_event->addSubResult(egress_router->getEventResult("TraverseCrossbar->Multicast" + (String)number_egress_routers), "EgressRouter", 1.0); 3748713Sandreas.hansson@arm.com avg_broadcast_event->addSubResult(egress_to_output_link->getEventResult("Send"), "EgressToOutputLink", number_output_sites); 3758851Sandreas.hansson@arm.com return; 3768713Sandreas.hansson@arm.com } 3778713Sandreas.hansson@arm.com 3788713Sandreas.hansson@arm.com void PhotonicClos::updateModel() 3795314Sstever@gmail.com { 3805314Sstever@gmail.com // Assumes waveguide runs adjacent to ingress and egress routers 3814626Sstever@eecs.umich.edu // Assumes input sites belonging to each ingress router are centered around the ingress router 3828851Sandreas.hansson@arm.com // Assumes middle routers are distributed around the chip adjacent to the main waveguide 3838713Sandreas.hansson@arm.com // Assumes output sites belonging to each egress router are centered around the egress router 3848713Sandreas.hansson@arm.com 3858713Sandreas.hansson@arm.com // Get properties 3868713Sandreas.hansson@arm.com double input_site_pitch = getProperty("InputSitePitch").toDouble(); 3878713Sandreas.hansson@arm.com double output_site_pitch = getProperty("OutputSitePitch").toDouble(); 3888713Sandreas.hansson@arm.com double clock_freq = getParameter("Frequency"); 3899786Sandreas.hansson@arm.com const double swsr_opt_util = getProperty("SWSR->OptUtil"); 3908713Sandreas.hansson@arm.com 3919164Sandreas.hansson@arm.com ASSERT(input_site_pitch > 0, "[Error] " + getInstanceName() + 3929029Sandreas.hansson@arm.com " -> Input site pitch must be > 0!"); 3938713Sandreas.hansson@arm.com ASSERT(output_site_pitch > 0, "[Error] " + getInstanceName() + 3948713Sandreas.hansson@arm.com " -> Output site pitch must be > 0!"); 3958713Sandreas.hansson@arm.com 3968713Sandreas.hansson@arm.com unsigned int number_input_sites_per_ingress_router = getGenProperties()->get("NumberInputSitesPerIngressRouter"); 3978713Sandreas.hansson@arm.com unsigned int number_ingress_routers = getParameter("NumberIngressRouters"); 3988713Sandreas.hansson@arm.com unsigned int number_output_sites_per_egress_router = getGenProperties()->get("NumberOutputSitesPerEgressRouter"); 3998713Sandreas.hansson@arm.com unsigned int number_egress_routers = getParameter("NumberEgressRouters"); 4002568SN/A double delay = 1.0 / clock_freq; 4012568SN/A 4028711Sandreas.hansson@arm.com //Calculate the length of the waveguide 4039090Sandreas.hansson@arm.com double input_to_ingress_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) - 1.0); 4042568SN/A double input_to_ingress_link_delay = delay * 0.8; 4058711Sandreas.hansson@arm.com double ingress_to_middle_link_length = input_site_pitch * (sqrt(number_input_sites_per_ingress_router) * number_ingress_routers); 4062568SN/A double middle_to_egress_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) * number_egress_routers); 4072568SN/A double egress_to_output_link_length = output_site_pitch * (sqrt(number_output_sites_per_egress_router) - 1.0); 4084762Snate@binkert.org double egress_to_output_link_delay = delay * 0.8; 4094762Snate@binkert.org double ingress_router_delay = delay; 4102568SN/A double middle_router_delay = delay; 4114762Snate@binkert.org double egress_router_delay = delay; 4122568SN/A 413 Model* input_to_ingress_link = getSubInstance("InputToIngressLink"); 414 input_to_ingress_link->setProperty("WireLength", input_to_ingress_link_length); 415 input_to_ingress_link->setProperty("Delay", input_to_ingress_link_delay); 416 input_to_ingress_link->setProperty("IsKeepParity", "TRUE"); 417 input_to_ingress_link->update(); 418 419 Model* ingress_to_middle_link = getSubInstance("IngressToMiddleLink"); 420 ingress_to_middle_link->setProperty("Length", ingress_to_middle_link_length); 421 ingress_to_middle_link->setProperty("OptUtil", swsr_opt_util); 422 ingress_to_middle_link->update(); 423 424 Model* middle_to_egress_link = getSubInstance("MiddleToEgressLink"); 425 middle_to_egress_link->setProperty("Length", middle_to_egress_link_length); 426 middle_to_egress_link->setProperty("OptUtil", swsr_opt_util); 427 middle_to_egress_link->update(); 428 429 Model* egress_to_output_link = getSubInstance("EgressToOutputLink"); 430 egress_to_output_link->setProperty("WireLength", egress_to_output_link_length); 431 egress_to_output_link->setProperty("Delay", egress_to_output_link_delay); 432 egress_to_output_link->setProperty("IsKeepParity", "TRUE"); 433 egress_to_output_link->update(); 434 435 ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 436 ingress_router->update(); 437 ElectricalTimingTree ingress_router_timing_tree("IngressRouter", ingress_router); 438 ingress_router_timing_tree.performTimingOpt(ingress_router->getNet("CK"), ingress_router_delay); 439 440 ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 441 middle_router->update(); 442 ElectricalTimingTree middle_router_timing_tree("MiddleRouter", middle_router); 443 middle_router_timing_tree.performTimingOpt(middle_router->getNet("CK"), middle_router_delay); 444 445 ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 446 egress_router->update(); 447 ElectricalTimingTree egress_router_timing_tree("EgressRouter", egress_router); 448 egress_router_timing_tree.performTimingOpt(egress_router->getNet("CK"), egress_router_delay); 449 450 return; 451 } 452 453 void PhotonicClos::propagateTransitionInfo() 454 { 455 // Get parameters 456 double clock_freq = getParameter("Frequency"); 457 double swsr_link_data_rate = getParameter("SWSR->LinkDataRate"); 458 459 // Get properties 460 unsigned int ingress_router_number_input_ports = getGenProperties()->get("IngressRouter->NumberInputPorts"); 461 unsigned int middle_router_number_input_ports = getGenProperties()->get("MiddleRouter->NumberInputPorts"); 462 unsigned int egress_router_number_input_ports = getGenProperties()->get("EgressRouter->NumberInputPorts"); 463 464 ElectricalModel* input_to_ingress_link = (ElectricalModel*)getSubInstance("InputToIngressLink"); 465 assignPortTransitionInfo(input_to_ingress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 466 input_to_ingress_link->use(); 467 468 ElectricalModel* ingress_to_middle_link = (ElectricalModel*)getSubInstance("IngressToMiddleLink"); 469 assignPortTransitionInfo(ingress_to_middle_link, "LinkCK", TransitionInfo(0.0, (double) clock_freq / (swsr_link_data_rate * 2.0), 0.0)); 470 assignPortTransitionInfo(ingress_to_middle_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 471 ingress_to_middle_link->use(); 472 473 ElectricalModel* middle_to_egress_link = (ElectricalModel*)getSubInstance("MiddleToEgressLink"); 474 assignPortTransitionInfo(middle_to_egress_link, "LinkCK", TransitionInfo(0.0, (double) clock_freq / (swsr_link_data_rate * 2.0), 0.0)); 475 assignPortTransitionInfo(middle_to_egress_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 476 middle_to_egress_link->use(); 477 478 ElectricalModel* egress_to_output_link = (ElectricalModel*)getSubInstance("EgressToOutputLink"); 479 assignPortTransitionInfo(egress_to_output_link, "In", TransitionInfo(0.25, 0.25, 0.25)); 480 egress_to_output_link->use(); 481 482 ElectricalModel* ingress_router = (ElectricalModel*)getSubInstance("IngressRouter"); 483 for(unsigned int i = 0; i < ingress_router_number_input_ports; ++i) 484 { 485 assignPortTransitionInfo(ingress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 486 } 487 assignPortTransitionInfo(ingress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 488 ingress_router->getGenProperties()->set("UseModelEvent", ""); 489 ingress_router->use(); 490 491 ElectricalModel* middle_router = (ElectricalModel*)getSubInstance("MiddleRouter"); 492 for(unsigned int i = 0; i < middle_router_number_input_ports; ++i) 493 { 494 assignPortTransitionInfo(middle_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 495 } 496 assignPortTransitionInfo(middle_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 497 middle_router->getGenProperties()->set("UseModelEvent", ""); 498 middle_router->use(); 499 500 ElectricalModel* egress_router = (ElectricalModel*)getSubInstance("EgressRouter"); 501 for(unsigned int i = 0; i < egress_router_number_input_ports; ++i) 502 { 503 assignPortTransitionInfo(egress_router, "FlitIn" + (String)i, TransitionInfo(0.25, 0.25, 0.25)); 504 } 505 assignPortTransitionInfo(egress_router, "CK", TransitionInfo(0.0, 1.0, 0.0)); 506 egress_router->getGenProperties()->set("UseModelEvent", ""); 507 egress_router->use(); 508 509 return; 510 } 511} // namespace DSENT 512 513