112855Sgabeblack@google.com/*****************************************************************************
212855Sgabeblack@google.com
312855Sgabeblack@google.com  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412855Sgabeblack@google.com  more contributor license agreements.  See the NOTICE file distributed
512855Sgabeblack@google.com  with this work for additional information regarding copyright ownership.
612855Sgabeblack@google.com  Accellera licenses this file to you under the Apache License, Version 2.0
712855Sgabeblack@google.com  (the "License"); you may not use this file except in compliance with the
812855Sgabeblack@google.com  License.  You may obtain a copy of the License at
912855Sgabeblack@google.com
1012855Sgabeblack@google.com    http://www.apache.org/licenses/LICENSE-2.0
1112855Sgabeblack@google.com
1212855Sgabeblack@google.com  Unless required by applicable law or agreed to in writing, software
1312855Sgabeblack@google.com  distributed under the License is distributed on an "AS IS" BASIS,
1412855Sgabeblack@google.com  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512855Sgabeblack@google.com  implied.  See the License for the specific language governing
1612855Sgabeblack@google.com  permissions and limitations under the License.
1712855Sgabeblack@google.com
1812855Sgabeblack@google.com *****************************************************************************/
1912855Sgabeblack@google.com
2012855Sgabeblack@google.com#ifndef __SIMPLESWITCHAT_H__
2112855Sgabeblack@google.com#define __SIMPLESWITCHAT_H__
2212855Sgabeblack@google.com
2312855Sgabeblack@google.com#include "tlm.h"
2412855Sgabeblack@google.com
2512855Sgabeblack@google.com#include "tlm_utils/multi_passthrough_initiator_socket.h"
2612855Sgabeblack@google.com#include "tlm_utils/multi_passthrough_target_socket.h"
2712855Sgabeblack@google.com#include "simpleAddressMap.h"
2812855Sgabeblack@google.com#include "extensionPool.h"
2912855Sgabeblack@google.com#include "tlm_utils/instance_specific_extensions.h"
3012855Sgabeblack@google.com#include "tlm_utils/peq_with_cb_and_phase.h"
3112855Sgabeblack@google.com
3212855Sgabeblack@google.com
3312855Sgabeblack@google.com/*
3412855Sgabeblack@google.comThis class is a simple crossbar switch through which an arbitrary number of initiators
3512855Sgabeblack@google.commay communicate in parallel as long as they do not talk to the same target.
3612855Sgabeblack@google.com
3712855Sgabeblack@google.comIf two masters address the same target at the same point of time,
3812855Sgabeblack@google.comthe choice who will be allowed to communicate
3912855Sgabeblack@google.comis done non-deterministically (based on the SystemC process exectution order).
4012855Sgabeblack@google.com
4112855Sgabeblack@google.comThis could be avoided by changing the fwPEQ into a priority PEQ of some kind.
4212855Sgabeblack@google.com
4312855Sgabeblack@google.comThe switch ensures that the end_req and end_resp rules are not violated when
4412855Sgabeblack@google.commany initiator talk to the same target.
4512855Sgabeblack@google.com*/
4612855Sgabeblack@google.comclass MultiSocketSimpleSwitchAT : public sc_core::sc_module, public tlm::tlm_mm_interface
4712855Sgabeblack@google.com{
4812855Sgabeblack@google.compublic:
4912855Sgabeblack@google.com  typedef tlm::tlm_generic_payload                                 transaction_type;
5012855Sgabeblack@google.com  typedef tlm::tlm_phase                                           phase_type;
5112855Sgabeblack@google.com  typedef tlm::tlm_sync_enum                                       sync_enum_type;
5212855Sgabeblack@google.com  typedef tlm_utils::multi_passthrough_target_socket<MultiSocketSimpleSwitchAT>    target_socket_type;
5312855Sgabeblack@google.com  typedef tlm_utils::multi_passthrough_initiator_socket<MultiSocketSimpleSwitchAT> initiator_socket_type;
5412855Sgabeblack@google.com
5512855Sgabeblack@google.compublic:
5612855Sgabeblack@google.com  target_socket_type target_socket; //the target multi socket
5712855Sgabeblack@google.com
5812855Sgabeblack@google.comprivate:
5912855Sgabeblack@google.com  initiator_socket_type initiator_socket; //the initiator multi socket (private to enforce use of bindTarget function)
6012855Sgabeblack@google.com  SimpleAddressMap m_addrMap; //a pretty simple address map
6112855Sgabeblack@google.com  std::vector<std::deque<transaction_type*> > m_pendingReqs; //list of pending reqs per target
6212855Sgabeblack@google.com  std::vector<std::deque<transaction_type*> > m_pendingResps; //list of pending resps per initiator
6312855Sgabeblack@google.com  std::vector<sc_dt::uint64> m_masks; //address masks for each target
6412855Sgabeblack@google.com  tlm_utils::instance_specific_extension_accessor accessMySpecificExtensions; //extension accessor to access private extensions
6512855Sgabeblack@google.com  tlm_utils::peq_with_cb_and_phase<MultiSocketSimpleSwitchAT> m_bwPEQ; //PEQ in the fw direction
6612855Sgabeblack@google.com  tlm_utils::peq_with_cb_and_phase<MultiSocketSimpleSwitchAT> m_fwPEQ; //PEQ in the bw direction
6712855Sgabeblack@google.com
6812855Sgabeblack@google.com
6912855Sgabeblack@google.com  //an instance specific extension that tells us whether we are in a wrapped b_transport or not
7012855Sgabeblack@google.com  class BTag : public tlm_utils::instance_specific_extension<BTag>{
7112855Sgabeblack@google.com  public:
7212855Sgabeblack@google.com    sc_core::sc_event event; //trigger this event when transaction is done
7312855Sgabeblack@google.com  };
7412855Sgabeblack@google.com
7512855Sgabeblack@google.com  //an instance specific extension that holds information about source and sink of a txn
7612855Sgabeblack@google.com  // as well as information if the req still has to be cleared and if the txn is already
7712855Sgabeblack@google.com  //  complete on the target side
7812855Sgabeblack@google.com  class ConnectionInfo : public tlm_utils::instance_specific_extension<ConnectionInfo>{
7912855Sgabeblack@google.com    public:
8012855Sgabeblack@google.com    unsigned int  fwID; //socket number of sink
8112855Sgabeblack@google.com    unsigned int  bwID; //socket number of source
8212855Sgabeblack@google.com    bool clearReq;      //is the txn still in req phase?
8312855Sgabeblack@google.com    bool alreadyComplete; //has the txn already completed on the target side?
8412855Sgabeblack@google.com  };
8512855Sgabeblack@google.com
8612855Sgabeblack@google.com  class internalPEQTypes{ //use the tpPEQ to delay connection infos
8712855Sgabeblack@google.com    public:
8812855Sgabeblack@google.com    typedef ConnectionInfo tlm_payload_type;
8912855Sgabeblack@google.com    typedef tlm::tlm_phase tlm_phase_type;
9012855Sgabeblack@google.com  };
9112855Sgabeblack@google.com  ExtensionPool<ConnectionInfo> m_connInfoPool; //our pool of extensions
9212855Sgabeblack@google.com  unsigned int m_target_count;  //number of connected targets (see bindTargetSocket for explanation)
9312855Sgabeblack@google.com
9412855Sgabeblack@google.compublic:
9512855Sgabeblack@google.com  SC_HAS_PROCESS(MultiSocketSimpleSwitchAT);
9612855Sgabeblack@google.com  MultiSocketSimpleSwitchAT(sc_core::sc_module_name name) :
9712855Sgabeblack@google.com    sc_core::sc_module(name),
9812855Sgabeblack@google.com    target_socket("target_socket"),
9912855Sgabeblack@google.com    initiator_socket("initiator_socket"),
10012855Sgabeblack@google.com    m_bwPEQ(this, &MultiSocketSimpleSwitchAT::bwPEQcb),
10112855Sgabeblack@google.com    m_fwPEQ(this, &MultiSocketSimpleSwitchAT::fwPEQcb),
10212855Sgabeblack@google.com    m_connInfoPool(10),
10312855Sgabeblack@google.com    m_target_count(0)
10412855Sgabeblack@google.com  {
10512855Sgabeblack@google.com    target_socket.register_nb_transport_fw(this, &MultiSocketSimpleSwitchAT::initiatorNBTransport);
10612855Sgabeblack@google.com    target_socket.register_b_transport(this, &MultiSocketSimpleSwitchAT::b_transport);
10712855Sgabeblack@google.com    initiator_socket.register_nb_transport_bw(this, &MultiSocketSimpleSwitchAT::targetNBTransport);
10812855Sgabeblack@google.com  }
10912855Sgabeblack@google.com
11012855Sgabeblack@google.com  void bindTargetSocket(initiator_socket_type::base_target_socket_type& target
11112855Sgabeblack@google.com                       ,sc_dt::uint64 low
11212855Sgabeblack@google.com                       ,sc_dt::uint64 high
11312855Sgabeblack@google.com                       ,sc_dt::uint64 mask = 0xffffffffffffffffULL){
11412855Sgabeblack@google.com    initiator_socket(target); //bind sockets
11512855Sgabeblack@google.com    //insert into address map and increase target count
11612855Sgabeblack@google.com    // (we have to count the targets manually, because target_socket.size() is only reliable during simulation
11712855Sgabeblack@google.com    //  as it gets evaluated during end_of_elaboration)
11812855Sgabeblack@google.com    m_addrMap.insert(low, high, m_target_count++);
11912855Sgabeblack@google.com    m_masks.push_back(mask); //add the mask for this target
12012855Sgabeblack@google.com  }
12112855Sgabeblack@google.com
12212855Sgabeblack@google.com  unsigned int decode(const sc_dt::uint64& address)
12312855Sgabeblack@google.com  {
12412855Sgabeblack@google.com    return m_addrMap.decode(address);
12512855Sgabeblack@google.com  }
12612855Sgabeblack@google.com
12712855Sgabeblack@google.com  void start_of_simulation(){
12812855Sgabeblack@google.com    //initialize the lists of pending reqs and resps
12912855Sgabeblack@google.com    m_pendingReqs.resize(initiator_socket.size());
13012855Sgabeblack@google.com    m_pendingResps.resize(target_socket.size());
13112855Sgabeblack@google.com  }
13212855Sgabeblack@google.com
13312855Sgabeblack@google.com
13412855Sgabeblack@google.com  void b_transport(int initiator_id, transaction_type& trans, sc_core::sc_time& t){
13512855Sgabeblack@google.com    //first make sure that there is no BTag (just for debugging)
13612855Sgabeblack@google.com    BTag* btag;
13712855Sgabeblack@google.com    accessMySpecificExtensions(trans).get_extension(btag);
13812855Sgabeblack@google.com    sc_assert(!btag);
13912855Sgabeblack@google.com    BTag tag; //now add our BTag
14012855Sgabeblack@google.com    bool added_mm=!trans.has_mm(); //in case there is no MM in we add it now
14112855Sgabeblack@google.com    if (added_mm){
14212855Sgabeblack@google.com      trans.set_mm(this);
14312855Sgabeblack@google.com      trans.acquire(); //acquire the txn
14412855Sgabeblack@google.com    }
14512855Sgabeblack@google.com    accessMySpecificExtensions(trans).set_extension(&tag);
14612855Sgabeblack@google.com    phase_type phase=tlm::BEGIN_REQ; //then simply use our nb implementation (respects all the rules)
14712855Sgabeblack@google.com    initiatorNBTransport(initiator_id, trans, phase, t);
14812855Sgabeblack@google.com    wait(tag.event); //and wait for the event to be triggered
14912855Sgabeblack@google.com    if (added_mm){  //if we added MM
15012855Sgabeblack@google.com      trans.release(); //we release our reference (this will not delete the txn but trigger the tag.event as soon as the ref count is zero)
15112855Sgabeblack@google.com      if (trans.get_ref_count())
15212855Sgabeblack@google.com        wait(tag.event); //wait for the ref count to get to zero
15312855Sgabeblack@google.com      trans.set_mm(NULL); //remove the MM
15412855Sgabeblack@google.com    }
15512855Sgabeblack@google.com    //don't forget to remove the extension (instance specific extensions are not cleared off by MM)
15612855Sgabeblack@google.com    accessMySpecificExtensions(trans).clear_extension(&tag);
15712855Sgabeblack@google.com  }
15812855Sgabeblack@google.com
15912855Sgabeblack@google.com  void free(transaction_type* txn){
16012855Sgabeblack@google.com    BTag* btag;
16112855Sgabeblack@google.com    accessMySpecificExtensions(*txn).get_extension(btag);
16212855Sgabeblack@google.com    sc_assert(btag);
16312855Sgabeblack@google.com    txn->reset(); //clean off all extension that were added down stream
16412855Sgabeblack@google.com    btag->event.notify();
16512855Sgabeblack@google.com  }
16612855Sgabeblack@google.com
16712855Sgabeblack@google.com  //do a fw transmission
16812855Sgabeblack@google.com  void initiatorNBTransport_core(transaction_type& trans,
16912855Sgabeblack@google.com                                 phase_type& phase,
17012855Sgabeblack@google.com                                 sc_core::sc_time& t,
17112855Sgabeblack@google.com                                 unsigned int tgtSocketNumber){
17212855Sgabeblack@google.com    switch (initiator_socket[tgtSocketNumber]->nb_transport_fw(trans, phase, t)) {
17312855Sgabeblack@google.com      case tlm::TLM_ACCEPTED:
17412855Sgabeblack@google.com      case tlm::TLM_UPDATED:
17512855Sgabeblack@google.com        // Transaction not yet finished
17612855Sgabeblack@google.com        if (phase != tlm::BEGIN_REQ)
17712855Sgabeblack@google.com        {
17812855Sgabeblack@google.com          sc_assert(phase!=tlm::END_RESP);
17912855Sgabeblack@google.com          m_bwPEQ.notify(trans,phase,t);
18012855Sgabeblack@google.com        }
18112855Sgabeblack@google.com        break;
18212855Sgabeblack@google.com      case tlm::TLM_COMPLETED:
18312855Sgabeblack@google.com        // Transaction finished
18412855Sgabeblack@google.com        ConnectionInfo* connInfo;
18512855Sgabeblack@google.com        accessMySpecificExtensions(trans).get_extension(connInfo);
18612855Sgabeblack@google.com        sc_assert(connInfo);
18712855Sgabeblack@google.com        connInfo->alreadyComplete=true;
18812855Sgabeblack@google.com        phase=tlm::BEGIN_RESP;
18912855Sgabeblack@google.com        m_bwPEQ.notify(trans, phase, t);
19012855Sgabeblack@google.com        break;
19112855Sgabeblack@google.com      default:
19212855Sgabeblack@google.com        sc_assert(0); exit(1);
19312855Sgabeblack@google.com    };
19412855Sgabeblack@google.com  }
19512855Sgabeblack@google.com
19612855Sgabeblack@google.com  //nb_transport_fw
19712855Sgabeblack@google.com  sync_enum_type initiatorNBTransport(int initiator_id,
19812855Sgabeblack@google.com                                      transaction_type& trans,
19912855Sgabeblack@google.com                                      phase_type& phase,
20012855Sgabeblack@google.com                                      sc_core::sc_time& t)
20112855Sgabeblack@google.com  {
20212855Sgabeblack@google.com    ConnectionInfo* connInfo;
20312855Sgabeblack@google.com    accessMySpecificExtensions(trans).get_extension(connInfo);
20412855Sgabeblack@google.com    m_fwPEQ.notify(trans,phase,t);
20512855Sgabeblack@google.com    if (phase==tlm::BEGIN_REQ){
20612855Sgabeblack@google.com      //add our private information to the txn
20712855Sgabeblack@google.com      sc_assert(!connInfo);
20812855Sgabeblack@google.com      connInfo=m_connInfoPool.construct();
20912855Sgabeblack@google.com      connInfo->fwID=decode(trans.get_address());
21012855Sgabeblack@google.com      connInfo->bwID=initiator_id;
21112855Sgabeblack@google.com      connInfo->clearReq=true;
21212855Sgabeblack@google.com      connInfo->alreadyComplete=false;
21312855Sgabeblack@google.com      accessMySpecificExtensions(trans).set_extension(connInfo);
21412855Sgabeblack@google.com    }
21512855Sgabeblack@google.com    else
21612855Sgabeblack@google.com    if (phase==tlm::END_RESP){
21712855Sgabeblack@google.com      return tlm::TLM_COMPLETED;
21812855Sgabeblack@google.com    }
21912855Sgabeblack@google.com    else
22012855Sgabeblack@google.com      {sc_assert(0); exit(1);}
22112855Sgabeblack@google.com    return tlm::TLM_ACCEPTED;
22212855Sgabeblack@google.com  }
22312855Sgabeblack@google.com
22412855Sgabeblack@google.com  sync_enum_type targetNBTransport(int portId,
22512855Sgabeblack@google.com                                   transaction_type& trans,
22612855Sgabeblack@google.com                                   phase_type& phase,
22712855Sgabeblack@google.com                                   sc_core::sc_time& t)
22812855Sgabeblack@google.com  {
22912855Sgabeblack@google.com    if (phase != tlm::END_REQ && phase != tlm::BEGIN_RESP) {
23012855Sgabeblack@google.com      std::cout << "ERROR: '" << name()
23112855Sgabeblack@google.com                << "': Illegal phase received from target." << std::endl;
23212855Sgabeblack@google.com      sc_assert(false); exit(1);
23312855Sgabeblack@google.com    }
23412855Sgabeblack@google.com    //simply stuff it into the bw PEQ
23512855Sgabeblack@google.com    m_bwPEQ.notify(trans,phase,t);
23612855Sgabeblack@google.com    return tlm::TLM_ACCEPTED;
23712855Sgabeblack@google.com  }
23812855Sgabeblack@google.com
23912855Sgabeblack@google.com  void bwPEQcb(transaction_type& trans, const phase_type& phase){
24012855Sgabeblack@google.com    //first get our private info from the txn
24112855Sgabeblack@google.com    ConnectionInfo* connInfo;
24212855Sgabeblack@google.com    accessMySpecificExtensions(trans).get_extension(connInfo);
24312855Sgabeblack@google.com    sc_assert(connInfo);
24412855Sgabeblack@google.com    phase_type p=phase;
24512855Sgabeblack@google.com    sc_core::sc_time t=sc_core::SC_ZERO_TIME;
24612855Sgabeblack@google.com    BTag* btag;
24712855Sgabeblack@google.com    accessMySpecificExtensions(trans).get_extension(btag);
24812855Sgabeblack@google.com    bool doCall=btag==NULL; //we only will do a bw call if we are not in a wrapped b_transport
24912855Sgabeblack@google.com    if ((phase==tlm::END_REQ) | (connInfo->clearReq)){ //in case the target left out end_req clearReq reminds us to unlock the req port
25012855Sgabeblack@google.com      sc_assert(m_pendingReqs[connInfo->fwID].size());
25112855Sgabeblack@google.com      sc_assert(m_pendingReqs[connInfo->fwID].front()==&trans);
25212855Sgabeblack@google.com      m_pendingReqs[connInfo->fwID].pop_front(); //allow another req to start at this target
25312855Sgabeblack@google.com      if (m_pendingReqs[connInfo->fwID].size()){ //there was a pending req
25412855Sgabeblack@google.com        phase_type ph=tlm::BEGIN_REQ;
25512855Sgabeblack@google.com        initiatorNBTransport_core(*m_pendingReqs[connInfo->fwID].front(), ph, t,connInfo->fwID);
25612855Sgabeblack@google.com      }
25712855Sgabeblack@google.com      connInfo->clearReq=false;
25812855Sgabeblack@google.com    }
25912855Sgabeblack@google.com    //no else here, since we might clear the req AND begin a resp
26012855Sgabeblack@google.com    if (phase==tlm::BEGIN_RESP){
26112855Sgabeblack@google.com      m_pendingResps[connInfo->bwID].push_back(&trans);
26212855Sgabeblack@google.com      doCall=m_pendingResps[connInfo->bwID].size()==1; //do a call in case the response socket was free
26312855Sgabeblack@google.com    }
26412855Sgabeblack@google.com
26512855Sgabeblack@google.com    if (doCall){ //we have to do a call on the bw of fw path
26612855Sgabeblack@google.com      if (btag){ //only possible if BEGIN_RESP and resp socket was free
26712855Sgabeblack@google.com          phase_type ph=tlm::END_RESP;
26812855Sgabeblack@google.com          m_fwPEQ.notify(trans, ph, t);
26912855Sgabeblack@google.com      }
27012855Sgabeblack@google.com      else
27112855Sgabeblack@google.com        switch (target_socket[connInfo->bwID]->nb_transport_bw(trans, p, t)){
27212855Sgabeblack@google.com          case tlm::TLM_ACCEPTED:
27312855Sgabeblack@google.com          case tlm::TLM_UPDATED:
27412855Sgabeblack@google.com            break;
27512855Sgabeblack@google.com          case tlm::TLM_COMPLETED:{
27612855Sgabeblack@google.com            //covers a piggy bagged END_RESP to START_RESP
27712855Sgabeblack@google.com            phase_type ph=tlm::END_RESP;
27812855Sgabeblack@google.com            m_fwPEQ.notify(trans, ph, t);
27912855Sgabeblack@google.com            }
28012855Sgabeblack@google.com            break;
28112855Sgabeblack@google.com          default:
28212855Sgabeblack@google.com            sc_assert(0); exit(1);
28312855Sgabeblack@google.com
28412855Sgabeblack@google.com        };
28512855Sgabeblack@google.com    }
28612855Sgabeblack@google.com  }
28712855Sgabeblack@google.com
28812855Sgabeblack@google.com  //the following two functions (fwPEQcb and clearPEQcb) could be one, if we were allowed
28912855Sgabeblack@google.com  // to stick END_RESP into a PEQ
29012855Sgabeblack@google.com  void fwPEQcb(transaction_type& trans, const phase_type& phase){
29112855Sgabeblack@google.com    ConnectionInfo* connInfo;
29212855Sgabeblack@google.com    accessMySpecificExtensions(trans).get_extension(connInfo);
29312855Sgabeblack@google.com    sc_assert(connInfo);
29412855Sgabeblack@google.com    phase_type ph=phase;
29512855Sgabeblack@google.com    sc_core::sc_time t=sc_core::SC_ZERO_TIME;
29612855Sgabeblack@google.com    if (phase==tlm::BEGIN_REQ){
29712855Sgabeblack@google.com      trans.set_address(trans.get_address()&m_masks[connInfo->fwID]); //mask address
29812855Sgabeblack@google.com      m_pendingReqs[connInfo->fwID].push_back(&trans);
29912855Sgabeblack@google.com      if (m_pendingReqs[connInfo->fwID].size()==1){ //the socket is free
30012855Sgabeblack@google.com        initiatorNBTransport_core(trans, ph, t, connInfo->fwID);
30112855Sgabeblack@google.com      }
30212855Sgabeblack@google.com    }
30312855Sgabeblack@google.com    else
30412855Sgabeblack@google.com    {
30512855Sgabeblack@google.com      //phase is always END_RESP
30612855Sgabeblack@google.com      BTag* btag;
30712855Sgabeblack@google.com      accessMySpecificExtensions(trans).get_extension(btag);
30812855Sgabeblack@google.com      accessMySpecificExtensions(trans).clear_extension(connInfo); //remove our specific extension as it is not needed any more
30912855Sgabeblack@google.com      if (!connInfo->alreadyComplete) {
31012855Sgabeblack@google.com        sync_enum_type tmp=initiator_socket[connInfo->fwID]->nb_transport_fw(trans, ph, t);
31112855Sgabeblack@google.com        sc_assert(tmp==tlm::TLM_COMPLETED);
31212855Sgabeblack@google.com      }
31312855Sgabeblack@google.com      sc_assert(m_pendingResps[connInfo->bwID].size());
31412855Sgabeblack@google.com      m_pendingResps[connInfo->bwID].pop_front(); //remove current response
31512855Sgabeblack@google.com      if (m_pendingResps[connInfo->bwID].size()){ //if there was one pending
31612855Sgabeblack@google.com        ph=tlm::BEGIN_RESP; //schedule its transmission
31712855Sgabeblack@google.com        m_bwPEQ.notify(*m_pendingResps[connInfo->bwID].front(),ph,t);
31812855Sgabeblack@google.com      }
31912855Sgabeblack@google.com      m_connInfoPool.free(connInfo); //release connInfo
32012855Sgabeblack@google.com      if (btag) btag->event.notify(t); //release b_transport
32112855Sgabeblack@google.com    }
32212855Sgabeblack@google.com  }
32312855Sgabeblack@google.com
32412855Sgabeblack@google.com  void dump_status(){
32512855Sgabeblack@google.com    std::cout<<"At "<<sc_core::sc_time_stamp()<<" status of "<<name()<<" is "<<std::endl
32612855Sgabeblack@google.com             <<"  Number of connected initiators: "<<target_socket.size()<<std::endl
32712855Sgabeblack@google.com             <<"  Number of connected targets: "<<initiator_socket.size()<<std::endl
32812855Sgabeblack@google.com             <<"  Pending requests:"<<std::endl;
32912855Sgabeblack@google.com    for (unsigned int i=0; i<m_pendingReqs.size(); i++)
33012855Sgabeblack@google.com      std::cout<<"    "<<m_pendingReqs[i].size()<<" pending requests for target number "<<i<<std::endl;
33112855Sgabeblack@google.com    std::cout<<"  Pending responses:"<<std::endl;
33212855Sgabeblack@google.com    for (unsigned int i=0; i<m_pendingResps.size(); i++)
33312855Sgabeblack@google.com      std::cout<<"    "<<m_pendingResps[i].size()<<" pending responses for initiator number "<<i<<std::endl;
33412855Sgabeblack@google.com    std::cout<<"  The address map is:"<<std::endl;
33512855Sgabeblack@google.com    m_addrMap.dumpMap();
33612855Sgabeblack@google.com
33712855Sgabeblack@google.com  }
33812855Sgabeblack@google.com};
33912855Sgabeblack@google.com
34012855Sgabeblack@google.com#endif
341