added supporting files for assignment-1
This commit is contained in:
		
							parent
							
								
									2da447a4fd
								
							
						
					
					
						commit
						d130a8756e
					
				
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,113 @@
 | 
				
			||||||
 | 
					#!/bin/python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					from threading import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def evaluate(submitted_program):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jarfile = "./emulator.jar"
 | 
				
			||||||
 | 
						testcases_directory = "./test_cases/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						l = len(submitted_program.split("/"))
 | 
				
			||||||
 | 
						program_name = submitted_program.split("/")[l-1].split("_")[0].split(".")[0]
 | 
				
			||||||
 | 
						total_marks = 0
 | 
				
			||||||
 | 
						scored_marks = 0
 | 
				
			||||||
 | 
						for cur_file in os.listdir(testcases_directory):
 | 
				
			||||||
 | 
							if program_name in cur_file and ".input" in cur_file:
 | 
				
			||||||
 | 
								total_marks = total_marks + 1
 | 
				
			||||||
 | 
					#find starting and ending address
 | 
				
			||||||
 | 
								expected_file = open(testcases_directory + cur_file.split(".")[0] + ".expected")
 | 
				
			||||||
 | 
								starting_address = "x"
 | 
				
			||||||
 | 
								ending_address = "x"
 | 
				
			||||||
 | 
								memory_required = False
 | 
				
			||||||
 | 
								for line in expected_file:
 | 
				
			||||||
 | 
									if memory_required == True:
 | 
				
			||||||
 | 
										if len(line.split(":")) > 1:
 | 
				
			||||||
 | 
											if starting_address == "x":
 | 
				
			||||||
 | 
												starting_address = line.split(":")[0].split()[0]
 | 
				
			||||||
 | 
											else:
 | 
				
			||||||
 | 
												ending_address = line.split(":")[0].split()[0]
 | 
				
			||||||
 | 
									if "Main Memory Contents" in line:
 | 
				
			||||||
 | 
										memory_required = True
 | 
				
			||||||
 | 
								expected_file.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if starting_address == "x":
 | 
				
			||||||
 | 
									starting_address = "0"
 | 
				
			||||||
 | 
									ending_address = "0"
 | 
				
			||||||
 | 
								if ending_address == "x":
 | 
				
			||||||
 | 
									ending_address = starting_address
 | 
				
			||||||
 | 
					#create new assembly file based on test case
 | 
				
			||||||
 | 
								new_assembly_file = open("./tmp.asm", 'w')
 | 
				
			||||||
 | 
								input_file = open(testcases_directory + cur_file)
 | 
				
			||||||
 | 
								for line in input_file:
 | 
				
			||||||
 | 
									new_assembly_file.write(line)
 | 
				
			||||||
 | 
								input_file.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								text_encountered = False
 | 
				
			||||||
 | 
								submitted_file = open(submitted_program)
 | 
				
			||||||
 | 
								for line in submitted_file:
 | 
				
			||||||
 | 
									if ".text" in line:
 | 
				
			||||||
 | 
										text_encountered = True
 | 
				
			||||||
 | 
									if text_encountered == True:
 | 
				
			||||||
 | 
										new_assembly_file.write(line)
 | 
				
			||||||
 | 
								submitted_file.close()
 | 
				
			||||||
 | 
								new_assembly_file.close()
 | 
				
			||||||
 | 
					# spawn emulator
 | 
				
			||||||
 | 
								stdout_file = open("./tmp.output", 'w')
 | 
				
			||||||
 | 
								popen_args = ["java", "-Xmx1g", "-jar", jarfile, "./tmp.asm", starting_address, ending_address]
 | 
				
			||||||
 | 
								proc = subprocess.Popen(popen_args, stdout = stdout_file, stderr = stdout_file)
 | 
				
			||||||
 | 
								timer = Timer(5, proc.kill)
 | 
				
			||||||
 | 
								try:
 | 
				
			||||||
 | 
									timer.start()
 | 
				
			||||||
 | 
									stdout, stderr = proc.communicate()
 | 
				
			||||||
 | 
								finally:
 | 
				
			||||||
 | 
									timer.cancel()
 | 
				
			||||||
 | 
								stdout_file.close()
 | 
				
			||||||
 | 
					# evaluate against expected output
 | 
				
			||||||
 | 
								expected_file = open(testcases_directory + cur_file.split(".")[0] + ".expected")
 | 
				
			||||||
 | 
								result_file = open("./tmp.output")
 | 
				
			||||||
 | 
								expected_line = expected_file.readline()
 | 
				
			||||||
 | 
								first_line_found = False
 | 
				
			||||||
 | 
								evaluation = True
 | 
				
			||||||
 | 
								for line in result_file:
 | 
				
			||||||
 | 
									if first_line_found == True and line != expected_line:
 | 
				
			||||||
 | 
										evaluation = False
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									if expected_line == line:
 | 
				
			||||||
 | 
										first_line_found = True
 | 
				
			||||||
 | 
										expected_line = expected_file.readline()
 | 
				
			||||||
 | 
										if expected_line == None or expected_line == "":
 | 
				
			||||||
 | 
											break
 | 
				
			||||||
 | 
								if first_line_found == False:
 | 
				
			||||||
 | 
									evaluation = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								expected_file.close()
 | 
				
			||||||
 | 
								result_file.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if evaluation == True:
 | 
				
			||||||
 | 
									scored_marks = scored_marks + 1
 | 
				
			||||||
 | 
									print(cur_file + "\t: PASS!")
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									print(cur_file + "\t: Fail")
 | 
				
			||||||
 | 
					#debug print
 | 
				
			||||||
 | 
								debug = False
 | 
				
			||||||
 | 
								if debug == True:
 | 
				
			||||||
 | 
									print("testcase = " + cur_file)
 | 
				
			||||||
 | 
									print("\n output expected to contain = ")
 | 
				
			||||||
 | 
									expected_file = open(testcases_directory + cur_file.split(".")[0] + ".expected")
 | 
				
			||||||
 | 
									for line in expected_file:
 | 
				
			||||||
 | 
										print(line)
 | 
				
			||||||
 | 
									expected_file.close()
 | 
				
			||||||
 | 
									print("\n obtained output = ")
 | 
				
			||||||
 | 
									output_file = open("./tmp.output")
 | 
				
			||||||
 | 
									for line in output_file:
 | 
				
			||||||
 | 
										print(line)
 | 
				
			||||||
 | 
									output_file.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								os.remove("./tmp.asm")
 | 
				
			||||||
 | 
								os.remove("./tmp.output")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return [total_marks, scored_marks]
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						70
 | 
				
			||||||
 | 
						80
 | 
				
			||||||
 | 
						40
 | 
				
			||||||
 | 
						20
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						30
 | 
				
			||||||
 | 
						50
 | 
				
			||||||
 | 
						60
 | 
				
			||||||
 | 
					n:
 | 
				
			||||||
 | 
						8
 | 
				
			||||||
 | 
						.text
 | 
				
			||||||
 | 
					// your code here
 | 
				
			||||||
 | 
					// you may change the numbers in the array, and the size of the array; but allow the name of the array to remain as 'a', and size as 'n'
 | 
				
			||||||
 | 
					// remove these comments!
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						.text
 | 
				
			||||||
 | 
					// your code here to check if the number 'a' is even or odd. If yes, write 1 to x10. Else write -1.
 | 
				
			||||||
 | 
					// you may change the value of 'a'
 | 
				
			||||||
 | 
					// remove these comments!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					n:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						.text
 | 
				
			||||||
 | 
					// your code here to get the first 'n' Fibonacci numbers
 | 
				
			||||||
 | 
					// you may change the value of 'n'
 | 
				
			||||||
 | 
					// remove these comments!
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						.text
 | 
				
			||||||
 | 
					// your code here to check if 'a' is a palindrome
 | 
				
			||||||
 | 
					// you may change the value of 'a'
 | 
				
			||||||
 | 
					// remove these comments!
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						.text
 | 
				
			||||||
 | 
					// your code here to check if the number 'a' is prime. If yes, write 1 to x10. Else write -1.
 | 
				
			||||||
 | 
					// you may change the value of 'a'
 | 
				
			||||||
 | 
					// remove these comments!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					Main Memory Contents:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0		: 80
 | 
				
			||||||
 | 
					1		: 70
 | 
				
			||||||
 | 
					2		: 60
 | 
				
			||||||
 | 
					3		: 50
 | 
				
			||||||
 | 
					4		: 40
 | 
				
			||||||
 | 
					5		: 30
 | 
				
			||||||
 | 
					6		: 20
 | 
				
			||||||
 | 
					7		: 10
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						70
 | 
				
			||||||
 | 
						80
 | 
				
			||||||
 | 
						40
 | 
				
			||||||
 | 
						20
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
 | 
						30
 | 
				
			||||||
 | 
						50
 | 
				
			||||||
 | 
						60
 | 
				
			||||||
 | 
					n:
 | 
				
			||||||
 | 
						8
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					x10	: -1
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					Main Memory Contents:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					65526		: 34
 | 
				
			||||||
 | 
					65527		: 21
 | 
				
			||||||
 | 
					65528		: 13
 | 
				
			||||||
 | 
					65529		: 8
 | 
				
			||||||
 | 
					65530		: 5
 | 
				
			||||||
 | 
					65531		: 3
 | 
				
			||||||
 | 
					65532		: 2
 | 
				
			||||||
 | 
					65533		: 1
 | 
				
			||||||
 | 
					65534		: 1
 | 
				
			||||||
 | 
					65535		: 0
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					n:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					x10	: 1
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						12321
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					x10	: -1
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
						.data
 | 
				
			||||||
 | 
					a:
 | 
				
			||||||
 | 
						10
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					#!/bin/python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					from evaluate import evaluate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					evaluate(sys.argv[1])
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					#!/bin/python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import zipfile
 | 
				
			||||||
 | 
					from evaluate import evaluate
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					zip_file = sys.argv[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					l = len(zip_file.split("/"))
 | 
				
			||||||
 | 
					print("Students :\t" + zip_file.split("/")[l-1].split("_")[0] + " and " + zip_file.split("_")[1].split(".")[0])
 | 
				
			||||||
 | 
					print("")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					submissions_temp_dir = "./submissions/" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if not os.path.exists(submissions_temp_dir):
 | 
				
			||||||
 | 
						os.mkdir(submissions_temp_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					zip_ref = zipfile.ZipFile(zip_file, 'r')
 | 
				
			||||||
 | 
					zip_ref.extractall(submissions_temp_dir)
 | 
				
			||||||
 | 
					zip_ref.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					total_marks = 0
 | 
				
			||||||
 | 
					scored_marks = 0
 | 
				
			||||||
 | 
					for asm_file in os.listdir(submissions_temp_dir):
 | 
				
			||||||
 | 
						if ".asm in file":
 | 
				
			||||||
 | 
							[t,s] = evaluate(submissions_temp_dir + asm_file)
 | 
				
			||||||
 | 
							print(asm_file + ";\tscore = " + str(s) + " out of " + str(t))
 | 
				
			||||||
 | 
							total_marks = total_marks + t
 | 
				
			||||||
 | 
							scored_marks = scored_marks + s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shutil.rmtree(submissions_temp_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("total score = " + str(scored_marks) + " out of " + str(total_marks))
 | 
				
			||||||
		Loading…
	
		Reference in New Issue