RingFilter.cc revision 10447
110447Snilay@cs.wisc.edu#include "model/optical/RingFilter.h"
210447Snilay@cs.wisc.edu
310447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalWaveguide.h"
410447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalFilter.h"
510447Snilay@cs.wisc.edu
610447Snilay@cs.wisc.edunamespace DSENT
710447Snilay@cs.wisc.edu{
810447Snilay@cs.wisc.edu    RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_)
910447Snilay@cs.wisc.edu        : OpticalModel(instance_name_, tech_model_)
1010447Snilay@cs.wisc.edu    {
1110447Snilay@cs.wisc.edu        initParameters();
1210447Snilay@cs.wisc.edu        initProperties();
1310447Snilay@cs.wisc.edu    }
1410447Snilay@cs.wisc.edu
1510447Snilay@cs.wisc.edu    RingFilter::~RingFilter()
1610447Snilay@cs.wisc.edu    {}
1710447Snilay@cs.wisc.edu
1810447Snilay@cs.wisc.edu    void RingFilter::initParameters()
1910447Snilay@cs.wisc.edu    {
2010447Snilay@cs.wisc.edu        addParameterName("InStart");
2110447Snilay@cs.wisc.edu        addParameterName("InEnd");
2210447Snilay@cs.wisc.edu        addParameterName("DropStart");
2310447Snilay@cs.wisc.edu        addParameterName("DropEnd");
2410447Snilay@cs.wisc.edu        addParameterName("DropAll", "TRUE");
2510447Snilay@cs.wisc.edu        return;
2610447Snilay@cs.wisc.edu    }
2710447Snilay@cs.wisc.edu
2810447Snilay@cs.wisc.edu    void RingFilter::initProperties()
2910447Snilay@cs.wisc.edu    {
3010447Snilay@cs.wisc.edu        return;
3110447Snilay@cs.wisc.edu    }
3210447Snilay@cs.wisc.edu
3310447Snilay@cs.wisc.edu    void RingFilter::constructModel()
3410447Snilay@cs.wisc.edu    {
3510447Snilay@cs.wisc.edu        //TODO: Add tuning energy/ndd-power costs?
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
4110447Snilay@cs.wisc.edu        // Get parameters
4210447Snilay@cs.wisc.edu        WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd"));
4310447Snilay@cs.wisc.edu        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
4410447Snilay@cs.wisc.edu        bool drop_all = getParameter("DropAll");
4510447Snilay@cs.wisc.edu
4610447Snilay@cs.wisc.edu        // Create optical ports
4710447Snilay@cs.wisc.edu        createOpticalInputPort(     "In", in_wavelengths);
4810447Snilay@cs.wisc.edu        createOpticalOutputPort(    "Drop", drop_wavelengths);
4910447Snilay@cs.wisc.edu        createOpticalOutputPort(    "Out", in_wavelengths);
5010447Snilay@cs.wisc.edu        // Create the filter
5110447Snilay@cs.wisc.edu        createFilter(       "RingFilter",   in_wavelengths, drop_all, drop_wavelengths);
5210447Snilay@cs.wisc.edu        OpticalFilter* ring_filter = getFilter("RingFilter");
5310447Snilay@cs.wisc.edu        // Connect the filter
5410447Snilay@cs.wisc.edu        getWaveguide("In")->addDownstreamNode(ring_filter);
5510447Snilay@cs.wisc.edu        ring_filter->addDownstreamNode(getWaveguide("Out"));
5610447Snilay@cs.wisc.edu        ring_filter->setDropPort(getWaveguide("Drop"));
5710447Snilay@cs.wisc.edu    }
5810447Snilay@cs.wisc.edu
5910447Snilay@cs.wisc.edu    void RingFilter::updateModel()
6010447Snilay@cs.wisc.edu    {
6110447Snilay@cs.wisc.edu        //TODO: Get numbers from tech model;
6210447Snilay@cs.wisc.edu        double ring_area = 200e-12;
6310447Snilay@cs.wisc.edu        double thru_loss = 1e-4;
6410447Snilay@cs.wisc.edu        double drop_loss = 1.0;
6510447Snilay@cs.wisc.edu        // Get parameters
6610447Snilay@cs.wisc.edu        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
6710447Snilay@cs.wisc.edu        int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1;
6810447Snilay@cs.wisc.edu        // Update losses
6910447Snilay@cs.wisc.edu        OpticalFilter* ring_filter = getFilter("RingFilter");
7010447Snilay@cs.wisc.edu        ring_filter->setLoss(thru_loss * number_wavelengths);
7110447Snilay@cs.wisc.edu        ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths);
7210447Snilay@cs.wisc.edu        // Update area
7310447Snilay@cs.wisc.edu        getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths));
7410447Snilay@cs.wisc.edu    }
7510447Snilay@cs.wisc.edu
7610447Snilay@cs.wisc.edu} // namespace DSENT
7710447Snilay@cs.wisc.edu
78