sc_port.hh revision 13053
12SN/A/* 210298Salexandru.dutu@amd.com * Copyright 2018 Google, Inc. 31762SN/A * 42SN/A * Redistribution and use in source and binary forms, with or without 52SN/A * modification, are permitted provided that the following conditions are 62SN/A * met: redistributions of source code must retain the above copyright 72SN/A * notice, this list of conditions and the following disclaimer; 82SN/A * redistributions in binary form must reproduce the above copyright 92SN/A * notice, this list of conditions and the following disclaimer in the 102SN/A * documentation and/or other materials provided with the distribution; 112SN/A * neither the name of the copyright holders nor the names of its 122SN/A * contributors may be used to endorse or promote products derived from 132SN/A * this software without specific prior written permission. 142SN/A * 152SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262SN/A * 272SN/A * Authors: Gabe Black 282665Ssaidi@eecs.umich.edu */ 292665Ssaidi@eecs.umich.edu 302665Ssaidi@eecs.umich.edu#ifndef __SYSTEMC_EXT_CORE_SC_PORT_HH__ 312SN/A#define __SYSTEMC_EXT_CORE_SC_PORT_HH__ 322SN/A 33360SN/A#include <vector> 34360SN/A 352SN/A#include "../utils/sc_report_handler.hh" 3610930Sbrandon.potter@amd.com#include "sc_module.hh" // for sc_gen_unique_name 374117Sgblack@eecs.umich.edu#include "sc_object.hh" 38180SN/A 392SN/Anamespace sc_gem5 406329Sgblack@eecs.umich.edu{ 412378SN/A 426214Snate@binkert.orgclass BindInfo; 436658Snate@binkert.orgclass PendingSensitivityPort; 448852Sandreas.hansson@arm.com 4510930Sbrandon.potter@amd.com}; 4656SN/A 475958Sgblack@eecs.umich.edunamespace sc_core 482SN/A{ 495154Sgblack@eecs.umich.edu 508737Skoansin.tan@gmail.comclass sc_interface; 518737Skoansin.tan@gmail.com 525154Sgblack@eecs.umich.eduenum sc_port_policy 535154Sgblack@eecs.umich.edu{ 542680Sktlim@umich.edu SC_ONE_OR_MORE_BOUND, // Default 5510496Ssteve.reinhardt@amd.com SC_ZERO_OR_MORE_BOUND, 562378SN/A SC_ALL_BOUND 575758Shsul@eecs.umich.edu}; 585771Shsul@eecs.umich.edu 595758Shsul@eecs.umich.educlass sc_port_base : public sc_object 605758Shsul@eecs.umich.edu{ 615771Shsul@eecs.umich.edu public: 625758Shsul@eecs.umich.edu sc_port_base(const char *name, int n, sc_port_policy p); 635771Shsul@eecs.umich.edu 645758Shsul@eecs.umich.edu void warn_unimpl(const char *func) const; 655758Shsul@eecs.umich.edu 665771Shsul@eecs.umich.edu int maxSize() const; 675758Shsul@eecs.umich.edu int size() const; 685758Shsul@eecs.umich.edu 692SN/A protected: 702SN/A // Implementation defined, but depended on by the tests. 712SN/A void bind(sc_interface &); 722SN/A void bind(sc_port_base &); 732378SN/A 742378SN/A // Implementation defined, but depended on by the tests. 752378SN/A virtual int vbind(sc_interface &) = 0; 762378SN/A virtual int vbind(sc_port_base &) = 0; 772680Sktlim@umich.edu 785713Shsul@eecs.umich.edu private: 79180SN/A friend class ::sc_gem5::PendingSensitivityPort; 80180SN/A friend class ::sc_gem5::Kernel; 815713Shsul@eecs.umich.edu 822SN/A void _gem5Finalize(); 832SN/A 842SN/A virtual sc_interface *_gem5Interface(int n) const = 0; 852SN/A virtual void _gem5AddInterface(sc_interface *i) = 0; 862SN/A 872680Sktlim@umich.edu std::vector<::sc_gem5::BindInfo *> _gem5BindInfo; 882SN/A int _maxSize; 892680Sktlim@umich.edu int _size; 902SN/A bool finalized; 915543Ssaidi@eecs.umich.edu}; 922SN/A 932SN/Atemplate <class IF> 942SN/Aclass sc_port_b : public sc_port_base 952SN/A{ 962SN/A public: 975543Ssaidi@eecs.umich.edu void operator () (IF &i) { bind(i); } 982SN/A void operator () (sc_port_b<IF> &p) { bind(p); } 995543Ssaidi@eecs.umich.edu 1005543Ssaidi@eecs.umich.edu virtual void bind(IF &i) { sc_port_base::bind(i); } 1015543Ssaidi@eecs.umich.edu virtual void bind(sc_port_b<IF> &p) { sc_port_base::bind(p); } 1022SN/A 1035154Sgblack@eecs.umich.edu IF *operator -> () { return _interfaces.at(0); } 1045154Sgblack@eecs.umich.edu const IF *operator -> () const { return _interfaces.at(0); } 1055154Sgblack@eecs.umich.edu 1062SN/A IF *operator [] (int n) { return _interfaces.at(n); } 1072SN/A const IF *operator [] (int n) const { return _interfaces.at(n); } 1082SN/A 109360SN/A sc_interface *get_interface() { return _interfaces.at(0); } 1101408SN/A const sc_interface *get_interface() const { return _interfaces.at(0); } 1111408SN/A 112360SN/A protected: 1131514SN/A virtual void before_end_of_elaboration() {} 1141514SN/A virtual void end_of_elaboration() {} 1151514SN/A virtual void start_of_elaboration() {} 1161514SN/A virtual void end_of_simulation() {} 1175999Snate@binkert.org 1182SN/A explicit sc_port_b(int n, sc_port_policy p) : 1192SN/A sc_port_base(sc_gen_unique_name("port"), n, p) 1202SN/A {} 1218325Ssteve.reinhardt@amd.com sc_port_b(const char *name, int n, sc_port_policy p) : 1222SN/A sc_port_base(name, n, p) 1237532Ssteve.reinhardt@amd.com {} 1242SN/A virtual ~sc_port_b() {} 12510913Sandreas.sandberg@arm.com 12610905Sandreas.sandberg@arm.com // Implementation defined, but depended on by the tests. 1272378SN/A int 1282SN/A vbind(sc_interface &i) 1294997Sgblack@eecs.umich.edu { 1304997Sgblack@eecs.umich.edu IF *interface = dynamic_cast<IF *>(&i); 1314997Sgblack@eecs.umich.edu if (!interface) 1324997Sgblack@eecs.umich.edu return 2; 13310299Salexandru.dutu@amd.com sc_port_base::bind(*interface); 13410299Salexandru.dutu@amd.com return 0; 13510554Salexandru.dutu@amd.com } 13610554Salexandru.dutu@amd.com int 13710554Salexandru.dutu@amd.com vbind(sc_port_base &pb) 13810298Salexandru.dutu@amd.com { 1398852Sandreas.hansson@arm.com sc_port_b<IF> *p = dynamic_cast<sc_port_b<IF> *>(&pb); 1408852Sandreas.hansson@arm.com if (!p) 1418852Sandreas.hansson@arm.com return 2; 1428852Sandreas.hansson@arm.com sc_port_base::bind(*p); 1438852Sandreas.hansson@arm.com return 0; 1442SN/A } 14510929Sbrandon.potter@amd.com 1465282Srstrong@cs.ucsd.edu private: 14710929Sbrandon.potter@amd.com std::vector<IF *> _interfaces; 14810930Sbrandon.potter@amd.com 14910930Sbrandon.potter@amd.com sc_interface *_gem5Interface(int n) const { return _interfaces.at(n); } 15010930Sbrandon.potter@amd.com void 15110930Sbrandon.potter@amd.com _gem5AddInterface(sc_interface *i) 15210930Sbrandon.potter@amd.com { 1532SN/A IF *interface = dynamic_cast<IF *>(i); 1542SN/A sc_assert(interface); 15510930Sbrandon.potter@amd.com _interfaces.push_back(interface); 15610930Sbrandon.potter@amd.com } 1572SN/A 1582SN/A // Disabled 1592SN/A sc_port_b() {} 1602SN/A sc_port_b(const sc_port_b<IF> &) {} 1615713Shsul@eecs.umich.edu sc_port_b<IF> &operator = (const sc_port_b<IF> &) { return *this; } 1625713Shsul@eecs.umich.edu}; 1635713Shsul@eecs.umich.edu 1645713Shsul@eecs.umich.edutemplate <class IF, int N=1, sc_port_policy P=SC_ONE_OR_MORE_BOUND> 1655713Shsul@eecs.umich.educlass sc_port : public sc_port_b<IF> 1665713Shsul@eecs.umich.edu{ 167180SN/A public: 1685713Shsul@eecs.umich.edu sc_port() : sc_port_b<IF>(N, P) {} 1698325Ssteve.reinhardt@amd.com explicit sc_port(const char *name) : sc_port_b<IF>(name, N, P) {} 1702SN/A virtual ~sc_port() {} 1719144Ssteve.reinhardt@amd.com 1729144Ssteve.reinhardt@amd.com // Deprecated binding constructors. 1739144Ssteve.reinhardt@amd.com explicit sc_port(const IF &interface) : sc_port_b<IF>(N, P) 1742SN/A { 17510782Snilay@cs.wisc.edu this->warn_unimpl(__PRETTY_FUNCTION__); 1768325Ssteve.reinhardt@amd.com // Should warn that these are deprecated. See Accellera sc_port.h. 1771970SN/A sc_port_b<IF>::bind(const_cast<IF &>(interface)); 17810929Sbrandon.potter@amd.com } 17910930Sbrandon.potter@amd.com sc_port(const char *name, const IF &interface) : sc_port_b<IF>(name, N, P) 1802SN/A { 1812SN/A this->warn_unimpl(__PRETTY_FUNCTION__); 1822SN/A // Should warn that these are deprecated. See Accellera sc_port.h. 1832SN/A sc_port_b<IF>::bind(const_cast<IF &>(interface)); 18410930Sbrandon.potter@amd.com } 18510930Sbrandon.potter@amd.com explicit sc_port(sc_port_b<IF> &parent) : sc_port_b<IF>(N, P) 1865282Srstrong@cs.ucsd.edu { 18710929Sbrandon.potter@amd.com this->warn_unimpl(__PRETTY_FUNCTION__); 18810929Sbrandon.potter@amd.com // Should warn that these are deprecated. See Accellera sc_port.h. 18910929Sbrandon.potter@amd.com sc_port_b<IF>::bind(parent); 19010929Sbrandon.potter@amd.com } 19110929Sbrandon.potter@amd.com sc_port(const char *name, sc_port_b<IF> &parent) : 19210929Sbrandon.potter@amd.com sc_port_b<IF>(name, N, P) 19310929Sbrandon.potter@amd.com { 1945282Srstrong@cs.ucsd.edu this->warn_unimpl(__PRETTY_FUNCTION__); 1955282Srstrong@cs.ucsd.edu // Should warn that these are deprecated. See Accellera sc_port.h. 1965282Srstrong@cs.ucsd.edu sc_port_b<IF>::bind(parent); 1975282Srstrong@cs.ucsd.edu } 1985282Srstrong@cs.ucsd.edu explicit sc_port(sc_port<IF, N, P> &parent) : sc_port_b<IF>(N, P) 1995282Srstrong@cs.ucsd.edu { 2005282Srstrong@cs.ucsd.edu this->warn_unimpl(__PRETTY_FUNCTION__); 2015282Srstrong@cs.ucsd.edu // Should warn that these are deprecated. See Accellera sc_port.h. 2025282Srstrong@cs.ucsd.edu sc_port_b<IF>::bind(parent); 2032680Sktlim@umich.edu } 2043311Ssaidi@eecs.umich.edu sc_port(const char *name, sc_port<IF, N, P> &parent) : 2058601Ssteve.reinhardt@amd.com sc_port_b<IF>(name, N, P) 2068601Ssteve.reinhardt@amd.com { 2078539Sgblack@eecs.umich.edu this->warn_unimpl(__PRETTY_FUNCTION__); 2088539Sgblack@eecs.umich.edu // Should warn that these are deprecated. See Accellera sc_port.h. 2098539Sgblack@eecs.umich.edu sc_port_b<IF>::bind(parent); 2104434Ssaidi@eecs.umich.edu } 2119110Ssteve.reinhardt@amd.com 21210558Salexandru.dutu@amd.com virtual const char *kind() const { return "sc_port"; } 2139110Ssteve.reinhardt@amd.com 21410558Salexandru.dutu@amd.com private: 21510558Salexandru.dutu@amd.com // Disabled 2169110Ssteve.reinhardt@amd.com sc_port(const sc_port<IF, N, P> &) {} 2179110Ssteve.reinhardt@amd.com sc_port<IF, N, P> &operator = (const sc_port<IF, N, P> &) { return *this; } 2189110Ssteve.reinhardt@amd.com}; 2199110Ssteve.reinhardt@amd.com 22010558Salexandru.dutu@amd.com} // namespace sc_core 2219110Ssteve.reinhardt@amd.com 2229110Ssteve.reinhardt@amd.com#endif //__SYSTEMC_EXT_CORE_SC_PORT_HH__ 2239110Ssteve.reinhardt@amd.com