adapters.hh revision 13586
111508Sandreas.sandberg@arm.com/*****************************************************************************
211508Sandreas.sandberg@arm.com
311508Sandreas.sandberg@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
411508Sandreas.sandberg@arm.com  more contributor license agreements.  See the NOTICE file distributed
511508Sandreas.sandberg@arm.com  with this work for additional information regarding copyright ownership.
611508Sandreas.sandberg@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
711508Sandreas.sandberg@arm.com  (the "License"); you may not use this file except in compliance with the
811508Sandreas.sandberg@arm.com  License.  You may obtain a copy of the License at
911508Sandreas.sandberg@arm.com
1011508Sandreas.sandberg@arm.com    http://www.apache.org/licenses/LICENSE-2.0
1111508Sandreas.sandberg@arm.com
1211508Sandreas.sandberg@arm.com  Unless required by applicable law or agreed to in writing, software
1311508Sandreas.sandberg@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
1411508Sandreas.sandberg@arm.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1511508Sandreas.sandberg@arm.com  implied.  See the License for the specific language governing
1611508Sandreas.sandberg@arm.com  permissions and limitations under the License.
1711508Sandreas.sandberg@arm.com
1811508Sandreas.sandberg@arm.com *****************************************************************************/
1911508Sandreas.sandberg@arm.com
2011508Sandreas.sandberg@arm.com#ifndef __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__
2111508Sandreas.sandberg@arm.com#define __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__
2211508Sandreas.sandberg@arm.com
2311508Sandreas.sandberg@arm.com#include "../interfaces/master_slave_ifs.hh"
2411508Sandreas.sandberg@arm.com
2511508Sandreas.sandberg@arm.comnamespace tlm
2611508Sandreas.sandberg@arm.com{
2711508Sandreas.sandberg@arm.com
2811508Sandreas.sandberg@arm.comtemplate <typename REQ, typename RSP>
2911403Sandreas.sandberg@arm.comclass tlm_transport_to_master : public sc_core::sc_module,
3011403Sandreas.sandberg@arm.com    public virtual tlm_transport_if<REQ, RSP>
3111403Sandreas.sandberg@arm.com{
3211403Sandreas.sandberg@arm.com  public:
3311403Sandreas.sandberg@arm.com    sc_core::sc_export<tlm_transport_if<REQ, RSP>> target_export;
3411403Sandreas.sandberg@arm.com    sc_core::sc_port<tlm_master_if<REQ, RSP>> master_port;
3511403Sandreas.sandberg@arm.com
3611403Sandreas.sandberg@arm.com    tlm_transport_to_master(sc_core::sc_module_name nm) :
3711403Sandreas.sandberg@arm.com        sc_core::sc_module(nm)
3811403Sandreas.sandberg@arm.com    {
3911403Sandreas.sandberg@arm.com        target_export( *this );
4011403Sandreas.sandberg@arm.com    }
4111403Sandreas.sandberg@arm.com
4211403Sandreas.sandberg@arm.com    tlm_transport_to_master() :
4311403Sandreas.sandberg@arm.com        sc_core::sc_module(sc_core::sc_module_name(
4411403Sandreas.sandberg@arm.com                    sc_core::sc_gen_unique_name("transport_to_master")))
4511403Sandreas.sandberg@arm.com    {
4611403Sandreas.sandberg@arm.com        target_export( *this );
4711403Sandreas.sandberg@arm.com    }
4811403Sandreas.sandberg@arm.com
4911403Sandreas.sandberg@arm.com    RSP
5011403Sandreas.sandberg@arm.com    transport(const REQ &req)
5111403Sandreas.sandberg@arm.com    {
5211403Sandreas.sandberg@arm.com        mutex.lock();
5311403Sandreas.sandberg@arm.com        master_port->put(req);
5411403Sandreas.sandberg@arm.com        rsp = master_port->get();
5511403Sandreas.sandberg@arm.com
5611403Sandreas.sandberg@arm.com        mutex.unlock();
5711403Sandreas.sandberg@arm.com        return rsp;
5811403Sandreas.sandberg@arm.com    }
5911403Sandreas.sandberg@arm.com
6011403Sandreas.sandberg@arm.com  private:
6111403Sandreas.sandberg@arm.com    sc_core::sc_mutex mutex;
6211403Sandreas.sandberg@arm.com    RSP rsp;
6311541Sgabor.dozsa@arm.com};
6411403Sandreas.sandberg@arm.com
6511403Sandreas.sandberg@arm.comtemplate <typename REQ, typename RSP>
6611403Sandreas.sandberg@arm.comclass tlm_slave_to_transport : public sc_core::sc_module
6711403Sandreas.sandberg@arm.com{
6811403Sandreas.sandberg@arm.com  public:
6911403Sandreas.sandberg@arm.com    SC_HAS_PROCESS(tlm_slave_to_transport);
7011403Sandreas.sandberg@arm.com
7111403Sandreas.sandberg@arm.com    sc_core::sc_port<tlm_slave_if<REQ, RSP>> slave_port;
7211403Sandreas.sandberg@arm.com    sc_core::sc_port<tlm_transport_if<REQ, RSP>> initiator_port;
7311403Sandreas.sandberg@arm.com
7411403Sandreas.sandberg@arm.com    tlm_slave_to_transport(sc_core::sc_module_name nm) :
7511403Sandreas.sandberg@arm.com        sc_core::sc_module(nm)
7611403Sandreas.sandberg@arm.com    {}
7711403Sandreas.sandberg@arm.com
7811403Sandreas.sandberg@arm.com    tlm_slave_to_transport() :
7911403Sandreas.sandberg@arm.com        sc_core::sc_module(sc_core::sc_module_name(
8011403Sandreas.sandberg@arm.com                    sc_core::sc_gen_unique_name("slave_to_transport")))
8111403Sandreas.sandberg@arm.com    {}
8211403Sandreas.sandberg@arm.com
8311403Sandreas.sandberg@arm.com  private:
8411403Sandreas.sandberg@arm.com    void
8511403Sandreas.sandberg@arm.com    run()
8611403Sandreas.sandberg@arm.com    {
8711403Sandreas.sandberg@arm.com        REQ req;
8811403Sandreas.sandberg@arm.com        RSP rsp;
8911403Sandreas.sandberg@arm.com
9011403Sandreas.sandberg@arm.com        while (true) {
9111403Sandreas.sandberg@arm.com            slave_port->get(req);
9211403Sandreas.sandberg@arm.com            rsp = initiator_port->transport(req);
9311403Sandreas.sandberg@arm.com            slave_port->put(rsp);
9411403Sandreas.sandberg@arm.com        }
9511403Sandreas.sandberg@arm.com    }
9611403Sandreas.sandberg@arm.com};
9711403Sandreas.sandberg@arm.com
9811403Sandreas.sandberg@arm.com} // namespace tlm
9911403Sandreas.sandberg@arm.com
10011403Sandreas.sandberg@arm.com#endif /* __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__ */
10111403Sandreas.sandberg@arm.com