You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							60 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							60 lines
						
					
					
						
							1.4 KiB
						
					
					
				| from instruction.instruction import Instruction
 | |
| 
 | |
| #RI类指令
 | |
| class RegImmInstr(Instruction):
 | |
|     def instrDecode(self):
 | |
|         super().instrDecode()
 | |
| 
 | |
|         instr = self.hw.pplReg[1][0].read()
 | |
|         mask = (1 << 5) - 1
 | |
| 
 | |
|         rs = (instr >> 21) & mask
 | |
|         rsData = self.hw.genReg[rs].read()
 | |
|         rt = (instr >> 16) & mask
 | |
| 
 | |
|         self.hw.pplReg[2][0].write(rsData)
 | |
|         self.hw.pplReg[2][2].write(rt)
 | |
| 
 | |
|     def memAccess(self):
 | |
|         super().memAccess()
 | |
| 
 | |
|         res = self.hw.pplReg[3][0].read()
 | |
|         rt = self.hw.pplReg[3][1].read()
 | |
| 
 | |
|         self.hw.genReg[rt].write(res)
 | |
| 
 | |
| #进行零扩展的RI类指令
 | |
| class ZeroExtRegImmInstr(RegImmInstr):
 | |
|     def instrDecode(self):
 | |
|         super().instrDecode()
 | |
| 
 | |
|         instr = self.hw.pplReg[1][0].read()
 | |
|         mask = (1 << 16) - 1
 | |
| 
 | |
|         imm = instr & mask
 | |
|         self.hw.pplReg[2][1].write(imm)
 | |
| 
 | |
| #进行符号扩展的RI类指令
 | |
| class SignExtRegImmInstr(RegImmInstr):
 | |
|     #符号扩展
 | |
|     #输入:
 | |
|     #   imm为16bit数据
 | |
|     #输出:
 | |
|     #   imm的32bit符号扩展
 | |
|     def signedExtend(imm):
 | |
|         mask = (1 << 16) - 1 << 16
 | |
|         if (imm >> 15) & 1:
 | |
|             return imm | mask
 | |
|         else:
 | |
|             return imm
 | |
| 
 | |
|     def instrDecode(self):
 | |
|         super().instrDecode()
 | |
| 
 | |
|         instr = self.hw.pplReg[1][0].read()
 | |
|         mask = (1 << 16) - 1
 | |
| 
 | |
|         imm = instr & mask
 | |
|         imm = SignExtRegImmInstr.signedExtend(imm)
 | |
|         self.hw.pplReg[2][1].write(imm)
 |