240a241,242
> void stallBuffer(MessageBuffer* buf, Address addr);
> void wakeUpBuffers(Address addr);
282a285,289
> typedef std::vector<MessageBuffer*> MsgVecType;
> typedef m5::hash_map< Address, MsgVecType* > WaitingBufType;
> WaitingBufType m_waiting_buffers;
> int m_max_in_port_rank;
> int m_cur_in_port_rank;
380a388,393
> #
> # max_port_rank is used to size vectors and thus should be one plus the
> # largest port rank
> #
> max_port_rank = self.in_ports[0].pairs["max_port_rank"] + 1
> code(' m_max_in_port_rank = $max_port_rank;')
623a637,665
> $c_ident::stallBuffer(MessageBuffer* buf, Address addr)
> {
> if (m_waiting_buffers.count(addr) == 0) {
> MsgVecType* msgVec = new MsgVecType;
> msgVec->resize(m_max_in_port_rank, NULL);
> m_waiting_buffers[addr] = msgVec;
> }
> (*(m_waiting_buffers[addr]))[m_cur_in_port_rank] = buf;
> }
>
> void
> $c_ident::wakeUpBuffers(Address addr)
> {
> //
> // Wake up all possible lower rank (i.e. lower priority) buffers that could
> // be waiting on this message.
> //
> for (int in_port_rank = m_cur_in_port_rank - 1;
> in_port_rank >= 0;
> in_port_rank--) {
> if ((*(m_waiting_buffers[addr]))[in_port_rank] != NULL) {
> (*(m_waiting_buffers[addr]))[in_port_rank]->reanalyzeMessages(addr);
> }
> }
> delete m_waiting_buffers[addr];
> m_waiting_buffers.erase(addr);
> }
>
> void
759a802,805
> if port.pairs.has_key("rank"):
> code('m_cur_in_port_rank = ${{port.pairs["rank"]}};')
> else:
> code('m_cur_in_port_rank = 0;')