Advertisement
Guest User

Untitled

a guest
Aug 24th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. import sys
  2. import subprocess
  3. import random
  4. import binascii
  5.  
  6. lifec = """#include <stdio.h>
  7. #include <stdlib.h>
  8. #include "test_board.h"
  9. int neighbours(int, int);
  10. void copyBackAndShow();
  11. int main(void)
  12. {
  13. int maxiters;
  14. printf("# Iterations: ");
  15. scanf("%d", &maxiters);
  16. for (int n = 1; n <= maxiters; n++) {
  17. for (int i = 0; i < N; i++) {
  18. for (int j = 0; j < N; j++) {
  19. int nn = neighbours(i,j);
  20. if (board[i][j] == 1) {
  21. if (nn < 2)
  22. newboard[i][j] = 0;
  23. else if (nn ==2 || nn == 3)
  24. newboard[i][j] = 1;
  25. else
  26. newboard[i][j] = 0;
  27. }
  28. else if (nn == 3)
  29. newboard[i][j] = 1;
  30. else
  31. newboard[i][j] = 0;
  32. }
  33. }
  34. printf("=== After iteration %d ===\\n", n);
  35. copyBackAndShow();
  36. }
  37. return 0;
  38. }
  39. int neighbours(int i, int j)
  40. {
  41. int nn = 0;
  42. for (int x = -1; x <= 1; x++) {
  43. for (int y = -1; y <= 1; y++) {
  44. if (i+x < 0 || i+x > N-1) continue;
  45. if (j+y < 0 || j+y > N-1) continue;
  46. if (x == 0 && y == 0) continue;
  47. if (board[i+x][j+y] == 1) nn++;
  48. }
  49. }
  50. return nn;
  51. }
  52. void copyBackAndShow()
  53. {
  54. for (int i = 0; i < N; i++) {
  55. for (int j = 0; j < N; j++) {
  56. board[i][j] = newboard[i][j];
  57. if (board[i][j] == 0)
  58. putchar('.');
  59. else
  60. putchar('#');
  61. }
  62. putchar('\\n');
  63. }
  64. }
  65. """
  66. # Generate and write a random board.
  67. def generateTest(dim):
  68. cboard = bytearray()
  69. mboard = bytearray()
  70.  
  71. curly_boye = '{'.encode('utf-8')
  72. comma = ','.encode('utf-8')
  73. byte_byte = '.byte '.encode('utf-8')
  74. curly_boye_2 = '}'.encode('utf-8')
  75. eol = '\n'.encode('utf-8')
  76. end_curly_boye = '};'.encode('utf-8')
  77.  
  78. cboard.extend(curly_boye)
  79. for i in range(0, dim):
  80. cboard.extend(curly_boye)
  81. mboard.extend(byte_byte)
  82. for j in range(0, dim):
  83. n = random.randint(0, 1)
  84. cboard.extend(str(n).encode('utf-8'))
  85. mboard.extend(str(n).encode('utf-8'))
  86. if j != dim - 1:
  87. cboard.extend(comma)
  88. mboard.extend(comma)
  89. cboard.extend(curly_boye_2)
  90. cboard.extend(comma)
  91. mboard.extend(eol)
  92. cboard.extend(end_curly_boye)
  93.  
  94. with open("test_board.h", 'w') as bfile:
  95. bfile.write("#define NN " + str(dim) + "\n")
  96. bfile.write("int N = NN;")
  97. bfile.write("char board[NN][NN] = ")
  98. bfile.write(cboard.decode('utf-8'))
  99. bfile.write("char newboard[NN][NN];")
  100. bfile.close()
  101.  
  102. with open("test_life.s", 'w') as bfile:
  103. bfile.write(".data\n")
  104. bfile.write("N: .word " + str(dim) + "\n")
  105. bfile.write("board:\n")
  106. bfile.write(mboard.decode('utf-8'))
  107. bfile.write("newBoard: .space 100")
  108. with open("prog.s", 'r') as pfile:
  109. asm_prog = pfile.read()
  110. bfile.write(asm_prog)
  111. pfile.close()
  112. bfile.close()
  113.  
  114. def compile():
  115. subprocess.run(["gcc", "-o", "test_life", "test_life.c"])
  116.  
  117. def run_tests(iters):
  118. encoded_in = str(iters).encode('utf-8')
  119. expected = subprocess.run(["./test_life"], stdout=subprocess.PIPE, input=encoded_in).stdout.decode('utf-8')
  120. received = subprocess.run(["spim", "-file", "test_life.s"], stdout=subprocess.PIPE, input=encoded_in).stdout.decode('utf-8')
  121.  
  122. received = '\n'.join(received.split('\n')[5:])
  123.  
  124. if expected != received:
  125. with open('out_exp.txt', 'w') as efile:
  126. efile.write(expected)
  127. efile.close()
  128. with open('out.txt', 'w') as ofile:
  129. ofile.write(received)
  130. ofile.close()
  131. return False
  132. return True
  133.  
  134. def main():
  135. usage = "Usage: python3 check_life.py num_tests [seed]"
  136. num_args = len(sys.argv)
  137. if not (2 <=num_args <= 3):
  138. print(usage)
  139. sys.exit()
  140. try:
  141. n_tests = int(sys.argv[1])
  142. except ValueError:
  143. print(usage)
  144. sys.exit()
  145.  
  146. if num_args == 3:
  147. try:
  148. random.seed(int(sys.argv[1]))
  149. except ValueError:
  150. print(usage)
  151. sys.exit()
  152.  
  153. with open("test_life.c", 'w') as tfile:
  154. tfile.write(lifec)
  155. tfile.close()
  156.  
  157. for i in range(0, n_tests):
  158. dim = random.randint(2, 50)
  159. print ("Generating a " + str(dim) + "*" + str(dim) + " board...")
  160. generateTest(dim)
  161. compile()
  162. iters = random.randint(2, 100)
  163. print ("Running " + str(iters) + " iterations...")
  164. res = run_tests(iters)
  165. if not res:
  166. print("Test " + str(i) + " failed. Check output at out_exp.txt and out.txt")
  167. else:
  168. print("Test " + str(i) + " passed.")
  169.  
  170. subprocess.run(["rm", "test_life"])
  171. subprocess.run(["rm", "test_life.c"])
  172. subprocess.run(["rm", "test_life.s"])
  173. subprocess.run(["rm", "test_board.h"])
  174.  
  175. if __name__ == "__main__":
  176. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement