Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. package simulator;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. import java.util.Scanner;
  6.  
  7. import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
  8.  
  9. import dataStructures.stages.DecodeStage;
  10. import dataStructures.stages.ExecuteStage;
  11. import dataStructures.stages.FetchStage;
  12. import dataStructures.stages.MemoryStage;
  13. import dataStructures.stages.WriteBackStage;
  14.  
  15. public class Engine {
  16. static boolean excuteSchedule[][];
  17. static int numOfInstructions;
  18. static int clkCycles;
  19. static FetchStage fetchStage;
  20. static DecodeStage decodeStage;
  21. static ExecuteStage executeStage;
  22. static MemoryStage memoryStage;
  23. static WriteBackStage writeBackStage;
  24.  
  25. public static void main(String[] args) throws Exception {
  26. Environment env = new Environment();
  27. fetchStage = new FetchStage(env);
  28. decodeStage = new DecodeStage(env);
  29. executeStage = new ExecuteStage(env);
  30. memoryStage = new MemoryStage(env);
  31. writeBackStage = new WriteBackStage(env);
  32. String currentDirectory = System.getProperty("user.dir");
  33. Scanner sc = new Scanner(new File(currentDirectory + "\\input.txt"));
  34. env.getInstructionMemory().setInstructions(assembler(parser(sc)));
  35. initializeSchedule();
  36. for (int i = 0; i < clkCycles; i++) {
  37. if (excuteSchedule[4][i]) {
  38. writeBackStage.run();
  39. }
  40. if (excuteSchedule[3][i]) {
  41. memoryStage.run();
  42. }
  43. if (excuteSchedule[2][i]) {
  44. executeStage.run();
  45. }
  46. if (excuteSchedule[1][i]) {
  47. decodeStage.run();
  48. }
  49. if (excuteSchedule[0][i]) {
  50. fetchStage.run();
  51. }
  52.  
  53. }
  54.  
  55. }
  56.  
  57. private static void initializeSchedule() {
  58. clkCycles = 5 + numOfInstructions;
  59. for (int i = 0; i < numOfInstructions; i++) {
  60. for (int j = i; j < clkCycles; j++) {
  61. excuteSchedule[i][j] = true;
  62. }
  63. }
  64. }
  65.  
  66. private static int[] assembler(ArrayList<String>[] parser) {
  67. String[] assemblyCodeInstructions = new String[parser.length];
  68. for (int i = 0; i < assemblyCodeInstructions.length; i++) {
  69. String func = "000000000000";
  70. String op;
  71. String reg1;
  72. String reg2;
  73. String writeReg;
  74. String command = parser[i].get(0);
  75.  
  76. switch (command) {
  77. // a
  78. case "sum":
  79. op = "0000";
  80. reg1 = regAddress(parser[i].get(1));
  81. reg2 = regAddress(parser[i].get(2));
  82. writeReg = regAddress(parser[i].get(3));
  83. func += "0000";
  84. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  85. break;
  86. case "mul":
  87. op = "0000";
  88. reg1 = regAddress(parser[i].get(1));
  89. reg2 = regAddress(parser[i].get(2));
  90. writeReg = regAddress(parser[i].get(3));
  91. func += "0001";
  92. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  93. break;
  94. case "div":
  95. op = "0000";
  96. reg1 = regAddress(parser[i].get(1));
  97. reg2 = regAddress(parser[i].get(2));
  98. writeReg = regAddress(parser[i].get(3));
  99. func += "0010";
  100. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  101. break;
  102. case "sge":
  103. op = "0000";
  104. reg1 = regAddress(parser[i].get(1));
  105. reg2 = regAddress(parser[i].get(2));
  106. writeReg = regAddress(parser[i].get(3));
  107. func += "0011";
  108. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  109. break;
  110. case "sle":
  111. op = "0000";
  112. reg1 = regAddress(parser[i].get(1));
  113. reg2 = regAddress(parser[i].get(2));
  114. writeReg = regAddress(parser[i].get(3));
  115. func += "0100";
  116. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  117. break;
  118. case "and":
  119. op = "0000";
  120. reg1 = regAddress(parser[i].get(1));
  121. reg2 = regAddress(parser[i].get(2));
  122. writeReg = regAddress(parser[i].get(3));
  123. func += "0101";
  124. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  125. break;
  126. case "or":
  127. op = "0000";
  128. reg1 = regAddress(parser[i].get(1));
  129. reg2 = regAddress(parser[i].get(2));
  130. writeReg = regAddress(parser[i].get(3));
  131. func += "0110";
  132. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  133. break;
  134. case "eq":
  135. op = "0000";
  136. reg1 = regAddress(parser[i].get(1));
  137. reg2 = regAddress(parser[i].get(2));
  138. writeReg = regAddress(parser[i].get(3));
  139. func += "0111";
  140. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  141. break;
  142. // b
  143. case "sumi":
  144. op = "0001";
  145. reg1 = regAddress(parser[i].get(1));
  146. reg2 = regAddress(parser[i].get(2));
  147. func = makeItTweny(parser[i].get(3));
  148. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  149. break;
  150. case "ld":
  151. op = "0010";
  152. reg1 = regAddress(parser[i].get(1));
  153. reg2 = regAddress(parser[i].get(2));
  154. func = makeItTweny(parser[i].get(3));
  155. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  156. break;
  157. case "st":
  158. op = "0011";
  159. reg1 = regAddress(parser[i].get(1));
  160. reg2 = regAddress(parser[i].get(2));
  161. func = makeItTweny(parser[i].get(3));
  162. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  163.  
  164. break;
  165. case "muli":
  166. op = "0100";
  167. reg1 = regAddress(parser[i].get(1));
  168. reg2 = regAddress(parser[i].get(2));
  169. func = makeItTweny(parser[i].get(3));
  170. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  171.  
  172. break;
  173. case "divi":
  174. op = "0101";
  175. reg1 = regAddress(parser[i].get(1));
  176. reg2 = regAddress(parser[i].get(2));
  177. func = makeItTweny(parser[i].get(3));
  178. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  179.  
  180. break;
  181. case "inc":
  182. op = "0110";
  183. reg1 = regAddress(parser[i].get(1));
  184. reg2 = regAddress(parser[i].get(2));
  185. func = makeItTweny(parser[i].get(3));
  186. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  187.  
  188. break;
  189. case "clr":
  190. op = "0111";
  191. reg1 = regAddress(parser[i].get(1));
  192. reg2 = regAddress(parser[i].get(2));
  193. func = makeItTweny(parser[i].get(3));
  194. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  195.  
  196. break;
  197. case "set":
  198. op = "1000";
  199. reg1 = regAddress(parser[i].get(1));
  200. reg2 = regAddress(parser[i].get(2));
  201. func = makeItTweny(parser[i].get(3));
  202. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  203.  
  204. break;
  205. // c
  206. case "not":
  207. op = "1001";
  208. reg1 = regAddress(parser[i].get(1));
  209. func += func;
  210. assemblyCodeInstructions[i] = op + reg1 + func;
  211.  
  212. break;
  213. case "neg":
  214. op = "1010";
  215. reg1 = regAddress(parser[i].get(1));
  216. func += func;
  217. assemblyCodeInstructions[i] = op + reg1 + func;
  218.  
  219. break;
  220. // d
  221. case "skp":
  222. op = "1011";
  223. reg1 = regAddress(parser[i].get(1));
  224. func += func; // dummy func
  225. assemblyCodeInstructions[i] = op + reg1 + func;
  226.  
  227. break;// don't care ?
  228. case "jmp":
  229. op = "1100";
  230. func = "00000000";
  231. String address = parser[i].get(1);
  232. assemblyCodeInstructions[i] = op + func + makeItTweny("" + findInParser(parser, address)); // not
  233.  
  234. break;
  235. default:
  236. assemblyCodeInstructions[i] = "11111111111111111111111111111111";
  237. }
  238.  
  239. }
  240. numOfInstructions = assemblyCodeInstructions.length;
  241. int []assemblyCodeInstructionsInt=new int[assemblyCodeInstructions.length];
  242. for (int i = 0; i < assemblyCodeInstructionsInt.length; i++) {
  243. assemblyCodeInstructionsInt[i]=Integer.parseInt(assemblyCodeInstructions[i], 2);
  244.  
  245. }
  246.  
  247. return assemblyCodeInstructionsInt;
  248.  
  249. }
  250.  
  251. private static int findInParser(ArrayList<String>[] parser, String address) {
  252. for (int i = 0; i < parser.length; i++) {
  253. if (parser[i].get(0).equals(address))
  254. return i;
  255. }
  256. return -1;
  257. }
  258.  
  259. private static String regAddress(String regName) {
  260. switch (regName) {
  261. case "g0":
  262. return "0000";
  263. case "g1":
  264. return "0001";
  265. case "g2":
  266. return "0010";
  267. case "g3":
  268. return "0011";
  269. case "g4":
  270. return "0100";
  271. case "g5":
  272. return "0101";
  273. case "g6":
  274. return "0110";
  275. case "g7":
  276. return "0111";
  277. case "sp":
  278. return "1000";
  279. case "p0":
  280. return "1001";
  281. case "p1":
  282. return "1010";
  283. case "p2":
  284. return "1011";
  285. case "p3":
  286. return "1100";
  287. case "r0":
  288. return "1101";
  289. case "zero":
  290. return "1110";
  291. case "pc":
  292. return "1111";
  293.  
  294. }
  295. return "wrongRegName";
  296. }
  297.  
  298. private static String makeItTweny(String i) {
  299. String s = Integer.toBinaryString(Integer.parseInt(i));
  300. while (s.length() < 20)
  301. s = "0" + s;
  302. return s;
  303. }
  304.  
  305. private static ArrayList<String>[] parser(Scanner sc) {
  306. ArrayList<String> temp = new ArrayList<String>();
  307.  
  308. while (sc.hasNextLine()) {
  309. temp.add(sc.nextLine());
  310. }
  311. ArrayList<String> returned[] = (ArrayList<String>[]) new ArrayList[temp.size()];
  312. for (int i = 0; i < returned.length; i++) {
  313. // System.out.println(temp.get(i));
  314.  
  315. String[] s = temp.get(i).split(" ");
  316. System.out.println(temp.get(i));
  317. returned[i] = new ArrayList<String>();
  318. for (int j = 0; j < s.length; j++) {
  319.  
  320. returned[i].add(s[j]);
  321. }
  322. }
  323.  
  324. return returned;
  325. }
  326.  
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement