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::*;