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/optical/SWSRLink.h" 2310447Snilay@cs.wisc.edu 2410447Snilay@cs.wisc.edu#include "model/ModelGen.h" 2510447Snilay@cs.wisc.edu#include "model/PortInfo.h" 2610447Snilay@cs.wisc.edu#include "model/TransitionInfo.h" 2710447Snilay@cs.wisc.edu#include "model/EventInfo.h" 2810447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalGraph.h" 2910447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalWaveguide.h" 3010447Snilay@cs.wisc.edu#include "model/optical/RingModulator.h" 3110447Snilay@cs.wisc.edu#include "model/optical/RingFilter.h" 3210447Snilay@cs.wisc.edu#include "model/optical/RingDetector.h" 3310447Snilay@cs.wisc.edu#include "model/optical/LaserSource.h" 3410447Snilay@cs.wisc.edu#include "model/optical/ThrottledLaserSource.h" 3510447Snilay@cs.wisc.edu 3610447Snilay@cs.wisc.edunamespace DSENT 3710447Snilay@cs.wisc.edu{ 3810447Snilay@cs.wisc.edu SWSRLink::SWSRLink(const String& instance_name_, const TechModel* tech_model_) 3910447Snilay@cs.wisc.edu : OpticalModel(instance_name_, tech_model_) 4010447Snilay@cs.wisc.edu { 4110447Snilay@cs.wisc.edu initParameters(); 4210447Snilay@cs.wisc.edu initProperties(); 4310447Snilay@cs.wisc.edu } 4410447Snilay@cs.wisc.edu 4510447Snilay@cs.wisc.edu SWSRLink::~SWSRLink() 4610447Snilay@cs.wisc.edu {} 4710447Snilay@cs.wisc.edu 4810447Snilay@cs.wisc.edu void SWSRLink::initParameters() 4910447Snilay@cs.wisc.edu { 5010447Snilay@cs.wisc.edu addParameterName("NumberBits"); 5110447Snilay@cs.wisc.edu addParameterName("CoreDataRate"); 5210447Snilay@cs.wisc.edu addParameterName("LinkDataRate"); 5310447Snilay@cs.wisc.edu 5410447Snilay@cs.wisc.edu addParameterName("LaserType"); 5510447Snilay@cs.wisc.edu addParameterName("RingTuningMethod"); 5610447Snilay@cs.wisc.edu addParameterName("OptimizeLoss", "TRUE"); 5710447Snilay@cs.wisc.edu 5810447Snilay@cs.wisc.edu return; 5910447Snilay@cs.wisc.edu } 6010447Snilay@cs.wisc.edu 6110447Snilay@cs.wisc.edu void SWSRLink::initProperties() 6210447Snilay@cs.wisc.edu { 6310447Snilay@cs.wisc.edu addPropertyName("Length"); 6410447Snilay@cs.wisc.edu addPropertyName("OptUtil", 0.5); // default to 50% utilization (a new word 50% of the time) 6510447Snilay@cs.wisc.edu addPropertyName("ExtinctionRatio", 6); // default properties 6610447Snilay@cs.wisc.edu addPropertyName("InsertionLoss", 2); // default properties 6710447Snilay@cs.wisc.edu return; 6810447Snilay@cs.wisc.edu } 6910447Snilay@cs.wisc.edu 7010447Snilay@cs.wisc.edu void SWSRLink::constructModel() 7110447Snilay@cs.wisc.edu { 7210447Snilay@cs.wisc.edu // Get parameters 7310447Snilay@cs.wisc.edu unsigned int number_bits = getParameter("NumberBits"); 7410447Snilay@cs.wisc.edu double core_data_rate = getParameter("CoreDataRate"); 7510447Snilay@cs.wisc.edu double link_data_rate = getParameter("LinkDataRate"); 7610447Snilay@cs.wisc.edu 7710447Snilay@cs.wisc.edu // Get directly propagated parameters 7810447Snilay@cs.wisc.edu const String& ring_tuning_method = getParameter("RingTuningMethod"); 7910447Snilay@cs.wisc.edu 8010447Snilay@cs.wisc.edu // Calculate number of wavelengths needed 8110447Snilay@cs.wisc.edu unsigned int number_wavelengths = (unsigned int)((double) number_bits * core_data_rate / link_data_rate); 8210447Snilay@cs.wisc.edu 8310447Snilay@cs.wisc.edu // Set some generated properties 8410447Snilay@cs.wisc.edu getGenProperties()->set("NumberWavelengths", number_wavelengths); 8510447Snilay@cs.wisc.edu 8610447Snilay@cs.wisc.edu // Create electrical ports 8710447Snilay@cs.wisc.edu createInputPort("LinkCK"); 8810447Snilay@cs.wisc.edu createInputPort("In", makeNetIndex(0, number_bits-1)); 8910447Snilay@cs.wisc.edu createOutputPort("Out", makeNetIndex(0, number_bits-1)); 9010447Snilay@cs.wisc.edu 9110447Snilay@cs.wisc.edu // Create Waveguides 9210447Snilay@cs.wisc.edu // Temporarily assume its all on one waveguide 9310447Snilay@cs.wisc.edu createWaveguide("LaserToMod", makeWavelengthGroup(0, number_wavelengths-1)); 9410447Snilay@cs.wisc.edu createWaveguide("ModToDetector", makeWavelengthGroup(0, number_wavelengths-1)); 9510447Snilay@cs.wisc.edu 9610447Snilay@cs.wisc.edu // Add area results 9710447Snilay@cs.wisc.edu addAreaResult(new Result("Photonic")); 9810447Snilay@cs.wisc.edu createElectricalResults(); 9910447Snilay@cs.wisc.edu // Setup idle event 10010447Snilay@cs.wisc.edu getEventInfo("Idle")->setStaticTransitionInfos(); 10110447Snilay@cs.wisc.edu // Create a waveguide area result 10210447Snilay@cs.wisc.edu addAreaResult(new AtomicResult("Waveguide")); 10310447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(getAreaResult("Waveguide"), "Waveguide", 1.0); 10410447Snilay@cs.wisc.edu // Add results 10510447Snilay@cs.wisc.edu addNddPowerResult(new Result("Laser")); 10610447Snilay@cs.wisc.edu addNddPowerResult(new Result("RingTuning")); 10710447Snilay@cs.wisc.edu // Add event result 10810447Snilay@cs.wisc.edu createElectricalEventResult("Send"); 10910447Snilay@cs.wisc.edu 11010447Snilay@cs.wisc.edu // Create Tx, Rx backends 11110447Snilay@cs.wisc.edu // Create Tx electrical backend 11210447Snilay@cs.wisc.edu ElectricalModel* tx_backend = (ElectricalModel*) ModelGen::createModel("OpticalLinkBackendTx", "OpticalLinkBackendTx", getTechModel()); 11310447Snilay@cs.wisc.edu tx_backend->setParameter("InBits", number_bits); 11410447Snilay@cs.wisc.edu tx_backend->setParameter("CoreDataRate", core_data_rate); 11510447Snilay@cs.wisc.edu tx_backend->setParameter("LinkDataRate", link_data_rate); 11610447Snilay@cs.wisc.edu tx_backend->setParameter("RingTuningMethod", ring_tuning_method); 11710447Snilay@cs.wisc.edu tx_backend->setParameter("BitDuplicate", "TRUE"); 11810447Snilay@cs.wisc.edu tx_backend->construct(); 11910447Snilay@cs.wisc.edu 12010447Snilay@cs.wisc.edu // Create Rx electrical backend 12110447Snilay@cs.wisc.edu ElectricalModel* rx_backend = (ElectricalModel*) ModelGen::createModel("OpticalLinkBackendRx", "OpticalLinkBackendRx", getTechModel()); 12210447Snilay@cs.wisc.edu rx_backend->setParameter("OutBits", number_bits); 12310447Snilay@cs.wisc.edu rx_backend->setParameter("CoreDataRate", core_data_rate); 12410447Snilay@cs.wisc.edu rx_backend->setParameter("LinkDataRate", link_data_rate); 12510447Snilay@cs.wisc.edu rx_backend->setParameter("RingTuningMethod", ring_tuning_method); 12610447Snilay@cs.wisc.edu rx_backend->setParameter("BitDuplicate", "TRUE"); 12710447Snilay@cs.wisc.edu rx_backend->construct(); 12810447Snilay@cs.wisc.edu 12910447Snilay@cs.wisc.edu // Connect ports 13010447Snilay@cs.wisc.edu createNet("TxBackendToTx", makeNetIndex(0, number_wavelengths-1)); 13110447Snilay@cs.wisc.edu createNet("RxToRxBackend", makeNetIndex(0, number_wavelengths-1)); 13210447Snilay@cs.wisc.edu portConnect(tx_backend, "In", "In"); 13310447Snilay@cs.wisc.edu portConnect(tx_backend, "Out", "TxBackendToTx"); 13410447Snilay@cs.wisc.edu portConnect(tx_backend, "LinkCK", "LinkCK"); 13510447Snilay@cs.wisc.edu portConnect(rx_backend, "In", "RxToRxBackend"); 13610447Snilay@cs.wisc.edu portConnect(rx_backend, "Out", "Out"); 13710447Snilay@cs.wisc.edu portConnect(rx_backend, "LinkCK", "LinkCK"); 13810447Snilay@cs.wisc.edu 13910447Snilay@cs.wisc.edu // Add instances 14010447Snilay@cs.wisc.edu addSubInstances(tx_backend, 1.0); 14110447Snilay@cs.wisc.edu addSubInstances(rx_backend, 1.0); 14210447Snilay@cs.wisc.edu 14310447Snilay@cs.wisc.edu // Add electrical results 14410447Snilay@cs.wisc.edu addElectricalSubResults(tx_backend, 1.0); 14510447Snilay@cs.wisc.edu addElectricalSubResults(rx_backend, 1.0); 14610447Snilay@cs.wisc.edu 14710447Snilay@cs.wisc.edu // Add tuning power result 14810447Snilay@cs.wisc.edu getNddPowerResult("RingTuning")->addSubResult(tx_backend->getNddPowerResult("RingTuning"), "OpticalLinkBackendTx", 1.0); 14910447Snilay@cs.wisc.edu getNddPowerResult("RingTuning")->addSubResult(rx_backend->getNddPowerResult("RingTuning"), "OpticalLinkBackendRx", 1.0); 15010447Snilay@cs.wisc.edu 15110447Snilay@cs.wisc.edu // Add event results 15210447Snilay@cs.wisc.edu getEventInfo("Send")->setTransitionInfo("LinkCK", TransitionInfo(0.0, (double) link_data_rate / (core_data_rate * 2.0), 0.0)); 15310447Snilay@cs.wisc.edu 15410447Snilay@cs.wisc.edu getEventResult("Send")->addSubResult(tx_backend->getEventResult("ProcessBits"), "OpticalLinkBackendTx", 1.0); 15510447Snilay@cs.wisc.edu getEventResult("Send")->addSubResult(rx_backend->getEventResult("ProcessBits"), "OpticalLinkBackendRx", 1.0); 15610447Snilay@cs.wisc.edu 15710447Snilay@cs.wisc.edu buildLaser(); 15810447Snilay@cs.wisc.edu buildModulator(); 15910447Snilay@cs.wisc.edu buildDetector(); 16010447Snilay@cs.wisc.edu 16110447Snilay@cs.wisc.edu return; 16210447Snilay@cs.wisc.edu } 16310447Snilay@cs.wisc.edu 16410447Snilay@cs.wisc.edu void SWSRLink::updateModel() 16510447Snilay@cs.wisc.edu { 16610447Snilay@cs.wisc.edu // Get parameters 16710447Snilay@cs.wisc.edu double link_data_rate = getParameter("LinkDataRate"); 16810447Snilay@cs.wisc.edu 16910447Snilay@cs.wisc.edu // Get properties 17010447Snilay@cs.wisc.edu double length = getProperty("Length"); 17110447Snilay@cs.wisc.edu const String& extinction_ratio = getProperty("ExtinctionRatio"); 17210447Snilay@cs.wisc.edu const String& insertion_loss = getProperty("InsertionLoss"); 17310447Snilay@cs.wisc.edu const double opt_util = getProperty("OptUtil"); 17410447Snilay@cs.wisc.edu 17510447Snilay@cs.wisc.edu // Calculate loss for waveguide 17610447Snilay@cs.wisc.edu double waveguide_loss = getTechModel()->get("Waveguide->LossPerMeter").toDouble() * length; 17710447Snilay@cs.wisc.edu // Set loss of the waveguide 17810447Snilay@cs.wisc.edu getWaveguide("ModToDetector")->setLoss(waveguide_loss); 17910447Snilay@cs.wisc.edu // Calculate waveguide area 18010447Snilay@cs.wisc.edu double waveguide_area = length * getTechModel()->get("Waveguide->Pitch").toDouble(); 18110447Snilay@cs.wisc.edu getAreaResult("Waveguide")->setValue(waveguide_area); 18210447Snilay@cs.wisc.edu 18310447Snilay@cs.wisc.edu // Update the laser 18410447Snilay@cs.wisc.edu Model* laser = getSubInstance("Laser"); 18510447Snilay@cs.wisc.edu laser->setProperty("LaserEventTime", 1.0 / link_data_rate); 18610447Snilay@cs.wisc.edu laser->setProperty("OptUtil", opt_util); 18710447Snilay@cs.wisc.edu laser->update(); 18810447Snilay@cs.wisc.edu 18910447Snilay@cs.wisc.edu // Update the modulator 19010447Snilay@cs.wisc.edu Model* modulator = getSubInstance("Modulator"); 19110447Snilay@cs.wisc.edu modulator->setProperty("ExtinctionRatio", extinction_ratio); 19210447Snilay@cs.wisc.edu modulator->setProperty("InsertionLoss", insertion_loss); 19310447Snilay@cs.wisc.edu modulator->update(); 19410447Snilay@cs.wisc.edu 19510447Snilay@cs.wisc.edu Model* detector = getSubInstance("Detector"); 19610447Snilay@cs.wisc.edu detector->update(); 19710447Snilay@cs.wisc.edu 19810447Snilay@cs.wisc.edu Model* tx_backend = getSubInstance("OpticalLinkBackendTx"); 19910447Snilay@cs.wisc.edu tx_backend->update(); 20010447Snilay@cs.wisc.edu 20110447Snilay@cs.wisc.edu Model* rx_backend = getSubInstance("OpticalLinkBackendRx"); 20210447Snilay@cs.wisc.edu rx_backend->update(); 20310447Snilay@cs.wisc.edu 20410447Snilay@cs.wisc.edu return; 20510447Snilay@cs.wisc.edu } 20610447Snilay@cs.wisc.edu 20710447Snilay@cs.wisc.edu void SWSRLink::propagateTransitionInfo() 20810447Snilay@cs.wisc.edu { 20910447Snilay@cs.wisc.edu // Get parameters 21010447Snilay@cs.wisc.edu const String& laser_type = getParameter("LaserType"); 21110447Snilay@cs.wisc.edu 21210447Snilay@cs.wisc.edu // Propagate transition info to tx backend 21310447Snilay@cs.wisc.edu OpticalModel* tx_backend = (OpticalModel*) getSubInstance("OpticalLinkBackendTx"); 21410447Snilay@cs.wisc.edu propagatePortTransitionInfo(tx_backend, "In", "In"); 21510447Snilay@cs.wisc.edu propagatePortTransitionInfo(tx_backend, "LinkCK", "LinkCK"); 21610447Snilay@cs.wisc.edu tx_backend->use(); 21710447Snilay@cs.wisc.edu 21810447Snilay@cs.wisc.edu // Set transition info for the modulator 21910447Snilay@cs.wisc.edu OpticalModel* modulator = (OpticalModel*) getSubInstance("Modulator"); 22010447Snilay@cs.wisc.edu propagatePortTransitionInfo(modulator, "In", tx_backend, "Out"); 22110447Snilay@cs.wisc.edu modulator->use(); 22210447Snilay@cs.wisc.edu 22310447Snilay@cs.wisc.edu // Modulator out transition info 22410447Snilay@cs.wisc.edu const TransitionInfo& mod_out_transitions = modulator->getOpticalOutputPort("Out")->getTransitionInfo(); 22510447Snilay@cs.wisc.edu 22610447Snilay@cs.wisc.edu // Set transition info for the receiver 22710447Snilay@cs.wisc.edu OpticalModel* detector = (OpticalModel*) getSubInstance("Detector"); 22810447Snilay@cs.wisc.edu detector->getOpticalInputPort("In")->setTransitionInfo(mod_out_transitions); 22910447Snilay@cs.wisc.edu detector->use(); 23010447Snilay@cs.wisc.edu 23110447Snilay@cs.wisc.edu // Propagate transition info to tx backend 23210447Snilay@cs.wisc.edu OpticalModel* rx_backend = (OpticalModel*) getSubInstance("OpticalLinkBackendRx"); 23310447Snilay@cs.wisc.edu propagatePortTransitionInfo(rx_backend, "In", detector, "Out"); 23410447Snilay@cs.wisc.edu propagatePortTransitionInfo(rx_backend, "LinkCK", "LinkCK"); 23510447Snilay@cs.wisc.edu rx_backend->use(); 23610447Snilay@cs.wisc.edu 23710447Snilay@cs.wisc.edu // Propagate output transition info to output 23810447Snilay@cs.wisc.edu propagatePortTransitionInfo("Out", rx_backend, "Out"); 23910447Snilay@cs.wisc.edu 24010447Snilay@cs.wisc.edu // Set enable signals for the laser, if applicable 24110447Snilay@cs.wisc.edu if (laser_type == "Throttled") 24210447Snilay@cs.wisc.edu { 24310447Snilay@cs.wisc.edu // Figure out how many cycles the laser needs to be on 24410447Snilay@cs.wisc.edu double cycles = getInputPort("In")->getTransitionInfo().getFrequencyMultiplier(); 24510447Snilay@cs.wisc.edu 24610447Snilay@cs.wisc.edu OpticalModel* laser = (OpticalModel*) getSubInstance("Laser"); 24710447Snilay@cs.wisc.edu laser->getInputPort("LaserEnable")->setTransitionInfo(TransitionInfo(0.0, 1.0, cycles - 1.0)); 24810447Snilay@cs.wisc.edu laser->use(); 24910447Snilay@cs.wisc.edu } 25010447Snilay@cs.wisc.edu 25110447Snilay@cs.wisc.edu 25210447Snilay@cs.wisc.edu return; 25310447Snilay@cs.wisc.edu } 25410447Snilay@cs.wisc.edu 25510447Snilay@cs.wisc.edu void SWSRLink::buildLaser() 25610447Snilay@cs.wisc.edu { 25710447Snilay@cs.wisc.edu // Get parameters 25810447Snilay@cs.wisc.edu unsigned int number_wavelengths = getGenProperties()->get("NumberWavelengths"); 25910447Snilay@cs.wisc.edu const String& laser_type = getParameter("LaserType"); 26010447Snilay@cs.wisc.edu 26110447Snilay@cs.wisc.edu // Create laser 26210447Snilay@cs.wisc.edu OpticalModel* laser = NULL; 26310447Snilay@cs.wisc.edu if (laser_type == "Throttled") laser = new ThrottledLaserSource("Laser", getTechModel()); 26410447Snilay@cs.wisc.edu else if (laser_type == "Standard") laser = new LaserSource("Laser", getTechModel()); 26510447Snilay@cs.wisc.edu else ASSERT(false, "[Error] " + getInstanceName() + " -> Unknown laser type '" + laser_type + "'!"); 26610447Snilay@cs.wisc.edu 26710447Snilay@cs.wisc.edu laser->setParameter("OutStart", 0); 26810447Snilay@cs.wisc.edu laser->setParameter("OutEnd", number_wavelengths-1); 26910447Snilay@cs.wisc.edu laser->setParameter("MaxDetectors", 1); 27010447Snilay@cs.wisc.edu laser->setParameter("MinDetectors", 1); 27110447Snilay@cs.wisc.edu laser->construct(); 27210447Snilay@cs.wisc.edu 27310447Snilay@cs.wisc.edu addSubInstances(laser, 1.0); 27410447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(laser->getAreaResult("Photonic"), "Laser", 1.0); 27510447Snilay@cs.wisc.edu // Connect laser output port 27610447Snilay@cs.wisc.edu opticalPortConnect(laser, "Out", "LaserToMod"); 27710447Snilay@cs.wisc.edu 27810447Snilay@cs.wisc.edu // Without laser gating, laser is pure NDD power 27910447Snilay@cs.wisc.edu if (laser_type == "Standard") getNddPowerResult("Laser")->addSubResult(laser->getNddPowerResult("Laser"), "Laser", 1.0); 28010447Snilay@cs.wisc.edu // With laser power gating, laser is an event 28110447Snilay@cs.wisc.edu else getEventResult("Send")->addSubResult(laser->getEventResult("Laser1"), "Laser", 1.0); 28210447Snilay@cs.wisc.edu 28310447Snilay@cs.wisc.edu return; 28410447Snilay@cs.wisc.edu } 28510447Snilay@cs.wisc.edu 28610447Snilay@cs.wisc.edu void SWSRLink::buildModulator() 28710447Snilay@cs.wisc.edu { 28810447Snilay@cs.wisc.edu // Get parameters 28910447Snilay@cs.wisc.edu double link_data_rate = getParameter("LinkDataRate"); 29010447Snilay@cs.wisc.edu const String& optimize_loss = getParameter("OptimizeLoss"); 29110447Snilay@cs.wisc.edu unsigned int number_wavelengths = getGenProperties()->get("NumberWavelengths"); 29210447Snilay@cs.wisc.edu 29310447Snilay@cs.wisc.edu // Create modulator 29410447Snilay@cs.wisc.edu RingModulator* modulator = new RingModulator("Modulator", getTechModel()); 29510447Snilay@cs.wisc.edu modulator->setParameter("DataRate", link_data_rate); 29610447Snilay@cs.wisc.edu modulator->setParameter("InStart", 0); 29710447Snilay@cs.wisc.edu modulator->setParameter("InEnd", number_wavelengths-1); 29810447Snilay@cs.wisc.edu modulator->setParameter("ModStart", 0); 29910447Snilay@cs.wisc.edu modulator->setParameter("ModEnd", number_wavelengths-1); 30010447Snilay@cs.wisc.edu modulator->setParameter("OptimizeLoss", optimize_loss); 30110447Snilay@cs.wisc.edu modulator->construct(); 30210447Snilay@cs.wisc.edu addSubInstances(modulator, 1.0); 30310447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(modulator->getAreaResult("Photonic"), "Modulator", 1.0); 30410447Snilay@cs.wisc.edu addElectricalSubResults(modulator, 1.0); 30510447Snilay@cs.wisc.edu 30610447Snilay@cs.wisc.edu // Connect electrical port 30710447Snilay@cs.wisc.edu portConnect(modulator, "In", "TxBackendToTx"); 30810447Snilay@cs.wisc.edu // Connect modulator input, output port 30910447Snilay@cs.wisc.edu opticalPortConnect(modulator, "In", "LaserToMod"); 31010447Snilay@cs.wisc.edu opticalPortConnect(modulator, "Out", "ModToDetector"); 31110447Snilay@cs.wisc.edu 31210447Snilay@cs.wisc.edu // Add modulator energy event for send events 31310447Snilay@cs.wisc.edu getEventResult("Send")->addSubResult(modulator->getEventResult("Modulate"), "Modulator", 1.0); 31410447Snilay@cs.wisc.edu return; 31510447Snilay@cs.wisc.edu } 31610447Snilay@cs.wisc.edu 31710447Snilay@cs.wisc.edu void SWSRLink::buildDetector() 31810447Snilay@cs.wisc.edu { 31910447Snilay@cs.wisc.edu // Get parameters 32010447Snilay@cs.wisc.edu double link_data_rate = getParameter("LinkDataRate"); 32110447Snilay@cs.wisc.edu unsigned int number_wavelengths = getGenProperties()->get("NumberWavelengths"); 32210447Snilay@cs.wisc.edu 32310447Snilay@cs.wisc.edu // Create resonant ring detector 32410447Snilay@cs.wisc.edu RingDetector* detector = new RingDetector("Detector", getTechModel()); 32510447Snilay@cs.wisc.edu detector->setParameter("DataRate", link_data_rate); 32610447Snilay@cs.wisc.edu detector->setParameter("InStart", 0); 32710447Snilay@cs.wisc.edu detector->setParameter("InEnd", number_wavelengths-1); 32810447Snilay@cs.wisc.edu detector->setParameter("DetStart", 0); 32910447Snilay@cs.wisc.edu detector->setParameter("DetEnd", number_wavelengths-1); 33010447Snilay@cs.wisc.edu detector->setParameter("DropAll", "TRUE"); 33110447Snilay@cs.wisc.edu detector->setParameter("Topology", RingDetector::INTEGRATINGSENSEAMP); 33210447Snilay@cs.wisc.edu detector->construct(); 33310447Snilay@cs.wisc.edu addSubInstances(detector, 1.0); 33410447Snilay@cs.wisc.edu getAreaResult("Photonic")->addSubResult(detector->getAreaResult("Photonic"), "Detector", 1.0); 33510447Snilay@cs.wisc.edu addElectricalSubResults(detector, 1.0); 33610447Snilay@cs.wisc.edu 33710447Snilay@cs.wisc.edu // connect to electrical port 33810447Snilay@cs.wisc.edu portConnect(detector, "Out", "RxToRxBackend"); 33910447Snilay@cs.wisc.edu // connect optical input, output port 34010447Snilay@cs.wisc.edu opticalPortConnect(detector, "In", "ModToDetector"); 34110447Snilay@cs.wisc.edu 34210447Snilay@cs.wisc.edu // Add receiver energy 34310447Snilay@cs.wisc.edu getEventResult("Send")->addSubResult(detector->getEventResult("Receive"), "Detector", 1.0); 34410447Snilay@cs.wisc.edu 34510447Snilay@cs.wisc.edu return; 34610447Snilay@cs.wisc.edu } 34710447Snilay@cs.wisc.edu 34810447Snilay@cs.wisc.edu} // namespace DSENT 34910447Snilay@cs.wisc.edu 350