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