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