files {
    "sim_p", "conf_p", "OS_p", "net_p", "ipi_p", "synch_p"
}

menu top {
    choice NET_p "Network Based" {
        set(MULT_RL_p),
	clear(SINGLE_RL_p),
        display(net)}
}

menu net {
    choice N_DIRECT_p "Direct Network" {
	set(NO_OF_PROCESSORS_p, Nk_p ^ Ndim_p),
	set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
             (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
        set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	     NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	     (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	display(direct)},
    choice N_INDIRECT_p "Indirect Network" {
	clear(NET_EXACT_p),
	display(indirparam)}
}

param proc {
    NO_OF_PROCESSORS_p "Number of Processors" [1, 1024]
	{ set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
             (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
          set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	       NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	  set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
}

menu direct {
    choice N_UNIDIR_p "Unidirectional" { 
	display(directparam)},
    choice N_BIDIR_p "Bidirectional" {
	display(directparam)}
}


param directparam {
    Nk_p "k-ary Radix" [1, 1024]
	{ set(NO_OF_PROCESSORS_p, Nk_p ^ Ndim_p),
	  set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
          set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	       NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	  set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
               (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
    Ndim_p "n-cube Dimension" [1, 20]
        { set(NO_OF_PROCESSORS_p, Nk_p ^ Ndim_p),
	  set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
          set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	       NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	  set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
               (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
    watch "Number of Processors:" (NO_OF_PROCESSORS_p),
    MAX_PACKET_WORDS_p "Packet Length in Words" [3, 2060],
    SWITCH_DELAY_p "Switch Delay" [0, 100000]
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},
    WIRE_DELAY_p "Wire Delay" [0, 100000]
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    watch "Synch Quantum:" (SYNCH_QUANTUM),
    NET_EXACT_p "Exact Simulation"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    ALEWIFE_p "Alewife Version",
    CONST_NET_DELAY "Constant Net Delay"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    SEND_RECEIVE_p "Sync. Send/Receive"
}

param indirparam {
    NO_OF_PROCESSORS_p "Number of Processors" [1, 1024]
	{ set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
          set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	       NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	  set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
               (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
    NET_STAGES_p "Number of Stages" [2, 8],
    MAX_PACKET_WORDS_p "Packet Length in Words" [3, 2060],
    SWITCH_DELAY_p "Switch Delay" [0, 64],
    WIRE_DELAY_p "Wire Delay" [0, 16]
}

menu OS {
    choice SEMA_TTSET_p "" {
        display(OSparam)},
}

param OSparam {
    OS_QUANTUM_p "Operating System Quantum" [1000, 10000],
    USERMAIN_STACK_p "usermain stack blocks" [4, 256],
    MAX_PROC_THREADS_p "Max threads per sim proc" [8, 4096],
    OS_CALL_PRIORITY_p "OS Call Priority",
    RANDOMREQ_p "Use Random Seed",
    FATAL_p "Fatal error in OS calls",
    TIMER_PERIOD_p "Timer Interrupt Period"
}



param simulator {
    SIM_QUANTUM_p "Simulator Quantum" [1, 4096],

    MAX_THREADS_PER_SIMPROC_p "Threads per Sim Proc" [4, 4096]
	{ set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
	      (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
    watch "Threads per cm5 proc" (MAX_THREADS_p),


    STK_BLK_SIZE_p "Stack Block Size" [512, 8192],
    STK_THRESHOLD_p "Stack Overflow Threshold" [256, 2048],
    STKBLKS_PER_SIM_PROC_p "Stack Blocks per SIMULATED Proc" [32, 16384]
	{ set(MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	      (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) },
    watch "Stack Pool per cm5 proc" (MAX_STKBLKS_p),


    SIMREQS_PER_SIM_PROC_p "Simulator Requests per SIM PROC" [2, 16384]
	{ set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)) } ,
    watch "Simreqs per cm5 proc" (MAX_SIMREQS_p),


    MAX_INTR_TYPES_p "Maximum Interrupt Types" [16, 1024],
    INTR_PER_PROCESSOR_p "Maximum Pending Interrupts" [4, 4096],


    PACKETS_PER_SIM_PROC_p "Number of Packets per SIM PROC" [2, 16384]
	{set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	      NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1) },
    watch "Max Packets per CM5 proc" (MAX_PACKETS_p),


    NO_OF_PROCESSORS "Number of CM5 processors" [2, 128]
	{ set (MAX_THREADS_p, MAX_THREADS_PER_SIMPROC_p *
	      (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_STKBLKS_p, STKBLKS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1)),
	  set (MAX_PACKETS_p, PACKETS_PER_SIM_PROC_p *
	       NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1),
	  set (MAX_SIMREQS_p, SIMREQS_PER_SIM_PROC_p *
	       (NO_OF_PROCESSORS_p / NO_OF_PROCESSORS +1))},

    LOCAL_SYNCH "Local Barrier"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    PREDICT_SYNCH "Predictive Barrier Scheduling"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    COLLAPSE_SYNCH "Collapse Barriers"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    RELAXED_SYNCH "Relax Synch Requirements"
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    RELAX_AMOUNT "relaxed synch quantum size" [2, 10000]
	{ set (SYNCH_QUANTUM, ((RELAXED_SYNCH * RELAX_AMOUNT) + 
	                       (1 - RELAXED_SYNCH) * 
   				  ((NET_EXACT_p * (WIRE_DELAY_p + SWITCH_DELAY_p)) +
	                      	   ((1 - NET_EXACT_p) * CONST_NET_DELAY))))},

    watch "Synch Quantum Size" (SYNCH_QUANTUM)
	
}


param statistics {
    WATCH_THREADS_p "Watch Thread Events",
    WATCH_IDLE_p "Watch Idle Events",
    WATCH_BUS_p "Watch bus contention",
    WATCH_NET_p "Watch net contention",
    BARRIER_STATS "Collect Barrier Statistics",
    DO_TIMING "Do timings"
}

param latencies {
    RESCHEDULE_LATENCY_p "Reschedule",
    INTR_LATENCY_p "Interrupt"
}
