GatedLaserSource.cc revision 10447
1#include "model/optical/GatedLaserSource.h" 2 3#include "model/optical_graph/OpticalWaveguide.h" 4#include "model/optical_graph/OpticalWavelength.h" 5#include "model/optical_graph/OpticalLaser.h" 6#include "model/optical_graph/OpticalGraph.h" 7 8namespace DSENT 9{ 10 GatedLaserSource::GatedLaserSource(const String& instance_name_, const TechModel* tech_model_) 11 : OpticalModel(instance_name_, tech_model_) 12 { 13 initParameters(); 14 initProperties(); 15 } 16 17 GatedLaserSource::~GatedLaserSource() 18 {} 19 20 void GatedLaserSource::initParameters() 21 { 22 addParameterName("OutStart"); 23 addParameterName("OutEnd"); 24 addParameterName("MaxDetectors"); 25 return; 26 } 27 28 void GatedLaserSource::initProperties() 29 { 30 addPropertyName("OptUtil", 1.0); 31 addPropertyName("LaserEventTime"); 32 return; 33 } 34 35 void GatedLaserSource::constructModel() 36 { 37 // Create Area result 38 Result* area_result = new AtomicResult("Photonic"); 39 addAreaResult(area_result); 40 // Create NDD power result 41 Result* energy_result = new AtomicResult("Laser"); 42 addEventResult(energy_result); 43 44 // Get parameters 45 WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 46 47 // Create optical ports 48 createOpticalOutputPort( "Out", laser_wavelengths); 49 // Create the filter 50 createLaser( "Laser", laser_wavelengths); 51 OpticalLaser* laser = getLaser("Laser"); 52 // Connect the laser to the output 53 laser->addDownstreamNode(getWaveguide("Out")); 54 } 55 56 void GatedLaserSource::updateModel() 57 { 58 // Get properties 59 double laser_efficiency = getTechModel()->get("Laser->CW->Efficiency"); 60 double laser_area = getTechModel()->get("Laser->CW->Area"); 61 double laser_diode_loss = getTechModel()->get("Laser->CW->LaserDiodeLoss"); 62 63 // Get parameters 64 WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 65 unsigned int number_wavelengths = laser_wavelengths.second - laser_wavelengths.first + 1; 66 // Update losses 67 OpticalLaser* laser = getLaser("Laser"); 68 laser->setLoss(laser_diode_loss); 69 laser->setEfficiency(laser_efficiency); 70 // Update area 71 getAreaResult("Photonic")->setValue(laser_area * number_wavelengths); 72 } 73 74 void GatedLaserSource::evaluateModel() 75 { 76 // Get parameters 77 unsigned int max_detectors = getParameter("MaxDetectors"); 78 double laser_event_time = getProperty("LaserEventTime"); 79 WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd")); 80 81 // Get properties 82 double opt_util = getProperty("OptUtil"); 83 84 // Create optical graph object 85 OpticalGraph* optical_graph = new OpticalGraph("LaserTrace", this); 86 // Ask optical graph object to perform power optimization 87 bool success = optical_graph->performPowerOpt(getLaser("Laser"), laser_wavelengths, max_detectors, opt_util); 88 if (!success) 89 { 90 Log::printLine(std::cerr, "[Warning] " + getInstanceName() + 91 " -> Wavelengths contains data paths with no possible modulator configurations!"); 92 } 93 // Trace the wavelengths the laser is outputting to find the output 94 // power needed by the laser 95 OpticalWavelength* wavelength = optical_graph->traceWavelength(laser_wavelengths, getLaser("Laser")); 96 // Calculate the power needed by the wavelength 97 double laser_power = wavelength->getLaserPower(max_detectors); 98 // Calculate NDD power 99 getEventResult("Laser")->setValue(laser_power * laser_event_time); 100 101 delete wavelength; 102 delete optical_graph; 103 } 104 105} // namespace DSENT 106 107