Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/demos/stat2e.sim
There is 1 other file named stat2e.sim in the archive. Click here to see a list.
BEGIN
  simulation CLASS statisticssimulation;
  COMMENT same as "simulation" plus automatic tracing
  and production of queue statistics;
  BEGIN

    PROCEDURE write_time;
    BEGIN
      outtext(" TIME:"); outfix(time,0,4);
      outchar('.'); outimage;
    END;

    process CLASS s_process(nameid, number);
    COMMENT same as "process" but has name and
    number to be used in output messages;
    VALUE nameid;
    TEXT nameid; INTEGER number;
    BEGIN
      REF(s_queue) my_queue;
      PROCEDURE s_out;
      INSPECT my_queue DO
      BEGIN
        increase_queuelength(-1);
        out; my_queue:- NONE;
      END of s_out;
    END of s_process;

    head CLASS s_queue(nameid);
    COMMENT same as "head" but trace messages
    are given when the queue length is changed,
    and queue length statistics are collected;
    VALUE nameid; TEXT nameid;
    BEGIN
      INTEGER queuelength;
      REAL previous_time, length_integral;

      PROCEDURE increase_queuelength(plus); INTEGER plus;
      BEGIN
        length_integral:=
        length_integral+queuelength*(time-previous_time);
        previous_time:= time;
        queuelength:= queuelength+plus;
        outtext("QUEUE AT "); outtext(nameid);
        outtext(" SIZE");
        outint(queuelength,3); write_time;
      END of increase_queuelength;

      PROCEDURE write_mean_length;
      BEGIN
        increase_queuelength(0);
        outtext("QUEUE AT "); outtext(nameid);
        outtext(" MEAN LENGTH ");
        outfix(length_integral/time,1,5);
        outtext(" UNTIL"); write_time;
      END;
    END;
    

    PROCEDURE s_hold(the_time, place);
    COMMENT same as "hold" but writes a trace message
    for every event during the simulation;
    NAME place; REAL the_time; TEXT place;
    BEGIN
      INSPECT current WHEN s_process DO
      BEGIN
        outtext(nameid); outtext(" NO.");
        outint(number,3);
        outtext(" WILL BE "); outtext(place);
        write_time;
      END;
      hold(the_time);
    END of s_hold;

    PROCEDURE s_wait(queue);
    COMMENT same as "wait" but writes trace message
    when a queue is entered, and updates queue statistics;
    REF(s_queue) queue;
    BEGIN
      INSPECT current WHEN s_process DO
      BEGIN
        my_queue:- queue;
        outtext(nameid); outtext(" NO.");
        outint(number,3);
      END;
      INSPECT queue DO
      BEGIN
        outtext(" INTO QUEUE AT "); outtext(nameid);
        write_time;
        increase_queuelength(1);
      END;
      wait(queue);
    END of s_wait;
  END of statisticssimulation;
  

  

  REAL simulation_duration;
  simulation_duration:= 200;
  statisticssimulation BEGIN
    REF (platform) harbour, store, factory;
    INTEGER i, u;
    s_process CLASS truck;
    BEGIN
      WHILE TRUE DO
      BEGIN
        s_hold(harbour.travel_time,"LEAVING FOR HARBOUR");
        ACTIVATE harbour DELAY 0; s_wait(harbour.queue);
        IF draw(0.5,u) THEN
        BEGIN
          s_hold(store.travel_time,"LEAVING FOR STORE");
          ACTIVATE store DELAY 0; s_wait(store.queue);
        END ELSE
        BEGIN
          s_hold(factory.travel_time,
          "LEAVING FOR FACTORY");
          ACTIVATE factory DELAY 0; s_wait(factory.queue);
        END;
      END;
    END of truck;
    s_process CLASS platform(platform_time, travel_time);
    REAL platform_time, travel_time;
    BEGIN
      REF (s_queue) queue;
      queue:- NEW s_queue(nameid);
      WHILE TRUE DO
      BEGIN
        INSPECT queue.first WHEN truck DO
        BEGIN
          s_out;
          s_hold(platform_time,"LOADING OR UNLOADING");
          ACTIVATE THIS truck;
        END OTHERWISE passivate;
      END;
    END of platform;
    harbour:- NEW platform("HARBOUR",1,10,20);
    ACTIVATE harbour;
    store:- NEW platform("STORE",1,15,20);
    ACTIVATE store;
    factory:- NEW platform("FACTORY",1,17,20);
    ACTIVATE factory;
    FOR i:= 1 STEP 1 UNTIL 5 DO
    ACTIVATE NEW truck("TRUCK",i);
    hold(simulation_duration);
    outimage;
    outtext("END OF SIMULATION"); write_time;
    outimage;
    harbour.queue.write_mean_length;
    store.queue.write_mean_length;
    factory.queue.write_mean_length;
  END of simulation;
END of program;