HOME       UP       PREV       |ENDOFPACK|

Bus Mux

class busmux:sc_module
{
 public:
  // Use tagged sockets to be able to distinguish incoming backward path calls
  tlm_utils::multi_passthrough_target_socket    targ_socket;
  tlm_utils::multi_passthrough_initiator_socket init_socket;

  // Constructor
  busmux(sc_module_name name, uint32_t threshold);


  // FORWARD PATH
  // TLM-2 blocking transport method
  virtual void b_transport(int id, tlm::tlm_generic_payload &trans, sc_time &delay);
  uint32_t threshold;
};
busmux::busmux(sc_module_name name, uint32_t threshold):
  sc_module(name), 
  targ_socket("targ_socket"), 
  init_socket("init_socket"), 
  threshold(threshold)
{
  // Register callbacks for incoming interface method calls
  targ_socket.register_b_transport(this, &busmux::b_transport);
}


// TLM-2 blocking transport method
void busmux::b_transport(int id, tlm::tlm_generic_payload &trans, sc_time &delay)
{
  uint32_t adr = (uint32_t) trans.get_address();
  if (adr < threshold) init_socket[0]->b_transport(trans, delay);
  else 
    {
      init_socket[1]->b_transport(trans, delay);
    }
}

23: (C) 2008-11, DJ Greaves, University of Cambridge, Computer Laboratory.