_AN ARCHITECTURE FOR NETWORK SIMULATION_ by Peter D. Varhol Listing One procedure create(var param, inV,outV:VisSimArg); export; var i: integer; begin if param[0] <> 0 then q_number := trunc(param[0]) else begin q_number := 1; param[0] := q_number end; c[q_number] := false; if {(inV[0] > 0) and} q_remaining[q_number] <= 0 then begin new(next[q_number]); created[q_number] := true; q_remaining[q_number] := InV[0]; packet_created[q_number] := cust_created[q_number] + 1; packet_id[q_number] := customer_id[q_number] + 1; next[q_number]^.customer_number := customer_id[q_number]; next[q_number]^.destination := q_number; next[q_number]^.priority := inV[1]; next[q_number]^.wait_time := 0; next[q_number]^.serve_time := 0; next[q_number]^.preempt_time := 0; next[q_number]^.link := nil; next[q_number]^.use[1] := InV[2]; if inV[3] <> 0 then if first[q_number,1] = 0 then next[q_number]^.use[1] := InV[2] else for i := 1 to max_data do next[q_number]^.use[i] := first[q_number,i]; end; if created[q_number] = false then outV[0] := 0 else outV[0] := q_number; end; Listing Two procedure createSS(var param : VisSimArg; var runCount : shortint); export; var i : integer; begin for q_number := 1 to maxqueues do begin created[q_number] := false; packet_id[q_number] := 0; q_remaining[q_number] := 0; arrive_sum[q_number] := 0; packet_created[q_number] := 0; q_time[q_number] := 0; for i := 1 to max_data do first[q_number,i] := 0; end end; function createPA(var ppCount : shortint) : longint; export; var paramalloc : byteptr; begin ppCount := 1; createPA := GetMem(paramalloc,16); end; function createPC(var param : VisSimArg) : PChar; export; begin createPC := 'Queue #' end; Listing Three #include "windows.h" #include "vsuser.h" int DLLInst; USER_MENU_ITEM trans[] = { {"Discrete Event", "tran2", -1,-1,0, "Discrete event simulation building blocks"}, {"createTransaction", "create", 3,1,48, "Creates new transactions"}, {"queue", "queue_block", 1,1,184, "First-in, first-out queue"}, {"transactionManager", "t_manager", 1,1,32, "Manages transaction flow between queues and servers"}, {"server", "server", 2,1,32, "Services a transaction"}, {"departSystem", "depart", 1,0,16, "Removes a transaction at the end of a system"}, {0} }; USER_MENU_ITEM stats[] = { {"Discrete Statistics", "tran2", -1,-1,0, "Collects statistical data on simulation"}, {"utilizationRate", "utilization", 1,1,16, "Cumulatively computes utilization rate"}, {"queueLength", "queue_length", 1,1,16, "Computes the length of the queue"}, {"waitingTime", "waiting_time", 1,1,16, "Cumulatively computes time waiting in queue"}, {"timeInSystem", "system_time", 1,1,16, "Cumulatively computes waiting and service times combined"}, {"transactionsGenerated", "transactions_generated", 1,1,16, "Computes number of transactions produced in a simulation run"}, {"transactionsServed", "transactions_served", 1,1,16, "Computes number of transactions served in a simulation run"}, {"transactionsLost", "transactions_lost", 1,1,16, "Cumulatively computes proportion of transactions lost in a finite queue"}, {"transactionTime", "trans_time", 1,1,16, "Foobar"}, {0} }; USER_MENU_ITEM utils[] = { {"Discrete Utilities", "tran2", -1,-1,0, "Utilities from manipulating a simulation"}, {"poissonRandomNumbers", "poisson", 1,1,16, "Produces a stream of Poisson-distributed random numbers"}, {"exponentialRandomNumbers", "exponential", 1,1,16, "Produces a stream of exponentially-distributed random numbers"}, {"generatePriorities", "generate_priority", 1,1,16, "Randomly generates priority levels for the priority queue"}, {"readTransactionID", "read_transaction", 1,1,16, "Reads the unique ID number of a transaction"}, {"insertData", "insert_data", 1,1,160, "Writes user-defined data into a transaction"}, {"retrieveData", "retrieve_data", 1,1,160, "Reads user-defined data from a transaction"}, {"fork", "fork", 1,2,8, "Causes a branching of a random number stream"}, {"delayTransaction", "delay", 2,1,16, "Delays a transaction passing from a server to a serial queue"}, {"simulationTime", "sim_time", 1,1,16, "Computes the internal simulation running time"}, {0} }; void EXPORT PASCAL vsmInit() { setUserBlockMenu(trans); setUserBlockMenu(stats); setUserBlockMenu(utils); } Example 1: Packet structure packetptr = ^packet; packet = record packet_number : double; priority : double; wait_time : double; serve_time : double; preempt_time : double; destination : double; t_mgr : double; servers : double; use : user; link : packetptr end;