GatedLaserSource.cc revision 10447
110447Snilay@cs.wisc.edu#include "model/optical/GatedLaserSource.h" 210447Snilay@cs.wisc.edu 310447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalWaveguide.h" 410447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalWavelength.h" 510447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalLaser.h" 610447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalGraph.h" 710447Snilay@cs.wisc.edu 810447Snilay@cs.wisc.edunamespace DSENT 910447Snilay@cs.wisc.edu{ 1010447Snilay@cs.wisc.edu GatedLaserSource::GatedLaserSource(const String& instance_name_, const TechModel* tech_model_) 1110447Snilay@cs.wisc.edu : OpticalModel(instance_name_, tech_model_) 1210447Snilay@cs.wisc.edu { 1310447Snilay@cs.wisc.edu initParameters(); 1410447Snilay@cs.wisc.edu initProperties(); 1510447Snilay@cs.wisc.edu } 1610447Snilay@cs.wisc.edu 1710447Snilay@cs.wisc.edu GatedLaserSource::~GatedLaserSource() 1810447Snilay@cs.wisc.edu {} 1910447Snilay@cs.wisc.edu 2010447Snilay@cs.wisc.edu void GatedLaserSource::initParameters() 2110447Snilay@cs.wisc.edu { 2210447Snilay@cs.wisc.edu addParameterName("OutStart"); 2310447Snilay@cs.wisc.edu addParameterName("OutEnd"); 2410447Snilay@cs.wisc.edu addParameterName("MaxDetectors"); 2510447Snilay@cs.wisc.edu return; 2610447Snilay@cs.wisc.edu } 2710447Snilay@cs.wisc.edu 2810447Snilay@cs.wisc.edu void GatedLaserSource::initProperties() 2910447Snilay@cs.wisc.edu { 3010447Snilay@cs.wisc.edu addPropertyName("OptUtil", 1.0); 3110447Snilay@cs.wisc.edu addPropertyName("LaserEventTime"); 3210447Snilay@cs.wisc.edu return; 3310447Snilay@cs.wisc.edu } 3410447Snilay@cs.wisc.edu 3510447Snilay@cs.wisc.edu void GatedLaserSource::constructModel() 3610447Snilay@cs.wisc.edu { 3710447Snilay@cs.wisc.edu // Create Area result 3810447Snilay@cs.wisc.edu Result* area_result = new AtomicResult("Photonic"); 3910447Snilay@cs.wisc.edu addAreaResult(area_result); 4010447Snilay@cs.wisc.edu // Create NDD power result 4110447Snilay@cs.wisc.edu Result* energy_result = new AtomicResult("Laser"); 4210447Snilay@cs.wisc.edu addEventResult(energy_result); 4310447Snilay@cs.wisc.edu 4410447Snilay@cs.wisc.edu // Get parameters 4510447Snilay@cs.wisc.edu WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 4610447Snilay@cs.wisc.edu 4710447Snilay@cs.wisc.edu // Create optical ports 4810447Snilay@cs.wisc.edu createOpticalOutputPort( "Out", laser_wavelengths); 4910447Snilay@cs.wisc.edu // Create the filter 5010447Snilay@cs.wisc.edu createLaser( "Laser", laser_wavelengths); 5110447Snilay@cs.wisc.edu OpticalLaser* laser = getLaser("Laser"); 5210447Snilay@cs.wisc.edu // Connect the laser to the output 5310447Snilay@cs.wisc.edu laser->addDownstreamNode(getWaveguide("Out")); 5410447Snilay@cs.wisc.edu } 5510447Snilay@cs.wisc.edu 5610447Snilay@cs.wisc.edu void GatedLaserSource::updateModel() 5710447Snilay@cs.wisc.edu { 5810447Snilay@cs.wisc.edu // Get properties 5910447Snilay@cs.wisc.edu double laser_efficiency = getTechModel()->get("Laser->CW->Efficiency"); 6010447Snilay@cs.wisc.edu double laser_area = getTechModel()->get("Laser->CW->Area"); 6110447Snilay@cs.wisc.edu double laser_diode_loss = getTechModel()->get("Laser->CW->LaserDiodeLoss"); 6210447Snilay@cs.wisc.edu 6310447Snilay@cs.wisc.edu // Get parameters 6410447Snilay@cs.wisc.edu WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 6510447Snilay@cs.wisc.edu unsigned int number_wavelengths = laser_wavelengths.second - laser_wavelengths.first + 1; 6610447Snilay@cs.wisc.edu // Update losses 6710447Snilay@cs.wisc.edu OpticalLaser* laser = getLaser("Laser"); 6810447Snilay@cs.wisc.edu laser->setLoss(laser_diode_loss); 6910447Snilay@cs.wisc.edu laser->setEfficiency(laser_efficiency); 7010447Snilay@cs.wisc.edu // Update area 7110447Snilay@cs.wisc.edu getAreaResult("Photonic")->setValue(laser_area * number_wavelengths); 7210447Snilay@cs.wisc.edu } 7310447Snilay@cs.wisc.edu 7410447Snilay@cs.wisc.edu void GatedLaserSource::evaluateModel() 7510447Snilay@cs.wisc.edu { 7610447Snilay@cs.wisc.edu // Get parameters 7710447Snilay@cs.wisc.edu unsigned int max_detectors = getParameter("MaxDetectors"); 7810447Snilay@cs.wisc.edu double laser_event_time = getProperty("LaserEventTime"); 7910447Snilay@cs.wisc.edu WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 8010447Snilay@cs.wisc.edu 8110447Snilay@cs.wisc.edu // Get properties 8210447Snilay@cs.wisc.edu double opt_util = getProperty("OptUtil"); 8310447Snilay@cs.wisc.edu 8410447Snilay@cs.wisc.edu // Create optical graph object 8510447Snilay@cs.wisc.edu OpticalGraph* optical_graph = new OpticalGraph("LaserTrace", this); 8610447Snilay@cs.wisc.edu // Ask optical graph object to perform power optimization 8710447Snilay@cs.wisc.edu bool success = optical_graph->performPowerOpt(getLaser("Laser"), laser_wavelengths, max_detectors, opt_util); 8810447Snilay@cs.wisc.edu if (!success) 8910447Snilay@cs.wisc.edu { 9010447Snilay@cs.wisc.edu Log::printLine(std::cerr, "[Warning] " + getInstanceName() + 9110447Snilay@cs.wisc.edu " -> Wavelengths contains data paths with no possible modulator configurations!"); 9210447Snilay@cs.wisc.edu } 9310447Snilay@cs.wisc.edu // Trace the wavelengths the laser is outputting to find the output 9410447Snilay@cs.wisc.edu // power needed by the laser 9510447Snilay@cs.wisc.edu OpticalWavelength* wavelength = optical_graph->traceWavelength(laser_wavelengths, getLaser("Laser")); 9610447Snilay@cs.wisc.edu // Calculate the power needed by the wavelength 9710447Snilay@cs.wisc.edu double laser_power = wavelength->getLaserPower(max_detectors); 9810447Snilay@cs.wisc.edu // Calculate NDD power 9910447Snilay@cs.wisc.edu getEventResult("Laser")->setValue(laser_power * laser_event_time); 10010447Snilay@cs.wisc.edu 10110447Snilay@cs.wisc.edu delete wavelength; 10210447Snilay@cs.wisc.edu delete optical_graph; 10310447Snilay@cs.wisc.edu } 10410447Snilay@cs.wisc.edu 10510447Snilay@cs.wisc.edu} // namespace DSENT 10610447Snilay@cs.wisc.edu 107