void smartconnect_xtlm::process_saxi_rd_resp()

in hdk/common/ip/cl_ip/cl_ip.gen/sources_1/bd/cl_axi_sc_2x2/ip/cl_axi_sc_2x2_smartconnect_0_0/xtlm/smartconnect_xtlm.cxx [1786:2101]


void smartconnect_xtlm::process_saxi_rd_resp() {

   print_header("process_saxi_rd_resp()");

   while (!slave_rd_resp.empty()) {

      xtlm::aximm_payload* m_req_trans_ptr = NULL;
      xtlm::aximm_payload* m_resp_trans_ptr = NULL;
   
      xtlm::aximm_payload* trans_ptr = slave_rd_resp.front();
      unsigned int num_si = map_rd_si_to_numsi[trans_ptr];
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "num_si is: " << num_si << std::endl;
            m_ss << "SI trans is is: " << trans_ptr<< "\n\n";
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
   
      unsigned int num_mi = slave_rd_resp_nummi.front();
   
      bool si_cascaded = (SI_m_properties[num_si].getInt("IS_CASCADED") == 1);
      bool mi_cascaded = (MI_m_properties[num_mi].getInt("IS_CASCADED") == 1);
   
      trans_ptr->set_response_status(xtlm::XTLM_OK_RESPONSE);
   
	  if (m_report_handler->get_verbosity_level()
	  		== xsc::common_cpp::VERBOSITY::DEBUG) {
	  	m_ss.str("");
	  	m_ss << this->name() << "saxi_rd_resp_vec[" << num_si << "] size: " << saxi_rd_resp_vec[num_si].size() << "\n"
        << "Processing process_saxi_rd_resp on num_si: " << num_si << "\n"
        << "BEGIN Response information\n";
	  	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	  			DEBUG);
	  }
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	    	trans_ptr->get_log(payload_msg, 3);
	     	m_ss.str("");
	     	m_ss << this->name() << payload_msg << std::endl;
            m_ss << "RESPONSE: " << trans_ptr->get_response_string()
            << "END Response information\n\n";
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     	payload_msg = "";
	     }
      
      if (saxi_rd_util[num_si]->is_master_ready() == false) {
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "Processing process_saxi_rd_resp on num_si: " << num_si << " master not ready\n" << std::endl;
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
         next_trigger(saxi_rd_util[num_si]->data_sampled);
         return;
      }

      slave_rd_resp.pop_front();
      slave_rd_resp_nummi.pop_front();
   
      saxi_rd_resp_vec[num_si].pop_front();
   
      if (si_cascaded) { //If SI is cascaded, clear the pointers and send response to upstream
         mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
   
         while (mmap_rd_si_to_mi_itr != mmap_rd_si_to_mi.end()) {
            m_req_trans_ptr = mmap_rd_si_to_mi_itr->second;
            mmap_rd_si_to_mi.erase(mmap_rd_si_to_mi_itr);
            map_rd_mi_to_si.erase(m_req_trans_ptr);
            mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
            m_req_trans_ptr = NULL;
         }
      } else { //Else, extract read data from response
   
         int s_burst_length = trans_ptr->get_burst_length();
         int s_burst_size = trans_ptr->get_burst_size();
      
         int s_burst_cnt = trans_ptr->get_burst_length();
         int s_num_burst = s_burst_size;
      //   int s_data_size = s_burst_cnt * s_num_burst;
         int s_data_size = trans_ptr->get_data_length();
         uint64_t s_addr = trans_ptr->get_address();
         unsigned char* s_data_ptr = trans_ptr->get_data_ptr();
         int s_data_ptr_indx = 0;
         int s_data_ptr_indx_high = s_data_size - 1;
      
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "saxi burst_length is: " << s_burst_length << "\n"
            << "saxi burst_size is: " << s_burst_size << "\n"
            << "saxi start addr is: " << std::hex << s_addr << "\n"
            << "saxi end addr is: " << std::hex << s_data_ptr_indx_high << "\n"
            << "saxi data_ptr is: " << std::hex << s_data_ptr << "\n\n";
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
      
         mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
   
         //Loop through all MI trans mapped to this SI trans
         while (mmap_rd_si_to_mi_itr != mmap_rd_si_to_mi.end()) {
      
            m_req_trans_ptr = mmap_rd_si_to_mi_itr->second;
            m_resp_trans_ptr = mmap_rd_si_to_mi_itr->second;
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "maxi transaction is: " << m_req_trans_ptr << std::endl;
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
      
            if (!mi_cascaded) { //MI not cascaded so these are orinigal trans responses  so extract read data here
               int m_burst_length = m_req_trans_ptr->get_burst_length();
               int m_burst_size = m_req_trans_ptr->get_burst_size();
               unsigned char* m_data_ptr = m_resp_trans_ptr->get_data_ptr();
         
               int m_burst_cnt = m_burst_length;
               int m_num_burst = m_burst_size;
               int m_data_size = m_req_trans_ptr->get_data_length();
         
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "BEGIN Regslice vector pop out READ information\n" << std::endl;
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
            m_resp_trans_ptr->get_log(payload_msg, 3);
	     	m_ss.str("");
	     	m_ss << this->name() << payload_msg << std::endl;
            m_ss << "END Regslice vector pop out READ information\n\n";
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
            payload_msg = "";
	     }
         
               if (m_resp_trans_ptr->is_response_error()) {
                  trans_ptr->set_response_status(m_resp_trans_ptr->get_response_status());
         //         maxi_rd_resp_vec[slave_rd_resp].clear();
         //         break;
               } else {
                  for (int i = 0; i < m_burst_cnt; i++) {
                     for (int j = 0; j < m_num_burst; j++) {
                        s_data_ptr[s_data_ptr_indx] = (unsigned int) m_data_ptr[(i*m_num_burst) + j];
	                    if (m_report_handler->get_verbosity_level()
	                    		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                    	m_ss.str("");
	                    	m_ss << this->name() << "Read s_data_ptr[" << s_data_ptr_indx << "] = m_data_ptr[" 
                            << (i*m_num_burst) + j << "]: "<< std::hex 
                            << static_cast<int>(m_data_ptr[(i*m_num_burst) + j]) << "\n" << std::endl;
	                    	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                    			DEBUG);
	                    }
                        s_data_ptr_indx++;
                        if (s_data_ptr_indx > s_data_ptr_indx_high) {
	                        if (m_report_handler->get_verbosity_level()
	                        		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                        	m_ss.str("");
	                        	m_ss << this->name() << "breaking loop \n" << std::endl;
	                        	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                        			DEBUG);
	                        }
                           break;
                        }
                     } //for int j
                     if (s_data_ptr_indx > s_data_ptr_indx_high) {
	                    if (m_report_handler->get_verbosity_level()
	                    		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                    	m_ss.str("");
	                    	m_ss << this->name() << "breaking loop \n" << std::endl;
	                    	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                    			DEBUG);
	                    }
                        break;
                     }
                  } //for i
               } //else
            } else { //MI is cascaded so extract original MI trans from extension object 
               smartconnect_extension* exten = m_req_trans_ptr->get_extension<smartconnect_extension>();
               xtlm::aximm_payload* mi_trans_ptr = NULL;
   
               while ( !((exten->get_mi_trans_vec()).empty()) ) {
                  mi_trans_ptr = (exten->get_mi_trans_vec()).front();
                  (exten->get_mi_trans_vec()).pop_front();
   
                  if (mi_trans_ptr->is_response_error()) {
                     trans_ptr->set_response_status(mi_trans_ptr->get_response_status());
                  } else {
   
                     int m_burst_length = mi_trans_ptr->get_burst_length();
                     int m_burst_size = mi_trans_ptr->get_burst_size();
                     unsigned char* m_data_ptr = mi_trans_ptr->get_data_ptr();
               
                     int m_burst_cnt = m_burst_length;
                     int m_num_burst = m_burst_size;
                     int m_data_size = mi_trans_ptr->get_data_length();
         
	                 if (m_report_handler->get_verbosity_level()
	                 		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                 	m_ss.str("");
	                 	m_ss << this->name() << "BEGIN Regslice vector pop out READ information\n" << std::endl;
	                 	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                 			DEBUG);
	                 }
	                if (m_report_handler->get_verbosity_level()
	                		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                	mi_trans_ptr->get_log(payload_msg, 3);
	                	m_ss.str("");
	                	m_ss << this->name() << payload_msg << std::endl;
                        m_ss << "END Regslice vector pop out READ information\n\n";
	                	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                			DEBUG);
	                	payload_msg = "";
	                }
   
                     for (int i = 0; i < m_burst_cnt; i++) {
                        for (int j = 0; j < m_num_burst; j++) {
                           s_data_ptr[s_data_ptr_indx] = (unsigned int) m_data_ptr[(i*m_num_burst) + j];
	                        if (m_report_handler->get_verbosity_level()
	                        		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                        	m_ss.str("");
	                        	m_ss << this->name() << "Read s_data_ptr[" << s_data_ptr_indx << "] = m_data_ptr[" 
                               << (i*m_num_burst) + j << "]: "<< std::hex 
                               << static_cast<int>(m_data_ptr[(i*m_num_burst) + j]) << "\n" << std::endl;
	                        	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                        			DEBUG);
	                        }
                           s_data_ptr_indx++;
                           if (s_data_ptr_indx > s_data_ptr_indx_high) {
	                          if (m_report_handler->get_verbosity_level()
	                          		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                          	m_ss.str("");
	                          	m_ss << this->name() << "breaking loop \n" << std::endl;
	                          	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                          			DEBUG);
	                          }
                              break;
                           }
                        } //for int j
                        if (s_data_ptr_indx > s_data_ptr_indx_high) {
	                        if (m_report_handler->get_verbosity_level()
	                        		== xsc::common_cpp::VERBOSITY::DEBUG) {
	                        	m_ss.str("");
	                        	m_ss << this->name() << "breaking loop \n" << std::endl;
	                        	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	                        			DEBUG);
	                        }
                           break;
                        }
                     } //for i
   
                  }
                  mi_trans_ptr->release();
               }
   
            }
            
            mmap_rd_si_to_mi.erase(mmap_rd_si_to_mi_itr);
            map_rd_mi_to_si.erase(m_req_trans_ptr);
            mmap_rd_si_to_mi_itr = mmap_rd_si_to_mi.find(trans_ptr);
            m_req_trans_ptr->release();
            m_req_trans_ptr = NULL;
            m_resp_trans_ptr = NULL;
         } //while
      
      }
           
      if (trans_ptr->get_response_status() == NULL) {
         trans_ptr->set_response_status(xtlm::XTLM_GENERIC_ERROR_RESPONSE);
      }
   
      sc_time delay = SC_ZERO_TIME;
   
      if (trans_ptr != NULL) {
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	     	m_ss.str("");
	     	m_ss << this->name() << "BEGIN sending Read Response information on num_si " << num_si << "\n" << std::endl;
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     }
	     if (m_report_handler->get_verbosity_level()
	     		== xsc::common_cpp::VERBOSITY::DEBUG) {
	    	trans_ptr->get_log(payload_msg, 3);
	     	m_ss.str("");
	     	m_ss << this->name() << payload_msg << std::endl;
            m_ss << "RESPONSE: " << trans_ptr->get_response_string() << "\n"
            << "END sending Read Response information on num_si " << num_si << "\n\n";
	     	XSC_REPORT_INFO_VERB((*m_report_handler), "1", m_ss.str().c_str(),
	     			DEBUG);
	     	payload_msg = "";
	     }
   
         print_log("SI", num_si, "READ", "Response sent", trans_ptr);
   
         saxi_rd_util[num_si]->send_data(*trans_ptr, delay);
         map_rd_si_to_nummi.erase(trans_ptr);
         map_rd_si_to_numsi.erase(trans_ptr);
   //      trans_ptr->release();
      }

   } //end of while loop

   //Check for pending incoming rd trans
   check_saxi_rd_req.notify(sc_core::SC_ZERO_TIME);

   print_footer("process_saxi_rd_resp()");

}