diff --git a/Cargo.lock b/Cargo.lock
index 0e90bb6099df31aa89f4b65f2fd9b19b1b247e15..31939e3d2a46a20aa1e1233db53c990c48d4836e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,3 +5,28 @@ version = 3
 [[package]]
 name = "hercules_ir"
 version = "0.1.0"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
diff --git a/hercules_ir/Cargo.toml b/hercules_ir/Cargo.toml
index da5927d122a99de640608eb11c9ca6208de05c3a..a67e06c41c78d84b22e5bf0dfcd9f81f584df7eb 100644
--- a/hercules_ir/Cargo.toml
+++ b/hercules_ir/Cargo.toml
@@ -2,3 +2,6 @@
 name = "hercules_ir"
 version = "0.1.0"
 authors = ["Russel Arbore <rarbore2@illinois.edu>"]
+
+[dependencies]
+nom = "*"
\ No newline at end of file
diff --git a/hercules_ir/src/ir.rs b/hercules_ir/src/ir.rs
new file mode 100644
index 0000000000000000000000000000000000000000..508a75b1bb96d9c091b26b24e6f5f9627c621f5b
--- /dev/null
+++ b/hercules_ir/src/ir.rs
@@ -0,0 +1,137 @@
+pub struct FunctionID(u32);
+
+pub struct NodeID(u32);
+const NULL_NODE: NodeID = NodeID(0xFFFFFFFF);
+
+pub struct ConstantID(u32);
+
+pub struct TypeID(u32);
+
+pub struct Module {
+    functions: Vec<Function>,
+    typed: Vec<Type>,
+    constants: Vec<Constant>,
+}
+
+pub struct Function {
+    name: String,
+    nodes: Vec<Node>,
+}
+
+pub enum Type {
+    Control,
+    Integer8,
+    Integer16,
+    Integer32,
+    Integer64,
+    Float32,
+    Float64,
+}
+
+pub enum Constant {
+    Integer8(u8),
+    Integer16(u16),
+    Integer32(u32),
+    Integer64(u64),
+    Float32(f32),
+    Float64(f64),
+}
+
+pub enum Node {
+    Start,
+    Region {
+        preds: Box<[NodeID]>,
+    },
+    If {
+        control: NodeID,
+        cond: NodeID,
+    },
+    Phi {
+        control: NodeID,
+        data: Box<[NodeID]>,
+    },
+    Return {
+        control: NodeID,
+        value: NodeID,
+    },
+    Constant {
+        id: ConstantID,
+    },
+    Add {
+        control: NodeID,
+        left: NodeID,
+        right: NodeID,
+    },
+    Sub {
+        control: NodeID,
+        left: NodeID,
+        right: NodeID,
+    },
+    Mul {
+        control: NodeID,
+        left: NodeID,
+        right: NodeID,
+    },
+    Div {
+        control: NodeID,
+        left: NodeID,
+        right: NodeID,
+    },
+    Call {
+        args: Box<[NodeID]>,
+    },
+}
+
+impl From<u32> for FunctionID {
+    fn from(v: u32) -> Self {
+        FunctionID(v)
+    }
+}
+
+impl From<u64> for FunctionID {
+    fn from(v: u64) -> Self {
+        FunctionID(v as u32)
+    }
+}
+
+impl From<usize> for FunctionID {
+    fn from(v: usize) -> Self {
+        FunctionID(v as u32)
+    }
+}
+
+impl From<u32> for NodeID {
+    fn from(v: u32) -> Self {
+        NodeID(v)
+    }
+}
+
+impl From<u64> for NodeID {
+    fn from(v: u64) -> Self {
+        NodeID(v as u32)
+    }
+}
+
+impl From<usize> for NodeID {
+    fn from(v: usize) -> Self {
+        NodeID(v as u32)
+    }
+}
+
+impl From<u32> for ConstantID {
+    fn from(v: u32) -> Self {
+        ConstantID(v)
+    }
+}
+
+impl From<u64> for ConstantID {
+    fn from(v: u64) -> Self {
+        ConstantID(v as u32)
+    }
+}
+
+impl From<usize> for ConstantID {
+    fn from(v: usize) -> Self {
+        ConstantID(v as u32)
+    }
+}
diff --git a/hercules_ir/src/lib.rs b/hercules_ir/src/lib.rs
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e02d1fce916146c48c276dd1f453d7ccfab99f53 100644
--- a/hercules_ir/src/lib.rs
+++ b/hercules_ir/src/lib.rs
@@ -0,0 +1,3 @@
+pub mod ir;
+
+pub use crate::ir::*;