adapters.hh revision 13521:74fa3ac44057
19342SAndreas.Sandberg@arm.com/*****************************************************************************
211937Sandreas.sandberg@arm.com
39342SAndreas.Sandberg@arm.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
49342SAndreas.Sandberg@arm.com  more contributor license agreements.  See the NOTICE file distributed
59342SAndreas.Sandberg@arm.com  with this work for additional information regarding copyright ownership.
69342SAndreas.Sandberg@arm.com  Accellera licenses this file to you under the Apache License, Version 2.0
79342SAndreas.Sandberg@arm.com  (the "License"); you may not use this file except in compliance with the
89342SAndreas.Sandberg@arm.com  License.  You may obtain a copy of the License at
99342SAndreas.Sandberg@arm.com
109342SAndreas.Sandberg@arm.com    http://www.apache.org/licenses/LICENSE-2.0
119342SAndreas.Sandberg@arm.com
129342SAndreas.Sandberg@arm.com  Unless required by applicable law or agreed to in writing, software
139342SAndreas.Sandberg@arm.com  distributed under the License is distributed on an "AS IS" BASIS,
149342SAndreas.Sandberg@arm.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
159342SAndreas.Sandberg@arm.com  implied.  See the License for the specific language governing
169342SAndreas.Sandberg@arm.com  permissions and limitations under the License.
179342SAndreas.Sandberg@arm.com
189342SAndreas.Sandberg@arm.com *****************************************************************************/
199342SAndreas.Sandberg@arm.com
209342SAndreas.Sandberg@arm.com#ifndef __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__
219342SAndreas.Sandberg@arm.com#define __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__
229342SAndreas.Sandberg@arm.com
239342SAndreas.Sandberg@arm.com#include "tlm_core/1/req_rsp/interfaces/master_slave_ifs.hh"
249342SAndreas.Sandberg@arm.com
259342SAndreas.Sandberg@arm.comnamespace tlm
269342SAndreas.Sandberg@arm.com{
279342SAndreas.Sandberg@arm.com
289342SAndreas.Sandberg@arm.comtemplate <typename REQ, typename RSP>
299342SAndreas.Sandberg@arm.comclass tlm_transport_to_master : public sc_core::sc_module,
309342SAndreas.Sandberg@arm.com    public virtual tlm_transport_if<REQ, RSP>
319342SAndreas.Sandberg@arm.com{
329342SAndreas.Sandberg@arm.com  public:
339342SAndreas.Sandberg@arm.com    sc_core::sc_export<tlm_transport_if<REQ, RSP>> target_export;
349342SAndreas.Sandberg@arm.com    sc_core::sc_port<tlm_master_if<REQ, RSP>> master_port;
359342SAndreas.Sandberg@arm.com
369342SAndreas.Sandberg@arm.com    tlm_transport_to_master(sc_core::sc_module_name nm) :
379342SAndreas.Sandberg@arm.com        sc_core::sc_module(nm)
389342SAndreas.Sandberg@arm.com    {
399342SAndreas.Sandberg@arm.com        target_export( *this );
409342SAndreas.Sandberg@arm.com    }
4110912Sandreas.sandberg@arm.com
4211859Sandreas.hansson@arm.com    tlm_transport_to_master() :
4311859Sandreas.hansson@arm.com        sc_core::sc_module(sc_core::sc_module_name(
4410912Sandreas.sandberg@arm.com                    sc_core::sc_gen_unique_name("transport_to_master")))
4510912Sandreas.sandberg@arm.com    {
4610912Sandreas.sandberg@arm.com        target_export( *this );
479342SAndreas.Sandberg@arm.com    }
4811417Ssascha.bischoff@arm.com
499342SAndreas.Sandberg@arm.com    RSP
5010912Sandreas.sandberg@arm.com    transport(const REQ &req)
5110912Sandreas.sandberg@arm.com    {
529342SAndreas.Sandberg@arm.com        mutex.lock();
5310912Sandreas.sandberg@arm.com        master_port->put(req);
5410912Sandreas.sandberg@arm.com        rsp = master_port->get();
559342SAndreas.Sandberg@arm.com
569342SAndreas.Sandberg@arm.com        mutex.unlock();
579342SAndreas.Sandberg@arm.com        return rsp;
589342SAndreas.Sandberg@arm.com    }
599342SAndreas.Sandberg@arm.com
609342SAndreas.Sandberg@arm.com  private:
619342SAndreas.Sandberg@arm.com    sc_core::sc_mutex mutex;
6210912Sandreas.sandberg@arm.com    RSP rsp;
6310912Sandreas.sandberg@arm.com};
649342SAndreas.Sandberg@arm.com
6510912Sandreas.sandberg@arm.comtemplate <typename REQ, typename RSP>
6610912Sandreas.sandberg@arm.comclass tlm_slave_to_transport : public sc_core::sc_module
6710912Sandreas.sandberg@arm.com{
6810912Sandreas.sandberg@arm.com  public:
6910912Sandreas.sandberg@arm.com    SC_HAS_PROCESS(tlm_slave_to_transport);
7010912Sandreas.sandberg@arm.com
7110912Sandreas.sandberg@arm.com    sc_core::sc_port<tlm_slave_if<REQ, RSP>> slave_port;
7210912Sandreas.sandberg@arm.com    sc_core::sc_port<tlm_transport_if<REQ, RSP>> initiator_port;
7311417Ssascha.bischoff@arm.com
7411417Ssascha.bischoff@arm.com    tlm_slave_to_transport(sc_core::sc_module_name nm) :
7511417Ssascha.bischoff@arm.com        sc_core::sc_module(nm)
7611417Ssascha.bischoff@arm.com    {}
7711417Ssascha.bischoff@arm.com
7811417Ssascha.bischoff@arm.com    tlm_slave_to_transport() :
7911417Ssascha.bischoff@arm.com        sc_core::sc_module(sc_core::sc_module_name(
8011417Ssascha.bischoff@arm.com                    sc_core::sc_gen_unique_name("slave_to_transport")))
8111417Ssascha.bischoff@arm.com    {}
8210912Sandreas.sandberg@arm.com
8310912Sandreas.sandberg@arm.com  private:
8410912Sandreas.sandberg@arm.com    void
8510912Sandreas.sandberg@arm.com    run()
8610912Sandreas.sandberg@arm.com    {
8710912Sandreas.sandberg@arm.com        REQ req;
8810912Sandreas.sandberg@arm.com        RSP rsp;
8910912Sandreas.sandberg@arm.com
9010912Sandreas.sandberg@arm.com        while (true) {
9110912Sandreas.sandberg@arm.com            slave_port->get(req);
929342SAndreas.Sandberg@arm.com            rsp = initiator_port->transport(req);
939342SAndreas.Sandberg@arm.com            slave_port->put(rsp);
9410912Sandreas.sandberg@arm.com        }
9510912Sandreas.sandberg@arm.com    }
9610912Sandreas.sandberg@arm.com};
9710912Sandreas.sandberg@arm.com
9810912Sandreas.sandberg@arm.com} // namespace tlm
9910912Sandreas.sandberg@arm.com
10010912Sandreas.sandberg@arm.com#endif /* __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_ADAPTERS_HH__ */
10110912Sandreas.sandberg@arm.com