RingFilter.cc revision 10447:a465576671d4
11689SN/A#include "model/optical/RingFilter.h" 29608Sandreas.hansson@arm.com 39919Ssteve.reinhardt@amd.com#include "model/optical_graph/OpticalWaveguide.h" 48707Sandreas.hansson@arm.com#include "model/optical_graph/OpticalFilter.h" 58707Sandreas.hansson@arm.com 68707Sandreas.hansson@arm.comnamespace DSENT 78707Sandreas.hansson@arm.com{ 88707Sandreas.hansson@arm.com RingFilter::RingFilter(const String& instance_name_, const TechModel* tech_model_) 98707Sandreas.hansson@arm.com : OpticalModel(instance_name_, tech_model_) 108707Sandreas.hansson@arm.com { 118707Sandreas.hansson@arm.com initParameters(); 128707Sandreas.hansson@arm.com initProperties(); 138707Sandreas.hansson@arm.com } 148707Sandreas.hansson@arm.com 151689SN/A RingFilter::~RingFilter() 167897Shestness@cs.utexas.edu {} 171689SN/A 181689SN/A void RingFilter::initParameters() 191689SN/A { 201689SN/A addParameterName("InStart"); 211689SN/A addParameterName("InEnd"); 221689SN/A addParameterName("DropStart"); 231689SN/A addParameterName("DropEnd"); 241689SN/A addParameterName("DropAll", "TRUE"); 251689SN/A return; 261689SN/A } 271689SN/A 281689SN/A void RingFilter::initProperties() 291689SN/A { 301689SN/A return; 311689SN/A } 321689SN/A 331689SN/A void RingFilter::constructModel() 341689SN/A { 351689SN/A //TODO: Add tuning energy/ndd-power costs? 361689SN/A 371689SN/A // Create Area result 381689SN/A Result* area_result = new AtomicResult("Photonic"); 391689SN/A addAreaResult(area_result); 401689SN/A 412665Ssaidi@eecs.umich.edu // Get parameters 422665Ssaidi@eecs.umich.edu WavelengthGroup in_wavelengths = makeWavelengthGroup(getParameter("InStart"), getParameter("InEnd")); 432756Sksewell@umich.edu WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); 447897Shestness@cs.utexas.edu bool drop_all = getParameter("DropAll"); 451689SN/A 461689SN/A // Create optical ports 472325SN/A createOpticalInputPort( "In", in_wavelengths); 482325SN/A createOpticalOutputPort( "Drop", drop_wavelengths); 491060SN/A createOpticalOutputPort( "Out", in_wavelengths); 501060SN/A // Create the filter 511060SN/A createFilter( "RingFilter", in_wavelengths, drop_all, drop_wavelengths); 522292SN/A OpticalFilter* ring_filter = getFilter("RingFilter"); 532292SN/A // Connect the filter 541681SN/A getWaveguide("In")->addDownstreamNode(ring_filter); 551060SN/A ring_filter->addDownstreamNode(getWaveguide("Out")); 562980Sgblack@eecs.umich.edu ring_filter->setDropPort(getWaveguide("Drop")); 571060SN/A } 586658Snate@binkert.org 591717SN/A void RingFilter::updateModel() 601717SN/A { 612292SN/A //TODO: Get numbers from tech model; 622292SN/A double ring_area = 200e-12; 638229Snate@binkert.org double thru_loss = 1e-4; 648229Snate@binkert.org double drop_loss = 1.0; 658229Snate@binkert.org // Get parameters 668229Snate@binkert.org WavelengthGroup drop_wavelengths = makeWavelengthGroup(getParameter("DropStart"), getParameter("DropEnd")); 672817Sksewell@umich.edu int number_wavelengths = drop_wavelengths.second - drop_wavelengths.first + 1; 688229Snate@binkert.org // Update losses 691060SN/A OpticalFilter* ring_filter = getFilter("RingFilter"); 701060SN/A ring_filter->setLoss(thru_loss * number_wavelengths); 712316SN/A ring_filter->setDropLoss(drop_loss + thru_loss * number_wavelengths); 722316SN/A // Update area 732680Sktlim@umich.edu getAreaResult("Photonic")->setValue(ring_area * (number_wavelengths)); 742817Sksewell@umich.edu } 752817Sksewell@umich.edu 762843Sktlim@umich.edu} // namespace DSENT 772843Sktlim@umich.edu 782669Sktlim@umich.edu