sc_export.cc revision 13268
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com * Copyright 2018 Google, Inc.
311986Sandreas.sandberg@arm.com *
411986Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
511986Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
611986Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
711986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
811986Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
911986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1011986Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1111986Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1211986Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1311986Sandreas.sandberg@arm.com * this software without specific prior written permission.
1411986Sandreas.sandberg@arm.com *
1511986Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612391Sjason@lowepower.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1711986Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1811986Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1911986Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2011986Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2111986Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2211986Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2311986Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2411986Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2511986Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2611986Sandreas.sandberg@arm.com *
2711986Sandreas.sandberg@arm.com * Authors: Gabe Black
2811986Sandreas.sandberg@arm.com */
2911986Sandreas.sandberg@arm.com
3012391Sjason@lowepower.com#include "base/logging.hh"
3111986Sandreas.sandberg@arm.com#include "systemc/core/module.hh"
3211986Sandreas.sandberg@arm.com#include "systemc/core/scheduler.hh"
3311986Sandreas.sandberg@arm.com#include "systemc/ext/core/sc_export.hh"
3411986Sandreas.sandberg@arm.com#include "systemc/ext/core/sc_main.hh"
3511986Sandreas.sandberg@arm.com
3611986Sandreas.sandberg@arm.comnamespace sc_core
3711986Sandreas.sandberg@arm.com{
3811986Sandreas.sandberg@arm.com
3911986Sandreas.sandberg@arm.comnamespace
4011986Sandreas.sandberg@arm.com{
4111986Sandreas.sandberg@arm.com
4211986Sandreas.sandberg@arm.comvoid
4311986Sandreas.sandberg@arm.comreportError(const char *id, const char *add_msg,
4411986Sandreas.sandberg@arm.com        const char *name, const char *kind)
4511986Sandreas.sandberg@arm.com{
4611986Sandreas.sandberg@arm.com    std::string msg;
4711986Sandreas.sandberg@arm.com    if (add_msg)
4811986Sandreas.sandberg@arm.com        msg = csprintf("%s: export '%s' (%s)", add_msg, name, kind);
4911986Sandreas.sandberg@arm.com    else
5011986Sandreas.sandberg@arm.com        msg = csprintf("export '%s' (%s)", name, kind);
5111986Sandreas.sandberg@arm.com
5212391Sjason@lowepower.com    SC_REPORT_ERROR(id, msg.c_str());
5312391Sjason@lowepower.com}
5412391Sjason@lowepower.com
5512391Sjason@lowepower.com}
5612391Sjason@lowepower.com
5712391Sjason@lowepower.comsc_export_base::sc_export_base(const char *n) : sc_object(n)
5812391Sjason@lowepower.com{
5912391Sjason@lowepower.com    if (sc_is_running()) {
6012391Sjason@lowepower.com        reportError("(E121) insert sc_export failed", "simulation running",
6112391Sjason@lowepower.com                name(), kind());
6212391Sjason@lowepower.com    }
6312391Sjason@lowepower.com    if (::sc_gem5::scheduler.elaborationDone()) {
6412391Sjason@lowepower.com        reportError("(E121) insert sc_export failed", "elaboration done",
6512391Sjason@lowepower.com                name(), kind());
6612391Sjason@lowepower.com    }
6712391Sjason@lowepower.com
6812391Sjason@lowepower.com    auto m = sc_gem5::pickParentModule();
6911986Sandreas.sandberg@arm.com    if (!m) {
7012391Sjason@lowepower.com        reportError("(E122) sc_export specified outside of module",
7111986Sandreas.sandberg@arm.com                nullptr, name(), kind());
7211986Sandreas.sandberg@arm.com    } else {
7311986Sandreas.sandberg@arm.com        m->exports.push_back(this);
7411986Sandreas.sandberg@arm.com    }
7511986Sandreas.sandberg@arm.com}
7611986Sandreas.sandberg@arm.comsc_export_base::~sc_export_base() {}
7711986Sandreas.sandberg@arm.com
7811986Sandreas.sandberg@arm.com} // namespace sc_core
7911986Sandreas.sandberg@arm.com