port.hh revision 13321
1451SN/A/* 25795Ssaidi@eecs.umich.edu * Copyright 2018 Google, Inc. 3451SN/A * 4451SN/A * Redistribution and use in source and binary forms, with or without 5451SN/A * modification, are permitted provided that the following conditions are 6451SN/A * met: redistributions of source code must retain the above copyright 7451SN/A * notice, this list of conditions and the following disclaimer; 8451SN/A * redistributions in binary form must reproduce the above copyright 9451SN/A * notice, this list of conditions and the following disclaimer in the 10451SN/A * documentation and/or other materials provided with the distribution; 11451SN/A * neither the name of the copyright holders nor the names of its 12451SN/A * contributors may be used to endorse or promote products derived from 13451SN/A * this software without specific prior written permission. 14451SN/A * 15451SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16451SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17451SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18451SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19451SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20451SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21451SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22451SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23451SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24451SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25451SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26451SN/A * 272665Ssaidi@eecs.umich.edu * Authors: Gabe Black 282665Ssaidi@eecs.umich.edu */ 29451SN/A 30451SN/A#ifndef __SYSTEMC_CORE_PORT_HH__ 31451SN/A#define __SYSTEMC_CORE_PORT_HH__ 32451SN/A 336215Snate@binkert.org#include <list> 346215Snate@binkert.org#include <typeinfo> 352093SN/A#include <vector> 362093SN/A 372093SN/A#include "base/cprintf.hh" 38451SN/A#include "systemc/ext/core/sc_interface.hh" 39451SN/A#include "systemc/ext/core/sc_port.hh" 40451SN/A 412093SN/Anamespace sc_gem5 422093SN/A{ 435795Ssaidi@eecs.umich.edu 442093SN/Aclass StaticSensitivityPort; 453113Sgblack@eecs.umich.educlass StaticSensitivityFinder; 462423SN/Aclass Reset; 475795Ssaidi@eecs.umich.edu 485795Ssaidi@eecs.umich.educlass Port; 495795Ssaidi@eecs.umich.edu 502093SN/Aextern std::list<Port *> allPorts; 512093SN/A 522093SN/Aclass Port 532093SN/A{ 542093SN/A private: 553113Sgblack@eecs.umich.edu ::sc_core::sc_port_base *portBase; 563113Sgblack@eecs.umich.edu 572093SN/A bool finalized; 582093SN/A int _maxSize; 592093SN/A int _size; 602093SN/A 612093SN/A bool regPortNeeded; 623122Sgblack@eecs.umich.edu 632093SN/A void finalizePort(StaticSensitivityPort *port); 642093SN/A void finalizeFinder(StaticSensitivityFinder *finder); 652093SN/A void finalizeReset(Reset *reset); 663122Sgblack@eecs.umich.edu 672093SN/A void 682093SN/A addInterface(::sc_core::sc_interface *iface) 692093SN/A { 703113Sgblack@eecs.umich.edu portBase->_gem5AddInterface(iface); 713113Sgblack@eecs.umich.edu _size++; 723113Sgblack@eecs.umich.edu } 735543Ssaidi@eecs.umich.edu 745543Ssaidi@eecs.umich.edu void 755543Ssaidi@eecs.umich.edu addInterfaces(::sc_core::sc_port_base *pb) 765543Ssaidi@eecs.umich.edu { 775543Ssaidi@eecs.umich.edu // Only the ports farthest from the interfaces call register_port. 785543Ssaidi@eecs.umich.edu pb->_gem5Port->regPortNeeded = false; 795543Ssaidi@eecs.umich.edu for (int i = 0; i < pb->size(); i++) 805543Ssaidi@eecs.umich.edu addInterface(pb->_gem5Interface(i)); 815543Ssaidi@eecs.umich.edu } 825543Ssaidi@eecs.umich.edu 835543Ssaidi@eecs.umich.edu ::sc_core::sc_interface * 845543Ssaidi@eecs.umich.edu getInterface(int i) 855543Ssaidi@eecs.umich.edu { 865543Ssaidi@eecs.umich.edu return portBase->_gem5Interface(i); 875543Ssaidi@eecs.umich.edu } 885543Ssaidi@eecs.umich.edu 893113Sgblack@eecs.umich.edu struct Binding 902093SN/A { 912093SN/A explicit Binding(::sc_core::sc_interface *interface) : 923113Sgblack@eecs.umich.edu interface(interface), port(nullptr) 935543Ssaidi@eecs.umich.edu {} 945543Ssaidi@eecs.umich.edu 955543Ssaidi@eecs.umich.edu explicit Binding(::sc_core::sc_port_base *port) : 965543Ssaidi@eecs.umich.edu interface(nullptr), port(port) 975543Ssaidi@eecs.umich.edu {} 982093SN/A 995543Ssaidi@eecs.umich.edu ::sc_core::sc_interface *interface; 1005543Ssaidi@eecs.umich.edu ::sc_core::sc_port_base *port; 1015543Ssaidi@eecs.umich.edu }; 1025543Ssaidi@eecs.umich.edu 1035543Ssaidi@eecs.umich.edu struct Sensitivity 1045543Ssaidi@eecs.umich.edu { 1052093SN/A Sensitivity(StaticSensitivityPort *port) : 1065543Ssaidi@eecs.umich.edu port(port), finder(nullptr) 1075543Ssaidi@eecs.umich.edu {} 1085543Ssaidi@eecs.umich.edu 1095543Ssaidi@eecs.umich.edu Sensitivity(StaticSensitivityFinder *finder) : 1105543Ssaidi@eecs.umich.edu port(nullptr), finder(finder) 1115543Ssaidi@eecs.umich.edu {} 1125543Ssaidi@eecs.umich.edu 1133113Sgblack@eecs.umich.edu StaticSensitivityPort *port; 1142093SN/A StaticSensitivityFinder *finder; 1152093SN/A }; 1162093SN/A 1172093SN/A std::vector<Binding *> bindings; 1182093SN/A std::vector<Sensitivity *> sensitivities; 1192093SN/A std::vector<Reset *> resets; 1205543Ssaidi@eecs.umich.edu 1215543Ssaidi@eecs.umich.edu public: 1225543Ssaidi@eecs.umich.edu static Port * 1235543Ssaidi@eecs.umich.edu fromPort(const ::sc_core::sc_port_base *pb) 1245543Ssaidi@eecs.umich.edu { 1252093SN/A return pb->_gem5Port; 1262093SN/A } 1272093SN/A 1282093SN/A ::sc_core::sc_port_base *sc_port_base() { return portBase; } 1295543Ssaidi@eecs.umich.edu 1305543Ssaidi@eecs.umich.edu Port(::sc_core::sc_port_base *port_base, int max) : 1312093SN/A portBase(port_base), finalized(false), _maxSize(max), _size(0), 1322093SN/A regPortNeeded(true) 1332093SN/A { 1342093SN/A allPorts.push_front(this); 1355543Ssaidi@eecs.umich.edu } 1365543Ssaidi@eecs.umich.edu 1372093SN/A ~Port() { allPorts.remove(this); } 1382093SN/A 1396683Stjones1@inf.ed.ac.uk void 1406683Stjones1@inf.ed.ac.uk bind(::sc_core::sc_interface *interface) 1416683Stjones1@inf.ed.ac.uk { 1426683Stjones1@inf.ed.ac.uk if (bindings.empty()) 1436683Stjones1@inf.ed.ac.uk addInterface(interface); 1446683Stjones1@inf.ed.ac.uk else 1456683Stjones1@inf.ed.ac.uk bindings.push_back(new Binding(interface)); 1466683Stjones1@inf.ed.ac.uk } 1476683Stjones1@inf.ed.ac.uk 1486683Stjones1@inf.ed.ac.uk void 1496683Stjones1@inf.ed.ac.uk bind(::sc_core::sc_port_base *port) 1502093SN/A { 1512093SN/A bindings.push_back(new Binding(port)); 1522093SN/A } 1532093SN/A 1542093SN/A void sensitive(StaticSensitivityPort *port); 1552093SN/A void sensitive(StaticSensitivityFinder *finder); 1562093SN/A void addReset(Reset *reset); 1572093SN/A 1582093SN/A void finalize(); 1595543Ssaidi@eecs.umich.edu void regPort(); 1605543Ssaidi@eecs.umich.edu 1615543Ssaidi@eecs.umich.edu int size() { return _size; } 1625543Ssaidi@eecs.umich.edu int maxSize() { return _maxSize ? _maxSize : _size; } 1635543Ssaidi@eecs.umich.edu}; 1645543Ssaidi@eecs.umich.edu 1655543Ssaidi@eecs.umich.edu} // namespace sc_gem5 1665543Ssaidi@eecs.umich.edu 1675543Ssaidi@eecs.umich.edu#endif // __SYSTEMC_CORE_PORT_HH__ 1685543Ssaidi@eecs.umich.edu