109 lines
4.6 KiB
Haskell
109 lines
4.6 KiB
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE NumericUnderscores #-}
|
|
|
|
module Read(Read.read) where
|
|
import DecodeTypes(
|
|
Opcode(..),
|
|
|
|
RTypeFields(..), ITypeFields(..), STypeFields(..),
|
|
BTypeFields(..), UTypeFields(..), JTypeFields(..),
|
|
|
|
)
|
|
import Clash.Prelude
|
|
import Decode(DecodeResult(..))
|
|
import Cpu(RISCVCPU(..))
|
|
import RegFiles (RegVal(..), GPR)
|
|
|
|
read :: DecodeResult -> RISCVCPU -> DecodeResult
|
|
read (Opcode opcode addr) riscvCPU =
|
|
let
|
|
gprRegFile = gpr riscvCPU
|
|
opcode' = case opcode of
|
|
-- R-Type
|
|
ADD fields -> (ADD (readRTypeFields fields gprRegFile))
|
|
SUB fields -> (SUB (readRTypeFields fields gprRegFile))
|
|
XOR fields -> (XOR (readRTypeFields fields gprRegFile))
|
|
OR fields -> (OR (readRTypeFields fields gprRegFile))
|
|
AND fields -> (AND (readRTypeFields fields gprRegFile))
|
|
SLL fields -> (SLL (readRTypeFields fields gprRegFile))
|
|
SRL fields -> (SRL (readRTypeFields fields gprRegFile))
|
|
SRA fields -> (SRA (readRTypeFields fields gprRegFile))
|
|
SLT fields -> (SLT (readRTypeFields fields gprRegFile))
|
|
SLTU fields -> (SLTU (readRTypeFields fields gprRegFile))
|
|
|
|
-- I-Type
|
|
ADDI fields -> (ADDI (readITypeFields fields gprRegFile))
|
|
XORI fields -> (XORI (readITypeFields fields gprRegFile))
|
|
ORI fields -> (ORI (readITypeFields fields gprRegFile))
|
|
ANDI fields -> (ANDI (readITypeFields fields gprRegFile))
|
|
SLLI fields -> (SLLI (readITypeFields fields gprRegFile))
|
|
SRLI fields -> (SRLI (readITypeFields fields gprRegFile))
|
|
SRAI fields -> (SRAI (readITypeFields fields gprRegFile))
|
|
SLTI fields -> (SLTI (readITypeFields fields gprRegFile))
|
|
SLTIU fields -> (SLTIU (readITypeFields fields gprRegFile))
|
|
LB fields -> (LB (readITypeFields fields gprRegFile))
|
|
LH fields -> (LH (readITypeFields fields gprRegFile))
|
|
LW fields -> (LW (readITypeFields fields gprRegFile))
|
|
LBU fields -> (LBU (readITypeFields fields gprRegFile))
|
|
LHU fields -> (LHU (readITypeFields fields gprRegFile))
|
|
JALR fields -> (JALR (readITypeFields fields gprRegFile))
|
|
ECALL fields -> (ECALL (readITypeFields fields gprRegFile)) -- No regs needed, but consistent
|
|
EBREAK fields -> (EBREAK (readITypeFields fields gprRegFile)) -- Ditto
|
|
|
|
-- S-Type
|
|
SB fields -> (SB (readSTypeFields fields gprRegFile))
|
|
SH fields -> (SH (readSTypeFields fields gprRegFile))
|
|
SW fields -> (SW (readSTypeFields fields gprRegFile))
|
|
|
|
-- B-Type
|
|
BEQ fields -> (BEQ (readBTypeFields fields gprRegFile))
|
|
BNE fields -> (BNE (readBTypeFields fields gprRegFile))
|
|
BLT fields -> (BLT (readBTypeFields fields gprRegFile))
|
|
BGE fields -> (BGE (readBTypeFields fields gprRegFile))
|
|
BLTU fields -> (BLTU (readBTypeFields fields gprRegFile))
|
|
BGEU fields -> (BGEU (readBTypeFields fields gprRegFile))
|
|
|
|
-- U-Type
|
|
LUI fields -> (LUI (readUTypeFields fields gprRegFile))
|
|
AUIPC fields -> (AUIPC (readUTypeFields fields gprRegFile))
|
|
|
|
-- J-Type
|
|
JAL fields -> (JAL (readJTypeFields fields gprRegFile))
|
|
in
|
|
Opcode opcode' addr
|
|
|
|
read (DecodeException e addr) _ = DecodeException e addr
|
|
read (InstructionException e addr) _ = InstructionException e addr
|
|
|
|
readRTypeFields :: RTypeFields -> GPR -> RTypeFields
|
|
readRTypeFields (RTypeFields rd funct3 rs1 rs2 funct7) gprRegFile =
|
|
let rs1_val = fetchGPRRegVal rs1 gprRegFile
|
|
rs2_val = fetchGPRRegVal rs2 gprRegFile
|
|
in RTypeFields rd funct3 rs1_val rs2_val funct7
|
|
|
|
readITypeFields :: ITypeFields -> GPR -> ITypeFields
|
|
readITypeFields (ITypeFields rd funct3 rs1 imm) gprRegFile =
|
|
let rs1_val = fetchGPRRegVal rs1 gprRegFile
|
|
in ITypeFields rd funct3 rs1_val imm
|
|
|
|
readSTypeFields :: STypeFields -> GPR -> STypeFields
|
|
readSTypeFields (STypeFields funct3 rs1 rs2 imm12) gprRegFile =
|
|
let rs1_val = fetchGPRRegVal rs1 gprRegFile
|
|
rs2_val = fetchGPRRegVal rs2 gprRegFile
|
|
in STypeFields funct3 rs1_val rs2_val imm12
|
|
|
|
readBTypeFields :: BTypeFields -> GPR -> BTypeFields
|
|
readBTypeFields (BTypeFields funct3 rs1 rs2 imm13) gprRegFile =
|
|
let rs1_val = fetchGPRRegVal rs1 gprRegFile
|
|
rs2_val = fetchGPRRegVal rs2 gprRegFile
|
|
in BTypeFields funct3 rs1_val rs2_val imm13
|
|
|
|
readUTypeFields :: UTypeFields -> GPR -> UTypeFields
|
|
readUTypeFields fields@(UTypeFields rd imm20) _ = fields
|
|
|
|
readJTypeFields :: JTypeFields -> GPR -> JTypeFields
|
|
readJTypeFields fields@(JTypeFields rd imm21) _ = fields
|
|
|
|
fetchGPRRegVal :: RegVal -> GPR -> RegVal
|
|
fetchGPRRegVal (Unpopulated idx) gprVal = Value idx (gprVal !! idx)
|
|
fetchGPRRegVal val@(Value _ _) _ = val -- Already populated, no change |