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