Esempio n. 1
0
        public bool doStep()
        {
            bool somethingMoved = false;

            // handle input from ring
            if (_in.Out != null)
            {
                Flit f = _in.Out;
                _in.Out = null;

                somethingMoved = true;

                if (f.packet.dest.ID == _router.coord.ID)
                {
                    _credits++;
                    _router.acceptFlit(f);
                }
                else
                {
                    _buf.Enqueue(f);
                    Simulator.stats.bufrings_nic_enqueue.Add();
                }
            }

            // handle through traffic
            if (_buf.Count > 0)
            {
                Flit f = _buf.Peek();
                if (_downstream.getCredit(f, this, 0))
                {
                    _buf.Dequeue();
                    _credits++;
                    _out.In = f;
                    Simulator.stats.bufrings_nic_dequeue.Add();
                    somethingMoved = true;
                }
            }

            // handle injections
            if (_out.In == null && _inject != null)
            {
                if (_downstream.getCredit(_inject, this, 2))
                {
                    _out.In = _inject;
                    _router.statsIJ(_inject);
                    _inject = null;
                    Simulator.stats.bufrings_nic_inject.Add();
                    somethingMoved = true;
                }
            }
            if (_inject != null)
            {
                Simulator.stats.bufrings_nic_starve.Add();
            }

            if (_out.In != null)
            {
                Simulator.stats.bufrings_link_traverse[1].Add();
            }

            Simulator.stats.bufrings_nic_occupancy.Add(_buf.Count);

            return(somethingMoved);
        }