sc_prim.cc revision 13324
112837Sgabeblack@google.com/*
212837Sgabeblack@google.com * Copyright 2018 Google, Inc.
312837Sgabeblack@google.com *
412837Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
512837Sgabeblack@google.com * modification, are permitted provided that the following conditions are
612837Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
712837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
812837Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
912837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1012837Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1112837Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1212837Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1312837Sgabeblack@google.com * this software without specific prior written permission.
1412837Sgabeblack@google.com *
1512837Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612837Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712837Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812837Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912837Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012837Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112837Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212837Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312837Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412837Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512837Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612837Sgabeblack@google.com *
2712837Sgabeblack@google.com * Authors: Gabe Black
2812837Sgabeblack@google.com */
2912837Sgabeblack@google.com
3012837Sgabeblack@google.com#include "base/logging.hh"
3112954Sgabeblack@google.com#include "systemc/core/channel.hh"
3213140Sgabeblack@google.com#include "systemc/core/scheduler.hh"
3313324Sgabeblack@google.com#include "systemc/ext/channel/messages.hh"
3413238Sgabeblack@google.com#include "systemc/ext/core/sc_main.hh"
3512837Sgabeblack@google.com#include "systemc/ext/core/sc_prim.hh"
3612837Sgabeblack@google.com
3713140Sgabeblack@google.comnamespace sc_gem5
3813140Sgabeblack@google.com{
3913140Sgabeblack@google.com
4013140Sgabeblack@google.comuint64_t getChangeStamp() { return scheduler.changeStamp(); }
4113140Sgabeblack@google.com
4213140Sgabeblack@google.com} // namespace sc_gem5
4313140Sgabeblack@google.com
4412837Sgabeblack@google.comnamespace sc_core
4512837Sgabeblack@google.com{
4612837Sgabeblack@google.com
4713238Sgabeblack@google.comsc_prim_channel::sc_prim_channel() : _gem5_channel(nullptr)
4813238Sgabeblack@google.com{
4913238Sgabeblack@google.com    if (sc_is_running()) {
5013324Sgabeblack@google.com        SC_REPORT_ERROR(SC_ID_INSERT_PRIM_CHANNEL_, "simulation running");
5113283Sgabeblack@google.com    }
5213283Sgabeblack@google.com    if (::sc_gem5::scheduler.elaborationDone()) {
5313324Sgabeblack@google.com        SC_REPORT_ERROR(SC_ID_INSERT_PRIM_CHANNEL_, "elaboration done");
5413238Sgabeblack@google.com    }
5513283Sgabeblack@google.com    _gem5_channel = new sc_gem5::Channel(this);
5613238Sgabeblack@google.com}
5712837Sgabeblack@google.com
5812954Sgabeblack@google.comsc_prim_channel::sc_prim_channel(const char *_name) :
5913238Sgabeblack@google.com    sc_object(_name), _gem5_channel(nullptr)
6013238Sgabeblack@google.com{
6113238Sgabeblack@google.com    if (sc_is_running()) {
6213324Sgabeblack@google.com        SC_REPORT_ERROR(SC_ID_INSERT_PRIM_CHANNEL_, "simulation running");
6313283Sgabeblack@google.com    }
6413283Sgabeblack@google.com    if (::sc_gem5::scheduler.elaborationDone()) {
6513324Sgabeblack@google.com        SC_REPORT_ERROR(SC_ID_INSERT_PRIM_CHANNEL_, "elaboration done");
6613238Sgabeblack@google.com    }
6713283Sgabeblack@google.com    _gem5_channel = new sc_gem5::Channel(this);
6813238Sgabeblack@google.com}
6912837Sgabeblack@google.com
7012954Sgabeblack@google.comsc_prim_channel::~sc_prim_channel() { delete _gem5_channel; }
7112837Sgabeblack@google.com
7212837Sgabeblack@google.comvoid
7312837Sgabeblack@google.comsc_prim_channel::request_update()
7412837Sgabeblack@google.com{
7512954Sgabeblack@google.com    _gem5_channel->requestUpdate();
7612837Sgabeblack@google.com}
7712837Sgabeblack@google.com
7812837Sgabeblack@google.comvoid
7912837Sgabeblack@google.comsc_prim_channel::async_request_update()
8012837Sgabeblack@google.com{
8112954Sgabeblack@google.com    _gem5_channel->asyncRequestUpdate();
8212837Sgabeblack@google.com}
8312837Sgabeblack@google.com
8412837Sgabeblack@google.comvoid
8512837Sgabeblack@google.comsc_prim_channel::next_trigger()
8612837Sgabeblack@google.com{
8712954Sgabeblack@google.com    ::sc_core::next_trigger();
8812837Sgabeblack@google.com}
8912837Sgabeblack@google.com
9012837Sgabeblack@google.comvoid
9112954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_event &e)
9212837Sgabeblack@google.com{
9312954Sgabeblack@google.com    ::sc_core::next_trigger(e);
9412837Sgabeblack@google.com}
9512837Sgabeblack@google.com
9612837Sgabeblack@google.comvoid
9712954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_event_or_list &eol)
9812837Sgabeblack@google.com{
9912954Sgabeblack@google.com    ::sc_core::next_trigger(eol);
10012837Sgabeblack@google.com}
10112837Sgabeblack@google.com
10212837Sgabeblack@google.comvoid
10312954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_event_and_list &eal)
10412837Sgabeblack@google.com{
10512954Sgabeblack@google.com    ::sc_core::next_trigger(eal);
10612837Sgabeblack@google.com}
10712837Sgabeblack@google.com
10812837Sgabeblack@google.comvoid
10912954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_time &t)
11012837Sgabeblack@google.com{
11112954Sgabeblack@google.com    ::sc_core::next_trigger(t);
11212837Sgabeblack@google.com}
11312837Sgabeblack@google.com
11412837Sgabeblack@google.comvoid
11512954Sgabeblack@google.comsc_prim_channel::next_trigger(double d, sc_time_unit u)
11612837Sgabeblack@google.com{
11712954Sgabeblack@google.com    ::sc_core::next_trigger(d, u);
11812837Sgabeblack@google.com}
11912837Sgabeblack@google.com
12012837Sgabeblack@google.comvoid
12112954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_time &t, const sc_event &e)
12212837Sgabeblack@google.com{
12312954Sgabeblack@google.com    ::sc_core::next_trigger(t, e);
12412837Sgabeblack@google.com}
12512837Sgabeblack@google.com
12612837Sgabeblack@google.comvoid
12712954Sgabeblack@google.comsc_prim_channel::next_trigger(double d, sc_time_unit u, const sc_event &e)
12812837Sgabeblack@google.com{
12912954Sgabeblack@google.com    ::sc_core::next_trigger(d, u, e);
13012837Sgabeblack@google.com}
13112837Sgabeblack@google.com
13212837Sgabeblack@google.comvoid
13312954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_time &t, const sc_event_or_list &eol)
13412837Sgabeblack@google.com{
13512954Sgabeblack@google.com    ::sc_core::next_trigger(t, eol);
13612837Sgabeblack@google.com}
13712837Sgabeblack@google.com
13812837Sgabeblack@google.comvoid
13912954Sgabeblack@google.comsc_prim_channel::next_trigger(
14012954Sgabeblack@google.com        double d, sc_time_unit u, const sc_event_or_list &eol)
14112837Sgabeblack@google.com{
14212954Sgabeblack@google.com    ::sc_core::next_trigger(d, u, eol);
14312837Sgabeblack@google.com}
14412837Sgabeblack@google.com
14512837Sgabeblack@google.comvoid
14612954Sgabeblack@google.comsc_prim_channel::next_trigger(const sc_time &t, const sc_event_and_list &eal)
14712837Sgabeblack@google.com{
14812954Sgabeblack@google.com    ::sc_core::next_trigger(t, eal);
14912837Sgabeblack@google.com}
15012837Sgabeblack@google.com
15112837Sgabeblack@google.comvoid
15212954Sgabeblack@google.comsc_prim_channel::next_trigger(
15312954Sgabeblack@google.com        double d, sc_time_unit u, const sc_event_and_list &eal)
15412837Sgabeblack@google.com{
15512954Sgabeblack@google.com    ::sc_core::next_trigger(d, u, eal);
15612837Sgabeblack@google.com}
15712837Sgabeblack@google.com
15812929Sgabeblack@google.combool
15912929Sgabeblack@google.comsc_prim_channel::timed_out()
16012929Sgabeblack@google.com{
16113189Sgabeblack@google.com    return ::sc_core::timed_out();
16212929Sgabeblack@google.com}
16312929Sgabeblack@google.com
16412837Sgabeblack@google.comvoid
16512837Sgabeblack@google.comsc_prim_channel::wait()
16612837Sgabeblack@google.com{
16712954Sgabeblack@google.com    ::sc_core::wait();
16812837Sgabeblack@google.com}
16912837Sgabeblack@google.com
17012837Sgabeblack@google.comvoid
17112954Sgabeblack@google.comsc_prim_channel::wait(int i)
17212837Sgabeblack@google.com{
17312954Sgabeblack@google.com    ::sc_core::wait(i);
17412837Sgabeblack@google.com}
17512837Sgabeblack@google.com
17612837Sgabeblack@google.comvoid
17712954Sgabeblack@google.comsc_prim_channel::wait(const sc_event &e)
17812837Sgabeblack@google.com{
17912954Sgabeblack@google.com    ::sc_core::wait(e);
18012837Sgabeblack@google.com}
18112837Sgabeblack@google.com
18212837Sgabeblack@google.comvoid
18312954Sgabeblack@google.comsc_prim_channel::wait(const sc_event_or_list &eol)
18412837Sgabeblack@google.com{
18512954Sgabeblack@google.com    ::sc_core::wait(eol);
18612837Sgabeblack@google.com}
18712837Sgabeblack@google.com
18812837Sgabeblack@google.comvoid
18912954Sgabeblack@google.comsc_prim_channel::wait(const sc_event_and_list &eal)
19012837Sgabeblack@google.com{
19112954Sgabeblack@google.com    ::sc_core::wait(eal);
19212837Sgabeblack@google.com}
19312837Sgabeblack@google.com
19412837Sgabeblack@google.comvoid
19512954Sgabeblack@google.comsc_prim_channel::wait(const sc_time &t)
19612837Sgabeblack@google.com{
19712954Sgabeblack@google.com    ::sc_core::wait(t);
19812837Sgabeblack@google.com}
19912837Sgabeblack@google.com
20012837Sgabeblack@google.comvoid
20112954Sgabeblack@google.comsc_prim_channel::wait(double d, sc_time_unit u)
20212837Sgabeblack@google.com{
20312954Sgabeblack@google.com    ::sc_core::wait(d, u);
20412837Sgabeblack@google.com}
20512837Sgabeblack@google.com
20612837Sgabeblack@google.comvoid
20712954Sgabeblack@google.comsc_prim_channel::wait(const sc_time &t, const sc_event &e)
20812837Sgabeblack@google.com{
20912954Sgabeblack@google.com    ::sc_core::wait(t, e);
21012837Sgabeblack@google.com}
21112837Sgabeblack@google.com
21212837Sgabeblack@google.comvoid
21312954Sgabeblack@google.comsc_prim_channel::wait(double d, sc_time_unit u, const sc_event &e)
21412837Sgabeblack@google.com{
21512954Sgabeblack@google.com    ::sc_core::wait(d, u, e);
21612837Sgabeblack@google.com}
21712837Sgabeblack@google.com
21812837Sgabeblack@google.comvoid
21912954Sgabeblack@google.comsc_prim_channel::wait(const sc_time &t, const sc_event_or_list &eol)
22012837Sgabeblack@google.com{
22112954Sgabeblack@google.com    ::sc_core::wait(t, eol);
22212837Sgabeblack@google.com}
22312837Sgabeblack@google.com
22412837Sgabeblack@google.comvoid
22512954Sgabeblack@google.comsc_prim_channel::wait(double d, sc_time_unit u, const sc_event_or_list &eol)
22612837Sgabeblack@google.com{
22712954Sgabeblack@google.com    ::sc_core::wait(d, u, eol);
22812837Sgabeblack@google.com}
22912837Sgabeblack@google.com
23012837Sgabeblack@google.comvoid
23112954Sgabeblack@google.comsc_prim_channel::wait(const sc_time &t, const sc_event_and_list &eal)
23212837Sgabeblack@google.com{
23312954Sgabeblack@google.com    ::sc_core::wait(t, eal);
23412837Sgabeblack@google.com}
23512837Sgabeblack@google.com
23612837Sgabeblack@google.comvoid
23712954Sgabeblack@google.comsc_prim_channel::wait(double d, sc_time_unit u, const sc_event_and_list &eal)
23812837Sgabeblack@google.com{
23912954Sgabeblack@google.com    ::sc_core::wait(d, u, eal);
24012837Sgabeblack@google.com}
24112837Sgabeblack@google.com
24212837Sgabeblack@google.com} // namespace sc_core
243