diff --git a/Data/RiscV/Instruction.hs b/Data/RiscV/Instruction.hs
new file mode 100644
--- /dev/null
+++ b/Data/RiscV/Instruction.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE ViewPatterns, PatternSynonyms #-}
+
+module Data.RiscV.Instruction where
+
+import Clash.Prelude.Safe
+
+newtype MajorOpcode = MajorOpcode (BitVector 5) deriving (Eq)
+newtype MinorOpcode = MinorOpcode (BitVector 3) deriving (Eq)
+newtype Register = Register (BitVector 5) deriving (Eq)
diff --git a/Data/RiscV/Instruction/I.hs b/Data/RiscV/Instruction/I.hs
new file mode 100644
--- /dev/null
+++ b/Data/RiscV/Instruction/I.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE ViewPatterns, PatternSynonyms #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Data.RiscV.Instruction.I where
+
+import Clash.Explicit.Prelude.Safe
+
+import Data.RiscV.Instruction
+
+pattern R { major, rd, minor, rs1, imm } <-
+    (split -> (split -> (split -> (split -> (imm :: BitVector 12, Register -> rs1),
+                                   MinorOpcode -> minor),
+                         Register -> rd),
+               split -> (0b11 :: BitVector 2, MajorOpcode -> major))) where
+    R (MajorOpcode major) (Register rd) (MinorOpcode minor) (Register rs1) imm =
+        unpack $ imm ++# rs1 ++# minor ++# rd ++# major ++# (0b11 :: BitVector 2)
diff --git a/Data/RiscV/Instruction/R.hs b/Data/RiscV/Instruction/R.hs
new file mode 100644
--- /dev/null
+++ b/Data/RiscV/Instruction/R.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE ViewPatterns, PatternSynonyms #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Data.RiscV.Instruction.R where
+
+import Clash.Explicit.Prelude.Safe
+
+import Data.RiscV.Instruction
+
+pattern R { major, rd, minor, rs1, rs2, func } <-
+    (split -> (split -> (split -> (split -> (func :: BitVector 7,
+                                             split -> (Register -> rs2, Register -> rs1)),
+                                   MinorOpcode -> minor),
+                         Register -> rd),
+               split -> (0b11 :: BitVector 2, MajorOpcode -> major))) where
+    R (MajorOpcode major) (Register rd) (MinorOpcode minor) (Register rs1) (Register rs2) func =
+        unpack $ func ++# rs2 ++# rs1 ++# minor ++# rd ++# major ++# (0b11 :: BitVector 2)
diff --git a/Data/RiscV/Instruction/S.hs b/Data/RiscV/Instruction/S.hs
new file mode 100644
--- /dev/null
+++ b/Data/RiscV/Instruction/S.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE ViewPatterns, PatternSynonyms #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Data.RiscV.Instruction.S where
+
+import Clash.Explicit.Prelude.Safe
+
+import Util
+
+import Data.RiscV.Instruction
+
+pattern S { major, minor, rs1, rs2, imm } <-
+    (split -> ((split & \ (split -> (imm1 :: BitVector 7, blah), imm0 :: BitVector 5) -> (imm1 ++# imm0, blah)) ->
+               (imm,
+                split -> (split -> (Register -> rs1, Register -> rs2),
+                          MinorOpcode -> minor)),
+               split -> (0b11 :: BitVector 2, MajorOpcode -> major))) where
+    S (MajorOpcode major) (MinorOpcode minor) (Register rs1) (Register rs2) (split -> (imm1, imm0)) =
+        unpack $ imm1 ++# rs2 ++# rs1 ++# minor ++# (imm0 :: BitVector 5) ++# major ++# (0b11 :: BitVector 2)
diff --git a/risc-v.cabal b/risc-v.cabal
--- a/risc-v.cabal
+++ b/risc-v.cabal
@@ -1,5 +1,5 @@
 name:                risc-v
-version:             0.0.1.0
+version:             0.0.2.0
 synopsis:            RISC-V
 -- description:
 license:             BSD3
@@ -10,21 +10,28 @@
 -- category:            
 build-type:          Simple
 extra-source-files:  README.md
-cabal-version:       >=1.10
+cabal-version:       >=2.0
 
 library
   hs-source-dirs:      .
-  exposed-modules:     
+  exposed-modules:
+    Data.RiscV.Instruction
+    Data.RiscV.Instruction.I
+    Data.RiscV.Instruction.R
+    Data.RiscV.Instruction.S
   build-depends:       base >= 4.7 && < 5
                      , base-unicode-symbols
+                     , clash-prelude ^>= 1
                      , util
   default-language:    Haskell2010
   default-extensions:  UnicodeSyntax
+                     , BinaryLiterals
                      , LambdaCase
                      , EmptyCase
                      , InstanceSigs
                      , PartialTypeSignatures
                      , PolyKinds
+                     , DataKinds
                      , ConstraintKinds
                      , FlexibleContexts
                      , FlexibleInstances
