func (this *Branch) Process(operation *operation.Operation) (*operation.Operation, error) { instruction := operation.Instruction() info := instruction.Info operands := instruction.Data switch info.Type { case data.TypeI: registerD := operands.(*data.DataI).RegisterD.ToUint32() op1 := this.Bus().LoadRegister(operation, registerD) registerS := operands.(*data.DataI).RegisterS.ToUint32() op2 := this.Bus().LoadRegister(operation, registerS) logger.Collect(" => [BR][%03d]: [R%d(%#02X) = %#08X ? R%d(%#02X) = %#08X]", operation.Id(), registerD, registerD*consts.BYTES_PER_WORD, op1, registerS, registerS*consts.BYTES_PER_WORD, op2) taken, err := processOperation(op1, op2, info.Opcode) if err != nil { return operation, nil } operation.SetBranchResult(taken) if taken { offsetAddress := ComputeOffsetTypeI(operands) this.Bus().IncrementProgramCounter(operation, offsetAddress) logger.Collect(" => [BR][%03d]: [PC(offset) = 0x%06X", operation.Id(), offsetAddress) } else { // Notify ROB this.Bus().IncrementProgramCounter(operation, 0) } case data.TypeJ: address := ComputeAddressTypeJ(operands) this.Bus().SetProgramCounter(operation, uint32(address-consts.BYTES_PER_WORD)) logger.Collect(" => [BR][%03d]: [Address = %06X]", operation.Id(), address) default: return operation, errors.New(fmt.Sprintf("Invalid data type to process by Branch unit. Type: %d", info.Type)) } return operation, nil }