RingFilter.cc revision 10447:a465576671d4
11689SN/A#include "model/optical/RingFilter.h"
29608Sandreas.hansson@arm.com
39919Ssteve.reinhardt@amd.com#include "model/optical_graph/OpticalWaveguide.h"
48707Sandreas.hansson@arm.com#include "model/optical_graph/OpticalFilter.h"
58707Sandreas.hansson@arm.com
68707Sandreas.hansson@arm.comnamespace DSENT
78707Sandreas.hansson@arm.com{
88707Sandreas.hansson@arm.com    RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_)
98707Sandreas.hansson@arm.com        : OpticalModel(instance_name_, tech_model_)
108707Sandreas.hansson@arm.com    {
118707Sandreas.hansson@arm.com        initParameters();
128707Sandreas.hansson@arm.com        initProperties();
138707Sandreas.hansson@arm.com    }
148707Sandreas.hansson@arm.com
151689SN/A    RingFilter::~RingFilter()
167897Shestness@cs.utexas.edu    {}
171689SN/A
181689SN/A    void RingFilter::initParameters()
191689SN/A    {
201689SN/A        addParameterName("InStart");
211689SN/A        addParameterName("InEnd");
221689SN/A        addParameterName("DropStart");
231689SN/A        addParameterName("DropEnd");
241689SN/A        addParameterName("DropAll", "TRUE");
251689SN/A        return;
261689SN/A    }
271689SN/A
281689SN/A    void RingFilter::initProperties()
291689SN/A    {
301689SN/A        return;
311689SN/A    }
321689SN/A
331689SN/A    void RingFilter::constructModel()
341689SN/A    {
351689SN/A        //TODO: Add tuning energy/ndd-power costs?
361689SN/A
371689SN/A        // Create Area result
381689SN/A        Result* area_result = new AtomicResult("Photonic");
391689SN/A        addAreaResult(area_result);
401689SN/A
412665Ssaidi@eecs.umich.edu        // Get parameters
422665Ssaidi@eecs.umich.edu        WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd"));
432756Sksewell@umich.edu        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
447897Shestness@cs.utexas.edu        bool drop_all = getParameter("DropAll");
451689SN/A
461689SN/A        // Create optical ports
472325SN/A        createOpticalInputPort(     "In", in_wavelengths);
482325SN/A        createOpticalOutputPort(    "Drop", drop_wavelengths);
491060SN/A        createOpticalOutputPort(    "Out", in_wavelengths);
501060SN/A        // Create the filter
511060SN/A        createFilter(       "RingFilter",   in_wavelengths, drop_all, drop_wavelengths);
522292SN/A        OpticalFilter* ring_filter = getFilter("RingFilter");
532292SN/A        // Connect the filter
541681SN/A        getWaveguide("In")->addDownstreamNode(ring_filter);
551060SN/A        ring_filter->addDownstreamNode(getWaveguide("Out"));
562980Sgblack@eecs.umich.edu        ring_filter->setDropPort(getWaveguide("Drop"));
571060SN/A    }
586658Snate@binkert.org
591717SN/A    void RingFilter::updateModel()
601717SN/A    {
612292SN/A        //TODO: Get numbers from tech model;
622292SN/A        double ring_area = 200e-12;
638229Snate@binkert.org        double thru_loss = 1e-4;
648229Snate@binkert.org        double drop_loss = 1.0;
658229Snate@binkert.org        // Get parameters
668229Snate@binkert.org        WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd"));
672817Sksewell@umich.edu        int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1;
688229Snate@binkert.org        // Update losses
691060SN/A        OpticalFilter* ring_filter = getFilter("RingFilter");
701060SN/A        ring_filter->setLoss(thru_loss * number_wavelengths);
712316SN/A        ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths);
722316SN/A        // Update area
732680Sktlim@umich.edu        getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths));
742817Sksewell@umich.edu    }
752817Sksewell@umich.edu
762843Sktlim@umich.edu} // namespace DSENT
772843Sktlim@umich.edu
782669Sktlim@umich.edu