OpticalTestModel.cc revision 10448:bc1a3b7ab5ef
12568SN/A/* Copyright (c) 2012 Massachusetts Institute of Technology
210325Sgeoffrey.blake@arm.com *
38668Sgeoffrey.blake@arm.com * Permission is hereby granted, free of charge, to any person obtaining a copy
48668Sgeoffrey.blake@arm.com * of this software and associated documentation files (the "Software"), to deal
58668Sgeoffrey.blake@arm.com * in the Software without restriction, including without limitation the rights
68668Sgeoffrey.blake@arm.com * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
78668Sgeoffrey.blake@arm.com * copies of the Software, and to permit persons to whom the Software is
88668Sgeoffrey.blake@arm.com * furnished to do so, subject to the following conditions:
98668Sgeoffrey.blake@arm.com *
108668Sgeoffrey.blake@arm.com * The above copyright notice and this permission notice shall be included in
118668Sgeoffrey.blake@arm.com * all copies or substantial portions of the Software.
128668Sgeoffrey.blake@arm.com *
138668Sgeoffrey.blake@arm.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
142568SN/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
157636Ssteve.reinhardt@amd.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
162568SN/A * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
172568SN/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
182568SN/A * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
192568SN/A * THE SOFTWARE.
202568SN/A */
212568SN/A
222568SN/A#include "model/optical/OpticalTestModel.h"
232568SN/A#include "model/optical_graph/OpticalGraph.h"
242568SN/A#include "model/optical_graph/OpticalWaveguide.h"
252568SN/A#include "model/optical/RingModulator.h"
262568SN/A#include "model/optical/RingFilter.h"
272568SN/A#include "model/optical/RingDetector.h"
282568SN/A#include "model/optical/LaserSource.h"
292568SN/A
302568SN/Anamespace DSENT
312568SN/A{
322568SN/A    OpticalTestModel::OpticalTestModel(const String& instance_name_, const TechModel* tech_model_)
332568SN/A        : OpticalModel(instance_name_, tech_model_)
342568SN/A    {
352568SN/A        initParameters();
362568SN/A        initProperties();
372568SN/A    }
382568SN/A
392568SN/A    OpticalTestModel::~OpticalTestModel()
402665Ssaidi@eecs.umich.edu    {}
412665Ssaidi@eecs.umich.edu
422665Ssaidi@eecs.umich.edu    void OpticalTestModel::initParameters()
432568SN/A    {
442568SN/A        return;
452568SN/A    }
462568SN/A
472568SN/A    void OpticalTestModel::initProperties()
482568SN/A    {
492568SN/A        return;
503260Ssaidi@eecs.umich.edu    }
518229Snate@binkert.org
523260Ssaidi@eecs.umich.edu    void OpticalTestModel::constructModel()
538229Snate@binkert.org    {
545314Sstever@gmail.com        unsigned int wavelengths = 64;
552590SN/A        unsigned int number_readers = 1;
563348Sbinkertn@umich.edu
572568SN/A        createWaveguide("LaserToMod", makeWavelengthGroup(0, wavelengths-1));
582568SN/A
595735Snate@binkert.org        // Create laser
605735Snate@binkert.org        LaserSource* laser = new LaserSource("Laser", getTechModel());
614022Sstever@eecs.umich.edu        laser->setParameter("OutStart", 0);
624022Sstever@eecs.umich.edu        laser->setParameter("OutEnd", wavelengths-1);
634022Sstever@eecs.umich.edu        laser->construct();
644022Sstever@eecs.umich.edu
654022Sstever@eecs.umich.edu        // Create modulator
664022Sstever@eecs.umich.edu        RingModulator* modulator = new RingModulator("Modulator", getTechModel());
674022Sstever@eecs.umich.edu        modulator->setParameter("InStart", 0);
682641Sstever@eecs.umich.edu        modulator->setParameter("InEnd", wavelengths-1);
694022Sstever@eecs.umich.edu        modulator->setParameter("ModStart", 0);
704022Sstever@eecs.umich.edu        modulator->setParameter("ModEnd", wavelengths-1);
712641Sstever@eecs.umich.edu        modulator->construct();
724022Sstever@eecs.umich.edu
734022Sstever@eecs.umich.edu        for (unsigned int i = 0; i <= number_readers; ++i)
744022Sstever@eecs.umich.edu        {
754022Sstever@eecs.umich.edu            String n = (String) i;
764473Sstever@eecs.umich.edu            createWaveguide("WaveguideDet-" + n, makeWavelengthGroup(0, wavelengths-1));
774473Sstever@eecs.umich.edu        }
785319Sstever@gmail.com
795319Sstever@gmail.com        // Create a SWMR Configuration
805319Sstever@gmail.com        for (unsigned int i = 0; i < number_readers; ++i)
814022Sstever@eecs.umich.edu        {
824626Sstever@eecs.umich.edu            String n = (String) i;
834022Sstever@eecs.umich.edu
844022Sstever@eecs.umich.edu            // Create resonant ring detector
854626Sstever@eecs.umich.edu            RingDetector* detector = new RingDetector("Detector-" + n, getTechModel());
864022Sstever@eecs.umich.edu            detector->setParameter("InStart", 0);
874628Sstever@eecs.umich.edu            detector->setParameter("InEnd", wavelengths-1);
884628Sstever@eecs.umich.edu            detector->setParameter("DetStart", 0);
894022Sstever@eecs.umich.edu            detector->setParameter("DetEnd", wavelengths-1);
904022Sstever@eecs.umich.edu            detector->setParameter("DropAll", "FALSE");
914022Sstever@eecs.umich.edu            detector->setParameter("SenseAmp", "TRUE");
924022Sstever@eecs.umich.edu            detector->construct();
934022Sstever@eecs.umich.edu
944022Sstever@eecs.umich.edu            opticalPortConnect(detector, "In", "WaveguideDet-" + n);
954022Sstever@eecs.umich.edu            opticalPortConnect(detector, "Out", "WaveguideDet-" + (String) (i + 1));
964022Sstever@eecs.umich.edu
974022Sstever@eecs.umich.edu            addSubInstances(detector, 1.0);
984022Sstever@eecs.umich.edu        }
994022Sstever@eecs.umich.edu
1004022Sstever@eecs.umich.edu        opticalPortConnect(laser, "Out", "LaserToMod");
1019018Sandreas.hansson@arm.com        opticalPortConnect(modulator, "In", "LaserToMod");
1024626Sstever@eecs.umich.edu        opticalPortConnect(modulator, "Out", "WaveguideDet-0");
1034626Sstever@eecs.umich.edu
1044022Sstever@eecs.umich.edu        addSubInstances(laser, 1.0);
1059018Sandreas.hansson@arm.com        addSubInstances(modulator, 1.0);
1065319Sstever@gmail.com    }
1074022Sstever@eecs.umich.edu
1084022Sstever@eecs.umich.edu    void OpticalTestModel::updateModel()
1097465Ssteve.reinhardt@amd.com    {
1104628Sstever@eecs.umich.edu        double data_rate = 8e9;
1117465Ssteve.reinhardt@amd.com        double extinction_ratio = 5;
1127465Ssteve.reinhardt@amd.com        double insertion_loss = 3;
1137465Ssteve.reinhardt@amd.com
1147465Ssteve.reinhardt@amd.com        Model* laser = getSubInstance("Laser");
1154628Sstever@eecs.umich.edu        laser->update();
1167465Ssteve.reinhardt@amd.com
1177465Ssteve.reinhardt@amd.com        getWaveguide("LaserToMod")->setLoss(10);
11810325Sgeoffrey.blake@arm.com
11910325Sgeoffrey.blake@arm.com        Model* modulator = getSubInstance("Modulator");
12010325Sgeoffrey.blake@arm.com        modulator->setProperty("ExtinctionRatio", extinction_ratio);
1217465Ssteve.reinhardt@amd.com        modulator->setProperty("InsertionLoss", insertion_loss);
12210325Sgeoffrey.blake@arm.com        modulator->setProperty("DataRate", data_rate);
12310325Sgeoffrey.blake@arm.com        modulator->setProperty("P(In)", 0.5);
12410325Sgeoffrey.blake@arm.com        modulator->setProperty("Act(In)", 1.0);
1257465Ssteve.reinhardt@amd.com        modulator->update();
1264022Sstever@eecs.umich.edu
1274626Sstever@eecs.umich.edu        unsigned int number_readers = 1;
1284022Sstever@eecs.umich.edu        for (unsigned int i = 0; i < number_readers; ++i)
1294022Sstever@eecs.umich.edu        {
1305319Sstever@gmail.com            Model* detector = getSubInstance("Detector-" + (String) i);
1314040Ssaidi@eecs.umich.edu            detector->setProperty("ExtinctionRatio", extinction_ratio);
1325507Sstever@gmail.com            detector->setProperty("DataRate", data_rate);
1335507Sstever@gmail.com            detector->setProperty("P(In)", 0.5);
1346076Sgblack@eecs.umich.edu            detector->setProperty("Act(In)", 1.0);
1355507Sstever@gmail.com            detector->update();
1364626Sstever@eecs.umich.edu        }
1376076Sgblack@eecs.umich.edu
1384626Sstever@eecs.umich.edu
1394626Sstever@eecs.umich.edu    }
14010325Sgeoffrey.blake@arm.com
1417669Ssteve.reinhardt@amd.com} // namespace DSENT
1427669Ssteve.reinhardt@amd.com
1437669Ssteve.reinhardt@amd.com