110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu#ifndef __DSENT_MODEL_ELECTRICALMODEL_H__
2310447Snilay@cs.wisc.edu#define __DSENT_MODEL_ELECTRICALMODEL_H__
2410447Snilay@cs.wisc.edu
2510447Snilay@cs.wisc.edu#include "util/CommonType.h"
2610447Snilay@cs.wisc.edu#include "model/Model.h"
2710447Snilay@cs.wisc.edu#include "model/TransitionInfo.h"
2810447Snilay@cs.wisc.edu
2910447Snilay@cs.wisc.edunamespace DSENT
3010447Snilay@cs.wisc.edu{
3110447Snilay@cs.wisc.edu    class PortInfo;
3210447Snilay@cs.wisc.edu    class EventInfo;
3310447Snilay@cs.wisc.edu    class ElectricalDriver;
3410447Snilay@cs.wisc.edu    class ElectricalDriverMultiplier;
3510447Snilay@cs.wisc.edu    class ElectricalNet;
3610447Snilay@cs.wisc.edu    class ElectricalLoad;
3710447Snilay@cs.wisc.edu    class ElectricalDelay;
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    // A Net index consisting of a start and end index
4010447Snilay@cs.wisc.edu    typedef std::pair<int, int> NetIndex;
4110447Snilay@cs.wisc.edu
4210447Snilay@cs.wisc.edu    // Helper function to make net index
4310447Snilay@cs.wisc.edu    inline NetIndex makeNetIndex(int start_index_, int end_index_)
4410447Snilay@cs.wisc.edu    {
4510447Snilay@cs.wisc.edu        ASSERT((end_index_ >= start_index_), (String)"[Error] Invalid net index range " +
4610447Snilay@cs.wisc.edu
4710447Snilay@cs.wisc.edu                "[" + (String)start_index_ + ":" + (String)end_index_ + "]");
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu        return NetIndex(start_index_, end_index_);
5010447Snilay@cs.wisc.edu    }
5110447Snilay@cs.wisc.edu
5210447Snilay@cs.wisc.edu    // Helper function to make net index
5310447Snilay@cs.wisc.edu    inline NetIndex makeNetIndex(int index_)
5410447Snilay@cs.wisc.edu    {
5510447Snilay@cs.wisc.edu        return makeNetIndex(index_, index_);
5610447Snilay@cs.wisc.edu    }
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu    // Helper function to trun NetIndex to String
5910447Snilay@cs.wisc.edu    inline String toString(const NetIndex& net_index_)
6010447Snilay@cs.wisc.edu    {
6110447Snilay@cs.wisc.edu        return "[" + String(net_index_.second) + ":" + String(net_index_.first) + "]";
6210447Snilay@cs.wisc.edu    }
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edu    // ElectricalModel specifies physical connectivity to other models as well as the port
6510447Snilay@cs.wisc.edu    // parameters for the current model
6610447Snilay@cs.wisc.edu    class ElectricalModel : public Model
6710447Snilay@cs.wisc.edu    {
6810447Snilay@cs.wisc.edu        public:
6910447Snilay@cs.wisc.edu            ElectricalModel(const String& instance_name_, const TechModel* tech_model_);
7010447Snilay@cs.wisc.edu            virtual ~ElectricalModel();
7110447Snilay@cs.wisc.edu
7210447Snilay@cs.wisc.edu        public:
7310447Snilay@cs.wisc.edu            // Check if all properties needed exist in the m_properties_
7410447Snilay@cs.wisc.edu            virtual void checkProperties() const;
7510447Snilay@cs.wisc.edu            // Set available driving strength vector from string
7610447Snilay@cs.wisc.edu            void setAvailableDrivingStrengths(const String& driving_strengths_);
7710447Snilay@cs.wisc.edu
7810447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
7910447Snilay@cs.wisc.edu            // Connectivity specification
8010447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
8110447Snilay@cs.wisc.edu            // Net Indices
8210447Snilay@cs.wisc.edu            const Map<NetIndex>* getNetReferences() const;
8310447Snilay@cs.wisc.edu            const NetIndex getNetReference(const String& name_) const;
8410447Snilay@cs.wisc.edu            // Input Ports
8510447Snilay@cs.wisc.edu            void createInputPort(const String& name_, const NetIndex& net_indices_ = NetIndex(0, 0));
8610447Snilay@cs.wisc.edu            const Map<PortInfo*>* getInputs() const;
8710447Snilay@cs.wisc.edu            PortInfo* getInputPort(const String& name_);
8810447Snilay@cs.wisc.edu            const PortInfo* getInputPort(const String& name_) const;
8910447Snilay@cs.wisc.edu            // Output Ports
9010447Snilay@cs.wisc.edu            void createOutputPort(const String& name_, const NetIndex& net_indices_ = NetIndex(0, 0));
9110447Snilay@cs.wisc.edu            const Map<PortInfo*>* getOutputs() const;
9210447Snilay@cs.wisc.edu            PortInfo* getOutputPort(const String& name_);
9310447Snilay@cs.wisc.edu            const PortInfo* getOutputPort(const String& name_) const;
9410447Snilay@cs.wisc.edu            // Electrical Nets
9510447Snilay@cs.wisc.edu            void createNet(const String& name_);
9610447Snilay@cs.wisc.edu            void createNet(const String& name_, const NetIndex& net_indices_);
9710447Snilay@cs.wisc.edu            const Map<ElectricalNet*>* getNets() const;
9810447Snilay@cs.wisc.edu            ElectricalNet* getNet(const String& name_);
9910447Snilay@cs.wisc.edu            ElectricalNet* getNet(const String& name_, const NetIndex& index_);
10010447Snilay@cs.wisc.edu
10110447Snilay@cs.wisc.edu            // Assign a net to be downstream from another net
10210447Snilay@cs.wisc.edu            // case 1: 'assign downstream_net_name_ = upstream_net_name_'
10310447Snilay@cs.wisc.edu            void assign(const String& downstream_net_name_, const String& upstream_net_name_);
10410447Snilay@cs.wisc.edu            // case 2: 'assign downstream_net_name_[end:begin] = upstream_net_name_'
10510447Snilay@cs.wisc.edu            void assign(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_);
10610447Snilay@cs.wisc.edu            // case 3: 'assign downstream_net_name_ = upstream_net_name_[end:begin]'
10710447Snilay@cs.wisc.edu            void assign(const String& downstream_net_name_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
10810447Snilay@cs.wisc.edu            // case 4: 'assign downstream_net_name_[end:begin] = upstream_net_name_[end:begin]'
10910447Snilay@cs.wisc.edu            void assign(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
11010447Snilay@cs.wisc.edu
11110447Snilay@cs.wisc.edu            // Connect a port (input or output) to some ElectricalNet
11210447Snilay@cs.wisc.edu            // case 1: .connect_port_name_(connect_net_name_)
11310447Snilay@cs.wisc.edu            void portConnect(ElectricalModel* connect_model_, const String& connect_port_name_, const String& connect_net_name_);
11410447Snilay@cs.wisc.edu            // case 2: .connect_port_name_(connect_net_name[end:begin])
11510447Snilay@cs.wisc.edu            void portConnect(ElectricalModel* connect_model_, const String& connect_port_name_, const String& connect_net_name_, const NetIndex& connect_net_indices_);
11610447Snilay@cs.wisc.edu
11710447Snilay@cs.wisc.edu            // Assign a net to be downstream from another net through a driver multipliers
11810447Snilay@cs.wisc.edu            void assignVirtualFanout(const String& downstream_net_name_, const String& upstream_net_name_);
11910447Snilay@cs.wisc.edu            void assignVirtualFanout(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
12010447Snilay@cs.wisc.edu            // Assign a net to be downstream from another net
12110447Snilay@cs.wisc.edu            // This is used to enable bit_duplication
12210447Snilay@cs.wisc.edu            void assignVirtualFanin(const String& downstream_net_name_, const String& upstream_net_name_);
12310447Snilay@cs.wisc.edu            void assignVirtualFanin(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
12410447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
12510447Snilay@cs.wisc.edu
12610447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
12710447Snilay@cs.wisc.edu            // Timing Model Components
12810447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
12910447Snilay@cs.wisc.edu            // Electrical Drivers
13010447Snilay@cs.wisc.edu            void createDriver(const String& name_, bool sizable_);
13110447Snilay@cs.wisc.edu            //void createDriver(const String& name_, bool sizable_, int start_index_, int end_index_);
13210447Snilay@cs.wisc.edu            const Map<ElectricalDriver*>* getDrivers() const;
13310447Snilay@cs.wisc.edu            ElectricalDriver* getDriver(const String& name_);
13410447Snilay@cs.wisc.edu            // Electrical Driver Multipliers
13510447Snilay@cs.wisc.edu            void createDriverMultiplier(const String& name_);
13610447Snilay@cs.wisc.edu            const Map<ElectricalDriverMultiplier*>* getDriverMultipliers() const;
13710447Snilay@cs.wisc.edu            ElectricalDriverMultiplier* getDriverMultiplier(const String& name_);
13810447Snilay@cs.wisc.edu
13910447Snilay@cs.wisc.edu
14010447Snilay@cs.wisc.edu            // Electrical Loads
14110447Snilay@cs.wisc.edu            void createLoad(const String& name_);
14210447Snilay@cs.wisc.edu            //void createLoad(const String& name_, int start_index_, int end_index_);
14310447Snilay@cs.wisc.edu            const Map<ElectricalLoad*>* getLoads() const;
14410447Snilay@cs.wisc.edu            ElectricalLoad* getLoad(const String& name_);
14510447Snilay@cs.wisc.edu            // Electrical Delay creation
14610447Snilay@cs.wisc.edu            void createDelay(const String& name_);
14710447Snilay@cs.wisc.edu            //void createDelay(const String& name_, int start_index_, int end_index_);
14810447Snilay@cs.wisc.edu            const Map<ElectricalDelay*>* getDelays() const;
14910447Snilay@cs.wisc.edu            ElectricalDelay* getDelay(const String& name_);
15010447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
15110447Snilay@cs.wisc.edu
15210447Snilay@cs.wisc.edu            // Get current driving strength
15310447Snilay@cs.wisc.edu            double getDrivingStrength() const;
15410447Snilay@cs.wisc.edu            // Get current driving strength index
15510447Snilay@cs.wisc.edu            int getDrivingStrengthIdx() const;
15610447Snilay@cs.wisc.edu            // Set driving strength by index
15710447Snilay@cs.wisc.edu            void setDrivingStrengthIdx(int idx_);
15810447Snilay@cs.wisc.edu            // Set the instance to minimum driving strength
15910447Snilay@cs.wisc.edu            void setMinDrivingStrength();
16010447Snilay@cs.wisc.edu            // Return true if the instance has minimum driving strength
16110447Snilay@cs.wisc.edu            bool hasMinDrivingStrength() const;
16210447Snilay@cs.wisc.edu            // Return true if the instance has maximum driving strength
16310447Snilay@cs.wisc.edu            bool hasMaxDrivingStrength() const;
16410447Snilay@cs.wisc.edu            // Increase driving strength index by 1
16510447Snilay@cs.wisc.edu            void increaseDrivingStrength();
16610447Snilay@cs.wisc.edu            // Decrease driving strength index by 1
16710447Snilay@cs.wisc.edu            void decreaseDrivingStrength();
16810447Snilay@cs.wisc.edu
16910447Snilay@cs.wisc.edu            // Create the default sets of the electrical results
17010447Snilay@cs.wisc.edu            void createElectricalResults();
17110447Snilay@cs.wisc.edu            // Add the default sets of the electrical results from a model
17210447Snilay@cs.wisc.edu            void addElectricalSubResults(const ElectricalModel* model_, double number_models_);
17310447Snilay@cs.wisc.edu            // Add extra wire sub results
17410447Snilay@cs.wisc.edu            void addElectricalWireSubResult(const String& wire_layer_, const Result* result_, const String& producer_, double number_results_);
17510447Snilay@cs.wisc.edu            // Create the default sets of the electrical atomic results
17610447Snilay@cs.wisc.edu            void createElectricalAtomicResults();
17710447Snilay@cs.wisc.edu            // Accumulate the electrical atomic results' values
17810447Snilay@cs.wisc.edu            void addElecticalAtomicResultValues(const ElectricalModel* model_, double number_models_);
17910447Snilay@cs.wisc.edu            // Add extra wire sub results
18010447Snilay@cs.wisc.edu            void addElecticalWireAtomicResultValue(const String& wire_layer_, double value_);
18110447Snilay@cs.wisc.edu            // Reset the electrical atomic results' values
18210447Snilay@cs.wisc.edu            void resetElectricalAtomicResults();
18310447Snilay@cs.wisc.edu            // Create an electrical event result. This will add an event associate to all input/output ports
18410447Snilay@cs.wisc.edu            void createElectricalEventResult(const String& name_);
18510447Snilay@cs.wisc.edu            // Create an electrical event atomic result
18610447Snilay@cs.wisc.edu            void createElectricalEventAtomicResult(const String& name_);
18710447Snilay@cs.wisc.edu
18810447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
18910447Snilay@cs.wisc.edu            // Helper functions to propagate transition information
19010447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
19110447Snilay@cs.wisc.edu            void assignPortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const TransitionInfo& trans_info_);
19210447Snilay@cs.wisc.edu            void propagatePortTransitionInfo(const String& downstream_port_name_, const String& upstream_port_name_);
19310447Snilay@cs.wisc.edu            void propagatePortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const String& upstream_port_name_);
19410447Snilay@cs.wisc.edu            void propagatePortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const ElectricalModel* upstream_model_, const String& upstream_port_name_);
19510447Snilay@cs.wisc.edu            void propagatePortTransitionInfo(const String& downstream_port_name_, const ElectricalModel* upstream_model_, const String& upstream_port_name_);
19610447Snilay@cs.wisc.edu            virtual void propagateTransitionInfo();
19710447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
19810447Snilay@cs.wisc.edu
19910447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
20010447Snilay@cs.wisc.edu            // Helper functions to insert and remove buffers
20110447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
20210447Snilay@cs.wisc.edu
20310447Snilay@cs.wisc.edu            //-----------------------------------------------------------------
20410447Snilay@cs.wisc.edu
20510447Snilay@cs.wisc.edu            virtual void useModel(const String& event_name_);
20610447Snilay@cs.wisc.edu            virtual void useModel();
20710447Snilay@cs.wisc.edu            // TODO - add comments
20810447Snilay@cs.wisc.edu            void applyTransitionInfo(const String& event_name_);
20910447Snilay@cs.wisc.edu            // TODO - add comments
21010447Snilay@cs.wisc.edu            EventInfo* getEventInfo(const String& event_name_);
21110447Snilay@cs.wisc.edu
21210447Snilay@cs.wisc.edu        protected:
21310447Snilay@cs.wisc.edu            // In an ElectricalModel, the complete port-to-port connectivity
21410447Snilay@cs.wisc.edu            // of all sub-instance must be specified. Addition/Removal ports or
21510447Snilay@cs.wisc.edu            // port-related nets cannot happen after this step
21610447Snilay@cs.wisc.edu            //virtual void constructModel() = 0;
21710447Snilay@cs.wisc.edu            // In an ElectricalModel, updateModel MUST finish all necessary
21810447Snilay@cs.wisc.edu            // calculations such that a timing model can be run
21910447Snilay@cs.wisc.edu            //virtual void updateModel() = 0;
22010447Snilay@cs.wisc.edu            // In an ElectricalModel, evaluateModel should calculate all
22110447Snilay@cs.wisc.edu            // event energies, now that the connectivity and timing has been
22210447Snilay@cs.wisc.edu            // completed
22310447Snilay@cs.wisc.edu            //virtual void evaluateModel() = 0;
22410447Snilay@cs.wisc.edu
22510447Snilay@cs.wisc.edu        private:
22610447Snilay@cs.wisc.edu            // Private copy constructor. Use clone to perform copy operation.
22710447Snilay@cs.wisc.edu            ElectricalModel(const ElectricalModel& model_);
22810447Snilay@cs.wisc.edu
22910447Snilay@cs.wisc.edu        private:
23010447Snilay@cs.wisc.edu            // Contains the driving strengths in increasing order
23110447Snilay@cs.wisc.edu            vector<double> m_driving_strengths_;
23210447Snilay@cs.wisc.edu            // Driving strength index in the driving strength vector
23310447Snilay@cs.wisc.edu            int m_curr_driving_strengths_idx_;
23410447Snilay@cs.wisc.edu
23510447Snilay@cs.wisc.edu            //Connectivity elements
23610447Snilay@cs.wisc.edu            // Nets can come in various bus widths. A net reference is really
23710447Snilay@cs.wisc.edu            // just a helper map mapping a referenced map name to a bunch of
23810447Snilay@cs.wisc.edu            // net indices. A net index returns the starting and end indices of
23910447Snilay@cs.wisc.edu            // a net if the net is a multi-bit bus of some sort
24010447Snilay@cs.wisc.edu            Map<NetIndex>* m_net_references_;
24110447Snilay@cs.wisc.edu            // Map of the input ports
24210447Snilay@cs.wisc.edu            Map<PortInfo*>* m_input_ports_;
24310447Snilay@cs.wisc.edu            // Map of the output ports
24410447Snilay@cs.wisc.edu            Map<PortInfo*>* m_output_ports_;
24510447Snilay@cs.wisc.edu            // Map of all our electrical nets
24610447Snilay@cs.wisc.edu            Map<ElectricalNet*>* m_nets_;
24710447Snilay@cs.wisc.edu
24810447Snilay@cs.wisc.edu            //Timing model elements
24910447Snilay@cs.wisc.edu            // Map of all our electrical drivers
25010447Snilay@cs.wisc.edu            Map<ElectricalDriver*>* m_drivers_;
25110447Snilay@cs.wisc.edu            // Map of all our driver multipliers
25210447Snilay@cs.wisc.edu            Map<ElectricalDriverMultiplier*>* m_driver_multipliers_;
25310447Snilay@cs.wisc.edu            // Map of all our electrical loads
25410447Snilay@cs.wisc.edu            Map<ElectricalLoad*>* m_loads_;
25510447Snilay@cs.wisc.edu            // Map of all our idealized delays
25610447Snilay@cs.wisc.edu            Map<ElectricalDelay*>* m_delays_;
25710447Snilay@cs.wisc.edu
25810447Snilay@cs.wisc.edu            // Map of the event infos
25910447Snilay@cs.wisc.edu            Map<EventInfo*>* m_event_infos_;
26010447Snilay@cs.wisc.edu
26110447Snilay@cs.wisc.edu    }; // class ElectricalModel
26210447Snilay@cs.wisc.edu} // namespace DSENT
26310447Snilay@cs.wisc.edu
26410447Snilay@cs.wisc.edu#endif // __DSENT_MODEL_ELECTRICALMODEL_H__
26510447Snilay@cs.wisc.edu
266