QNET is a queuing network simulator that takes as its input
the topology (and node information) of a queuing network.
To run the program, we need to create a data file. For a single
server queue, for instance, we create the following file:

4 1000.0
0 gen 2.0
1 request queue-1 1 expon 5.0 0.0
2 release
3 sink
0 0   1 1
1 1 0 1 2
2 1 1 1 3
3 1 2 0

The format of the file is as follows:

  # of blocks, end time to stop simulation.
  A list of the blocks with their specifications. 
    For GEN blocks, we need the interarrival time. 
    For REQUEST blocks, we need a queue name, \# of servers, 
        type of distribution for service, and the distribution parameters. 
    For a FORK block we need the number of fork
        tines along with a probability value that each tine will be taken
        (probabilities must add to 1.0).
  A list of the blocks with their inputs and outputs (net structure).
    Each line contains the following: block number, number of inputs,
    inputs, number of outputs, outputs.

There are six kinds of blocks available for modeling using
the queuing network simulator: gen, request, release, join, fork
and sink. A combination request/release connection is used
to simulate the behavior of a queue/facility. In the input file
above, there are 4 blocks.

If we have a cpu/disk system where there is a single CPU and two disks
then we can represent the system using the data file shown below.
Each entity is a job that arrives at the CPU, takes a certain amount of
time, and then requests access to either disk1 or disk2 using the
distribution specified by the probability attached to each arc. In this
case, we have specified a distribution of 50% for each disk.

9 1000.0
0 gen 2.0
1 request cpu 1 expon 2.0 0.0
2 release
3 fork 2 0.5 0.5
4 request disk1 1 expon 30.0 0.0
5 release
6 request disk2 1 expon 40.5 0.0
7 release 
8 sink
0 0     1 1
1 1 0   1 2
2 1 1   1 3
3 1 2   2 4 6
4 1 3   1 5
5 1 4   1 8
6 1 3   1 7
7 1 6   1 8
8 2 4 6 0

