sensitivity.hh (13206:c944ef4abb48) | sensitivity.hh (13207:034ca389a810) |
---|---|
1/* 2 * Copyright 2018 Google, Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer; 8 * redistributions in binary form must reproduce the above copyright --- 65 unchanged lines hidden (view full) --- 74 virtual bool 75 notifyWork(Event *e) 76 { 77 satisfy(); 78 return true; 79 } 80 81 public: | 1/* 2 * Copyright 2018 Google, Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer; 8 * redistributions in binary form must reproduce the above copyright --- 65 unchanged lines hidden (view full) --- 74 virtual bool 75 notifyWork(Event *e) 76 { 77 satisfy(); 78 return true; 79 } 80 81 public: |
82 virtual void finalize() = 0; | |
83 virtual void clear() = 0; 84 85 void satisfy(); 86 bool notify(Event *e); 87 88 virtual bool dynamic() = 0; 89}; 90 --- 28 unchanged lines hidden (view full) --- 119 public: 120 bool dynamic() override { return false; } 121}; 122 123typedef std::vector<StaticSensitivity *> StaticSensitivities; 124 125 126/* | 82 virtual void clear() = 0; 83 84 void satisfy(); 85 bool notify(Event *e); 86 87 virtual bool dynamic() = 0; 88}; 89 --- 28 unchanged lines hidden (view full) --- 118 public: 119 bool dynamic() override { return false; } 120}; 121 122typedef std::vector<StaticSensitivity *> StaticSensitivities; 123 124 125/* |
127 * Sensitivity to events, which can be static or dynamic. | 126 * Sensitivity to an event or events, which can be static or dynamic. |
128 */ 129 130class SensitivityEvent : virtual public Sensitivity 131{ 132 protected: 133 const ::sc_core::sc_event *event; 134 135 SensitivityEvent(Process *p, const ::sc_core::sc_event *e=nullptr) : 136 Sensitivity(p), event(e) 137 {} 138 139 public: | 127 */ 128 129class SensitivityEvent : virtual public Sensitivity 130{ 131 protected: 132 const ::sc_core::sc_event *event; 133 134 SensitivityEvent(Process *p, const ::sc_core::sc_event *e=nullptr) : 135 Sensitivity(p), event(e) 136 {} 137 138 public: |
140 void finalize() override { addToEvent(event); } | |
141 void clear() override { delFromEvent(event); } 142}; 143 | 139 void clear() override { delFromEvent(event); } 140}; 141 |
142class SensitivityEvents : virtual public Sensitivity 143{ 144 protected: 145 std::set<const ::sc_core::sc_event *> events; |
|
144 | 146 |
147 SensitivityEvents(Process *p) : Sensitivity(p) {} 148 SensitivityEvents( 149 Process *p, const std::set<const ::sc_core::sc_event *> &s) : 150 Sensitivity(p), events(s) 151 {} 152 153 public: 154 void 155 clear() override 156 { 157 for (auto event: events) 158 delFromEvent(event); 159 } 160 161 void 162 addEvent(const ::sc_core::sc_event *event) 163 { 164 events.insert(event); 165 addToEvent(event); 166 } 167}; 168 169 |
|
145/* 146 * Static sensitivities. 147 */ 148 | 170/* 171 * Static sensitivities. 172 */ 173 |
174void newStaticSensitivityEvent(Process *p, const sc_core::sc_event *e); 175void newStaticSensitivityInterface(Process *p, const sc_core::sc_interface *i); 176void newStaticSensitivityPort(Process *p, const sc_core::sc_port_base *pb); 177void newStaticSensitivityExport( 178 Process *p, const sc_core::sc_export_base *exp); 179void newStaticSensitivityFinder( 180 Process *p, const sc_core::sc_event_finder *f); 181 182 |
|
149class StaticSensitivityEvent : 150 public StaticSensitivity, public SensitivityEvent 151{ | 183class StaticSensitivityEvent : 184 public StaticSensitivity, public SensitivityEvent 185{ |
152 public: | 186 friend void newStaticSensitivityEvent( 187 Process *p, const sc_core::sc_event *e); 188 189 protected: |
153 StaticSensitivityEvent(Process *p, const sc_core::sc_event *e) : 154 Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p, e) 155 {} 156}; 157 158class StaticSensitivityInterface : 159 public StaticSensitivity, public SensitivityEvent 160{ | 190 StaticSensitivityEvent(Process *p, const sc_core::sc_event *e) : 191 Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p, e) 192 {} 193}; 194 195class StaticSensitivityInterface : 196 public StaticSensitivity, public SensitivityEvent 197{ |
161 private: 162 const sc_core::sc_interface *interface; 163 164 public: 165 StaticSensitivityInterface(Process *p, const sc_core::sc_interface *i) : 166 Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p), interface(i) 167 {} 168 169 void finalize() override; | 198 friend void newStaticSensitivityInterface( 199 Process *p, const sc_core::sc_interface *i); 200 protected: 201 StaticSensitivityInterface(Process *p, const sc_core::sc_interface *i); |
170}; 171 | 202}; 203 |
172class StaticSensitivityPort : public StaticSensitivity | 204class StaticSensitivityPort : 205 public StaticSensitivity, public SensitivityEvents |
173{ | 206{ |
174 private: 175 const ::sc_core::sc_port_base *port; 176 std::set<const ::sc_core::sc_event *> events; | 207 friend void newStaticSensitivityPort( 208 Process *p, const sc_core::sc_port_base *pb); |
177 | 209 |
178 public: 179 StaticSensitivityPort(Process *p, const sc_core::sc_port_base *pb) : 180 Sensitivity(p), StaticSensitivity(p), port(pb) | 210 protected: 211 StaticSensitivityPort(Process *p) : 212 Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p) |
181 {} | 213 {} |
182 183 void finalize() override; 184 185 void 186 clear() override 187 { 188 for (auto event: events) 189 delFromEvent(event); 190 } | |
191}; 192 193class StaticSensitivityExport : 194 public StaticSensitivity, public SensitivityEvent 195{ 196 private: | 214}; 215 216class StaticSensitivityExport : 217 public StaticSensitivity, public SensitivityEvent 218{ 219 private: |
197 const sc_core::sc_export_base *exp; | 220 friend void newStaticSensitivityExport( 221 Process *p, const sc_core::sc_export_base *exp); |
198 | 222 |
199 public: 200 StaticSensitivityExport(Process *p, const sc_core::sc_export_base *exp) : 201 Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p), exp(exp) 202 {} 203 204 void finalize() override; | 223 StaticSensitivityExport(Process *p, const sc_core::sc_export_base *exp); |
205}; 206 | 224}; 225 |
207class StaticSensitivityFinder : public StaticSensitivity | 226 227class StaticSensitivityFinder : 228 public StaticSensitivity, public SensitivityEvents |
208{ 209 private: | 229{ 230 private: |
210 const ::sc_core::sc_event_finder *finder; 211 std::set<const ::sc_core::sc_event *> events; | 231 const sc_core::sc_event_finder *finder; |
212 | 232 |
213 public: | 233 friend void newStaticSensitivityFinder( 234 Process *p, const sc_core::sc_event_finder *f); 235 |
214 StaticSensitivityFinder(Process *p, const sc_core::sc_event_finder *f) : | 236 StaticSensitivityFinder(Process *p, const sc_core::sc_event_finder *f) : |
215 Sensitivity(p), StaticSensitivity(p), finder(f) | 237 Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p), finder(f) |
216 {} 217 | 238 {} 239 |
218 void finalize() override; 219 220 void 221 clear() override 222 { 223 for (auto event: events) 224 delFromEvent(event); 225 } | 240 public: 241 const ::sc_core::sc_event &find(::sc_core::sc_interface *i); |
226}; 227 228 229/* 230 * Dynamic sensitivities. 231 */ 232 | 242}; 243 244 245/* 246 * Dynamic sensitivities. 247 */ 248 |
249void newDynamicSensitivityEvent(Process *p, const sc_core::sc_event *e); 250void newDynamicSensitivityEventOrList( 251 Process *p, const sc_core::sc_event_or_list *eol); 252void newDynamicSensitivityEventAndList( 253 Process *p, const sc_core::sc_event_and_list *eal); 254 |
|
233class DynamicSensitivityEvent : 234 public DynamicSensitivity, public SensitivityEvent 235{ | 255class DynamicSensitivityEvent : 256 public DynamicSensitivity, public SensitivityEvent 257{ |
236 public: | 258 private: 259 friend void newDynamicSensitivityEvent( 260 Process *p, const sc_core::sc_event *e); 261 |
237 DynamicSensitivityEvent(Process *p, const sc_core::sc_event *e) : 238 Sensitivity(p), DynamicSensitivity(p), SensitivityEvent(p, e) 239 {} 240}; 241 | 262 DynamicSensitivityEvent(Process *p, const sc_core::sc_event *e) : 263 Sensitivity(p), DynamicSensitivity(p), SensitivityEvent(p, e) 264 {} 265}; 266 |
242class DynamicSensitivityEventOrList : public DynamicSensitivity | 267class DynamicSensitivityEventOrList : 268 public DynamicSensitivity, public SensitivityEvents |
243{ 244 private: | 269{ 270 private: |
245 std::set<const ::sc_core::sc_event *> events; | 271 friend void newDynamicSensitivityEventOrList( 272 Process *p, const sc_core::sc_event_or_list *eol); |
246 | 273 |
247 protected: 248 bool notifyWork(Event *e) override; 249 250 public: | |
251 DynamicSensitivityEventOrList( 252 Process *p, const sc_core::sc_event_or_list *eol); 253 | 274 DynamicSensitivityEventOrList( 275 Process *p, const sc_core::sc_event_or_list *eol); 276 |
254 void finalize() override; 255 void clear() override; | 277 bool notifyWork(Event *e) override; |
256}; 257 258//XXX This sensitivity can't be reused. To reset it, it has to be deleted and 259//recreated. That works for dynamic sensitivities, but not for static. 260//Fortunately processes can't be statically sensitive to sc_event_and_lists. | 278}; 279 280//XXX This sensitivity can't be reused. To reset it, it has to be deleted and 281//recreated. That works for dynamic sensitivities, but not for static. 282//Fortunately processes can't be statically sensitive to sc_event_and_lists. |
261class DynamicSensitivityEventAndList : public DynamicSensitivity | 283class DynamicSensitivityEventAndList : 284 public DynamicSensitivity, public SensitivityEvents |
262{ 263 private: | 285{ 286 private: |
264 std::set<const ::sc_core::sc_event *> events; | 287 friend void newDynamicSensitivityEventAndList( 288 Process *p, const sc_core::sc_event_and_list *eal); |
265 | 289 |
266 protected: 267 bool notifyWork(Event *e) override; 268 269 public: | |
270 DynamicSensitivityEventAndList( 271 Process *p, const sc_core::sc_event_and_list *eal); 272 | 290 DynamicSensitivityEventAndList( 291 Process *p, const sc_core::sc_event_and_list *eal); 292 |
273 void finalize() override; 274 void clear() override; | 293 bool notifyWork(Event *e) override; |
275}; 276 277} // namespace sc_gem5 278 279#endif //__SYSTEMC_CORE_SENSITIVITY_HH__ | 294}; 295 296} // namespace sc_gem5 297 298#endif //__SYSTEMC_CORE_SENSITIVITY_HH__ |