1 /* Copyright (c) 2012 Massachusetts Institute of Technology
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 #ifndef __DSENT_MODEL_OPTICALMODEL_H__
23 #define __DSENT_MODEL_OPTICALMODEL_H__
25 #include "util/CommonType.h"
26 #include "model/ElectricalModel.h"
32 class OpticalWaveguide
;
35 class OpticalModulator
;
36 class OpticalDetector
;
37 class OpticalReceiver
;
38 class OpticalTransmitter
;
40 // A Wavelength group consisting of start and end wavelength indices
41 // Assuming it is the same as a net index so I can use the PortInfo class
42 typedef NetIndex WavelengthGroup
;
44 // Helper function for making waveguide groups
45 inline WavelengthGroup
makeWavelengthGroup(int start_index_
, int end_index_
)
47 ASSERT(end_index_
>= start_index_
, (String
) "[Error] Invalid wavelength group range " +
48 "[" + (String
) start_index_
+ ":" + (String
) end_index_
+ "]");
50 return WavelengthGroup(start_index_
, end_index_
);
53 // Helper function for making wavelength groups
54 inline WavelengthGroup
makeWavelengthGroup(int index_
)
56 return makeWavelengthGroup(index_
, index_
);
59 // OpticalModel specifies optical connectivity to other optical models as well
60 class OpticalModel
: public ElectricalModel
64 OpticalModel(const String
& instance_name_
, const TechModel
* tech_model_
);
65 virtual ~OpticalModel();
68 //-----------------------------------------------------------------
69 // Connectivity specification
70 //-----------------------------------------------------------------
74 // Waveguide multiplier
75 void setWaveguideMultiplier(unsigned int waveguide_multiplier_);
76 unsigned int getWaveguideMultiplier();
80 void createOpticalInputPort(const String
& name_
, const WavelengthGroup
& wavelengths_
);
81 const Map
<PortInfo
*>* getOpticalInputs() const;
82 PortInfo
* getOpticalInputPort(const String
& name_
);
83 const PortInfo
* getOpticalInputPort(const String
& name_
) const;
86 void createOpticalOutputPort(const String
& name_
, const WavelengthGroup
& wavelengths_
);
87 const Map
<PortInfo
*>* getOpticalOutputs() const;
88 PortInfo
* getOpticalOutputPort(const String
& name_
);
89 const PortInfo
* getOpticalOutputPort(const String
& name_
) const;
92 void createWaveguide(const String
& name_
, const WavelengthGroup
& wavelengths_
);
93 const Map
<OpticalWaveguide
*>* getWaveguides() const;
94 OpticalWaveguide
* getWaveguide(const String
& name_
);
96 // Assign a waveguide to be downstream from another waveguide
97 void opticalAssign(const String
& downstream_waveguide_name_
, const String
& upstream_waveguide_name_
);
99 // Connect a port (input or output) to some waveguide
100 void opticalPortConnect(OpticalModel
* connect_model_
, const String
& connect_port_name_
, const String
& connect_waveguide_name_
);
101 //-----------------------------------------------------------------
103 //-----------------------------------------------------------------
104 // Optical Graph Model Components
105 //-----------------------------------------------------------------
106 // Optical Laser Sources
108 void createLaser(const String
& name_
, const WavelengthGroup
& wavelengths_
);
109 const Map
<OpticalLaser
*>* getLasers() const;
110 OpticalLaser
* getLaser(const String
& name_
);
111 // Optical Laser Sources
112 void createFilter(const String
& name_
, const WavelengthGroup
& wavelengths_
, bool drop_all_
, const WavelengthGroup
& drop_wavelengths_
);
113 const Map
<OpticalFilter
*>* getFilters() const;
114 OpticalFilter
* getFilter(const String
& name_
);
115 // Optical Modulators
116 void createModulator(const String
& name_
, const WavelengthGroup
& wavelengths_
, bool opt_loss_
, OpticalTransmitter
* transmitter_
);
117 const Map
<OpticalModulator
*>* getModulators() const;
118 OpticalModulator
* getModulator(const String
& name_
);
120 void createDetector(const String
& name_
, const WavelengthGroup
& wavelengths_
, OpticalReceiver
* receiver_
);
121 const Map
<OpticalDetector
*>* getDetectors() const;
122 OpticalDetector
* getDetector(const String
& name_
);
124 //-----------------------------------------------------------------
127 // In an OpticalModel, the complete optical port-to-port connectivity
128 // of all sub-instances must be specified. Addition/Removal optical
129 // ports or port-related nets cannot happen after this step
130 //virtual void constructModel() = 0;
131 // In an OpticalModel, updateModel MUST finish all necessary
132 // calculations such that loss and wavelength power can be calculated
133 //virtual void updateModel() = 0;
134 // In an OpticalModel, evaluateModel should calculate all wavelength
135 // power, updating power and energy events as necessary
136 //virtual void evaluateModel() = 0;
139 // Private copy constructor. Use clone to perform copy operation.
140 OpticalModel(const OpticalModel
& model_
);
143 // Map of all input ports
144 Map
<PortInfo
*>* m_optical_input_ports_
;
145 // Map of all output ports
146 Map
<PortInfo
*>* m_optical_output_ports_
;
148 // Optical graph model elements
149 // Map of all waveguides
150 Map
<OpticalWaveguide
*>* m_waveguides_
;
151 // Map of all laser source elements
152 Map
<OpticalLaser
*>* m_lasers_
;
153 // Map of all filter elements
154 Map
<OpticalFilter
*>* m_filters_
;
155 // Map of all modulator elements
156 Map
<OpticalModulator
*>* m_modulators_
;
157 // Map of all photodetector elements
158 Map
<OpticalDetector
*>* m_detectors_
;
160 }; // class OpticalModel
163 #endif // __DSENT_MODEL_OPTICALMODEL_H__