multi_passthrough_target_socket.h revision 13511
111784Sarthur.perais@inria.fr/*****************************************************************************
211784Sarthur.perais@inria.fr
311784Sarthur.perais@inria.fr  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
411784Sarthur.perais@inria.fr  more contributor license agreements.  See the NOTICE file distributed
511784Sarthur.perais@inria.fr  with this work for additional information regarding copyright ownership.
611784Sarthur.perais@inria.fr  Accellera licenses this file to you under the Apache License, Version 2.0
711784Sarthur.perais@inria.fr  (the "License"); you may not use this file except in compliance with the
811784Sarthur.perais@inria.fr  License.  You may obtain a copy of the License at
911784Sarthur.perais@inria.fr
1011784Sarthur.perais@inria.fr    http://www.apache.org/licenses/LICENSE-2.0
1111784Sarthur.perais@inria.fr
1211784Sarthur.perais@inria.fr  Unless required by applicable law or agreed to in writing, software
1311784Sarthur.perais@inria.fr  distributed under the License is distributed on an "AS IS" BASIS,
1411784Sarthur.perais@inria.fr  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1511784Sarthur.perais@inria.fr  implied.  See the License for the specific language governing
1611784Sarthur.perais@inria.fr  permissions and limitations under the License.
1711784Sarthur.perais@inria.fr
1811784Sarthur.perais@inria.fr *****************************************************************************/
1911784Sarthur.perais@inria.fr#ifndef TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
2011784Sarthur.perais@inria.fr#define TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
2111784Sarthur.perais@inria.fr
2211784Sarthur.perais@inria.fr#include "tlm_utils/multi_socket_bases.h"
2311784Sarthur.perais@inria.fr
2411784Sarthur.perais@inria.frnamespace tlm_utils {
2511784Sarthur.perais@inria.fr
2611784Sarthur.perais@inria.fr/*
2711784Sarthur.perais@inria.frThis class implements a trivial multi target socket.
2811784Sarthur.perais@inria.frThe triviality refers to the fact that the socket does not
2911784Sarthur.perais@inria.frdo blocking to non-blocking or non-blocking to blocking conversions.
3011784Sarthur.perais@inria.fr
3111784Sarthur.perais@inria.frIt allows to connect multiple initiators to this socket.
3211784Sarthur.perais@inria.frThe user has to register callbacks for the fw interface methods
3311784Sarthur.perais@inria.frhe likes to use. The callbacks are basically equal to the fw interface
3411784Sarthur.perais@inria.frmethods but carry an additional integer that indicates to which
3511784Sarthur.perais@inria.frindex of this socket the calling initiator is connected.
3611784Sarthur.perais@inria.fr*/
3711784Sarthur.perais@inria.frtemplate <typename MODULE,
3811784Sarthur.perais@inria.fr          unsigned int BUSWIDTH = 32,
3911784Sarthur.perais@inria.fr          typename TYPES = tlm::tlm_base_protocol_types,
4011784Sarthur.perais@inria.fr          unsigned int N=0,
4111784Sarthur.perais@inria.fr          sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
4211784Sarthur.perais@inria.frclass multi_passthrough_target_socket
4311784Sarthur.perais@inria.fr  : public multi_target_base< BUSWIDTH, TYPES, N, POL>
4412334Sgabeblack@google.com  , public multi_to_multi_bind_base<TYPES>
4511784Sarthur.perais@inria.fr{
4611784Sarthur.perais@inria.fr
4711784Sarthur.perais@inria.frpublic:
4811784Sarthur.perais@inria.fr
4911784Sarthur.perais@inria.fr  //typedefs
5011784Sarthur.perais@inria.fr  //  tlm 2.0 types for nb_transport
5111784Sarthur.perais@inria.fr  typedef typename TYPES::tlm_payload_type              transaction_type;
5211784Sarthur.perais@inria.fr  typedef typename TYPES::tlm_phase_type                phase_type;
5311784Sarthur.perais@inria.fr  typedef tlm::tlm_sync_enum                            sync_enum_type;
5411784Sarthur.perais@inria.fr
5511784Sarthur.perais@inria.fr  //  typedefs to keep the fn ptr notations short
5611784Sarthur.perais@inria.fr  typedef sync_enum_type (MODULE::*nb_cb)(int, transaction_type&, phase_type&, sc_core::sc_time&);
5711784Sarthur.perais@inria.fr  typedef void (MODULE::*b_cb)(int, transaction_type&, sc_core::sc_time&);
5811784Sarthur.perais@inria.fr  typedef unsigned int (MODULE::*dbg_cb)(int, transaction_type& txn);
5911784Sarthur.perais@inria.fr  typedef bool (MODULE::*dmi_cb)(int, transaction_type& txn, tlm::tlm_dmi& dmi);
6011784Sarthur.perais@inria.fr
6111784Sarthur.perais@inria.fr  typedef multi_target_base<BUSWIDTH, TYPES, N, POL> base_type;
6211784Sarthur.perais@inria.fr
6311784Sarthur.perais@inria.fr  typedef typename base_type::base_initiator_socket_type base_initiator_socket_type;
6411784Sarthur.perais@inria.fr
6511784Sarthur.perais@inria.fr  static const char* default_name()
6611784Sarthur.perais@inria.fr    { return sc_core::sc_gen_unique_name("multi_passthrough_target_socket"); }
6711784Sarthur.perais@inria.fr
6811784Sarthur.perais@inria.fr  //CTOR
6911784Sarthur.perais@inria.fr  explicit multi_passthrough_target_socket(const char* name = default_name())
7011784Sarthur.perais@inria.fr      : base_type(name)
7111784Sarthur.perais@inria.fr      , m_hierarch_bind(0)
7211784Sarthur.perais@inria.fr      , m_eoe_disabled(false)
7311784Sarthur.perais@inria.fr      , m_export_callback_created(false)
7411784Sarthur.perais@inria.fr  {
7511784Sarthur.perais@inria.fr  }
7611784Sarthur.perais@inria.fr
7711784Sarthur.perais@inria.fr  ~multi_passthrough_target_socket(){
7811784Sarthur.perais@inria.fr    //clean up everything allocated by 'new'
7911784Sarthur.perais@inria.fr    for (unsigned int i=0; i<m_binders.size(); i++) delete m_binders[i];
8011784Sarthur.perais@inria.fr  }
8111784Sarthur.perais@inria.fr
8211784Sarthur.perais@inria.fr  void check_export_binding()
8311784Sarthur.perais@inria.fr  {
8411784Sarthur.perais@inria.fr    //if our export hasn't been bound yet (due to a hierarch binding)
8511784Sarthur.perais@inria.fr    //  we bind it now.
8611784Sarthur.perais@inria.fr    //We do that here as the user of the target port HAS to bind at least on callback,
8711784Sarthur.perais@inria.fr    //otherwise the socket was useless. Nevertheless, the target socket may still
8811784Sarthur.perais@inria.fr    // stay unbound afterwards.
8911784Sarthur.perais@inria.fr    if (!sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >::get_interface())
9011784Sarthur.perais@inria.fr    {
9111784Sarthur.perais@inria.fr      // We bind to a callback_binder that will be used as the first interface
9211784Sarthur.perais@inria.fr      // i.e. calls to the sc_export will have the same ID as calls from the first initator
9311784Sarthur.perais@inria.fr      // socket bound
9411784Sarthur.perais@inria.fr      callback_binder_fw<TYPES> * binder;
9511784Sarthur.perais@inria.fr
9611784Sarthur.perais@inria.fr      if (m_binders.size() == 0)
9711784Sarthur.perais@inria.fr      {
9811784Sarthur.perais@inria.fr        binder = new callback_binder_fw<TYPES>(this, m_binders.size());
9911784Sarthur.perais@inria.fr        m_binders.push_back(binder);
10011784Sarthur.perais@inria.fr        m_export_callback_created = true;
10111784Sarthur.perais@inria.fr      }
10211784Sarthur.perais@inria.fr      else
10311784Sarthur.perais@inria.fr      {
10411784Sarthur.perais@inria.fr        binder = m_binders[0];
10511784Sarthur.perais@inria.fr      }
10611784Sarthur.perais@inria.fr
10711784Sarthur.perais@inria.fr      sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >::bind(*binder);
10811784Sarthur.perais@inria.fr    }
10911784Sarthur.perais@inria.fr  }
11011784Sarthur.perais@inria.fr
11111784Sarthur.perais@inria.fr  //register callback for nb transport of fw interface
11211784Sarthur.perais@inria.fr  void register_nb_transport_fw(MODULE* mod,
11311784Sarthur.perais@inria.fr                              nb_cb cb)
11411784Sarthur.perais@inria.fr  {
11511784Sarthur.perais@inria.fr    check_export_binding();
11611784Sarthur.perais@inria.fr
11711784Sarthur.perais@inria.fr    //warn if there already is a callback
11811784Sarthur.perais@inria.fr    if (m_nb_f.is_valid()){
11911784Sarthur.perais@inria.fr      display_warning("NBTransport_bw callback already registered.");
12011784Sarthur.perais@inria.fr      return;
12111784Sarthur.perais@inria.fr    }
12211784Sarthur.perais@inria.fr
12311784Sarthur.perais@inria.fr    //set the functor
12411784Sarthur.perais@inria.fr    m_nb_f.set_function(mod, cb);
12511784Sarthur.perais@inria.fr  }
12611784Sarthur.perais@inria.fr
12711784Sarthur.perais@inria.fr  //register callback for b transport of fw interface
12811784Sarthur.perais@inria.fr  void register_b_transport(MODULE* mod,
12911784Sarthur.perais@inria.fr                              b_cb cb)
13011784Sarthur.perais@inria.fr  {
13111784Sarthur.perais@inria.fr    check_export_binding();
13211784Sarthur.perais@inria.fr
13311784Sarthur.perais@inria.fr    //warn if there already is a callback
13411784Sarthur.perais@inria.fr    if (m_b_f.is_valid()){
13511784Sarthur.perais@inria.fr      display_warning("BTransport callback already registered.");
13611784Sarthur.perais@inria.fr      return;
13711784Sarthur.perais@inria.fr    }
13811784Sarthur.perais@inria.fr
13911784Sarthur.perais@inria.fr    //set the functor
14011784Sarthur.perais@inria.fr    m_b_f.set_function(mod, cb);
14111784Sarthur.perais@inria.fr  }
14211784Sarthur.perais@inria.fr
14311784Sarthur.perais@inria.fr  //register callback for debug transport of fw interface
14411784Sarthur.perais@inria.fr  void register_transport_dbg(MODULE* mod,
14511784Sarthur.perais@inria.fr                              dbg_cb cb)
14611784Sarthur.perais@inria.fr  {
14711784Sarthur.perais@inria.fr    check_export_binding();
14811784Sarthur.perais@inria.fr
14911784Sarthur.perais@inria.fr    //warn if there already is a callback
15011784Sarthur.perais@inria.fr    if (m_dbg_f.is_valid()){
15111784Sarthur.perais@inria.fr      display_warning("DebugTransport callback already registered.");
15211784Sarthur.perais@inria.fr      return;
15311784Sarthur.perais@inria.fr    }
15411784Sarthur.perais@inria.fr
15511784Sarthur.perais@inria.fr    //set the functor
15611784Sarthur.perais@inria.fr    m_dbg_f.set_function(mod, cb);
15711784Sarthur.perais@inria.fr  }
15811784Sarthur.perais@inria.fr
15911784Sarthur.perais@inria.fr  //register callback for DMI of fw interface
16011784Sarthur.perais@inria.fr  void register_get_direct_mem_ptr(MODULE* mod,
16111784Sarthur.perais@inria.fr                                   dmi_cb cb)
16211784Sarthur.perais@inria.fr  {
16311784Sarthur.perais@inria.fr    check_export_binding();
16411784Sarthur.perais@inria.fr
16511784Sarthur.perais@inria.fr    //warn if there already is a callback
16611784Sarthur.perais@inria.fr    if (m_dmi_f.is_valid()){
16711784Sarthur.perais@inria.fr      display_warning("DMI callback already registered.");
16811784Sarthur.perais@inria.fr      return;
16911784Sarthur.perais@inria.fr    }
17011784Sarthur.perais@inria.fr
17111784Sarthur.perais@inria.fr    //set the functor
17211784Sarthur.perais@inria.fr    m_dmi_f.set_function(mod, cb);
17311784Sarthur.perais@inria.fr  }
17411784Sarthur.perais@inria.fr
17511784Sarthur.perais@inria.fr
17611784Sarthur.perais@inria.fr  //Override virtual functions of the tlm_target_socket:
17711784Sarthur.perais@inria.fr  // this function is called whenever an sc_port (as part of a init socket)
17811784Sarthur.perais@inria.fr  //  wants to bind to the export of the underlying tlm_target_socket
17911784Sarthur.perais@inria.fr  //At this time a callback binder is created an returned to the sc_port
18011784Sarthur.perais@inria.fr  // of the init socket, so that it binds to the callback binder
18111784Sarthur.perais@inria.fr  virtual tlm::tlm_fw_transport_if<TYPES>& get_base_interface()
18211784Sarthur.perais@inria.fr  {
18311784Sarthur.perais@inria.fr    //error if this socket is already bound hierarchically
18411784Sarthur.perais@inria.fr    if (m_hierarch_bind) display_error("Socket already bound hierarchically.");
18511784Sarthur.perais@inria.fr
18611784Sarthur.perais@inria.fr    if (m_export_callback_created) {
18711784Sarthur.perais@inria.fr      // consume binder created from the callback registration
18811784Sarthur.perais@inria.fr      m_export_callback_created = false;
18911784Sarthur.perais@inria.fr    } else {
19011784Sarthur.perais@inria.fr      m_binders.push_back(new callback_binder_fw<TYPES>(this, m_binders.size()));
19111784Sarthur.perais@inria.fr    }
19211784Sarthur.perais@inria.fr
19311784Sarthur.perais@inria.fr    return *m_binders[m_binders.size()-1];
19411784Sarthur.perais@inria.fr  }
19511784Sarthur.perais@inria.fr
19611784Sarthur.perais@inria.fr  // const overload not allowed for multi-sockets
19711784Sarthur.perais@inria.fr  virtual const tlm::tlm_fw_transport_if<TYPES>& get_base_interface() const
19811784Sarthur.perais@inria.fr  {
19911784Sarthur.perais@inria.fr    display_error("'get_base_interface() const' not allowed for multi-sockets.");
20011784Sarthur.perais@inria.fr    return base_type::get_base_interface();
20111784Sarthur.perais@inria.fr  }
20211784Sarthur.perais@inria.fr
20311784Sarthur.perais@inria.fr  //just return the export of the underlying tlm_target_socket in case of a hierarchical bind
20411784Sarthur.perais@inria.fr  virtual sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& get_base_export()
20511784Sarthur.perais@inria.fr  {
20611784Sarthur.perais@inria.fr    return *this;
20711784Sarthur.perais@inria.fr  }
20811784Sarthur.perais@inria.fr
20911784Sarthur.perais@inria.fr  //just return the export of the underlying tlm_target_socket in case of a hierarchical bind
21011784Sarthur.perais@inria.fr  virtual const sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& get_base_export() const
21111784Sarthur.perais@inria.fr  {
21211784Sarthur.perais@inria.fr    return base_type::get_base_export();
21311784Sarthur.perais@inria.fr  }
21411784Sarthur.perais@inria.fr
21511784Sarthur.perais@inria.fr  //the standard end of elaboration callback
21611784Sarthur.perais@inria.fr  void end_of_elaboration(){
21711784Sarthur.perais@inria.fr    //'break' here if the socket was told not to do callback binding
21811784Sarthur.perais@inria.fr    if (m_eoe_disabled) return;
21911784Sarthur.perais@inria.fr
22011784Sarthur.perais@inria.fr    //get the callback binders and the multi binds of the top of the hierachical bind chain
22111784Sarthur.perais@inria.fr    // NOTE: this could be the same socket if there is no hierachical bind
22211784Sarthur.perais@inria.fr    std::vector<callback_binder_fw<TYPES>* >& binders=get_hierarch_bind()->get_binders();
22311784Sarthur.perais@inria.fr    std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>&  multi_binds=get_hierarch_bind()->get_multi_binds();
22411784Sarthur.perais@inria.fr
22511784Sarthur.perais@inria.fr    // complete binding only if there has been a real bind
22611784Sarthur.perais@inria.fr    bool unbound = (binders.size() == 1 && m_export_callback_created);
22711784Sarthur.perais@inria.fr    // no call to get_base_interface has consumed the export - ignore
22811784Sarthur.perais@inria.fr    if (unbound) return;
22911784Sarthur.perais@inria.fr
23011784Sarthur.perais@inria.fr    // iterate over all binders
23111784Sarthur.perais@inria.fr    for (unsigned int i=0; i<binders.size(); i++) {
23211784Sarthur.perais@inria.fr      binders[i]->set_callbacks(m_nb_f, m_b_f, m_dmi_f, m_dbg_f); //set the callbacks for the binder
23311784Sarthur.perais@inria.fr      if (multi_binds.find(i)!=multi_binds.end()) //check if this connection is multi-multi
23411784Sarthur.perais@inria.fr        //if so remember the interface
23511784Sarthur.perais@inria.fr        m_sockets.push_back(multi_binds[i]);
23611784Sarthur.perais@inria.fr      else{ //if we are bound to a normal socket
23711784Sarthur.perais@inria.fr        //get the calling port and try to cast it into a tlm socket base
23811784Sarthur.perais@inria.fr        base_initiator_socket_type* test=dynamic_cast<base_initiator_socket_type*>(binders[i]->get_other_side());
23911784Sarthur.perais@inria.fr        if (!test){display_error("Not bound to tlm_socket.");}
24011784Sarthur.perais@inria.fr        m_sockets.push_back(&test->get_base_interface()); //remember the interface
24111784Sarthur.perais@inria.fr      }
24211784Sarthur.perais@inria.fr    }
24311784Sarthur.perais@inria.fr  }
24411784Sarthur.perais@inria.fr
24511784Sarthur.perais@inria.fr  //
24611784Sarthur.perais@inria.fr  // Bind multi target socket to multi target socket (hierarchical bind)
24711784Sarthur.perais@inria.fr  //
24811784Sarthur.perais@inria.fr  virtual void bind(base_type& s)
24911784Sarthur.perais@inria.fr  {
25011784Sarthur.perais@inria.fr    //warn if already bound hierarchically
25111784Sarthur.perais@inria.fr    if (m_eoe_disabled){
25211784Sarthur.perais@inria.fr      display_warning("Socket already bound hierarchically. Bind attempt ignored.");
25311784Sarthur.perais@inria.fr      return;
25411784Sarthur.perais@inria.fr    }
25511784Sarthur.perais@inria.fr
25611784Sarthur.perais@inria.fr    //disable our own end of elaboration call
25711784Sarthur.perais@inria.fr    disable_cb_bind();
25811784Sarthur.perais@inria.fr
25911784Sarthur.perais@inria.fr    //inform the bound target socket that it is bound hierarchically now
26011784Sarthur.perais@inria.fr    s.set_hierarch_bind((base_type*)this);
26111784Sarthur.perais@inria.fr    base_type::bind(s); //satisfy SystemC
26211784Sarthur.perais@inria.fr  }
26311784Sarthur.perais@inria.fr
26411784Sarthur.perais@inria.fr  //operator notation for hierarchical bind
26511784Sarthur.perais@inria.fr  void operator() (base_type& s)
26611784Sarthur.perais@inria.fr  {
26711784Sarthur.perais@inria.fr    bind(s);
26811784Sarthur.perais@inria.fr  }
26911784Sarthur.perais@inria.fr
27011784Sarthur.perais@inria.fr  //get access to sub port
27111784Sarthur.perais@inria.fr  tlm::tlm_bw_transport_if<TYPES>* operator[](int i){return m_sockets[i];}
27211784Sarthur.perais@inria.fr
27311784Sarthur.perais@inria.fr  //get number of bound initiators
27411784Sarthur.perais@inria.fr  // NOTE: this is only valid at end of elaboration!
27511784Sarthur.perais@inria.fr  unsigned int size(){return get_hierarch_bind()->get_binders().size();}
27611784Sarthur.perais@inria.fr
27711784Sarthur.perais@inria.frprotected:
27811784Sarthur.perais@inria.fr  using base_type::display_warning;
27911784Sarthur.perais@inria.fr  using base_type::display_error;
28011784Sarthur.perais@inria.fr
28111784Sarthur.perais@inria.fr  //implementation of base class interface
28211784Sarthur.perais@inria.fr  base_type* get_hierarch_bind(){if (m_hierarch_bind) return m_hierarch_bind->get_hierarch_bind(); else return this;}
28311784Sarthur.perais@inria.fr  std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>&  get_multi_binds(){return m_multi_binds;}
28411784Sarthur.perais@inria.fr  void set_hierarch_bind(base_type* h){m_hierarch_bind=h;}
28511784Sarthur.perais@inria.fr  tlm::tlm_fw_transport_if<TYPES>* get_last_binder(tlm::tlm_bw_transport_if<TYPES>* other){
28611784Sarthur.perais@inria.fr    m_multi_binds[m_binders.size()-1]=other;
28711784Sarthur.perais@inria.fr    return m_binders[m_binders.size()-1];
28811784Sarthur.perais@inria.fr  }
28911784Sarthur.perais@inria.fr
29011784Sarthur.perais@inria.fr  //map that stores to which index a multi init socket is connected
29111784Sarthur.perais@inria.fr  // and the interface of the multi init socket
29211784Sarthur.perais@inria.fr  std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*> m_multi_binds;
29311784Sarthur.perais@inria.fr
29411784Sarthur.perais@inria.fr  void disable_cb_bind(){ m_eoe_disabled=true;}
29511784Sarthur.perais@inria.fr  std::vector<callback_binder_fw<TYPES>* >& get_binders(){return m_binders;}
29611784Sarthur.perais@inria.fr  //vector of connected sockets
29711784Sarthur.perais@inria.fr  std::vector<tlm::tlm_bw_transport_if<TYPES>*> m_sockets;
29811784Sarthur.perais@inria.fr  //vector of binders that convert untagged interface into tagged interface
29911784Sarthur.perais@inria.fr  std::vector<callback_binder_fw<TYPES>*> m_binders;
30011784Sarthur.perais@inria.fr
30111784Sarthur.perais@inria.fr  base_type*  m_hierarch_bind; //pointer to hierarchical bound multi port
30211784Sarthur.perais@inria.fr  bool m_eoe_disabled; //bool that disables callback bindings at end of elaboration
30311784Sarthur.perais@inria.fr  bool m_export_callback_created; //bool that indicates that a binder has been created from a callback registration
30411784Sarthur.perais@inria.fr
30511784Sarthur.perais@inria.fr  //callbacks as functors
30611784Sarthur.perais@inria.fr  // (allows to pass the callback to another socket that does not know the type of the module that owns
30711784Sarthur.perais@inria.fr  //  the callbacks)
30811784Sarthur.perais@inria.fr  typename callback_binder_fw<TYPES>::nb_func_type    m_nb_f;
30911784Sarthur.perais@inria.fr  typename callback_binder_fw<TYPES>::b_func_type     m_b_f;
31011784Sarthur.perais@inria.fr  typename callback_binder_fw<TYPES>::debug_func_type m_dbg_f;
31111784Sarthur.perais@inria.fr  typename callback_binder_fw<TYPES>::dmi_func_type   m_dmi_f;
31211784Sarthur.perais@inria.fr};
31311784Sarthur.perais@inria.fr
31411784Sarthur.perais@inria.frtemplate <typename MODULE,
31511784Sarthur.perais@inria.fr          unsigned int BUSWIDTH = 32,
31611784Sarthur.perais@inria.fr          typename TYPES = tlm::tlm_base_protocol_types,
31711784Sarthur.perais@inria.fr          unsigned int N=0>
31811784Sarthur.perais@inria.frclass multi_passthrough_target_socket_optional
31911784Sarthur.perais@inria.fr  : public multi_passthrough_target_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND>
32011784Sarthur.perais@inria.fr{
32111784Sarthur.perais@inria.fr  typedef multi_passthrough_target_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
32211784Sarthur.perais@inria.frpublic:
32311784Sarthur.perais@inria.fr  multi_passthrough_target_socket_optional() : socket_b() {}
32411784Sarthur.perais@inria.fr  explicit multi_passthrough_target_socket_optional(const char* name) : socket_b(name) {}
32511784Sarthur.perais@inria.fr};
32611784Sarthur.perais@inria.fr
32711784Sarthur.perais@inria.fr} // namespace tlm_utils
32811784Sarthur.perais@inria.fr#endif // TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
32911784Sarthur.perais@inria.fr