sc_port.cc revision 13238
110515SN/A/*
210515SN/A * Copyright 2018 Google, Inc.
311353Sandreas.hansson@arm.com *
411353Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
511353Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
610515SN/A * met: redistributions of source code must retain the above copyright
711353Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
811353Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
911353Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1011353Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1111353Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
1211353Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
1311353Sandreas.hansson@arm.com * this software without specific prior written permission.
1410515SN/A *
1510515SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1611353Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1711353Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1811353Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1911353Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2011353Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2111353Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2211353Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2311353Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2411353Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2511353Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2611353Sandreas.hansson@arm.com *
2711353Sandreas.hansson@arm.com * Authors: Gabe Black
2811353Sandreas.hansson@arm.com */
2911353Sandreas.hansson@arm.com
3011353Sandreas.hansson@arm.com#include "base/logging.hh"
3111353Sandreas.hansson@arm.com#include "systemc/core/module.hh"
3210827Sandreas.hansson@arm.com#include "systemc/core/port.hh"
3310585SN/A#include "systemc/core/scheduler.hh"
3411353Sandreas.hansson@arm.com#include "systemc/ext/core/sc_main.hh"
3511353Sandreas.hansson@arm.com#include "systemc/ext/core/sc_port.hh"
3611353Sandreas.hansson@arm.com
3711353Sandreas.hansson@arm.comnamespace sc_core
3811353Sandreas.hansson@arm.com{
3911353Sandreas.hansson@arm.com
4011353Sandreas.hansson@arm.comnamespace
4111353Sandreas.hansson@arm.com{
4211353Sandreas.hansson@arm.com
4311353Sandreas.hansson@arm.comvoid
4411353Sandreas.hansson@arm.comreportError(const char *id, const char *add_msg,
4511353Sandreas.hansson@arm.com        const char *name, const char *kind)
4611353Sandreas.hansson@arm.com{
4711353Sandreas.hansson@arm.com    std::string msg;
4810827Sandreas.hansson@arm.com    if (add_msg)
4910585SN/A        msg = csprintf("%s: port '%s' (%s)", add_msg, name, kind);
5011353Sandreas.hansson@arm.com    else
5111353Sandreas.hansson@arm.com        msg = csprintf("port '%s' (%s)", name, kind);
5211353Sandreas.hansson@arm.com
5311353Sandreas.hansson@arm.com    SC_REPORT_ERROR(id, msg.c_str());
5411353Sandreas.hansson@arm.com}
5511353Sandreas.hansson@arm.com
5611353Sandreas.hansson@arm.com}
5711353Sandreas.hansson@arm.com
5811353Sandreas.hansson@arm.comsc_port_base::sc_port_base(const char *n, int max_size, sc_port_policy p) :
5911353Sandreas.hansson@arm.com    sc_object(n), _gem5Port(new ::sc_gem5::Port(this, max_size))
6011353Sandreas.hansson@arm.com{
6111353Sandreas.hansson@arm.com    if (sc_is_running()) {
6211353Sandreas.hansson@arm.com        reportError("(E110) insert port failed", "simulation running",
6311353Sandreas.hansson@arm.com                name(), kind());
6411353Sandreas.hansson@arm.com    }
6511353Sandreas.hansson@arm.com    if (::sc_gem5::scheduler.elaborationDone()) {
6611353Sandreas.hansson@arm.com        reportError("(E110) insert port failed", "elaboration done",
6711353Sandreas.hansson@arm.com                name(), kind());
6810585SN/A    }
6911353Sandreas.hansson@arm.com
7011353Sandreas.hansson@arm.com    ::sc_gem5::Module *m = ::sc_gem5::currentModule();
7111353Sandreas.hansson@arm.com    if (!m) {
7211353Sandreas.hansson@arm.com        reportError("(E100) port specified outside of module",
7311353Sandreas.hansson@arm.com                nullptr, name(), kind());
7411353Sandreas.hansson@arm.com    } else {
7511353Sandreas.hansson@arm.com        m->ports.push_back(this);
7611353Sandreas.hansson@arm.com    }
7711353Sandreas.hansson@arm.com}
7811353Sandreas.hansson@arm.com
7911353Sandreas.hansson@arm.comsc_port_base::~sc_port_base()
8011353Sandreas.hansson@arm.com{
8111353Sandreas.hansson@arm.com    delete _gem5Port;
8211353Sandreas.hansson@arm.com}
8311353Sandreas.hansson@arm.com
8411353Sandreas.hansson@arm.comvoid
8511353Sandreas.hansson@arm.comsc_port_base::warn_unimpl(const char *func) const
8611353Sandreas.hansson@arm.com{
8711353Sandreas.hansson@arm.com    warn("%s not implemented.\n", func);
8811353Sandreas.hansson@arm.com}
8911353Sandreas.hansson@arm.com
9011353Sandreas.hansson@arm.comint sc_port_base::maxSize() const { return _gem5Port->maxSize(); }
9111353Sandreas.hansson@arm.comint sc_port_base::size() const { return _gem5Port->size(); }
9211353Sandreas.hansson@arm.com
9311353Sandreas.hansson@arm.comvoid sc_port_base::bind(sc_interface &i) { _gem5Port->bind(&i); }
9411336Sandreas.hansson@arm.comvoid sc_port_base::bind(sc_port_base &p) { _gem5Port->bind(&p); }
9511353Sandreas.hansson@arm.com
9611353Sandreas.hansson@arm.com} // namespace sc_core
9711353Sandreas.hansson@arm.com