110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu#include "model/optical/RingFilter.h"
2310447Snilay@cs.wisc.edu
2410447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalWaveguide.h"
2510447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalFilter.h"
2610447Snilay@cs.wisc.edu
2710447Snilay@cs.wisc.edunamespace DSENT
2810447Snilay@cs.wisc.edu{
2910447Snilay@cs.wisc.edu    RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_)
3010447Snilay@cs.wisc.edu        : OpticalModel(instance_name_, tech_model_)
3110447Snilay@cs.wisc.edu    {
3210447Snilay@cs.wisc.edu        initParameters();
3310447Snilay@cs.wisc.edu        initProperties();
3410447Snilay@cs.wisc.edu    }
3510447Snilay@cs.wisc.edu
3610447Snilay@cs.wisc.edu    RingFilter::~RingFilter()
3710447Snilay@cs.wisc.edu    {}
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    void RingFilter::initParameters()
4010447Snilay@cs.wisc.edu    {
4110447Snilay@cs.wisc.edu        addParameterName("InStart");
4210447Snilay@cs.wisc.edu        addParameterName("InEnd");
4310447Snilay@cs.wisc.edu        addParameterName("DropStart");
4410447Snilay@cs.wisc.edu        addParameterName("DropEnd");
4510447Snilay@cs.wisc.edu        addParameterName("DropAll", "TRUE");
4610447Snilay@cs.wisc.edu        return;
4710447Snilay@cs.wisc.edu    }
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu    void RingFilter::initProperties()
5010447Snilay@cs.wisc.edu    {
5110447Snilay@cs.wisc.edu        return;
5210447Snilay@cs.wisc.edu    }
5310447Snilay@cs.wisc.edu
5410447Snilay@cs.wisc.edu    void RingFilter::constructModel()
5510447Snilay@cs.wisc.edu    {
5610447Snilay@cs.wisc.edu        //TODO: Add tuning energy/ndd-power costs?
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu        // Create Area result
5910447Snilay@cs.wisc.edu        Result* area_result = new AtomicResult("Photonic");
6010447Snilay@cs.wisc.edu        addAreaResult(area_result);
6110447Snilay@cs.wisc.edu
6210447Snilay@cs.wisc.edu        // Get parameters
6310447Snilay@cs.wisc.edu        WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd"));
6410447Snilay@cs.wisc.edu        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
6510447Snilay@cs.wisc.edu        bool drop_all = getParameter("DropAll");
6610447Snilay@cs.wisc.edu
6710447Snilay@cs.wisc.edu        // Create optical ports
6810447Snilay@cs.wisc.edu        createOpticalInputPort(     "In", in_wavelengths);
6910447Snilay@cs.wisc.edu        createOpticalOutputPort(    "Drop", drop_wavelengths);
7010447Snilay@cs.wisc.edu        createOpticalOutputPort(    "Out", in_wavelengths);
7110447Snilay@cs.wisc.edu        // Create the filter
7210447Snilay@cs.wisc.edu        createFilter(       "RingFilter",   in_wavelengths, drop_all, drop_wavelengths);
7310447Snilay@cs.wisc.edu        OpticalFilter* ring_filter = getFilter("RingFilter");
7410447Snilay@cs.wisc.edu        // Connect the filter
7510447Snilay@cs.wisc.edu        getWaveguide("In")->addDownstreamNode(ring_filter);
7610447Snilay@cs.wisc.edu        ring_filter->addDownstreamNode(getWaveguide("Out"));
7710447Snilay@cs.wisc.edu        ring_filter->setDropPort(getWaveguide("Drop"));
7810447Snilay@cs.wisc.edu    }
7910447Snilay@cs.wisc.edu
8010447Snilay@cs.wisc.edu    void RingFilter::updateModel()
8110447Snilay@cs.wisc.edu    {
8210447Snilay@cs.wisc.edu        //TODO: Get numbers from tech model;
8310447Snilay@cs.wisc.edu        double ring_area = 200e-12;
8410447Snilay@cs.wisc.edu        double thru_loss = 1e-4;
8510447Snilay@cs.wisc.edu        double drop_loss = 1.0;
8610447Snilay@cs.wisc.edu        // Get parameters
8710447Snilay@cs.wisc.edu        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
8810447Snilay@cs.wisc.edu        int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1;
8910447Snilay@cs.wisc.edu        // Update losses
9010447Snilay@cs.wisc.edu        OpticalFilter* ring_filter = getFilter("RingFilter");
9110447Snilay@cs.wisc.edu        ring_filter->setLoss(thru_loss * number_wavelengths);
9210447Snilay@cs.wisc.edu        ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths);
9310447Snilay@cs.wisc.edu        // Update area
9410447Snilay@cs.wisc.edu        getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths));
9510447Snilay@cs.wisc.edu    }
9610447Snilay@cs.wisc.edu
9710447Snilay@cs.wisc.edu} // namespace DSENT
9810447Snilay@cs.wisc.edu
99