sensitivity.hh revision 13208:6703cb024823
112740Sandreas.sandberg@arm.com/* 212740Sandreas.sandberg@arm.com * Copyright 2018 Google, Inc. 312740Sandreas.sandberg@arm.com * 412740Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 512740Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 612740Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 712740Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 812740Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 912740Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1012740Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1112740Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1212740Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1312740Sandreas.sandberg@arm.com * this software without specific prior written permission. 1412740Sandreas.sandberg@arm.com * 1512740Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612740Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712740Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812740Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912740Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012740Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112740Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212740Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312740Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412740Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512740Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612740Sandreas.sandberg@arm.com * 2712740Sandreas.sandberg@arm.com * Authors: Gabe Black 2812740Sandreas.sandberg@arm.com */ 2912740Sandreas.sandberg@arm.com 3012740Sandreas.sandberg@arm.com#ifndef __SYSTEMC_CORE_SENSITIVITY_HH__ 3112740Sandreas.sandberg@arm.com#define __SYSTEMC_CORE_SENSITIVITY_HH__ 3212740Sandreas.sandberg@arm.com 3312740Sandreas.sandberg@arm.com#include <set> 3412740Sandreas.sandberg@arm.com#include <vector> 3512740Sandreas.sandberg@arm.com 3612740Sandreas.sandberg@arm.com#include "sim/eventq.hh" 3712740Sandreas.sandberg@arm.com#include "systemc/core/sched_event.hh" 3812740Sandreas.sandberg@arm.com#include "systemc/ext/core/sc_module.hh" 3912740Sandreas.sandberg@arm.com 4012740Sandreas.sandberg@arm.comnamespace sc_core 4112740Sandreas.sandberg@arm.com{ 4212740Sandreas.sandberg@arm.com 4312740Sandreas.sandberg@arm.comclass sc_event; 4413665Sandreas.sandberg@arm.comclass sc_event_and_list; 4513665Sandreas.sandberg@arm.comclass sc_event_or_list; 4613665Sandreas.sandberg@arm.comclass sc_event_finder; 4712740Sandreas.sandberg@arm.comclass sc_export_base; 4812740Sandreas.sandberg@arm.comclass sc_interface; 4912740Sandreas.sandberg@arm.comclass sc_port_base; 5012740Sandreas.sandberg@arm.com 5112740Sandreas.sandberg@arm.com} // namespace sc_core 5212740Sandreas.sandberg@arm.com 5312740Sandreas.sandberg@arm.comnamespace sc_gem5 5412740Sandreas.sandberg@arm.com{ 5512740Sandreas.sandberg@arm.com 5612740Sandreas.sandberg@arm.comclass Process; 5712740Sandreas.sandberg@arm.comclass Event; 5812740Sandreas.sandberg@arm.com 5912740Sandreas.sandberg@arm.com/* 6012740Sandreas.sandberg@arm.com * Common sensitivity interface. 6112740Sandreas.sandberg@arm.com */ 6212740Sandreas.sandberg@arm.com 6312740Sandreas.sandberg@arm.comclass Sensitivity 64{ 65 protected: 66 Process *process; 67 68 Sensitivity(Process *p) : process(p) {} 69 virtual ~Sensitivity() {} 70 71 virtual void addToEvent(const ::sc_core::sc_event *e) = 0; 72 virtual void delFromEvent(const ::sc_core::sc_event *e) = 0; 73 74 virtual bool 75 notifyWork(Event *e) 76 { 77 satisfy(); 78 return true; 79 } 80 81 public: 82 virtual void clear() = 0; 83 84 void satisfy(); 85 bool notify(Event *e); 86 87 virtual bool dynamic() = 0; 88 89 bool ofMethod(); 90}; 91 92 93/* 94 * Dynamic vs. static sensitivity. 95 */ 96 97class DynamicSensitivity : virtual public Sensitivity 98{ 99 protected: 100 DynamicSensitivity(Process *p) : Sensitivity(p) {} 101 102 void addToEvent(const ::sc_core::sc_event *e) override; 103 void delFromEvent(const ::sc_core::sc_event *e) override; 104 105 public: 106 bool dynamic() override { return true; } 107}; 108 109typedef std::vector<DynamicSensitivity *> DynamicSensitivities; 110 111 112class StaticSensitivity : virtual public Sensitivity 113{ 114 protected: 115 StaticSensitivity(Process *p) : Sensitivity(p) {} 116 117 void addToEvent(const ::sc_core::sc_event *e) override; 118 void delFromEvent(const ::sc_core::sc_event *e) override; 119 120 public: 121 bool dynamic() override { return false; } 122}; 123 124typedef std::vector<StaticSensitivity *> StaticSensitivities; 125 126 127/* 128 * Sensitivity to an event or events, which can be static or dynamic. 129 */ 130 131class SensitivityEvent : virtual public Sensitivity 132{ 133 protected: 134 const ::sc_core::sc_event *event; 135 136 SensitivityEvent(Process *p, const ::sc_core::sc_event *e=nullptr) : 137 Sensitivity(p), event(e) 138 {} 139 140 public: 141 void clear() override { delFromEvent(event); } 142}; 143 144class SensitivityEvents : virtual public Sensitivity 145{ 146 protected: 147 std::set<const ::sc_core::sc_event *> events; 148 149 SensitivityEvents(Process *p) : Sensitivity(p) {} 150 SensitivityEvents( 151 Process *p, const std::set<const ::sc_core::sc_event *> &s) : 152 Sensitivity(p), events(s) 153 {} 154 155 public: 156 void 157 clear() override 158 { 159 for (auto event: events) 160 delFromEvent(event); 161 } 162 163 void 164 addEvent(const ::sc_core::sc_event *event) 165 { 166 events.insert(event); 167 addToEvent(event); 168 } 169}; 170 171 172/* 173 * Static sensitivities. 174 */ 175 176void newStaticSensitivityEvent(Process *p, const sc_core::sc_event *e); 177void newStaticSensitivityInterface(Process *p, const sc_core::sc_interface *i); 178void newStaticSensitivityPort(Process *p, const sc_core::sc_port_base *pb); 179void newStaticSensitivityExport( 180 Process *p, const sc_core::sc_export_base *exp); 181void newStaticSensitivityFinder( 182 Process *p, const sc_core::sc_event_finder *f); 183 184 185class StaticSensitivityEvent : 186 public StaticSensitivity, public SensitivityEvent 187{ 188 friend void newStaticSensitivityEvent( 189 Process *p, const sc_core::sc_event *e); 190 191 protected: 192 StaticSensitivityEvent(Process *p, const sc_core::sc_event *e) : 193 Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p, e) 194 {} 195}; 196 197class StaticSensitivityInterface : 198 public StaticSensitivity, public SensitivityEvent 199{ 200 friend void newStaticSensitivityInterface( 201 Process *p, const sc_core::sc_interface *i); 202 protected: 203 StaticSensitivityInterface(Process *p, const sc_core::sc_interface *i); 204}; 205 206class StaticSensitivityPort : 207 public StaticSensitivity, public SensitivityEvents 208{ 209 friend void newStaticSensitivityPort( 210 Process *p, const sc_core::sc_port_base *pb); 211 212 protected: 213 StaticSensitivityPort(Process *p) : 214 Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p) 215 {} 216}; 217 218class StaticSensitivityExport : 219 public StaticSensitivity, public SensitivityEvent 220{ 221 private: 222 friend void newStaticSensitivityExport( 223 Process *p, const sc_core::sc_export_base *exp); 224 225 StaticSensitivityExport(Process *p, const sc_core::sc_export_base *exp); 226}; 227 228 229class StaticSensitivityFinder : 230 public StaticSensitivity, public SensitivityEvents 231{ 232 private: 233 const sc_core::sc_event_finder *finder; 234 235 friend void newStaticSensitivityFinder( 236 Process *p, const sc_core::sc_event_finder *f); 237 238 StaticSensitivityFinder(Process *p, const sc_core::sc_event_finder *f) : 239 Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p), finder(f) 240 {} 241 242 public: 243 const ::sc_core::sc_event &find(::sc_core::sc_interface *i); 244}; 245 246 247/* 248 * Dynamic sensitivities. 249 */ 250 251void newDynamicSensitivityEvent(Process *p, const sc_core::sc_event *e); 252void newDynamicSensitivityEventOrList( 253 Process *p, const sc_core::sc_event_or_list *eol); 254void newDynamicSensitivityEventAndList( 255 Process *p, const sc_core::sc_event_and_list *eal); 256 257class DynamicSensitivityEvent : 258 public DynamicSensitivity, public SensitivityEvent 259{ 260 private: 261 friend void newDynamicSensitivityEvent( 262 Process *p, const sc_core::sc_event *e); 263 264 DynamicSensitivityEvent(Process *p, const sc_core::sc_event *e) : 265 Sensitivity(p), DynamicSensitivity(p), SensitivityEvent(p, e) 266 {} 267}; 268 269class DynamicSensitivityEventOrList : 270 public DynamicSensitivity, public SensitivityEvents 271{ 272 private: 273 friend void newDynamicSensitivityEventOrList( 274 Process *p, const sc_core::sc_event_or_list *eol); 275 276 DynamicSensitivityEventOrList( 277 Process *p, const sc_core::sc_event_or_list *eol); 278 279 bool notifyWork(Event *e) override; 280}; 281 282//XXX This sensitivity can't be reused. To reset it, it has to be deleted and 283//recreated. That works for dynamic sensitivities, but not for static. 284//Fortunately processes can't be statically sensitive to sc_event_and_lists. 285class DynamicSensitivityEventAndList : 286 public DynamicSensitivity, public SensitivityEvents 287{ 288 private: 289 friend void newDynamicSensitivityEventAndList( 290 Process *p, const sc_core::sc_event_and_list *eal); 291 292 DynamicSensitivityEventAndList( 293 Process *p, const sc_core::sc_event_and_list *eal); 294 295 bool notifyWork(Event *e) override; 296}; 297 298} // namespace sc_gem5 299 300#endif //__SYSTEMC_CORE_SENSITIVITY_HH__ 301