ElectricalModel.h revision 10448
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