OpticalTestModel.cc revision 10447
1#include "model/optical/OpticalTestModel.h"
2#include "model/optical_graph/OpticalGraph.h"
3#include "model/optical_graph/OpticalWaveguide.h"
4#include "model/optical/RingModulator.h"
5#include "model/optical/RingFilter.h"
6#include "model/optical/RingDetector.h"
7#include "model/optical/LaserSource.h"
8
9namespace DSENT
10{
11    OpticalTestModel::OpticalTestModel(const String& instance_name_, const TechModel* tech_model_)
12        : OpticalModel(instance_name_, tech_model_)
13    {
14        initParameters();
15        initProperties();
16    }
17
18    OpticalTestModel::~OpticalTestModel()
19    {}
20
21    void OpticalTestModel::initParameters()
22    {
23        return;
24    }
25
26    void OpticalTestModel::initProperties()
27    {
28        return;
29    }
30
31    void OpticalTestModel::constructModel()
32    {
33        unsigned int wavelengths = 64;
34        unsigned int number_readers = 1;
35
36        createWaveguide("LaserToMod", makeWavelengthGroup(0, wavelengths-1));
37
38        // Create laser
39        LaserSource* laser = new LaserSource("Laser", getTechModel());
40        laser->setParameter("OutStart", 0);
41        laser->setParameter("OutEnd", wavelengths-1);
42        laser->construct();
43
44        // Create modulator
45        RingModulator* modulator = new RingModulator("Modulator", getTechModel());
46        modulator->setParameter("InStart", 0);
47        modulator->setParameter("InEnd", wavelengths-1);
48        modulator->setParameter("ModStart", 0);
49        modulator->setParameter("ModEnd", wavelengths-1);
50        modulator->construct();
51
52        for (unsigned int i = 0; i <= number_readers; ++i)
53        {
54            String n = (String) i;
55            createWaveguide("WaveguideDet-" + n, makeWavelengthGroup(0, wavelengths-1));
56        }
57
58        // Create a SWMR Configuration
59        for (unsigned int i = 0; i < number_readers; ++i)
60        {
61            String n = (String) i;
62
63            // Create resonant ring detector
64            RingDetector* detector = new RingDetector("Detector-" + n, getTechModel());
65            detector->setParameter("InStart", 0);
66            detector->setParameter("InEnd", wavelengths-1);
67            detector->setParameter("DetStart", 0);
68            detector->setParameter("DetEnd", wavelengths-1);
69            detector->setParameter("DropAll", "FALSE");
70            detector->setParameter("SenseAmp", "TRUE");
71            detector->construct();
72
73            opticalPortConnect(detector, "In", "WaveguideDet-" + n);
74            opticalPortConnect(detector, "Out", "WaveguideDet-" + (String) (i + 1));
75
76            addSubInstances(detector, 1.0);
77        }
78
79        opticalPortConnect(laser, "Out", "LaserToMod");
80        opticalPortConnect(modulator, "In", "LaserToMod");
81        opticalPortConnect(modulator, "Out", "WaveguideDet-0");
82
83        addSubInstances(laser, 1.0);
84        addSubInstances(modulator, 1.0);
85    }
86
87    void OpticalTestModel::updateModel()
88    {
89        double data_rate = 8e9;
90        double extinction_ratio = 5;
91        double insertion_loss = 3;
92
93        Model* laser = getSubInstance("Laser");
94        laser->update();
95
96        getWaveguide("LaserToMod")->setLoss(10);
97
98        Model* modulator = getSubInstance("Modulator");
99        modulator->setProperty("ExtinctionRatio", extinction_ratio);
100        modulator->setProperty("InsertionLoss", insertion_loss);
101        modulator->setProperty("DataRate", data_rate);
102        modulator->setProperty("P(In)", 0.5);
103        modulator->setProperty("Act(In)", 1.0);
104        modulator->update();
105
106        unsigned int number_readers = 1;
107        for (unsigned int i = 0; i < number_readers; ++i)
108        {
109            Model* detector = getSubInstance("Detector-" + (String) i);
110            detector->setProperty("ExtinctionRatio", extinction_ratio);
111            detector->setProperty("DataRate", data_rate);
112            detector->setProperty("P(In)", 0.5);
113            detector->setProperty("Act(In)", 1.0);
114            detector->update();
115        }
116
117
118    }
119
120} // namespace DSENT
121
122