OpticalTestModel.cc revision 10447
17405SAli.Saidi@ARM.com#include "model/optical/OpticalTestModel.h"
27405SAli.Saidi@ARM.com#include "model/optical_graph/OpticalGraph.h"
37405SAli.Saidi@ARM.com#include "model/optical_graph/OpticalWaveguide.h"
47405SAli.Saidi@ARM.com#include "model/optical/RingModulator.h"
57405SAli.Saidi@ARM.com#include "model/optical/RingFilter.h"
67405SAli.Saidi@ARM.com#include "model/optical/RingDetector.h"
77405SAli.Saidi@ARM.com#include "model/optical/LaserSource.h"
87405SAli.Saidi@ARM.com
97405SAli.Saidi@ARM.comnamespace DSENT
107405SAli.Saidi@ARM.com{
117405SAli.Saidi@ARM.com    OpticalTestModel::OpticalTestModel(const String& instance_name_, const TechModel* tech_model_)
127405SAli.Saidi@ARM.com        : OpticalModel(instance_name_, tech_model_)
137405SAli.Saidi@ARM.com    {
147405SAli.Saidi@ARM.com        initParameters();
157405SAli.Saidi@ARM.com        initProperties();
167405SAli.Saidi@ARM.com    }
177405SAli.Saidi@ARM.com
187405SAli.Saidi@ARM.com    OpticalTestModel::~OpticalTestModel()
197405SAli.Saidi@ARM.com    {}
207405SAli.Saidi@ARM.com
217405SAli.Saidi@ARM.com    void OpticalTestModel::initParameters()
227405SAli.Saidi@ARM.com    {
237405SAli.Saidi@ARM.com        return;
247405SAli.Saidi@ARM.com    }
257405SAli.Saidi@ARM.com
267405SAli.Saidi@ARM.com    void OpticalTestModel::initProperties()
277405SAli.Saidi@ARM.com    {
287405SAli.Saidi@ARM.com        return;
297405SAli.Saidi@ARM.com    }
307405SAli.Saidi@ARM.com
317405SAli.Saidi@ARM.com    void OpticalTestModel::constructModel()
327405SAli.Saidi@ARM.com    {
337405SAli.Saidi@ARM.com        unsigned int wavelengths = 64;
347405SAli.Saidi@ARM.com        unsigned int number_readers = 1;
357405SAli.Saidi@ARM.com
367405SAli.Saidi@ARM.com        createWaveguide("LaserToMod", makeWavelengthGroup(0, wavelengths-1));
377405SAli.Saidi@ARM.com
387405SAli.Saidi@ARM.com        // Create laser
397405SAli.Saidi@ARM.com        LaserSource* laser = new LaserSource("Laser", getTechModel());
407405SAli.Saidi@ARM.com        laser->setParameter("OutStart", 0);
417405SAli.Saidi@ARM.com        laser->setParameter("OutEnd", wavelengths-1);
427405SAli.Saidi@ARM.com        laser->construct();
437405SAli.Saidi@ARM.com
447405SAli.Saidi@ARM.com        // Create modulator
457405SAli.Saidi@ARM.com        RingModulator* modulator = new RingModulator("Modulator", getTechModel());
467405SAli.Saidi@ARM.com        modulator->setParameter("InStart", 0);
477405SAli.Saidi@ARM.com        modulator->setParameter("InEnd", wavelengths-1);
487405SAli.Saidi@ARM.com        modulator->setParameter("ModStart", 0);
497405SAli.Saidi@ARM.com        modulator->setParameter("ModEnd", wavelengths-1);
507405SAli.Saidi@ARM.com        modulator->construct();
517405SAli.Saidi@ARM.com
527405SAli.Saidi@ARM.com        for (unsigned int i = 0; i <= number_readers; ++i)
537405SAli.Saidi@ARM.com        {
547405SAli.Saidi@ARM.com            String n = (String) i;
557405SAli.Saidi@ARM.com            createWaveguide("WaveguideDet-" + n, makeWavelengthGroup(0, wavelengths-1));
567405SAli.Saidi@ARM.com        }
577405SAli.Saidi@ARM.com
587405SAli.Saidi@ARM.com        // Create a SWMR Configuration
597405SAli.Saidi@ARM.com        for (unsigned int i = 0; i < number_readers; ++i)
607405SAli.Saidi@ARM.com        {
617405SAli.Saidi@ARM.com            String n = (String) i;
627405SAli.Saidi@ARM.com
637405SAli.Saidi@ARM.com            // Create resonant ring detector
647405SAli.Saidi@ARM.com            RingDetector* detector = new RingDetector("Detector-" + n, getTechModel());
657405SAli.Saidi@ARM.com            detector->setParameter("InStart", 0);
667405SAli.Saidi@ARM.com            detector->setParameter("InEnd", wavelengths-1);
677405SAli.Saidi@ARM.com            detector->setParameter("DetStart", 0);
687405SAli.Saidi@ARM.com            detector->setParameter("DetEnd", wavelengths-1);
697405SAli.Saidi@ARM.com            detector->setParameter("DropAll", "FALSE");
707405SAli.Saidi@ARM.com            detector->setParameter("SenseAmp", "TRUE");
717405SAli.Saidi@ARM.com            detector->construct();
727405SAli.Saidi@ARM.com
737405SAli.Saidi@ARM.com            opticalPortConnect(detector, "In", "WaveguideDet-" + n);
747405SAli.Saidi@ARM.com            opticalPortConnect(detector, "Out", "WaveguideDet-" + (String) (i + 1));
757405SAli.Saidi@ARM.com
767405SAli.Saidi@ARM.com            addSubInstances(detector, 1.0);
777405SAli.Saidi@ARM.com        }
787405SAli.Saidi@ARM.com
797405SAli.Saidi@ARM.com        opticalPortConnect(laser, "Out", "LaserToMod");
807405SAli.Saidi@ARM.com        opticalPortConnect(modulator, "In", "LaserToMod");
817405SAli.Saidi@ARM.com        opticalPortConnect(modulator, "Out", "WaveguideDet-0");
827405SAli.Saidi@ARM.com
837405SAli.Saidi@ARM.com        addSubInstances(laser, 1.0);
847405SAli.Saidi@ARM.com        addSubInstances(modulator, 1.0);
857405SAli.Saidi@ARM.com    }
867405SAli.Saidi@ARM.com
877405SAli.Saidi@ARM.com    void OpticalTestModel::updateModel()
887405SAli.Saidi@ARM.com    {
897405SAli.Saidi@ARM.com        double data_rate = 8e9;
907405SAli.Saidi@ARM.com        double extinction_ratio = 5;
917405SAli.Saidi@ARM.com        double insertion_loss = 3;
927405SAli.Saidi@ARM.com
937405SAli.Saidi@ARM.com        Model* laser = getSubInstance("Laser");
947405SAli.Saidi@ARM.com        laser->update();
957405SAli.Saidi@ARM.com
967405SAli.Saidi@ARM.com        getWaveguide("LaserToMod")->setLoss(10);
977405SAli.Saidi@ARM.com
987405SAli.Saidi@ARM.com        Model* modulator = getSubInstance("Modulator");
997405SAli.Saidi@ARM.com        modulator->setProperty("ExtinctionRatio", extinction_ratio);
1007405SAli.Saidi@ARM.com        modulator->setProperty("InsertionLoss", insertion_loss);
1017405SAli.Saidi@ARM.com        modulator->setProperty("DataRate", data_rate);
1027405SAli.Saidi@ARM.com        modulator->setProperty("P(In)", 0.5);
1037405SAli.Saidi@ARM.com        modulator->setProperty("Act(In)", 1.0);
1047405SAli.Saidi@ARM.com        modulator->update();
1057405SAli.Saidi@ARM.com
1067405SAli.Saidi@ARM.com        unsigned int number_readers = 1;
1077405SAli.Saidi@ARM.com        for (unsigned int i = 0; i < number_readers; ++i)
1087405SAli.Saidi@ARM.com        {
1097405SAli.Saidi@ARM.com            Model* detector = getSubInstance("Detector-" + (String) i);
1107405SAli.Saidi@ARM.com            detector->setProperty("ExtinctionRatio", extinction_ratio);
1117405SAli.Saidi@ARM.com            detector->setProperty("DataRate", data_rate);
1127405SAli.Saidi@ARM.com            detector->setProperty("P(In)", 0.5);
1137405SAli.Saidi@ARM.com            detector->setProperty("Act(In)", 1.0);
1147405SAli.Saidi@ARM.com            detector->update();
1157405SAli.Saidi@ARM.com        }
1167405SAli.Saidi@ARM.com
1177405SAli.Saidi@ARM.com
1187405SAli.Saidi@ARM.com    }
1197405SAli.Saidi@ARM.com
1207405SAli.Saidi@ARM.com} // namespace DSENT
1217405SAli.Saidi@ARM.com
1227405SAli.Saidi@ARM.com