tlm_port_wrapper.hh revision 13819
113540Sandrea.mondelli@ucf.edu/* 210107Sradhika.jagtap@ARM.com * Copyright 2018 Google, Inc. 310107Sradhika.jagtap@ARM.com * 410107Sradhika.jagtap@ARM.com * Redistribution and use in source and binary forms, with or without 510107Sradhika.jagtap@ARM.com * modification, are permitted provided that the following conditions are 610107Sradhika.jagtap@ARM.com * met: redistributions of source code must retain the above copyright 710107Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer; 810107Sradhika.jagtap@ARM.com * redistributions in binary form must reproduce the above copyright 910107Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer in the 1010107Sradhika.jagtap@ARM.com * documentation and/or other materials provided with the distribution; 1110107Sradhika.jagtap@ARM.com * neither the name of the copyright holders nor the names of its 1210107Sradhika.jagtap@ARM.com * contributors may be used to endorse or promote products derived from 1310107Sradhika.jagtap@ARM.com * this software without specific prior written permission. 1410107Sradhika.jagtap@ARM.com * 1510107Sradhika.jagtap@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1610107Sradhika.jagtap@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1710107Sradhika.jagtap@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1810107Sradhika.jagtap@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1910107Sradhika.jagtap@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2010107Sradhika.jagtap@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2110107Sradhika.jagtap@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2210107Sradhika.jagtap@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2310107Sradhika.jagtap@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2410107Sradhika.jagtap@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2510107Sradhika.jagtap@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2610107Sradhika.jagtap@ARM.com * 2710107Sradhika.jagtap@ARM.com * Authors: Gabe Black 2810107Sradhika.jagtap@ARM.com */ 2910107Sradhika.jagtap@ARM.com 3010107Sradhika.jagtap@ARM.com#ifndef __SYSTEMC_TLM_PORT_WRAPPER_HH__ 3110107Sradhika.jagtap@ARM.com#define __SYSTEMC_TLM_PORT_WRAPPER_HH__ 3210107Sradhika.jagtap@ARM.com 3310107Sradhika.jagtap@ARM.com#include "base/logging.hh" 3410107Sradhika.jagtap@ARM.com#include "sim/port.hh" 3510107Sradhika.jagtap@ARM.com#include "systemc/ext/tlm_core/2/sockets/sockets.hh" 3610107Sradhika.jagtap@ARM.com 3710107Sradhika.jagtap@ARM.comnamespace sc_gem5 3810107Sradhika.jagtap@ARM.com{ 3910107Sradhika.jagtap@ARM.com 4010107Sradhika.jagtap@ARM.comtemplate <unsigned int BUSWIDTH=32, 4110107Sradhika.jagtap@ARM.com typename TYPES=tlm::tlm_base_protocol_types, int N=1, 4210107Sradhika.jagtap@ARM.com sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 4310107Sradhika.jagtap@ARM.comclass TlmInitiatorWrapper; 4410107Sradhika.jagtap@ARM.com 4510107Sradhika.jagtap@ARM.comtemplate <unsigned int BUSWIDTH=32, 4610107Sradhika.jagtap@ARM.com typename TYPES=tlm::tlm_base_protocol_types, int N=1, 4710107Sradhika.jagtap@ARM.com sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND> 4810107Sradhika.jagtap@ARM.comclass TlmTargetWrapper; 4910107Sradhika.jagtap@ARM.com 5010107Sradhika.jagtap@ARM.comtemplate <unsigned int BUSWIDTH, typename TYPES, int N, 5110107Sradhika.jagtap@ARM.com sc_core::sc_port_policy POL> 5210107Sradhika.jagtap@ARM.comclass TlmInitiatorWrapper : public ::Port 5310107Sradhika.jagtap@ARM.com{ 5410107Sradhika.jagtap@ARM.com public: 5510107Sradhika.jagtap@ARM.com typedef tlm::tlm_base_initiator_socket<BUSWIDTH, 5610107Sradhika.jagtap@ARM.com tlm::tlm_fw_transport_if<TYPES>, 5710107Sradhika.jagtap@ARM.com tlm::tlm_bw_transport_if<TYPES>, N, POL> 5810107Sradhika.jagtap@ARM.com InitiatorSocket; 5910107Sradhika.jagtap@ARM.com typedef typename InitiatorSocket::base_target_socket_type TargetSocket; 6010107Sradhika.jagtap@ARM.com typedef TlmTargetWrapper<BUSWIDTH, TYPES, N, POL> TargetWrapper; 6110107Sradhika.jagtap@ARM.com 6210107Sradhika.jagtap@ARM.com InitiatorSocket &initiator() { return _initiator; } 6310107Sradhika.jagtap@ARM.com 6410107Sradhika.jagtap@ARM.com TlmInitiatorWrapper( 6510107Sradhika.jagtap@ARM.com InitiatorSocket &i, const std::string &_name, PortID _id) : 6610107Sradhika.jagtap@ARM.com Port(_name, _id), _initiator(i) 6710107Sradhika.jagtap@ARM.com {} 6810107Sradhika.jagtap@ARM.com 6910107Sradhika.jagtap@ARM.com void 7010107Sradhika.jagtap@ARM.com bind(::Port &peer) override 7110107Sradhika.jagtap@ARM.com { 7210107Sradhika.jagtap@ARM.com auto *target = dynamic_cast<TargetWrapper *>(&peer); 7310107Sradhika.jagtap@ARM.com fatal_if(!target, "Attempt to bind TLM initiator socket %s to " 7410269Sradhika.jagtap@ARM.com "incompatible port %s.", name(), peer.name()); 7510107Sradhika.jagtap@ARM.com 7610107Sradhika.jagtap@ARM.com initiator().bind(target->target()); 7710269Sradhika.jagtap@ARM.com } 7810269Sradhika.jagtap@ARM.com 7910269Sradhika.jagtap@ARM.com void 8010269Sradhika.jagtap@ARM.com unbind() override 8110269Sradhika.jagtap@ARM.com { 8210269Sradhika.jagtap@ARM.com panic("TLM sockets can't be unbound."); 8310269Sradhika.jagtap@ARM.com } 8410269Sradhika.jagtap@ARM.com 8510269Sradhika.jagtap@ARM.com private: 8610269Sradhika.jagtap@ARM.com InitiatorSocket &_initiator; 8710269Sradhika.jagtap@ARM.com}; 8810269Sradhika.jagtap@ARM.com 8910269Sradhika.jagtap@ARM.comtemplate <unsigned int BUSWIDTH, typename TYPES, int N, 9010269Sradhika.jagtap@ARM.com sc_core::sc_port_policy POL> 9110269Sradhika.jagtap@ARM.comclass TlmTargetWrapper : public ::Port 9210269Sradhika.jagtap@ARM.com{ 9310269Sradhika.jagtap@ARM.com public: 9410269Sradhika.jagtap@ARM.com typedef tlm::tlm_base_target_socket<BUSWIDTH, 9510269Sradhika.jagtap@ARM.com tlm::tlm_fw_transport_if<TYPES>, 9610269Sradhika.jagtap@ARM.com tlm::tlm_bw_transport_if<TYPES>, N, POL> 9710269Sradhika.jagtap@ARM.com TargetSocket; 9810269Sradhika.jagtap@ARM.com 9910269Sradhika.jagtap@ARM.com TargetSocket &target() { return _target; } 10010269Sradhika.jagtap@ARM.com 10112209Sgabeblack@google.com TlmTargetWrapper(TargetSocket &t, const std::string &_name, PortID _id) : 10210107Sradhika.jagtap@ARM.com Port(_name, _id), _target(t) 10310107Sradhika.jagtap@ARM.com {} 10410107Sradhika.jagtap@ARM.com 10510107Sradhika.jagtap@ARM.com void 10610107Sradhika.jagtap@ARM.com bind(::Port &peer) override 10710107Sradhika.jagtap@ARM.com { 10810107Sradhika.jagtap@ARM.com // Ignore attempts to bind a target socket. The initiator will 10910107Sradhika.jagtap@ARM.com // handle it. 11010107Sradhika.jagtap@ARM.com } 11110107Sradhika.jagtap@ARM.com 11210107Sradhika.jagtap@ARM.com void 11310107Sradhika.jagtap@ARM.com unbind() override 11410107Sradhika.jagtap@ARM.com { 11510107Sradhika.jagtap@ARM.com panic("TLM sockets can't be unbound."); 11610107Sradhika.jagtap@ARM.com } 11710107Sradhika.jagtap@ARM.com 11810107Sradhika.jagtap@ARM.com private: 11910107Sradhika.jagtap@ARM.com TargetSocket &_target; 12010107Sradhika.jagtap@ARM.com}; 12110107Sradhika.jagtap@ARM.com 12210107Sradhika.jagtap@ARM.com} // namespace sc_gem5 12310107Sradhika.jagtap@ARM.com 12410107Sradhika.jagtap@ARM.com#endif //__SYSTEMC_TLM_PORT_WRAPPER_HH__ 12510107Sradhika.jagtap@ARM.com