| /* Copyright (c) 2012 Massachusetts Institute of Technology |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and associated documentation files (the "Software"), to deal |
| * in the Software without restriction, including without limitation the rights |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| * THE SOFTWARE. |
| */ |
| |
| #include "model/optical/RingFilter.h" |
| |
| #include "model/optical_graph/OpticalWaveguide.h" |
| #include "model/optical_graph/OpticalFilter.h" |
| |
| namespace DSENT |
| { |
| RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_) |
| : OpticalModel(instance_name_, tech_model_) |
| { |
| initParameters(); |
| initProperties(); |
| } |
| |
| RingFilter::~RingFilter() |
| {} |
| |
| void RingFilter::initParameters() |
| { |
| addParameterName("InStart"); |
| addParameterName("InEnd"); |
| addParameterName("DropStart"); |
| addParameterName("DropEnd"); |
| addParameterName("DropAll", "TRUE"); |
| return; |
| } |
| |
| void RingFilter::initProperties() |
| { |
| return; |
| } |
| |
| void RingFilter::constructModel() |
| { |
| //TODO: Add tuning energy/ndd-power costs? |
| |
| // Create Area result |
| Result* area_result = new AtomicResult("Photonic"); |
| addAreaResult(area_result); |
| |
| // Get parameters |
| WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd")); |
| WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); |
| bool drop_all = getParameter("DropAll"); |
| |
| // Create optical ports |
| createOpticalInputPort( "In", in_wavelengths); |
| createOpticalOutputPort( "Drop", drop_wavelengths); |
| createOpticalOutputPort( "Out", in_wavelengths); |
| // Create the filter |
| createFilter( "RingFilter", in_wavelengths, drop_all, drop_wavelengths); |
| OpticalFilter* ring_filter = getFilter("RingFilter"); |
| // Connect the filter |
| getWaveguide("In")->addDownstreamNode(ring_filter); |
| ring_filter->addDownstreamNode(getWaveguide("Out")); |
| ring_filter->setDropPort(getWaveguide("Drop")); |
| } |
| |
| void RingFilter::updateModel() |
| { |
| //TODO: Get numbers from tech model; |
| double ring_area = 200e-12; |
| double thru_loss = 1e-4; |
| double drop_loss = 1.0; |
| // Get parameters |
| WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); |
| int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1; |
| // Update losses |
| OpticalFilter* ring_filter = getFilter("RingFilter"); |
| ring_filter->setLoss(thru_loss * number_wavelengths); |
| ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths); |
| // Update area |
| getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths)); |
| } |
| |
| } // namespace DSENT |
| |