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