OpticalGraph.h revision 10447
110447Snilay@cs.wisc.edu#ifndef __DSENT_MODEL_OPTICALGRAPH_OPTICALGRAPH_H__
210447Snilay@cs.wisc.edu#define __DSENT_MODEL_OPTICALGRAPH_OPTICALGRAPH_H__
310447Snilay@cs.wisc.edu
410447Snilay@cs.wisc.edu#include <vector>
510447Snilay@cs.wisc.edu
610447Snilay@cs.wisc.edu#include "util/CommonType.h"
710447Snilay@cs.wisc.edu#include "model/optical_graph/OpticalNode.h"
810447Snilay@cs.wisc.edu
910447Snilay@cs.wisc.edunamespace DSENT
1010447Snilay@cs.wisc.edu{
1110447Snilay@cs.wisc.edu    class OpticalNode;
1210447Snilay@cs.wisc.edu    class OpticalWavelength;
1310447Snilay@cs.wisc.edu
1410447Snilay@cs.wisc.edu    class OpticalGraph
1510447Snilay@cs.wisc.edu    {
1610447Snilay@cs.wisc.edu        public:
1710447Snilay@cs.wisc.edu            // The visited number for the next timing run. This needs to be
1810447Snilay@cs.wisc.edu            // global because several timing trees may be created to evaluate
1910447Snilay@cs.wisc.edu            // a single timing path, causing problems
2010447Snilay@cs.wisc.edu            static int msTreeNum;
2110447Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu        public:
2310447Snilay@cs.wisc.edu            // Construct timing tree that watches over model_
2410447Snilay@cs.wisc.edu            OpticalGraph(const String& instance_name_, OpticalModel* model_);
2510447Snilay@cs.wisc.edu            ~OpticalGraph();
2610447Snilay@cs.wisc.edu
2710447Snilay@cs.wisc.edu        public:
2810447Snilay@cs.wisc.edu            // Get graph name
2910447Snilay@cs.wisc.edu            const String& getInstanceName() const;
3010447Snilay@cs.wisc.edu            // Perform datapath power optimization by balancing insertion loss and extinction
3110447Snilay@cs.wisc.edu            // ratio with modulator/receiver and laser power, returns false if there are no
3210447Snilay@cs.wisc.edu            // designs that are possible
3310447Snilay@cs.wisc.edu            bool performPowerOpt(OpticalNode* node_, const WavelengthGroup& wavelengths_, unsigned int number_detectors_, double util_);
3410447Snilay@cs.wisc.edu            // Recursively trace a wavelength starting from an OpticalLaser
3510447Snilay@cs.wisc.edu            // source finding all lasers, modulators and detectors that a
3610447Snilay@cs.wisc.edu            // wavelength group hits.
3710447Snilay@cs.wisc.edu            OpticalWavelength* traceWavelength(const WavelengthGroup& wavelengths_, OpticalNode* node_);
3810447Snilay@cs.wisc.edu            OpticalWavelength* traceWavelength(OpticalWavelength* wavelength_, OpticalNode* node_, OpticalLaser* laser_, OpticalModulator* modulator_, double loss_);
3910447Snilay@cs.wisc.edu            // Return the model
4010447Snilay@cs.wisc.edu            OpticalModel* getModel();
4110447Snilay@cs.wisc.edu
4210447Snilay@cs.wisc.edu        private:
4310447Snilay@cs.wisc.edu
4410447Snilay@cs.wisc.edu            // Disable the use of copy constructor
4510447Snilay@cs.wisc.edu            OpticalGraph(const OpticalGraph& graph_);
4610447Snilay@cs.wisc.edu
4710447Snilay@cs.wisc.edu        public:
4810447Snilay@cs.wisc.edu            // Set the sequence number of the optical graph
4910447Snilay@cs.wisc.edu            static void setTreeNum(int tree_num_);
5010447Snilay@cs.wisc.edu            static int getTreeNum();
5110447Snilay@cs.wisc.edu
5210447Snilay@cs.wisc.edu        private:
5310447Snilay@cs.wisc.edu            // Name of the optical graph
5410447Snilay@cs.wisc.edu            const String m_instance_name_;
5510447Snilay@cs.wisc.edu            // A pointer to the model that contains this node
5610447Snilay@cs.wisc.edu            OpticalModel* m_model_;
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu    }; // class OpticalGraph
5910447Snilay@cs.wisc.edu} // namespace DSENT
6010447Snilay@cs.wisc.edu
6110447Snilay@cs.wisc.edu#endif // __DSENT_MODEL_OPTICALGRAPH_OPTICALGRAPH_H__
6210447Snilay@cs.wisc.edu
63