RingFilter.cc revision 10447
1#include "model/optical/RingFilter.h" 2 3#include "model/optical_graph/OpticalWaveguide.h" 4#include "model/optical_graph/OpticalFilter.h" 5 6namespace DSENT 7{ 8 RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_) 9 : OpticalModel(instance_name_, tech_model_) 10 { 11 initParameters(); 12 initProperties(); 13 } 14 15 RingFilter::~RingFilter() 16 {} 17 18 void RingFilter::initParameters() 19 { 20 addParameterName("InStart"); 21 addParameterName("InEnd"); 22 addParameterName("DropStart"); 23 addParameterName("DropEnd"); 24 addParameterName("DropAll", "TRUE"); 25 return; 26 } 27 28 void RingFilter::initProperties() 29 { 30 return; 31 } 32 33 void RingFilter::constructModel() 34 { 35 //TODO: Add tuning energy/ndd-power costs? 36 37 // Create Area result 38 Result* area_result = new AtomicResult("Photonic"); 39 addAreaResult(area_result); 40 41 // Get parameters 42 WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd")); 43 WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); 44 bool drop_all = getParameter("DropAll"); 45 46 // Create optical ports 47 createOpticalInputPort( "In", in_wavelengths); 48 createOpticalOutputPort( "Drop", drop_wavelengths); 49 createOpticalOutputPort( "Out", in_wavelengths); 50 // Create the filter 51 createFilter( "RingFilter", in_wavelengths, drop_all, drop_wavelengths); 52 OpticalFilter* ring_filter = getFilter("RingFilter"); 53 // Connect the filter 54 getWaveguide("In")->addDownstreamNode(ring_filter); 55 ring_filter->addDownstreamNode(getWaveguide("Out")); 56 ring_filter->setDropPort(getWaveguide("Drop")); 57 } 58 59 void RingFilter::updateModel() 60 { 61 //TODO: Get numbers from tech model; 62 double ring_area = 200e-12; 63 double thru_loss = 1e-4; 64 double drop_loss = 1.0; 65 // Get parameters 66 WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); 67 int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1; 68 // Update losses 69 OpticalFilter* ring_filter = getFilter("RingFilter"); 70 ring_filter->setLoss(thru_loss * number_wavelengths); 71 ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths); 72 // Update area 73 getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths)); 74 } 75 76} // namespace DSENT 77 78