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