public bool doStep() { bool somethingMoved = false; // handle inputs // global input if (_gin.Out != null) { Flit f = _gin.Out; _gin.Out = null; somethingMoved = true; int ring, localid; BufRingNetwork_NIC.Map(f.packet.dest.ID, out ring, out localid); if (ring == _id) { _bufGL.Enqueue(f); Simulator.stats.bufrings_iri_enqueue_gl[0].Add(); } else { _bufG.Enqueue(f); Simulator.stats.bufrings_iri_enqueue_g[0].Add(); } } // local input if (_lin.Out != null) { Flit f = _lin.Out; _lin.Out = null; somethingMoved = true; int ring, localid; BufRingNetwork_NIC.Map(f.packet.dest.ID, out ring, out localid); if (ring == _id) { _bufL.Enqueue(f); Simulator.stats.bufrings_iri_enqueue_l[0].Add(); } else { _bufLG.Enqueue(f); Simulator.stats.bufrings_iri_enqueue_lg[0].Add(); } } // handle outputs // global output (on-ring traffic) if (_gout.In == null && _bufG.Count > 0) { Flit f = _bufG.Peek(); if (_downstreamG.getCredit(f, this, 0)) { _bufG.Dequeue(); Simulator.stats.bufrings_iri_dequeue_g[0].Add(); _creditG++; _gout.In = f; somethingMoved = true; } } // global output (transfer traffic) if (_gout.In == null && _bufLG.Count > 0) { Flit f = _bufLG.Peek(); if (_downstreamG.getCredit(f, this, 1)) { _bufLG.Dequeue(); Simulator.stats.bufrings_iri_dequeue_lg[0].Add(); _creditLG++; _gout.In = f; somethingMoved = true; } } // local output (on-ring traffic) if (_lout.In == null && _bufL.Count > 0) { Flit f = _bufL.Peek(); if (_downstreamL.getCredit(f, this, 0)) { _bufL.Dequeue(); Simulator.stats.bufrings_iri_dequeue_l[0].Add(); _creditL++; _lout.In = f; somethingMoved = true; } } // local output (transfer traffic) if (_lout.In == null && _bufGL.Count > 0) { Flit f = _bufGL.Peek(); if (_downstreamL.getCredit(f, this, 1)) { _bufGL.Dequeue(); Simulator.stats.bufrings_iri_dequeue_gl[0].Add(); _creditGL++; _lout.In = f; somethingMoved = true; } } if (_gout.In != null) { Simulator.stats.bufrings_link_traverse[0].Add(); } if (_lout.In != null) { Simulator.stats.bufrings_link_traverse[1].Add(); } Simulator.stats.bufrings_iri_occupancy_g[0].Add(_bufG.Count); Simulator.stats.bufrings_iri_occupancy_l[0].Add(_bufL.Count); Simulator.stats.bufrings_iri_occupancy_gl[0].Add(_bufGL.Count); Simulator.stats.bufrings_iri_occupancy_lg[0].Add(_bufLG.Count); return(somethingMoved); }
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); }