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