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