Deleted Added
sdiff udiff text old ( 10447:a465576671d4 ) new ( 10448:bc1a3b7ab5ef )
full compact
1#ifndef __DSENT_MODEL_ELECTRICALMODEL_H__
2#define __DSENT_MODEL_ELECTRICALMODEL_H__
3
4#include "util/CommonType.h"
5#include "model/Model.h"
6#include "model/TransitionInfo.h"
7
8namespace DSENT
9{
10 class PortInfo;
11 class EventInfo;
12 class ElectricalDriver;
13 class ElectricalDriverMultiplier;
14 class ElectricalNet;
15 class ElectricalLoad;
16 class ElectricalDelay;
17
18 // A Net index consisting of a start and end index
19 typedef std::pair<int, int> NetIndex;
20
21 // Helper function to make net index
22 inline NetIndex makeNetIndex(int start_index_, int end_index_)
23 {
24 ASSERT((end_index_ >= start_index_), (String)"[Error] Invalid net index range " +
25
26 "[" + (String)start_index_ + ":" + (String)end_index_ + "]");
27
28 return NetIndex(start_index_, end_index_);
29 }
30
31 // Helper function to make net index
32 inline NetIndex makeNetIndex(int index_)
33 {
34 return makeNetIndex(index_, index_);
35 }
36
37 // Helper function to trun NetIndex to String
38 inline String toString(const NetIndex& net_index_)
39 {
40 return "[" + String(net_index_.second) + ":" + String(net_index_.first) + "]";
41 }
42
43 // ElectricalModel specifies physical connectivity to other models as well as the port
44 // parameters for the current model
45 class ElectricalModel : public Model
46 {
47 public:
48 ElectricalModel(const String& instance_name_, const TechModel* tech_model_);
49 virtual ~ElectricalModel();
50
51 public:
52 // Check if all properties needed exist in the m_properties_
53 virtual void checkProperties() const;
54 // Set available driving strength vector from string
55 void setAvailableDrivingStrengths(const String& driving_strengths_);
56
57 //-----------------------------------------------------------------
58 // Connectivity specification
59 //-----------------------------------------------------------------
60 // Net Indices
61 const Map<NetIndex>* getNetReferences() const;
62 const NetIndex getNetReference(const String& name_) const;
63 // Input Ports
64 void createInputPort(const String& name_, const NetIndex& net_indices_ = NetIndex(0, 0));
65 const Map<PortInfo*>* getInputs() const;
66 PortInfo* getInputPort(const String& name_);
67 const PortInfo* getInputPort(const String& name_) const;
68 // Output Ports
69 void createOutputPort(const String& name_, const NetIndex& net_indices_ = NetIndex(0, 0));
70 const Map<PortInfo*>* getOutputs() const;
71 PortInfo* getOutputPort(const String& name_);
72 const PortInfo* getOutputPort(const String& name_) const;
73 // Electrical Nets
74 void createNet(const String& name_);
75 void createNet(const String& name_, const NetIndex& net_indices_);
76 const Map<ElectricalNet*>* getNets() const;
77 ElectricalNet* getNet(const String& name_);
78 ElectricalNet* getNet(const String& name_, const NetIndex& index_);
79
80 // Assign a net to be downstream from another net
81 // case 1: 'assign downstream_net_name_ = upstream_net_name_'
82 void assign(const String& downstream_net_name_, const String& upstream_net_name_);
83 // case 2: 'assign downstream_net_name_[end:begin] = upstream_net_name_'
84 void assign(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_);
85 // case 3: 'assign downstream_net_name_ = upstream_net_name_[end:begin]'
86 void assign(const String& downstream_net_name_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
87 // case 4: 'assign downstream_net_name_[end:begin] = upstream_net_name_[end:begin]'
88 void assign(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
89
90 // Connect a port (input or output) to some ElectricalNet
91 // case 1: .connect_port_name_(connect_net_name_)
92 void portConnect(ElectricalModel* connect_model_, const String& connect_port_name_, const String& connect_net_name_);
93 // case 2: .connect_port_name_(connect_net_name[end:begin])
94 void portConnect(ElectricalModel* connect_model_, const String& connect_port_name_, const String& connect_net_name_, const NetIndex& connect_net_indices_);
95
96 // Assign a net to be downstream from another net through a driver multipliers
97 void assignVirtualFanout(const String& downstream_net_name_, const String& upstream_net_name_);
98 void assignVirtualFanout(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
99 // Assign a net to be downstream from another net
100 // This is used to enable bit_duplication
101 void assignVirtualFanin(const String& downstream_net_name_, const String& upstream_net_name_);
102 void assignVirtualFanin(const String& downstream_net_name_, const NetIndex& downstream_net_indices_, const String& upstream_net_name_, const NetIndex& upstream_net_indices_);
103 //-----------------------------------------------------------------
104
105 //-----------------------------------------------------------------
106 // Timing Model Components
107 //-----------------------------------------------------------------
108 // Electrical Drivers
109 void createDriver(const String& name_, bool sizable_);
110 //void createDriver(const String& name_, bool sizable_, int start_index_, int end_index_);
111 const Map<ElectricalDriver*>* getDrivers() const;
112 ElectricalDriver* getDriver(const String& name_);
113 // Electrical Driver Multipliers
114 void createDriverMultiplier(const String& name_);
115 const Map<ElectricalDriverMultiplier*>* getDriverMultipliers() const;
116 ElectricalDriverMultiplier* getDriverMultiplier(const String& name_);
117
118
119 // Electrical Loads
120 void createLoad(const String& name_);
121 //void createLoad(const String& name_, int start_index_, int end_index_);
122 const Map<ElectricalLoad*>* getLoads() const;
123 ElectricalLoad* getLoad(const String& name_);
124 // Electrical Delay creation
125 void createDelay(const String& name_);
126 //void createDelay(const String& name_, int start_index_, int end_index_);
127 const Map<ElectricalDelay*>* getDelays() const;
128 ElectricalDelay* getDelay(const String& name_);
129 //-----------------------------------------------------------------
130
131 // Get current driving strength
132 double getDrivingStrength() const;
133 // Get current driving strength index
134 int getDrivingStrengthIdx() const;
135 // Set driving strength by index
136 void setDrivingStrengthIdx(int idx_);
137 // Set the instance to minimum driving strength
138 void setMinDrivingStrength();
139 // Return true if the instance has minimum driving strength
140 bool hasMinDrivingStrength() const;
141 // Return true if the instance has maximum driving strength
142 bool hasMaxDrivingStrength() const;
143 // Increase driving strength index by 1
144 void increaseDrivingStrength();
145 // Decrease driving strength index by 1
146 void decreaseDrivingStrength();
147
148 // Create the default sets of the electrical results
149 void createElectricalResults();
150 // Add the default sets of the electrical results from a model
151 void addElectricalSubResults(const ElectricalModel* model_, double number_models_);
152 // Add extra wire sub results
153 void addElectricalWireSubResult(const String& wire_layer_, const Result* result_, const String& producer_, double number_results_);
154 // Create the default sets of the electrical atomic results
155 void createElectricalAtomicResults();
156 // Accumulate the electrical atomic results' values
157 void addElecticalAtomicResultValues(const ElectricalModel* model_, double number_models_);
158 // Add extra wire sub results
159 void addElecticalWireAtomicResultValue(const String& wire_layer_, double value_);
160 // Reset the electrical atomic results' values
161 void resetElectricalAtomicResults();
162 // Create an electrical event result. This will add an event associate to all input/output ports
163 void createElectricalEventResult(const String& name_);
164 // Create an electrical event atomic result
165 void createElectricalEventAtomicResult(const String& name_);
166
167 //-----------------------------------------------------------------
168 // Helper functions to propagate transition information
169 //-----------------------------------------------------------------
170 void assignPortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const TransitionInfo& trans_info_);
171 void propagatePortTransitionInfo(const String& downstream_port_name_, const String& upstream_port_name_);
172 void propagatePortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const String& upstream_port_name_);
173 void propagatePortTransitionInfo(ElectricalModel* downstream_model_, const String& downstream_port_name_, const ElectricalModel* upstream_model_, const String& upstream_port_name_);
174 void propagatePortTransitionInfo(const String& downstream_port_name_, const ElectricalModel* upstream_model_, const String& upstream_port_name_);
175 virtual void propagateTransitionInfo();
176 //-----------------------------------------------------------------
177
178 //-----------------------------------------------------------------
179 // Helper functions to insert and remove buffers
180 //-----------------------------------------------------------------
181
182 //-----------------------------------------------------------------
183
184 virtual void useModel(const String& event_name_);
185 virtual void useModel();
186 // TODO - add comments
187 void applyTransitionInfo(const String& event_name_);
188 // TODO - add comments
189 EventInfo* getEventInfo(const String& event_name_);
190
191 protected:
192 // In an ElectricalModel, the complete port-to-port connectivity
193 // of all sub-instance must be specified. Addition/Removal ports or
194 // port-related nets cannot happen after this step
195 //virtual void constructModel() = 0;
196 // In an ElectricalModel, updateModel MUST finish all necessary
197 // calculations such that a timing model can be run
198 //virtual void updateModel() = 0;
199 // In an ElectricalModel, evaluateModel should calculate all
200 // event energies, now that the connectivity and timing has been
201 // completed
202 //virtual void evaluateModel() = 0;
203
204 private:
205 // Private copy constructor. Use clone to perform copy operation.
206 ElectricalModel(const ElectricalModel& model_);
207
208 private:
209 // Contains the driving strengths in increasing order
210 vector<double> m_driving_strengths_;
211 // Driving strength index in the driving strength vector
212 int m_curr_driving_strengths_idx_;
213
214 //Connectivity elements
215 // Nets can come in various bus widths. A net reference is really
216 // just a helper map mapping a referenced map name to a bunch of
217 // net indices. A net index returns the starting and end indices of
218 // a net if the net is a multi-bit bus of some sort
219 Map<NetIndex>* m_net_references_;
220 // Map of the input ports
221 Map<PortInfo*>* m_input_ports_;
222 // Map of the output ports
223 Map<PortInfo*>* m_output_ports_;
224 // Map of all our electrical nets
225 Map<ElectricalNet*>* m_nets_;
226
227 //Timing model elements
228 // Map of all our electrical drivers
229 Map<ElectricalDriver*>* m_drivers_;
230 // Map of all our driver multipliers
231 Map<ElectricalDriverMultiplier*>* m_driver_multipliers_;
232 // Map of all our electrical loads
233 Map<ElectricalLoad*>* m_loads_;
234 // Map of all our idealized delays
235 Map<ElectricalDelay*>* m_delays_;
236
237 // Map of the event infos
238 Map<EventInfo*>* m_event_infos_;
239
240 }; // class ElectricalModel
241} // namespace DSENT
242
243#endif // __DSENT_MODEL_ELECTRICALMODEL_H__
244