package Communication.FDDI.Binary;

module station(bool ?TT, ?trt7, ?trt6, ?trt5, ?trt4,
                ?trt3, ?trt2, ?trt1, ?trt0,
                event counter_reset,
                bool !RT, !transmit_sync, !transmit_async)
{
   event sendbreak;
   bool tht7, tht6, tht5, tht4,
        tht3, tht2, tht1, tht0,
        tt7, tt6, tt5, tt4,
        tt3, tt2, tt1, tt0,
        cry, tmpequ;
   event tmpless;

   loop {
      emit(counter_reset);
      RT = false;
      transmit_sync = false;
      transmit_async = false;
      station_idle: await(TT==true);
      set_tht: Assign8(trt7,trt6,trt5,trt4,trt3,trt2,trt1,trt0,
                       tht7,tht6,tht5,tht4,tht3,tht2,tht1,tht0);
      emit(counter_reset);
      weak abort {
         do {
            cmp1: Compare8(trt7,trt6,trt5,trt4,trt3,trt2,trt1,trt0,
                           false,false,false,true,false,true,false,false,tmpequ);
            station_sending_sync_1: pause;
         }while(tmpequ == false);
         {
            emit(sendbreak);
         |||
           {
            transmit_sync = true;
            station_sending_sync_2: pause;
           }
         }
      }when(sendbreak);
      prob_pause1: pause;
      add0: Adder8(trt7,trt6,trt5,trt4,trt3,trt2,trt1,trt0,
                   tht7,tht6,tht5,tht4,tht3,tht2,tht1,tht0,false,
                   cry,tt7,tt6,tt5,tt4,tt3,tt2,tt1,tt0);
      cmp2: CompareLess8(tt7,tt6,tt5,tt4,tt3,tt2,tt1,tt0,
                         false,true,true,true,true,false,false,false,
                         tmpless);
      if (tmpless) {
         weak abort {
            do {
               add1: Adder8(trt7,trt6,trt5,trt4,trt3,trt2,trt1,trt0,
                                tht7,tht6,tht5,tht4,tht3,tht2,tht1,tht0,false,
                                cry,tt7,tt6,tt5,tt4,tt3,tt2,tt1,tt0);
               cmp3: Compare8(tt7,tt6,tt5,tt4,tt3,tt2,tt1,tt0,
                                  false,true,true,true,true,false,false,false,tmpequ);
               station_sending_async_1: pause;
            }while(tmpequ == false);
            {
               emit(sendbreak);
            |||
              {
               transmit_async =true;
               station_sending_async_2:pause;
              }
            }
         }when(sendbreak);
      }
      RT=true;
      fin: pause;
   }
}