diff options
Diffstat (limited to 'src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h')
-rw-r--r-- | src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h new file mode 100644 index 000000000..e821573b9 --- /dev/null +++ b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h @@ -0,0 +1,115 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +#ifndef \ + __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__ +#define \ + __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__ + +#include "tlm_core/1/req_rsp/interfaces/master_slave_ifs.h" + +namespace tlm +{ + +template <typename PUT_DATA, typename GET_DATA> +class tlm_put_get_imp : private virtual tlm_put_if<PUT_DATA>, + private virtual tlm_get_peek_if<GET_DATA> +{ + public: + tlm_put_get_imp(tlm_put_if<PUT_DATA> &p, tlm_get_peek_if<GET_DATA> &g) : + put_fifo(p), get_fifo(g) + {} + + // Put interface. + void put(const PUT_DATA &t) { put_fifo.put(t); } + bool nb_put(const PUT_DATA &t) { return put_fifo.nb_put(t); } + bool + nb_can_put(tlm_tag<PUT_DATA> *t=nullptr) const + { + return put_fifo.nb_can_put(t); + } + const sc_core::sc_event & + ok_to_put(tlm_tag<PUT_DATA> *t=nullptr) const + { + return put_fifo.ok_to_put(t); + } + + // Get interface. + GET_DATA get(tlm_tag<GET_DATA> * =nullptr) { return get_fifo.get(); } + bool nb_get(GET_DATA &t) { return get_fifo.nb_get(t); } + bool + nb_can_get(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.nb_can_get(t); + } + + virtual const sc_core::sc_event & + ok_to_get(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.ok_to_get(t); + } + + // Peek interface. + GET_DATA + peek(tlm_tag<GET_DATA> * =nullptr) const + { + return get_fifo.peek(); + } + bool nb_peek(GET_DATA &t) const { return get_fifo.nb_peek(t); } + bool + nb_can_peek(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.nb_can_peek(t); + } + + virtual const sc_core::sc_event & + ok_to_peek(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.ok_to_peek(t); + } + + private: + tlm_put_if<PUT_DATA> &put_fifo; + tlm_get_peek_if<GET_DATA> &get_fifo; +}; + +template <typename REQ, typename RSP> +class tlm_master_imp : private tlm_put_get_imp<REQ, RSP>, + public virtual tlm_master_if<REQ, RSP> +{ + public: + tlm_master_imp(tlm_put_if<REQ> &req, tlm_get_peek_if<RSP> &rsp) : + tlm_put_get_imp<REQ, RSP>(req, rsp) + {} +}; + +template <typename REQ, typename RSP> +class tlm_slave_imp : private tlm_put_get_imp<RSP, REQ>, + public virtual tlm_slave_if<REQ, RSP> +{ + public: + tlm_slave_imp(tlm_get_peek_if<REQ> &req, tlm_put_if<RSP> &rsp) : + tlm_put_get_imp<RSP, REQ>(rsp, req) + {} +}; + +} // namespace tlm + +#endif +/* __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__*/ |