Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. import re
  2.  
  3. label_addr = {}
  4.  
  5. f = open("demofile.txt", "r")
  6.  
  7. # with open('demofile.txt') as f_in:
  8. # l = list(line for line in (l.strip() for l in f_in) if line)
  9. # print(l[0]) #read file without blank line
  10.  
  11. for line in f:
  12. test = re.split(r"\s+", line,5)
  13. if test[1] == 'lw' or test[1] == 'sw' or test[1] == 'add' or test[1] == 'beq' :
  14. y = re.split(r"\s+", line,5)
  15. print(y)
  16. elif test[1] == 'halt' or test[1] == 'noop' :
  17. y = re.split(r"\s+", line,2)
  18. print(y)
  19. elif test[1] == '.fill' :
  20. y = re.split(r"\s+", line,3)
  21. print(y)
  22. elif test[1] == 'jalr':
  23. y = re.split(r"\s+", line,4)
  24. print(y)
  25. else:
  26. raise ValueError("Invalid instruction")
  27.  
  28.  
  29. f2 = open("demofile.txt", "r")
  30. c = 0
  31. for line in f2:
  32. test1 = re.split(r"\s+", line,2)
  33. if test1[0] != '':
  34. # print(test1[0] +" " + str(c))
  35. label_addr[test1[0]] = c
  36. c+=1
  37. print(label_addr)
  38. # print("line["+str(c)+"]: "+x[0])
  39. # c+=1
  40.  
  41.  
  42.  
  43.  
  44.  
  45. mem = [] # 65536 mem
  46. for i in range(0,10):
  47. mem.append(0)
  48. reg = [] # 8 reg 0-7
  49. for i in range(0,8):
  50. reg.append(0)
  51.  
  52.  
  53.  
  54. f3 = open("demofile.txt", "r")
  55. line1 = f3.readline()
  56. line1 = f3.readline()
  57. # line1 = f3.readline()
  58. # line1 = f3.readline()
  59. # line1 = f3.readline()
  60. # line1 = f3.readline()
  61. # line1 = f3.readline()
  62. # line1 = f3.readline()
  63. PC = 0
  64.  
  65.  
  66.  
  67. line_split = re.split(r"\s+", line1,5)
  68. print(line_split)
  69. def R_type_GenCode(line_split):
  70. inst = line_split[1]
  71. regA = line_split[2]
  72. regB = line_split[3]
  73. regDes = line_split[4]
  74. opcode = ''
  75. bi_regA = bin(int(regA))[2:].zfill(3)
  76. bi_regB = bin(int(regB))[2:].zfill(3)
  77. bi_regDes = bin(int(regDes))[2:].zfill(3)
  78. if inst == 'add':
  79. opcode+='000'
  80. elif inst == 'nand':
  81. opcode+='001'
  82. machineCodeInst = '0000000'+opcode+bi_regA+bi_regB+'0000000000000'+bi_regDes
  83. return machineCodeInst
  84.  
  85.  
  86.  
  87. def gen_16twoCom(intNumber):
  88. if intNumber < 0:
  89. if intNumber >= -32768:
  90. negNum = intNumber*-1
  91. top = bin(32767)[2:].zfill(15)
  92. bi = bin(negNum)[2:].zfill(15)
  93. negate = int(top,2) - int(bi,2) + int('1',2)
  94. result = '1'+bin(negate)[2:].zfill(15)
  95. return result
  96. else:
  97. raise ValueError("Overflow Number")
  98. else:
  99. result = bin(intNumber)[2:].zfill(16)
  100. if intNumber < 32768:
  101. return result
  102. else:
  103. raise ValueError("Overflow Number")
  104.  
  105.  
  106.  
  107. def gen_32twoCom(intNumber):
  108. if intNumber < 0:
  109. if intNumber >= -2147483648:
  110. negNum = intNumber*-1
  111. top = bin(2147483647)[2:].zfill(31)
  112. bi = bin(negNum)[2:].zfill(31)
  113. negate = int(top,2) - int(bi,2) + int('1',2)
  114. result = '1'+bin(negate)[2:].zfill(31)
  115. return result
  116. else:
  117. raise ValueError("Overflow Number")
  118. else:
  119. result = bin(intNumber)[2:].zfill(32)
  120. if intNumber < 2147483648:
  121. return result
  122. else:
  123. raise ValueError("Overflow Number")
  124.  
  125.  
  126.  
  127. def I_type_GenCode(line_split):
  128. inst = line_split[1]
  129. regA = line_split[2]
  130. regB = line_split[3]
  131. off = line_split[4]
  132. opcode = ''
  133. bi_regA = bin(int(regA))[2:].zfill(3)
  134. bi_regB = bin(int(regB))[2:].zfill(3)
  135. bi_offset = ''
  136.  
  137. if inst == 'lw':
  138. opcode+='010'
  139. elif inst == 'sw':
  140. opcode+='011'
  141. elif inst == 'beq':
  142. opcode+='100'
  143. else:
  144. raise ValueError("Invalid instruction")
  145. if off.lstrip('-').isdigit() :
  146. bi_offset+=gen_16twoCom(int(off))
  147. else:
  148. sym_addr = off
  149. if sym_addr in label_addr:
  150. bi_offset+=bin(int(str(label_addr[sym_addr])))[2:].zfill(16)
  151. print(bi_offset)
  152. I_code = '0000000' + opcode + bi_regA + bi_regB + bi_offset
  153. return I_code
  154.  
  155. print(I_type_GenCode(line_split))
  156. def j_type_GenCode(line_split):
  157.  
  158. regA = line_split[2]
  159. regB = line_split[3]
  160. opcode = '101'
  161. bi_regA = bin(int(regA))[2:].zfill(3)
  162. bi_regB = bin(int(regB))[2:].zfill(3)
  163. return '0000000'+opcode+bi_regA+bi_regB+'0000000000000000'
  164.  
  165. def O_type_GenCode(line_split):
  166. opcode = ''
  167. if line_split[1] == 'halt':
  168. opcode+='110'
  169. elif line_split[1] == 'noop':
  170. opcode+='111'
  171.  
  172. return '0000000'+opcode+'0000000000000000000000'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement