packages feed

libriscv-0.1.0.0: test/DecoderTest.hs

module DecoderTest where

import Data.Int
import LibRISCV
import LibRISCV.Internal.Decoder.Instruction
import LibRISCV.Internal.Decoder.Opcodes
import Test.Tasty
import Test.Tasty.HUnit

decoderTests :: TestTree
decoderTests =
    testGroup
        "Decoder Tests"
        [ testCase "Decode ADD instruction" $ do
            let inst = 0x00a605b3

            assertEqual "opcode" (RV_I ADD) $ decode inst
            assertEqual "rd" A1 $ toEnum $ fromIntegral $ mkRd inst
            assertEqual "rs1" A2 $ toEnum $ fromIntegral $ mkRs1 inst
            assertEqual "rs2" A0 $ toEnum $ fromIntegral $ mkRs2 inst
        , testCase "Decode ADDI instruction" $ do
            let inst = 0x02a30293

            assertEqual "opcode" (RV_I ADDI) $ decode inst
            assertEqual "rd" T0 $ toEnum $ fromIntegral $ mkRd inst
            assertEqual "rs1" T1 $ toEnum $ fromIntegral $ mkRs1 inst
            assertEqual "immI" 42 $ immI inst
        , testCase "Decode LW instruction" $ do
            let inst = 0xffc52503

            assertEqual "opcode" (RV_I LW) $ decode inst
            assertEqual "rd" A0 $ toEnum $ fromIntegral $ mkRd inst
            assertEqual "rs1" A0 $ toEnum $ fromIntegral $ mkRs1 inst
            assertEqual "immI" (-4) (fromIntegral (immI inst) :: Int32)
        , testCase "Decode AUIPC instruction" $ do
            let inst = 0x00000297

            assertEqual "opcode" (RV_I AUIPC) $ decode inst
            assertEqual "rd" T0 (toEnum $ fromIntegral (mkRd inst))
            assertEqual "immU" 0 (immU inst)
        , testCase "Decode SW instruction" $ do
            let inst = 0x00102423

            assertEqual "opcode" (RV_I SW) $ decode inst
            assertEqual "rs1" Zero (toEnum $ fromIntegral (mkRs1 inst))
            assertEqual "rs2" RA (toEnum $ fromIntegral (mkRs2 inst))
            assertEqual "immS" 8 $ immS inst
        , testCase "Decode JAL instruction" $ do
            let inst = 0xffdff06f

            assertEqual "opcode" (RV_I JAL) $ decode inst
            assertEqual "rd" Zero (toEnum $ fromIntegral (mkRd inst))
            assertEqual "immJ" (-4) (fromIntegral (immJ inst) :: Int32)
        , testCase "Decode BLT instruction" $ do
            let inst = 0x00b54263

            assertEqual "opcode" (RV_I BLT) $ decode inst
            assertEqual "rs1" A0 (toEnum $ fromIntegral (mkRs1 inst))
            assertEqual "rs2" A1 (toEnum $ fromIntegral (mkRs2 inst))
            assertEqual "immB" 4 $ immB inst
        , testCase "Decode SLLI instruction" $ do
            let inst = 0x00129593

            assertEqual "opcode" (RV32_I SLLI) $ decode inst
            assertEqual "rd" A1 (toEnum $ fromIntegral (mkRd inst))
            assertEqual "rs1" T0 (toEnum $ fromIntegral (mkRs1 inst))
            assertEqual "shamt" 01 $ mkShamt inst
        , testCase "Decode SLLI instruction" $ do
            let inst = 0x01f2d693

            assertEqual "opcode" (RV32_I SRLI) $ decode inst
            assertEqual "rd" A3 (toEnum $ fromIntegral (mkRd inst))
            assertEqual "rs1" T0 (toEnum $ fromIntegral (mkRs1 inst))
            assertEqual "shamt" 31 $ mkShamt inst
        ]