private void Reset()
        {
            busyWith   = null;
            freeEvent  = null;
            sleepEvent = null;

            packetToSend = null;

            REGION_index   = 0;
            COL_count      = 0;
            SENSE_count    = 0;
            PKT_count      = 0;
            SINK_RTS_count = 0;
            REGION_cycle   = 0;
        }
        // called only if relay is either free or already busy with the reserver
        public void Reserve(Relay reserver, Event cause)
        {
            if (this.status == RelayStatus.Free || this.busyWith == reserver)
            {
                // remove sleep (handle sleep when Free occurs)
                if (sleepEvent != null)
                {
                    sim.eventQueue.Remove(sleepEvent);
                    sleepEvent = null;
                }

                if (reserver == this)
                {
                    throw new Exception("Can't use Reserve on self, use SelfReserve instead");
                }
                else
                {
                    if (busyWith == null)
                    {
                        busyWith  = reserver;
                        freeEvent = new FreeEvent {
                            time     = sim.clock + sim.protocolParameters.t_busy,
                            relay    = this,
                            sim      = sim,
                            previous = cause
                        };
                        sim.eventQueue.Add(freeEvent);
                    }
                    else
                    {
                        freeEvent.time = sim.clock + sim.protocolParameters.t_busy;
                        sim.eventQueue.Reschedule(freeEvent);
                    }
                }
            }
            else
            {
                throw new Exception("Cannot reserve this relay");
            }
        }