sc_event.cc revision 12955:9c8bf6a5f2e3
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
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.
14 *
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.
26 *
27 * Authors: Gabe Black
28 */
29
30#include "base/logging.hh"
31#include "systemc/core/event.hh"
32#include "systemc/ext/core/sc_event.hh"
33
34namespace sc_core
35{
36
37
38/*
39 * sc_event_finder
40 */
41
42void
43sc_event_finder::warn_unimpl(const char *func) const
44{
45    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
46}
47
48
49/*
50 * sc_event_and_list
51 */
52
53sc_event_and_list::sc_event_and_list() : autoDelete(false), busy(0) {}
54
55sc_event_and_list::sc_event_and_list(const sc_event_and_list &eal) :
56    events(eal.events), autoDelete(false), busy(0)
57{}
58
59sc_event_and_list::sc_event_and_list(const sc_event &e) : sc_event_and_list()
60{
61    insert(e);
62}
63
64sc_event_and_list::sc_event_and_list(bool auto_delete) :
65    autoDelete(auto_delete), busy(0)
66{}
67
68sc_event_and_list::~sc_event_and_list() {}
69
70sc_event_and_list &
71sc_event_and_list::operator = (const sc_event_and_list &eal)
72{
73    events = eal.events;
74    return *this;
75}
76
77int
78sc_event_and_list::size() const
79{
80    return events.size();
81}
82
83void
84sc_event_and_list::swap(sc_event_and_list &eal)
85{
86    events.swap(eal.events);
87}
88
89sc_event_and_list &
90sc_event_and_list::operator &= (const sc_event &e)
91{
92    insert(e);
93    return *this;
94}
95
96sc_event_and_list &
97sc_event_and_list::operator &= (const sc_event_and_list &eal)
98{
99    insert(eal);
100    return *this;
101}
102
103sc_event_and_expr
104sc_event_and_list::operator & (const sc_event &e) const
105{
106    sc_event_and_expr expr;
107    expr.insert(*this);
108    expr.insert(e);
109    return expr;
110}
111
112sc_event_and_expr
113sc_event_and_list::operator & (const sc_event_and_list &eal)
114{
115    sc_event_and_expr expr;
116    expr.insert(*this);
117    expr.insert(eal);
118    return expr;
119}
120
121void
122sc_event_and_list::insert(sc_event const &e)
123{
124    events.insert(&e);
125}
126
127void
128sc_event_and_list::insert(sc_event_and_list const &eal)
129{
130    events.insert(eal.events.begin(), eal.events.end());
131}
132
133
134/*
135 * sc_event_or_list
136 */
137
138sc_event_or_list::sc_event_or_list() : autoDelete(false), busy(0) {}
139
140sc_event_or_list::sc_event_or_list(const sc_event_or_list &eol) :
141    events(eol.events), autoDelete(false), busy(0)
142{}
143
144sc_event_or_list::sc_event_or_list(const sc_event &e) : sc_event_or_list()
145{
146    insert(e);
147}
148
149sc_event_or_list::sc_event_or_list(bool auto_delete) :
150    autoDelete(auto_delete), busy(0)
151{}
152
153sc_event_or_list &
154sc_event_or_list::operator = (const sc_event_or_list &eol)
155{
156    events = eol.events;
157    return *this;
158}
159
160sc_event_or_list::~sc_event_or_list() {}
161
162int
163sc_event_or_list::size() const
164{
165    return events.size();
166}
167
168void
169sc_event_or_list::swap(sc_event_or_list &eol)
170{
171    events.swap(eol.events);
172}
173
174sc_event_or_list &
175sc_event_or_list::operator |= (const sc_event &e)
176{
177    insert(e);
178    return *this;
179}
180
181sc_event_or_list &
182sc_event_or_list::operator |= (const sc_event_or_list &eol)
183{
184    insert(eol);
185    return *this;
186}
187
188sc_event_or_expr
189sc_event_or_list::operator | (const sc_event &e) const
190{
191    sc_event_or_expr expr;
192    expr.insert(*this);
193    expr.insert(e);
194    return expr;
195}
196
197sc_event_or_expr
198sc_event_or_list::operator | (const sc_event_or_list &eol) const
199{
200    sc_event_or_expr expr;
201    expr.insert(*this);
202    expr.insert(eol);
203    return expr;
204}
205
206void
207sc_event_or_list::insert(sc_event const &e)
208{
209    events.insert(&e);
210}
211
212void
213sc_event_or_list::insert(sc_event_or_list const &eol)
214{
215    events.insert(eol.events.begin(), eol.events.end());
216}
217
218
219/*
220 * sc_event_and_expr
221 */
222
223// Move semantics
224sc_event_and_expr::sc_event_and_expr(sc_event_and_expr const &e) :
225    list(e.list)
226{
227    e.list = nullptr;
228}
229
230sc_event_and_expr::operator const sc_event_and_list &() const
231{
232    sc_event_and_list *temp = list;
233    list = nullptr;
234    return *temp;
235}
236
237void
238sc_event_and_expr::insert(sc_event const &e) const
239{
240    assert(list);
241    list->insert(e);
242}
243
244void
245sc_event_and_expr::insert(sc_event_and_list const &eal) const
246{
247    assert(list);
248    list->insert(eal);
249}
250
251sc_event_and_expr::~sc_event_and_expr() { delete list; }
252
253sc_event_and_expr::sc_event_and_expr() : list(new sc_event_and_list(true)) {}
254
255sc_event_and_expr
256operator & (sc_event_and_expr expr, sc_event const &e)
257{
258    expr.insert(e);
259    return expr;
260}
261
262sc_event_and_expr
263operator & (sc_event_and_expr expr, sc_event_and_list const &eal)
264{
265    expr.insert(eal);
266    return expr;
267}
268
269
270/*
271 * sc_event_or_expr
272 */
273
274// Move semantics
275sc_event_or_expr::sc_event_or_expr(sc_event_or_expr const &e) :
276    list(e.list)
277{
278    e.list = nullptr;
279}
280
281sc_event_or_expr::operator const sc_event_or_list &() const
282{
283    sc_event_or_list *temp = list;
284    list = NULL;
285    return *temp;
286}
287
288void
289sc_event_or_expr::insert(sc_event const &e) const
290{
291    assert(list);
292    list->insert(e);
293}
294
295void
296sc_event_or_expr::insert(sc_event_or_list const &eol) const
297{
298    assert(list);
299    list->insert(eol);
300}
301
302sc_event_or_expr::~sc_event_or_expr() { delete list; }
303
304sc_event_or_expr::sc_event_or_expr() : list(new sc_event_or_list(true)) {}
305
306sc_event_or_expr
307operator | (sc_event_or_expr expr, sc_event const &e)
308{
309    expr.insert(e);
310    return expr;
311}
312
313sc_event_or_expr
314operator | (sc_event_or_expr expr, sc_event_or_list const &eol)
315{
316    expr.insert(eol);
317    return expr;
318}
319
320
321/*
322 * sc_event
323 */
324
325sc_event::sc_event() : _gem5_event(new ::sc_gem5::Event(this)) {}
326
327sc_event::sc_event(const char *_name) :
328    _gem5_event(new ::sc_gem5::Event(this, _name))
329{}
330
331sc_event::~sc_event() { delete _gem5_event; }
332
333const char *sc_event::name() const { return _gem5_event->name().c_str(); }
334const char *
335sc_event::basename() const
336{
337    return _gem5_event->basename().c_str();
338}
339bool sc_event::in_hierarchy() const { return _gem5_event->inHierarchy(); }
340
341sc_object *
342sc_event::get_parent_object() const
343{
344    return _gem5_event->getParentObject();
345}
346
347void sc_event::notify() { _gem5_event->notify(); }
348void sc_event::notify(const sc_time &t) { _gem5_event->notify(t); }
349void sc_event::notify(double d, sc_time_unit u) { _gem5_event->notify(d, u); }
350void sc_event::cancel() { _gem5_event->cancel(); }
351bool sc_event::triggered() const { return _gem5_event->triggered(); }
352void sc_event::notify_delayed() { _gem5_event->notify(SC_ZERO_TIME); }
353void sc_event::notify_delayed(const sc_time &t) { _gem5_event->notify(t); }
354
355sc_event_and_expr
356sc_event::operator & (const sc_event &e) const
357{
358    sc_event_and_expr expr;
359    expr.insert(*this);
360    expr.insert(e);
361    return expr;
362}
363
364sc_event_and_expr
365sc_event::operator & (const sc_event_and_list &eal) const
366{
367    sc_event_and_expr expr;
368    expr.insert(*this);
369    expr.insert(eal);
370    return expr;
371}
372
373sc_event_or_expr
374sc_event::operator | (const sc_event &e) const
375{
376    sc_event_or_expr expr;
377    expr.insert(*this);
378    expr.insert(e);
379    return expr;
380}
381
382sc_event_or_expr
383sc_event::operator | (const sc_event_or_list &eol) const
384{
385    sc_event_or_expr expr;
386    expr.insert(*this);
387    expr.insert(eol);
388    return expr;
389}
390
391const std::vector<sc_event *> &
392sc_get_top_level_events()
393{
394    return ::sc_gem5::topLevelEvents;
395}
396
397sc_event *
398sc_find_event(const char *name)
399{
400    std::string str(name);
401    ::sc_gem5::EventsIt it = ::sc_gem5::findEvent(str);
402    return it == ::sc_gem5::allEvents.end() ? nullptr : *it;
403}
404
405} // namespace sc_core
406