2 * Copyright 2018 Google, Inc.
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
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution;
11 * neither the name of the copyright holders nor the names of its
12 * contributors may be used to endorse or promote products derived from
13 * this software without specific prior written permission.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "systemc/core/event.hh"
31 #include "systemc/ext/core/sc_event.hh"
32 #include "systemc/ext/core/sc_module.hh"
42 sc_event_and_list::sc_event_and_list() : autoDelete(false), busy(0) {}
44 sc_event_and_list::sc_event_and_list(const sc_event_and_list
&eal
) :
45 events(eal
.events
), autoDelete(false), busy(0)
48 sc_event_and_list::sc_event_and_list(const sc_event
&e
) : sc_event_and_list()
53 sc_event_and_list::sc_event_and_list(bool auto_delete
) :
54 autoDelete(auto_delete
), busy(0)
57 sc_event_and_list::~sc_event_and_list() {}
60 sc_event_and_list::operator = (const sc_event_and_list
&eal
)
67 sc_event_and_list::size() const
73 sc_event_and_list::swap(sc_event_and_list
&eal
)
75 events
.swap(eal
.events
);
79 sc_event_and_list::operator &= (const sc_event
&e
)
86 sc_event_and_list::operator &= (const sc_event_and_list
&eal
)
93 sc_event_and_list::operator & (const sc_event
&e
) const
95 sc_event_and_expr expr
;
102 sc_event_and_list::operator & (const sc_event_and_list
&eal
)
104 sc_event_and_expr expr
;
111 sc_event_and_list::insert(sc_event
const &e
)
117 sc_event_and_list::insert(sc_event_and_list
const &eal
)
119 events
.insert(eal
.events
.begin(), eal
.events
.end());
127 sc_event_or_list::sc_event_or_list() : autoDelete(false), busy(0) {}
129 sc_event_or_list::sc_event_or_list(const sc_event_or_list
&eol
) :
130 events(eol
.events
), autoDelete(false), busy(0)
133 sc_event_or_list::sc_event_or_list(const sc_event
&e
) : sc_event_or_list()
138 sc_event_or_list::sc_event_or_list(bool auto_delete
) :
139 autoDelete(auto_delete
), busy(0)
143 sc_event_or_list::operator = (const sc_event_or_list
&eol
)
149 sc_event_or_list::~sc_event_or_list() {}
152 sc_event_or_list::size() const
154 return events
.size();
158 sc_event_or_list::swap(sc_event_or_list
&eol
)
160 events
.swap(eol
.events
);
164 sc_event_or_list::operator |= (const sc_event
&e
)
171 sc_event_or_list::operator |= (const sc_event_or_list
&eol
)
178 sc_event_or_list::operator | (const sc_event
&e
) const
180 sc_event_or_expr expr
;
187 sc_event_or_list::operator | (const sc_event_or_list
&eol
) const
189 sc_event_or_expr expr
;
196 sc_event_or_list::insert(sc_event
const &e
)
202 sc_event_or_list::insert(sc_event_or_list
const &eol
)
204 events
.insert(eol
.events
.begin(), eol
.events
.end());
213 sc_event_and_expr::sc_event_and_expr(sc_event_and_expr
const &e
) :
219 sc_event_and_expr::operator const sc_event_and_list
&() const
221 sc_event_and_list
*temp
= list
;
227 sc_event_and_expr::insert(sc_event
const &e
) const
234 sc_event_and_expr::insert(sc_event_and_list
const &eal
) const
240 sc_event_and_expr::~sc_event_and_expr() { delete list
; }
242 sc_event_and_expr::sc_event_and_expr() : list(new sc_event_and_list(true)) {}
245 operator & (sc_event_and_expr expr
, sc_event
const &e
)
252 operator & (sc_event_and_expr expr
, sc_event_and_list
const &eal
)
264 sc_event_or_expr::sc_event_or_expr(sc_event_or_expr
const &e
) :
270 sc_event_or_expr::operator const sc_event_or_list
&() const
272 sc_event_or_list
*temp
= list
;
278 sc_event_or_expr::insert(sc_event
const &e
) const
285 sc_event_or_expr::insert(sc_event_or_list
const &eol
) const
291 sc_event_or_expr::~sc_event_or_expr() { delete list
; }
293 sc_event_or_expr::sc_event_or_expr() : list(new sc_event_or_list(true)) {}
296 operator | (sc_event_or_expr expr
, sc_event
const &e
)
303 operator | (sc_event_or_expr expr
, sc_event_or_list
const &eol
)
314 sc_event::sc_event() :
315 _gem5_event(new ::sc_gem5::Event(
316 this, sc_core::sc_gen_unique_name("event")))
319 sc_event::sc_event(const char *_name
) :
320 _gem5_event(new ::sc_gem5::Event(this, _name
))
323 sc_event::~sc_event() { delete _gem5_event
; }
325 const char *sc_event::name() const { return _gem5_event
->name().c_str(); }
327 sc_event::basename() const
329 return _gem5_event
->basename().c_str();
331 bool sc_event::in_hierarchy() const { return _gem5_event
->inHierarchy(); }
334 sc_event::get_parent_object() const
336 return _gem5_event
->getParentObject();
339 void sc_event::notify() { _gem5_event
->notify(); }
340 void sc_event::notify(const sc_time
&t
) { _gem5_event
->notify(t
); }
341 void sc_event::notify(double d
, sc_time_unit u
) { _gem5_event
->notify(d
, u
); }
342 void sc_event::cancel() { _gem5_event
->cancel(); }
343 bool sc_event::triggered() const { return _gem5_event
->triggered(); }
345 sc_event::notify_delayed()
347 _gem5_event
->notifyDelayed(SC_ZERO_TIME
);
350 sc_event::notify_delayed(const sc_time
&t
)
352 _gem5_event
->notifyDelayed(t
);
356 sc_event::operator & (const sc_event
&e
) const
358 sc_event_and_expr expr
;
365 sc_event::operator & (const sc_event_and_list
&eal
) const
367 sc_event_and_expr expr
;
374 sc_event::operator | (const sc_event
&e
) const
376 sc_event_or_expr expr
;
383 sc_event::operator | (const sc_event_or_list
&eol
) const
385 sc_event_or_expr expr
;
391 sc_event::sc_event(bool) :
392 _gem5_event(new ::sc_gem5::Event(
393 this, sc_core::sc_gen_unique_name(
394 "$$$internal kernel event$$$"), true))
397 sc_event::sc_event(bool, const char *_name
) :
398 _gem5_event(new ::sc_gem5::Event(
400 (std::string("$$$internal kernel event$$$") + _name
).c_str(),
404 const std::vector
<sc_event
*> &
405 sc_get_top_level_events()
407 return ::sc_gem5::topLevelEvents
;
411 sc_find_event(const char *name
)
413 std::string
str(name
);
414 ::sc_gem5::EventsIt it
= ::sc_gem5::findEvent(str
);
415 return it
== ::sc_gem5::allEvents
.end() ? nullptr : *it
;
418 } // namespace sc_core
423 InternalScEvent::InternalScEvent() : sc_event(true) {}
424 InternalScEvent::InternalScEvent(const char *_name
) : sc_event(true, _name
) {}
426 } // namespace sc_gem5