port.cc revision 13273:af60ddcf2a32
111375Sandreas.hansson@arm.com/* 211375Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 311375Sandreas.hansson@arm.com * 411375Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 511375Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 611375Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 711375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 811375Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 911375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1011375Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1111375Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1211375Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1311375Sandreas.hansson@arm.com * this software without specific prior written permission. 1411375Sandreas.hansson@arm.com * 1511375Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1611375Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1711375Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1811375Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1911375Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2011375Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2111375Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2211375Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2311375Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2411375Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2511375Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2611375Sandreas.hansson@arm.com * 2711375Sandreas.hansson@arm.com * Authors: Gabe Black 2811375Sandreas.hansson@arm.com */ 2911375Sandreas.hansson@arm.com 3011375Sandreas.hansson@arm.com#include "systemc/core/port.hh" 3111375Sandreas.hansson@arm.com 3211375Sandreas.hansson@arm.com#include "systemc/core/sensitivity.hh" 3311375Sandreas.hansson@arm.com#include "systemc/ext/channel/sc_signal_in_if.hh" 3411375Sandreas.hansson@arm.com 3511375Sandreas.hansson@arm.comnamespace sc_gem5 3611375Sandreas.hansson@arm.com{ 3711375Sandreas.hansson@arm.com 3811375Sandreas.hansson@arm.comvoid 3911375Sandreas.hansson@arm.comPort::finalizePort(StaticSensitivityPort *port) 4011375Sandreas.hansson@arm.com{ 4111375Sandreas.hansson@arm.com for (int i = 0; i < size(); i++) 4211375Sandreas.hansson@arm.com port->addEvent(&getInterface(i)->default_event()); 4311375Sandreas.hansson@arm.com} 4411375Sandreas.hansson@arm.com 4511375Sandreas.hansson@arm.comvoid 4611375Sandreas.hansson@arm.comPort::finalizeFinder(StaticSensitivityFinder *finder) 4711375Sandreas.hansson@arm.com{ 4811375Sandreas.hansson@arm.com for (int i = 0; i < size(); i++) 4911375Sandreas.hansson@arm.com finder->addEvent(&finder->find(getInterface(i))); 5011375Sandreas.hansson@arm.com} 5111375Sandreas.hansson@arm.com 5211375Sandreas.hansson@arm.comvoid 5311375Sandreas.hansson@arm.comPort::finalizeReset(ResetSensitivityPort *reset) 5411375Sandreas.hansson@arm.com{ 5511375Sandreas.hansson@arm.com assert(size() <= 1); 5611375Sandreas.hansson@arm.com if (size()) { 5711375Sandreas.hansson@arm.com auto iface = 5812334Sgabeblack@google.com dynamic_cast<sc_core::sc_signal_in_if<bool> *>(getInterface(0)); 5911375Sandreas.hansson@arm.com assert(iface); 6011375Sandreas.hansson@arm.com reset->setSignal(iface); 6111375Sandreas.hansson@arm.com } 6211375Sandreas.hansson@arm.com} 6311375Sandreas.hansson@arm.com 6411375Sandreas.hansson@arm.comvoid 6511375Sandreas.hansson@arm.comPort::sensitive(StaticSensitivityPort *port) 6611375Sandreas.hansson@arm.com{ 6711375Sandreas.hansson@arm.com if (finalized) 6811375Sandreas.hansson@arm.com finalizePort(port); 6911375Sandreas.hansson@arm.com else 7011375Sandreas.hansson@arm.com sensitivities.push_back(new Sensitivity(port)); 7111375Sandreas.hansson@arm.com} 7211375Sandreas.hansson@arm.com 7311375Sandreas.hansson@arm.comvoid 7411375Sandreas.hansson@arm.comPort::sensitive(StaticSensitivityFinder *finder) 7511375Sandreas.hansson@arm.com{ 7611375Sandreas.hansson@arm.com if (finalized) 7711375Sandreas.hansson@arm.com finalizeFinder(finder); 7811375Sandreas.hansson@arm.com else 7911375Sandreas.hansson@arm.com sensitivities.push_back(new Sensitivity(finder)); 8011375Sandreas.hansson@arm.com} 8111375Sandreas.hansson@arm.com 8211375Sandreas.hansson@arm.comvoid 8311375Sandreas.hansson@arm.comPort::sensitive(ResetSensitivityPort *reset) 8411375Sandreas.hansson@arm.com{ 8511375Sandreas.hansson@arm.com if (finalized) 8611375Sandreas.hansson@arm.com finalizeReset(reset); 8711375Sandreas.hansson@arm.com else 8811375Sandreas.hansson@arm.com sensitivities.push_back(new Sensitivity(reset)); 8911375Sandreas.hansson@arm.com} 9011375Sandreas.hansson@arm.com 9111375Sandreas.hansson@arm.comvoid 9211375Sandreas.hansson@arm.comPort::finalize() 9311375Sandreas.hansson@arm.com{ 9411375Sandreas.hansson@arm.com if (finalized) 9511375Sandreas.hansson@arm.com return; 9611375Sandreas.hansson@arm.com finalized = true; 9711375Sandreas.hansson@arm.com 9811375Sandreas.hansson@arm.com for (auto &b: bindings) { 9911375Sandreas.hansson@arm.com if (b->interface) { 10011375Sandreas.hansson@arm.com addInterface(b->interface); 10111375Sandreas.hansson@arm.com } else { 10211375Sandreas.hansson@arm.com b->port->_gem5Port->finalize(); 10311375Sandreas.hansson@arm.com addInterfaces(b->port); 10411375Sandreas.hansson@arm.com } 10511375Sandreas.hansson@arm.com delete b; 10611375Sandreas.hansson@arm.com } 10711375Sandreas.hansson@arm.com 10811375Sandreas.hansson@arm.com bindings.clear(); 10911375Sandreas.hansson@arm.com 11011375Sandreas.hansson@arm.com for (auto &s: sensitivities) { 11111375Sandreas.hansson@arm.com if (s->port) 11211375Sandreas.hansson@arm.com finalizePort(s->port); 11311375Sandreas.hansson@arm.com else if (s->finder) 11411375Sandreas.hansson@arm.com finalizeFinder(s->finder); 11511375Sandreas.hansson@arm.com else 11611375Sandreas.hansson@arm.com finalizeReset(s->reset); 11711375Sandreas.hansson@arm.com delete s; 11811375Sandreas.hansson@arm.com } 11911375Sandreas.hansson@arm.com 12011375Sandreas.hansson@arm.com sensitivities.clear(); 12111375Sandreas.hansson@arm.com} 12211375Sandreas.hansson@arm.com 12311375Sandreas.hansson@arm.comvoid 12411375Sandreas.hansson@arm.comPort::regPort() 12511375Sandreas.hansson@arm.com{ 12611375Sandreas.hansson@arm.com if (!regPortNeeded) 12711375Sandreas.hansson@arm.com return; 12811375Sandreas.hansson@arm.com 12911375Sandreas.hansson@arm.com for (int i = 0; i < size(); i++) 13011375Sandreas.hansson@arm.com getInterface(i)->register_port(*portBase, portBase->_ifTypeName()); 13111375Sandreas.hansson@arm.com} 13211375Sandreas.hansson@arm.com 13311375Sandreas.hansson@arm.comstd::list<Port *> allPorts; 13411375Sandreas.hansson@arm.com 13511484Snikos.nikoleris@arm.com} // namespace sc_gem5 13611375Sandreas.hansson@arm.com