summaryrefslogtreecommitdiff
path: root/ext/dsent/model/optical/RingFilter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dsent/model/optical/RingFilter.cc')
-rw-r--r--ext/dsent/model/optical/RingFilter.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/ext/dsent/model/optical/RingFilter.cc b/ext/dsent/model/optical/RingFilter.cc
new file mode 100644
index 000000000..5f0bd5b40
--- /dev/null
+++ b/ext/dsent/model/optical/RingFilter.cc
@@ -0,0 +1,77 @@
+#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
+