RouterSwitchAllocator.cc revision 10448:bc1a3b7ab5ef
19241Sandreas.hansson@arm.com/* Copyright (c) 2012 Massachusetts Institute of Technology
29717Sandreas.hansson@arm.com *
39241Sandreas.hansson@arm.com * Permission is hereby granted, free of charge, to any person obtaining a copy
49241Sandreas.hansson@arm.com * of this software and associated documentation files (the "Software"), to deal
59241Sandreas.hansson@arm.com * in the Software without restriction, including without limitation the rights
69241Sandreas.hansson@arm.com * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
79241Sandreas.hansson@arm.com * copies of the Software, and to permit persons to whom the Software is
89241Sandreas.hansson@arm.com * furnished to do so, subject to the following conditions:
99241Sandreas.hansson@arm.com *
109241Sandreas.hansson@arm.com * The above copyright notice and this permission notice shall be included in
119241Sandreas.hansson@arm.com * all copies or substantial portions of the Software.
129241Sandreas.hansson@arm.com *
139241Sandreas.hansson@arm.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
149241Sandreas.hansson@arm.com * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
159241Sandreas.hansson@arm.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
169241Sandreas.hansson@arm.com * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
179241Sandreas.hansson@arm.com * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
189241Sandreas.hansson@arm.com * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
199241Sandreas.hansson@arm.com * THE SOFTWARE.
209241Sandreas.hansson@arm.com */
219241Sandreas.hansson@arm.com
229241Sandreas.hansson@arm.com#include "model/electrical/router/RouterSwitchAllocator.h"
239241Sandreas.hansson@arm.com
249241Sandreas.hansson@arm.com#include "model/PortInfo.h"
259241Sandreas.hansson@arm.com#include "model/EventInfo.h"
269241Sandreas.hansson@arm.com#include "model/TransitionInfo.h"
279241Sandreas.hansson@arm.com#include "model/ModelGen.h"
289241Sandreas.hansson@arm.com#include "model/std_cells/StdCell.h"
299241Sandreas.hansson@arm.com#include "model/std_cells/StdCellLib.h"
309241Sandreas.hansson@arm.com
319241Sandreas.hansson@arm.comnamespace DSENT
329241Sandreas.hansson@arm.com{
339241Sandreas.hansson@arm.com    RouterSwitchAllocator::RouterSwitchAllocator(const String& instance_name_, const TechModel* tech_model_)
349241Sandreas.hansson@arm.com        : ElectricalModel(instance_name_, tech_model_)
359241Sandreas.hansson@arm.com    {
369241Sandreas.hansson@arm.com        initParameters();
379241Sandreas.hansson@arm.com        initProperties();
389241Sandreas.hansson@arm.com    }
399241Sandreas.hansson@arm.com
409241Sandreas.hansson@arm.com    RouterSwitchAllocator::~RouterSwitchAllocator()
419666Sandreas.hansson@arm.com    {}
429666Sandreas.hansson@arm.com
439241Sandreas.hansson@arm.com    void RouterSwitchAllocator::initParameters()
4411168Sandreas.hansson@arm.com    {
4511168Sandreas.hansson@arm.com        addParameterName("NumberInputPorts");
469719Sandreas.hansson@arm.com        addParameterName("NumberOutputPorts");
479666Sandreas.hansson@arm.com        addParameterName("TotalNumberVirtualChannels");
489241Sandreas.hansson@arm.com        addParameterName("ArbiterModel");
499241Sandreas.hansson@arm.com        return;
509241Sandreas.hansson@arm.com    }
519241Sandreas.hansson@arm.com
529241Sandreas.hansson@arm.com    void RouterSwitchAllocator::initProperties()
539241Sandreas.hansson@arm.com    {}
549717Sandreas.hansson@arm.com
559717Sandreas.hansson@arm.com    RouterSwitchAllocator* RouterSwitchAllocator::clone() const
569717Sandreas.hansson@arm.com    {
579717Sandreas.hansson@arm.com        // TODO
589717Sandreas.hansson@arm.com        return NULL;
599717Sandreas.hansson@arm.com    }
609241Sandreas.hansson@arm.com
619241Sandreas.hansson@arm.com    void RouterSwitchAllocator::constructModel()
629241Sandreas.hansson@arm.com    {
639241Sandreas.hansson@arm.com        // Get parameters
649241Sandreas.hansson@arm.com        unsigned int number_input_ports = getParameter("NumberInputPorts").toUInt();
659241Sandreas.hansson@arm.com        unsigned int number_output_ports = getParameter("NumberOutputPorts").toUInt();
669241Sandreas.hansson@arm.com        unsigned int total_number_vcs = getParameter("TotalNumberVirtualChannels").toUInt();
679717Sandreas.hansson@arm.com        const String& arb_model = getParameter("ArbiterModel");
689717Sandreas.hansson@arm.com
699717Sandreas.hansson@arm.com        ASSERT(number_input_ports > 0, "[Error] " + getInstanceName() +
709717Sandreas.hansson@arm.com                " -> Number of input ports must be > 0!");
719717Sandreas.hansson@arm.com        ASSERT(number_output_ports > 0, "[Error] " + getInstanceName() +
729717Sandreas.hansson@arm.com                " -> Number of output ports must be > 0!");
739717Sandreas.hansson@arm.com        ASSERT(total_number_vcs > 0, "[Error] " + getInstanceName() +
749717Sandreas.hansson@arm.com                " -> Total number of virtual channels must be > 0!");
759717Sandreas.hansson@arm.com
769717Sandreas.hansson@arm.com        unsigned int stage1_number_requests = total_number_vcs;
779717Sandreas.hansson@arm.com        unsigned int number_stage1_arbiters = number_input_ports;
789717Sandreas.hansson@arm.com        unsigned int stage2_number_requests = number_input_ports;
799717Sandreas.hansson@arm.com        unsigned int number_stage2_arbiters = number_output_ports;
809717Sandreas.hansson@arm.com
819717Sandreas.hansson@arm.com        getGenProperties()->set("NumberStage1Arbiters", number_stage1_arbiters);
829718Sandreas.hansson@arm.com        getGenProperties()->set("Stage1->NumberRequests", stage1_number_requests);
839717Sandreas.hansson@arm.com        getGenProperties()->set("NumberStage2Arbiters", number_stage2_arbiters);
849717Sandreas.hansson@arm.com        getGenProperties()->set("Stage2->NumberRequests", stage2_number_requests);
859717Sandreas.hansson@arm.com
869717Sandreas.hansson@arm.com        // Create ports
879717Sandreas.hansson@arm.com        createInputPort("CK");
889717Sandreas.hansson@arm.com        for(unsigned int i = 0; i < number_stage1_arbiters; ++i)
899717Sandreas.hansson@arm.com        {
909717Sandreas.hansson@arm.com            for(unsigned int j = 0; j < stage1_number_requests; ++j)
919719Sandreas.hansson@arm.com            {
929719Sandreas.hansson@arm.com                createInputPort(String::format("Stage1Arb%d->Request%d", i, j));
939719Sandreas.hansson@arm.com                createInputPort(String::format("Stage1Arb%d->Grant%d", i, j));
949719Sandreas.hansson@arm.com            }
9510713Sandreas.hansson@arm.com        }
969719Sandreas.hansson@arm.com        for(unsigned int i = 0; i < number_stage2_arbiters; ++i)
979717Sandreas.hansson@arm.com        {
989717Sandreas.hansson@arm.com            for(unsigned int j = 0; j < stage2_number_requests; ++j)
999717Sandreas.hansson@arm.com            {
1009717Sandreas.hansson@arm.com                createInputPort(String::format("Stage2Arb%d->Request%d", i, j));
1019717Sandreas.hansson@arm.com                createInputPort(String::format("Stage2Arb%d->Grant%d", i, j));
1029717Sandreas.hansson@arm.com            }
1039717Sandreas.hansson@arm.com        }
1049717Sandreas.hansson@arm.com
1059241Sandreas.hansson@arm.com        // Create area, power, and event results
1069241Sandreas.hansson@arm.com        createElectricalResults();
1079241Sandreas.hansson@arm.com        getEventInfo("Idle")->setStaticTransitionInfos();
1089241Sandreas.hansson@arm.com        getEventInfo("Idle")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
1099241Sandreas.hansson@arm.com
1109241Sandreas.hansson@arm.com        createElectricalEventResult("ArbitrateStage1");
1119241Sandreas.hansson@arm.com        getEventInfo("ArbitrateStage1")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
1129241Sandreas.hansson@arm.com        createElectricalEventResult("ArbitrateStage2");
1139241Sandreas.hansson@arm.com        getEventInfo("ArbitrateStage2")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
1149241Sandreas.hansson@arm.com
1159718Sandreas.hansson@arm.com        // Init Stage1 arbiter
1169718Sandreas.hansson@arm.com        vector<String> stage1_arb_dff_names(stage1_number_requests, "");
1179718Sandreas.hansson@arm.com        vector<StdCell*> stage1_arb_dffs(stage1_number_requests, NULL);
1189718Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage1_number_requests; ++i)
1199718Sandreas.hansson@arm.com        {
1209720Sandreas.hansson@arm.com            stage1_arb_dff_names[i] = "Stage1ArbDFF" + (String)i;
1219720Sandreas.hansson@arm.com            stage1_arb_dffs[i] = getTechModel()->getStdCellLib()->createStdCell("DFFQ", stage1_arb_dff_names[i]);
1229720Sandreas.hansson@arm.com            stage1_arb_dffs[i]->construct();
1239720Sandreas.hansson@arm.com        }
1249720Sandreas.hansson@arm.com        const String& stage1_arb_name = "Stage1Arb";
1259720Sandreas.hansson@arm.com        ElectricalModel* stage1_arb = (ElectricalModel*)ModelGen::createModel(arb_model, stage1_arb_name, getTechModel());
1269717Sandreas.hansson@arm.com        stage1_arb->setParameter("NumberRequests", stage1_number_requests);
1279717Sandreas.hansson@arm.com        stage1_arb->construct();
1289241Sandreas.hansson@arm.com
1299719Sandreas.hansson@arm.com        // Init stage2 arbiter
1309719Sandreas.hansson@arm.com        vector<String> stage2_arb_dff_names(stage2_number_requests, "");
1319719Sandreas.hansson@arm.com        vector<StdCell*> stage2_arb_dffs(stage2_number_requests, NULL);
1329717Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage2_number_requests; ++i)
1339717Sandreas.hansson@arm.com        {
1349241Sandreas.hansson@arm.com            stage2_arb_dff_names[i] = "Stage2ArbDFF" + (String)i;
1359717Sandreas.hansson@arm.com            stage2_arb_dffs[i] = getTechModel()->getStdCellLib()->createStdCell("DFFQ", stage2_arb_dff_names[i]);
1369717Sandreas.hansson@arm.com            stage2_arb_dffs[i]->construct();
1379241Sandreas.hansson@arm.com        }
1389717Sandreas.hansson@arm.com        const String& stage2_arb_name = "Stage2Arb";
13911168Sandreas.hansson@arm.com        ElectricalModel* stage2_arb = (ElectricalModel*)ModelGen::createModel(arb_model, stage2_arb_name, getTechModel());
1409241Sandreas.hansson@arm.com        stage2_arb->setParameter("NumberRequests", stage2_number_requests);
1419719Sandreas.hansson@arm.com        stage2_arb->construct();
1429719Sandreas.hansson@arm.com
1439241Sandreas.hansson@arm.com        // Connect ports
1449241Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage1_number_requests; ++i)
1459241Sandreas.hansson@arm.com        {
1469719Sandreas.hansson@arm.com            const String& dff_in_name = "Stage1Arb_DFF_In" + (String)i;
1479719Sandreas.hansson@arm.com            const String& req_name = "Stage1Arb->Request" + (String)i;
1489241Sandreas.hansson@arm.com            const String& grant_name = "Stage1Arb->Grant" + (String)i;
1499241Sandreas.hansson@arm.com            createNet(dff_in_name);
1509241Sandreas.hansson@arm.com            createNet(req_name);
1519241Sandreas.hansson@arm.com            createNet(grant_name);
15210713Sandreas.hansson@arm.com            portConnect(stage1_arb_dffs[i], "D", dff_in_name);
1539719Sandreas.hansson@arm.com            portConnect(stage1_arb_dffs[i], "CK", "CK");
1549241Sandreas.hansson@arm.com            portConnect(stage1_arb_dffs[i], "Q", req_name);
1559241Sandreas.hansson@arm.com            portConnect(stage1_arb, "Request" + (String)i, req_name);
15610704Sandreas.hansson@arm.com            portConnect(stage1_arb, "Grant" + (String)i, grant_name);
15710704Sandreas.hansson@arm.com            for(unsigned int j = 0; j < number_stage1_arbiters; ++j)
15810704Sandreas.hansson@arm.com            {
15910704Sandreas.hansson@arm.com                assignVirtualFanin(dff_in_name, String::format("Stage1Arb%d->Request%d", j, i));
16010704Sandreas.hansson@arm.com                assignVirtualFanout(String::format("Stage1Arb%d->Grant%d", j, i), grant_name);
16110704Sandreas.hansson@arm.com            }
1629241Sandreas.hansson@arm.com        }
1639241Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage2_number_requests; ++i)
1649719Sandreas.hansson@arm.com        {
1659241Sandreas.hansson@arm.com            const String& dff_in_name = "Stage2Arb_DFF_In" + (String)i;
1669241Sandreas.hansson@arm.com            const String& req_name = "Stage2Arb->Request" + (String)i;
1679241Sandreas.hansson@arm.com            const String& grant_name = "Stage2Arb->Grant" + (String)i;
1689717Sandreas.hansson@arm.com            createNet(dff_in_name);
1699241Sandreas.hansson@arm.com            createNet(req_name);
1709241Sandreas.hansson@arm.com            createNet(grant_name);
1719719Sandreas.hansson@arm.com            portConnect(stage2_arb_dffs[i], "D", dff_in_name);
1729719Sandreas.hansson@arm.com            portConnect(stage2_arb_dffs[i], "CK", "CK");
1739719Sandreas.hansson@arm.com            portConnect(stage2_arb_dffs[i], "Q", req_name);
1749719Sandreas.hansson@arm.com            portConnect(stage2_arb, "Request" + (String)i, req_name);
1759719Sandreas.hansson@arm.com            portConnect(stage2_arb, "Grant" + (String)i, grant_name);
1769719Sandreas.hansson@arm.com            for(unsigned int j = 0; j < number_stage2_arbiters; ++j)
1779717Sandreas.hansson@arm.com            {
1789717Sandreas.hansson@arm.com                assignVirtualFanin(dff_in_name, String::format("Stage2Arb%d->Request%d", j, i));
1799241Sandreas.hansson@arm.com                assignVirtualFanout(String::format("Stage2Arb%d->Grant%d", j, i), grant_name);
1809719Sandreas.hansson@arm.com            }
1819719Sandreas.hansson@arm.com        }
1829719Sandreas.hansson@arm.com
1839719Sandreas.hansson@arm.com        // Add sub components
1849719Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage1_number_requests; ++i)
1859719Sandreas.hansson@arm.com        {
1869719Sandreas.hansson@arm.com            addSubInstances(stage1_arb_dffs[i], 1.0);
1879719Sandreas.hansson@arm.com            addElectricalSubResults(stage1_arb_dffs[i], 1.0);
1889241Sandreas.hansson@arm.com        }
1899241Sandreas.hansson@arm.com        addSubInstances(stage1_arb, number_stage1_arbiters);
1909241Sandreas.hansson@arm.com        addElectricalSubResults(stage1_arb, number_stage1_arbiters);
1919241Sandreas.hansson@arm.com        for(unsigned int i = 0; i < stage2_number_requests; ++i)
1929241Sandreas.hansson@arm.com        {
1939241Sandreas.hansson@arm.com            addSubInstances(stage2_arb_dffs[i], 1.0);
1949241Sandreas.hansson@arm.com            addElectricalSubResults(stage2_arb_dffs[i], 1.0);
19511169Sandreas.hansson@arm.com        }
19611169Sandreas.hansson@arm.com        addSubInstances(stage2_arb, number_stage2_arbiters);
1979241Sandreas.hansson@arm.com        addElectricalSubResults(stage2_arb, number_stage2_arbiters);
19811169Sandreas.hansson@arm.com
1999241Sandreas.hansson@arm.com        // Update stage1 arb arbitrate
20011169Sandreas.hansson@arm.com        getEventResult("ArbitrateStage1")->addSubResult(stage1_arb->getEventResult("Arbitrate"), stage1_arb_name, 1.0);
2019241Sandreas.hansson@arm.com
20211168Sandreas.hansson@arm.com        // Update stage2 arb arbitrate
2039241Sandreas.hansson@arm.com        getEventResult("ArbitrateStage2")->addSubResult(stage2_arb->getEventResult("Arbitrate"), stage2_arb_name, 1.0);
20411168Sandreas.hansson@arm.com        return;
20511168Sandreas.hansson@arm.com    }
2069241Sandreas.hansson@arm.com
2079719Sandreas.hansson@arm.com    void RouterSwitchAllocator::propagateTransitionInfo()
20811169Sandreas.hansson@arm.com    {
2099719Sandreas.hansson@arm.com        ElectricalModel* stage1_arb = (ElectricalModel*)getSubInstance("Stage1Arb");
2109241Sandreas.hansson@arm.com        stage1_arb->applyTransitionInfo("Arbitrate");
2119241Sandreas.hansson@arm.com        stage1_arb->use();
2129666Sandreas.hansson@arm.com
213        ElectricalModel* stage2_arb = (ElectricalModel*)getSubInstance("Stage2Arb");
214        stage2_arb->applyTransitionInfo("Arbitrate");
215        stage2_arb->use();
216
217        return;
218    }
219} // namespace DSENT
220
221