1 #ifndef __DSENT_MODEL_ELECTRICALMODEL_H__
2 #define __DSENT_MODEL_ELECTRICALMODEL_H__
4 #include "util/CommonType.h"
5 #include "model/Model.h"
6 #include "model/TransitionInfo.h"
12 class ElectricalDriver
;
13 class ElectricalDriverMultiplier
;
16 class ElectricalDelay
;
18 // A Net index consisting of a start and end index
19 typedef std::pair
<int, int> NetIndex
;
21 // Helper function to make net index
22 inline NetIndex
makeNetIndex(int start_index_
, int end_index_
)
24 ASSERT((end_index_
>= start_index_
), (String
)"[Error] Invalid net index range " +
26 "[" + (String
)start_index_
+ ":" + (String
)end_index_
+ "]");
28 return NetIndex(start_index_
, end_index_
);
31 // Helper function to make net index
32 inline NetIndex
makeNetIndex(int index_
)
34 return makeNetIndex(index_
, index_
);
37 // Helper function to trun NetIndex to String
38 inline String
toString(const NetIndex
& net_index_
)
40 return "[" + String(net_index_
.second
) + ":" + String(net_index_
.first
) + "]";
43 // ElectricalModel specifies physical connectivity to other models as well as the port
44 // parameters for the current model
45 class ElectricalModel
: public Model
48 ElectricalModel(const String
& instance_name_
, const TechModel
* tech_model_
);
49 virtual ~ElectricalModel();
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_
);
57 //-----------------------------------------------------------------
58 // Connectivity specification
59 //-----------------------------------------------------------------
61 const Map
<NetIndex
>* getNetReferences() const;
62 const NetIndex
getNetReference(const String
& name_
) const;
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;
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;
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_
);
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_
);
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_
);
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 //-----------------------------------------------------------------
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_
);
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 //-----------------------------------------------------------------
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();
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_
);
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 //-----------------------------------------------------------------
178 //-----------------------------------------------------------------
179 // Helper functions to insert and remove buffers
180 //-----------------------------------------------------------------
182 //-----------------------------------------------------------------
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_
);
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
202 //virtual void evaluateModel() = 0;
205 // Private copy constructor. Use clone to perform copy operation.
206 ElectricalModel(const ElectricalModel
& model_
);
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_
;
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_
;
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_
;
237 // Map of the event infos
238 Map
<EventInfo
*>* m_event_infos_
;
240 }; // class ElectricalModel
243 #endif // __DSENT_MODEL_ELECTRICALMODEL_H__