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