port.hh revision 13239
16691Stjones1@inf.ed.ac.uk/* 26691Stjones1@inf.ed.ac.uk * Copyright 2018 Google, Inc. 36691Stjones1@inf.ed.ac.uk * 46691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without 56691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are 66691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright 76691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer; 86691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright 96691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the 106691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution; 116691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its 126691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from 136691Stjones1@inf.ed.ac.uk * this software without specific prior written permission. 146691Stjones1@inf.ed.ac.uk * 156691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 166691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 176691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 186691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 196691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 206691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 216691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 226691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 236691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 246691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 256691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 266691Stjones1@inf.ed.ac.uk * 276691Stjones1@inf.ed.ac.uk * Authors: Gabe Black 286691Stjones1@inf.ed.ac.uk */ 296691Stjones1@inf.ed.ac.uk 306691Stjones1@inf.ed.ac.uk#ifndef __SYSTEMC_CORE_PORT_HH__ 316691Stjones1@inf.ed.ac.uk#define __SYSTEMC_CORE_PORT_HH__ 326691Stjones1@inf.ed.ac.uk 336691Stjones1@inf.ed.ac.uk#include <list> 346691Stjones1@inf.ed.ac.uk#include <vector> 356691Stjones1@inf.ed.ac.uk 366691Stjones1@inf.ed.ac.uk#include "base/cprintf.hh" 376691Stjones1@inf.ed.ac.uk#include "systemc/ext/core/sc_interface.hh" 386691Stjones1@inf.ed.ac.uk#include "systemc/ext/core/sc_port.hh" 396691Stjones1@inf.ed.ac.uk 406691Stjones1@inf.ed.ac.uknamespace sc_gem5 416691Stjones1@inf.ed.ac.uk{ 426691Stjones1@inf.ed.ac.uk 436691Stjones1@inf.ed.ac.ukclass StaticSensitivityPort; 446691Stjones1@inf.ed.ac.ukclass StaticSensitivityFinder; 456691Stjones1@inf.ed.ac.uk 466691Stjones1@inf.ed.ac.ukclass Port; 476691Stjones1@inf.ed.ac.uk 486691Stjones1@inf.ed.ac.ukextern std::list<Port *> allPorts; 496691Stjones1@inf.ed.ac.uk 506691Stjones1@inf.ed.ac.ukclass Port 516691Stjones1@inf.ed.ac.uk{ 526691Stjones1@inf.ed.ac.uk private: 536691Stjones1@inf.ed.ac.uk ::sc_core::sc_port_base *portBase; 546691Stjones1@inf.ed.ac.uk 556691Stjones1@inf.ed.ac.uk bool finalized; 566691Stjones1@inf.ed.ac.uk int _maxSize; 576691Stjones1@inf.ed.ac.uk int _size; 586691Stjones1@inf.ed.ac.uk 596691Stjones1@inf.ed.ac.uk void finalizePort(StaticSensitivityPort *port); 606691Stjones1@inf.ed.ac.uk void finalizeFinder(StaticSensitivityFinder *finder); 616691Stjones1@inf.ed.ac.uk 626691Stjones1@inf.ed.ac.uk void 636691Stjones1@inf.ed.ac.uk addInterface(::sc_core::sc_interface *iface) 646691Stjones1@inf.ed.ac.uk { 656691Stjones1@inf.ed.ac.uk for (int i = 0; i < _size; i++) { 666691Stjones1@inf.ed.ac.uk if (getInterface(i) == iface) { 676691Stjones1@inf.ed.ac.uk std::string msg = 686691Stjones1@inf.ed.ac.uk csprintf("interface already bound to port: port '%s' (%s)", 696691Stjones1@inf.ed.ac.uk portBase->name(), portBase->kind()); 706691Stjones1@inf.ed.ac.uk SC_REPORT_ERROR("(E107) bind interface to port failed", 716691Stjones1@inf.ed.ac.uk msg.c_str()); 726691Stjones1@inf.ed.ac.uk } 736691Stjones1@inf.ed.ac.uk } 746691Stjones1@inf.ed.ac.uk _size++; 756691Stjones1@inf.ed.ac.uk portBase->_gem5AddInterface(iface); 766691Stjones1@inf.ed.ac.uk } 776691Stjones1@inf.ed.ac.uk 786691Stjones1@inf.ed.ac.uk void 796691Stjones1@inf.ed.ac.uk addInterfaces(::sc_core::sc_port_base *pb) 806691Stjones1@inf.ed.ac.uk { 816691Stjones1@inf.ed.ac.uk for (int i = 0; i < pb->size(); i++) 826691Stjones1@inf.ed.ac.uk addInterface(pb->_gem5Interface(i)); 836691Stjones1@inf.ed.ac.uk } 846691Stjones1@inf.ed.ac.uk 856691Stjones1@inf.ed.ac.uk ::sc_core::sc_interface * 866691Stjones1@inf.ed.ac.uk getInterface(int i) 876691Stjones1@inf.ed.ac.uk { 886691Stjones1@inf.ed.ac.uk return portBase->_gem5Interface(i); 8912616Sgabeblack@google.com } 906691Stjones1@inf.ed.ac.uk 919552Sandreas.hansson@arm.com struct Binding 929552Sandreas.hansson@arm.com { 939552Sandreas.hansson@arm.com explicit Binding(::sc_core::sc_interface *interface) : 9412616Sgabeblack@google.com interface(interface), port(nullptr) 9512616Sgabeblack@google.com {} 966691Stjones1@inf.ed.ac.uk 976691Stjones1@inf.ed.ac.uk explicit Binding(::sc_core::sc_port_base *port) : 986691Stjones1@inf.ed.ac.uk interface(nullptr), port(port) 996691Stjones1@inf.ed.ac.uk {} 1006691Stjones1@inf.ed.ac.uk 1016691Stjones1@inf.ed.ac.uk ::sc_core::sc_interface *interface; 1026691Stjones1@inf.ed.ac.uk ::sc_core::sc_port_base *port; 1036691Stjones1@inf.ed.ac.uk }; 1046691Stjones1@inf.ed.ac.uk 1056691Stjones1@inf.ed.ac.uk struct Sensitivity 1066691Stjones1@inf.ed.ac.uk { 1076691Stjones1@inf.ed.ac.uk Sensitivity(StaticSensitivityPort *port) : 1086691Stjones1@inf.ed.ac.uk port(port), finder(nullptr) 1096691Stjones1@inf.ed.ac.uk {} 1106691Stjones1@inf.ed.ac.uk 1116691Stjones1@inf.ed.ac.uk Sensitivity(StaticSensitivityFinder *finder) : 1126691Stjones1@inf.ed.ac.uk port(nullptr), finder(finder) 1136691Stjones1@inf.ed.ac.uk {} 1146691Stjones1@inf.ed.ac.uk 1156691Stjones1@inf.ed.ac.uk StaticSensitivityPort *port; 1166691Stjones1@inf.ed.ac.uk StaticSensitivityFinder *finder; 1176691Stjones1@inf.ed.ac.uk }; 1186691Stjones1@inf.ed.ac.uk 11912616Sgabeblack@google.com std::vector<Binding *> bindings; 1206691Stjones1@inf.ed.ac.uk std::vector<Sensitivity *> sensitivities; 1219552Sandreas.hansson@arm.com 1229552Sandreas.hansson@arm.com public: 1239552Sandreas.hansson@arm.com static Port * 12412616Sgabeblack@google.com fromPort(const ::sc_core::sc_port_base *pb) 12512616Sgabeblack@google.com { 1266691Stjones1@inf.ed.ac.uk return pb->_gem5Port; 1276691Stjones1@inf.ed.ac.uk } 1286691Stjones1@inf.ed.ac.uk 1296691Stjones1@inf.ed.ac.uk ::sc_core::sc_port_base *sc_port_base() { return portBase; } 1306691Stjones1@inf.ed.ac.uk 1316691Stjones1@inf.ed.ac.uk Port(::sc_core::sc_port_base *port_base, int max) : 1326691Stjones1@inf.ed.ac.uk portBase(port_base), finalized(false), _maxSize(max), _size(0) 1336691Stjones1@inf.ed.ac.uk { 1346691Stjones1@inf.ed.ac.uk allPorts.push_front(this); 1356691Stjones1@inf.ed.ac.uk } 1366691Stjones1@inf.ed.ac.uk 1376691Stjones1@inf.ed.ac.uk void 1386691Stjones1@inf.ed.ac.uk bind(::sc_core::sc_interface *interface) 1396691Stjones1@inf.ed.ac.uk { 1406691Stjones1@inf.ed.ac.uk bindings.push_back(new Binding(interface)); 1416691Stjones1@inf.ed.ac.uk } 1426691Stjones1@inf.ed.ac.uk 1436691Stjones1@inf.ed.ac.uk void 1446691Stjones1@inf.ed.ac.uk bind(::sc_core::sc_port_base *port) 1456691Stjones1@inf.ed.ac.uk { 1466691Stjones1@inf.ed.ac.uk bindings.push_back(new Binding(port)); 1476691Stjones1@inf.ed.ac.uk } 1486691Stjones1@inf.ed.ac.uk 1496691Stjones1@inf.ed.ac.uk void sensitive(StaticSensitivityPort *port); 1506691Stjones1@inf.ed.ac.uk void sensitive(StaticSensitivityFinder *finder); 1516691Stjones1@inf.ed.ac.uk 1526691Stjones1@inf.ed.ac.uk void finalize(); 1536691Stjones1@inf.ed.ac.uk 1546691Stjones1@inf.ed.ac.uk int size() { return _size; } 1556691Stjones1@inf.ed.ac.uk int maxSize() { return _maxSize; } 1566691Stjones1@inf.ed.ac.uk}; 1576691Stjones1@inf.ed.ac.uk 1586691Stjones1@inf.ed.ac.uk} // namespace sc_gem5 1596691Stjones1@inf.ed.ac.uk 1606691Stjones1@inf.ed.ac.uk#endif // __SYSTEMC_CORE_PORT_HH__ 1616691Stjones1@inf.ed.ac.uk